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

version 1.179, 2007/08/26 21:09:43 version 1.224, 2007/12/24 16:00:13
Line 65  use Apache::lonnet; Line 65  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
   use Apache::lonuserutils;
 use LONCAPA qw(:DEFAULT :match);  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 76  my $authformfsys; Line 76  my $authformfsys;
 my $authformloc;  my $authformloc;
   
 sub initialize_authen_forms {  sub initialize_authen_forms {
       my ($dom,$curr_authtype,$mode) = @_; 
     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;
           }
           if ($mode eq 'modifyuser') {
               $param{'mode'} = $mode;
           }
       }
 # no longer static due to configurable kerberos defaults  # no longer static due to configurable kerberos defaults
 #    $loginscript  = &Apache::loncommon::authform_header(%param);  #    $loginscript  = &Apache::loncommon::authform_header(%param);
     $generalrule  = &Apache::loncommon::authform_authorwarning(%param);  
     $authformnop  = &Apache::loncommon::authform_nochange(%param);      $authformnop  = &Apache::loncommon::authform_nochange(%param);
 # no longer static due to configurable kerberos defaults  # no longer static due to configurable kerberos defaults
 #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
Line 92  sub initialize_authen_forms { Line 105  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 my $key (keys %rolehash) {                     );
  if ($key=~/^rolesdef\_(\w+)$/) {      return %abv_auth;
     $returnhash{$1}=$1;  
  }  
     }  
     return %returnhash;  
 }  
   
 # ==================================================== Figure out author access  
   
 sub authorpriv {  
     my ($auname,$audom)=@_;  
     unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname))  
          || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; }  
     return 1;  
 }  }
   
 # ====================================================  # ====================================================
Line 175  END_SCRIPT Line 175  END_SCRIPT
     }      }
     my $output = $quota_javascript.      my $output = $quota_javascript.
                  '<h3>'.$lt{'disk'}.'</h3>'.                   '<h3>'.$lt{'disk'}.'</h3>'.
                  $lt{'cuqu'}.': '.$currquota.'&nbsp;Mb.&nbsp;&nbsp;'.                   &Apache::loncommon::start_data_table().
                  $defaultinfo.'<br /><span class="LC_nobreak">'.$lt{'chqu'}.                   &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>'.                   ': <label>'.
                  '<input type="radio" name="customquota" value="0" '.                   '<input type="radio" name="customquota" value="0" '.
                  $custom_off.' onchange="javascript:quota_changes('."'custom'".')"                   $custom_off.' onchange="javascript:quota_changes('."'custom'".')"
Line 186  END_SCRIPT Line 191  END_SCRIPT
                  $lt{'cust'}.':</label>&nbsp;'.                   $lt{'cust'}.':</label>&nbsp;'.
                  '<input type="text" name="portfolioquota" size ="5" value="'.                   '<input type="text" name="portfolioquota" size ="5" value="'.
                  $showquota.'" onfocus="javascript:quota_changes('."'quota'".')" '.                   $showquota.'" onfocus="javascript:quota_changes('."'quota'".')" '.
                  '/>&nbsp;Mb';                   '/>&nbsp;Mb</span></td>'.
                    &Apache::loncommon::end_data_table_row().
                    &Apache::loncommon::end_data_table();
     return $output;      return $output;
 }  }
   
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my ($r,$response,$srch,$forcenewuser) = @_;      my ($r,$context,$response,$srch,$forcenewuser) = @_;
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my $formtoset = 'crtuser';      my $formtoset = 'crtuser';
     if (exists($env{'form.startrolename'})) {      if (exists($env{'form.startrolename'})) {
         $formtoset = 'docustom';          $formtoset = 'docustom';
         $env{'form.rolename'} = $env{'form.startrolename'};          $env{'form.rolename'} = $env{'form.startrolename'};
       } elsif ($env{'form.origform'} eq 'crtusername') {
           $formtoset =  $env{'form.origform'};
     }      }
   
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
Line 212  sub print_username_entry_form { Line 221  sub print_username_entry_form {
                 'onload' => "javascript:setFormElements(document.$formtoset)",                  'onload' => "javascript:setFormElements(document.$formtoset)",
                     );                      );
     my $start_page =      my $start_page =
  &Apache::loncommon::start_page('Create Users, Change User Privileges',   &Apache::loncommon::start_page('User Management',
        $jscript,{'add_entries' => \%loaditems,});         $jscript,{'add_entries' => \%loaditems,});
    &Apache::lonhtmlcommon::add_breadcrumb      if ($env{'form.action'} eq 'custom') {
      ({href=>"javascript:backPage(document.crtuser)",          &Apache::lonhtmlcommon::add_breadcrumb
        text=>"User modify/custom role edit",            ({href=>"javascript:backPage(document.crtuser)",
        faq=>282,bug=>'Instructor Interface',});              text=>"Pick custom role",});
       } else {
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');          &Apache::lonhtmlcommon::add_breadcrumb
     my %existingroles=&my_custom_roles();            ({href=>"javascript:backPage(document.crtuser)",
               text=>"Single user search",
               faq=>282,bug=>'Instructor Interface',});
       }
       my $helpitem = 'Course_Change_Privileges';
       if ($env{'form.action'} eq 'custom') {
           $helpitem = 'Course_Editing_Custom_Roles';
       } elsif ($env{'form.action'} eq 'singlestudent') {
           $helpitem = 'Course_Add_Student';
       }
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                        $helpitem);
       my %existingroles=&Apache::lonuserutils::my_custom_roles();
     my $choice=&Apache::loncommon::select_form('make new role','rolename',      my $choice=&Apache::loncommon::select_form('make new role','rolename',
  ('make new role' => 'Generate new role ...',%existingroles));   ('make new role' => 'Generate new role ...',%existingroles));
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'srch' => "User Search",                      'srch' => "User Search",
                      or    => "or",                       or    => "or",
     'siur' => "Set Individual User Roles",  
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
                     'ecrp' => "Edit Custom Role Privileges",                      'ecrp' => "Edit Custom Role Privileges",
                     'nr'   => "Name of Role",                      'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor",                      'cre'  => "Custom Role Editor",
                     'mod'  => "to add/modify roles",                      'mod'  => "to modify user information or add/modify roles",
                       'enrl' => "to enroll one student",
        );         );
     my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface');      my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface');
     my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');  
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');  
     my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');      my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain');
     if ($sellink) {      if ($sellink) {
         $sellink = "$lt{'or'} ".$sellink;          $sellink = "$lt{'or'} ".$sellink;
     }       } 
     $r->print("      $r->print($start_page."\n".$crumbs);
 $start_page      if ($env{'form.action'} eq 'custom') {
 $crumbs          if (&Apache::lonnet::allowed('mcr','/')) {
 <h2>$lt{siur}$helpsiur</h2>              $r->print(<<ENDCUSTOM);
 <h3>$lt{'srch'} $sellink $lt{'mod'}</h3>  
 $response");  
     $r->print(&entry_form($defdom,$srch,$forcenewuser));  
     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="action" value="$env{'form.action'}" />
 <input type="hidden" name="phase" value="selected_custom_edit" />  <input type="hidden" name="phase" value="selected_custom_edit" />
 <h2>$lt{'ecrp'}$helpecpr</h2>  <h3>$lt{'ecrp'}</h3>
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />  $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />
 <input name="customeditor" type="submit" value="$lt{'cre'}" />  <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </form>  </form>
 ENDCUSTOM  ENDCUSTOM
           }
       } else {
           my $actiontext = $lt{'mod'};
           if ($env{'form.action'} eq 'singlestudent') {
               $actiontext = $lt{'enrl'};
           }
           $r->print("
   <h3>$lt{'srch'} $sellink $actiontext</h3>");
           if ($env{'form.origform'} ne 'crtusername') {
               $r->print("\n".$response);
           }
           $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub entry_form {  sub entry_form {
     my ($dom,$srch,$forcenewuser) = @_;      my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
       my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
       my $usertype;
       if (ref($srch) eq 'HASH') {
           if (($srch->{'srchin'} eq 'dom') &&
               ($srch->{'srchby'} eq 'uname') &&
               ($srch->{'srchtype'} eq 'exact') &&
               ($srch->{'srchdomain'} ne '') &&
               ($srch->{'srchterm'} ne '')) {
               my ($rules,$ruleorder) =
                   &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');
               $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules);
           }
       }
       my $cancreate =
           &Apache::lonuserutils::can_create_user($dom,$context,$usertype);
     my $userpicker =       my $userpicker = 
        &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,         &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
                                        'document.crtuser');                                         'document.crtuser',$cancreate,$usertype);
     my $srchbutton = &mt('Search');      my $srchbutton = &mt('Search');
     my $output = <<"ENDDOCUMENT";      my $output = <<"ENDBLOCK";
 <form action="/adm/createuser" method="post" name="crtuser">  <form action="/adm/createuser" method="post" name="crtuser">
   <input type="hidden" name="action" value="$env{'form.action'}" />
 <input type="hidden" name="phase" value="get_user_info" />  <input type="hidden" name="phase" value="get_user_info" />
 $userpicker  $userpicker
 <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />  <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />
 </form>  </form>
   ENDBLOCK
       if ($cancreate && $env{'form.phase'} eq '') {
           my $defdom=$env{'request.role.domain'};
           my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
           my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
           my %lt=&Apache::lonlocal::texthash(
                     'crnu' => 'Create a new user',
                     'usr'  => 'Username',
                     'dom'  => 'in domain',
                     'cra'  => 'Create user',
           );
           $output .= <<"ENDDOCUMENT";
   <form action="/adm/createuser" method="post" name="crtusername">
   <input type="hidden" name="action" value="$env{'form.action'}" />
   <input type="hidden" name="phase" value="createnewuser" />
   <input type="hidden" name="srchtype" value="exact" />
   <input type="hidden" name="srchby" value="username" />
   <input type="hidden" name="srchin" value="dom" />
   <input type="hidden" name="forcenewuser" value="1" />
   <input type="hidden" name="origform" value="crtusername" />
   <h3>$lt{crnu}$helpcrt</h3>
   $responsemsg
   <table>
    <tr>
     <td>$lt{'usr'}:</td>
     <td><input type="text" size="15" name="srchterm" /></td>
     <td>&nbsp;$lt{'dom'}:</td><td>$domform</td>
     <td>&nbsp;<input name="userrole" type="submit" value="$lt{'cra'}" /></td>
    </tr>
   </table>
   </form>
 ENDDOCUMENT  ENDDOCUMENT
       }
     return $output;      return $output;
 }  }
   
Line 306  END Line 381  END
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_selection_page {  sub print_user_selection_page {
     my ($r,$response,$srch,$srch_results,$context,$srcharray) = @_;      my ($r,$response,$srch,$srch_results,$operation,$srcharray,$context) = @_;
     my @fields = ('username','domain','lastname','firstname','permanentemail');      my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $sortby = $env{'form.sortby'};      my $sortby = $env{'form.sortby'};
   
Line 340  ENDSCRIPT Line 415  ENDSCRIPT
                                        'firstname'      => "first name",                                         'firstname'      => "first name",
                                        'permanentemail' => "permanent e-mail",                                         'permanentemail' => "permanent e-mail",
                                       );                                        );
     if ($context eq 'createuser') {      $r->print(&Apache::loncommon::start_page('User Management',$jscript));
         $r->print(&Apache::loncommon::start_page('Create Users, Change User Privileges',$jscript));      if ($operation eq 'createuser') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.usersrchform,'','')",              ({href=>"javascript:backPage(document.usersrchform,'','')",
               text=>"User modify/custom role edit",                text=>"Create/modify user",
               faq=>282,bug=>'Instructor Interface',},                faq=>282,bug=>'Instructor Interface',},
              {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",               {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
               text=>"Select User",                text=>"Select User",
               faq=>282,bug=>'Instructor Interface',});                faq=>282,bug=>'Instructor Interface',});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                         'Course_Change_Privileges'));
         $r->print("<b>$lt{'usrch'}</b><br />");          $r->print("<b>$lt{'usrch'}</b><br />");
         $r->print(&entry_form($srch->{'srchdomain'},$srch));          $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
         $r->print('<h3>'.$lt{'usel'}.'</h3>');          $r->print('<h3>'.$lt{'usel'}.'</h3>');
     } else {      } elsif ($operation eq 'enrollstudent') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"javascript:backPage(document.usersrchform,'','')",
                 text=>"Create/modify student",
                 faq=>282,bug=>'Instructor Interface',},
                {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
                 text=>"Select Student",
                 faq=>282,bug=>'Instructor Interface',});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                         'Course_Add_Student'));
         $r->print($jscript."<b>$lt{'stusrch'}</b><br />");          $r->print($jscript."<b>$lt{'stusrch'}</b><br />");
         $r->print(&Apache::londropadd::single_user_entry_form($srch->{'srchdomain'},$srch));          $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
         $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');          $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
     }      }
     $r->print('<form name="usersrchform" method="post">'.      $r->print('<form name="usersrchform" method="post">'.
Line 400  ENDSCRIPT Line 485  ENDSCRIPT
               ' <input type="hidden" name="seluname" value="" />'."\n".                ' <input type="hidden" name="seluname" value="" />'."\n".
               ' <input type="hidden" name="seludom" value="" />'."\n".                ' <input type="hidden" name="seludom" value="" />'."\n".
               ' <input type="hidden" name="currstate" value="select" />'."\n".                ' <input type="hidden" name="currstate" value="select" />'."\n".
               ' <input type="hidden" name="phase" value="get_user_info" />'."\n");                ' <input type="hidden" name="phase" value="get_user_info" />'."\n".
     $r->print($response);                ' <input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n");
     if ($context eq 'createuser') {      $r->print($response.'</form>'.&Apache::loncommon::end_page());
         $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 {  sub print_user_query_page {
Line 419  sub print_user_query_page { Line 499  sub print_user_query_page {
 }  }
   
 sub print_user_modification_page {  sub print_user_modification_page {
     my ($r,$ccuname,$ccdomain,$srch,$response) = @_;      my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;
     unless (($ccuname) && ($ccdomain)) {      if (($ccuname eq '') || ($ccdomain eq '')) {
  &print_username_entry_form($r);          my $usermsg = &mt('No username and/or domain provided.');
           $env{'form.phase'} = '';
    &print_username_entry_form($r,$context,$usermsg);
         return;          return;
     }      }
       my ($form,$formname);
       if ($env{'form.action'} eq 'singlestudent') {
           $form = 'document.enrollstudent';
           $formname = 'enrollstudent';
       } else {
           $form = 'document.cu';
           $formname = 'cu';
       }
       my %abv_auth = &auth_abbrev();
       my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser,
           %alerts,%curr_rules,%got_rules);
       my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
       if ($uhome eq 'no_host') {
           my $usertype;
           my ($rules,$ruleorder) =
               &Apache::lonnet::inst_userrules($ccdomain,'username');
               $usertype =
                   &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules);
           my $cancreate =
               &Apache::lonuserutils::can_create_user($ccdomain,$context,
                                                      $usertype);
           if (!$cancreate) {
               my $helplink = ' href="javascript:helpMenu('."'display'".')"';
               my %usertypetext = (
                   official   => 'institutional',
                   unofficial => 'non-institutional',
               );
               my $response;
               if ($env{'form.origform'} eq 'crtusername') {
                   $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).
                               '</span><br />';
               }
               $response .= '<span class="LC_warning">'.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the <a[_1]>helpdesk</a> for assistance.',$helplink).'</span><br /><br />';
               $env{'form.phase'} = '';
               &print_username_entry_form($r,$context,$response);
               return;
           }
           $newuser = 1;
           my $checkhash;
           my $checks = { 'username' => 1 };
           $checkhash->{$ccuname.':'.$ccdomain} = { 'newuser' => $newuser };
           &Apache::loncommon::user_rule_check($checkhash,$checks,
               \%alerts,\%rulematch,\%inst_results,\%curr_rules,\%got_rules);
           if (ref($alerts{'username'}) eq 'HASH') {
               if (ref($alerts{'username'}{$ccdomain}) eq 'HASH') {
                   my $domdesc =
                       &Apache::lonnet::domain($ccdomain,'description');
                   if ($alerts{'username'}{$ccdomain}{$ccuname}) {
                       my $userchkmsg;
                       if (ref($curr_rules{$ccdomain}) eq 'HASH') {  
                           $userchkmsg = 
                               &Apache::loncommon::instrule_disallow_msg('username',
                                                                    $domdesc,1).
                           &Apache::loncommon::user_rule_formats($ccdomain,
                               $domdesc,$curr_rules{$ccdomain}{'username'},
                               'username');
                       }
                       $env{'form.phase'} = '';
                       &print_username_entry_form($r,$context,$userchkmsg);
                       return;
                   }
               }
           }
       } else {
           $newuser = 0;
           my $currentauth = 
               &Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
           if ($currentauth =~ /^(krb4|krb5|unix|internal|localauth):/) {
               $curr_authtype = $abv_auth{$1};
               if ($currentauth =~ /^krb(4|5)/) {
                   $curr_kerb_ver = $1;
               }
           }
       }
     if ($response) {      if ($response) {
         $response = '<br />'.$response          $response = '<br />'.$response;
     }      }
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
   
Line 434  sub print_user_modification_page { Line 590  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);
Line 442  sub print_user_modification_page { Line 601  sub print_user_modification_page {
     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 $nondc_setsection_code = '';                                              my $nondc_setsection_code = '';                                        
   
     my %loaditem;      my %loaditem;
   
     my $groupslist;      my $groupslist = &Apache::lonuserutils::get_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;  
         $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";  
     function setCourse() {  
         var course = document.cu.dccourse.value;  
         if (course != "") {  
             if (document.cu.dcdomain.value != document.cu.origdom.value) {  
                 alert("You must select a course in the current domain");  
                 return;  
             }   
             var userrole = document.cu.role.options[document.cu.role.selectedIndex].value  
             var section="";  
             var numsections = 0;  
             var newsecs = new Array();  
             for (var i=0; i<document.cu.currsec.length; i++) {  
                 if (document.cu.currsec.options[i].selected == true ) {  
                     if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) {   
                         if (numsections == 0) {  
                             section = document.cu.currsec.options[i].value  
                             numsections = 1;  
                         }  
                         else {  
                             section = section + "," +  document.cu.currsec.options[i].value  
                             numsections ++;  
                         }  
                     }  
                 }  
             }  
             if (document.cu.newsec.value != "" && document.cu.newsec.value != null) {  
                 if (numsections == 0) {  
                     section = document.cu.newsec.value  
                 }  
                 else {  
                     section = section + "," +  document.cu.newsec.value  
                 }  
                 newsecs = document.cu.newsec.value.split(/,/g);  
                 numsections = numsections + newsecs.length;  
             }  
             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.")  
                 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)) {  
                 alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");  
                 section = "";  
             }  
             var coursename = "_$dcdom"+"_"+course+"_"+userrole  
             var numcourse = getIndex(document.cu.dccourse);  
             if (numcourse == "-1") {  
                 alert("There was a problem with your course selection");  
                 return  
             }  
             else {  
                 document.cu.elements[numcourse].name = "act"+coursename;  
                 var numnewsec = getIndex(document.cu.newsec);  
                 if (numnewsec != "-1") {  
                     document.cu.elements[numnewsec].name = "sec"+coursename;  
                     document.cu.elements[numnewsec].value = section;  
                 }  
                 var numstart = getIndex(document.cu.start);  
                 if (numstart != "-1") {  
                     document.cu.elements[numstart].name = "start"+coursename;  
                 }  
                 var numend = getIndex(document.cu.end);  
                 if (numend != "-1") {  
                     document.cu.elements[numend].name = "end"+coursename  
                 }  
             }  
         }  
         document.cu.submit();  
     }  
   
     function getIndex(caller) {  
         for (var i=0;i<document.cu.elements.length;i++) {  
             if (document.cu.elements[i] == caller) {  
                 return i;  
             }  
         }  
         return -1;  
     }  
 ENDSCRIPT  
     } else {  
         $nondc_setsection_code = <<"ENDSECCODE";  
     function setSections() {  
         var re1 = /^currsec_/;  
         var groups = new Array($groupslist);  
         for (var i=0;i<document.cu.elements.length;i++) {  
             var str = document.cu.elements[i].name;  
             var checkcurr = str.match(re1);  
             if (checkcurr != null) {  
                 if (document.cu.elements[i-1].checked == true) {  
     var match = str.split('_');  
                     var role = match[3];  
                     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.");  
                     }  
                     else {  
                         var sections = '';  
                         var numsec = 0;  
                         var sections;  
                         for (var j=0; j<document.cu.elements[i].length; j++) {  
                             if (document.cu.elements[i].options[j].selected == true ) {  
                                 if (document.cu.elements[i].options[j].value != "") {  
                                     if (numsec == 0) {  
                                         if (document.cu.elements[i].options[j].value != "") {  
                                             sections = document.cu.elements[i].options[j].value;  
                                             numsec ++;  
                                         }  
                                     }  
                                     else {  
                                         sections = sections + "," +  document.cu.elements[i].options[j].value  
                                         numsec ++;  
                                     }  
                                 }  
                             }  
                         }  
                         if (numsec > 0) {  
                             if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {  
                                 sections = sections + "," +  document.cu.elements[i+1].value;  
                             }  
                         }  
                         else {  
                             sections = document.cu.elements[i+1].value;  
                         }  
                         var newsecs = document.cu.elements[i+1].value;  
  var numsplit;  
                         if (newsecs != null && newsecs != "") {  
                             numsplit = newsecs.split(/,/g);  
                             numsec = numsec + numsplit.length;  
                         }  
   
                         if ((role == 'st') && (numsec > 1)) {  
                             alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.")  
                             return;  
                         }  
                         else if (numsplit != null) {  
                             for (var j=0; j<numsplit.length; j++) {  
                                 if ((numsplit[j] == 'all') ||  
                                     (numsplit[j] == 'none')) {  
                                     alert("'"+numsplit[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");  
                                     return;  
                                 }  
                                 for (var k=0; k<groups.length; k++) {  
                                     if (numsplit[j] == groups[k]) {  
                                         alert("'"+numsplit[j]+"' may not be used as a section name, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");  
                                         return;  
                                     }  
                                 }  
                             }  
                         }  
                         document.cu.elements[i+2].value = sections;  
                     }  
                 }  
             }  
         }  
         document.cu.submit();  
     }  
 ENDSECCODE  
     }  
     my $js = &user_modification_js($pjump_def,$dc_setcourse_code,  
                                    $nondc_setsection_code,$groupslist);  
   
     my ($jsback,$elements) = &crumb_utilities();  
   
     $js .= "\n".  
            '<script type="text/javascript">'."\n".$jsback."\n".'</script>';  
   
       my $js = &validation_javascript($context,$ccdomain,$pjump_def,
                                  $groupslist,$newuser,$formname,\%loaditem);
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('Create Users, Change User Privileges',   &Apache::loncommon::start_page('User Management',
        $js,{'add_entries' => \%loaditem,});         $js,{'add_entries' => \%loaditem,});
       my %breadcrumb_text = &singleuser_breadcrumb();
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage(document.cu)",       ({href=>"javascript:backPage($form)",
        text=>"User modify/custom role edit",         text=>$breadcrumb_text{'search'},
        faq=>282,bug=>'Instructor Interface',});         faq=>282,bug=>'Instructor Interface',});
   
     if ($env{'form.phase'} eq 'userpicked') {      if ($env{'form.phase'} eq 'userpicked') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage(document.cu,'get_user_info','select')",       ({href=>"javascript:backPage($form,'get_user_info','select')",
        text=>"Select a user",         text=>$breadcrumb_text{'userpicked'},
        faq=>282,bug=>'Instructor Interface',});         faq=>282,bug=>'Instructor Interface',});
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
       ({href=>"javascript:backPage(document.cu,'$env{'form.phase'}','modify')",        ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')",
         text=>"Set user role",          text=>$breadcrumb_text{'modify'},
         faq=>282,bug=>'Instructor Interface',});          faq=>282,bug=>'Instructor Interface',});
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management');      my $helpitem = 'Course_Change_Privileges';
       if ($env{'form.action'} eq 'singlestudent') {
           $helpitem = 'Course_Add_Student';
       }
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                        $helpitem);
   
     my $forminfo =<<"ENDFORMINFO";      my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="cu">  <form action="/adm/createuser" method="post" name="$formname">
 <input type="hidden" name="phase"       value="update_user_data" />  <input type="hidden" name="phase" value="update_user_data" />
 <input type="hidden" name="ccuname"     value="$ccuname" />  <input type="hidden" name="ccuname" value="$ccuname" />
 <input type="hidden" name="ccdomain"    value="$ccdomain" />  <input type="hidden" name="ccdomain" value="$ccdomain" />
 <input type="hidden" name="pres_value"  value="" />  <input type="hidden" name="pres_value"  value="" />
 <input type="hidden" name="pres_type"   value="" />  <input type="hidden" name="pres_type"   value="" />
 <input type="hidden" name="pres_marker" value="" />  <input type="hidden" name="pres_marker" value="" />
 ENDFORMINFO  ENDFORMINFO
     my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);  
     my %inccourses;      my %inccourses;
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
  if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {   if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {
     $inccourses{$1.'_'.$2}=1;      $inccourses{$1.'_'.$2}=1;
         }          }
     }      }
     if ($uhome eq 'no_host') {      if ($newuser) {
         my $newuser;  
         my $instsrch = {  
                          srchin => 'instd',  
                          srchby => 'uname',  
                          srchtype => 'exact',  
                        };  
         if ($env{'form.phase'} eq 'userpicked') {  
             $instsrch->{'srchterm'} = $env{'form.seluname'};  
             $instsrch->{'srchdomain'} = $env{'form.seludom'};  
         } else {  
             $instsrch->{'srchterm'} = $ccuname;  
             $instsrch->{'srchdomain'} = $ccdomain,  
         }  
         if (($instsrch->{'srchterm'} ne '') && ($instsrch->{'srchdomain'} ne '')) {  
             $newuser = $instsrch->{'srchterm'}.':'.$instsrch->{'srchdomain'};  
         }  
         my (%dirsrch_results,%inst_results);  
         if ($newuser) {  
             if (&directorysrch_check($instsrch) eq 'ok') {  
                 %dirsrch_results = &Apache::lonnet::inst_directory_query($instsrch);  
                 if (ref($dirsrch_results{$newuser}) eq 'HASH') {   
                     %inst_results = %{$dirsrch_results{$newuser}};  
                 }  
             }  
         }  
         my $home_server_list=  
             '<option value="default" selected>default</option>'."\n".  
                 &Apache::loncommon::home_server_option_list($ccdomain);  
           
  my %lt=&Apache::lonlocal::texthash(  
                     'cnu'  => "Create New User",  
                     'nu'   => "New User",  
                     'id'   => "in domain",  
                     'pd'   => "Personal Data",  
                     'fn'   => "First Name",  
                     'mn'   => "Middle Name",  
                     'ln'   => "Last Name",  
                     'gen'  => "Generation",  
                     'mail' => "Permanent e-mail address",  
                     'idsn' => "ID/Student Number",  
                     'hs'   => "Home Server",  
                     'lg'   => "Login Data"  
        );  
         my $portfolioform;          my $portfolioform;
         if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
             # Current user has quota modification privileges              # Current user has quota modification privileges
             $portfolioform = &portfolio_quota($ccuname,$ccdomain);              $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);
         }          }
  my $genhelp=&Apache::loncommon::help_open_topic('Generation');          &initialize_authen_forms($ccdomain);
         &initialize_authen_forms();          my %lt=&Apache::lonlocal::texthash(
  $r->print(<<ENDNEWUSER);                  'cnu'            => 'Create New User',
                   'ast'            => 'as a student',
                   'ind'            => 'in domain',
                   'lg'             => 'Login Data',
                   'hs'             => "Home Server",
           );
    $r->print(<<ENDTITLE);
 $start_page  $start_page
 $crumbs  $crumbs
 <h1>$lt{'cnu'}</h1>  
 $response  $response
 $forminfo  $forminfo
 <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>  
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 $loginscript  $loginscript
 </script>  </script>
 <input type='hidden' name='makeuser' value='1' />  <input type='hidden' name='makeuser' value='1' />
 <h3>$lt{'pd'}</h3>  <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain
 <p>  ENDTITLE
 <table>          if ($env{'form.action'} eq 'singlestudent') {
 <tr><td>$lt{'fn'}  </td>              $r->print(' ('.$lt{'ast'}.')');
     <td><input type="text" name="cfirst" size="15" value="$inst_results{'firstname'}" /></td></tr>          }
 <tr><td>$lt{'mn'} </td>           $r->print('</h2>'."\n".'<div class="LC_left_float">');
     <td><input type="text" name="cmiddle" size="15" value="$inst_results{'middlename'}" /></td></tr>          my $personal_table = 
 <tr><td>$lt{'ln'}   </td>              &personal_data_display($ccuname,$ccdomain,$newuser,$context,
     <td><input type="text" name="clast" size="15" value="$inst_results{'lastname'}" /></td></tr>                                     $inst_results{$ccuname.':'.$ccdomain});
 <tr><td>$lt{'gen'}$genhelp</td>          $r->print($personal_table);
     <td><input type="text" name="cgen" size="5" value="$inst_results{'generation'}" /></td></tr>          my ($home_server_pick,$numlib) = 
 <tr><td>$lt{'mail'}</td>              &Apache::loncommon::home_server_form_item($ccdomain,'hserver',
     <td><input type="text" name="cemail" size="20" value="$inst_results{'permanentemail'}" /></td></tr>                                                        'default','hide');
 </table>          if ($numlib > 1) {
 $lt{'idsn'} <input type="text" name="cstid" size="15" value="$inst_results{'id'}" /></p>              $r->print("
 $lt{'hs'}: <select name="hserver" size="1"> $home_server_list </select>  <br />
 <hr />  $lt{'hs'}: $home_server_pick
 <h3>$lt{'lg'}</h3>  <br />");
 <p>$generalrule </p>          } else {
 <p>$authformkrb </p>              $r->print($home_server_pick);
 <p>$authformint </p>          }
 <p>$authformfsys</p>          $r->print('</div>'."\n".'<div class="LC_left_float"><h3>'.
 <p>$authformloc </p>                    $lt{'lg'}.'</h3>');
 <hr />          my ($fixedauth,$varauth,$authmsg); 
 $portfolioform          if (ref($rulematch{$ccuname.':'.$ccdomain}) eq 'HASH') {
 ENDNEWUSER              my $matchedrule = $rulematch{$ccuname.':'.$ccdomain}{'username'};
               my ($rules,$ruleorder) = 
                   &Apache::lonnet::inst_userrules($ccdomain,'username');
               if (ref($rules) eq 'HASH') {
                   if (ref($rules->{$matchedrule}) eq 'HASH') {
                       my $authtype = $rules->{$matchedrule}{'authtype'};
                       if ($authtype !~ /^(krb4|krb5|int|fsys|loc)$/) {
                           $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
                       } else { 
                           my $authparm = $rules->{$matchedrule}{'authparm'};
                           if ($authtype =~ /^krb(4|5)$/) {
                               my $ver = $1;
                               if ($authparm ne '') {
                                   $fixedauth = <<"KERB"; 
   <input type="hidden" name="login" value="krb" />
   <input type="hidden" name="krbver" value="$ver" />
   <input type="hidden" name="krbarg" value="$authparm" />
   KERB
                                   $authmsg = $rules->{$matchedrule}{'authmsg'};    
                               }
                           } else {
                               $fixedauth = 
   '<input type="hidden" name="login" value="'.$authtype.'" />'."\n";
                               if ($rules->{$matchedrule}{'authparmfixed'}) {
                                   $fixedauth .=    
   '<input type="hidden" name="'.$authtype.'arg" value="'.$authparm.'" />'."\n";
                               } else {
                                   $varauth =  
   '<input type="text" name="'.$authtype.'arg" value="" />'."\n";
                               }
                           }
                       }
                   } else {
                       $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
                   }
               }
               if ($authmsg) {
                   $r->print(<<ENDAUTH);
   $fixedauth
   $authmsg
   $varauth
   ENDAUTH
               }
           } else {
               $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); 
           }
           $r->print($portfolioform);
           if ($env{'form.action'} eq 'singlestudent') {
               $r->print(&date_sections_select($context,$newuser,$formname,
                                               $permission));
           }
           $r->print('</div><div class="LC_clear_float_footer"></div>');
     } else { # user already exists      } else { # user already exists
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Change User Privileges",                      'cup'  => "Modify existing user: ",
                     'usr'  => "User",                                          'ens'  => "Enroll one student: ",
                     'id'   => "in domain",                      'id'   => "in domain",
                     'fn'   => "first name",  
                     'mn'   => "middle name",  
                     'ln'   => "last name",  
                     'gen'  => "generation",  
                     'email' => "permanent e-mail",  
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
 $start_page  $start_page
 $crumbs  $crumbs
 <h1>$lt{'cup'}</h1>  
 $forminfo  $forminfo
 <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>  <h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         # Get the users information          if ($env{'form.action'} eq 'singlestudent') {
         my %userenv =               $r->print($lt{'ens'});
             &Apache::lonnet::get('environment',          } else {
                 ['firstname','middlename','lastname','generation',              $r->print($lt{'cup'});
                  'permanentemail','portfolioquota'],$ccdomain,$ccuname);          }
         my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);          $r->print(' "'.$ccuname.'" '.$lt{'id'}.' "'.$ccdomain.'"</h2>'.
         $r->print('                    "\n".'<div class="LC_left_float">');
 <hr />'.          my ($personal_table,$showforceid) = 
                   &Apache::loncommon::start_data_table().              &personal_data_display($ccuname,$ccdomain,$newuser,$context,
                   &Apache::loncommon::start_data_table_header_row().                                     $inst_results{$ccuname.':'.$ccdomain});
 '<th>'.$lt{'fn'}.'</th><th>'.$lt{'mn'}.'</th><th>'.$lt{'ln'}.'</th><th>'.$lt{'gen'}.'</th><th>'.$lt{'email'}.'</th>'.          $r->print($personal_table);
                   &Apache::loncommon::end_data_table_header_row().          if ($showforceid) {
                   &Apache::loncommon::start_data_table_row());              $r->print(&Apache::lonuserutils::forceid_change($context));
         foreach my $item ('firstname','middlename','lastname','generation','permanentemail') {          }
            if (&Apache::lonnet::allowed('mau',$ccdomain)) {          $r->print('</div>');
               $r->print(<<"END");          my $user_auth_text = 
 <td><input type="text" name="c$item" value="$userenv{$item}" size="15" /></td>              &user_authentication($ccuname,$ccdomain,$krbdefdom,\%abv_auth);
 END          my $user_quota_text;
            } else {          if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
                $r->print('<td>'.$userenv{$item}.'</td>');              # Current user has quota modification privileges
            }              $user_quota_text = &portfolio_quota($ccuname,$ccdomain);
         }          } elsif (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
         $r->print(&Apache::loncommon::end_data_table_row().              # Get the user's portfolio information
                   &Apache::loncommon::end_data_table());              my %portq = &Apache::lonnet::get('environment',['portfolioquota'],
         # Build up table of user roles to allow revocation of a role.                                               $ccdomain,$ccuname);
         my ($tmp) = keys(%rolesdump);  
         unless ($tmp =~ /^(con_lost|error)/i) {              my %lt=&Apache::lonlocal::texthash(
            my $now=time;                  'dska'  => "Disk space allocated to user's portfolio files",
    my %lt=&Apache::lonlocal::texthash(                  'youd'  => "You do not have privileges to modify the portfolio quota for this user.",
     'rer'  => "Revoke Existing Roles",                  'ichr'  => "If a change is required, contact a domain coordinator for the domain",
                     'rev'  => "Revoke",                                  );
               $user_quota_text = <<ENDNOPORTPRIV;
   <h3>$lt{'dska'}</h3>
   $lt{'youd'} $lt{'ichr'}: $ccdomain
   ENDNOPORTPRIV
           }
           if ($user_auth_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_auth_text);
               if ($user_quota_text ne '') {
                   $r->print($user_quota_text);
               }
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print(&date_sections_select($context,$newuser,$formname));
               }
           } elsif ($user_quota_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_quota_text);
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print(&date_sections_select($context,$newuser,$formname));
               }
           } else {
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print('<div class="LC_left_float">'.
                             &date_sections_select($context,$newuser,$formname));
               }
           }
           $r->print('</div><div class="LC_clear_float_footer"></div>');
           if ($env{'form.action'} ne 'singlestudent') {
               &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);
           }
       } ## End of new user/old user logic
   
       if ($env{'form.action'} eq 'singlestudent') {
           $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onClick="setSections(this.form)" />'."\n");
       } else {
           $r->print('<h3>'.&mt('Add Roles').'</h3>');
           my $addrolesdisplay = 0;
           if ($context eq 'domain' || $context eq 'author') {
               $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain);
           }
           if ($context eq 'domain') {
               my $add_domainroles = &new_domain_roles($r);
               if (!$addrolesdisplay) {
                   $addrolesdisplay = $add_domainroles;
               }
               $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
               $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");
           } elsif ($context eq 'author') {
               if ($addrolesdisplay) {
                   $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');
                   if ($newuser) {
                       $r->print(' onClick="verify_message(this.form)" \>'."\n");
                   } else {
                       $r->print('onClick="this.form.submit()" \>'."\n");
                   }
               } else {
                   $r->print('<br /><a href="javascript:backPage(document.cu)">'.
                             &mt('Back to previous page').'</a>');
               }
           } else {
               $r->print(&course_level_table(%inccourses));
               $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections(this.form)" />'."\n");
           }
       }
       $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
       $r->print('<input type="hidden" name="currstate" value="" />');
       $r->print('<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />');
       $r->print("</form>".&Apache::loncommon::end_page());
       return;
   }
   
   sub singleuser_breadcrumb {
       my %breadcrumb_text;
       if ($env{'form.action'} eq 'singlestudent') {
           $breadcrumb_text{'search'} = 'Enroll a student';
           $breadcrumb_text{'userpicked'} = 'Select a user',
           $breadcrumb_text{'modify'} = 'Set section/dates',
       } else {
           $breadcrumb_text{'search'} = 'Create/modify user';
           $breadcrumb_text{'userpicked'} = 'Select a user',
           $breadcrumb_text{'modify'} = 'Set user role',
       }
       return %breadcrumb_text;
   }
   
   sub date_sections_select {
       my ($context,$newuser,$formname,$permission) = @_;
       my $cid = $env{'request.course.id'};
       my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid);
       my $date_table = '<h3>'.&mt('Starting and Ending Dates').'</h3>'."\n".
           &Apache::lonuserutils::date_setting_table(undef,undef,$context,
                                                     undef,$formname,$permission);
       my $rowtitle = 'Section';
       my $secbox = '<h3>'.&mt('Section').'</h3>'."\n".
           &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle,
                                                 $permission);
       my $output = $date_table.$secbox;
       return $output;
   }
   
   sub validation_javascript {
       my ($context,$ccdomain,$pjump_def,$groupslist,$newuser,$formname,
           $loaditem) = @_;
       my $dc_setcourse_code = '';
       my $nondc_setsection_code = '';
       if ($context eq 'domain') {
           my $dcdom = $env{'request.role.domain'};
           $loaditem->{'onload'} = "document.cu.coursedesc.value='';";
           $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser');
       } else {
           $nondc_setsection_code =
               &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
       }
       my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
                                      $nondc_setsection_code,$groupslist);
   
       my ($jsback,$elements) = &crumb_utilities();
       my $javascript_validations;
       if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($newuser)) {
           my ($krbdef,$krbdefdom) =
               &Apache::loncommon::get_kerberos_defaults($ccdomain);
           $javascript_validations =
               &Apache::lonuserutils::javascript_validations('createuser',$krbdefdom,undef,
                                                             undef,$ccdomain);
       }
       $js .= "\n".
              '<script type="text/javascript">'."\n".$jsback."\n".
              $javascript_validations.'</script>';
       return $js;
   }
   
   sub display_existing_roles {
       my ($r,$ccuname,$ccdomain,$inccourses) = @_;
       my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
       # Build up table of user roles to allow revocation and re-enabling of roles.
       my ($tmp) = keys(%rolesdump);
       if ($tmp !~ /^(con_lost|error)/i) {
           my $now=time;
           my %lt=&Apache::lonlocal::texthash(
                       'rer'  => "Existing Roles",
                       'rev'  => "Revoke",
                     'del'  => "Delete",                      'del'  => "Delete",
     'ren'  => "Re-Enable",                      'ren'  => "Re-Enable",
                     'rol'  => "Role",                      'rol'  => "Role",
                     'ext'  => "Extent",                      'ext'  => "Extent",
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End"                      'end'  => "End",
        );                                         );
            my (%roletext,%sortrole,%roleclass,%rolepriv);          my (%roletext,%sortrole,%roleclass,%rolepriv);
    foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);          foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
     my $b1=join('_',(split('_',$b))[1,0]);                                      my $b1=join('_',(split('_',$b))[1,0]);
     return $a1 cmp $b1;                                      return $a1 cmp $b1;
  } keys(%rolesdump)) {                                  } keys(%rolesdump)) {
                next if ($area =~ /^rolesdef/);              next if ($area =~ /^rolesdef/);
        my $envkey=$area;              my $envkey=$area;
                my $role = $rolesdump{$area};              my $role = $rolesdump{$area};
                my $thisrole=$area;              my $thisrole=$area;
                $area =~ s/\_\w\w$//;              $area =~ s/\_\w\w$//;
                my ($role_code,$role_end_time,$role_start_time) =               my ($role_code,$role_end_time,$role_start_time) =
                    split(/_/,$role);                  split(/_/,$role);
 # Is this a custom role? Get role owner and title.  # Is this a custom role? Get role owner and title.
        my ($croleudom,$croleuname,$croletitle)=              my ($croleudom,$croleuname,$croletitle)=
            ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});                  ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
                my $allowed=0;              my $allowed=0;
                my $delallowed=0;              my $delallowed=0;
        my $sortkey=$role_code;              my $sortkey=$role_code;
        my $class='Unknown';              my $class='Unknown';
                if ($area =~ m{^/($match_domain)/($match_courseid)} ) {              if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
    $class='Course';                  $class='Course';
                    my ($coursedom,$coursedir) = ($1,$2);                  my ($coursedom,$coursedir) = ($1,$2);
    $sortkey.="\0$coursedom";                  $sortkey.="\0$coursedom";
                    # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).                  # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                    my %coursedata=                  my %coursedata=
                        &Apache::lonnet::coursedescription($1.'_'.$2);                      &Apache::lonnet::coursedescription($1.'_'.$2);
    my $carea;                  my $carea;
    if (defined($coursedata{'description'})) {                  if (defined($coursedata{'description'})) {
        $carea=$coursedata{'description'}.                      $carea=$coursedata{'description'}.
                            '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).                          '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);       &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
        $sortkey.="\0".$coursedata{'description'};                      $sortkey.="\0".$coursedata{'description'};
                        $class=$coursedata{'type'};                      $class=$coursedata{'type'};
    } else {                  } else {
        $carea=&mt('Unavailable course').': '.$area;                      $carea=&mt('Unavailable course').': '.$area;
        $sortkey.="\0".&mt('Unavailable course').': '.$area;                      $sortkey.="\0".&mt('Unavailable course').': '.$area;
    }                  }
    $sortkey.="\0$coursedir";                  $sortkey.="\0$coursedir";
                    $inccourses{$1.'_'.$2}=1;                  $inccourses->{$1.'_'.$2}=1;
                    if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||                  if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                      (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                        $allowed=1;                      $allowed=1;
                    }                  }
                    if ((&Apache::lonnet::allowed('dro',$1)) ||                  if ((&Apache::lonnet::allowed('dro',$1)) ||
                        (&Apache::lonnet::allowed('dro',$ccdomain))) {                      (&Apache::lonnet::allowed('dro',$ccdomain))) {
                        $delallowed=1;                      $delallowed=1;
                    }                  }
 # - custom role. Needs more info, too  # - custom role. Needs more info, too
    if ($croletitle) {                  if ($croletitle) {
        if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {                      if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
    $allowed=1;                          $allowed=1;
    $thisrole.='.'.$role_code;                          $thisrole.='.'.$role_code;
        }                      }
    }                  }
                    # Compute the background color based on $area                  # Compute the background color based on $area
                    if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {                  if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
                        $carea.='<br />Section: '.$3;                      $carea.='<br />Section: '.$3;
        $sortkey.="\0$3";                      $sortkey.="\0$3";
                    }                      if (!$allowed) {
                    $area=$carea;                          if ($env{'request.course.sec'} eq $3) {
                } else {                              if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
    $sortkey.="\0".$area;                                  $allowed = 1;
                    # Determine if current user is able to revoke privileges                              }
                    if ($area=~m{^/($match_domain)/}) {                          }
                        if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||                      }
                   }
                   $area=$carea;
               } else {
                   $sortkey.="\0".$area;
                   # Determine if current user is able to revoke privileges
                   if ($area=~m{^/($match_domain)/}) {
                       if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                        (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                         (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                            $allowed=1;                          $allowed=1;
                        }                      }
                        if (((&Apache::lonnet::allowed('dro',$1))  ||                      if (((&Apache::lonnet::allowed('dro',$1))  ||
                             (&Apache::lonnet::allowed('dro',$ccdomain))) &&                           (&Apache::lonnet::allowed('dro',$ccdomain))) &&
                            ($role_code ne 'dc')) {                          ($role_code ne 'dc')) {
                            $delallowed=1;                          $delallowed=1;
                        }                      }
                    } else {                  } else {
                        if (&Apache::lonnet::allowed('c'.$role_code,'/')) {                      if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
                            $allowed=1;                          $allowed=1;
                        }                      }
                    }                  }
    if ($role_code eq 'ca' || $role_code eq 'au') {                  if ($role_code eq 'ca' || $role_code eq 'au') {
        $class='Construction Space';                      $class='Construction Space';
    } elsif ($role_code eq 'su') {                  } elsif ($role_code eq 'su') {
        $class='System';                      $class='System';
    } else {                  } else {
        $class='Domain';                      $class='Domain';
    }                  }
                }              }
                if (($role_code eq 'ca') || ($role_code eq 'aa')) {              if (($role_code eq 'ca') || ($role_code eq 'aa')) {
                    $area=~m{/($match_domain)/($match_username)};                  $area=~m{/($match_domain)/($match_username)};
    if (&authorpriv($2,$1)) {                  if (&Apache::lonuserutils::authorpriv($2,$1)) {
        $allowed=1;                      $allowed=1;
                    } else {                  } else {
                        $allowed=0;                      $allowed=0;
                    }                  }
                }              }
                my $row = '';              my $row = '';
                $row.= '<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;';  
    } else {  
                       $row.=&mt('expired or revoked');  
    }  
                }  
        $row.='</td><td>';  
                if ($allowed && !$active) {  
                    $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';  
                } else {  
                    $row.='&nbsp;';  
                }  
        $row.='</td><td>';  
                if ($delallowed) {  
                    $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';  
                } else {  
                    $row.='&nbsp;';                     $row.='&nbsp;';
                }                  } else {
        my $plaintext='';                     $row.=&mt('expired or revoked');
        if (!$croletitle) {                  }
                    $plaintext=&Apache::lonnet::plaintext($role_code,$class)              }
        } else {              $row.='</td><td>';
            $plaintext=              if ($allowed && !$active) {
  "Customrole '$croletitle' defined by $croleuname\@$croleudom";                  $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
        }              } else {
                $row.= '</td><td>'.$plaintext.                  $row.='&nbsp;';
                       '</td><td>'.$area.              }
                       '</td><td>'.($role_start_time?localtime($role_start_time)              $row.='</td><td>';
                                                    : '&nbsp;' ).              if ($delallowed) {
                       '</td><td>'.($role_end_time  ?localtime($role_end_time)                  $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
                                                    : '&nbsp;' )              } else {
                       ."</td>";                  $row.='&nbsp;';
        $sortrole{$sortkey}=$envkey;              }
        $roletext{$envkey}=$row;              my $plaintext='';
        $roleclass{$envkey}=$class;              if (!$croletitle) {
                $rolepriv{$envkey}=$allowed;                  $plaintext=&Apache::lonnet::plaintext($role_code,$class)
                #$r->print($row);              } else {
            } # end of foreach        (table building loop)                  $plaintext=
            my $rolesdisplay = 0;          "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
            my %output = ();              }
    foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {              $row.= '</td><td>'.$plaintext.
        $output{$type} = '';                     '</td><td>'.$area.
        foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {                     '</td><td>'.($role_start_time?localtime($role_start_time)
    if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {                                                   : '&nbsp;' ).
        $output{$type}.=                     '</td><td>'.($role_end_time  ?localtime($role_end_time)
                              &Apache::loncommon::start_data_table_row().                                                  : '&nbsp;' )
                              $roletext{$sortrole{$which}}.                     ."</td>";
                              &Apache::loncommon::end_data_table_row();              $sortrole{$sortkey}=$envkey;
    }              $roletext{$envkey}=$row;
        }              $roleclass{$envkey}=$class;
        unless($output{$type} eq '') {              $rolepriv{$envkey}=$allowed;
    $output{$type} = '<tr class="LC_info_row">'.              #$r->print($row);
      "<td align='center' colspan='7'>".&mt($type)."</td></tr>".          } # end of foreach        (table building loop)
                               $output{$type};          my $rolesdisplay = 0;
                    $rolesdisplay = 1;          my %output = ();
        }          foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
    }              $output{$type} = '';
            if ($rolesdisplay == 1) {              foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
                $r->print('                  if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
 <hr />                      $output{$type}.=
                             &Apache::loncommon::start_data_table_row().
                             $roletext{$sortrole{$which}}.
                             &Apache::loncommon::end_data_table_row();
                   }
               }
               unless($output{$type} eq '') {
                   $output{$type} = '<tr class="LC_info_row">'.
                             "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
                              $output{$type};
                   $rolesdisplay = 1;
               }
           }
           if ($rolesdisplay == 1) {
               $r->print('
 <h3>'.$lt{'rer'}.'</h3>'.  <h3>'.$lt{'rer'}.'</h3>'.
 &Apache::loncommon::start_data_table("LC_createuser").  &Apache::loncommon::start_data_table("LC_createuser").
 &Apache::loncommon::start_data_table_header_row().  &Apache::loncommon::start_data_table_header_row().
Line 994  END Line 1111  END
 '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.  '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
 '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.  '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
 &Apache::loncommon::end_data_table_header_row());  &Apache::loncommon::end_data_table_header_row());
                foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {             foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
                    if ($output{$type}) {                  if ($output{$type}) {
                        $r->print($output{$type}."\n");                      $r->print($output{$type}."\n");
                    }                  }
                }  
        $r->print(&Apache::loncommon::end_data_table());  
            }  
         }  # End of 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',$ccdomain)) {  
                 &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 user's   
                 # 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 />  
 <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',$ccdomain)) {  
  # 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  
             } 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",  
                     );  
                     $r->print(<<ENDNOPRIV);  
 <hr />  
 <h3>$lt{'ccld'}</h3>  
 $lt{'yodo'} $lt{'ifch'}: $ccdomain   
 ENDNOPRIV  
                 }   
             }  
             if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {  
                 # Current user has quota modification privileges  
                 $r->print(&portfolio_quota($ccuname,$ccdomain));  
             }              }
         }  ## End of "check for bad authentication type" logic              $r->print(&Apache::loncommon::end_data_table());
     } ## End of new user/old user logic          }
     $r->print('<hr /><h3>'.&mt('Add Roles').'</h3>');      }  # End of check for keys in rolesdump
 #      return;
 # Co-Author  }
 #   
     if (&authorpriv($env{'user.name'},$env{'request.role.domain'}) &&  sub new_coauthor_roles {
       my ($r,$ccuname,$ccdomain) = @_;
       my $addrolesdisplay = 0;
       #
       # Co-Author
       #
       if (&Apache::lonuserutils::authorpriv($env{'user.name'},
                                             $env{'request.role.domain'}) &&
         ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {          ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {
         # No sense in assigning co-author role to yourself          # No sense in assigning co-author role to yourself
  my $cuname=$env{'user.name'};          $addrolesdisplay = 1;
           my $cuname=$env{'user.name'};
         my $cudom=$env{'request.role.domain'};          my $cudom=$env{'request.role.domain'};
    my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
     'cs'   => "Construction Space",                      'cs'   => "Construction Space",
                     'act'  => "Activate",                                          'act'  => "Activate",
                     'rol'  => "Role",                      'rol'  => "Role",
                     'ext'  => "Extent",                      'ext'  => "Extent",
                     'sta'  => "Start",                      'sta'  => "Start",
Line 1137  ENDNOPRIV Line 1146  ENDNOPRIV
                     'caa'  => "Assistant Co-Author",                      'caa'  => "Assistant Co-Author",
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );                                         );
        $r->print('<h4>'.$lt{'cs'}.'</h4>'."\n".           $r->print('<h4>'.$lt{'cs'}.'</h4>'."\n".
            &Apache::loncommon::start_data_table()."\n".                    &Apache::loncommon::start_data_table()."\n".
            &Apache::loncommon::start_data_table_header_row()."\n".                    &Apache::loncommon::start_data_table_header_row()."\n".
            '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th>'.                    '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th>'.
            '<th>'.$lt{'ext'}.'</th><th>'.$lt{'sta'}.'</th>'.                    '<th>'.$lt{'ext'}.'</th><th>'.$lt{'sta'}.'</th>'.
            '<th>'.$lt{'end'}.'</th>'."\n".                    '<th>'.$lt{'end'}.'</th>'."\n".
            &Apache::loncommon::end_data_table_header_row()."\n".                    &Apache::loncommon::end_data_table_header_row()."\n".
            &Apache::loncommon::start_data_table_row()."\n".                    &Apache::loncommon::start_data_table_row().'
            '<td>             <td>
             <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />              <input type=checkbox name="act_'.$cudom.'_'.$cuname.'_ca" />
            </td>             </td>
            <td>'.$lt{'cau'}.'</td>             <td>'.$lt{'cau'}.'</td>
Line 1157  ENDNOPRIV Line 1166  ENDNOPRIV
 <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_ca" value="" />  <td><input type="hidden" name="end_'.$cudom.'_'.$cuname.'_ca" value="" />
 <a href=  <a href=
 "javascript:pjump('."'date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\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>'."\n".
           &Apache::loncommon::end_data_table_row()."\n".                &Apache::loncommon::end_data_table_row()."\n".
           &Apache::loncommon::start_data_table_row()."\n".                &Apache::loncommon::start_data_table_row()."\n".
 '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>  '<td><input type=checkbox name="act_'.$cudom.'_'.$cuname.'_aa" /></td>
 <td>'.$lt{'caa'}.'</td>  <td>'.$lt{'caa'}.'</td>
 <td>'.$cudom.'_'.$cuname.'</td>  <td>'.$cudom.'_'.$cuname.'</td>
Line 1168  ENDNOPRIV Line 1177  ENDNOPRIV
 <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>'."\n".  "javascript:pjump('."'date_end','End Date Assistant Co-Author',document.cu.end_$cudom\_$cuname\_aa.value,'end_$cudom\_$cuname\_aa','cu.pres','dateset'".')">'.$lt{'sed'}.'</a></td>'."\n".
          &Apache::loncommon::end_data_table_row()."\n".               &Apache::loncommon::end_data_table_row()."\n".
          &Apache::loncommon::end_data_table());               &Apache::loncommon::end_data_table());
       } elsif ($env{'request.role'} =~ /^au\./) {
           if (!(&Apache::lonuserutils::authorpriv($env{'user.name'},
                                                   $env{'request.role.domain'}))) {
               $r->print('<span class="LC_error">'.
                         &mt('You do not have privileges to assign co-author roles.').
                         '</span>');
           } elsif (($env{'user.name'} eq $ccuname) &&
                ($env{'user.domain'} eq $ccdomain)) {
               $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted'));
           }
     }      }
 #      return $addrolesdisplay;;
 # Domain level  }
 #  
   sub new_domain_roles {
       my ($r) = @_;
       my $addrolesdisplay = 0;
       #
       # Domain level
       #
     my $num_domain_level = 0;      my $num_domain_level = 0;
     my $domaintext =       my $domaintext =
     '<h4>'.&mt('Domain Level').'</h4>'.      '<h4>'.&mt('Domain Level').'</h4>'.
     &Apache::loncommon::start_data_table().      &Apache::loncommon::start_data_table().
     &Apache::loncommon::start_data_table_header_row().      &Apache::loncommon::start_data_table_header_row().
Line 1187  ENDNOPRIV Line 1212  ENDNOPRIV
         foreach my $role ('dc','li','dg','au','sc') {          foreach my $role ('dc','li','dg','au','sc') {
             if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {              if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
                my $plrole=&Apache::lonnet::plaintext($role);                 my $plrole=&Apache::lonnet::plaintext($role);
        my %lt=&Apache::lonlocal::texthash(                 my %lt=&Apache::lonlocal::texthash(
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );                                         );
                $num_domain_level ++;                 $num_domain_level ++;
                $domaintext .=                  $domaintext .=
 &Apache::loncommon::start_data_table_row().  &Apache::loncommon::start_data_table_row().
 '<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>  '<td><input type=checkbox name="act_'.$thisdomain.'_'.$role.'" /></td>
 <td>'.$plrole.'</td>  <td>'.$plrole.'</td>
Line 1205  ENDNOPRIV Line 1230  ENDNOPRIV
 "javascript:pjump('."'date_end','End Date $plrole',document.cu.end_$thisdomain\_$role.value,'end_$thisdomain\_$role','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>'.
 &Apache::loncommon::end_data_table_row();  &Apache::loncommon::end_data_table_row();
             }              }
         }           }
     }      }
     $domaintext.= &Apache::loncommon::end_data_table();      $domaintext.= &Apache::loncommon::end_data_table();
     if ($num_domain_level > 0) {      if ($num_domain_level > 0) {
         $r->print($domaintext);          $r->print($domaintext);
           $addrolesdisplay = 1;
       }
       return $addrolesdisplay;
   }
   
   sub user_authentication {
       my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_;
       my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
       my ($loginscript,$outcome);
       if ($currentauth=~/^(krb)(4|5):(.*)/) {
           my $long_auth = $1.$2;
           my $curr_kerb_ver = $2;
           my $krbdefdom=$3;
           my $curr_authtype = $abv_auth->{$long_auth};
           my %param = ( formname      => 'document.cu',
                         kerb_def_dom  => $krbdefdom,
                         domain        => $ccdomain,
                         curr_authtype => $curr_authtype,
                         curr_kerb_ver => $curr_kerb_ver,
                             );
           $loginscript  = &Apache::loncommon::authform_header(%param);
       }
       # Check for a bad authentication type
       if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) {
           # bad authentication scheme
           my %lt=&Apache::lonlocal::texthash(
                          'err'   => "ERROR",
                          'uuas'  => "This user has an unrecognized authentication scheme",
                          'adcs'  => "Please alert a domain coordinator of this situation",
                          'sldb'  => "Please specify login data below",
                          'ld'    => "Login Data"
           );
           if (&Apache::lonnet::allowed('mau',$ccdomain)) {
               &initialize_authen_forms($ccdomain);
               my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
               $outcome = <<ENDBADAUTH;
   <script type="text/javascript" language="Javascript">
   $loginscript
   </script>
   <span class="LC_error">$lt{'err'}:
   $lt{'uuas'} ($currentauth). $lt{'sldb'}.</span>
   <h3>$lt{'ld'}</h3>
   $choices
   ENDBADAUTH
           } else {
               # This user is not allowed to modify the user's
               # authentication scheme, so just notify them of the problem
               $outcome = <<ENDBADAUTH;
   <span class="LC_error"> $lt{'err'}: 
   $lt{'uuas'} ($currentauth). $lt{'adcs'}.
   </span>
   ENDBADAUTH
           }
       } else { # Authentication type is valid
           &initialize_authen_forms($ccdomain,$currentauth,'modifyuser');
           my ($authformcurrent,$can_modify,@authform_others) =
               &modify_login_block($ccdomain,$currentauth);
           if (&Apache::lonnet::allowed('mau',$ccdomain)) {
               # Current user has login modification privileges
               my %lt=&Apache::lonlocal::texthash (
                              'ld'    => "Login Data",
                              'ccld'  => "Change Current Login Data",
                              'enld'  => "Enter New Login Data"
                                                  );
               $outcome =
                          '<script type="text/javascript" language="Javascript">'."\n".
                          $loginscript."\n".
                          '</script>'."\n".
                          '<h3>'.$lt{'ld'}.'</h3>'.
                          &Apache::loncommon::start_data_table().
                          &Apache::loncommon::start_data_table_row().
                          '<td>'.$authformnop;
               if ($can_modify) {
                   $outcome .= '</td>'."\n".
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::start_data_table_row().
                               '<td>'.$authformcurrent.'</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               } else {
                   $outcome .= '&nbsp;('.$authformcurrent.')</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               }
               foreach my $item (@authform_others) { 
                   $outcome .= &Apache::loncommon::start_data_table_row().
                               '<td>'.$item.'</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               }
               $outcome .= &Apache::loncommon::end_data_table();
           } else {
               if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
                   my %lt=&Apache::lonlocal::texthash(
                              'ccld'  => "Change Current Login Data",
                              'yodo'  => "You do not have privileges to modify the authentication configuration for this user.",
                              'ifch'  => "If a change is required, contact a domain coordinator for the domain",
                   );
                   $outcome .= <<ENDNOPRIV;
   <h3>$lt{'ccld'}</h3>
   $lt{'yodo'} $lt{'ifch'}: $ccdomain
   ENDNOPRIV
               }
           }
       }  ## End of "check for bad authentication type" logic
       return $outcome;
   }
   
   sub modify_login_block {
       my ($dom,$currentauth) = @_;
       my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
       my ($authnum,%can_assign) =
           &Apache::loncommon::get_assignable_auth($dom);
       my ($authformcurrent,@authform_others,$show_override_msg);
       if ($currentauth=~/^krb(4|5):/) {
           $authformcurrent=$authformkrb;
           if ($can_assign{'int'}) {
               push(@authform_others,$authformint);
           }
           if ($can_assign{'loc'}) {
               push(@authform_others,$authformloc);
           }
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^internal:/) {
           $authformcurrent=$authformint;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               push(@authform_others,$authformkrb);
           }
           if ($can_assign{'loc'}) {
               push(@authform_others,$authformloc);
           }
           if ($can_assign{'int'}) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^unix:/) {
           $authformcurrent=$authformfsys;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               push(@authform_others,$authformkrb);
           }
           if ($can_assign{'int'}) {
               push(@authform_others,$authformint);
           }
           if ($can_assign{'loc'}) {
               push(@authform_others,$authformloc);
           }
           if ($can_assign{'fsys'}) {
               $show_override_msg = 1;
           }
       } elsif ($currentauth=~/^localauth:/) {
           $authformcurrent=$authformloc;
           if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
               push(@authform_others,$authformkrb);
           }
           if ($can_assign{'int'}) {
               push(@authform_others,$authformint);
           }
           if ($can_assign{'loc'}) {
               $show_override_msg = 1;
           }
       }
       if ($show_override_msg) {
           $authformcurrent = '<table><tr><td colspan="3">'.$authformcurrent.
                              '</td></tr>'."\n".
                              '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                              '<td><b>'.&mt('Currently in use').'</b></td>'.
                              '<td align="right"><span class="LC_cusr_emph">'.
                               &mt('will override current values').
                               '</span></td></tr></table>';
       }
       return ($authformcurrent,$show_override_msg,@authform_others); 
   }
   
   sub personal_data_display {
       my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_;
       my ($output,$showforceid,%userenv,%canmodify);
       my @userinfo = ('firstname','middlename','lastname','generation',
                       'permanentemail','id');
       if (!$newuser) {
           # Get the users information
           %userenv = &Apache::lonnet::get('environment',
                      ['firstname','middlename','lastname','generation',
                       'permanentemail','id'],$ccdomain,$ccuname);
           %canmodify =
               &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
                                                          \@userinfo);
     }      }
 #      my %lt=&Apache::lonlocal::texthash(
 # Course and group levels                  'pd'             => "Personal Data",
 #                  'firstname'      => "First Name",
                   'middlename'     => "Middle Name",
     if ($env{'request.role'} =~ m{^dc\./($match_domain)/$}) {                  'lastname'       => "Last Name",
         $r->print(&course_level_dc($1,'Course'));                  'generation'     => "Generation",
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");                  'permanentemail' => "Permanent e-mail address",
                   'id'             => "ID/Student Number",
                   'lg'             => "Login Data"
       );
       my %textboxsize = (
                          firstname      => '15',
                          middlename     => '15',
                          lastname       => '15',
                          generation     => '5',
                          permanentemail => '25',
                          id             => '15',
                         );
       my $genhelp=&Apache::loncommon::help_open_topic('Generation');
       $output = '<h3>'.$lt{'pd'}.'</h3>'.
                 &Apache::lonhtmlcommon::start_pick_box();
       foreach my $item (@userinfo) {
           my $rowtitle = $lt{$item};
           if ($item eq 'generation') {
               $rowtitle = $genhelp.$rowtitle;
           }
           $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
           if ($newuser) {
               if (ref($inst_results) eq 'HASH') {
                   if ($inst_results->{$item} ne '') {
                       $output .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};
                   } else {
                       $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                   }
               } else {
                   $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
               }
           } else {
               if ($canmodify{$item}) {
                   $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';
               } else {
                   $output .= $userenv{$item};
               }
               if ($item eq 'id') {
                   $showforceid = $canmodify{$item};
               }
           }
           $output .= &Apache::lonhtmlcommon::row_closure(1);
       }
       $output .= &Apache::lonhtmlcommon::end_pick_box();
       if (wantarray) {
           return ($output,$showforceid);
     } else {      } else {
         $r->print(&course_level_table(%inccourses));          return $output;
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()" />'."\n");  
     }      }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate']));  
     $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());  
 }  }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my ($r) = @_;       my ($r,$context) = @_; 
     my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $env{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
     my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';      my $error     = '<span class="LC_error">'.&mt('Error').': ';
     my $end       = &Apache::loncommon::end_page();      my $end       = '</span><br /><br />';
       my $rtnlink   = '<a href="javascript:backPage(document.userupdate,'.
                       "'$env{'form.prevphase'}','modify')".'" />'.
                       &mt('Return to previous page').'</a>'.
                       &Apache::loncommon::end_page();
       my $now = time;
     my $title;      my $title;
     if (exists($env{'form.makeuser'})) {      if (exists($env{'form.makeuser'})) {
  $title='Set Privileges for New User';   $title='Set Privileges for New User';
     } else {      } else {
         $title='Modify User Privileges';          $title='Modify User Privileges';
     }      }
       my $newuser = 0;
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'."\n".      my $jscript = '<script type="text/javascript">'."\n".
                   $jsback."\n".'</script>'."\n";                    $jsback."\n".'</script>'."\n";
       my %breadcrumb_text = &singleuser_breadcrumb();
     $r->print(&Apache::loncommon::start_page($title,$jscript));      $r->print(&Apache::loncommon::start_page($title,$jscript));
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.userupdate)",         ({href=>"javascript:backPage(document.userupdate)",
          text=>"User modify/custom role edit",           text=>$breadcrumb_text{'search'},
          faq=>282,bug=>'Instructor Interface',});           faq=>282,bug=>'Instructor Interface',});
     if ($env{'form.prevphase'} eq 'userpicked') {      if ($env{'form.prevphase'} eq 'userpicked') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
            ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')",             ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')",
              text=>"Select a user",               text=>$breadcrumb_text{'userpicked'},
              faq=>282,bug=>'Instructor Interface',});               faq=>282,bug=>'Instructor Interface',});
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",         ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",
          text=>"Set user role",           text=>$breadcrumb_text{'modify'},
          faq=>282,bug=>'Instructor Interface',},           faq=>282,bug=>'Instructor Interface',},
         {href=>"/adm/createuser",          {href=>"/adm/createuser",
          text=>"Result",           text=>"Result",
          faq=>282,bug=>'Instructor Interface',});           faq=>282,bug=>'Instructor Interface',});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));      my $helpitem = 'Course_Change_Privileges';
       if ($env{'form.action'} eq 'singlestudent') {
     my %disallowed;          $helpitem = 'Course_Add_Student';
       }
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                    $helpitem));
       $r->print(&update_result_form($uhome));
     # Check Inputs      # Check Inputs
     if (! $env{'form.ccuname'} ) {      if (! $env{'form.ccuname'} ) {
  $r->print($error.&mt('No login name specified').'.'.$end);   $r->print($error.&mt('No login name specified').'.'.$end.$rtnlink);
  return;   return;
     }      }
     if (  $env{'form.ccuname'} ne       if (  $env{'form.ccuname'} ne 
   &LONCAPA::clean_username($env{'form.ccuname'}) ) {    &LONCAPA::clean_username($env{'form.ccuname'}) ) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name').'.  '.
   &mt('Only letters, numbers, periods, dashes, @, 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'} ne      if (  $env{'form.ccdomain'} ne
   &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {    &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt ('Invalid domain name').'.  '.
   &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.
   $end);    $end.$rtnlink);
  return;   return;
     }      }
       if ($uhome eq 'no_host') {
           $newuser = 1;
       }
     if (! exists($env{'form.makeuser'})) {      if (! exists($env{'form.makeuser'})) {
         # Modifying an existing user, so check the validity of the name          # Modifying an existing user, so check the validity of the name
         if ($uhome eq 'no_host') {          if ($uhome eq 'no_host') {
Line 1325  sub update_user_data { Line 1585  sub update_user_data {
         # If they are creating a new user but have not specified login          # If they are creating a new user but have not specified login
         # information this will be caught below.          # information this will be caught below.
     } else {      } else {
     $r->print($error.&mt('Invalid login mode or password').$end);          $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);    
     return;      return;
     }      }
   
       $r->print('<h3>'.&mt('User [_1] in domain [_2]',
     $r->print('<h2>'.&mt('User [_1] in domain [_2]',   $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
  $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h2>');      my (%alerts,%rulematch,%inst_results,%curr_rules);
   
     if ($env{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
  $r->print('<h3>'.&mt('Creating new account.').'</h3>');   $r->print('<h3>'.&mt('Creating new account.').'</h3>');
         # Check for the authentication mode and password          # Check for the authentication mode and password
         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 1348  sub update_user_data { Line 1607  sub update_user_data {
             my %home_servers =               my %home_servers = 
  &Apache::lonnet::get_servers($env{'form.ccdomain'},'library');   &Apache::lonnet::get_servers($env{'form.ccdomain'},'library');
             if (! exists($home_servers{$desiredhost})) {              if (! exists($home_servers{$desiredhost})) {
                 $r->print($error.&mt('Invalid home server specified'));                  $r->print($error.&mt('Invalid home server specified').$end.$rtnlink);
                 return;                  return;
             }              }
         }          }
           # Check ID format
           my %checkhash;
           my %checks = ('id' => 1);
           %{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = (
               'newuser' => $newuser, 
               'id' => $env{'form.cid'},
           );
           if ($env{'form.cid'} ne '') {
               &Apache::loncommon::user_rule_check(\%checkhash,\%checks,\%alerts,
                                             \%rulematch,\%inst_results,\%curr_rules);
               if (ref($alerts{'id'}) eq 'HASH') {
                   if (ref($alerts{'id'}{$env{'form.ccdomain'}}) eq 'HASH') {
                       my $domdesc =
                           &Apache::lonnet::domain($env{'form.ccdomain'},'description');
                       if ($alerts{'id'}{$env{'form.ccdomain'}}{$env{'form.cid'}}) {
                           my $userchkmsg;
                           if (ref($curr_rules{$env{'form.ccdomain'}}) eq 'HASH') {
                               $userchkmsg  = 
                                   &Apache::loncommon::instrule_disallow_msg('id',
                                                                       $domdesc,1).
                                   &Apache::loncommon::user_rule_formats($env{'form.ccdomain'},
                                       $domdesc,$curr_rules{$env{'form.ccdomain'}}{'id'},'id');
                           }
                           $r->print($error.&mt('Invalid ID format').$end.
                                     $userchkmsg.$rtnlink);
                           return;
                       }
                   }
               }
           }
  # Call modifyuser   # Call modifyuser
  my $result = &Apache::lonnet::modifyuser   my $result = &Apache::lonnet::modifyuser
     ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cstid'},      ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cid'},
              $amode,$genpwd,$env{'form.cfirst'},               $amode,$genpwd,$env{'form.cfirstname'},
              $env{'form.cmiddle'},$env{'form.clast'},$env{'form.cgen'},               $env{'form.cmiddlename'},$env{'form.clastname'},
              undef,$desiredhost               $env{'form.cgeneration'},undef,$desiredhost,
      );               $env{'form.cpermanentemail'});
  $r->print(&mt('Generating user').': '.$result);   $r->print(&mt('Generating user').': '.$result);
         my $home = &Apache::lonnet::homeserver($env{'form.ccuname'},          $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},
                                                $env{'form.ccdomain'});                                                 $env{'form.ccdomain'});
         $r->print('<br />'.&mt('Home server').': '.$home.' '.          $r->print('<br />'.&mt('Home server').': '.$uhome.' '.
                   &Apache::lonnet::hostname($home));                    &Apache::lonnet::hostname($uhome));
     } elsif (($env{'form.login'} ne 'nochange') &&      } elsif (($env{'form.login'} ne 'nochange') &&
              ($env{'form.login'} ne ''        )) {               ($env{'form.login'} ne ''        )) {
  # Modify user privileges   # Modify user privileges
         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 1381  sub update_user_data { Line 1670  sub update_user_data {
   ($env{'form.ccuname'},$env{'form.ccdomain'}));    ($env{'form.ccuname'},$env{'form.ccdomain'}));
  } else {   } else {
     # Okay, this is a non-fatal error.      # Okay, this is a non-fatal error.
     $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');          $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end);    
  }   }
     }      }
     ##      ##
       my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
       if ($context eq 'course') {
           ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
       }
     if (! $env{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation',              ('environment',['firstname','middlename','lastname','generation',
              'permanentemail','portfolioquota','inststatus'],               'id','permanentemail','portfolioquota','inststatus'],
               $env{'form.ccdomain'},$env{'form.ccuname'});                $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
             %userenv = ();              %userenv = ();
         }          }
         # Check to see if we need to change user information          my $no_forceid_alert;
         foreach my $item ('firstname','middlename','lastname','generation','permanentemail') {          # Check to see if user information can be changed
           my %domconfig =
               &Apache::lonnet::get_dom('configuration',['usermodification'],
                                        $env{'form.ccdomain'});
           my @statuses = ('active','future');
           my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'});
           my ($auname,$audom);
           if ($context eq 'author') {
               $auname = $env{'user.name'};
               $audom = $env{'user.domain'};     
           }
           foreach my $item (keys(%roles)) {
               my ($rolenum,$roledom,$role) = split(/:/,$item,-1);
               if ($context eq 'course') {
                   if ($cnum ne '' && $cdom ne '') {
                       if ($rolenum eq $cnum && $roledom eq $cdom) {
                           if (!grep(/^\Q$role\E$/,@userroles)) {
                               push(@userroles,$role);
                           }
                       }
                   }
               } elsif ($context eq 'author') {
                   if ($rolenum eq $auname && $roledom eq $audom) {
                       if (!grep(/^\Q$role\E$/,@userroles)) { 
                           push(@userroles,$role);
                       }
                   }
               }
           }
           if ($env{'form.action'} eq 'singlestudent') {
               if (!grep(/^st$/,@userroles)) {
                   push(@userroles,'st');
               }
           } else {
               # Check for course or co-author roles being activated or re-enabled
               if ($context eq 'author' || $context eq 'course') {
                   foreach my $key (keys(%env)) {
                       if ($context eq 'author') {
                           if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           }
                       } elsif ($context eq 'course') {
                           if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) {
                               if (!grep(/^\Q$1\E$/,@userroles)) {
                                   push(@userroles,$1);
                               }
                           }
                       }
                   }
               }
           }
           #Check to see if we can change personal data for the user 
           my (@mod_disallowed,@longroles);
           foreach my $role (@userroles) {
               if ($role eq 'cr') {
                   push(@longroles,'Custom');
               } else {
                   push(@longroles,&Apache::lonnet::plaintext($role)); 
               }
           }
           my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
           my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);
           foreach my $item (@userinfo) {
             # Strip leading and trailing whitespace              # Strip leading and trailing whitespace
             $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g;               $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g;
               if (!$canmodify{$item}) {
                   if (defined($env{'form.c'.$item})) {
                       if ($env{'form.c'.$item} ne $userenv{$item}) {
                           push(@mod_disallowed,$item);
                       }
                   }
                   $env{'form.c'.$item} = $userenv{$item};
               }
           }
           # Check to see if we can change the ID/student number
           my $forceid = $env{'form.forceid'};
           my $recurseid = $env{'form.recurseid'};
           my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
           my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'},
                                               $env{'form.ccuname'});
           if (($uidhash{$env{'form.ccuname'}}) && 
               ($uidhash{$env{'form.ccuname'}}!~/error\:/) && 
               (!$forceid)) {
               if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                   $env{'form.cid'} = $userenv{'id'};
                   $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').'<br />'.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').'<br />'."\n";        
               }
           }
           if ($env{'form.cid'} ne $userenv{'id'}) {
               my $checkhash;
               my $checks = { 'id' => 1 };
               $checkhash->{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}} = 
                      { 'newuser' => $newuser,
                        'id'  => $env{'form.cid'}, 
                      };
               &Apache::loncommon::user_rule_check($checkhash,$checks,
                   \%alerts,\%rulematch,\%idinst_results,\%curr_rules,\%got_rules);
               if (ref($alerts{'id'}) eq 'HASH') {
                   if (ref($alerts{'id'}{$env{'form.ccdomain'}}) eq 'HASH') {
                      $env{'form.cid'} = $userenv{'id'};
                   }
               }
         }          }
         my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota,          my ($quotachanged,$oldportfolioquota,$newportfolioquota,
             $inststatus,$isdefault,$defquotatext);              $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,
               $newdefquotatext);
         my ($defquota,$settingstatus) =           my ($defquota,$settingstatus) = 
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);              &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
           my $showquota;
           if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
               $showquota = 1;
           }
         my %changeHash;          my %changeHash;
           $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
         if ($userenv{'portfolioquota'} ne '') {          if ($userenv{'portfolioquota'} ne '') {
             $oldportfolioquota = $userenv{'portfolioquota'};              $oldportfolioquota = $userenv{'portfolioquota'};
             if ($env{'form.customquota'} == 1) {              if ($env{'form.customquota'} == 1) {
Line 1414  sub update_user_data { Line 1822  sub update_user_data {
                     $newportfolioquota = $env{'form.portfolioquota'};                      $newportfolioquota = $env{'form.portfolioquota'};
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newportfolioquota =~ s/[^\d\.]//g;
                 }                  }
                 if ($newportfolioquota != $userenv{'portfolioquota'}) {                  if ($newportfolioquota != $oldportfolioquota) {
                     $quotachanged = &quota_admin($newportfolioquota,\%changeHash);                      $quotachanged = &quota_admin($newportfolioquota,\%changeHash);
                 }                  }
             } else {              } else {
                 $quotachanged = &quota_admin('',\%changeHash);                  $quotachanged = &quota_admin('',\%changeHash);
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $isdefault = 1;                   $newisdefault = 1; 
             }              }
         } else {          } else {
               $oldisdefault = 1;
             $oldportfolioquota = $defquota;              $oldportfolioquota = $defquota;
             if ($env{'form.customquota'} == 1) {              if ($env{'form.customquota'} == 1) {
                 if ($env{'form.portfolioquota'} eq '') {                  if ($env{'form.portfolioquota'} eq '') {
Line 1434  sub update_user_data { Line 1843  sub update_user_data {
                 $quotachanged = &quota_admin($newportfolioquota,\%changeHash);                  $quotachanged = &quota_admin($newportfolioquota,\%changeHash);
             } else {              } else {
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $isdefault = 1;                  $newisdefault = 1;
             }              }
         }          }
         if ($isdefault) {          if ($oldisdefault) {
             if ($settingstatus eq '') {              $olddefquotatext = &get_defaultquota_text($settingstatus);
                 $defquotatext = &mt('(default)');          }
             } else {          if ($newisdefault) {
                 my ($usertypes,$order) =               $newdefquotatext = &get_defaultquota_text($settingstatus);
                     &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 ($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'} )) {              $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {
             $namechanged = 1;              $namechanged = 1;
         }          }
         if ($namechanged) {          if ($namechanged || $quotachanged) {
             # Make the change  
             $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'};              $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
             my $putresult = &Apache::lonnet::put              my ($quotachgresult,$namechgresult);
                 ('environment',\%changeHash,              if ($quotachanged) {
                  $env{'form.ccdomain'},$env{'form.ccuname'});                  $quotachgresult = 
             if ($putresult eq 'ok') {                      &Apache::lonnet::put('environment',\%changeHash,
                                     $env{'form.ccdomain'},$env{'form.ccuname'});
               }
               if ($namechanged) {
               # Make the change
                   $namechgresult =
                       &Apache::lonnet::modifyuser($env{'form.ccdomain'},
                           $env{'form.ccuname'},$changeHash{'id'},undef,undef,
                           $changeHash{'firstname'},$changeHash{'middlename'},
                           $changeHash{'lastname'},$changeHash{'generation'},
                           $changeHash{'id'},undef,$changeHash{'permanentemail'});
                   %userupdate = (
                                  lastname   => $env{'form.clastname'},
                                  middlename => $env{'form.cmiddlename'},
                                  firstname  => $env{'form.cfirstname'},
                                  generation => $env{'form.cgeneration'},
                                  id         => $env{'form.cid'},
                                );
               }
               if (($namechanged && $namechgresult eq 'ok') || 
                   ($quotachanged && $quotachgresult eq 'ok')) {
             # Tell the user we changed the name              # Tell the user we changed the name
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                              'uic'  => "User Information Changed",                                            'uic'  => "User Information Changed",             
Line 1476  sub update_user_data { Line 1898  sub update_user_data {
                              'mddl' => "middle",                               'mddl' => "middle",
                              'lst'  => "last",                               'lst'  => "last",
      'gen'  => "generation",       'gen'  => "generation",
                                'id'   => "ID/Student number",
                              'mail' => "permanent e-mail",                               'mail' => "permanent e-mail",
                              'disk' => "disk space allocated to portfolio files",                               'disk' => "disk space allocated to portfolio files",
                              'prvs' => "Previous",                               'prvs' => "Previous",
                              'chto' => "Changed To"                               'chto' => "Changed To"
    );     );
                   $r->print('<h4>'.$lt{'uic'}.'</h4>'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row());
                 $r->print(<<"END");                  $r->print(<<"END");
 <table border="2">      <th>&nbsp;</th>
 <caption>$lt{'uic'}</caption>  
 <tr><th>&nbsp;</th>  
     <th>$lt{'frst'}</th>      <th>$lt{'frst'}</th>
     <th>$lt{'mddl'}</th>      <th>$lt{'mddl'}</th>
     <th>$lt{'lst'}</th>      <th>$lt{'lst'}</th>
     <th>$lt{'gen'}</th>      <th>$lt{'gen'}</th>
       <th>$lt{'id'}</th>
     <th>$lt{'mail'}</th>      <th>$lt{'mail'}</th>
     <th>$lt{'disk'}</th></tr>  END
 <tr><td>$lt{'prvs'}</td>                  if ($showquota) {
                       $r->print("
       <th>$lt{'disk'}</th>\n");
                   }
                   $r->print(&Apache::loncommon::end_data_table_header_row().
                             &Apache::loncommon::start_data_table_row());
                   $r->print(<<"END");
       <td><b>$lt{'prvs'}</b></td>
     <td>$userenv{'firstname'}  </td>      <td>$userenv{'firstname'}  </td>
     <td>$userenv{'middlename'} </td>      <td>$userenv{'middlename'} </td>
     <td>$userenv{'lastname'}   </td>      <td>$userenv{'lastname'}   </td>
     <td>$userenv{'generation'} </td>      <td>$userenv{'generation'} </td>
       <td>$userenv{'id'}</td>
     <td>$userenv{'permanentemail'} </td>      <td>$userenv{'permanentemail'} </td>
     <td>$oldportfolioquota Mb</td>  END
 </tr>                  if ($showquota) {
 <tr><td>$lt{'chto'}</td>                      $r->print("
       <td>$oldportfolioquota Mb $olddefquotatext </td>\n");
                   }
                   $r->print(&Apache::loncommon::end_data_table_row().
                             &Apache::loncommon::start_data_table_row());
                   $r->print(<<"END");
       <td><b>$lt{'chto'}</b></td>
     <td>$env{'form.cfirstname'}  </td>      <td>$env{'form.cfirstname'}  </td>
     <td>$env{'form.cmiddlename'} </td>      <td>$env{'form.cmiddlename'} </td>
     <td>$env{'form.clastname'}   </td>      <td>$env{'form.clastname'}   </td>
     <td>$env{'form.cgeneration'} </td>      <td>$env{'form.cgeneration'} </td>
       <td>$env{'form.cid'} </td>
     <td>$env{'form.cpermanentemail'} </td>      <td>$env{'form.cpermanentemail'} </td>
     <td>$newportfolioquota Mb $defquotatext </td></tr>  
 </table>  
 END  END
                   if ($showquota) {
                       $r->print("
       <td>$newportfolioquota Mb $newdefquotatext </td>\n");
                   }
                   $r->print(&Apache::loncommon::end_data_table_row().
                             &Apache::loncommon::end_data_table().'<br />');
                   if ($env{'form.cid'} ne $userenv{'id'}) {
                       &Apache::lonnet::idput($env{'form.ccdomain'},
                            ($env{'form.ccuname'} => $env{'form.cid'}));
                       if (($recurseid) &&
                           (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
                           my $idresult = 
                               &Apache::lonuserutils::propagate_id_change(
                                   $env{'form.ccuname'},$env{'form.ccdomain'},
                                   \%userupdate);
                           $r->print('<br />'.$idresult.'<br />');
                       }
                   }
                 if (($env{'form.ccdomain'} eq $env{'user.domain'}) &&                   if (($env{'form.ccdomain'} eq $env{'user.domain'}) && 
                     ($env{'form.ccuname'} eq $env{'user.name'})) {                      ($env{'form.ccuname'} eq $env{'user.name'})) {
                     my %newenvhash;                      my %newenvhash;
Line 1517  END Line 1973  END
                     &Apache::lonnet::appenv(%newenvhash);                      &Apache::lonnet::appenv(%newenvhash);
                 }                  }
             } else { # error occurred              } else { # error occurred
                 $r->print("<h2>".&mt('Unable to successfully change environment for')." ".                  $r->print('<span class="LC_error">'.&mt('Unable to successfully change environment for').' '.
                       $env{'form.ccuname'}." ".&mt('in domain')." ".                        $env{'form.ccuname'}.' '.&mt('in domain').' '.
                       $env{'form.ccdomain'}."</h2>");                        $env{'form.ccdomain'}.'</span><br />');
             }              }
         }  else { # End of if ($env ... ) logic          }  else { # End of if ($env ... ) logic
             my $putresult;              # They did not want to change the users name or quota but we can
             if ($quotachanged) {              # still tell them what the name and quota are 
                 $putresult = &Apache::lonnet::put  
                                  ('environment',\%changeHash,  
                                   $env{'form.ccdomain'},$env{'form.ccuname'});  
             }  
             # They did not want to change the users name but we can  
             # still tell them what the name is  
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                              'id'   => "ID/Student number",
                            'mail' => "Permanent e-mail",                             'mail' => "Permanent e-mail",
                            'disk' => "Disk space allocated to user's portfolio files",                             'disk' => "Disk space allocated to user's portfolio files",
        );         );
             $r->print(<<"END");              $r->print(<<"END");
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}</h4>  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
 <h4>$lt{'mail'}: $userenv{'permanentemail'}</h4>  
 END  END
             if ($putresult eq 'ok') {              if ($userenv{'permanentemail'} ne '') {
                 if ($oldportfolioquota != $newportfolioquota) {                  $r->print('<br />['.$lt{'mail'}.': '.
                     $r->print('<h4>'.$lt{'disk'}.': '.$newportfolioquota.' Mb '.                             $userenv{'permanentemail'}.']');
                               $defquotatext.'</h4>');              }
                     &Apache::lonnet::appenv('environment.portfolioquota' => $changeHash{'portfolioquota'});              if ($showquota) {
                   $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. 
                             $olddefquotatext.']');
               }
               $r->print('</h4>');
           }
           if (@mod_disallowed) {
               my ($rolestr,$contextname);
               if (@longroles > 0) {
                   $rolestr = join(', ',@longroles);
               } else {
                   $rolestr = &mt('No roles');
               }
               if ($context eq 'course') {
                   $contextname = &mt('course');
               } elsif ($context eq 'author') {
                   $contextname = &mt('co-author');
               }
               $r->print(&mt('The following fields were not updated: ').'<ul>');
               my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
               foreach my $field (@mod_disallowed) {
                   $r->print('<li>'.$fieldtitles{$field}.'</li>'."\n"); 
               }
               $r->print('</ul>');
               if (@mod_disallowed == 1) {
                   $r->print(&mt("You do not have the authority to change this field given the user's current set of active/future [_1] roles:",$contextname));
               } else {
                   $r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname));
               }
               $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.
                         &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');
           }
           $r->print($no_forceid_alert.
                     &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules));
       }
       if ($env{'form.action'} eq 'singlestudent') {
           &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser);
       } else {
           my $rolechanges = &update_roles($r);
           if (!$rolechanges && $namechanged) {
               if ($context eq 'course') {
                   if (@userroles > 0) {
                       if (grep(/^st$/,@userroles)) {
                           my $classlistupdated =
                               &Apache::lonuserutils::update_classlist($cdom,
                                                 $cnum,$env{'form.ccdomain'},
                                          $env{'form.ccuname'},\%userupdate);
                       }
                 }                  }
             }              }
         }          }
     }      }
     ##      $r->print(&Apache::loncommon::end_page());
   }
   
   sub update_roles {
       my ($r) = @_;
     my $now=time;      my $now=time;
       my $rolechanges = 0;
       my %disallowed;
     $r->print('<h3>'.&mt('Modifying Roles').'</h3>');      $r->print('<h3>'.&mt('Modifying Roles').'</h3>');
     foreach my $key (keys (%env)) {      foreach my $key (keys (%env)) {
  next if (! $env{$key});   next if (! $env{$key});
           next if ($key eq 'form.action');
  # Revoke roles   # Revoke roles
  if ($key=~/^form\.rev/) {   if ($key=~/^form\.rev/) {
     if ($key=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {      if ($key=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {
Line 1564  END Line 2068  END
         $r->print(&mt('Revoking [_1] in [_2]: [_3]',          $r->print(&mt('Revoking [_1] in [_2]: [_3]',
       $role,$scope,'<b>'.$result.'</b>').'<br />');        $role,$scope,'<b>'.$result.'</b>').'<br />');
  if ($role eq 'st') {   if ($role eq 'st') {
     my $result = &classlist_drop($scope,$env{'form.ccuname'},      my $result = 
  $env{'form.ccdomain'},$now);                          &Apache::lonuserutils::classlist_drop($scope,
                               $env{'form.ccuname'},$env{'form.ccdomain'},
       $now);
     $r->print($result);      $r->print($result);
  }   }
     }       }
     if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$ }s) {      if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {
 # Revoke custom role  # Revoke custom role
  $r->print(&mt('Revoking custom role:').   $r->print(&mt('Revoking custom role:').
                       ' '.$4.' by '.$3.':'.$2.' in '.$1.': <b>'.                        ' '.$4.' by '.$3.':'.$2.' in '.$1.': <b>'.
Line 1577  END Line 2083  END
   $env{'form.ccuname'},$1,$2,$3,$4).    $env{'form.ccuname'},$1,$2,$3,$4).
  '</b><br />');   '</b><br />');
     }      }
               $rolechanges ++;
  } elsif ($key=~/^form\.del/) {   } elsif ($key=~/^form\.del/) {
     if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {      if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
 # Delete standard role  # Delete standard role
Line 1588  END Line 2095  END
         $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,          $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
       '<b>'.$result.'</b>').'<br />');        '<b>'.$result.'</b>').'<br />');
  if ($role eq 'st') {   if ($role eq 'st') {
     my $result = &classlist_drop($scope,$env{'form.ccuname'},      my $result = 
  $env{'form.ccdomain'},$now);                          &Apache::lonuserutils::classlist_drop($scope,
                               $env{'form.ccuname'},$env{'form.ccdomain'},
       $now);
     $r->print($result);      $r->print($result);
  }   }
             }              }
Line 1602  END Line 2111  END
                          $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,                           $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
                          0,1).'</b><br />');                           0,1).'</b><br />');
             }              }
               $rolechanges ++;
  } elsif ($key=~/^form\.ren/) {   } elsif ($key=~/^form\.ren/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
Line 1614  END Line 2124  END
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) {                      if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) {
                         my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3);                          my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3);
                         if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) {                          if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) {
                             $output = "Error: $result\n";                              if ($result eq 'refused' && $logmsg) {
                                   $output = $logmsg;
                               } else { 
                                   $output = "Error: $result\n";
                               }
                         } else {                          } else {
                             $output = &mt('Assigning').' '.$role.' in '.$url.                              $output = &mt('Assigning').' '.$role.' in '.$url.
                                       &mt('starting').' '.localtime($now).                                        &mt('starting').' '.localtime($now).
Line 1640  END Line 2154  END
                 $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',                  $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',
                           $rolename,$rnam,$rdom,$url,$result).'<br />');                            $rolename,$rnam,$rdom,$url,$result).'<br />');
             }              }
               $rolechanges ++;
  } elsif ($key=~/^form\.act/) {   } elsif ($key=~/^form\.act/) {
             my $udom = $env{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $env{'form.ccuname'};              my $uname = $env{'form.ccuname'};
Line 1743  END Line 2258  END
                     }                      }
                 }                  }
     } else {      } else {
  $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$key.'</tt></p><br />');   $r->print('<p><span class="LC_error">'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$key.'</tt></span></p><br />');
             }              }
             foreach my $key (sort(keys(%disallowed))) {              foreach my $key (sort(keys(%disallowed))) {
                 if (($key eq 'none') || ($key eq 'all')) {                    if (($key eq 'none') || ($key eq 'all')) {  
Line 1753  END Line 2268  END
                 }                  }
                 $r->print(' '.&mt('Please <a href="javascript:history.go(-1)">go back</a> and choose a different section name.').'</p><br />');                  $r->print(' '.&mt('Please <a href="javascript:history.go(-1)">go back</a> and choose a different section name.').'</p><br />');
             }              }
               $rolechanges ++;
  }   }
     } # End of foreach (keys(%env))      } # End of foreach (keys(%env))
 # Flush the course logs so reverse user roles immediately updated  # Flush the course logs so reverse user roles immediately updated
     &Apache::lonnet::flushcourselogs();      &Apache::lonnet::flushcourselogs();
     $r->print('<p><a href="/adm/createuser">'.&mt('Create/Modify Another User').'</a></p>');      if (!$rolechanges) {
     $r->print('<form name="userupdate" method="post" />'."\n");          $r->print(&mt('No roles to modify'));
     foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') {  
         $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n");  
     }      }
     foreach my $item ('sortby','seluname','seludom') {      return $rolechanges;
         if (exists($env{'form.'.$item})) {  }
             $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n");  
   sub enroll_single_student {
       my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_;
       $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
   
       # Remove non alphanumeric values from section
       $env{'form.sections'}=~s/\W//g;
   
       # Clean out any old student roles the user has in this class.
       &Apache::lonuserutils::modifystudent($env{'form.ccdomain'},
            $env{'form.ccuname'},$env{'request.course.id'},undef,$uhome);
       my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form();
       my $enroll_result =
           &Apache::lonnet::modify_student_enrollment($env{'form.ccdomain'},
               $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'},
               $env{'form.cmiddlename'},$env{'form.clastname'},
               $env{'form.generation'},$env{'form.sections'},$enddate,
               $startdate,'manual',undef,$env{'request.course.id'});
       if ($enroll_result =~ /^ok/) {
           $r->print(&mt('<b>[_1]</b> enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'}));
           if ($env{'form.sections'} ne '') {
               $r->print(' '.&mt('in section [_1]',$env{'form.sections'}));
           }
           my ($showstart,$showend);
           if ($startdate <= $now) {
               $showstart = &mt('Access starts immediately');
           } else {
               $showstart = &mt('Access starts: ').&Apache::lonlocal::locallocaltime($startdate);
           }
           if ($enddate == 0) {
               $showend = &mt('ends: no ending date');
           } else {
               $showend = &mt('ends: ').&Apache::lonlocal::locallocaltime($enddate);
         }          }
           $r->print('.<br />'.$showstart.'; '.$showend);
           if ($startdate <= $now && !$newuser) {
               $r->print("<p> ".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."</p>");
           }
       } else {
           $r->print(&mt('unable to enroll').": ".$enroll_result);
     }      }
     $r->print('<input type="hidden" name="phase" value="" />'."\n".      return;
               '<input type ="hidden" name="currstate" value="" />'."\n".  
               '</form>');  
     $r->print(&Apache::loncommon::end_page());  
 }  }
   
 sub classlist_drop {  sub get_defaultquota_text {
     my ($scope,$uname,$udom,$now) = @_;      my ($settingstatus) = @_;
     my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});      my $defquotatext; 
     my $cid=$cdom.'_'.$cnum;      if ($settingstatus eq '') {
     my $user = $uname.':'.$udom;          $defquotatext = &mt('(default)');
     if (!&active_student_roles($cnum,$cdom,$uname,$udom)) {      } else {
  my $result =           my ($usertypes,$order) =
     &Apache::lonnet::cput('classlist',              &Apache::lonnet::retrieve_inst_usertypes($env{'form.ccdomain'});
   { $user => $now },          if ($usertypes->{$settingstatus} eq '') {
   $env{'course.'.$cid.'.domain'},              $defquotatext = &mt('(default)');
   $env{'course.'.$cid.'.num'});          } else {
  return &mt('Drop from classlist: [_1]',              $defquotatext = &mt('(default for [_1])',$usertypes->{$settingstatus});
    '<b>'.$result.'</b>').'<br />';          }
     }      }
       return $defquotatext;
 }  }
   
 sub active_student_roles {  sub update_result_form {
     my ($cnum,$cdom,$uname,$udom) = @_;      my ($uhome) = @_;
     my %roles =       my $outcome = 
  &Apache::lonnet::get_my_roles($uname,$udom,'userroles',      '<form name="userupdate" method="post" />'."\n";
       ['future','active'],['st']);      foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') {
     return exists($roles{"$cnum:$cdom:st"});          $outcome .= '<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n";
       }
       if ($env{'form.origname'} ne '') {
           $outcome .= '<input type="hidden" name="origname" value="'.$env{'form.origname'}.'" />'."\n";
       }
       foreach my $item ('sortby','seluname','seludom') {
           if (exists($env{'form.'.$item})) {
               $outcome .= '<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n";
           }
       }
       if ($uhome eq 'no_host') {
           $outcome .= '<input type="hidden" name="forcenewuser" value="1" />'."\n";
       }
       $outcome .= '<input type="hidden" name="phase" value="" />'."\n".
                   '<input type ="hidden" name="currstate" value="" />'."\n".
                   '<input type ="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
                   '</form>';
       return $outcome;
 }  }
   
 sub quota_admin {  sub quota_admin {
Line 1853  sub custom_role_editor { Line 2420  sub custom_role_editor {
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     if (!$rolename) {      if (!$rolename || $env{'form.phase'} eq 'pickrole') {
  &print_username_entry_form($r);   &print_username_entry_form($r);
         return;          return;
     }      }
Line 1922  sub custom_role_editor { Line 2489  sub custom_role_editor {
     $head_script .= "\n".$jsback."\n".'</script>'."\n";      $head_script .= "\n".$jsback."\n".'</script>'."\n";
     $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));      $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
    &Apache::lonhtmlcommon::add_breadcrumb     &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage(document.form1,'','')",       ({href=>"javascript:backPage(document.form1,'pickrole','')",
        text=>"User modify/custom role edit",         text=>"Pick custom role",
        faq=>282,bug=>'Instructor Interface',},         faq=>282,bug=>'Instructor Interface',},
       {href=>"javascript:backPage(document.form1,'','')",        {href=>"javascript:backPage(document.form1,'','')",
          text=>"Edit custom role",           text=>"Edit custom role",
          faq=>282,bug=>'Instructor Interface',});           faq=>282,bug=>'Instructor Interface',});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                     'Course_Editing_Custom_Roles'));
   
     $r->print($body_top);      $r->print($body_top);
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 1966  ENDCCF Line 2534  ENDCCF
              &Apache::loncommon::end_data_table_row());               &Apache::loncommon::end_data_table_row());
     }      }
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
      '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
    '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.     '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.
    '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".        '" />'."\n".'<input type="hidden" name="currstate" value="" />'."\n".   
    '<input type="reset" value="'.&mt("Reset").'" />'."\n".     '<input type="reset" value="'.&mt("Reset").'" />'."\n".
Line 2047  sub make_button_code { Line 2616  sub make_button_code {
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my ($r) = @_;      my ($r) = @_;
   
     my $rolename=$env{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     if (!$rolename) {      if (!$rolename) {
  &print_username_entry_form($r);   &custom_role_editor($r);
         return;          return;
     }      }
   
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'.$jsback."\n".'</script>';      my $jscript = '<script type="text/javascript">'.$jsback."\n".'</script>';
   
     $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);      $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"javascript:backPage(document.customresult,'','')",          ({href=>"javascript:backPage(document.customresult,'pickrole','')",
           text=>"User modify/custom role edit",            text=>"Pick custom role",
           faq=>282,bug=>'Instructor Interface',},            faq=>282,bug=>'Instructor Interface',},
          {href=>"javascript:backPage(document.customresult,'selected_custom_edit','')",           {href=>"javascript:backPage(document.customresult,'selected_custom_edit','')",
           text=>"Edit custom role",            text=>"Edit custom role",
Line 2071  sub set_custom_role { Line 2636  sub set_custom_role {
          {href=>"javascript:backPage(document.customresult,'set_custom_roles','')",           {href=>"javascript:backPage(document.customresult,'set_custom_roles','')",
           text=>"Result",            text=>"Result",
           faq=>282,bug=>'Instructor Interface',});            faq=>282,bug=>'Instructor Interface',});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                     'Course_Editing_Custom_Roles'));
   
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
     $r->print('<h2>');      $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='';
Line 2126  sub set_custom_role { Line 2692  sub set_custom_role {
  $env{'user.name'},   $env{'user.name'},
  $rolename));   $rolename));
     }      }
     $r->print('<p><a href="/adm/createuser">Create another role, or Create/Modify a user.</a></p><form name="customresult" method="post">');      $r->print('<p><a href="javascript:backPage(document.customresult,'."'pickrole'".')">'.&mt('Create or edit another custom role').'</a></p><form name="customresult" method="post">');
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'</form>');      $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'</form>');
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
Line 2134  sub set_custom_role { Line 2700  sub set_custom_role {
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
       my $context;
       if ($env{'request.course.id'}) {
           $context = 'course';
       } elsif ($env{'request.role'} =~ /^au\./) {
           $context = 'author';
       } else {
           $context = 'domain';
       }
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
           ['action','state','callingform','roletype','showrole','bulkaction']);
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       if ($env{'form.action'} ne 'dateselect') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"/adm/createuser",
                 text=>"User Management"});
       }
       my ($permission,$allowed) = 
           &Apache::lonuserutils::get_permission($context);
       if (!$allowed) {
           $env{'user.error.msg'}=
               "/adm/createuser:cst:0:0:Cannot create/modify user data ".
                                    "or view user status.";
           return HTTP_NOT_ACCEPTABLE;
       }
   
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
   
       # Main switch on form.action and form.state, as appropriate
       if (! exists($env{'form.action'})) {
           $r->print(&header());
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
           $r->print(&print_main_menu($permission,$context));
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=upload&state=',
                 text=>"Upload Users List"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List',
                                                      'Course_Create_Class_List'));
           $r->print('<form name="studentform" method="post" '.
                     'enctype="multipart/form-data" '.
                     ' action="/adm/createuser">'."\n");
           if (! exists($env{'form.state'})) {
               &Apache::lonuserutils::print_first_users_upload_form($r,$context);
           } elsif ($env{'form.state'} eq 'got_file') {
               &Apache::lonuserutils::print_upload_manager_form($r,$context,
                                                                $permission);
           } elsif ($env{'form.state'} eq 'enrolling') {
               if ($env{'form.datatoken'}) {
                   &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);
               }
           } else {
               &Apache::lonuserutils::print_first_users_upload_form($r,$context);
           }
           $r->print('</form>'.&Apache::loncommon::end_page());
       } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'}
                eq 'singlestudent')) && ($permission->{'cusr'})) {
           my $phase = $env{'form.phase'};
           my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
    &Apache::loncreateuser::restore_prev_selections();
    my $srch;
    foreach my $item (@search) {
       $srch->{$item} = $env{'form.'.$item};
    }
   
           if (($phase eq 'get_user_info') || ($phase eq 'userpicked') ||
               ($phase eq 'createnewuser')) {
               if ($env{'form.phase'} eq 'createnewuser') {
                   my $response;
                   if ($env{'form.srchterm'} !~ /^$match_username$/) {
                       my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
                       $env{'form.phase'} = '';
                       &print_username_entry_form($r,$context,$response,$srch);
                   } else {
                       my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
                       my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
                       &print_user_modification_page($r,$ccuname,$ccdomain,
                                                     $srch,$response,$context,
                                                     $permission);
                   }
               } elsif ($env{'form.phase'} eq 'get_user_info') {
                   my ($currstate,$response,$forcenewuser,$results) = 
                       &user_search_result($context,$srch);
                   if ($env{'form.currstate'} eq 'modify') {
                       $currstate = $env{'form.currstate'};
                   }
                   if ($currstate eq 'select') {
                       my $operation; 
                       if ($env{'form.action'} eq 'singleuser') {
                           $operation = 'createuser';
                       } elsif ($env{'form.action'} eq 'singlestudent') {
                           $operation = 'enrollstudent';
                       }
                       &print_user_selection_page($r,$response,$srch,$results,
                                                  $operation,\@search,$context);
                   } elsif ($currstate eq 'modify') {
                       my ($ccuname,$ccdomain);
                       if (($srch->{'srchby'} eq 'uname') && 
                           ($srch->{'srchtype'} eq 'exact')) {
                           $ccuname = $srch->{'srchterm'};
                           $ccdomain= $srch->{'srchdomain'};
                       } else {
                           my @matchedunames = keys(%{$results});
                           ($ccuname,$ccdomain) = split(/:/,$matchedunames[0]);
                       }
                       $ccuname =&LONCAPA::clean_username($ccuname);
                       $ccdomain=&LONCAPA::clean_domain($ccdomain);
                       if ($env{'form.forcenewuser'}) {
                           $response = '';
                       }
                       &print_user_modification_page($r,$ccuname,$ccdomain,
                                                     $srch,$response,$context,
                                                     $permission);
                   } elsif ($currstate eq 'query') {
                       &print_user_query_page($r,'createuser');
                   } else {
                       &print_username_entry_form($r,$context,$response,$srch,
                                                  $forcenewuser);
                   }
               } elsif ($env{'form.phase'} eq 'userpicked') {
                   my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
                   my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
                   &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
                                                 $context,$permission);
               }
           } elsif ($env{'form.phase'} eq 'update_user_data') {
               &update_user_data($r,$context);
           } else {
               &print_username_entry_form($r,$context,undef,$srch);
           }
       } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
           if ($env{'form.phase'} eq 'set_custom_roles') {
               &set_custom_role($r);
           } else {
               &custom_role_editor($r);
           }
       } elsif (($env{'form.action'} eq 'listusers') && 
                ($permission->{'view'} || $permission->{'cusr'})) {
           if ($env{'form.phase'} eq 'bulkchange') {
               &Apache::lonhtmlcommon::add_breadcrumb
                   ({href=>'/adm/createuser?action=listusers',
                     text=>"List Users"},
                   {href=>"/adm/createuser",
                     text=>"Result"});
               my $setting = $env{'form.roletype'};
               my $choice = $env{'form.bulkaction'};
               $r->print(&header());
               $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users",
                                                             'Course_View_Class_List'));
               if ($permission->{'cusr'}) {
                   &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice);
                   $r->print(&Apache::loncommon::end_page());
               } else {
                   $r->print(&mt('You are not authorized to make bulk changes to user roles'));
                   $r->print('<p><a href="/adm/createuser?action=listusers">'.&mt('Display User Lists').'</a>');
                   $r->print(&Apache::loncommon::end_page());
               }
           } else {
               &Apache::lonhtmlcommon::add_breadcrumb
                   ({href=>'/adm/createuser?action=listusers',
                     text=>"List Users"});
               my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
               my $formname = 'studentform';
               if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
                   ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = 
                       &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
                                                               $formname);
                   $jscript .= &verify_user_display();
                   my $js = &add_script($jscript).$cb_jscript;
                   my $loadcode = 
                       &Apache::lonuserutils::course_selector_loadcode($formname);
                   if ($loadcode ne '') {
                       $r->print(&header($js,{'onload' => $loadcode,}));
                   } else {
                       $r->print(&header($js));
                   }
               } else {
                   $r->print(&header(&add_script(&verify_user_display())));
               }
               $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
                                                             'Course_View_Class_List'));
               &Apache::lonuserutils::print_userlist($r,undef,$permission,$context,
                            $formname,$totcodes,$codetitles,$idlist,$idlist_titles);
               $r->print(&Apache::loncommon::end_page());
           }
       } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=drop',
                 text=>"Drop Students"});
           if (!exists($env{'form.state'})) {
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                             'Course_Drop_Student'));
   
               &Apache::lonuserutils::print_drop_menu($r,$context,$permission);
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=drop',
                 text=>"Result"});
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                             'Course_Drop_Student'));
               &Apache::lonuserutils::update_user_list($r,$context,undef,
                                                       $env{'form.action'});
           }
           $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'dateselect') {
           if ($permission->{'cusr'}) {
               $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
                         &Apache::lonuserutils::date_section_selector($context,
                                                                      $permission).
                         &Apache::loncommon::end_page());
           } else {
               $r->print(&header().
                        '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'. 
                        &Apache::loncommon::end_page());
           }
       } else {
           $r->print(&header());
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
           $r->print(&print_main_menu($permission,$context));
           $r->print(&Apache::loncommon::end_page());
       }
       return OK;
   }
   
   sub header {
       my ($jscript,$loaditems,$args) = @_;
       my $start_page;
       if (ref($loaditems) eq 'HASH') {
           $start_page=&Apache::loncommon::start_page('User Management',$jscript,{'add_entries' => $loaditems});
       } else {
           $start_page=&Apache::loncommon::start_page('User Management',$jscript,$args);
       }
       return $start_page;
   }
   
   sub add_script {
       my ($js) = @_;
       return '<script type="text/javascript">'."\n".$js."\n".'</script>';
   }
   
   sub verify_user_display {
       my $output = <<"END";
   
   function display_update() {
       document.studentform.action.value = 'listusers';
       document.studentform.phase.value = 'display';
       document.studentform.submit();
   }
   
   END
       return $output;
   
     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'})) ||  ###############################################################
  (&authorpriv($env{'user.name'},$env{'request.role.domain'})) ||  #  Menu Phase One
         (&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))) {  sub print_main_menu {
        &Apache::loncommon::content_type($r,'text/html');      my ($permission,$context) = @_;
        $r->send_http_header;      my %links = (
        &Apache::lonhtmlcommon::clear_breadcrumbs();                         domain => {
                                            upload => 'Upload a File of Users',
        my $phase = $env{'form.phase'};                                     singleuser => 'Add/Modify a Single User',
        my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');                                     listusers => 'Manage Multiple Users',
                                    },
        if (($phase eq 'get_user_info') || ($phase eq 'userpicked')) {                         author => {
            my $srch;                                     upload => 'Upload a File of Co-authors',
            foreach my $item (@search) {                                     singleuser => 'Add/Modify a Single Co-author',
                $srch->{$item} = $env{'form.'.$item};                                     listusers => 'Display Co-authors and Manage Multiple Users',
            }                                   },
            if ($env{'form.phase'} eq 'get_user_info') {                         course => {
                my ($currstate,$response,$forcenewuser,$results) =                                      upload => 'Upload a File of Course Users',
                    &user_search_result($srch);                                     singleuser => 'Add/Modify a Single Course User',
                if ($currstate eq 'select') {                                     listusers => 'Display Class Lists and Manage Multiple Users',
                    &print_user_selection_page($r,$response,$srch,$results,'createuser',\@search);                                   },
                } elsif ($currstate eq 'modify') {                       );
                    my ($ccuname,$ccdomain);      my @menu =
                    if (($srch->{'srchby'} eq 'uname') &&           (
                        ($srch->{'srchtype'} eq 'exact')) {            { text => $links{$context}{'upload'},
                        $ccuname = $srch->{'srchterm'};              help => 'Course_Create_Class_List',
                        $ccdomain= $srch->{'srchdomain'};              action => 'upload',
                    } else {              permission => $permission->{'cusr'},
                        my @matchedunames = keys(%{$results});              },
                        ($ccuname,$ccdomain) = split(/:/,$matchedunames[0]);            { text => $links{$context}{'singleuser'}, 
                    }              help => 'Course_Change_Privileges',
                    $ccuname =&LONCAPA::clean_username($ccuname);              action => 'singleuser',
                    $ccdomain=&LONCAPA::clean_domain($ccdomain);              permission => $permission->{'cusr'},
                    &print_user_modification_page($r,$ccuname,$ccdomain,$srch,              },
                                                  $response);            { text => $links{$context}{'listusers'},
                } elsif ($currstate eq 'query') {              help => 'Course_View_Class_List',
                    &print_user_query_page($r,'createuser');              action => 'listusers',
                } else {              permission => ($permission->{'view'} || $permission->{'cusr'}),
                    &print_username_entry_form($r,$response,$srch,$forcenewuser);            },
                }          );
            } elsif ($env{'form.phase'} eq 'userpicked') {      if ($context eq 'domain' || $context eq 'course') {
                my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});          my $customlink =  { text => 'Edit Custom Roles',
                my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});                              help => 'Course_Editing_Custom_Roles',
                &print_user_modification_page($r,$ccuname,$ccdomain,$srch);                              action => 'custom',
            }                              permission => $permission->{'custom'},
        } elsif ($env{'form.phase'} eq 'update_user_data') {                            };
            &update_user_data($r);          push(@menu,$customlink);
        } elsif ($env{'form.phase'} eq 'selected_custom_edit') {      }
            &custom_role_editor($r);      if ($context eq 'course') {
        } elsif ($env{'form.phase'} eq 'set_custom_roles') {          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
    &set_custom_role($r);          my @courselinks =
        } else {              (
            &print_username_entry_form($r);                { text => 'Enroll a Single Student',
        }                   help => 'Course_Add_Student',
    } else {                   action => 'singlestudent',
       $env{'user.error.msg'}=                   permission => $permission->{'cusr'},
         "/adm/createuser:mau:0:0:Cannot modify user data";                   },
       return HTTP_NOT_ACCEPTABLE;                 { text => 'Drop Students',
    }                  help => 'Course_Drop_Student',
    return OK;                  action => 'drop',
                   permission => $permission->{'cusr'},
                 });
           if (!exists($permission->{'cusr_section'})) {
               push(@courselinks,
                  { text => 'Automated Student Enrollment Manager',
                    permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                   && $permission->{'cusr'}),
                    url  => '/adm/populate',
                    });
           }
           push(@courselinks,
                  { text => 'Manage Course Groups',
                    help => 'Course_Manage_Group',
                    permission => $permission->{'grp_manage'},
                    url => '/adm/coursegroups?refpage=cusr',
                  });
           push(@menu,@courselinks);
       }
       my $menu_html = '';
       foreach my $menu_item (@menu) {
           next if (! $menu_item->{'permission'});
           $menu_html.='<p>';
           $menu_html.='<font size="+1">';
           if (exists($menu_item->{'url'})) {
               $menu_html.=qq{<a href="$menu_item->{'url'}">};
           } else {
               $menu_html.=
                   qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};
           }
           $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
           if (exists($menu_item->{'help'})) {
               $menu_html.=
                   &Apache::loncommon::help_open_topic($menu_item->{'help'});
           }
           $menu_html.='</p>';
       }
       return $menu_html;
   }
   
   sub restore_prev_selections {
       my %saveable_parameters = ('srchby'   => 'scalar',
          'srchin'   => 'scalar',
          'srchtype' => 'scalar',
          );
       &Apache::loncommon::store_settings('user','user_picker',
          \%saveable_parameters);
       &Apache::loncommon::restore_settings('user','user_picker',
    \%saveable_parameters);
 }  }
   
 #-------------------------------------------------- functions for &phase_two  #-------------------------------------------------- functions for &phase_two
 sub user_search_result {  sub user_search_result {
     my ($srch) = @_;      my ($context,$srch) = @_;
     my %allhomes;      my %allhomes;
     my %inst_matches;      my %inst_matches;
     my %srch_results;      my %srch_results;
     my ($response,$currstate,$forcenewuser);      my ($response,$currstate,$forcenewuser,$dirsrchres);
     $srch->{'srchterm'} =~ s/^\s+//;      $srch->{'srchterm'} =~ s/\s+/ /g;
     $srch->{'srchterm'} =~ s/\s+$//;  
   
     if ($srch->{'srchby'} !~ /^(uname|lastname|lastfirst)$/) {      if ($srch->{'srchby'} !~ /^(uname|lastname|lastfirst)$/) {
         $response = &mt('Invalid search.');          $response = &mt('Invalid search.');
     }      }
Line 2227  sub user_search_result { Line 3092  sub user_search_result {
     if ($srch->{'srchterm'} eq '') {      if ($srch->{'srchterm'} eq '') {
         $response = &mt('You must enter a search term.');          $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->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'instd')) {
         if (($srch->{'srchdomain'} eq '') ||           if (($srch->{'srchdomain'} eq '') || 
     ! (&Apache::lonnet::domain($srch->{'srchdomain'}))) {      ! (&Apache::lonnet::domain($srch->{'srchdomain'}))) {
Line 2241  sub user_search_result { Line 3109  sub user_search_result {
             }              }
         }          }
     }      }
       if ($response ne '') {
           $response = '<span class="LC_warning">'.$response.'</span>';
       }
     if ($srch->{'srchin'} eq 'instd') {      if ($srch->{'srchin'} eq 'instd') {
         my $instd_chk = &directorysrch_check($srch);          my $instd_chk = &directorysrch_check($srch);
         if ($instd_chk ne 'ok') {          if ($instd_chk ne 'ok') {
             $response = $instd_chk;              $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 '') {      if ($response ne '') {
         return ($currstate,'<span class="LC_warning">'.$response.'</span>');          return ($currstate,$response);
     }      }
     if ($srch->{'srchby'} eq 'uname') {      if ($srch->{'srchby'} eq 'uname') {
         if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs')) {          if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs')) {
Line 2257  sub user_search_result { Line 3129  sub user_search_result {
                     my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});                      my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});
                     if ($uhome eq 'no_host') {                      if ($uhome eq 'no_host') {
                         my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description');                          my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description');
                         $response = &mt('New users can only be created in the domain to which you current role belongs - [_1].',$env{'request.role.domain'}.' ('.$domdesc.')');                          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 {                      } else {
                         $currstate = 'modify';                          $currstate = 'modify';
                     }                      }
Line 2270  sub user_search_result { Line 3143  sub user_search_result {
                         my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});                          my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});
                         if ($uhome eq 'no_host') {                          if ($uhome eq 'no_host') {
                             ($currstate,$response,$forcenewuser) =                              ($currstate,$response,$forcenewuser) =
                                 &build_search_response($srch,%srch_results);                                  &build_search_response($context,$srch,%srch_results);
                         } else {                          } else {
                             $currstate = 'modify';                              $currstate = 'modify';
                         }                          }
                     } else {                      } else {
                         %srch_results = &Apache::lonnet::usersearch($srch);                          %srch_results = &Apache::lonnet::usersearch($srch);
                         ($currstate,$response,$forcenewuser) =                          ($currstate,$response,$forcenewuser) =
                             &build_search_response($srch,%srch_results);                              &build_search_response($context,$srch,%srch_results);
                     }                      }
                 } else {                  } else {
                     my $courseusers = &get_courseusers();                      my $courseusers = &get_courseusers();
Line 2286  sub user_search_result { Line 3159  sub user_search_result {
                             $currstate = 'modify';                              $currstate = 'modify';
                         } else {                          } else {
                             ($currstate,$response,$forcenewuser) =                              ($currstate,$response,$forcenewuser) =
                                 &build_search_response($srch,%srch_results);                                  &build_search_response($context,$srch,%srch_results);
                         }                          }
                     } else {                      } else {
                         foreach my $user (keys(%$courseusers)) {                          foreach my $user (keys(%$courseusers)) {
Line 2307  sub user_search_result { Line 3180  sub user_search_result {
  {&Apache::lonnet::get('environment',   {&Apache::lonnet::get('environment',
      ['firstname',       ['firstname',
       'lastname',        'lastname',
       'permanentemail'])};        'permanentemail'],
         $cudomain,$cuname)};
                                 }                                  }
                             }                              }
                         }                          }
                         ($currstate,$response,$forcenewuser) =                          ($currstate,$response,$forcenewuser) =
                             &build_search_response($srch,%srch_results);                              &build_search_response($context,$srch,%srch_results);
                     }                      }
                 }                  }
             }              }
         } elsif ($srch->{'srchin'} eq 'alc') {          } elsif ($srch->{'srchin'} eq 'alc') {
             $currstate = 'query';              $currstate = 'query';
         } elsif ($srch->{'srchin'} eq 'instd') {          } elsif ($srch->{'srchin'} eq 'instd') {
             %srch_results = &Apache::lonnet::inst_directory_query($srch);              ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch);
             ($currstate,$response,$forcenewuser) =               if ($dirsrchres eq 'ok') {
                 &build_search_response($srch,%srch_results);                   ($currstate,$response,$forcenewuser) = 
                       &build_search_response($context,$srch,%srch_results);
               } else {
                   my $showdom = &display_domain_info($srch->{'srchdomain'});
                   $response = '<span class="LC_warning">'.
                       &mt('Institutional directory search is not available in domain: [_1]',$showdom).
                       '</span><br />'.
                       &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').
                       '<br /><br />'; 
               }
         }          }
     } else {      } else {
         if ($srch->{'srchin'} eq 'dom') {          if ($srch->{'srchin'} eq 'dom') {
             %srch_results = &Apache::lonnet::usersearch($srch);              %srch_results = &Apache::lonnet::usersearch($srch);
             ($currstate,$response,$forcenewuser) =               ($currstate,$response,$forcenewuser) = 
                 &build_search_response($srch,%srch_results);                   &build_search_response($context,$srch,%srch_results); 
         } elsif ($srch->{'srchin'} eq 'crs') {          } elsif ($srch->{'srchin'} eq 'crs') {
             my $courseusers = &get_courseusers();               my $courseusers = &get_courseusers(); 
             foreach my $user (keys(%$courseusers)) {              foreach my $user (keys(%$courseusers)) {
Line 2379  sub user_search_result { Line 3262  sub user_search_result {
                 }                  }
             }              }
             ($currstate,$response,$forcenewuser) =               ($currstate,$response,$forcenewuser) = 
                 &build_search_response($srch,%srch_results);                   &build_search_response($context,$srch,%srch_results); 
         } elsif ($srch->{'srchin'} eq 'alc') {          } elsif ($srch->{'srchin'} eq 'alc') {
             $currstate = 'query';              $currstate = 'query';
         } elsif ($srch->{'srchin'} eq 'instd') {          } elsif ($srch->{'srchin'} eq 'instd') {
             %srch_results = &Apache::lonnet::inst_directory_query($srch);               ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch); 
             ($currstate,$response,$forcenewuser) =               if ($dirsrchres eq 'ok') {
                 &build_search_response($srch,%srch_results);                  ($currstate,$response,$forcenewuser) = 
                       &build_search_response($context,$srch,%srch_results);
               } else {
                   my $showdom = &display_domain_info($srch->{'srchdomain'});                $response = '<span class="LC_warning">'.
                       &mt('Institutional directory search is not available in domain: [_1]',$showdom).
                       '</span><br />'.
                       &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').
                       '<br /><br />';
               }
         }          }
     }      }
     return ($currstate,$response,$forcenewuser,\%srch_results);      return ($currstate,$response,$forcenewuser,\%srch_results);
Line 2397  sub directorysrch_check { Line 3288  sub directorysrch_check {
     my $response;      my $response;
     my %dom_inst_srch = &Apache::lonnet::get_dom('configuration',      my %dom_inst_srch = &Apache::lonnet::get_dom('configuration',
                                              ['directorysrch'],$srch->{'srchdomain'});                                               ['directorysrch'],$srch->{'srchdomain'});
       my $showdom = &display_domain_info($srch->{'srchdomain'});
     if (ref($dom_inst_srch{'directorysrch'}) eq 'HASH') {      if (ref($dom_inst_srch{'directorysrch'}) eq 'HASH') {
         if (!$dom_inst_srch{'directorysrch'}{'available'}) {          if (!$dom_inst_srch{'directorysrch'}{'available'}) {
             return &mt('Institutional directory search unavailable in domain: [_1]',$srch->{'srchdomain'});               return &mt('Institutional directory search is not available in domain: [_1]',$showdom); 
         }          }
         if ($dom_inst_srch{'directorysrch'}{'localonly'}) {          if ($dom_inst_srch{'directorysrch'}{'localonly'}) {
             if ($env{'request.role.domain'} ne $srch->{'srchdomain'}) {              if ($env{'request.role.domain'} ne $srch->{'srchdomain'}) {
                 return &mt('Insitutional directory search in domain: [_1] is only allowed for users with a current role in the domain.',$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'});              my @usertypes = split(/:/,$env{'environment.inststatus'});
             if (!@usertypes) {              if (!@usertypes) {
Line 2424  sub directorysrch_check { Line 3316  sub directorysrch_check {
                     push (@longtypes,$insttypes->{$item});                      push (@longtypes,$insttypes->{$item});
                 }                  }
                 my $insttype_str = join(', ',@longtypes);                   my $insttype_str = join(', ',@longtypes); 
                 return &mt('Directory search in domain: [_1] is unavailable to your user type: ',$srch->{'srchdomain'}).$insttype_str;                  return &mt('Institutional directory search in domain: [_1] is not available to your user type: ',$showdom).$insttype_str;
             }               } 
         } else {          } else {
             $can_search = 1;              $can_search = 1;
         }          }
     } else {      } else {
         return &mt('Directory search has not been configured for domain: [_1]',$srch->{'srchdomain'});          return &mt('Institutional directory search has not been configured for domain: [_1]',$showdom);
     }      }
     my %longtext = &Apache::lonlocal::texthash (      my %longtext = &Apache::lonlocal::texthash (
                        uname     => 'username',                         uname     => 'username',
Line 2443  sub directorysrch_check { Line 3335  sub directorysrch_check {
     if ($can_search) {      if ($can_search) {
         if (ref($dom_inst_srch{'directorysrch'}{'searchby'}) eq 'ARRAY') {          if (ref($dom_inst_srch{'directorysrch'}{'searchby'}) eq 'ARRAY') {
             if (!grep(/^\Q$srch->{'srchby'}\E$/,@{$dom_inst_srch{'directorysrch'}{'searchby'}})) {              if (!grep(/^\Q$srch->{'srchby'}\E$/,@{$dom_inst_srch{'directorysrch'}{'searchby'}})) {
                 return &mt('Directory search in domain: [_1] is not available for searching by "[_2]"',$srch->{'srchdomain'},$longtext{$srch->{'srchby'}});                  return &mt('Institutional directory search in domain: [_1] is not available for searching by "[_2]"',$showdom,$longtext{$srch->{'srchby'}});
             }              }
         } else {          } else {
             return &mt('Directory search in domain: [_1] is not available.', $srch->{'srchdomain'});              return &mt('Institutional directory search in domain: [_1] is not available.', $showdom);
         }          }
     }      }
     if ($can_search) {      if ($can_search) {
Line 2454  sub directorysrch_check { Line 3346  sub directorysrch_check {
             if (grep(/^\Q$srch->{'srchtype'}\E/,@{$dom_inst_srch{'directorysrch'}{'searchtypes'}})) {              if (grep(/^\Q$srch->{'srchtype'}\E/,@{$dom_inst_srch{'directorysrch'}{'searchtypes'}})) {
                 return 'ok';                  return 'ok';
             } else {              } else {
                 return &mt('Directory search in domain [_1] is not available for the requested search type: "[_2]"',$srch->{'srchdomain'},$longtext{$srch->{'srchtype'}});                  return &mt('Institutional directory search in domain [_1] is not available for the requested search type: "[_2]"',$showdom,$longtext{$srch->{'srchtype'}});
             }              }
         } else {          } else {
             if ((($dom_inst_srch{'directorysrch'}{'searchtypes'} eq 'specify') &&              if ((($dom_inst_srch{'directorysrch'}{'searchtypes'} eq 'specify') &&
Line 2462  sub directorysrch_check { Line 3354  sub directorysrch_check {
                 ($dom_inst_srch{'directorysrch'}{'searchtypes'} eq $srch->{'srchtype'})) {                  ($dom_inst_srch{'directorysrch'}{'searchtypes'} eq $srch->{'srchtype'})) {
                 return 'ok';                  return 'ok';
             } else {              } else {
                 return &mt('Directory search in domain [_1] is not available for the requested search type: "[_2]"',$srch->{'srchdomain'},$longtext{$srch->{'srchtype'}});                  return &mt('Institutional directory search in domain [_1] is not available for the requested search type: "[_2]"',$showdom,$longtext{$srch->{'srchtype'}});
             }              }
         }          }
     }      }
 }  }
   
   
 sub get_courseusers {  sub get_courseusers {
     my %advhash;      my %advhash;
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
Line 2484  sub get_courseusers { Line 3375  sub get_courseusers {
 }  }
   
 sub build_search_response {  sub build_search_response {
     my ($srch,%srch_results) = @_;      my ($context,$srch,%srch_results) = @_;
     my ($currstate,$response,$forcenewuser);      my ($currstate,$response,$forcenewuser);
     my %names = (      my %names = (
           'uname' => 'username',            'uname' => 'username',
           'lastname' => 'last name',            'lastname' => 'last name',
           'lastfirst' => 'last name, first name',            'lastfirst' => 'last name, first name',
           'crs' => 'this course',            'crs' => 'this course',
           'dom' => 'this domain',            'dom' => 'LON-CAPA domain: ',
           'instd' => "your institution's directory",            'instd' => 'the institutional directory for domain: ',
     );      );
   
     my %single = (      my %single = (
                      begins   => 'A match',
                    contains => 'A match',                     contains => 'A match',
                    exact => 'An exact match',                     exact    => 'An exact match',
                  );                   );
     my %nomatch = (      my %nomatch = (
                      begins   => 'No match',
                    contains => 'No match',                     contains => 'No match',
                    exact => 'No exact match',                     exact    => 'No exact match',
                   );                    );
     if (keys(%srch_results) > 1) {      if (keys(%srch_results) > 1) {
         $currstate = 'select';          $currstate = 'select';
     } else {      } else {
         if (keys(%srch_results) == 1) {          if (keys(%srch_results) == 1) {
             $currstate = 'modify';              $currstate = 'modify';
             $response = &mt("$single{$srch->{'srchtype'}} was found for this $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'});              $response = &mt("$single{$srch->{'srchtype'}} was found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'});
               if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') {
                   $response .= &display_domain_info($srch->{'srchdomain'});
               }
         } else {          } else {
             $response = '<span class="LC_warning">'.&mt("$nomatch{$srch->{'srchtype'}} found for this $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'}).'</span>';              $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') {              if ($srch->{'srchin'} ne 'alc') {
                 $forcenewuser = 1;                  $forcenewuser = 1;
                 my $cansrchinst = 0;                   my $cansrchinst = 0; 
Line 2522  sub build_search_response { Line 3422  sub build_search_response {
                         }                           } 
                     }                      }
                 }                  }
                 if (($srch->{'srchby'} eq 'lastfirst') ||                   if ((($srch->{'srchby'} eq 'lastfirst') || 
                     ($srch->{'srchby'} eq 'lastname')) {                       ($srch->{'srchby'} eq 'lastname')) &&
                     if ($srch->{'srchin'} eq 'crs') {                      ($srch->{'srchin'} eq 'dom')) {
                         $response .= '<br />'.&mt('You may want to broaden your search to the whole domain.');                       if ($cansrchinst) {
                     } elsif ($srch->{'srchin'} eq 'dom') {                          $response .= '<br />'.&mt('You may want to broaden your search to a search of the institutional directory for the domain.');
                         if ($cansrchinst) {                      }
                             $response .= '<br />'.&mt('You may want to broaden your search to a search of the institutional directory for this domain.');                  }
                         }                  if ($srch->{'srchin'} eq 'crs') {
                     }                      $response .= '<br />'.&mt('You may want to broaden your search to the selected LON-CAPA domain.');
                   }
               }
               if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $env{'request.role.domain'})) {
                   my $cancreate =
                       &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);
                   if ($cancreate) {
                       my $showdom = &display_domain_info($env{'request.role.domain'}); 
                   $response .= '<br /><br />'.&mt("<b>To add a new user</b> (you can only create new users in your current role's domain - <span class=\"LC_cusr_emph\">[_1]</span>):",$env{'request.role.domain'}).'<ul><li>'.&mt("Set 'Domain/institution to search' to: <span class=\"LC_cusr_emph\">[_1]</span>",$showdom).'<li>'.&mt("Set 'Search criteria' to: <span class=\"LC_cusr_emph\">'username is ...... in selected LON-CAPA domain'").'</span></li><li>'.&mt('Provide the proposed username').'</li><li>'.&mt('Search').'</li></ul><br />';
                   } else {
                       my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                       $response .= '<br /><br />'.&mt("You are not authorized to create new users in your current role's domain - <span class=\"LC_cusr_emph\">[_1]</span>.",$env{'request.role.domain'}).'<br />'.&mt('Contact the <a[_1]>helpdesk</a> if you need to create a new user.',$helplink).'<br /><br />';
                 }                  }
             }              }
         }          }
Line 2538  sub build_search_response { Line 3449  sub build_search_response {
     return ($currstate,$response,$forcenewuser);      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 {  sub crumb_utilities {
     my %elements = (      my %elements = (
        crtuser => {         crtuser => {
Line 2547  sub crumb_utilities { Line 3470  sub crumb_utilities {
            srchtype => 'selectbox',             srchtype => 'selectbox',
            srchdomain => 'selectbox',             srchdomain => 'selectbox',
        },         },
          crtusername => {
              srchterm => 'text',
              srchdomain => 'selectbox',
          },
        docustom => {         docustom => {
            rolename => 'selectbox',             rolename => 'selectbox',
            newrolename => 'textbox',             newrolename => 'textbox',
Line 2562  sub crumb_utilities { Line 3489  sub crumb_utilities {
   
     my $jsback .= qq|      my $jsback .= qq|
 function backPage(formname,prevphase,prevstate) {  function backPage(formname,prevphase,prevstate) {
     formname.phase.value = prevphase;      if (typeof prevphase == 'undefined') {
     formname.currstate.value = prevstate;          formname.phase.value = '';
       }
       else {  
           formname.phase.value = prevphase;
       }
       if (typeof prevstate == 'undefined') {
           formname.currstate.value = '';
       }
       else {
           formname.currstate.value = prevstate;
       }
     formname.submit();      formname.submit();
 }  }
 |;  |;
Line 2575  sub course_level_table { Line 3512  sub course_level_table {
     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 2605  sub course_level_table { Line 3542  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
  foreach my $role ('st','ta','ep','in','cc') {          my @roles = &Apache::lonuserutils::roles_by_context('course');
    foreach my $role (@roles) {
               my $plrole=&Apache::lonnet::plaintext($role);
     if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {      if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
  my $plrole=&Apache::lonnet::plaintext($role);                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
  $table .= &Apache::loncommon::start_data_table_row().                                              $plrole,\%sections_count,\%lt);    
 '<td><input type="checkbox" name="act_'.$protectedcourse.'_'.$role.'" /></td>              } elsif ($env{'request.course.sec'} ne '') {
 <td>'.$plrole.'</td>                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
 <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";                                               $env{'request.course.sec'})) {
         if ($role ne 'cc') {                      $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                     if (%sections_count) {                                                  $plrole,\%sections_count,\%lt);
                         my $currsec = &course_sections(\%sections_count,$protectedcourse.'_'.$role);  
                         $table .=   
                     '<td><table class="LC_createuser">'.  
                      '<tr class="LC_section_row">  
                         <td valign="top">'.$lt{'exs'}.'<br />'.  
                         $currsec.'</td>'.  
                      '<td>&nbsp;&nbsp;</td>'.  
                      '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.  
                      '<input type="text" name="newsec_'.$protectedcourse.'_'.$role.'" value="" />'.  
                      '<input type="hidden" '.  
                      'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'.  
                      '</tr></table></td>';  
                     } else {  
                         $table .= '<td><input type="text" size="10" '.  
                      'name="sec_'.$protectedcourse.'_'.$role.'" /></td>';  
                     }  
                 } else {   
     $table .= '<td>&nbsp</td>';  
                 }                  }
  $table .= <<ENDTIMEENTRY;  
 <td><input type="hidden" name="start_$protectedcourse\_$role" value='' />  
 <a href=  
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$role.value,'start_$protectedcourse\_$role','cu.pres','dateset')">$lt{'ssd'}</a></td>  
 <td><input type="hidden" name="end_$protectedcourse\_$role" value='' />  
 <a href=  
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$role.value,'end_$protectedcourse\_$role','cu.pres','dateset')">$lt{'sed'}</a></td>  
 ENDTIMEENTRY  
                 $table.= &Apache::loncommon::end_data_table_row();  
             }              }
         }          }
         foreach my $cust (sort keys %customroles) {          if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
     if (&Apache::lonnet::allowed('ccr',$thiscourse)) {              foreach my $cust (sort keys %customroles) {
  my $plrole=$cust;                  my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;
                 my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}.                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
     '_'.$env{'user.name'}.'_'.$plrole;                                              $cust,\%sections_count,\%lt);
  $table .= &Apache::loncommon::start_data_table_row().              }
 '<td><input type="checkbox" name="act_'.$customrole.'" /></td>  
 <td>'.$plrole.'</td>  
 <td>'.$area.'</td>'."\n";  
                 if (%sections_count) {  
                     my $currsec = &course_sections(\%sections_count,$customrole);  
                     $table.=  
                    '<td><table border="0" cellspacing="0" cellpadding="0">'.  
                    '<tr><td valign="top">'.$lt{'exs'}.'<br />'.  
                      $currsec.'</td>'.  
                    '<td>&nbsp;&nbsp;</td>'.  
                    '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.  
                    '<input type="text" name="newsec_'.$customrole.'" value="" /></td>'.  
                    '<input type="hidden" '.  
                    'name="sec_'.$customrole.'" /></td>'.  
                    '</tr></table></td>';  
                 } else {  
                     $table .= '<td><input type="text" size="10" '.  
                      'name="sec_'.$customrole.'" /></td>';  
                 }  
                 $table .= <<ENDENTRY;  
 <td><input type="hidden" name="start_$customrole" value='' />  
 <a href=  
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">$lt{'ssd'}</a></td>  
 <td><input type="hidden" name="end_$customrole" value='' />  
 <a href=  
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$customrole.value,'end_$customrole','cu.pres','dateset')">$lt{'sed'}</a></td>  
 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 = '      my $result;
 <h4>'.$lt{'crl'}.'</h4>'.      if (!$env{'request.course.id'}) {
           $result = '<h4>'.$lt{'crl'}.'</h4>'."\n";
       }
       $result .= 
 &Apache::loncommon::start_data_table().  &Apache::loncommon::start_data_table().
 &Apache::loncommon::start_data_table_header_row().  &Apache::loncommon::start_data_table_header_row().
 '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.'</th>  '<th>'.$lt{'act'}.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.'</th>
Line 2695  $table. Line 3581  $table.
     return $result;      return $result;
 }  }
   
 sub course_sections {  sub course_level_row {
     my ($sections_count,$role) = @_;      my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_;
     my $output = '';      my $row = &Apache::loncommon::start_data_table_row().
     my @sections = (sort {$a <=> $b} keys %{$sections_count});                ' <td><input type="checkbox" name="act_'.
     if (scalar(@sections) == 1) {                $protectedcourse.'_'.$role.'" /></td>'."\n".
         $output = '<select name="currsec_'.$role.'" >'."\n".                ' <td>'.$plrole.'</td>'."\n".
                   '  <option value="">Select</option>'."\n".                ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
                   '  <option value="">No section</option>'."\n".      if ($role eq 'cc') {
                   '  <option value="'.$sections[0].'" >'.$sections[0].'</option>'."\n";          $row .= '<td>&nbsp;</td>';
     } else {      } elsif ($env{'request.course.sec'} ne '') {
         $output = '<select name="currsec_'.$role.'" ';          $row .= ' <td><input type="hidden" value="'.
         my $multiple = 4;                  $env{'request.course.sec'}.'" '.
         if (scalar(@sections) < 4) { $multiple = scalar(@sections); }                  'name="sec_'.$protectedcourse.'_'.$role.'" />'.
         $output .= 'multiple="multiple" size="'.$multiple.'">'."\n";                  $env{'request.course.sec'}.'</td>';
         foreach my $sec (@sections) {      } else {
             $output .= '<option value="'.$sec.'">'.$sec."</option>\n";          if (ref($sections_count) eq 'HASH') {
               my $currsec = 
                   &Apache::lonuserutils::course_sections($sections_count,
                                                          $protectedcourse.'_'.$role);
               $row .= '<td><table class="LC_createuser">'."\n".
                       '<tr class="LC_section_row">'."\n".
                       ' <td valign="top">'.$lt->{'exs'}.'<br />'.
                          $currsec.'</td>'."\n".
                        ' <td>&nbsp;&nbsp;</td>'."\n".
                        ' <td valign="top">&nbsp;'.$lt->{'new'}.'<br />'.
                        '<input type="text" name="newsec_'.$protectedcourse.'_'.$role.
                        '" value="" />'.
                        '<input type="hidden" '.
                        'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'."\n".
                        '</tr></table></td>'."\n";
           } else {
               $row .= '<td><input type="text" size="10" '.
                         'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'."\n";
         }          }
     }      }
     $output .= '</select>';       $row .= <<ENDTIMEENTRY;
     return $output;  <td><input type="hidden" name="start_$protectedcourse\_$role" value="" />
   <a href=
   "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$role.value,'start_$protectedcourse\_$role','cu.pres','dateset')">$lt->{'ssd'}</a></td>
   <td><input type="hidden" name="end_$protectedcourse\_$role" value="" />
   <a href=
   "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$role.value,'end_$protectedcourse\_$role','cu.pres','dateset')">$lt->{'sed'}</a></td>
   ENDTIMEENTRY
       $row .= &Apache::loncommon::end_data_table_row();
       return $row;
 }  }
   
 sub course_level_dc {  sub course_level_dc {
     my ($dcdom) = @_;      my ($dcdom) = @_;
     my %customroles=&my_custom_roles();      my %customroles=&Apache::lonuserutils::my_custom_roles();
       my @roles = &Apache::lonuserutils::roles_by_context('course');
     my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.      my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.                        '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="dccourse" value="" />';                        '<input type="hidden" name="dccourse" value="" />';
Line 2744  sub course_level_dc { Line 3656  sub course_level_dc {
     my $otheritems = &Apache::loncommon::start_data_table_row()."\n".      my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                      '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".                       '<td><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  my $role ('st','ta','ep','in','cc') {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$role.'">'.$plrole;          $otheritems .= '  <option value="'.$role.'">'.$plrole;
     }      }
Line 2762  sub course_level_dc { Line 3674  sub course_level_dc {
                      '<td>&nbsp;&nbsp;</td>'.                       '<td>&nbsp;&nbsp;</td>'.
                      '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.                       '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                      '<input type="text" name="newsec" value="" />'.                       '<input type="text" name="newsec" value="" />'.
                        '<input type="hidden" name="sections" value="" />'.
                      '<input type="hidden" name="groups" value="" /></td>'.                       '<input type="hidden" name="groups" value="" /></td>'.
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;

Removed from v.1.179  
changed lines
  Added in v.1.224


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