Diff for /loncom/interface/lonuserutils.pm between versions 1.11 and 1.157

version 1.11, 2007/12/05 21:23:14 version 1.157, 2013/12/06 12:11:09
Line 42  use LONCAPA qw(:DEFAULT :match); Line 42  use LONCAPA qw(:DEFAULT :match);
 ###############################################################  ###############################################################
 # Drop student from all sections of a course, except optional $csec  # Drop student from all sections of a course, except optional $csec
 sub modifystudent {  sub modifystudent {
     my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;      my ($udom,$unam,$courseid,$csec,$desiredhost,$context)=@_;
     # if $csec is undefined, drop the student from all the courses matching      # if $csec is undefined, drop the student from all the courses matching
     # this one.  If $csec is defined, drop them from all other sections of      # this one.  If $csec is defined, drop them from all other sections of
     # this course and add them to section $csec      # this course and add them to section $csec
     my $cdom = $env{'course.'.$courseid.'.domain'};      my ($cnum,$cdom) = &get_course_identity($courseid);
     my $cnum = $env{'course.'.$courseid.'.num'};  
     my %roles = &Apache::lonnet::dump('roles',$udom,$unam);      my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
     my ($tmp) = keys(%roles);      my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles      # Bail out if we were unable to get the students roles
Line 69  sub modifystudent { Line 68  sub modifystudent {
                     my $reply=&Apache::lonnet::modifystudent                      my $reply=&Apache::lonnet::modifystudent
                         # dom  name  id mode pass     f     m     l     g                          # dom  name  id mode pass     f     m     l     g
                         ($udom,$unam,'',  '',  '',undef,undef,undef,undef,                          ($udom,$unam,'',  '',  '',undef,undef,undef,undef,
                          $section,time,undef,undef,$desiredhost);                           $section,time,undef,undef,$desiredhost,'','manual',
                            '',$courseid,'',$context);
                     $result .= $reply.':';                      $result .= $reply.':';
                 }                  }
             }              }
         }          }
     }      }
     if ($result eq '') {      if ($result eq '') {
         $result = 'Unable to find section for this student';          $result = &mt('Unable to find section for this student');
     } else {      } else {
         $result =~ s/(ok:)+/ok/g;          $result =~ s/(ok:)+/ok/g;
     }      }
Line 86  sub modifystudent { Line 86  sub modifystudent {
 sub modifyuserrole {  sub modifyuserrole {
     my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass,      my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass,
         $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role,          $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role,
         $end,$start,$checkid) = @_;          $end,$start,$checkid,$inststatus) = @_;
     my ($scope,$userresult,$authresult,$roleresult,$idresult);      my ($scope,$userresult,$authresult,$roleresult,$idresult);
     if ($setting eq 'course' || $context eq 'course') {      if ($setting eq 'course' || $context eq 'course') {
         $scope = '/'.$cid;          $scope = '/'.$cid;
         $scope =~ s/\_/\//g;          $scope =~ s/\_/\//g;
         if ($role ne 'cc' && $sec ne '') {          if (($role ne 'cc') && ($role ne 'co') && ($sec ne '')) {
             $scope .='/'.$sec;              $scope .='/'.$sec;
         }          }
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         $scope = '/'.$env{'request.role.domain'}.'/';          $scope = '/'.$env{'request.role.domain'}.'/';
     } elsif ($context eq 'construction_space') {      } elsif ($context eq 'author') {
         $scope =  '/'.$env{'user.domain'}.'/'.$env{'user.name'};          $scope =  '/'.$env{'user.domain'}.'/'.$env{'user.name'};
     }      }
     if ($context eq 'domain') {      if ($context eq 'domain') {
Line 124  sub modifyuserrole { Line 124  sub modifyuserrole {
     $userresult =      $userresult =
         &Apache::lonnet::modifyuser($udom,$uname,$uid,$umode,$upass,$first,          &Apache::lonnet::modifyuser($udom,$uname,$uid,$umode,$upass,$first,
                                     $middle,$last,$gene,$forceid,$desiredhome,                                      $middle,$last,$gene,$forceid,$desiredhome,
                                     $email,$role,$start,$end);                                      $email,$inststatus);
     if ($userresult eq 'ok') {      if ($userresult eq 'ok') {
         if ($role ne '') {          if ($role ne '') {
               $role =~ s/_/\//g;
             $roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope,              $roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope,
                                                       $role,$end,$start);                                                        $role,$end,$start,'',
                                                         '',$context);
         }          }
     }      }
     return ($userresult,$authresult,$roleresult,$idresult);      return ($userresult,$authresult,$roleresult,$idresult);
Line 136  sub modifyuserrole { Line 138  sub modifyuserrole {
   
 sub propagate_id_change {  sub propagate_id_change {
     my ($uname,$udom,$user) = @_;      my ($uname,$udom,$user) = @_;
     my (@types,@roles,@cdoms);      my (@types,@roles);
     @types = ('active','future');      @types = ('active','future');
     @roles = ('st');      @roles = ('st');
     my $idresult;      my $idresult;
     my %roleshash = &Apache::lonnet::get_my_roles($uname,      my %roleshash = &Apache::lonnet::get_my_roles($uname,
                         $udom,'userroles',\@types,\@roles,\@cdoms);                          $udom,'userroles',\@types,\@roles);
       my %args = (
                   one_time => 1,
                  );
     foreach my $item (keys(%roleshash)) {      foreach my $item (keys(%roleshash)) {
         my ($cnum,$cdom,$role) = split(/:/,$item);          my ($cnum,$cdom,$role) = split(/:/,$item,-1);
         my ($start,$end) = split(/:/,$roleshash{$item});          my ($start,$end) = split(/:/,$roleshash{$item});
         if (&Apache::lonnet::is_course($cdom,$cnum)) {          if (&Apache::lonnet::is_course($cdom,$cnum)) {
             my %userupdate;              my $result = &update_classlist($cdom,$cnum,$udom,$uname,$user);
             my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%userupdate);              my %coursehash = 
                   &Apache::lonnet::coursedescription($cdom.'_'.$cnum,\%args);
               my $cdesc = $coursehash{'description'};
               if ($cdesc eq '') { 
                   $cdesc = $cdom.'_'.$cnum;
               }
             if ($result eq 'ok') {              if ($result eq 'ok') {
                 $idresult .= "Classlist change: $uname:$udom - class -> $cnum:$cdom\n";                  $idresult .= &mt('Classlist update for "[_1]" in "[_2]".',$uname.':'.$udom,$cdesc).'<br />'."\n";
             } else {              } else {
                 $idresult .= "Error - $result -during classlist update for $uname:$udom in $cnum:$cdom\n";                  $idresult .= &mt('Error: "[_1]" during classlist update for "[_2]" in "[_3]".',$result,$uname.':'.$udom,$cdesc).'<br />'."\n";
             }              }
         }          }
     }      }
Line 159  sub propagate_id_change { Line 169  sub propagate_id_change {
 }  }
   
 sub update_classlist {  sub update_classlist {
     my ($cdom,$cnum,$udom,$uname,$user) = @_;      my ($cdom,$cnum,$udom,$uname,$user,$newend) = @_;
     my ($uid,$classlistentry);      my ($uid,$classlistentry);
     my $fullname =      my $fullname =
         &Apache::lonnet::format_name($user->{'firstname'},$user->{'middlename'},          &Apache::lonnet::format_name($user->{'firstname'},$user->{'middlename'},
Line 170  sub update_classlist { Line 180  sub update_classlist {
     my @classinfo = split(/:/,$classhash{$uname.':'.$udom});      my @classinfo = split(/:/,$classhash{$uname.':'.$udom});
     my $ididx=&Apache::loncoursedata::CL_ID() - 2;      my $ididx=&Apache::loncoursedata::CL_ID() - 2;
     my $nameidx=&Apache::loncoursedata::CL_FULLNAME() - 2;      my $nameidx=&Apache::loncoursedata::CL_FULLNAME() - 2;
       my $endidx = &Apache::loncoursedata::CL_END() - 2;
       my $startidx = &Apache::loncoursedata::CL_START() - 2;
     for (my $i=0; $i<@classinfo; $i++) {      for (my $i=0; $i<@classinfo; $i++) {
         if ($i == $ididx) {          if ($i == $endidx) {
               if ($newend ne '') {
                   $classlistentry .= $newend.':';
               } else {
                   $classlistentry .= $classinfo[$i].':';
               }
           } elsif ($i == $startidx) {
               if ($newend ne '') {
                   if ($classinfo[$i] > $newend) {
                       $classlistentry .= $newend.':';
                   } else {
                       $classlistentry .= $classinfo[$i].':';
                   }
               } else {
                   $classlistentry .= $classinfo[$i].':';
               }
           } elsif ($i == $ididx) {
             if (defined($user->{'id'})) {              if (defined($user->{'id'})) {
                 $classlistentry .= $user->{'id'}.':';                  $classlistentry .= $user->{'id'}.':';
             } else {              } else {
                 $classlistentry .= $classinfo[$i].':';                  $classlistentry .= $classinfo[$i].':';
             }              }
         } elsif ($i == $nameidx) {          } elsif ($i == $nameidx) {
             $classlistentry .= $fullname.':';              if (defined($user->{'lastname'})) {
                   $classlistentry .= $fullname.':';
               } else {
                   $classlistentry .= $classinfo[$i].':';
               }
         } else {          } else {
             $classlistentry .= $classinfo[$i].':';              $classlistentry .= $classinfo[$i].':';
         }          }
Line 203  sub domain_roles_select { Line 235  sub domain_roles_select {
     # domain context         # domain context   
     #      #
     # Role types      # Role types
     my @roletypes = ('domain','construction_space','course');      my @roletypes = ('domain','author','course','community');
     my %lt = &role_type_names();      my %lt = &role_type_names();
       my $onchangefirst = "updateCols('showrole')";
       my $onchangesecond = "updateCols('showrole')";
     #      #
     # build up the menu information to be passed to      # build up the menu information to be passed to
     # &Apache::loncommon::linked_select_forms      # &Apache::loncommon::linked_select_forms
Line 215  sub domain_roles_select { Line 249  sub domain_roles_select {
     foreach my $roletype (@roletypes) {      foreach my $roletype (@roletypes) {
         # set up the text for this domain          # set up the text for this domain
         $select_menus{$roletype}->{'text'}= $lt{$roletype};          $select_menus{$roletype}->{'text'}= $lt{$roletype};
           my $crstype;
           if ($roletype eq 'community') {
               $crstype = 'Community';
           }
         # we want a choice of 'default' as the default in the second menu          # we want a choice of 'default' as the default in the second menu
         if ($env{'form.roletype'} ne '') {          if ($env{'form.roletype'} ne '') {
             $select_menus{$roletype}->{'default'} = $env{'form.showrole'};              $select_menus{$roletype}->{'default'} = $env{'form.showrole'};
Line 225  sub domain_roles_select { Line 263  sub domain_roles_select {
         my @roles;          my @roles;
         if ($roletype eq 'domain') {          if ($roletype eq 'domain') {
             @roles = &domain_roles();              @roles = &domain_roles();
         } elsif ($roletype eq 'construction_space') {          } elsif ($roletype eq 'author') {
             @roles = &construction_space_roles();              @roles = &construction_space_roles();
         } else {          } else {
             @roles = &course_roles('domain');              my $custom = 1;
             unshift(@roles,'cr');              @roles = &course_roles('domain',undef,$custom,$roletype);
         }          }
         my $order = ['Any',@roles];          my $order = ['Any',@roles];
         $select_menus{$roletype}->{'order'} = $order;           $select_menus{$roletype}->{'order'} = $order; 
Line 239  sub domain_roles_select { Line 277  sub domain_roles_select {
                               &mt('Custom role');                                &mt('Custom role');
             } else {              } else {
                 $select_menus{$roletype}->{'select2'}->{$role} =                   $select_menus{$roletype}->{'select2'}->{$role} = 
                               &Apache::lonnet::plaintext($role);                                &Apache::lonnet::plaintext($role,$crstype);
             }              }
         }          }
         $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any');          $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any');
     }      }
     my $result = &Apache::loncommon::linked_select_forms      my $result = &Apache::loncommon::linked_select_forms
         ('studentform',('&nbsp;'x3).&mt('Role: '),$env{'form.roletype'},          ('studentform',('&nbsp;'x3).&mt('Role: '),$env{'form.roletype'},
          'roletype','showrole',\%select_menus,['domain','construction_space','course']);           'roletype','showrole',\%select_menus,
            ['domain','author','course','community'],$onchangefirst,
            $onchangesecond);
     return $result;      return $result;
 }  }
   
Line 258  sub hidden_input { Line 298  sub hidden_input {
 }  }
   
 sub print_upload_manager_header {  sub print_upload_manager_header {
     my ($r,$datatoken,$distotal,$krbdefdom,$context)=@_;      my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype,
           $can_assign)=@_;
     my $javascript;      my $javascript;
     #      #
     if (! exists($env{'form.upfile_associate'})) {      if (! exists($env{'form.upfile_associate'})) {
Line 272  sub print_upload_manager_header { Line 313  sub print_upload_manager_header {
         }          }
     }      }
     if ($env{'form.upfile_associate'} eq 'reverse') {      if ($env{'form.upfile_associate'} eq 'reverse') {
         $javascript=&upload_manager_javascript_reverse_associate();          $javascript=&upload_manager_javascript_reverse_associate($can_assign);
     } else {      } else {
         $javascript=&upload_manager_javascript_forward_associate();          $javascript=&upload_manager_javascript_forward_associate($can_assign);
     }      }
     #      #
     # Deal with restored settings      # Deal with restored settings
Line 288  sub print_upload_manager_header { Line 329  sub print_upload_manager_header {
         $password_choice = 'int';          $password_choice = 'int';
     }      }
     #      #
       my $groupslist;
       if ($context eq 'course') {
           $groupslist = &get_groupslist();
       }
     my $javascript_validations =      my $javascript_validations =
         &javascript_validations('auth',$krbdefdom,$password_choice,undef,          &javascript_validations('upload',$krbdefdom,$password_choice,undef,
                                 $env{'request.role.domain'});                                  $env{'request.role.domain'},$context,
     my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');                                  $groupslist,$crstype);
     $r->print(&mt('Total number of records found in file: <b>[_1]</b>.',$distotal).      my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
               "<br />\n");      $r->print(
     $r->print('<div class="LC_left_float"><h3>'.          '<h3>'.&mt('Identify fields in uploaded list')."</h3>\n".
               &mt('Identify fields in uploaded list')."</h3>\n");          '<p class="LC_info">'.
     $r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n");          &mt('Total number of records found in file: [_1]'
              ,'<b>'.$distotal.'</b>').
           "</p>\n"
       );
       if ($distotal == 0) {
           $r->print('<p class="LC_warning">'.&mt('None found').'</p>');
       }
       $r->print(
           '<p>'.
           &mt('Enter as many fields as you can.').'<br />'.
           &mt('The system will inform you and bring you back to this page,[_1]if the data selected are insufficient to add users.','<br />').
           "</p>\n"
       );
     $r->print(&hidden_input('action','upload').      $r->print(&hidden_input('action','upload').
               &hidden_input('state','got_file').                &hidden_input('state','got_file').
               &hidden_input('associate','').                &hidden_input('associate','').
Line 304  sub print_upload_manager_header { Line 361  sub print_upload_manager_header {
               &hidden_input('fileupload',$env{'form.fileupload'}).                &hidden_input('fileupload',$env{'form.fileupload'}).
               &hidden_input('upfiletype',$env{'form.upfiletype'}).                &hidden_input('upfiletype',$env{'form.upfiletype'}).
               &hidden_input('upfile_associate',$env{'form.upfile_associate'}));                &hidden_input('upfile_associate',$env{'form.upfile_associate'}));
     $r->print('<br /><input type="button" value="Reverse Association" '.      $r->print(
               'name="'.&mt('Reverse Association').'" '.          '<div class="LC_left_float">'.
               'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');          '<fieldset><legend>'.&mt('Functions').'</legend>'.
     $r->print('<label><input type="checkbox" name="noFirstLine"'.$checked.'/>'.          '<label><input type="checkbox" name="noFirstLine"'.$checked.' />'.
               &mt('Ignore First Line').'</label>');                &mt('Ignore First Line').'</label>'.
     $r->print("<br /><br />\n".          ' <input type="button" value="'.&mt('Reverse Association').'" '.
               '<script type="text/javascript" language="Javascript">'."\n".                'name="Reverse Association" '.
               $javascript."\n".$javascript_validations.'</script>');                'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'.
           '</fieldset></div><br clear="all" />'
       );
       $r->print(
           '<script type="text/javascript" language="Javascript">'."\n".
           '// <![CDATA['."\n".
           $javascript."\n".$javascript_validations."\n".
           '// ]]>'."\n".
           '</script>'
       );
 }  }
   
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub javascript_validations {  sub javascript_validations {
     my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain)=@_;      my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain,
     my $authheader;          $context,$groupslist,$crstype)=@_;
     if ($mode eq 'auth') {      my %param = (
         my %param = ( formname => 'studentform',  
                       kerb_def_dom => $krbdefdom,  
                       curr_authtype => $curr_authtype);  
         $authheader = &Apache::loncommon::authform_header(%param);  
     } elsif ($mode eq 'createcourse') {  
         my %param = ( formname => 'ccrs',  
                       kerb_def_dom => $krbdefdom,  
                       curr_authtype => $curr_authtype );  
         $authheader = &Apache::loncommon::authform_header(%param);  
     } elsif ($mode eq 'modifycourse') {  
         my %param = ( formname => 'cmod',  
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                   mode => 'modifycourse',  
                   curr_authtype => $curr_authtype,                    curr_authtype => $curr_authtype,
                   curr_autharg => $curr_authfield );                  );
         $authheader = &Apache::loncommon::authform_header(%param);      if ($mode eq 'upload') {
           $param{'formname'} = 'studentform';
       } elsif ($mode eq 'createcourse') {
           $param{'formname'} = 'ccrs';
       } elsif ($mode eq 'modifycourse') {
           $param{'formname'} = 'cmod';
           $param{'mode'} = 'modifycourse',
           $param{'curr_autharg'} = $curr_authfield;
       }
   
       my $showcredits;
       my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
       if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) {
           $showcredits = 1;
       }
   
       my ($setsection_call,$setsections_js);
       my $finish = "  vf.submit();\n";
       if ($mode eq 'upload') {
           if (($context eq 'course') || ($context eq 'domain')) {
               if ($context eq 'course') {
                   if ($env{'request.course.sec'} eq '') {
                       $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');';
                       $setsections_js =
                           &setsections_javascript($param{'formname'},$groupslist,
                                                   $mode,'',$crstype,$showcredits);
                   } else {
                       $setsection_call = "'ok'";
                   }
               } elsif ($context eq 'domain') {
                   $setsection_call = 'setCourse()';
                   $setsections_js = &dc_setcourse_js($param{'formname'},$mode,
                                                      $context,$showcredits);
               }
               $finish = "  var checkSec = $setsection_call\n".
                         "  if (checkSec == 'ok') {\n".
                         "      vf.submit();\n".
                         "   }\n";
           }
     }      }
       my $authheader = &Apache::loncommon::authform_header(%param);
   
     my %alert = &Apache::lonlocal::texthash      my %alert = &Apache::lonlocal::texthash
         (username => 'You need to specify the username field.',          (username => 'You need to specify the username field.',
Line 344  sub javascript_validations { Line 437  sub javascript_validations {
          krb      => 'You need to specify the Kerberos domain.',           krb      => 'You need to specify the Kerberos domain.',
          ipass    => 'You need to specify the initial password.',           ipass    => 'You need to specify the initial password.',
          name     => 'The optional name field was not specified.',           name     => 'The optional name field was not specified.',
          snum     => 'The optional ID number field was not specified.',           snum     => 'The optional student/employee ID field was not specified.',
          section  => 'The optional section field was not specified.',           section  => 'The optional section field was not specified.',
          email    => 'The optional email address field was not specified.',           email    => 'The optional e-mail address field was not specified.',
          role     => 'The optional role field was not specified.',           role     => 'The optional role field was not specified.',
            domain   => 'The optional domain field was not specified.',
          continue => 'Continue adding users?',           continue => 'Continue adding users?',
          );           );
       if ($showcredits) {
           $alert{'credits'} = &mt('The optional credits field was not specified');
       }
       if (($mode eq 'upload') && ($context eq 'domain')) {
           $alert{'inststatus'} = &mt('The optional affiliation field was not specified'); 
       }
       my $function_name = <<"END";
   $setsections_js
   
 #    my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();  function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits) {
     my $function_name =(<<END);  
 function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) {  
 END  END
     my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($domain);      my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($domain);
     my $auth_checks;      my $auth_checks;
Line 410  END Line 510  END
             return;              return;
         }          }
     }      }
   /* regexp here to check for non \d \. in credits */
 END  END
     } else {      } else {
         $auth_checks .= (<<END);          $auth_checks .= (<<END);
     foundatype=1;      foundatype=1;
     if (current.argfield == null || current.argfield == '') {      if (current.argfield == null || current.argfield == '') {
         var alertmsg = '';          var alertmsg = '';
         switch (current.value) {          switch (current.radiovalue) {
             case 'krb':              case 'krb':
                 alertmsg = '$alert{'krb'}';                  alertmsg = '$alert{'krb'}';
                 break;                  break;
Line 461  END Line 562  END
         if (message!='') {          if (message!='') {
             message+='\\n';              message+='\\n';
         }          }
           message+='$alert{'section'}';
     }      }
     if (foundemail==0) {      if (foundemail==0) {
         if (message!='') {          if (message!='') {
Line 468  END Line 570  END
         }          }
         message+='$alert{'email'}';          message+='$alert{'email'}';
     }      }
       if (foundrole==0) {
           if (message!='') {
               message+='\\n';
           }
           message+='$alert{'role'}';
       }
       if (founddomain==0) {
           if (message!='') {
               message+='\\n';
           }
           message+='$alert{'domain'}';
       }
   END
           if ($showcredits) {
               $optional_checks .= <<END;
       if (foundcredits==0) {
           if (message!='') {
               message+='\\n';
           }
           message+='$alert{'credits'}';
       }
   END
           }
           if (($mode eq 'upload') && ($context eq 'domain')) {
               $optional_checks .= (<<END);
   
       if (foundinststatus==0) {
           if (message!='') {
               message+='\\n';
           }
           message+='$alert{'inststatus'}';
       }
   END
           }
           $optional_checks .= (<<END);
   
     if (message!='') {      if (message!='') {
         message+= '\\n$alert{'continue'}';          message+= '\\n$alert{'continue'}';
         if (confirm(message)) {          if (confirm(message)) {
             vf.state.value='enrolling';              vf.state.value='enrolling';
             vf.submit();              $finish
         }          }
     } else {      } else {
         vf.state.value='enrolling';          vf.state.value='enrolling';
         vf.submit();          $finish
     }      }
 }  }
 END  END
     }      }
     my $result = $function_name;      my $result = $function_name.$auth_checks.$optional_checks."\n".
     if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {                   $section_checks.$authheader;
         $result .= $auth_checks;  
     }  
     $result .= $optional_checks."\n".$section_checks;  
     if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {  
         $result .= $authheader;  
     }  
     return $result;      return $result;
 }  }
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub upload_manager_javascript_forward_associate {  sub upload_manager_javascript_forward_associate {
       my ($can_assign) = @_;
       my ($auth_update,$numbuttons,$argreset);
       if (ref($can_assign) eq 'HASH') {
           if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) {
               $argreset .= "      vf.krbarg.value='';\n";
               $numbuttons ++ ;
           }
           if ($can_assign->{'int'}) {
               $argreset .= "      vf.intarg.value='';\n";
               $numbuttons ++;
           }
           if ($can_assign->{'loc'}) {
               $argreset .= "      vf.locarg.value='';\n";
               $numbuttons ++;
           }
           if (!$can_assign->{'int'}) {
               my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.').'\n'.
                             &mt('Your current role does not have rights to create users with that authentication type.');
               $auth_update = <<"END";
      // Currently the initial password field is only supported for internal auth
      // (see bug 6368).
      if (nw==9) {
          eval('vf.f'+tf+'.selectedIndex=0;')
          alert('$warning');
      }
   END
           } elsif ($numbuttons > 1) {
               $auth_update = <<"END";
      // If we set the password, make the password form below correspond to
      // the new value.
      if (nw==9) {
         changed_radio('int',document.studentform);
         set_auth_radio_buttons('int',document.studentform);
   $argreset
      }
   
   END
           }
       }
   
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf,sec_caller) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
Line 503  function verify(vf,sec_caller) { Line 675  function verify(vf,sec_caller) {
     var foundsec=0;      var foundsec=0;
     var foundemail=0;      var foundemail=0;
     var foundrole=0;      var foundrole=0;
       var founddomain=0;
       var foundinststatus=0;
       var foundcredits=0;
     var tw;      var tw;
     for (i=0;i<=vf.nfields.value;i++) {      for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');          tw=eval('vf.f'+i+'.selectedIndex');
Line 513  function verify(vf,sec_caller) { Line 688  function verify(vf,sec_caller) {
         if (tw==9) { foundpwd=1; }          if (tw==9) { foundpwd=1; }
         if (tw==10) { foundemail=1; }          if (tw==10) { foundemail=1; }
         if (tw==11) { foundrole=1; }          if (tw==11) { foundrole=1; }
           if (tw==12) { founddomain=1; }
           if (tw==13) { foundinststatus=1; }
           if (tw==14) { foundcredits=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits);
 }  }
   
 //  //
Line 535  function verify(vf,sec_caller) { Line 713  function verify(vf,sec_caller) {
 // 9 = ipwd  (password)  // 9 = ipwd  (password)
 // 10 = email address  // 10 = email address
 // 11 = role  // 11 = role
   // 12 = domain
   // 13 = inststatus
   // 14 = foundcredits 
   
 function flip(vf,tf) {  function flip(vf,tf) {
    var nw=eval('vf.f'+tf+'.selectedIndex');     var nw=eval('vf.f'+tf+'.selectedIndex');
Line 564  function flip(vf,tf) { Line 745  function flip(vf,tf) {
          }           }
       }        }
    }     }
    // If we set the password, make the password form below correspond to     $auth_update
    // the new value.  
    if (nw==9) {  
        changed_radio('int',document.studentform);  
        set_auth_radio_buttons('int',document.studentform);  
        vf.intarg.value='';  
        vf.krbarg.value='';  
        vf.locarg.value='';  
    }  
 }  }
   
 function clearpwd(vf) {  function clearpwd(vf) {
Line 590  ENDPICK Line 763  ENDPICK
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub upload_manager_javascript_reverse_associate {  sub upload_manager_javascript_reverse_associate {
       my ($can_assign) = @_;
       my ($auth_update,$numbuttons,$argreset);
       if (ref($can_assign) eq 'HASH') {
           if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) {
               $argreset .= "      vf.krbarg.value='';\n";
               $numbuttons ++ ;
           }
           if ($can_assign->{'int'}) {
               $argreset .= "      vf.intarg.value='';\n";
               $numbuttons ++;
           }
           if ($can_assign->{'loc'}) {
               $argreset .= "      vf.locarg.value='';\n";
               $numbuttons ++;
           }
           if (!$can_assign->{'int'}) {
               my $warning = &mt('You may not specify an initial password, as this is only available when new users use LON-CAPA internal authentication.\n').
                             &mt('Your current role does not have rights to create users with that authentication type.');
               $auth_update = <<"END";
      // Currently the initial password field is only supported for internal auth
      // (see bug 6368).
      if (tf==8 && nw!=0) {
          eval('vf.f'+tf+'.selectedIndex=0;')
          alert('$warning');
      }
   END
           } elsif ($numbuttons > 1) {
               $auth_update = <<"END";
      // initial password specified, pick internal authentication
      if (tf==8 && nw!=0) {
         changed_radio('int',document.studentform);
         set_auth_radio_buttons('int',document.studentform);
   $argreset
      }
   
   END
           }
       }
   
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf,sec_caller) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
Line 597  function verify(vf,sec_caller) { Line 809  function verify(vf,sec_caller) {
     var foundname=0;      var foundname=0;
     var foundid=0;      var foundid=0;
     var foundsec=0;      var foundsec=0;
       var foundemail=0;
     var foundrole=0;      var foundrole=0;
       var founddomain=0;
       var foundinststatus=0;
       var foundcredits=0;
     var tw;      var tw;
     for (i=0;i<=vf.nfields.value;i++) {      for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');          tw=eval('vf.f'+i+'.selectedIndex');
Line 606  function verify(vf,sec_caller) { Line 822  function verify(vf,sec_caller) {
         if (i==6 && tw!=0) { foundid=1; }          if (i==6 && tw!=0) { foundid=1; }
         if (i==7 && tw!=0) { foundsec=1; }          if (i==7 && tw!=0) { foundsec=1; }
         if (i==8 && tw!=0) { foundpwd=1; }          if (i==8 && tw!=0) { foundpwd=1; }
         if (i==9 && tw!=0) { foundrole=1; }          if (i==9 && tw!=0) { foundemail=1; }
           if (i==10 && tw!=0) { foundrole=1; }
           if (i==11 && tw!=0) { founddomain=1; }
           if (i==12 && tw!=0) { foundinstatus=1; }
           if (i==13 && tw!=0) { foundcredits=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits);
 }  }
   
 function flip(vf,tf) {  function flip(vf,tf) {
Line 625  function flip(vf,tf) { Line 845  function flip(vf,tf) {
    if ((tf>=2) && (tf<=5) && (nw!=0)) {     if ((tf>=2) && (tf<=5) && (nw!=0)) {
       eval('vf.f1.selectedIndex=0;')        eval('vf.f1.selectedIndex=0;')
    }     }
    // intial password specified, pick internal authentication     $auth_update
    if (tf==8 && nw!=0) {  
        changed_radio('int',document.studentform);  
        set_auth_radio_buttons('int',document.studentform);  
        vf.krbarg.value='';  
        vf.intarg.value='';  
        vf.locarg.value='';  
    }  
 }  }
   
 function clearpwd(vf) {  function clearpwd(vf) {
Line 647  ENDPICK Line 860  ENDPICK
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub print_upload_manager_footer {  sub print_upload_manager_footer {
     my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context)=@_;      my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype,
     my $formname;          $showcredits) = @_;
     if ($context eq 'course') {      my $form = 'document.studentform';
         $formname = 'document.studentform';      my $formname = 'studentform';
     } elsif ($context eq 'construction_space') {  
         $formname = 'document.studentform';  
     } elsif ($context eq 'domain') {  
         $formname = 'document.studentform';  
     }  
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
         &Apache::loncommon::get_kerberos_defaults($defdom);          &Apache::loncommon::get_kerberos_defaults($defdom);
     my %param = ( formname => $formname,      my %param = ( formname => $form,
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                   kerb_def_auth => $krbdef                    kerb_def_auth => $krbdef
                   );                    );
Line 670  sub print_upload_manager_footer { Line 878  sub print_upload_manager_footer {
     my $krbform = &Apache::loncommon::authform_kerberos(%param);      my $krbform = &Apache::loncommon::authform_kerberos(%param);
     my $intform = &Apache::loncommon::authform_internal(%param);      my $intform = &Apache::loncommon::authform_internal(%param);
     my $locform = &Apache::loncommon::authform_local(%param);      my $locform = &Apache::loncommon::authform_local(%param);
     my $date_table = &date_setting_table(undef,undef,$context);      my $date_table = &date_setting_table(undef,undef,$context,undef,
                                            $formname,$permission,$crstype);
   
     my $Str = "\n".'<div class="LC_left_float">';      my $Str = "\n".'<div class="LC_left_float">';
     $Str .= &hidden_input('nfields',$i);      $Str .= &hidden_input('nfields',$i);
     $Str .= &hidden_input('keyfields',$keyfields);      $Str .= &hidden_input('keyfields',$keyfields);
     $Str .= "<h3>".&mt('Login Type')."</h3>\n";  
       $Str .= '<h3>'.&mt('Options').'</h3>'
              .&Apache::lonhtmlcommon::start_pick_box();
   
       $Str .= &Apache::lonhtmlcommon::row_title(&mt('Login Type'));
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $Str .= '<p>'.&mt('Change authentication for existing users to these settings?').'&nbsp;<span class="LC_nobreak"><label><input type="radio" name="changeauth" value="No" checked="checked" />'.&mt('No').'</label>&nbsp;&nbsp;<label><input type="radio" name="changeauth" value="Yes" />'.&mt('Yes').'</label></span></p>';           $Str .= '<p>'
                  .&mt('Change authentication for existing users in domain "[_1]" to these settings?'
                      ,$defdom)
                  .'&nbsp;<span class="LC_nobreak"><label>'
                  .'<input type="radio" name="changeauth" value="No" checked="checked" />'
                  .&mt('No').'</label>'
                  .'&nbsp;&nbsp;<label>'
                  .'<input type="radio" name="changeauth" value="Yes" />'
                  .&mt('Yes').'</label>'
                  .'</span></p>'; 
     } else {      } else {
         $Str .= "<p>\n".          $Str .= '<p class="LC_info">'."\n".
             &mt('Note: this will not take effect if the user already exists').              &mt('This will not take effect if the user already exists.').
             &Apache::loncommon::help_open_topic('Auth_Options').              &Apache::loncommon::help_open_topic('Auth_Options').
             "</p>\n";              "</p>\n";
     }      }
     $Str .= &set_login($defdom,$krbform,$intform,$locform);      $Str .= &set_login($defdom,$krbform,$intform,$locform);
   
     my ($home_server_pick,$numlib) =      my ($home_server_pick,$numlib) =
         &Apache::loncommon::home_server_form_item($defdom,'lcserver',          &Apache::loncommon::home_server_form_item($defdom,'lcserver',
                                                   'default','hide');                                                    'default','hide');
     if ($numlib > 1) {      if ($numlib > 1) {
         $Str .= '<h3>'.&mt('LON-CAPA Home Server for New Users')."</h3>\n".          $Str .= &Apache::lonhtmlcommon::row_closure()
                 &mt('LON-CAPA domain: [_1] with home server: [_2]',$defdom,                 .&Apache::lonhtmlcommon::row_title(
                 $home_server_pick).'<br />';                      &mt('LON-CAPA Home Server for New Users'))
     } else {                 .&mt('LON-CAPA domain: [_1] with home server:','"'.$defdom.'"')
         $Str .= $home_server_pick;                 .$home_server_pick
     }                 .&Apache::lonhtmlcommon::row_closure();
     $Str .= '<h3>'.&mt('Starting and Ending Dates').  
             "</h3>\n";  
     $Str .= "<p>\n".$date_table."</p>\n";  
     if ($context eq 'domain') {  
         $Str .= '<h3>'.&mt('Settings for assigning roles:').'</h3>'."\n".  
                 &mt('Pick the action to take on roles for these users:').'<br /><span class="LC_nobreak"><label><input type="radio" name="roleaction" value="norole" checked="checked" />&nbsp;'.&mt('No role changes').'</label>&nbsp;&nbsp;&nbsp;<label><input type="radio" name="roleaction" value="domain" />&nbsp;'.&mt('Add a domain role').'</label>&nbsp;&nbsp;&nbsp;<label><input type="radio" name="roleaction" value="course" />&nbsp;'.&mt('Add a course role').'</label></span>';  
     }  
     if ($context eq 'construction_space') {  
         $Str .= '<h3>'.&mt('Default role')."</h3>\n".  
                 &mt('Choose the role to assign to users without one specified in the uploaded file');  
     } elsif ($context eq 'course') {  
         $Str .= '<h3>'.&mt('Default role and section')."</h3>\n".  
                 &mt('Choose the role and/or section to assign to users without one specified in the uploaded file');  
     } else {      } else {
         $Str .= '<br /><br /><b>'.&mt('Default role and/or section')."</b><br />\n".          $Str .= $home_server_pick.
                 &mt('Role and/or section for users without one in the uploaded file.');                  &Apache::lonhtmlcommon::row_closure();
     }      }
     $Str .= '<br /><br />';  
     my ($options,$cb_script,$coursepick) = &default_role_selector($context,'defaultrole',1);      $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain'))
              .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1)
              .&Apache::lonhtmlcommon::row_closure();
   
       $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates'))
              ."<p>\n".$date_table."</p>\n"
              .&Apache::lonhtmlcommon::row_closure();
   
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $Str .= '<span class="LC_role_level">'.&mt('Domain Level').'</span><br />'.$options.'<br /><br /><span class="LC_role_level">'.&mt('Course Level').'</span><br />'.$cb_script.$coursepick;          $Str .= &Apache::lonhtmlcommon::row_title(
     } elsif ($context eq 'construction_space') {                      &mt('Settings for assigning roles'))
         $Str .= $options;                 .&mt('Pick the action to take on roles for these users:').'<br />'
     } else {                 .'<span class="LC_nobreak"><label>'
         $Str .= '<table><tr><td><span class="LC_nobreak"<b>'.&mt('role').':&nbsp;</b>'.                 .'<input type="radio" name="roleaction" value="norole" checked="checked" />'
                 $options.'</span></td><td>&nbsp;</td><td><span class="LC_nobreak">'.                 .'&nbsp;'.&mt('No role changes').'</label>'
                 '<b>'.&mt('section').':&nbsp;</b><input type="text" name="section" value="" size="12" /></span></td></tr></table>';                 .'&nbsp;&nbsp;&nbsp;<label>'
     }                 .'<input type="radio" name="roleaction" value="domain" />'
     if ($context eq 'course') {                 .'&nbsp;'.&mt('Add a domain role').'</label>'
         $Str .= "<h3>".&mt('Full Update')."</h3>\n".                 .'&nbsp;&nbsp;&nbsp;<label>'
                 '<label><input type="checkbox" name="fullup" value="yes">'.                 .'<input type="radio" name="roleaction" value="course" />'
                 ' '.&mt('Full update (also print list of users not enrolled anymore)').                 .'&nbsp;'.&mt('Add a course/community role').'</label>'
                 "</label></p>\n";                 .'</span>';
       } elsif ($context eq 'author') {
           $Str .= &Apache::lonhtmlcommon::row_title(
                       &mt('Default role'))
                  .&mt('Choose the role to assign to users without a value specified in the uploaded file.')
       } elsif ($context eq 'course') {
           if ($showcredits) {
               $Str .= &Apache::lonhtmlcommon::row_title(
                       &mt('Default role, section and credits'))
                      .&mt('Choose the role and/or section(s) and/or credits to assign to users without values specified in the uploaded file.');
           } else { 
               $Str .= &Apache::lonhtmlcommon::row_title(
                       &mt('Default role and section'))
                      .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.');
           }
       } else {
           $Str .= &Apache::lonhtmlcommon::row_title(
                       &mt('Default role and/or section(s)'))
                  .&mt('Role and/or section(s) for users without values specified in the uploaded file.');
       }
       if (($context eq 'domain') || ($context eq 'author')) {
           $Str .= '<br />';
           my ($options,$cb_script,$coursepick) = 
               &default_role_selector($context,1,'',$showcredits);
           if ($context eq 'domain') {
               $Str .= '<p>'
                      .'<b>'.&mt('Domain Level').'</b><br />'
                      .$options
                      .'</p><p>'
                      .'<b>'.&mt('Course Level').'</b>'
                      .'</p>'
                      .$cb_script.$coursepick
                      .&Apache::lonhtmlcommon::row_closure();
           } elsif ($context eq 'author') {
               $Str .= $options
                      .&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box
           }
       } else {
           my ($cnum,$cdom) = &get_course_identity();
           my $rowtitle = &mt('section');
           my $defaultcredits;
           if ($showcredits) {
               $defaultcredits = &get_defaultcredits();
           }
           my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,$permission,
                                        $context,'upload',$crstype,$showcredits,
                                        $defaultcredits);
           $Str .= $secbox
                  .&Apache::lonhtmlcommon::row_closure();
           my %lt;
           if ($crstype eq 'Community') {
               %lt = &Apache::lonlocal::texthash (
                       disp => 'Display members with current/future access who are not in the uploaded file',
                       stus => 'Members selected from this list can be dropped.'
               );
           } else {
               %lt = &Apache::lonlocal::texthash (
                       disp => 'Display students with current/future access who are not in the uploaded file',
                       stus => 'Students selected from this list can be dropped.'
               );
           }
           $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update'))
                  .'<label><input type="checkbox" name="fullup" value="yes" />'
                  .' '.$lt{'disp'}
                  .'</label><br />'
                  .$lt{'stus'}
                  .&Apache::lonhtmlcommon::row_closure();
     }      }
     if ($context eq 'course' || $context eq 'domain') {      if ($context eq 'course' || $context eq 'domain') {
         $Str .= &forceid_change($context);          $Str .= &forceid_change($context);
     }      }
     $Str .= '</div><div class="LC_clear_float_footer"><br /><input type="button"'.  
               'onClick="javascript:verify(this.form,this.form.csec)" '.      $Str .= &Apache::lonhtmlcommon::end_pick_box();
         'value="Update Users" />'."<br />\n";  
     if ($context eq 'course') {  
         $Str .= &mt('Note: for large courses, this operation may be time '.  
                     'consuming');  
     }  
     $Str .= '</div>';      $Str .= '</div>';
   
       # Footer
       $Str .= '<div class="LC_clear_float_footer">'
              .'<hr />';
       if ($context eq 'course') {
           $Str .= '<p class="LC_info">'
                  .&mt('Note: This operation may be time consuming when adding several users.')
                  .'</p>';
       }
       $Str .= '<p><input type="button"'
              .' onclick="javascript:verify(this.form,this.form.csec)"'
              .' value="'.&mt('Update Users').'" />'
              .'</p>'."\n"
              .'</div>';
     $r->print($Str);      $r->print($Str);
     return;      return;
 }  }
   
   sub get_defaultcredits {
       my ($cdom,$cnum) = @_;
        
       if ($cdom eq '' || $cnum eq '') {
           return unless ($env{'request.course.id'});
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       }
       return unless(($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)); 
       my ($defaultcredits,$domdefcredits);
       my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
       if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) {
           my $instcode = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'};
           if ($instcode) {
               $domdefcredits = $domdefaults{'officialcredits'};
           } else {
               $domdefcredits = $domdefaults{'unofficialcredits'};
           }
       } else {
           return;
       }
   
       if ($env{'request.course.id'} eq $cdom.'_'.$cnum) {
           $defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'};
       } elsif (exists($env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'})) {
           $defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'};
       } else {
           my %crsinfo =
               &Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1});
           $defaultcredits = $crsinfo{'internal.defaultcredits'};
       }
       if ($defaultcredits eq '') {
           $defaultcredits = $domdefcredits;
       }
       return $defaultcredits;
   }
   
 sub forceid_change {  sub forceid_change {
     my ($context) = @_;      my ($context) = @_;
     my $output =       my $output = 
         "<h3>".&mt('ID/Student Number')."</h3>\n".          &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID'))
         "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">'.         .'<label><input type="checkbox" name="forceid" value="yes" />'
         &mt('Disable ID/Student Number Safeguard and Force Change '.         .&mt('Disable Student/Employee ID Safeguard and force change of conflicting IDs')
         'of Conflicting IDs').'</label><br />'."\n".         .'</label><br />'."\n"
         &mt('(only do if you know what you are doing.)')."</br><br />\n";         .&mt('(only do if you know what you are doing.)')."\n";
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $output .= '<label><input type="checkbox" name="recurseid"'.          $output .= '<br /><label><input type="checkbox" name="recurseid"'.
                    ' value="yes">'.                      ' value="yes" />'. 
   &mt('Update ID/Student Number in courses in which user is an Active or Future student, (if forcing change).').    &mt('Update student/employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />').
                    '</label></p>'."\n";                     '</label>'."\n";
     }      }
       $output .= &Apache::lonhtmlcommon::row_closure(1); # last row in pick_box
     return $output;      return $output;
 }  }
   
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub print_upload_manager_form {  sub print_upload_manager_form {
     my ($r,$context) = @_;      my ($r,$context,$permission,$crstype,$showcredits) = @_;
     my $firstLine;      my $firstLine;
     my $datatoken;      my $datatoken;
     if (!$env{'form.datatoken'}) {      if (!$env{'form.datatoken'}) {
Line 794  sub print_upload_manager_form { Line 1124  sub print_upload_manager_form {
                                'ipwd_choice' => 'scalar',                                 'ipwd_choice' => 'scalar',
                                'email_choice' => 'scalar',                                 'email_choice' => 'scalar',
                                'role_choice' => 'scalar',                                 'role_choice' => 'scalar',
                                  'domain_choice' => 'scalar',
                                  'inststatus_choice' => 'scalar',
                              };                               };
     my $defdom = $env{'request.role.domain'};      if ($showcredits) {
           $col_setting_names->{'credits_choice'} = 'scalar';
       }
     if ($context eq 'course') {      if ($context eq 'course') {
         &Apache::loncommon::restore_course_settings('enrollment_upload',          &Apache::loncommon::restore_course_settings('enrollment_upload',
                                                     $col_setting_names);                                                      $col_setting_names);
Line 803  sub print_upload_manager_form { Line 1137  sub print_upload_manager_form {
         &Apache::loncommon::restore_settings($context,'user_upload',          &Apache::loncommon::restore_settings($context,'user_upload',
                                              $col_setting_names);                                               $col_setting_names);
     }      }
       my $defdom = $env{'request.role.domain'};
     #      #
     # Determine kerberos parameters as appropriate      # Determine kerberos parameters as appropriate
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
         &Apache::loncommon::get_kerberos_defaults($defdom);          &Apache::loncommon::get_kerberos_defaults($defdom);
     #      #
     &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context);      my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($defdom);
       &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context,
                                    $permission,$crstype,\%can_assign);
     my $i;      my $i;
     my $keyfields;      my $keyfields;
     if ($total>=0) {      if ($total>=0) {
Line 819  sub print_upload_manager_form { Line 1156  sub print_upload_manager_form {
              ['mname',&mt('Middle Names/Initials'),$env{'form.mname_choice'}],               ['mname',&mt('Middle Names/Initials'),$env{'form.mname_choice'}],
              ['lname',&mt('Last Name'),       $env{'form.lname_choice'}],               ['lname',&mt('Last Name'),       $env{'form.lname_choice'}],
              ['gen',  &mt('Generation'),      $env{'form.gen_choice'}],               ['gen',  &mt('Generation'),      $env{'form.gen_choice'}],
              ['id',   &mt('ID/Student Number'),$env{'form.id_choice'}],               ['id',   &mt('Student/Employee ID'),$env{'form.id_choice'}],
              ['sec',  &mt('Section'),          $env{'form.sec_choice'}],               ['sec',  &mt('Section'),          $env{'form.sec_choice'}],
              ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],               ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],
              ['email',&mt('E-mail Address'),   $env{'form.email_choice'}],               ['email',&mt('E-mail Address'),   $env{'form.email_choice'}],
              ['role',&mt('Role'),             $env{'form.role_choice'}]);               ['role',&mt('Role'),             $env{'form.role_choice'}],
                ['domain',&mt('Domain'),         $env{'form.domain_choice'}],
                ['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]);
           if ($showcredits) {     
               push(@field,
                    ['credits',&mt('Student Credits'), $env{'form.credits_choice'}]);
           }
         if ($env{'form.upfile_associate'} eq 'reverse') {          if ($env{'form.upfile_associate'} eq 'reverse') {
             &Apache::loncommon::csv_print_samples($r,\@records);              &Apache::loncommon::csv_print_samples($r,\@records);
             $i=&Apache::loncommon::csv_print_select_table($r,\@records,              $i=&Apache::loncommon::csv_print_select_table($r,\@records,
Line 840  sub print_upload_manager_form { Line 1183  sub print_upload_manager_form {
             $keyfields=join(',',sort(keys(%sone)));              $keyfields=join(',',sort(keys(%sone)));
         }          }
     }      }
     $r->print('</div>');  
     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,      &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,
                                  $context);                                   $context,$permission,$crstype,$showcredits);
 }  }
   
 sub setup_date_selectors {  sub setup_date_selectors {
     my ($starttime,$endtime,$mode,$nolink) = @_;      my ($starttime,$endtime,$mode,$nolink,$formname) = @_;
       if ($formname eq '') {
           $formname = 'studentform';
       }
     if (! defined($starttime)) {      if (! defined($starttime)) {
         $starttime = time;          $starttime = time;
         unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {          unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
Line 869  sub setup_date_selectors { Line 1214  sub setup_date_selectors {
     }      }
   
     my $startdateform =       my $startdateform = 
         &Apache::lonhtmlcommon::date_setter('studentform','startdate',$starttime,          &Apache::lonhtmlcommon::date_setter($formname,'startdate',$starttime,
             undef,undef,undef,undef,undef,undef,undef,$nolink);              undef,undef,undef,undef,undef,undef,undef,$nolink);
   
     my $enddateform =       my $enddateform = 
         &Apache::lonhtmlcommon::date_setter('studentform','enddate',$endtime,          &Apache::lonhtmlcommon::date_setter($formname,'enddate',$endtime,
             undef,undef,undef,undef,undef,undef,undef,$nolink);              undef,undef,undef,undef,undef,undef,undef,$nolink);
   
     if ($mode eq 'create_enrolldates') {      if ($mode eq 'create_enrolldates') {
Line 897  sub setup_date_selectors { Line 1242  sub setup_date_selectors {
   
   
 sub get_dates_from_form {  sub get_dates_from_form {
     my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');      my ($startname,$endname) = @_;
     my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate');      if ($startname eq '') {
           $startname = 'startdate';
       }
       if ($endname eq '') {
           $endname = 'enddate';
       }
       my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname);
       my $enddate   = &Apache::lonhtmlcommon::get_date_from_form($endname);
     if ($env{'form.no_end_date'}) {      if ($env{'form.no_end_date'}) {
         $enddate = 0;          $enddate = 0;
     }      }
Line 906  sub get_dates_from_form { Line 1258  sub get_dates_from_form {
 }  }
   
 sub date_setting_table {  sub date_setting_table {
     my ($starttime,$endtime,$mode,$bulkaction) = @_;      my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission,$crstype) = @_;
     my $nolink;      my $nolink;
     if ($bulkaction) {      if ($bulkaction) {
         $nolink = 1;          $nolink = 1;
     }      }
     my ($startform,$endform) =       my ($startform,$endform) = 
         &setup_date_selectors($starttime,$endtime,$mode,$nolink);          &setup_date_selectors($starttime,$endtime,$mode,$nolink,$formname);
     my $dateDefault;      my $dateDefault;
     if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {      if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
         $dateDefault = '&nbsp;';          $dateDefault = '&nbsp;';
     } elsif ($mode ne 'construction_space' && $mode ne 'domain') {      } elsif ($mode ne 'author' && $mode ne 'domain') {
         if (($bulkaction eq 'reenable') ||           if (($bulkaction eq 'reenable') || 
             ($bulkaction eq 'activate') ||               ($bulkaction eq 'activate') || 
             ($bulkaction eq 'chgdates')) {               ($bulkaction eq 'chgdates') ||
             $dateDefault = '<span class="LC_nobreak">'.              ($env{'form.action'} eq 'upload')) {
                 '<label><input type="checkbox" name="makedatesdefault" /> '.              if ($env{'request.course.sec'} eq '') {
                 &mt('make these dates the default for future enrollment').                  $dateDefault = '<span class="LC_nobreak">'.
                 '</label></span>';                      '<label><input type="checkbox" name="makedatesdefault" value="1" /> ';
                   if ($crstype eq 'Community') {
                       $dateDefault .= &mt("make these dates the default access dates for future community enrollment");
                   } else {
                       $dateDefault .= &mt("make these dates the default access dates for future course enrollment");
                   }
                   $dateDefault .= '</label></span>';
               }
         }          }
     }      }
     my $perpetual = '<span class="LC_nobreak"><label><input type="checkbox" name="no_end_date"';      my $perpetual = '<span class="LC_nobreak"><label><input type="checkbox" name="no_end_date"';
     if (defined($endtime) && $endtime == 0) {      if (defined($endtime) && $endtime == 0) {
         $perpetual .= ' checked';          $perpetual .= ' checked="checked"';
     }      }
     $perpetual.= ' /> '.&mt('no ending date').'</label></span>';      $perpetual.= ' /> '.&mt('no ending date').'</label></span>';
     if ($mode eq 'create_enrolldates') {      if ($mode eq 'create_enrolldates') {
Line 943  sub date_setting_table { Line 1302  sub date_setting_table {
                                                      'LC_oddrow_value')."\n".                                                       'LC_oddrow_value')."\n".
                $endform.'&nbsp;'.$perpetual.                 $endform.'&nbsp;'.$perpetual.
                &Apache::lonhtmlcommon::row_closure(1).                 &Apache::lonhtmlcommon::row_closure(1).
                &Apache::lonhtmlcommon::end_pick_box().'<br />';                 &Apache::lonhtmlcommon::end_pick_box();
     if ($dateDefault) {      if ($dateDefault) {
         $result .=  $dateDefault.'<br />'."\n";          $result .=  $dateDefault.'<br />'."\n";
     }      }
Line 951  sub date_setting_table { Line 1310  sub date_setting_table {
 }  }
   
 sub make_dates_default {  sub make_dates_default {
     my ($startdate,$enddate,$context) = @_;      my ($startdate,$enddate,$context,$crstype) = @_;
     my $result = '';      my $result = '';
     if ($context eq 'course') {      if ($context eq 'course') {
         my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my ($cnum,$cdom) = &get_course_identity();
         my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};  
         my $put_result = &Apache::lonnet::put('environment',          my $put_result = &Apache::lonnet::put('environment',
                 {'default_enrollment_start_date'=>$startdate,                  {'default_enrollment_start_date'=>$startdate,
                  'default_enrollment_end_date'  =>$enddate},$dom,$crs);                   'default_enrollment_end_date'  =>$enddate},$cdom,$cnum);
         if ($put_result eq 'ok') {          if ($put_result eq 'ok') {
             $result .= &mt('Set default start and end dates for course').              if ($crstype eq 'Community') {
                        '<br />'."\n";                  $result .= &mt('Set default start and end access dates for community.');
               } else {
                   $result .= &mt('Set default start and end access dates for course.');
               }
               $result .= '<br />'."\n";
             #              #
             # Refresh the course environment              # Refresh the course environment
             &Apache::lonnet::coursedescription($env{'request.course.id'},              &Apache::lonnet::coursedescription($env{'request.course.id'},
                                                {'freshen_cache' => 1});                                                 {'freshen_cache' => 1});
         } else {          } else {
             $result .= &mt('Unable to set default dates for course').":".$put_result.              if ($crstype eq 'Community') {
                        '<br />';                  $result .= &mt('Unable to set default access dates for community');
               } else {
                   $result .= &mt('Unable to set default access dates for course');
               }
               $result .= ':'.$put_result.'<br />';
         }          }
     }      }
     return $result;      return $result;
 }  }
   
 sub default_role_selector {  sub default_role_selector {
     my ($context,$checkpriv) = @_;      my ($context,$checkpriv,$crstype,$showcredits) = @_;
     my %customroles;      my %customroles;
     my ($options,$coursepick,$cb_jscript);      my ($options,$coursepick,$cb_jscript);
     if ($context ne 'construction_space') {      if ($context ne 'author') {
         %customroles = &my_custom_roles();          %customroles = &my_custom_roles($crstype);
     }      }
   
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 987  sub default_role_selector { Line 1353  sub default_role_selector {
                     'grs'  => "Section",                      'grs'  => "Section",
                     'exs'  => "Existing sections",                      'exs'  => "Existing sections",
                     'new'  => "New section",                      'new'  => "New section",
                       'crd'  => "Credits",
                   );                    );
     $options = '<select name="defaultrole">'."\n".      $options = '<select name="defaultrole">'."\n".
                ' <option value="">'.&mt('Please select').'</option>'."\n";                  ' <option value="">'.&mt('Please select').'</option>'."\n"; 
     if ($context eq 'course') {      if ($context eq 'course') {
         $options .= &default_course_roles($context,$checkpriv,%customroles);          $options .= &default_course_roles($context,$checkpriv,$crstype,%customroles);
     } elsif ($context eq 'construction_space') {      } elsif ($context eq 'author') {
         my @roles = &construction_space_roles($checkpriv);          my @roles = &construction_space_roles($checkpriv);
         foreach my $role (@roles) {          foreach my $role (@roles) {
            my $plrole=&Apache::lonnet::plaintext($role);             my $plrole=&Apache::lonnet::plaintext($role);
Line 1005  sub default_role_selector { Line 1372  sub default_role_selector {
            $options .= '  <option value="'.$role.'">'.$plrole.'</option>';             $options .= '  <option value="'.$role.'">'.$plrole.'</option>';
         }          }
         my $courseform = &Apache::loncommon::selectcourse_link          my $courseform = &Apache::loncommon::selectcourse_link
             ('studentform','defaultcourse','defaultdomain','defaultdesc',"$env{'request.role.domain'}",undef,'Course');              ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community');
           my ($credit_elem,$creditsinput);
           if ($showcredits) {
               $credit_elem = 'credits';
               $creditsinput = '<td><input type="text" name="credits" value="" /></td>';
           }
         $cb_jscript =           $cb_jscript = 
             &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'defaultsec','studentform');              &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community',$credit_elem);
         $coursepick = &Apache::loncommon::start_data_table().          $coursepick = &Apache::loncommon::start_data_table().
                       &Apache::loncommon::start_data_table_header_row().                        &Apache::loncommon::start_data_table_header_row().
                       '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'.                        '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'.
                       '<th>'.$lt{'grs'}.'</th>'.                        '<th>'.$lt{'grs'}.'</th>'.
                         '<th>'.$lt{'crd'}.'</th>'.
                       &Apache::loncommon::end_data_table_header_row().                        &Apache::loncommon::end_data_table_header_row().
                       &Apache::loncommon::start_data_table_row()."\n".                        &Apache::loncommon::start_data_table_row()."\n".
                       '<td><input type="text" name="defaultdesc" value="" onFocus="this.blur();opencrsbrowser('."'studentform','defcourse','defdomain','coursedesc',''".')" /></td>'."\n".                        '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n".
                       '<td><select name="courserole">'."\n".                        '<td><select name="courserole">'."\n".
                       &default_course_roles($context,$checkpriv,%customroles)."\n".                        &default_course_roles($context,$checkpriv,'Course',%customroles)."\n".
                       '</select></td><td>'.                        '</select></td><td>'.
                       '<table class="LC_createuser">'.                        '<table class="LC_createuser">'.
                       '<tr class="LC_section_row"><td valign"top">'.                        '<tr class="LC_section_row"><td valign"top">'.
                       $lt{'exs'}.'<br /><select name="defaultsec">'.                        $lt{'exs'}.'<br /><select name="currsec">'.
                       ' <option value=""><--'.&mt('Pick course first').                        ' <option value=""><--'.&mt('Pick course first').
                       '</select></td>'.                        '</select></td>'.
                       '<td>&nbsp;&nbsp;</td>'.                        '<td>&nbsp;&nbsp;</td>'.
                       '<td valign="top">'.$lt{'new'}.'<br />'.                        '<td valign="top">'.$lt{'new'}.'<br />'.
                       '<input type="text" name="newsec" value="" size="5" />'.                        '<input type="text" name="newsec" value="" size="5" />'.
                       '<input type="hidden" name="groups" value="" /></td>'.                        '<input type="hidden" name="groups" value="" />'.
                       '</tr></table></td>'.                        '<input type="hidden" name="sections" value="" />'.
                         '<input type="hidden" name="origdom" value="'.
                         $env{'request.role.domain'}.'" />'.
                         '<input type="hidden" name="dccourse" value="" />'.
                         '<input type="hidden" name="dcdomain" value="" />'.
                         '<input type="hidden" name="crstype" value="" />'.
                         '</td></tr></table></td>'.$creditsinput.
                       &Apache::loncommon::end_data_table_row().                        &Apache::loncommon::end_data_table_row().
                       &Apache::loncommon::end_data_table()."\n".                        &Apache::loncommon::end_data_table()."\n";
                       '<input type="hidden" name="defaultcourse" value="" />'.  
                       '<input type="hidden" name="defaultdomain" value="" />';  
     }      }
     $options .= '</select>';      $options .= '</select>';
     return ($options,$cb_jscript,$coursepick);      return ($options,$cb_jscript,$coursepick);
 }  }
   
 sub default_course_roles {  sub default_course_roles {
     my ($context,$checkpriv,%customroles) = @_;      my ($context,$checkpriv,$crstype,%customroles) = @_;
     my $output;      my $output;
     my @roles = &course_roles($context,$checkpriv);      my $custom = 1;
       my @roles = &course_roles($context,$checkpriv,$custom,lc($crstype));
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);          if ($role ne 'cr') {
         $output .= '  <option value="'.$role.'">'.$plrole.'</option>';              my $plrole=&Apache::lonnet::plaintext($role,$crstype);
               $output .= '  <option value="'.$role.'">'.$plrole.'</option>';
           }
     }      }
     if (keys(%customroles) > 0) {      if (keys(%customroles) > 0) {
         my %customroles = &my_custom_roles();          if (grep(/^cr$/,@roles)) {
         foreach my $cust (sort(keys(%customroles))) {              foreach my $cust (sort(keys(%customroles))) {
             my $custrole='cr_cr_'.$env{'user.domain'}.                  my $custrole='cr_'.$env{'user.domain'}.
                 '_'.$env{'user.name'}.'_'.$cust;                               '_'.$env{'user.name'}.'_'.$cust;
             $output .= '  <option value="'.$custrole.'">'.$cust.'</option>';                  $output .= '  <option value="'.$custrole.'">'.$cust.'</option>';
               }
         }          }
     }      }
     return $output;      return $output;
Line 1058  sub default_course_roles { Line 1439  sub default_course_roles {
   
 sub construction_space_roles {  sub construction_space_roles {
     my ($checkpriv) = @_;      my ($checkpriv) = @_;
     my @allroles = ('ca','aa');      my @allroles = &roles_by_context('author');
     my @roles;      my @roles;
     if ($checkpriv) {      if ($checkpriv) {
         foreach my $role (@allroles) {          foreach my $role (@allroles) {
Line 1074  sub construction_space_roles { Line 1455  sub construction_space_roles {
   
 sub domain_roles {  sub domain_roles {
     my ($checkpriv) = @_;      my ($checkpriv) = @_;
     my @allroles = ('dc','li','dg','au','sc');      my @allroles = &roles_by_context('domain');
     my @roles;      my @roles;
     if ($checkpriv) {      if ($checkpriv) {
         foreach my $role (@allroles) {          foreach my $role (@allroles) {
Line 1089  sub domain_roles { Line 1470  sub domain_roles {
 }  }
   
 sub course_roles {  sub course_roles {
     my ($context,$checkpriv) = @_;      my ($context,$checkpriv,$custom,$roletype) = @_;
     my @allroles = ('st','ta','ep','in','cc');      my $crstype;
       if ($roletype eq 'community') {
           $crstype = 'Community' ;
       } else {
           $crstype = 'Course';
       }
       my @allroles = &roles_by_context('course',$custom,$crstype);
     my @roles;      my @roles;
     if ($context eq 'domain') {      if ($context eq 'domain') {
         @roles = @allroles;          @roles = @allroles;
Line 1101  sub course_roles { Line 1488  sub course_roles {
                     if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {                      if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
                         push(@roles,$role);                          push(@roles,$role);
                     } else {                      } else {
                         if ($role ne 'cc' && $env{'request.course.section'} ne '') {                          if ((($role ne 'cc') && ($role ne 'co')) && ($env{'request.course.sec'} ne '')) {
                             if (!&Apache::lonnet::allowed('c'.$role,                              if (&Apache::lonnet::allowed('c'.$role,
                                              $env{'request.course.id'}.'/'.                                               $env{'request.course.id'}.'/'.
                                              $env{'request.course.section'})) {                                               $env{'request.course.sec'})) {
                                 push(@roles,$role);                                  push(@roles,$role);
                             }                              }
                         }                          }
Line 1119  sub course_roles { Line 1506  sub course_roles {
 }  }
   
 sub curr_role_permissions {  sub curr_role_permissions {
     my ($context,$setting,$checkpriv) = @_;       my ($context,$setting,$checkpriv,$type) = @_; 
       my $custom = 1;
     my @roles;      my @roles;
     if ($context eq 'construction_space') {      if ($context eq 'author') {
         @roles = &construction_space_roles($checkpriv);          @roles = &construction_space_roles($checkpriv);
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         if ($setting eq 'course') {          if ($setting eq 'course') {
             @roles = &course_roles($context,$checkpriv);               @roles = &course_roles($context,$checkpriv,$custom,$type); 
         } else {          } else {
             @roles = &domain_roles($checkpriv);              @roles = &domain_roles($checkpriv);
         }          }
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         @roles = &course_roles($context,$checkpriv);          @roles = &course_roles($context,$checkpriv,$custom,$type);
     }      }
     return @roles;      return @roles;
 }  }
Line 1138  sub curr_role_permissions { Line 1526  sub curr_role_permissions {
 # ======================================================= Existing Custom Roles  # ======================================================= Existing Custom Roles
   
 sub my_custom_roles {  sub my_custom_roles {
       my ($crstype) = @_;
     my %returnhash=();      my %returnhash=();
       my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1});
     my %rolehash=&Apache::lonnet::dump('roles');      my %rolehash=&Apache::lonnet::dump('roles');
     foreach my $key (keys %rolehash) {      foreach my $key (keys(%rolehash)) {
         if ($key=~/^rolesdef\_(\w+)$/) {          if ($key=~/^rolesdef\_(\w+)$/) {
               if ($crstype eq 'Community') {
                   next if ($rolehash{$key} =~ /bre\&S/); 
               }
             $returnhash{$1}=$1;              $returnhash{$1}=$1;
         }          }
     }      }
Line 1150  sub my_custom_roles { Line 1543  sub my_custom_roles {
   
 sub print_userlist {  sub print_userlist {
     my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles,      my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles,
         $idlist,$idlist_titles) = @_;          $idlist,$idlist_titles,$showcredits) = @_;
     my $format = $env{'form.output'};      my $format = $env{'form.output'};
     if (! exists($env{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
         $env{'form.sortby'} = 'username';          $env{'form.sortby'} = 'username';
Line 1158  sub print_userlist { Line 1551  sub print_userlist {
     if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {      if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
         $env{'form.Status'} = 'Active';          $env{'form.Status'} = 'Active';
     }      }
       my $onchange = "javascript:updateCols('Status');";
     my $status_select = &Apache::lonhtmlcommon::StatusOptions      my $status_select = &Apache::lonhtmlcommon::StatusOptions
         ($env{'form.Status'});          ($env{'form.Status'},undef,undef,$onchange);
   
     if ($env{'form.showrole'} eq '') {      if ($env{'form.showrole'} eq '') {
         $env{'form.showrole'} = 'Any';          if ($context eq 'course') {
               $env{'form.showrole'} = 'st';
           } else {
               $env{'form.showrole'} = 'Any';            
           }
     }      }
     if (! defined($env{'form.output'}) ||      if (! defined($env{'form.output'}) ||
         $env{'form.output'} !~ /^(csv|excel|html)$/ ) {          $env{'form.output'} !~ /^(csv|excel|html)$/ ) {
Line 1180  sub print_userlist { Line 1578  sub print_userlist {
         @statuses = ('future');          @statuses = ('future');
     }      }
   
 #    if ($context eq 'course') {   
 #        $r->print(&display_adv_courseroles());  
 #    }  
     #  
     # Interface output      # Interface output
     $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".      $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".
               '<input type="hidden" name="action" value="'.                '<input type="hidden" name="action" value="'.
               $env{'form.action'}.'" />');                $env{'form.action'}.'" />');
     $r->print("<p>\n");      $r->print('<div>'."\n");
     if ($env{'form.action'} ne 'modifystudent') {      if ($env{'form.action'} ne 'modifystudent') {
         my %lt=&Apache::lonlocal::texthash('csv' => "CSV",          my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
                                            'excel' => "Excel",                                             'excel' => "Excel",
                                            'html'  => 'HTML');                                             'html'  => 'HTML');
         my $output_selector = '<select size="1" name="output" >';          my $output_selector = '<select size="1" name="output" onchange="javascript:updateCols('."'output'".');" >';
         foreach my $outputformat ('html','csv','excel') {          foreach my $outputformat ('html','csv','excel') {
             my $option = '<option value="'.$outputformat.'" ';              my $option = '<option value="'.$outputformat.'"';
             if ($outputformat eq $env{'form.output'}) {              if ($outputformat eq $env{'form.output'}) {
                 $option .= 'selected ';                  $option .= ' selected="selected"';
             }              }
             $option .='>'.$lt{$outputformat}.'</option>';              $option .='>'.$lt{$outputformat}.'</option>';
             $output_selector .= "\n".$option;              $output_selector .= "\n".$option;
         }          }
         $output_selector .= '</select>';          $output_selector .= '</select>';
         $r->print('<label>'.&mt('Output Format: [_1]',$output_selector).'</label>'.('&nbsp;'x3));          $r->print('<span class="LC_nobreak">'
     }                   .&mt('Output Format: [_1]',$output_selector)
     $r->print('<label>'.&mt('User Status: [_1]',$status_select).'</label>'.('&nbsp;'x3)."\n");                   .'</span>'.('&nbsp;'x3));
       }
       $r->print('<span class="LC_nobreak">'
                .&mt('User Status: [_1]',$status_select)
                .'</span>'.('&nbsp;'x3)."\n");
     my $roleselected = '';      my $roleselected = '';
     if ($env{'form.showrole'} eq 'Any') {      if ($env{'form.showrole'} eq 'Any') {
        $roleselected = ' selected="selected" ';          $roleselected = ' selected="selected"'; 
     }      }
     my $role_select;      my ($cnum,$cdom);
     if ($context eq 'domain') {      $r->print(&role_filter($context));
         $role_select = &domain_roles_select();      if ($context eq 'course') {
         $r->print('<label>'.&mt('Role Type: [_1]',$role_select).'</label>');          ($cnum,$cdom) = &get_course_identity();
     } else {          $r->print(&section_group_filter($cnum,$cdom));
         $role_select = '<select name="showrole">'."\n".  
                        '<option value="Any" '.$roleselected.'>'.  
                        &mt('Any role').'</option>';  
         my @poss_roles = &curr_role_permissions($context);  
         foreach my $role (@poss_roles) {  
             $roleselected = '';  
             if ($role eq $env{'form.showrole'}) {  
                 $roleselected = ' selected="selected" ';  
             }  
             my $plrole=&Apache::lonnet::plaintext($role);  
             $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';  
         }  
         $roleselected = '';  
         if ($env{'form.showrole'} eq 'cr') {  
             $roleselected = ' selected="selected" ';  
         }  
         $role_select .= '<option value="cr"'.$roleselected.'>'.&mt('Custom role').'</option>'.  
                         '</select>';  
         $r->print('<label>'.&mt('Role: [_1]',$role_select).'</label>');  
     }      }
     if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {      $r->print('</div><div class="LC_left_float">'.
         $r->print(&list_submit_button(&mt('Update Display'))."\n</p>\n");                &column_checkboxes($context,$mode,$formname,$showcredits).
                 '</div>');
       if ($env{'form.phase'} eq '') {
           $r->print('<br clear="all" />'.
                     &list_submit_button(&mt('Display List of Users'))."\n".
                     '<input type="hidden" name="phase" value="" /></form>');
           return;
       }
       if (!(($context eq 'domain') && 
             (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) {
           $r->print('<br clear="all" />'.
                     &list_submit_button(&mt('Update Display'))."\n");
       }
   
       my @cols = &infocolumns($context,$mode,$showcredits);  
       if (!@cols) {
            $r->print('<hr style="clear:both;" /><span class="LC_warning">'.
                      &mt('No user information selected for display.').'</span>'.
                      '<input type="hidden" name="phase" value="display" /></form>'."\n");
            return;
     }      }
     my ($indexhash,$keylist) = &make_keylist_array();      my ($indexhash,$keylist) = &make_keylist_array();
     my (%userlist,%userinfo);      my (%userlist,%userinfo,$clearcoursepick);
     if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {      if (($context eq 'domain') && 
           ($env{'form.roletype'} eq 'course') || 
           ($env{'form.roletype'} eq 'community')) {
           my ($crstype,$numcodes,$title,$warning);
           if ($env{'form.roletype'} eq 'course') {
               $crstype = 'Course';
               $numcodes = $totcodes;
               $title = &mt('Select Courses');
               $warning = &mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.');
           } elsif ($env{'form.roletype'} eq 'community') {
               $crstype = 'Community';
               $numcodes = 0;
               $title = &mt('Select Communities');
               $warning = &mt('Warning: data retrieval for multiple communities can take considerable time, as this operation is not currently optimized.');
           }
           my @standardnames = &Apache::loncommon::get_standard_codeitems();
         my $courseform =          my $courseform =
             &Apache::lonhtmlcommon::course_selection($formname,$totcodes,              &Apache::lonhtmlcommon::course_selection($formname,$numcodes,
                                          $codetitles,$idlist,$idlist_titles);                              $codetitles,$idlist,$idlist_titles,$crstype,
         $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n".                              \@standardnames);
                   &Apache::lonhtmlcommon::start_pick_box()."\n".          $r->print('<div class="LC_left_float">'.
                   &Apache::lonhtmlcommon::row_title(&mt('Select Course(s)'),                    '<fieldset><legend>'.$title.'</legend>'."\n".
                                                     'LC_oddrow_value')."\n".  
                   $courseform."\n".                    $courseform."\n".
                   &Apache::lonhtmlcommon::row_closure(1).                    '</fieldset></div><br clear="all" />'.
                   &Apache::lonhtmlcommon::end_pick_box().'</p>'.                    '<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'.
                   '<p>'.&list_submit_button(&mt('Update Display')).                    &list_submit_button(&mt('Update Display')).
                   "\n</p>\n");                    "\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n");
         if ($env{'form.coursepick'}) {          $clearcoursepick = 0;
             $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');          if (($env{'form.origroletype'} ne '') &&
               ($env{'form.origroletype'} ne $env{'form.roletype'})) {
               $clearcoursepick = 1;
           }
           if (($env{'form.coursepick'}) && (!$clearcoursepick)) {
               $r->print('<hr />'.&mt('Searching ...').'<br />&nbsp;<br />');
         }          }
     } else {      } else {
         $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');          $r->print('<hr style="clear:both;" /><div id="searching">'.&mt('Searching ...').'</div>');
     }      }
     $r->rflush();      $r->rflush();
     if ($context eq 'course') {      if ($context eq 'course') {
         my $classlist = &Apache::loncoursedata::get_classlist();          if (($env{'form.showrole'} eq 'st') || ($env{'form.showrole'} eq 'Any')) { 
         my $secidx = &Apache::loncoursedata::CL_SECTION();              my $classlist = &Apache::loncoursedata::get_classlist();
         foreach my $student (keys(%{$classlist})) {              if (ref($classlist) eq 'HASH') {
             if (exists($permission->{'view_section'})) {                  %userlist = %{$classlist};
                 if ($classlist->{$student}[$secidx] ne $permission->{'view_section'}) {  
                     next;  
                 } else {  
                     $userlist{$student} = $classlist->{$student};  
                 }  
             } else {  
                 $userlist{$student} = $classlist->{$student};  
             }              }
         }          }
         my $cid =$env{'request.course.id'};          if ($env{'form.showrole'} ne 'st') {
         my $cdom=$env{'course.'.$cid.'.domain'};              my $showroles;
         my $cnum=$env{'course.'.$cid.'.num'};              if ($env{'form.showrole'} ne 'Any') {
         my $showroles;                  $showroles = [$env{'form.showrole'}];
         if ($env{'form.showrole'} ne 'Any') {              } else {
             $showroles = [$env{'form.showrole'}];                  $showroles = undef;
         } else {              }
             $showroles = undef;              my $withsec = 1;
               my $hidepriv = 1;
               my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,
                                 \@statuses,$showroles,undef,$withsec,$hidepriv);
               &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo,
                                \%advrolehash,$permission);
         }          }
         my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,  
                                                         \@statuses,$showroles);  
         &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo,  
                          \%advrolehash,$permission);  
     } else {      } else {
         my (%cstr_roles,%dom_roles);          my (%cstr_roles,%dom_roles);
         if ($context eq 'construction_space') {          if ($context eq 'author') {
             # List co-authors and assistant co-authors              # List co-authors and assistant co-authors
             my @possroles = ('ca','aa');              my @possroles = &roles_by_context($context);
             %cstr_roles = &Apache::lonnet::get_my_roles(undef,undef,undef,              %cstr_roles = &Apache::lonnet::get_my_roles(undef,undef,undef,
                                               \@statuses,\@possroles);                                                \@statuses,\@possroles);
             &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo,              &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo,
Line 1305  sub print_userlist { Line 1716  sub print_userlist {
                                          \%userinfo,$dom_roles{$key},$permission);                                           \%userinfo,$dom_roles{$key},$permission);
                     }                      }
                 }                  }
             } elsif ($env{'form.roletype'} eq 'construction_space') {              } elsif ($env{'form.roletype'} eq 'author') {
                 my %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'},['au']);                  my %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'},['au']);
                 my %coauthors;                  my %coauthors;
                 foreach my $key (keys(%dom_roles)) {                  foreach my $key (keys(%dom_roles)) {
Line 1316  sub print_userlist { Line 1727  sub print_userlist {
                         } else {                          } else {
                             my @possroles;                              my @possroles;
                             if ($env{'form.showrole'} eq 'Any') {                              if ($env{'form.showrole'} eq 'Any') {
                                 @possroles = ('ca','aa');                                  @possroles = &roles_by_context('author');
                             } else {                              } else {
                                 @possroles = ($env{'form.showrole'});                                   @possroles = ($env{'form.showrole'}); 
                             }                              }
                             foreach my $author (sort(keys(%{$dom_roles{$key}}))) {                              foreach my $author (sort(keys(%{$dom_roles{$key}}))) {
                                 my ($role,$authorname,$authordom) = split(/:/,$author);                                  my ($role,$authorname,$authordom) = split(/:/,$author,-1);
                                 my $extent = '/'.$authordom.'/'.$authorname;                                  my $extent = '/'.$authordom.'/'.$authorname;
                                 %{$coauthors{$extent}} =                                  %{$coauthors{$extent}} =
                                     &Apache::lonnet::get_my_roles($authorname,                                      &Apache::lonnet::get_my_roles($authorname,
Line 1332  sub print_userlist { Line 1743  sub print_userlist {
                         }                          }
                     }                      }
                 }                  }
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif (($env{'form.roletype'} eq 'course') ||
                 if ($env{'form.coursepick'}) {                       ($env{'form.roletype'} eq 'community')) {
                   if (($env{'form.coursepick'}) && (!$clearcoursepick)) {
                     my %courses = &process_coursepick();                      my %courses = &process_coursepick();
                     my %allusers;                       my %allusers;
                       my $hidepriv = 1;
                     foreach my $cid (keys(%courses)) {                      foreach my $cid (keys(%courses)) {
                         my %coursehash =                          my ($cnum,$cdom,$cdesc) = &get_course_identity($cid);
                             &Apache::lonnet::coursedescription($cid,{'one_time' => 1});  
                         my $cdom = $coursehash{'domain'};  
                         my $cnum = $coursehash{'num'};  
                         next if ($cnum eq '' || $cdom eq '');                          next if ($cnum eq '' || $cdom eq '');
                         my $cdesc = $coursehash{'description'};                          my $custom = 1;
                         my (@roles,@sections,%access,%users,%userdata,                          my (@roles,@sections,%access,%users,%userdata,
                             %statushash);                              %statushash);
                         if ($env{'form.showrole'} eq 'Any') {                          if ($env{'form.showrole'} eq 'Any') {
                             @roles = &course_roles($context);                              @roles = &course_roles($context,undef,$custom,
                             unshift(@roles,'cr');                                                     $env{'form.roletype'});
                         } else {                          } else {
                             @roles = ($env{'form.showrole'});                              @roles = ($env{'form.showrole'});
                         }                          }
Line 1357  sub print_userlist { Line 1767  sub print_userlist {
                         foreach my $type (@statuses) {                          foreach my $type (@statuses) {
                             $access{$type} = $type;                              $access{$type} = $type;
                         }                          }
                         &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users,\%userdata,\%statushash);                          &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users,\%userdata,\%statushash,$hidepriv);
                         foreach my $user (keys(%userdata)) {                          foreach my $user (keys(%userdata)) {
                             next if (ref($userinfo{$user}) eq 'HASH');                              next if (ref($userinfo{$user}) eq 'HASH');
                             foreach my $item ('fullname','id') {                              foreach my $item ('fullname','id') {
Line 1384  sub print_userlist { Line 1794  sub print_userlist {
         }          }
     }      }
     if (keys(%userlist) == 0) {      if (keys(%userlist) == 0) {
         if ($context eq 'construction_space') {          my $msg = '';
             $r->print(&mt('There are no co-authors to display.')."\n");          if ($context eq 'author') {
               $msg = &mt('There are no co-authors to display.');
         } elsif ($context eq 'domain') {          } elsif ($context eq 'domain') {
             if ($env{'form.roletype'} eq 'domain') {              if ($env{'form.roletype'} eq 'domain') {
                 $r->print(&mt('There are no users with domain roles to display.')."\n");                  $msg = &mt('There are no users with domain roles to display.');
             } elsif ($env{'form.roletype'} eq 'construction_space') {              } elsif ($env{'form.roletype'} eq 'author') {
                 $r->print(&mt('There are no authors or co-authors to display.')."\n");                  $msg = &mt('There are no authors or co-authors to display.');
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif ($env{'form.roletype'} eq 'course') {
                 $r->print(&mt('There are no course users to display')."\n");                   $msg = &mt('There are no course users to display');
               } elsif ($env{'form.roletype'} eq 'community') {
                   $msg = &mt('There are no community users to display');
             }              }
         } elsif ($context eq 'course') {          } elsif ($context eq 'course') {
             $r->print(&mt('There are no course users to display.')."\n");              $r->print(&mt('There are no course users to display.')."\n");
         }          }
           $r->print('<p class="LC_info">'.$msg.'</p>'."\n") if $msg;
     } else {      } else {
         # Print out the available choices          # Print out the available choices
         my $usercount;          my $usercount;
         if ($env{'form.action'} eq 'modifystudent') {          if ($env{'form.action'} eq 'modifystudent') {
             ($usercount) = &show_users_list($r,$context,'view',$permission,              ($usercount) = &show_users_list($r,$context,'view',$permission,
                                  $env{'form.Status'},\%userlist,$keylist);                                   $env{'form.Status'},\%userlist,$keylist,'',
                                    $showcredits);
         } else {          } else {
             ($usercount) = &show_users_list($r,$context,$env{'form.output'},              ($usercount) = &show_users_list($r,$context,$env{'form.output'},
                                $permission,$env{'form.Status'},\%userlist,$keylist);                                 $permission,$env{'form.Status'},\%userlist,
                                  $keylist,'',$showcredits);
         }          }
         if (!$usercount) {          if (!$usercount) {
             $r->print('<br />'.&mt('There are no users matching the search criteria.'));               $r->print('<br /><span class="LC_info">'
                        .&mt('There are no users matching the search criteria.')
                        .'</span>'
               ); 
         }          }
     }      }
     $r->print('<input type="hidden" name="phase" value="'.      $r->print('<input type="hidden" name="phase" value="'.
               $env{'form.phase'}.'" /></form>');                $env{'form.phase'}.'" /></form>');
       return;
   }
   
   sub role_filter {
       my ($context) = @_;
       my $output;
       my $roleselected = '';
       if ($env{'form.showrole'} eq 'Any') {
          $roleselected = ' selected="selected"';
       }
       my ($role_select);
       if ($context eq 'domain') {
           $role_select = &domain_roles_select();
           $output = '<span class="LC_nobreak">'
                    .&mt('Role Type: [_1]',$role_select)
                    .'</span>';
       } else {
           $role_select = '<select name="showrole" onchange="javascript:updateCols('."'showrole'".');">'."\n".
                          '<option value="Any" '.$roleselected.'>'.
                          &mt('Any role').'</option>';
           my ($roletype,$crstype);
           if ($context eq 'course') {
               $crstype = &Apache::loncommon::course_type();
               if ($crstype eq 'Community') {
                   $roletype = 'community';
               } else {
                   $roletype = 'course';
               } 
           }
           my @poss_roles = &curr_role_permissions($context,'','',$roletype);
           foreach my $role (@poss_roles) {
               $roleselected = '';
               if ($role eq $env{'form.showrole'}) {
                   $roleselected = ' selected="selected"';
               }
               my $plrole;
               if ($role eq 'cr') {
                   $plrole = &mt('Custom role');
               } else {
                   $plrole=&Apache::lonnet::plaintext($role,$crstype);
               }
               $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
           }
           $role_select .= '</select>';
           $output = '<span class="LC_nobreak">'
                    .&mt('Role: [_1]',$role_select)
                    .'</span>';
       }
       return $output;
   }
   
   sub section_group_filter {
       my ($cnum,$cdom) = @_;
       my @filters;
       if ($env{'request.course.sec'} eq '') {
           @filters = ('sec');
       }
       push(@filters,'grp');
       my %name = (
                    sec => 'secfilter',
                    grp => 'grpfilter',
                  );
       my %title = &Apache::lonlocal::texthash (
                                                 sec  => 'Section(s)',
                                                 grp  => 'Group(s)',
                                                 all  => 'all',
                                                 none => 'none',
                                               );
       my $output;
       foreach my $item (@filters) {
           my ($markup,@options); 
           if ($env{'form.'.$name{$item}} eq '') {
               $env{'form.'.$name{$item}} = 'all';
           }
           if ($item eq 'sec') {
               if (($env{'form.showrole'} eq 'cc') || ($env{'form.showrole'} eq 'co')) {
                   $env{'form.'.$name{$item}} = 'none';
               }
               my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
               @options = sort(keys(%sections_count));
           } elsif ($item eq 'grp') {
               my %curr_groups = &Apache::longroup::coursegroups();
               @options = sort(keys(%curr_groups));
           }
           if (@options > 0) {
               my $currsel;
               $markup = '<select name="'.$name{$item}.'">'."\n";
               foreach my $option ('all','none',@options) { 
                   $currsel = '';
                   if ($env{'form.'.$name{$item}} eq $option) {
                       $currsel = ' selected="selected"';
                   }
                   $markup .= ' <option value="'.$option.'"'.$currsel.'>';
                   if (($option eq 'all') || ($option eq 'none')) {
                       $markup .= $title{$option};
                   } else {
                       $markup .= $option;
                   }   
                   $markup .= '</option>'."\n";
               }
               $markup .= '</select>'."\n";
               $output .= ('&nbsp;'x3).'<span class="LC_nobreak">'
                         .'<label>'.$title{$item}.': '.$markup.'</label>'
                         .'</span> ';
           }
       }
       return $output;
   }
   
   sub infocolumns {
       my ($context,$mode,$showcredits) = @_;
       my @cols;
       if (($mode eq 'pickauthor') || ($mode eq 'autoenroll')) {
           @cols = &get_cols_array($context,$mode,$showcredits);
       } else {
           my @posscols = &get_cols_array($context,$mode,$showcredits);
           if ($env{'form.phase'} ne '') {
               my @checkedcols = &Apache::loncommon::get_env_multiple('form.showcol');
               foreach my $col (@checkedcols) {
                   if (grep(/^$col$/,@posscols)) {
                       push(@cols,$col);
                   }
               }
           } else {
               @cols = @posscols;
           }
       }
       return @cols;
   }
   
   sub get_cols_array {
       my ($context,$mode,$showcredits) = @_;
       my @cols;
       if ($mode eq 'pickauthor') {
           @cols = ('username','fullname','status','email');
       } else {
           @cols = ('username','domain','id','fullname');
           if ($context eq 'course') {
               push(@cols,'section');
           }
           push(@cols,('start','end','role'));
           unless (($mode eq 'autoenroll') && ($env{'form.Status'} ne 'Any')) {
               push(@cols,'status');
           }
           if ($context eq 'course') {
               push(@cols,'groups');
           }
           push(@cols,'email');
           if (($context eq 'course') && ($mode ne 'autoenroll')) {
               if ($showcredits) {
                   push(@cols,'credits');
               }
               push(@cols,'lastlogin','clicker');
           }
           if (($context eq 'course') && ($mode ne 'autoenroll') &&
               ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) {
               push(@cols,'photo');
           }
           if ($context eq 'domain') {
               push (@cols,'extent');
           }
       }
       return @cols;
   }
   
   sub column_checkboxes {
       my ($context,$mode,$formname,$showcredits) = @_;
       my @cols = &get_cols_array($context,$mode,$showcredits);
       my @showncols = &Apache::loncommon::get_env_multiple('form.showcol');
       my (%disabledchk,%unchecked);
       if ($env{'form.phase'} eq '') {
           $disabledchk{'status'} = 1;
           if ($context eq 'course') {
               $disabledchk{'role'} = 1;
               $unchecked{'photo'} = 1;
               $unchecked{'clicker'} = 1;
               if ($showcredits) {
                   $unchecked{'credits'} = 1;
               }
           } elsif ($context eq 'domain') { 
               $unchecked{'extent'} = 1; 
           }
           $unchecked{'start'} = 1;
           $unchecked{'end'} = 1;
       } else {
           if ($env{'form.Status'} ne 'Any') {
               $disabledchk{'status'} = 1;
           }
           if (($env{'form.showrole'} ne 'Any') && ($env{'form.showrole'} ne 'cr')) {
               $disabledchk{'role'} = 1;
           }
           if ($context eq 'domain') {
               if (($env{'form.roletype'} eq 'course') || 
                   ($env{'form.roletype'} eq 'community')) {
                   $disabledchk{'status'} = 1;
               } elsif ($env{'form.roletype'} eq 'domain') {
                   $disabledchk{'extent'} = 1; 
               }
           }
       }
       my $numposs = scalar(@cols);
       my $numinrow = 7;
       my %lt = &get_column_names($context);
       my $output = '<fieldset><legend>'.&mt('Information to show').'</legend>'."\n".'<span class="LC_nobreak">'.
                    '<input type="button" onclick="javascript:checkAll(document.'.$formname.'.showcol);" value="'.&mt('check all').'" />'.
                    ('&nbsp;'x3).
                    '<input type="button" onclick="javascript:uncheckAll(document.'.$formname.'.showcol);" value="'.&mt('uncheck all').'" />'.
                    '</span><table>';
       
       for (my $i=0; $i<$numposs; $i++) {
           my $rem = $i%($numinrow);
           if ($rem == 0) {
               if ($i > 0) {
                   $output .= '</tr>';
               }
               $output .= '<tr>';
           }
           my $checked;
           if ($env{'form.phase'} eq '') {
               $checked = ' checked="checked"';
               if ($unchecked{$cols[$i]}) { 
                  $checked = '';
               }
               if ($disabledchk{$cols[$i]}) {
                   $checked = ' disabled="disabled"';
               }
           } elsif (grep(/^\Q$cols[$i]\E$/,@showncols)) {
               $checked = ' checked="checked"';
           } elsif ($disabledchk{$cols[$i]}) {
               $checked = ' disabled="disabled"';
           }
           if ($i == $numposs-1) {
               my $colsleft = $numinrow-$rem;
               if ($colsleft > 1) {
                   $output .= '<td colspan="'.$colsleft.'">';
               } else {
                   $output .= '<td>';
               }
           } else {
               $output .= '<td>';
           }
           my $style;
           if ($cols[$i] eq 'extent') {
               if (($env{'form.roletype'} eq 'domain') || ($env{'form.roletype'} eq '')) {
                   $style = ' style="display: none;"';
               } 
           } 
           $output .= '<span id="show'.$cols[$i].'"'.$style.'><label>'.
                      '<input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' /><span id="showcoltext'.$cols[$i].'">'.
                      $lt{$cols[$i]}.'</span>'.
                      '</label></span></td>';
       }
       $output .= '</tr></table></fieldset>';
       return $output;
 }  }
   
 sub list_submit_button {  sub list_submit_button {
Line 1420  sub list_submit_button { Line 2093  sub list_submit_button {
     return '<input type="button" name="updatedisplay" value="'.$text.'" onclick="javascript:display_update()" />';      return '<input type="button" name="updatedisplay" value="'.$text.'" onclick="javascript:display_update()" />';
 }  }
   
   sub get_column_names {
       my ($context) = @_;
       my %lt = &Apache::lonlocal::texthash(
           'username'   => "username",
           'domain'     => "domain",
           'id'         => 'ID',
           'fullname'   => "name",
           'section'    => "section",
           'groups'     => "active groups",
           'start'      => "start date",
           'end'        => "end date",
           'status'     => "status",
           'role'       => "role",
           'credits'    => "credits",
           'type'       => "enroll type/action",
           'email'      => "e-mail address",
           'photo'      => "photo",
           'lastlogin'  => "last login",
           'extent'     => "extent",
           'ca'         => "check all",
           'ua'         => "uncheck all",
           'clicker'    => "clicker-ID",
       );
       if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
           $lt{'extent'} = &mt('course(s): description, section(s), status');
       } elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') {
           $lt{'extent'} = &mt('community(s): description, section(s), status');
       } elsif (($context eq 'author') || 
                ($context eq 'domain' && $env{'form.roletype'} eq 'author')) {
           $lt{'extent'} = &mt('author');
       }
       return %lt;
   }
   
 sub gather_userinfo {  sub gather_userinfo {
     my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_;      my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_;
       my $viewablesec;
       if ($context eq 'course') {
           $viewablesec = &viewable_section($permission);
       }
     foreach my $item (keys(%{$rolehash})) {      foreach my $item (keys(%{$rolehash})) {
         @{$userlist->{$item}} = ();  
         my %userdata;          my %userdata;
         if ($context eq 'construction_space' || $context eq 'course') {           if ($context eq 'author') { 
             ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =              ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =
                 split(/:/,$item);                  split(/:/,$item);
             ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});              ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});
             &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist);              &build_user_record($context,\%userdata,$userinfo,$indexhash,
                                  $item,$userlist);
           } elsif ($context eq 'course') {
               ($userdata{'username'},$userdata{'domain'},$userdata{'role'},
                $userdata{'section'}) = split(/:/,$item,-1);
               ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});
               if (($viewablesec ne '') && ($userdata{'section'} ne '')) {
                   next if ($viewablesec ne $userdata{'section'});
               }
               &build_user_record($context,\%userdata,$userinfo,$indexhash,
                                  $item,$userlist);
         } elsif ($context eq 'domain') {          } elsif ($context eq 'domain') {
             if ($env{'form.roletype'} eq 'domain') {              if ($env{'form.roletype'} eq 'domain') {
                 ($userdata{'role'},$userdata{'username'},$userdata{'domain'}) =                  ($userdata{'role'},$userdata{'username'},$userdata{'domain'}) =
                     split(/:/,$item);                      split(/:/,$item);
                 ($userdata{'end'},$userdata{'start'})=split(/:/,$rolehash->{$item});                  ($userdata{'end'},$userdata{'start'})=split(/:/,$rolehash->{$item});
                 &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist);                  &build_user_record($context,\%userdata,$userinfo,$indexhash,
             } elsif ($env{'form.roletype'} eq 'construction_space') {                                     $item,$userlist);
               } elsif ($env{'form.roletype'} eq 'author') {
                 if (ref($rolehash->{$item}) eq 'HASH') {                  if (ref($rolehash->{$item}) eq 'HASH') {
                     $userdata{'extent'} = $item;                      $userdata{'extent'} = $item;
                     foreach my $key (keys(%{$rolehash->{$item}})) {                      foreach my $key (keys(%{$rolehash->{$item}})) {
Line 1444  sub gather_userinfo { Line 2165  sub gather_userinfo {
                         ($userdata{'start'},$userdata{'end'}) =                           ($userdata{'start'},$userdata{'end'}) = 
                             split(/:/,$rolehash->{$item}{$key});                              split(/:/,$rolehash->{$item}{$key});
                         my $uniqid = $key.':'.$item;                          my $uniqid = $key.':'.$item;
                         &build_user_record(\%userdata,$userinfo,$indexhash,$uniqid,$userlist);                          &build_user_record($context,\%userdata,$userinfo,
                                              $indexhash,$uniqid,$userlist);
                     }                      }
                 }                  }
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif (($env{'form.roletype'} eq 'course') || 
                        ($env{'form.roletype'} eq 'community')) {
                 ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =                  ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =
                     split(/:/,$item);                      split(/:/,$item);
                 if (ref($rolehash->{$item}) eq 'HASH') {                  if (ref($rolehash->{$item}) eq 'HASH') {
Line 1459  sub gather_userinfo { Line 2182  sub gather_userinfo {
                             my $space = ', ';                              my $space = ', ';
                             if ($format eq 'html' || $format eq 'view') {                              if ($format eq 'html' || $format eq 'view') {
                                 $spanstart = '<span class="LC_nobreak">';                                  $spanstart = '<span class="LC_nobreak">';
                                 if ($permission->{'cusr'}) {                                  # FIXME: actions on courses disabled for now
                                     if ($numcids > 1) {  #                                if ($permission->{'cusr'}) {
                                         $spanstart .= '<input type="radio" name="'.$item.'" value="'.$cid.'" &nbsp; />';  #                                    if ($numcids > 1) {
                                     } else {  #                                        $spanstart .= '<input type="radio" name="'.$item.'" value="'.$cid.'" />&nbsp;';
                                         $spanstart .= '<input type="hidden" name="'.$item.'" value="'.$cid.'" &nbsp; />';  #                                    } else {
                                     }  #                                        $spanstart .= '<input type="hidden" name="'.$item.'" value="'.$cid.'" />&nbsp;';
                                 }  #                                    }
   #                                }
                                 $spanend = '</span><br />';                                  $spanend = '</span><br />';
                                 $space = ',&nbsp;';                                  $space = ',&nbsp;';
                             }                              }
Line 1473  sub gather_userinfo { Line 2197  sub gather_userinfo {
                                     $rolehash->{$item}{$cid}{'desc'}.$space;                                      $rolehash->{$item}{$cid}{'desc'}.$space;
                             if (ref($rolehash->{$item}{$cid}{'secs'}) eq 'HASH') {                               if (ref($rolehash->{$item}{$cid}{'secs'}) eq 'HASH') { 
                                 foreach my $sec (sort(keys(%{$rolehash->{$item}{$cid}{'secs'}}))) {                                  foreach my $sec (sort(keys(%{$rolehash->{$item}{$cid}{'secs'}}))) {
                                     $userdata{'extent'} .= $sec.$space.$rolehash->{$item}{$cid}{'secs'}{$sec}.$spanend;                                      if (($env{'form.Status'} eq 'Any') ||
                                           ($env{'form.Status'} eq $rolehash->{$item}{$cid}{'secs'}{$sec})) {
                                           $userdata{'extent'} .= $sec.$space.$rolehash->{$item}{$cid}{'secs'}{$sec}.$spanend;
                                           $userdata{'status'} = $rolehash->{$item}{$cid}{'secs'}{$sec};
                                       }
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                 }                  }
                 &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist);                  if ($userdata{'status'} ne '') {
                       &build_user_record($context,\%userdata,$userinfo,
                                          $indexhash,$item,$userlist);
                   }
             }              }
         }          }
     }      }
Line 1487  sub gather_userinfo { Line 2218  sub gather_userinfo {
 }  }
   
 sub build_user_record {  sub build_user_record {
     my ($userdata,$userinfo,$indexhash,$record_key,$userlist) = @_;      my ($context,$userdata,$userinfo,$indexhash,$record_key,$userlist) = @_;
     next if ($userdata->{'start'} eq '-1' && $userdata->{'end'} eq '-1');      next if ($userdata->{'start'} eq '-1' && $userdata->{'end'} eq '-1');
     &process_date_info($userdata);      if (!(($context eq 'domain') && (($env{'form.roletype'} eq 'course')
                                && ($env{'form.roletype'} eq 'community')))) {
           &process_date_info($userdata);
       }
     my $username = $userdata->{'username'};      my $username = $userdata->{'username'};
     my $domain = $userdata->{'domain'};      my $domain = $userdata->{'domain'};
     if (ref($userinfo->{$username.':'.$domain}) eq 'HASH') {      if (ref($userinfo->{$username.':'.$domain}) eq 'HASH') {
         $userdata->{'fullname'} =          $userdata->{'fullname'} = $userinfo->{$username.':'.$domain}{'fullname'};
         $userinfo->{$username.':'.$domain}{'fullname'};  
         $userdata->{'id'} = $userinfo->{$username.':'.$domain}{'id'};          $userdata->{'id'} = $userinfo->{$username.':'.$domain}{'id'};
     } else {      } else {
         &aggregate_user_info($domain,$username,$userinfo);          &aggregate_user_info($domain,$username,$userinfo);
Line 1557  function setCourseCat(formname) { Line 2290  function setCourseCat(formname) {
     if (formname.Year.options[formname.Year.selectedIndex].value == -1) {      if (formname.Year.options[formname.Year.selectedIndex].value == -1) {
         return;          return;
     }      }
     courseSet('Year');      courseSet('$codetitles[0]');
     for (var j=0; j<formname.Semester.length; j++) {      for (var j=0; j<formname.Semester.length; j++) {
         if (formname.Semester.options[j].value == "$env{'form.Semester'}") {          if (formname.Semester.options[j].value == "$env{'form.Semester'}") {
             formname.Semester.options[j].selected = true;              formname.Semester.options[j].selected = true;
Line 1566  function setCourseCat(formname) { Line 2299  function setCourseCat(formname) {
     if (formname.Semester.options[formname.Semester.selectedIndex].value == -1) {      if (formname.Semester.options[formname.Semester.selectedIndex].value == -1) {
         return;          return;
     }      }
     courseSet('Semester');      courseSet('$codetitles[1]');
     for (var j=0; j<formname.Department.length; j++) {      for (var j=0; j<formname.Department.length; j++) {
         if (formname.Department.options[j].value == "$env{'form.Department'}") {            formname.Department.options[j].selected = true;          if (formname.Department.options[j].value == "$env{'form.Department'}") {            formname.Department.options[j].selected = true;
         }          }
Line 1574  function setCourseCat(formname) { Line 2307  function setCourseCat(formname) {
     if (formname.Department.options[formname.Department.selectedIndex].value == -1) {      if (formname.Department.options[formname.Department.selectedIndex].value == -1) {
         return;          return;
     }      }
     courseSet('Department');      courseSet('$codetitles[2]');
     for (var j=0; j<formname.Number.length; j++) {      for (var j=0; j<formname.Number.length; j++) {
         if (formname.Number.options[j].value == "$env{'form.Number'}") {          if (formname.Number.options[j].value == "$env{'form.Number'}") {
             formname.Number.options[j].selected = true;              formname.Number.options[j].selected = true;
Line 1603  sub process_coursepick { Line 2336  sub process_coursepick {
     my $coursefilter = $env{'form.coursepick'};      my $coursefilter = $env{'form.coursepick'};
     my $cdom = $env{'request.role.domain'};      my $cdom = $env{'request.role.domain'};
     my %courses;      my %courses;
       my $crssrch = 'Course';
       if ($env{'form.roletype'} eq 'community') {
           $crssrch = 'Community';
       }
     if ($coursefilter eq 'all') {      if ($coursefilter eq 'all') {
         %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.',          %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.',
                                                  undef,undef,'Course');                                                   undef,undef,$crssrch);
     } elsif ($coursefilter eq 'category') {      } elsif ($coursefilter eq 'category') {
         my $instcode = &instcode_from_coursefilter();          my $instcode = &instcode_from_coursefilter();
         %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.',          %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.',
                                                  undef,undef,'Course');                                                   undef,undef,$crssrch);
     } elsif ($coursefilter eq 'specific') {      } elsif ($coursefilter eq 'specific') {
         if ($env{'form.coursetotal'} > 1) {          if ($env{'form.coursetotal'} > 1) {
             my @course_ids = split(/&&/,$env{'form.courselist'});              my @course_ids = split(/&&/,$env{'form.courselist'});
Line 1639  sub instcode_from_coursefilter { Line 2376  sub instcode_from_coursefilter {
     return $instcode;      return $instcode;
 }  }
   
 sub display_adv_courseroles {  
     my $output;  
     #  
     # List course personnel  
     my %coursepersonnel =   
        &Apache::lonnet::get_course_adv_roles($env{'request.course.id'});  
     #  
     $output = '<br />'.&Apache::loncommon::start_data_table();  
     foreach my $role (sort(keys(%coursepersonnel))) {  
         next if ($role =~ /^\s*$/);  
         $output .= &Apache::loncommon::start_data_table_row().  
                   '<td>'.$role.'</td><td>';  
         foreach my $user (split(',',$coursepersonnel{$role})) {  
             my ($puname,$pudom)=split(':',$user);  
             $output .= ' '.&Apache::loncommon::aboutmewrapper(  
                        &Apache::loncommon::plainname($puname,$pudom),  
                        $puname,$pudom);  
         }  
         $output .= '</td>'.&Apache::loncommon::end_data_table_row();  
     }  
     $output .= &Apache::loncommon::end_data_table();  
 }  
   
 sub make_keylist_array {  sub make_keylist_array {
     my ($index,$keylist);      my ($index,$keylist);
     $index->{'domain'} = &Apache::loncoursedata::CL_SDOM();      $index->{'domain'} = &Apache::loncoursedata::CL_SDOM();
Line 1678  sub make_keylist_array { Line 2392  sub make_keylist_array {
     $index->{'email'} = &Apache::loncoursedata::CL_PERMANENTEMAIL();      $index->{'email'} = &Apache::loncoursedata::CL_PERMANENTEMAIL();
     $index->{'role'} = &Apache::loncoursedata::CL_ROLE();      $index->{'role'} = &Apache::loncoursedata::CL_ROLE();
     $index->{'extent'} = &Apache::loncoursedata::CL_EXTENT();      $index->{'extent'} = &Apache::loncoursedata::CL_EXTENT();
       $index->{'photo'} = &Apache::loncoursedata::CL_PHOTO();
       $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL();
       $index->{'credits'} = &Apache::loncoursedata::CL_CREDITS();
     foreach my $key (keys(%{$index})) {      foreach my $key (keys(%{$index})) {
         $keylist->[$index->{$key}] = $key;          $keylist->[$index->{$key}] = $key;
     }      }
Line 1726  sub process_date_info { Line 2443  sub process_date_info {
 }  }
   
 sub show_users_list {  sub show_users_list {
     my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist)=@_;      my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname,
           $showcredits)=@_;
       if ($formname eq '') {
           $formname = 'studentform';
       }
     #      #
     # Variables for excel output      # Variables for excel output
     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);      my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
Line 1738  sub show_users_list { Line 2459  sub show_users_list {
     my @sortable = ('username','domain','id','fullname','start','end','email','role');      my @sortable = ('username','domain','id','fullname','start','end','email','role');
     if ($context eq 'course') {      if ($context eq 'course') {
         push(@sortable,('section','groups','type'));          push(@sortable,('section','groups','type'));
           if ($showcredits) {
               push(@sortable,'credits');
           }
     } else {      } else {
         push(@sortable,'extent');          push(@sortable,'extent');
     }      }
     if (!grep(/^\Q$sortby\E$/,@sortable)) {      if ($mode eq 'pickauthor') {
           @sortable = ('username','fullname','email','status');
       }
       my %is_sortable;
       map { $is_sortable{$_} => 1; } @sortable;
       unless ($is_sortable{$sortby}) {
         $sortby = 'username';          $sortby = 'username';
     }      }
     my $setting = $env{'form.roleaction'};      my $setting = $env{'form.roletype'};
     my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers);      my ($cid,$cdom,$cnum,$classgroups,$crstype,$defaultcredits);
     if ($context eq 'course') {      if ($context eq 'course') {
         $cid=$env{'request.course.id'};          $cid = $env{'request.course.id'};
         $cdom = $env{'course.'.$cid.'.domain'};          $crstype = &Apache::loncommon::course_type();
         $cnum = $env{'course.'.$cid.'.num'};          ($cnum,$cdom) = &get_course_identity($cid);
           $defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'};
         ($classgroups) = &Apache::loncoursedata::get_group_memberships(          ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                      $userlist,$keylist,$cdom,$cnum);                                       $userlist,$keylist,$cdom,$cnum);
         if (! exists($env{'form.displayphotos'})) {          if ($mode eq 'autoenroll') {
             $env{'form.displayphotos'} = 'off';              $env{'form.showrole'} = 'st';
         }          } else {
         $displayphotos = $env{'form.displayphotos'};              if ($env{'course.'.$cid.'.internal.showphoto'}) {
         if (! exists($env{'form.displayclickers'})) {                  $r->print('
             $env{'form.displayclickers'} = 'off';  
         }  
         $displayclickers = $env{'form.displayclickers'};  
         if ($env{'course.'.$cid.'.internal.showphoto'}) {  
             $r->print('  
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function photowindow(photolink) {  function photowindow(photolink) {
     var title = "Photo_Viewer";      var title = "Photo_Viewer";
     var options = "scrollbars=1,resizable=1,menubar=0";      var options = "scrollbars=1,resizable=1,menubar=0";
Line 1770  function photowindow(photolink) { Line 2496  function photowindow(photolink) {
     stdeditbrowser = open(photolink,title,options,"1");      stdeditbrowser = open(photolink,title,options,"1");
     stdeditbrowser.focus();      stdeditbrowser.focus();
 }  }
   // ]]>
 </script>  </script>
            ');                 ');
               }
           }
       } elsif ($context eq 'domain') {
           if ($setting eq 'community') {
               $crstype = 'Community';
           } elsif ($setting eq 'course') {
               $crstype = 'Course';
         }          }
         $r->print(<<END);  
 <input type="hidden" name="displayphotos" value="$displayphotos" />  
 <input type="hidden" name="displayclickers" value="$displayclickers" />  
 END  
     }      }
     unless ($mode eq 'autoenroll') {      if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
         my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();          my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);
         my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");          my $verify_action_js = &bulkaction_javascript($formname);
         my $singconfirm = &mt(' for a single user');  
         my $multconfirm = &mt(' for multiple users');  
         my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);   
         $r->print(<<END);          $r->print(<<END);
   
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 $check_uncheck_js  // <![CDATA[
   
 function verify_action (field) {  $verify_action_js
     var numchecked = 0;  
     var singconf = '$singconfirm';  
     var multconf = '$multconfirm';  
     if (field.length > 0) {  
         for (i = 0; i < field.length; i++) {  
             if (field[i].checked == true) {  
                numchecked ++;  
             }  
         }  
     } else {  
         if (field.checked == true) {  
             numchecked ++;  
         }  
     }  
     if (numchecked == 0) {  
         alert("$alert");  
     }   
     else {  
         var message = document.studentform.bulkaction[document.studentform.bulkaction.selectedIndex].text;  
         if (numchecked == 1) {   
             message += singconf;  
         }   
         else {  
             message += multconf;   
         }  
         if (confirm(message)) {  
             document.studentform.phase.value = 'bulkchange';  
             document.studentform.submit();  
         }  
     }  
 }  
   
 function username_display_launch(username,domain) {  function username_display_launch(username,domain) {
     var target;      var target;
     for (var i=0; i<document.studentform.usernamelink.length; i++) {      for (var i=0; i<document.$formname.usernamelink.length; i++) {
         if (document.studentform.usernamelink[i].checked) {          if (document.$formname.usernamelink[i].checked) {
             target = document.studentform.usernamelink[i].value;              target = document.$formname.usernamelink[i].value;
         }          }
     }      }
     if (target == 'modify') {      if (target == 'modify') {
         document.studentform.srchterm.value=username;          if (document.$formname.userwin.checked == true) {
         document.studentform.srchdomain.value=domain;              var url = '/adm/createuser?srchterm='+username+'&srchdomain='+domain+'&phase=get_user_info&action=singleuser&srchin=dom&srchby=uname&srchtype=exact&popup=1';
         document.studentform.phase.value='get_user_info';              var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
         document.studentform.action.value = 'singleuser';              modifywin = window.open(url,'',options,1);
         document.studentform.submit();              modifywin.focus();
               return;
           } else {
               document.$formname.srchterm.value=username;
               document.$formname.srchdomain.value=domain;
               document.$formname.phase.value='get_user_info';
               document.$formname.action.value = 'singleuser';
               document.$formname.submit();
           }
     }      }
     else {      if (target == 'aboutme') {
         document.location.href = '/adm/'+domain+'/'+username+'/aboutme';          if (document.$formname.userwin.checked == true) {
               var url = '/adm/'+domain+'/'+username+'/aboutme?popup=1';
               var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
               aboutmewin = window.open(url,'',options,1);
               aboutmewin.focus();
               return;
           } else {
               document.location.href = '/adm/'+domain+'/'+username+'/aboutme';
           }
       }
       if (target == 'track') {
           if (document.$formname.userwin.checked == true) {
               var url = '/adm/trackstudent?selected_student='+username+':'+domain+'&only_body=1';
               var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
               var trackwin = window.open(url,'',options,1);
               trackwin.focus();
               return;
           } else {
               document.location.href = '/adm/trackstudent?selected_student='+username+':'+domain;
           }
     }      }
 }  }
   // ]]>
 </script>  </script>
 $date_sec_selector  $date_sec_selector
 <input type="hidden" name="state" value="$env{'form.state'}" />  <input type="hidden" name="state" value="$env{'form.state'}" />
Line 1848  END Line 2572  END
     $r->print(<<END);      $r->print(<<END);
 <input type="hidden" name="sortby" value="$sortby" />  <input type="hidden" name="sortby" value="$sortby" />
 END  END
       my @cols = &infocolumns($context,$mode,$showcredits);
     my %lt=&Apache::lonlocal::texthash(      my %coltxt = &get_column_names($context);
                        'username'   => "username",      my %acttxt = &Apache::lonlocal::texthash(
                        'domain'     => "domain",  
                        'id'         => 'ID',  
                        'fullname'   => "name",  
                        'section'    => "section",  
                        'groups'     => "active groups",  
                        'start'      => "start date",  
                        'end'        => "end date",  
                        'status'     => "status",  
                        'role'       => "role",  
                        'type'       => "enroll type/action",  
                        'email'      => "email address",  
                        'clicker'    => "clicker id",  
                        'photo'      => "photo",  
                        'extent'     => "extent",  
                        'pr'         => "Proceed",                         'pr'         => "Proceed",
                        'ca'         => "check all",  
                        'ua'         => "uncheck all",  
                        'ac'         => "Action to take for selected users",                         'ac'         => "Action to take for selected users",
                        'link'       => "Behavior of username links",                         'link'       => "Behavior of clickable username link for each user",
                        'aboutme'    => "Display a user's personal page",                         'aboutme'    => "Display a user's personal information page",
                          'owin'       => "Open in a new window",
                        'modify'     => "Modify a user's information",                         'modify'     => "Modify a user's information",
                          'track'      => "View a user's recent activity",
                       );                        );
     if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {      my %lt = (%coltxt,%acttxt);
         $lt{'extent'} = &mt('Course(s): description, section(s), status');  
     } elsif ($context eq 'construction_space') {  
         $lt{'extent'} = &mt('Author');   
     }  
     my @cols = ('username','domain','id','fullname');  
     if ($context eq 'course') {  
         push(@cols,'section');  
     }  
     if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) {   
         push(@cols,('start','end'));  
     }  
     if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {  
         push(@cols,'role');  
     }  
     if ($context eq 'domain' && ($env{'form.roletype'} eq 'construction_space' ||  
                                 $env{'form.roletype'} eq 'course')) {  
         push (@cols,'extent');  
     }  
     if (($statusmode eq 'Any') &&   
         (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {  
         push(@cols,'status');  
     }  
     if ($context eq 'course') {  
         push(@cols,'groups');  
     }  
     push(@cols,'email');  
   
     my $rolefilter = $env{'form.showrole'};      my $rolefilter = $env{'form.showrole'};
     if ($env{'form.showrole'} eq 'cr') {      if ($env{'form.showrole'} eq 'cr') {
         $rolefilter = &mt('custom');            $rolefilter = &mt('custom');  
     } elsif ($env{'form.showrole'} ne 'Any') {      } elsif ($env{'form.showrole'} ne 'Any') {
         $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'});          $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'},$crstype);
     }      }
     my $results_description = &results_header_row($rolefilter,$statusmode,      my $results_description;
                                                   $context);      if ($mode ne 'autoenroll') {
     $r->print('<b>'.$results_description.'</b><br />');          $results_description = &results_header_row($rolefilter,$statusmode,
     my ($output,$actionselect);                                                     $context,$permission,$mode,$crstype);
     if ($mode eq 'html' || $mode eq 'view') {          $r->print('<b>'.$results_description.'</b><br clear="all" />');
         if ($permission->{'cusr'}) {      }
             $actionselect = &select_actions($context,$setting,$statusmode);      my ($output,$actionselect,%canchange,%canchangesec);
         }      if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
         $r->print(<<END);          if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
               if ($permission->{'cusr'}) {
                   unless (($context eq 'domain') && 
                           (($setting eq 'course') || ($setting eq 'community'))) {
                       $actionselect = 
                           &select_actions($context,$setting,$statusmode,$formname);
                   }
               }
               $r->print(<<END);
 <input type="hidden" name="srchby"  value="uname" />  <input type="hidden" name="srchby"  value="uname" />
 <input type="hidden" name="srchin"   value="dom" />  <input type="hidden" name="srchin"   value="dom" />
 <input type="hidden" name="srchtype" value="exact" />  <input type="hidden" name="srchtype" value="exact" />
 <input type="hidden" name="srchterm" value="" />  <input type="hidden" name="srchterm" value="" />
 <input type="hidden" name="srchdomain" value="" />   <input type="hidden" name="srchdomain" value="" /> 
 END  END
          if ($mode ne 'autoenroll') {              if ($actionselect) {
              $output = '<p>';                  $output .= <<"END";
              my @linkdests = ('aboutme');  <div class="LC_left_float"><fieldset><legend>$lt{'ac'}</legend>
              if ($permission->{'cusr'}) {  $actionselect
                  push (@linkdests,'modify');  <br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> &nbsp;
                  $output .= '<span class="LC_nobreak">'.$lt{'link'}.':&nbsp;';  <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.$formname.actionlist)" /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action('actionlist')" /></fieldset></div>
                  my $usernamelink = $env{'form.usernamelink'};  
                  if ($usernamelink eq '') {  
                      $usernamelink = 'aboutme';  
                  }  
                  foreach my $item (@linkdests) {  
                      my $checkedstr = '';  
                      if ($item eq $usernamelink) {  
                          $checkedstr = ' checked="checked" ';  
                      }  
                      $output .= '<label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.'>&nbsp;'.$lt{$item}.'</label>&nbsp;&nbsp;';  
                  }  
                  $output .= '</span><br />';  
              } else {  
                  $output .= &mt("Click on a username to view the user's personal page.").'<br />';  
              }  
              if ($actionselect) {  
                  $output .= <<"END";   
 $lt{'ac'}:&nbsp;$actionselect <input type="button" value="$lt{'pr'}" onclick="javascript:verify_action(document.studentform.actionlist)" /></p>  
 <p><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.actionlist)" /> &nbsp;  
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.actionlist)" />  
 END  END
              }                  my @allroles;
                   if ($env{'form.showrole'} eq 'Any') {
                       my $custom = 1;
                       if ($context eq 'domain') {
                           @allroles = &roles_by_context($setting,$custom,$crstype);
                       } else {
                           @allroles = &roles_by_context($context,$custom,$crstype);
                       }
                   } else {
                       @allroles = ($env{'form.showrole'});
                   }
                   foreach my $role (@allroles) {
                       if ($context eq 'domain') {
                           if ($setting eq 'domain') {
                               if (&Apache::lonnet::allowed('c'.$role,
                                       $env{'request.role.domain'})) {
                                   $canchange{$role} = 1;
                               }
                           } elsif ($setting eq 'author') {
                               if (&Apache::lonnet::allowed('c'.$role,
                                       $env{'request.role.domain'})) {
                                   $canchange{$role} = 1;
                               }
                           }
                       } elsif ($context eq 'author') {
                           if (&Apache::lonnet::allowed('c'.$role,
                               $env{'user.domain'}.'/'.$env{'user.name'})) {
                               $canchange{$role} = 1;
                           }
                       } elsif ($context eq 'course') {
                           if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
                               $canchange{$role} = 1;
                           } elsif ($env{'request.course.sec'} ne '') {
                               if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
                                   $canchangesec{$role} = $env{'request.course.sec'};
                               }
                           } elsif ((($role eq 'co') && ($crstype eq 'Community')) ||
                                    (($role eq 'cc') && ($crstype eq 'Course'))) {
                               if (&is_courseowner($env{'request.course.id'},
                                                   $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) {
                                   $canchange{$role} = 1;
                               }
                           }
                       }
                   }
               }
               $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'.
                          '<table><tr>';
               my @linkdests = ('aboutme');
               if ($permission->{'cusr'}) {
                   unshift (@linkdests,'modify');
               }
               if (&Apache::lonnet::allowed('vsa', $env{'request.course.id'}) ||
                   &Apache::lonnet::allowed('vsa', $env{'request.course.id'}.'/'.
                                            $env{'request.course.sec'})) {
                   push(@linkdests,'track');
               }
   
               $output .= '<td>';
               my $usernamelink = $env{'form.usernamelink'};
               if ($usernamelink eq '') {
                   $usernamelink = 'aboutme';
               }
               foreach my $item (@linkdests) {
                   my $checkedstr = '';
                   if ($item eq $usernamelink) {
                       $checkedstr = ' checked="checked"';
                   }
                   $output .= '<span class="LC_nobreak"><label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.' />&nbsp;'.$lt{$item}.'</label></span><br />';
               }
               my $checkwin;
               if ($env{'form.userwin'}) {
                   $checkwin = ' checked="checked"';
               }
               $output .=
                   '</td><td valign="top"  style="border-left: 1px solid;">'
                  .'<span class="LC_nobreak"><label>'
                  .'<input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}
                  .'</label></span></td></tr></table></fieldset></div>';
         }          }
         $output .= "\n<p>\n".          $output .= "\n".'<br clear="all" />'."\n".
                   &Apache::loncommon::start_data_table().                    &Apache::loncommon::start_data_table().
                   &Apache::loncommon::start_data_table_header_row();                    &Apache::loncommon::start_data_table_header_row();
         if ($mode eq 'autoenroll') {          if ($mode eq 'autoenroll') {
             $output .= "              $output .= "
  <th><a href=\"javascript:document.studentform.sortby.value='type';document.studentform.submit();\">$lt{'type'}</a></th>   <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>
             ";              ";
         } else {          } else {
             $output .= "\n".'<th>'.&mt('Count').'</th>'."\n";              $output .= "\n".'<th>&nbsp;</th>'."\n";
             if ($actionselect) {              if ($actionselect) {
                 $output .= '<th>'.&mt('Select').'</th>'."\n";                  $output .= '<th>'.&mt('Select').'</th>'."\n";
             }              }
         }          }
         foreach my $item (@cols) {          foreach my $item (@cols) {
             $output .= "<th><a href=\"javascript:document.studentform.sortby.value='$item';document.studentform.submit();\">$lt{$item}</a></th>\n";              $output .= "<th>";
         }              if ($is_sortable{$item}) {
         my %role_types = &role_type_names();                  $output .= "<a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a>";
         if ($context eq 'course') {              } else {
             if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {                  $output .= $lt{$item};
                 # Clicker display on or off?  
                 my %clicker_options = &Apache::lonlocal::texthash(  
                                                             'on' => 'Show',  
                                                             'off' => 'Hide',  
                                                            );  
                 my $clickerchg = 'on';  
                 if ($displayclickers eq 'on') {  
                     $clickerchg = 'off';  
                 }  
                 $output .= '    <th>'."\n".'     '.  
                     '<a href="javascript:document.studentform.displayclickers.value='.  
                       "'".$clickerchg."'".';document.studentform.submit();">'.  
                       $clicker_options{$clickerchg}.'</a>&nbsp;'.$lt{'clicker'}."\n".  
                       '    </th>'."\n";  
   
                 # Photo display on or off?  
                 if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {  
                     my %photo_options = &Apache::lonlocal::texthash(  
                                                             'on' => 'Show',  
                                                             'off' => 'Hide',  
                                                                 );  
                     my $photochg = 'on';  
                     if ($displayphotos eq 'on') {  
                         $photochg = 'off';  
                     }  
                     $output .= '    <th>'."\n".'     '.  
                 '<a href="javascript:document.studentform.displayphotos.value='.  
                       "'".$photochg."'".';document.studentform.submit();">'.  
                       $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".  
                       '    </th>'."\n";  
                 }  
             }              }
             $output .= &Apache::loncommon::end_data_table_header_row();              $output .= "</th>\n";
         }          }
           my %role_types = &role_type_names();
           $output .= &Apache::loncommon::end_data_table_header_row();
 # Done with the HTML header line  # Done with the HTML header line
     } elsif ($mode eq 'csv') {      } elsif ($mode eq 'csv') {
         #          #
Line 2013  END Line 2733  END
                        time.'_'.rand(1000000000).'.csv';                         time.'_'.rand(1000000000).'.csv';
         unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {          unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
             $r->log_error("Couldn't open $CSVfilename for output $!");              $r->log_error("Couldn't open $CSVfilename for output $!");
             $r->print("Problems occured in writing the csv file.  ".              $r->print(
                       "This error has been logged.  ".                  '<p class="LC_error">'
                       "Please alert your LON-CAPA administrator.");                 .&mt('Problems occurred in writing the CSV file.')
                  .' '.&mt('This error has been logged.')
                  .' '.&mt('Please alert your LON-CAPA administrator.')
                  .'</p>'
               );
             $CSVfile = undef;              $CSVfile = undef;
         }          }
         #          #
Line 2023  END Line 2747  END
         print $CSVfile '"'.$results_description.'"'."\n";           print $CSVfile '"'.$results_description.'"'."\n"; 
         print $CSVfile '"'.join('","',map {          print $CSVfile '"'.join('","',map {
             &Apache::loncommon::csv_translate($lt{$_})              &Apache::loncommon::csv_translate($lt{$_})
             } (@cols)).'"'."\n";              } (@cols))."\"\n";
     } elsif ($mode eq 'excel') {      } elsif ($mode eq 'excel') {
         # Create the excel spreadsheet          # Create the excel spreadsheet
         ($excel_workbook,$excel_filename,$format) =          ($excel_workbook,$excel_filename,$format) =
Line 2033  END Line 2757  END
         $excel_sheet->write($row++,0,$results_description,$format->{'h2'});          $excel_sheet->write($row++,0,$results_description,$format->{'h2'});
         #          #
         my @colnames = map {$lt{$_}} (@cols);          my @colnames = map {$lt{$_}} (@cols);
   
         $excel_sheet->write($row++,0,\@colnames,$format->{'bold'});          $excel_sheet->write($row++,0,\@colnames,$format->{'bold'});
     }      }
   
 # Done with header lines in all formats  # Done with header lines in all formats
   
     my %index;      my %index;
     my $i;      my $i;
     foreach my $idx (@$keylist) {      foreach my $idx (@$keylist) {
         $index{$idx} = $i++;          $index{$idx} = $i++;
     }      }
     my $usercount = 0;      my $usercount = 0;
       my ($secfilter,$grpfilter);
       if ($context eq 'course') {
           $secfilter = $env{'form.secfilter'};
           $grpfilter = $env{'form.grpfilter'};
           if ($secfilter eq '') {
               $secfilter = 'all';
           }
           if ($grpfilter eq '') {
               $grpfilter = 'all';
           }
       }
       my %ltstatus = &Apache::lonlocal::texthash(
                                                   Active  => 'Active',
                                                   Future  => 'Future',
                                                   Expired => 'Expired',
                                                  );
       # If this is for a single course get last course "log-in".
       my %crslogins;
       if ($context eq 'course') {
           %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum);
       }
     # Get groups, role, permanent e-mail so we can sort on them if      # Get groups, role, permanent e-mail so we can sort on them if
     # necessary.      # necessary.
     foreach my $user (keys(%{$userlist})) {      foreach my $user (keys(%{$userlist})) {
           if ($user eq '' ) {
               delete($userlist->{$user});
               next;
           }
         if ($context eq 'domain' &&  $user eq $env{'request.role.domain'}.'-domainconfig:'.$env{'request.role.domain'}) {          if ($context eq 'domain' &&  $user eq $env{'request.role.domain'}.'-domainconfig:'.$env{'request.role.domain'}) {
             delete($userlist->{$user});              delete($userlist->{$user});
             next;              next;
Line 2065  END Line 2814  END
                     delete($userlist->{$user});                      delete($userlist->{$user});
                     next;                      next;
                 }                  }
             } elsif ($env{'form.roletype'} eq 'construction_space') {              } elsif ($env{'form.roletype'} eq 'author') {
                 ($uname,$udom,$role) = split(/:/,$user,-1);                  ($uname,$udom,$role) = split(/:/,$user,-1);
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif (($env{'form.roletype'} eq 'course') || 
                        ($env{'form.roletype'} eq 'community')) {
                 ($uname,$udom,$role) = split(/:/,$user);                  ($uname,$udom,$role) = split(/:/,$user);
             }              }
         } else {          } else {
Line 2081  END Line 2831  END
             delete($userlist->{$user});              delete($userlist->{$user});
             next;              next;
         }          }
         if (ref($classgroups) eq 'HASH') {          if ($context eq 'course') {
             $groups = $classgroups->{$user};              my @ac_groups;
         }              if (ref($classgroups) eq 'HASH') {
         if (ref($groups->{active}) eq 'HASH') {                  $groups = $classgroups->{$user};
             $userlist->{$user}->[$index{'groups'}] = join(', ',keys(%{$groups->{'active'}}));              }
               if (ref($groups->{'active'}) eq 'HASH') {
                   @ac_groups = keys(%{$groups->{'active'}});
                   $userlist->{$user}->[$index{'groups'}] = join(', ',@ac_groups);
               }
               if ($mode ne 'autoenroll') {
                   my $section = $userlist->{$user}->[$index{'section'}];
                   if (($env{'request.course.sec'} ne '') && 
                       ($section ne $env{'request.course.sec'})) {
                       if ($role eq 'st') {
                           delete($userlist->{$user});
                           next;
                       }
                   }
                   if ($secfilter eq 'none') {
                       if ($section ne '') {
                           delete($userlist->{$user});
                           next;
                       }
                   } elsif ($secfilter ne 'all') {
                       if ($section ne $secfilter) {
                           delete($userlist->{$user});
                           next;
                       }
                   }
                   if ($grpfilter eq 'none') {
                       if (@ac_groups > 0) {
                           delete($userlist->{$user});
                           next;
                       }
                   } elsif ($grpfilter ne 'all') {
                       if (!grep(/^\Q$grpfilter\E$/,@ac_groups)) {
                           delete($userlist->{$user});
                           next;
                       }
                   }
                   if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
                       if ((grep/^photo$/,@cols) && ($role eq 'st')) {
                           $userlist->{$user}->[$index{'photo'}] =
                               &Apache::lonnet::retrievestudentphoto($udom,$uname,'jpg');
                           $userlist->{$user}->[$index{'thumbnail'}] =
                               &Apache::lonnet::retrievestudentphoto($udom,$uname,
                                                                   'gif','thumbnail');
                       }
                   }
                   if (($role eq 'st') && ($defaultcredits)) {
                       if ($userlist->{$user}->[$index{'credits'}] eq '') {
                           $userlist->{$user}->[$index{'credits'}] = $defaultcredits;
                       }
                   }
               }
         }          }
         my %emails   = &Apache::loncommon::getemails($uname,$udom);          my %emails   = &Apache::loncommon::getemails($uname,$udom);
         if ($emails{'permanentemail'} =~ /\S/) {          if ($emails{'permanentemail'} =~ /\S/) {
Line 2125  END Line 2925  END
         foreach my $item (@{$keylist}) {          foreach my $item (@{$keylist}) {
             $in{$item} = $sdata->[$index{$item}];              $in{$item} = $sdata->[$index{$item}];
         }          }
         my $role = $in{'role'};          my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
         $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]);           if ($clickers!~/\w/) { $clickers='-'; }
         if (! defined($in{'start'}) || $in{'start'} == 0) {          $in{'clicker'} = $clickers; 
             $in{'start'} = &mt('none');   my $role = $in{'role'};
         } else {          $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype);
             $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});          unless ($mode eq 'excel') {
               if (! defined($in{'start'}) || $in{'start'} == 0) {
                   $in{'start'} = &mt('none');
               } else {
                   $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});
               }
               if (! defined($in{'end'}) || $in{'end'} == 0) {
                   $in{'end'} = &mt('none');
               } else {
                   $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
               }
         }          }
         if (! defined($in{'end'}) || $in{'end'} == 0) {          if ($context eq 'course') {
             $in{'end'} = &mt('none');              my $lastlogin = $crslogins{$in{'username'}.':'.$in{'domain'}.':'.$in{'section'}.':'.$role};
         } else {              if ($lastlogin ne '') {
             $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});                  $in{'lastlogin'} = &Apache::lonlocal::locallocaltime($lastlogin);
               }
         }          }
         if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {          if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
             $r->print(&Apache::loncommon::start_data_table_row());              $r->print(&Apache::loncommon::start_data_table_row());
             $r->print("<td>$rowcount</td>\n");  
             my $checkval;              my $checkval;
             if ($mode ne 'autoenroll' && $actionselect) {              if ($mode eq 'autoenroll') {
                 $checkval = $user;                   my $cellentry;
                 if ($context eq 'course') {                  if ($in{'type'} eq 'auto') {
                     if ($role eq 'st') {                      $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label>';
                         $checkval .= ':st';                      $autocount ++;
                   } else {
                       $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label></span></td></tr><tr><td><span class="LC_nobreak">';
                       $manualcount ++;
                       if ($in{'lockedtype'}) {
                           $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Unlock').'</label>';
                           $unlockcount ++;
                       } else {
                           $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Lock').'</label>';
                           $lockcount ++;
                     }                      }
                     $checkval .= ':'.$in{'section'};                      $cellentry .= '</span></td></tr></table>';
                     if ($role eq 'st') {                  }
                         $checkval .= ':'.$in{'type'}.':'.$in{'lockedtype'};                  $r->print("<td>$cellentry</td>\n");
               } else {
                   if ($mode ne 'pickauthor') {  
                       $r->print("<td>$rowcount</td>\n");
                   }
                   if ($actionselect) {
                       my $showcheckbox;
                       if ($role =~ /^cr\//) {
                           $showcheckbox = $canchange{'cr'};
                       } else {
                           $showcheckbox = $canchange{$role};
                       }
                       if (!$showcheckbox) {
                           if ($context eq 'course') {
                               if ($canchangesec{$role} ne '') {
                                   if ($canchangesec{$role} eq $in{'section'}) {
                                       $showcheckbox = 1;
                                   }
                               }
                           }
                     }                      }
                       if ($showcheckbox) {
                           $checkval = $user; 
                           if ($context eq 'course') {
                               if (($role eq 'co' || $role eq 'cc') &&
                                   ($user =~ /^\Q$env{'user.name'}:$env{'user.domain'}:$role\E/)) {
                                   $showcheckbox = 0;
                               } else {
                                   if ($role eq 'st') {
                                       $checkval .= ':st';
                                   }
                                   $checkval .= ':'.$in{'section'};
                                   if ($role eq 'st') {
                                       $checkval .= ':'.$in{'type'}.':'.
                                                    $in{'lockedtype'}.':'.
                                                    $in{'credits'};
                                   }
                                }
                           }
                           if ($showcheckbox) {
                               $r->print('<td><input type="checkbox" name="'.
                                         'actionlist" value="'.$checkval.'" /></td>');
                           } else {
                               $r->print('<td>&nbsp;</td>');
                           }
                       } else {
                           $r->print('<td>&nbsp;</td>');
                       }
                   } elsif ($mode eq 'pickauthor') {
                           $r->print('<td><input type="button" name="chooseauthor" onclick="javascript:gochoose('."'$in{'username'}'".');" value="'.&mt('Select').'" /></td>');
                 }                  }
                 $r->print('<td><input type="checkbox" name="actionlist" value="'.  
                           $checkval.'"></td>');  
             }              }
             foreach my $item (@cols) {              foreach my $item (@cols) {
                 if ($item eq 'username') {                  if ($item eq 'username') {
                     $r->print('<td>'.&print_username_link($permission,\%in).'</td>');                      $r->print('<td>'.&print_username_link($mode,\%in).'</td>');
                 } elsif (($item eq 'start' || $item eq 'end') && ($mode ne 'autoeroll') && ($actionselect)) {                  } elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) {
                     $r->print('<td>'.$in{$item}.'<input type="hidden" name="'.$checkval.'_'.$item.'" value="'.$sdata->[$index{$item}].'" /></td>'."\n");                      $r->print('<td>'.$in{$item}.'<input type="hidden" name="'.$checkval.'_'.$item.'" value="'.$sdata->[$index{$item}].'" /></td>'."\n");
                 } else {                  } elsif ($item eq 'status') {
                     $r->print('<td>'.$in{$item}.'</td>'."\n");                      my $showitem = $in{$item};
                 }                      if (defined($ltstatus{$in{$item}})) {
             }                          $showitem = $ltstatus{$in{$item}};
             if ($context eq 'course') {  
                 if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {  
                     if ($displayclickers eq 'on') {  
                         my $clickers =  
                    (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];  
                         if ($clickers!~/\w/) { $clickers='-'; }  
                         $r->print('<td>'.$clickers.'</td>');  
                     } else {  
                         $r->print('    <td>&nbsp;</td>  ');  
                     }                      }
                     if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {                      $r->print('<td>'.$showitem.'</td>'."\n");
                         if ($displayphotos eq 'on' && $sdata->[$index{'role'}] eq 'st') {                  } elsif ($item eq 'photo') {
                             my $imgurl =                       if (($context eq 'course') && ($mode ne 'autoenroll') && 
                         &Apache::lonnet::retrievestudentphoto($in{'domain'},$in{'username'},                           ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) { 
                                                           'gif','thumbnail');                           if ($role eq 'st') {
                             $r->print('    <td align="right"><a href="javascript:photowindow('."'".&Apache::lonnet::studentphoto($in{'domain'},$in{'username'},'jpg')."'".')"><img src="'.$imgurl.'" border="1"></a></td>');                               $r->print('<td align="right"><a href="javascript:photowindow('."'".$in{'photo'}."'".')"><img src="'.$in{'thumbnail'}.'" border="1" alt="" /></a></td>');
                            } else {
                                $r->print('<td>&nbsp;</td>');
                            }
                        }
                   } elsif ($item eq 'clicker') {
                       if (($context eq 'course') && ($mode ne 'autoenroll')) {
                           if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
                               my $clickers =
                      (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
                               if ($clickers!~/\w/) { $clickers='-'; }
                               $r->print('<td>'.$clickers.'</td>');
                         } else {                          } else {
                             $r->print('    <td>&nbsp;</td>  ');                               $r->print('<td>&nbsp;</td>'."\n");
                         }                          } 
                     }                      }
                   } else {
                       $r->print('<td>'.$in{$item}.'</td>'."\n");
                 }                  }
             }              }
             $r->print(&Apache::loncommon::end_data_table_row());              $r->print(&Apache::loncommon::end_data_table_row());
         } elsif ($mode eq 'csv') {          } elsif ($mode eq 'csv') {
             next if (! defined($CSVfile));              next if (! defined($CSVfile));
             # no need to bother with $linkto              # no need to bother with $linkto
             if (! defined($in{'start'}) || $in{'start'} == 0) {  
                 $in{'start'} = &mt('none');  
             } else {  
                 $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});  
             }  
             if (! defined($in{'end'}) || $in{'end'} == 0) {  
                 $in{'end'} = &mt('none');  
             } else {  
                 $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});  
             }  
             my @line = ();              my @line = ();
             foreach my $item (@cols) {              foreach my $item (@cols) {
                 push @line,&Apache::loncommon::csv_translate($in{$item});                  push @line,&Apache::loncommon::csv_translate($in{$item});
             }              }
             print $CSVfile '"'.join('","',@line).'"'."\n";              print $CSVfile '"'.join('","',@line)."\"\n";
         } elsif ($mode eq 'excel') {          } elsif ($mode eq 'excel') {
             my $col = 0;              my $col = 0;
             foreach my $item (@cols) {              foreach my $item (@cols) {
                 if ($item eq 'start' || $item eq 'end') {                  if ($item eq 'start' || $item eq 'end') {
                     if (defined($item) && $item != 0) {                      if ((defined($in{$item})) && ($in{$item} != 0)) {
                         $excel_sheet->write($row,$col++,                          $excel_sheet->write($row,$col++,
                             &Apache::lonstathelpers::calc_serial($in{item}),                              &Apache::lonstathelpers::calc_serial($in{$item}),
                                     $format->{'date'});                                      $format->{'date'});
                     } else {                      } else {
                         $excel_sheet->write($row,$col++,'none');                          $excel_sheet->write($row,$col++,'none');
Line 2223  END Line 3082  END
             $row++;              $row++;
         }          }
     }      }
     if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {      if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
             $r->print(&Apache::loncommon::end_data_table().'<br />');              $r->print(&Apache::loncommon::end_data_table().'<br />');
     } elsif ($mode eq 'excel') {      } elsif ($mode eq 'excel') {
         $excel_workbook->close();          $excel_workbook->close();
         $r->print('<p><a href="'.$excel_filename.'">'.   $r->print(&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<p><a href="'.$excel_filename.'">','</a>')."</p>\n");
                   &mt('Your Excel spreadsheet').'</a> '.&mt('is ready for download').'.</p>'."\n");  
     } elsif ($mode eq 'csv') {      } elsif ($mode eq 'csv') {
         close($CSVfile);          close($CSVfile);
         $r->print('<a href="'.$CSVfilename.'">'.   $r->print(&mt('[_1]Your CSV file[_2] is ready for download.', '<p><a href="'.$CSVfilename.'">','</a>')."</p>\n");
                   &mt('Your CSV file').'</a> is ready for download.'.  
                   "\n");  
         $r->rflush();          $r->rflush();
     }      }
     if ($mode eq 'autoenroll') {      if ($mode eq 'autoenroll') {
Line 2243  END Line 3099  END
     }      }
 }  }
   
   sub bulkaction_javascript {
       my ($formname,$caller) = @_;
       my $docstart = 'document';
       if ($caller eq 'popup') {
           $docstart = 'opener.document';
       }
       my %lt = &Apache::lonlocal::texthash(
                 acwi => 'Access will be set to start immediately',
                 asyo => 'as you did not select an end date in the pop-up window',
                 accw => 'Access will be set to continue indefinitely',
                 asyd => 'as you did not select an end date in the pop-up window',
                 sewi => "Sections will be switched to 'No section'",
                 ayes => "as you either selected the 'No section' option",
                 oryo => 'or you did not select a section in the pop-up window',
                 arol => 'A role with no section will be added',
                 swbs => 'Sections will be switched to:',
                 rwba => 'Roles will be added for section(s):',
               );
       my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");
       my $noaction = &mt("You need to select an action to take for the user(s) you have selected"); 
       my $singconfirm = &mt(' for a single user?');
       my $multconfirm = &mt(' for multiple users?');
       my $output = <<"ENDJS";
   function verify_action (field) {
       var numchecked = 0;
       var singconf = '$singconfirm';
       var multconf = '$multconfirm';
       if ($docstart.$formname.elements[field].length > 0) {
           for (i=0; i<$docstart.$formname.elements[field].length; i++) {
               if ($docstart.$formname.elements[field][i].checked == true) {
                  numchecked ++;
               }
           }
       } else {
           if ($docstart.$formname.elements[field].checked == true) {
               numchecked ++;
           }
       }
       if (numchecked == 0) {
           alert("$alert");
           return;
       } else {
           var message = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].text;
           var choice = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].value;
           if (choice == '') {
               alert("$noaction");
               return;
           } else {
               if (numchecked == 1) {
                   message += singconf;
               } else {
                   message += multconf;
               }
   ENDJS
       if ($caller ne 'popup') {
           $output .= <<"NEWWIN";
               if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate' || choice == 'chgsec') {
                   opendatebrowser(document.$formname,'$formname','go');
                   return;
   
               } else {
                   if (confirm(message)) {
                       document.$formname.phase.value = 'bulkchange';
                       document.$formname.submit();
                       return;
                   }
               }
   NEWWIN
       } else {
           $output .= <<"POPUP";
               if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate') {
                   var datemsg = '';
                   if (($docstart.$formname.startdate_month.value == '') &&
                       ($docstart.$formname.startdate_day.value  == '') &&
                       ($docstart.$formname.startdate_year.value == '')) {
                       datemsg = "\\n$lt{'acwi'},\\n$lt{'asyo'}.\\n";
                   }
                   if (($docstart.$formname.enddate_month.value == '') &&
                       ($docstart.$formname.enddate_day.value  == '') &&
                       ($docstart.$formname.enddate_year.value == '')) {
                       datemsg += "\\n$lt{'accw'},\\n$lt{'asyd'}.\\n";
                   }
                   if (datemsg != '') {
                       message += "\\n"+datemsg;
                   }
               }
               if (choice == 'chgsec') {
                   var rolefilter = $docstart.$formname.showrole.options[$docstart.$formname.showrole.selectedIndex].value;
                   var retained =  $docstart.$formname.retainsec.value;
                   var secshow = $docstart.$formname.newsecs.value;
                   if (secshow == '') {
                       if (rolefilter == 'st' || retained == 0 || retained == "") {
                           message += "\\n\\n$lt{'sewi'},\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
                       } else {
                           message += "\\n\\n$lt{'arol'}\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
                       }
                   } else {
                       if (rolefilter == 'st' || retained == 0 || retained == "") {
                           message += "\\n\\n$lt{'swbs'} "+secshow+".\\n";
                       } else {
                           message += "\\n\\n$lt{'rwba'} "+secshow+".\\n";
                       }
                   }
               }
               if (confirm(message)) {
                   $docstart.$formname.phase.value = 'bulkchange';
                   $docstart.$formname.submit();
                   window.close();
               }
   POPUP
       }
       $output .= '
           }
       }
   }
   ';
       return $output;
   }
   
 sub print_username_link {  sub print_username_link {
     my ($permission,$in) = @_;      my ($mode,$in) = @_;
     my $output;      my $output;
     if (!$permission->{'cusr'}) {      if ($mode eq 'autoenroll') {
         $output = &Apache::loncommon::aboutmewrapper($in->{'username'},          $output = $in->{'username'};
                                                      $in->{'username'},  
                                                      $in->{'domain'});  
     } else {      } else {
         $output = '<a href="javascript:username_display_launch('.          $output = '<a href="javascript:username_display_launch('.
                   "'$in->{'username'}','$in->{'domain'}'".')" />'.                    "'$in->{'username'}','$in->{'domain'}'".')">'.
                   $in->{'username'}.'</a>';                    $in->{'username'}.'</a>';
     }      }
     return $output;      return $output;
Line 2260  sub print_username_link { Line 3233  sub print_username_link {
   
 sub role_type_names {  sub role_type_names {
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                          'domain'             => 'Domain Roles',                           'domain' => 'Domain Roles',
                          'construction_space' => 'Co-Author Roles',                           'author' => 'Co-Author Roles',
                          'course'             => 'Course Roles',                           'course' => 'Course Roles',
                            'community' => 'Community Roles',
              );               );
     return %lt;      return %lt;
 }  }
   
 sub select_actions {  sub select_actions {
     my ($context,$setting,$statusmode) = @_;      my ($context,$setting,$statusmode,$formname) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 revoke   => "Revoke user roles",                  revoke   => "Revoke user roles",
                 delete   => "Delete user roles",                  delete   => "Delete user roles",
Line 2277  sub select_actions { Line 3251  sub select_actions {
                 chgdates  => "Change starting/ending dates",                  chgdates  => "Change starting/ending dates",
                 chgsec   => "Change section associated with user roles",                  chgsec   => "Change section associated with user roles",
     );      );
       # FIXME Add an option to change credits for student roles.
     my ($output,$options,%choices);      my ($output,$options,%choices);
       # FIXME Disable actions for now for roletype=course in domain context
       if ($context eq 'domain' && $setting eq 'course') {
           return;
       }
       if ($context eq 'course') {
           if ($env{'form.showrole'} ne 'Any') {
               my $showactions;
               if (&Apache::lonnet::allowed('c'.$env{'form.showrole'},
                                             $env{'request.course.id'})) {
                   $showactions = 1;  
               } elsif ($env{'request.course.sec'} ne '') {
                   if (&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
                       $showactions = 1;
                   }
               }
               unless ($showactions) {
                   unless (&is_courseowner($env{'request.course.id'},
                                          $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) {
                       return; 
                   }
               }
           }
       }
     if ($statusmode eq 'Any') {      if ($statusmode eq 'Any') {
         $options .= '          $options .= '
 <option value="chgdates">'.$lt{'chgdates'}.'</option>';  <option value="chgdates">'.$lt{'chgdates'}.'</option>';
         $choices{'dates'} = 1;          $choices{'dates'} = 1;
     } else {      } else {
         if ($statusmode eq 'Active' || $statusmode eq 'Future') {  
             $options .= '  
 <option value="revoke">'.$lt{'revoke'}.'</option>';  
         }  
         if ($statusmode eq 'Future') {          if ($statusmode eq 'Future') {
             $options .= '              $options .= '
 <option value="activate">'.$lt{'activate'}.'</option>';  <option value="activate">'.$lt{'activate'}.'</option>';
Line 2296  sub select_actions { Line 3290  sub select_actions {
 <option value="reenable">'.$lt{'reenable'}.'</option>';  <option value="reenable">'.$lt{'reenable'}.'</option>';
             $choices{'dates'} = 1;              $choices{'dates'} = 1;
         }          }
           if ($statusmode eq 'Active' || $statusmode eq 'Future') {
               $options .= '
   <option value="chgdates">'.$lt{'chgdates'}.'</option>
   <option value="revoke">'.$lt{'revoke'}.'</option>';
               $choices{'dates'} = 1;
           }
     }      }
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $options .= '          $options .= '
 <option value="delete">'.$lt{'delete'}.'</option>';  <option value="delete">'.$lt{'delete'}.'</option>';
     }      }
     if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) {      if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) {
         if ($statusmode ne 'Expired') {          if (($statusmode ne 'Expired') && ($env{'request.course.sec'} eq '')) {
             $options .= '              $options .= '
 <option value="chgsec">'.$lt{'chgsec'}.'</option>';  <option value="chgsec">'.$lt{'chgsec'}.'</option>';
             $choices{'sections'} = 1;              $choices{'sections'} = 1;
         }          }
     }      }
     if ($options) {      if ($options) {
         $output = '<select name="bulkaction" onchange="javascript:opendatebrowser(this.form,'."'studentform'".')" />'."\n".          $output = '<select name="bulkaction">'."\n".
                   '<option value="" selected="selected">'.                    '<option value="" selected="selected">'.
                   &mt('Please select').'</option>'."\n".$options."\n".'</select>';                    &mt('Please select').'</option>'."\n".$options."\n".'</select>';
         if ($choices{'dates'}) {          if ($choices{'dates'}) {
Line 2325  sub select_actions { Line 3325  sub select_actions {
                 '<input type="hidden" name="enddate_year" value="" />'."\n".                  '<input type="hidden" name="enddate_year" value="" />'."\n".
                 '<input type="hidden" name="enddate_hour" value="" />'."\n".                  '<input type="hidden" name="enddate_hour" value="" />'."\n".
                 '<input type="hidden" name="enddate_minute" value="" />'."\n".                  '<input type="hidden" name="enddate_minute" value="" />'."\n".
                 '<input type="hidden" name="enddate_second" value="" />'."\n";                  '<input type="hidden" name="enddate_second" value="" />'."\n".
                   '<input type="hidden" name="no_end_date" value="" />'."\n";
             if ($context eq 'course') {              if ($context eq 'course') {
                 $output .= '<input type="hidden" name="makedatesdefault" value="" />'."\n";                  $output .= '<input type="hidden" name="makedatesdefault" value="" />'."\n";
             }              }
         }          }
         if ($choices{'sections'}) {          if ($choices{'sections'}) {
             $output .= '<input type="hidden" name="retainsec" value= "" />'."\n".              $output .= '<input type="hidden" name="retainsec" value="" />'."\n".
                        '<input type="hidden" name="newsecs" value= "" />'."\n";                         '<input type="hidden" name="newsecs" value="" />'."\n";
         }          }
     }      }
     return $output;      return $output;
Line 2340  sub select_actions { Line 3341  sub select_actions {
   
 sub date_section_javascript {  sub date_section_javascript {
     my ($context,$setting) = @_;      my ($context,$setting) = @_;
     my $title;      my $title = 'Date_And_Section_Selector';
     if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course'))  {      my %nopopup = &Apache::lonlocal::texthash (
         $title = &mt('Date and Section selector');          revoke => "Check the boxes for any users for whom roles are to be revoked, and click 'Proceed'",
     } else {          delete => "Check the boxes for any users for whom roles are to be deleted, and click 'Proceed'",
         $title = &mt('Date selector');          none   => "Choose an action to take for selected users",
     }      );  
     my $output = '      my $output = <<"ENDONE";
 <script type="text/javascript">  <script type="text/javascript">
     var stdeditbrowser;'."\n";  // <![CDATA[
     $output .= <<"ENDONE";      function opendatebrowser(callingform,formname,calledby) {
     function opendatebrowser(callingform,formname) {  
         var bulkaction = callingform.bulkaction.options[callingform.bulkaction.selectedIndex].value;          var bulkaction = callingform.bulkaction.options[callingform.bulkaction.selectedIndex].value;
         if (bulkaction == 'revoke' || bulkaction == 'delete' || bulkaction == '') {  
             return;  
         }  
         var url = '/adm/createuser?';          var url = '/adm/createuser?';
         var type = '';          var type = '';
         var showrole = callingform.showrole.options[callingform.showrole.selectedIndex].value;          var showrole = callingform.showrole.options[callingform.showrole.selectedIndex].value;
Line 2375  ENDONE Line 3372  ENDONE
         stdeditbrowser = open(url,title,options,'1');          stdeditbrowser = open(url,title,options,'1');
         stdeditbrowser.focus();          stdeditbrowser.focus();
     }      }
   // ]]>
 </script>  </script>
 ENDTWO  ENDTWO
     return $output;      return $output;
 }  }
   
 sub date_section_selector {  sub date_section_selector {
     my ($context) = @_;      my ($context,$permission,$crstype,$showcredits) = @_;
     my $callingform = $env{'form.callingform'};      my $callingform = $env{'form.callingform'};
     my $formname = 'dateselect';        my $formname = 'dateselect';  
     my $groupslist = &get_groupslist();      my $groupslist = &get_groupslist();
     my $sec_js = &setsections_javascript($formname,$groupslist);      my $sec_js =
           &setsections_javascript($formname,$groupslist,undef,undef,$crstype,
                                   $showcredits);
     my $output = <<"END";      my $output = <<"END";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
   
 $sec_js  $sec_js
   
Line 2396  function saveselections(formname) { Line 3397  function saveselections(formname) {
 END  END
     if ($env{'form.bulkaction'} eq 'chgsec') {      if ($env{'form.bulkaction'} eq 'chgsec') {
         $output .= <<"END";          $output .= <<"END";
         opener.document.$callingform.retainsec.value = formname.retainsec.value;          if (formname.retainsec.length > 1) {  
         setSections(formname);              for (var i=0; i<formname.retainsec.length; i++) {
                   if (formname.retainsec[i].checked == true) {
                       opener.document.$callingform.retainsec.value = formname.retainsec[i].value;
                   }
               }
           } else {
               opener.document.$callingform.retainsec.value = formname.retainsec.value;
           }
           setSections(formname,'$crstype');
         if (seccheck == 'ok') {          if (seccheck == 'ok') {
             opener.document.$callingform.newsecs.value = formname.sections.value;              opener.document.$callingform.newsecs.value = formname.sections.value;
             window.close();  
         }          }
         return;  
 END  END
     } else {      } else {
         if ($context eq 'course') {          if ($context eq 'course') {
             if (($env{'form.bulkaction'} eq 'reenable') ||               if (($env{'form.bulkaction'} eq 'reenable') || 
                 ($env{'form.bulkaction'} eq 'activate') ||                   ($env{'form.bulkaction'} eq 'activate') || 
                 ($env{'form.bulkaction'} eq 'chgdates')) {                  ($env{'form.bulkaction'} eq 'chgdates')) {
                 $output .= <<"END";                  if ($env{'request.course.sec'} eq '') {
                       $output .= <<"END";
     
         if (formname.makedatesdefault.checked == true) {          if (formname.makedatesdefault.checked == true) {
             opener.document.$callingform.makedatesdefault.value = 1;              opener.document.$callingform.makedatesdefault.value = 1;
Line 2419  END Line 3427  END
         }          }
   
 END  END
                   }
             }              }
         }          }
         $output .= <<"END";          $output .= <<"END";
Line 2434  END Line 3443  END
     opener.document.$callingform.enddate_hour.value =  formname.enddate_hour.options[formname.enddate_hour.selectedIndex].value;      opener.document.$callingform.enddate_hour.value =  formname.enddate_hour.options[formname.enddate_hour.selectedIndex].value;
     opener.document.$callingform.enddate_minute.value =  formname.enddate_minute.value;      opener.document.$callingform.enddate_minute.value =  formname.enddate_minute.value;
     opener.document.$callingform.enddate_second.value = formname.enddate_second.value;      opener.document.$callingform.enddate_second.value = formname.enddate_second.value;
     window.close();      if (formname.no_end_date.checked) {
           opener.document.$callingform.no_end_date.value = '1';
       } else {
           opener.document.$callingform.no_end_date.value = '0';
       }
 END  END
     }      }
     $output .= '      my $verify_action_js = &bulkaction_javascript($callingform,'popup');
       $output .= <<"ENDJS";
       verify_action('actionlist');
 }  }
   
   $verify_action_js
   
   // ]]>
 </script>  </script>
 ';  ENDJS
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                  chac => 'Access dates to apply for selected users',                   chac => 'Access dates to apply for selected users',
                  chse => 'Changes in section affiliation to apply to selected users',                   chse => 'Changes in section affiliation to apply to selected users',
                  fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.',                   fors => 'For student roles, changing the section will result in a section switch as students may only be in one section of a course at a time.',
                  forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.',                   forn => 'For a course role that is not "student", users may have roles in more than one section at a time.',
                  reta => "Retain each user's current section affiliations?",                    reta => "Retain each user's current section affiliations?",
                  dnap => '(Does not apply to student roles).',                    dnap => '(Does not apply to student roles).',
             );              );
     my ($date_items,$headertext);      my ($date_items,$headertext);
     if ($env{'form.bulkaction'} eq 'chgsec') {      if ($env{'form.bulkaction'} eq 'chgsec') {
Line 2460  END Line 3479  END
             $starttime = time;              $starttime = time;
         }          }
         $date_items = &date_setting_table($starttime,undef,$context,          $date_items = &date_setting_table($starttime,undef,$context,
                                           $env{'form.bulkaction'});                                            $env{'form.bulkaction'},$formname,
                                             $permission,$crstype);
     }      }
     $output .= '<h3>'.$headertext.'</h3>'.      $output .= '<h3>'.$headertext.'</h3>'.
                '<form name="'.$formname.'" method="post">'."\n".                 '<form name="'.$formname.'" method="post" action="">'."\n".
                 $date_items;                  $date_items;
     if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {      if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my ($cnum,$cdom) = &get_course_identity();
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          if ($crstype eq 'Community') {
         my %sections_count =              $lt{'fors'} = &mt('For member roles, changing the section will result in a section switch, as members may only be in one section of a community at a time.');
             &Apache::loncommon::get_sections($cdom,$cnum);              $lt{'forn'} = &mt('For a community role that is not "member", users may have roles in more than one section at a time.');
               $lt{'dnap'} = &mt('(Does not apply to member roles).'); 
           }
         my $info;          my $info;
         if ($env{'form.showrole'} eq 'st') {          if ($env{'form.showrole'} eq 'st') {
             $output .= '<p>'.$lt{'fors'}.'</p>';               $output .= '<p>'.$lt{'fors'}.'</p>'; 
         } elsif ($env{'form.shorole'} eq 'Any') {          } elsif ($env{'form.showrole'} eq 'Any') {
             $output .= '<p>'.$lt{'fors'}.'</p>'.              $output .= '<p>'.$lt{'fors'}.'</p>'.
                        '<p>'.$lt{'forn'}.'&nbsp;';                         '<p>'.$lt{'forn'}.'&nbsp;';
             $info = $lt{'reta'};              $info = $lt{'reta'};
Line 2494  END Line 3516  END
         } else {          } else {
             $info = '<input type="hidden" name="retainsec" value="0" />';               $info = '<input type="hidden" name="retainsec" value="0" />'; 
         }          }
         my $sections_select .= &course_sections(\%sections_count,$env{'form.showrole'});          my $rowtitle = &mt('New section to assign');
         my $secbox = '<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n".          my $secbox = &section_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,
                      &Apache::lonhtmlcommon::row_title(&mt('New section to assign'),'LC_oddrow_value')."\n".                                       $permission,$context,'chgsec',$crstype);
                      '<table class="LC_createuser"><tr class="LC_section_row">'."\n".  
                      '<td align="center">'.&mt('Existing sections')."\n".  
                      '<br />'.$sections_select.'</td><td align="center">'.  
                      &mt('New section').'<br />'."\n".  
                      '<input type="text" name="newsec" size="15" />'."\n".  
                      '<input type="hidden" name="sections" value="" />'."\n".  
                      '</td></tr></table>'."\n".  
                      &Apache::lonhtmlcommon::row_closure(1)."\n".  
                      &Apache::lonhtmlcommon::end_pick_box().'</p>';  
         $output .= $info.$secbox;          $output .= $info.$secbox;
     }      }
     $output .= '<p>'.      $output .= '<p>'.
 &mt('Use "Save" to update the main window with your selections.').'<br /><br />'.  
 '<input type="button" name="dateselection" value="'.&mt('Save').'" onclick="javascript:saveselections(this.form)" /></p>'."\n".  '<input type="button" name="dateselection" value="'.&mt('Save').'" onclick="javascript:saveselections(this.form)" /></p>'."\n".
 '</form>';  '</form>';
     return $output;      return $output;
 }  }
   
   sub section_picker {
       my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype,
           $showcredits,$credits) = @_;
       my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
       my $sections_select .= &course_sections(\%sections_count,$role);
       my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n";
       if ($mode eq 'upload') {
           my ($options,$cb_script,$coursepick) =
               &default_role_selector($context,1,$crstype,$showcredits);
           $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').
                      $options. &Apache::lonhtmlcommon::row_closure(1)."\n";
       }
       $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n";
       if ($env{'request.course.sec'} eq '') {
           $secbox .= '<table class="LC_createuser"><tr class="LC_section_row">'."\n".
                      '<td align="center">'.&mt('Existing sections')."\n".
                      '<br />'.$sections_select.'</td><td align="center">'.
                      &mt('New section').'<br />'."\n".
                      '<input type="text" name="newsec" size="15" value="" />'."\n".
                      '<input type="hidden" name="sections" value="" />'."\n".
                      '</td></tr></table>'."\n";
       } else {
           $secbox .= '<input type="hidden" name="sections" value="'.
                      $env{'request.course.sec'}.'" />'.
                      $env{'request.course.sec'};
       }
       $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n";
       unless ($mode eq 'chgsec') {
           if ($showcredits) {
               $secbox .= 
                   &Apache::lonhtmlcommon::row_title(&mt('credits (students)'),
                                                     'LC_evenrow_value')."\n".
                   '<input type="text" name="credits" size="3" value="'.$credits.'" />'."\n".
                   &Apache::lonhtmlcommon::row_closure(1)."\n";
           }
       }
       $secbox .= &Apache::lonhtmlcommon::end_pick_box().'</div>';
       return $secbox;
   }
   
 sub results_header_row {  sub results_header_row {
     my ($rolefilter,$statusmode,$context) = @_;      my ($rolefilter,$statusmode,$context,$permission,$mode,$crstype) = @_;
     my ($description,$showfilter);      my ($description,$showfilter);
     if ($rolefilter ne 'Any') {      if ($rolefilter ne 'Any') {
         $showfilter = $rolefilter;          $showfilter = $rolefilter;
     }      }
     if ($context eq 'course') {      if ($context eq 'course') {
         $description = &mt('Course - ').$env{'course.'.$env{'request.course.id'}.'.description'}.': ';          if ($mode eq 'csv' || $mode eq 'excel') {
               if ($crstype eq 'Community') {
                   $description = &mt('Community - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' ';
               } else {
                   $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' ';
               }
           }
         if ($statusmode eq 'Expired') {          if ($statusmode eq 'Expired') {
             $description .= &mt('Users in course with expired [_1] roles',$showfilter);              if ($crstype eq 'Community') {
                   $description .= &mt('Users in community with expired [_1] roles',$showfilter);
               } else {
                   $description .= &mt('Users in course with expired [_1] roles',$showfilter);
               }
         } elsif ($statusmode eq 'Future') {          } elsif ($statusmode eq 'Future') {
             $description .= &mt('Users in course with future [_1] roles',$showfilter);              if ($crstype eq 'Community') {
                   $description .= &mt('Users in community with future [_1] roles',$showfilter);
               } else {
                   $description .= &mt('Users in course with future [_1] roles',$showfilter);
               }
         } elsif ($statusmode eq 'Active') {          } elsif ($statusmode eq 'Active') {
             $description .= &mt('Users in course with active [_1] roles',$showfilter);              if ($crstype eq 'Community') {
                   $description .= &mt('Users in community with active [_1] roles',$showfilter);
               } else {
                   $description .= &mt('Users in course with active [_1] roles',$showfilter);
               }
         } else {          } else {
             if ($rolefilter eq 'Any') {              if ($rolefilter eq 'Any') {
                 $description .= &mt('All users in course');                  if ($crstype eq 'Community') {
                       $description .= &mt('All users in community');
                   } else {
                       $description .= &mt('All users in course');
                   }
             } else {              } else {
                 $description .= &mt('All users in course with [_1] roles',$rolefilter);                  if ($crstype eq 'Community') {
                       $description .= &mt('All users in community with [_1] roles',$rolefilter);
                   } else {
                       $description .= &mt('All users in course with [_1] roles',$rolefilter);
                   }
             }              }
         }          }
     } elsif ($context eq 'construction_space') {          my $constraint;
         $description = &mt('Author space for [_1].').' ';          my $viewablesec = &viewable_section($permission);
           if ($viewablesec ne '') {
               if ($env{'form.showrole'} eq 'st') {
                   $constraint = &mt('only users in section "[_1]"',$viewablesec);
               } elsif (($env{'form.showrole'} ne 'cc') && ($env{'form.showrole'} ne 'co')) {
                   $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec);
               }
               if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) {
                   if ($env{'form.grpfilter'} eq 'none') {
                       $constraint .= &mt(' and not in any group');
                   } else {
                       $constraint .= &mt(' and members of group: "[_1]"',$env{'form.grpfilter'});
                   }
               }
           } else {
               if (($env{'form.secfilter'} ne 'all') && ($env{'form.secfilter'} ne '')) {
                   if ($env{'form.secfilter'} eq 'none') {
                       $constraint = &mt('only users affiliated with no section');
                   } else {
                       $constraint = &mt('only users affiliated with section "[_1]"',$env{'form.secfilter'});
                   }
               }
               if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) {
                   if ($env{'form.grpfilter'} eq 'none') {
                       if ($constraint eq '') {
                           $constraint = &mt('only users not in any group');
                       } else {
                           $constraint .= &mt(' and also not in any group'); 
                       }
                   } else {
                       if ($constraint eq '') {
                           $constraint = &mt('only members of group: "[_1]"',$env{'form.grpfilter'});
                       } else {
                           $constraint .= &mt(' and also members of group: "[_1]"'.$env{'form.grpfilter'});
                       }
                   }
               }
           }
           if ($constraint ne '') {
               $description .= ' ('.$constraint.')';
           } 
       } elsif ($context eq 'author') {
           $description = 
               &mt('Author space for [_1]'
                   ,'<span class="LC_cusr_emph">'
                   .&Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'})
                   .'</span>')
               .':&nbsp;&nbsp;';
         if ($statusmode eq 'Expired') {          if ($statusmode eq 'Expired') {
             $description .= &mt('Co-authors with expired [_1] roles',$showfilter);              $description .= &mt('Co-authors with expired [_1] roles',$showfilter);
         } elsif ($statusmode eq 'Future') {          } elsif ($statusmode eq 'Future') {
Line 2553  sub results_header_row { Line 3678  sub results_header_row {
         }          }
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description');          my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description');
         $description = &mt('Domain - ').$domdesc.': ';          $description = &mt('Domain - [_1]:',$domdesc).' ';
         if ($env{'form.roletype'} eq 'domain') {          if ($env{'form.roletype'} eq 'domain') {
             if ($statusmode eq 'Expired') {              if ($statusmode eq 'Expired') {
                 $description .= &mt('Users in domain with expired [_1] roles',$showfilter);                  $description .= &mt('Users in domain with expired [_1] roles',$showfilter);
Line 2568  sub results_header_row { Line 3693  sub results_header_row {
                     $description .= &mt('All users in domain with [_1] roles',$rolefilter);                      $description .= &mt('All users in domain with [_1] roles',$rolefilter);
                 }                  }
             }              }
         } elsif ($env{'form.roletype'} eq 'construction_space') {          } elsif ($env{'form.roletype'} eq 'author') {
             if ($statusmode eq 'Expired') {              if ($statusmode eq 'Expired') {
                 $description .= &mt('Co-authors in domain with expired [_1] roles',$showfilter);                  $description .= &mt('Co-authors in domain with expired [_1] roles',$showfilter);
             } elsif ($statusmode eq 'Future') {              } elsif ($statusmode eq 'Future') {
Line 2579  sub results_header_row { Line 3704  sub results_header_row {
                 if ($rolefilter eq 'Any') {                  if ($rolefilter eq 'Any') {
                     $description .= &mt('All users with co-author roles in domain',$showfilter);                      $description .= &mt('All users with co-author roles in domain',$showfilter);
                 } else {                  } else {
                     $description .= &mt('All co-authors in domain  with [_1] roles',$rolefilter);                      $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter);
                 }                  }
             }              }
         } elsif ($env{'form.roletype'} eq 'course') {          } elsif (($env{'form.roletype'} eq 'course') || 
                    ($env{'form.roletype'} eq 'community')) {
             my $coursefilter = $env{'form.coursepick'};              my $coursefilter = $env{'form.coursepick'};
             if ($coursefilter eq 'category') {              if ($env{'form.roletype'} eq 'course') {
                 my $instcode = &instcode_from_coursefilter();                  if ($coursefilter eq 'category') {
                 if ($instcode eq '.') {                      my $instcode = &instcode_from_coursefilter();
                       if ($instcode eq '.') {
                           $description .= &mt('All courses in domain').' - ';
                       } else {
                           $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';
                       }
                   } elsif ($coursefilter eq 'selected') {
                       $description .= &mt('Selected courses in domain').' - ';
                   } elsif ($coursefilter eq 'all') {
                     $description .= &mt('All courses in domain').' - ';                      $description .= &mt('All courses in domain').' - ';
                 } else {  
                     $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';  
                 }                  }
             } elsif ($coursefilter eq 'selected') {              } elsif ($env{'form.roletype'} eq 'community') {
                 $description .= &mt('Selected courses in domain').' - ';                  if ($coursefilter eq 'selected') {
             } elsif ($coursefilter eq 'all') {                      $description .= &mt('Selected communities in domain').' - ';
                 $description .= &mt('All courses in domain').' - ';                  } elsif ($coursefilter eq 'all') {
                       $description .= &mt('All communities in domain').' - ';
                   }
             }              }
             if ($statusmode eq 'Expired') {              if ($statusmode eq 'Expired') {
                 $description .= &mt('users with expired [_1] roles',$showfilter);                  $description .= &mt('users with expired [_1] roles',$showfilter);
Line 2613  sub results_header_row { Line 3747  sub results_header_row {
     }      }
     return $description;      return $description;
 }  }
   
   sub viewable_section {
       my ($permission) = @_;
       my $viewablesec;
       if (ref($permission) eq 'HASH') {
           if (exists($permission->{'view_section'})) {
               $viewablesec = $permission->{'view_section'};
           } elsif (exists($permission->{'cusr_section'})) {
               $viewablesec = $permission->{'cusr_section'};
           }
       }
       return $viewablesec;
   }
   
           
 #################################################  #################################################
 #################################################  #################################################
 sub show_drop_list {  sub show_drop_list {
     my ($r,$classlist,$keylist,$nosort)=@_;      my ($r,$classlist,$nosort,$permission,$crstype) = @_;
     my $cid=$env{'request.course.id'};      my $cid = $env{'request.course.id'};
       my ($cnum,$cdom) = &get_course_identity($cid);
     if (! exists($env{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                                 ['sortby']);                                                  ['sortby']);
Line 2627  sub show_drop_list { Line 3776  sub show_drop_list {
     if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {      if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {
         $sortby = 'username';          $sortby = 'username';
     }      }
     my $cdom = $env{'course.'.$cid.'.domain'};  
     my $cnum = $env{'course.'.$cid,'.num'};  
     my ($classgroups) = &Apache::loncoursedata::get_group_memberships(  
                                               $classlist,$keylist,$cdom,$cnum);  
     #  
     my $action = "drop";      my $action = "drop";
       my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();
     $r->print(<<END);      $r->print(<<END);
 <input type="hidden" name="sortby" value="$sortby" />  <input type="hidden" name="sortby" value="$sortby" />
 <input type="hidden" name="action" value="$action" />  <input type="hidden" name="action" value="$action" />
 <input type="hidden" name="state"  value="done" />  <input type="hidden" name="state"  value="done" />
 <script>  <script type="text/javascript" language="Javascript">
 function checkAll(field) {  // <![CDATA[
     for (i = 0; i < field.length; i++)  $check_uncheck_js
         field[i].checked = true ;  // ]]>
 }  
   
 function uncheckAll(field) {  
     for (i = 0; i < field.length; i++)  
         field[i].checked = false ;  
 }  
 </script>  </script>
 <p>  <p>
 <input type="hidden" name="phase" value="four">  <input type="hidden" name="phase" value="four" />
 END  END
       my ($indexhash,$keylist) = &make_keylist_array();
 my %lt=&Apache::lonlocal::texthash('usrn'   => "username",      my $studentcount = 0;
                                    'dom'    => "domain",      if (ref($classlist) eq 'HASH') {
                                    'sn'     => "student name",          foreach my $student (keys(%{$classlist})) {
                                    'sec'    => "section",              my $sdata = $classlist->{$student}; 
                                    'start'  => "start date",              my $status = $sdata->[$indexhash->{'status'}];
                                    'end'    => "end date",              my $section = $sdata->[$indexhash->{'section'}];
                                    'groups' => "active groups",              if ($status ne 'Active') {
                                    );                  delete($classlist->{$student});
                   next;
               }
               if ($env{'request.course.sec'} ne '') {
                   if ($section ne $env{'request.course.sec'}) {
                       delete($classlist->{$student});
                       next;
                   }
               }
               $studentcount ++;
           }
       }
       if (!$studentcount) {
          my $msg = '';
           if ($crstype eq 'Community') {
               $msg = &mt('There are no members to drop.');
           } else {
               $msg = &mt('There are no students to drop.');
           }
           $r->print('<p class="LC_info">'.$msg.'</p>');
           return;
       }
       my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                                 $classlist,$keylist,$cdom,$cnum);
       my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                                          'dom'    => "domain",
                                          'sn'     => "student name",
                                          'mn'     => "member name",
                                          'sec'    => "section",
                                          'start'  => "start date",
                                          'end'    => "end date",
                                          'groups' => "active groups",
                                         );
       my $nametitle = $lt{'sn'};
       if ($crstype eq 'Community') {
           $nametitle = $lt{'mn'};
       }
     if ($nosort) {      if ($nosort) {
         $r->print(&Apache::loncommon::start_data_table());          $r->print(&Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row());
         $r->print(<<END);          $r->print(<<END);
 <tr>  
     <th>&nbsp;</th>      <th>&nbsp;</th>
     <th>$lt{'usrn'}</th>      <th>$lt{'usrn'}</th>
     <th>$lt{'dom'}</th>      <th>$lt{'dom'}</th>
     <th>ID</th>      <th>ID</th>
     <th>$lt{'sn'}</th>      <th>$nametitle</th>
     <th>$lt{'sec'}</th>      <th>$lt{'sec'}</th>
     <th>$lt{'start'}</th>      <th>$lt{'start'}</th>
     <th>$lt{'end'}</th>      <th>$lt{'end'}</th>
     <th>$lt{'groups'}</th>      <th>$lt{'groups'}</th>
 </tr>  
 END  END
           $r->print(&Apache::loncommon::end_data_table_header_row());
     } else  {      } else  {
         $r->print(&Apache::loncommon::start_data_table());          $r->print(&Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row());
         $r->print(<<END);          $r->print(<<END);
 <tr><th>&nbsp;</th>      <th>&nbsp;</th>
     <th>      <th>
        <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>         <a href="/adm/createuser?action=$action&sortby=username">$lt{'usrn'}</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=domain">$lt{'dom'}</a>         <a href="/adm/createuser?action=$action&sortby=domain">$lt{'dom'}</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=id">ID</a>         <a href="/adm/createuser?action=$action&sortby=id">ID</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=fullname">$lt{'sn'}</a>         <a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=section">$lt{'sec'}</a>         <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a>         <a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a>         <a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=groups">$lt{'groups'}</a>         <a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a>
     </th>      </th>
 </tr>  
 END  END
           $r->print(&Apache::loncommon::end_data_table_header_row());
     }      }
     #      #
     # Sort the students      # Sort the students
     my %index;      my $index  = $indexhash->{$sortby};
     my $i;      my $second = $indexhash->{'username'};
     foreach (@$keylist) {      my $third  = $indexhash->{'domain'};
         $index{$_} = $i++;  
     }  
     $index{'groups'} = scalar(@$keylist);  
     my $index  = $index{$sortby};  
     my $second = $index{'username'};  
     my $third  = $index{'domain'};  
     my @Sorted_Students = sort {      my @Sorted_Students = sort {
         lc($classlist->{$a}->[$index])  cmp lc($classlist->{$b}->[$index])          lc($classlist->{$a}->[$index])  cmp lc($classlist->{$b}->[$index])
             ||              ||
         lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])          lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
             ||              ||
         lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])          lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
         } (keys(%$classlist));          } (keys(%{$classlist}));
     foreach my $student (@Sorted_Students) {      foreach my $student (@Sorted_Students) {
         my $error;          my $error;
         my $sdata = $classlist->{$student};          my $sdata = $classlist->{$student};
         my $username = $sdata->[$index{'username'}];          my $username = $sdata->[$indexhash->{'username'}];
         my $domain   = $sdata->[$index{'domain'}];          my $domain   = $sdata->[$indexhash->{'domain'}];
         my $section  = $sdata->[$index{'section'}];          my $section  = $sdata->[$indexhash->{'section'}];
         my $name     = $sdata->[$index{'fullname'}];          my $name     = $sdata->[$indexhash->{'fullname'}];
         my $id       = $sdata->[$index{'id'}];          my $id       = $sdata->[$indexhash->{'id'}];
         my $start    = $sdata->[$index{'start'}];          my $start    = $sdata->[$indexhash->{'start'}];
         my $end      = $sdata->[$index{'end'}];          my $end      = $sdata->[$indexhash->{'end'}];
         my $groups = $classgroups->{$student};          my $groups = $classgroups->{$student};
         my $active_groups;          my $active_groups;
         if (ref($groups->{active}) eq 'HASH') {          if (ref($groups->{active}) eq 'HASH') {
Line 2743  END Line 3912  END
         } else {          } else {
             $end = &Apache::lonlocal::locallocaltime($end);              $end = &Apache::lonlocal::locallocaltime($end);
         }          }
         my $status   = $sdata->[$index{'status'}];          my $studentkey = $student.':'.$section;
         next if ($status ne 'Active');          my $startitem = '<input type="hidden" name="'.$studentkey.'_start" value="'.$sdata->[$indexhash->{'start'}].'" />';
         #          #
         $r->print(&Apache::loncommon::start_data_table_row());          $r->print(&Apache::loncommon::start_data_table_row());
         $r->print(<<"END");          $r->print(<<"END");
     <td><input type="checkbox" name="droplist" value="$student"></td>      <td><input type="checkbox" name="droplist" value="$studentkey" /></td>
     <td>$username</td>      <td>$username</td>
     <td>$domain</td>      <td>$domain</td>
     <td>$id</td>      <td>$id</td>
     <td>$name</td>      <td>$name</td>
     <td>$section</td>      <td>$section</td>
     <td>$start</td>      <td>$start $startitem</td>
     <td>$end</td>      <td>$end</td>
     <td>$active_groups</td>      <td>$active_groups</td>
 END  END
Line 2762  END Line 3931  END
     }      }
     $r->print(&Apache::loncommon::end_data_table().'<br />');      $r->print(&Apache::loncommon::end_data_table().'<br />');
     %lt=&Apache::lonlocal::texthash(      %lt=&Apache::lonlocal::texthash(
                        'dp'   => "Expire Users' Roles",                         'dp'   => "Drop Students",
                          'dm'   => "Drop Members",
                        'ca'   => "check all",                         'ca'   => "check all",
                        'ua'   => "uncheck all",                         'ua'   => "uncheck all",
                                        );                                         );
       my $btn = $lt{'dp'};
       if ($crstype eq 'Community') {
           $btn = $lt{'dm'}; 
       }
     $r->print(<<"END");      $r->print(<<"END");
 </p><p>  </p>
 <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)"> &nbsp;  <p>
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)">  <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> &nbsp;
 <p><input type=submit value="$lt{'dp'}"></p>  <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" />
   </p>
   <p>
   <input type="submit" value="$btn" />
   </p>
 END  END
     return;      return;
 }  }
Line 2781  END Line 3959  END
 sub print_first_users_upload_form {  sub print_first_users_upload_form {
     my ($r,$context) = @_;      my ($r,$context) = @_;
     my $str;      my $str;
     $str  = '<input type="hidden" name="phase" value="two">';      $str  = '<input type="hidden" name="phase" value="two" />';
     $str .= '<input type="hidden" name="action" value="upload" />';      $str .= '<input type="hidden" name="action" value="upload" />';
     $str .= '<input type="hidden"   name="state"  value="got_file" />';      $str .= '<input type="hidden" name="state"  value="got_file" />';
     $str .= "<h3>".&mt('Upload a file containing information about users')."</h3>\n";  
     $str .= &Apache::loncommon::upfile_select_html();      $str .= &Apache::grades::checkforfile_js();
     $str .= "<p>\n";  
     $str .= '<input type="submit" name="fileupload" value="'.      $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";
         &mt('Upload file of users').'">'."\n";  
     $str .= '<label><input type="checkbox" name="noFirstLine" /> '.      # Excel and CSV Help
         &mt('Ignore First Line')."</label></p>\n";      $str .= '<div class="LC_columnSection">'
     $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",             .&Apache::loncommon::help_open_topic("Course_Create_Class_List",
                          &mt("How do I create a users list from a spreadsheet")).                  &mt("How do I create a users list from a spreadsheet"))
                              "<br />\n";             .' '.&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
     $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",                  &mt("How do I create a CSV file from a spreadsheet"))
                            &mt("How do I create a CSV file from a spreadsheet")).             ."</div>\n";
                                "<br />\n";      $str .= &Apache::lonhtmlcommon::start_pick_box()
     $str .= &Apache::loncommon::end_page();             .&Apache::lonhtmlcommon::row_title(&mt('File'));
       if (&Apache::lonlocal::current_language() ne 'en') {
           if ($context eq 'course') { 
               $str .= '<p class="LC_info">'."\n"
                      .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n"
                      .'</p>'."\n";
           }
       }
       $str .= &Apache::loncommon::upfile_select_html()
              .&Apache::lonhtmlcommon::row_closure()
              .&Apache::lonhtmlcommon::row_title(
                   '<label for="noFirstLine">'
                  .&mt('Ignore First Line')
                  .'</label>')
              .'<input type="checkbox" name="noFirstLine" id="noFirstLine" />'
              .&Apache::lonhtmlcommon::row_closure(1)
              .&Apache::lonhtmlcommon::end_pick_box();
   
       $str .= '<p>'
              .'<input type="submit" name="fileupload" value="'.&mt('Next').'"'
              .' onclick="javascript:checkUpload(this.form);" />'
              .'</p>';
   
     $r->print($str);      $r->print($str);
     return;      return;
 }  }
   
 # ================================================= Drop/Add from uploaded file  # ================================================= Drop/Add from uploaded file
 sub upfile_drop_add {  sub upfile_drop_add {
     my ($r,$context) = @_;      my ($r,$context,$permission,$showcredits) = @_;
     &Apache::loncommon::load_tmp_file($r);      &Apache::loncommon::load_tmp_file($r);
     my @userdata=&Apache::loncommon::upfile_record_sep();      my @userdata=&Apache::loncommon::upfile_record_sep();
     if($env{'form.noFirstLine'}){shift(@userdata);}      if($env{'form.noFirstLine'}){shift(@userdata);}
Line 2819  sub upfile_drop_add { Line 4019  sub upfile_drop_add {
             $fields{$env{'form.f'.$i}}=$keyfields[$i];              $fields{$env{'form.f'.$i}}=$keyfields[$i];
         }          }
     }      }
       if ($env{'form.fullup'} ne 'yes') {
           $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".
                     '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />');
       }
     #      #
     # Store the field choices away      # Store the field choices away
     foreach my $field (qw/username names      my @storefields = qw/username names fname mname lname gen id 
                        fname mname lname gen id sec ipwd email role/) {                           sec ipwd email role domain inststatus/;
       if ($showcredits) {
           push (@storefields,'credits');
       }
       my %fieldstype; 
       foreach my $field (@storefields) {
         $env{'form.'.$field.'_choice'}=$fields{$field};          $env{'form.'.$field.'_choice'}=$fields{$field};
           $fieldstype{$field.'_choice'} = 'scalar';
       }
       &Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype);
       my ($cid,$crstype,$setting);
       if ($context eq 'domain') {
           $setting = $env{'form.roleaction'};
       }
       if ($env{'request.course.id'} ne '') {
           $cid = $env{'request.course.id'};
           $crstype = &Apache::loncommon::course_type();
       } elsif ($setting eq 'course') {
           if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) {
               $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'};
               $crstype = &Apache::loncommon::course_type($cid);
           }
     }      }
     &Apache::loncommon::store_course_settings('enrollment_upload',  
                                               { 'username_choice' => 'scalar',  
                                                 'names_choice' => 'scalar',  
                                                 'fname_choice' => 'scalar',  
                                                 'mname_choice' => 'scalar',  
                                                 'lname_choice' => 'scalar',  
                                                 'gen_choice' => 'scalar',  
                                                 'id_choice' => 'scalar',  
                                                 'sec_choice' => 'scalar',  
                                                 'ipwd_choice' => 'scalar',  
                                                 'email_choice' => 'scalar',  
                                                 'role_choice'  => 'scalar' });  
     #  
     my ($startdate,$enddate) = &get_dates_from_form();      my ($startdate,$enddate) = &get_dates_from_form();
     if ($env{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         $r->print(&make_dates_default($startdate,$enddate));          $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));
     }      }
     # Determine domain and desired host (home server)      # Determine domain and desired host (home server)
     my $domain=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
       my $domain;
       if ($env{'form.defaultdomain'} ne '') {
           $domain = $env{'form.defaultdomain'};
       } else {
           $domain = $defdom;
       }
     my $desiredhost = $env{'form.lcserver'};      my $desiredhost = $env{'form.lcserver'};
     if (lc($desiredhost) eq 'default') {      if (lc($desiredhost) eq 'default') {
         $desiredhost = undef;          $desiredhost = undef;
     } else {      } else {
         my %home_servers = &Apache::lonnet::get_servers($domain,'library');          my %home_servers = &Apache::lonnet::get_servers($defdom,'library');
         if (! exists($home_servers{$desiredhost})) {          if (! exists($home_servers{$desiredhost})) {
             $r->print('<span class="LC_error">'.&mt('Error').              $r->print('<span class="LC_error">'.&mt('Error').
                       &mt('Invalid home server specified').'</span>');                        &mt('Invalid home server specified').'</span>');
Line 2886  sub upfile_drop_add { Line 4103  sub upfile_drop_add {
             $amode = ''; # This causes the loop below to be skipped              $amode = ''; # This causes the loop below to be skipped
         }          }
     }      }
     my ($cid,$defaultsec,$defaultrole,$setting);      my ($defaultsec,$defaultrole,$defaultcredits,$commoncredits);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $setting = $env{'form.roleaction'};  
         if ($setting eq 'domain') {          if ($setting eq 'domain') {
             $defaultrole = $env{'form.defaultrole'};              $defaultrole = $env{'form.defaultrole'};
         } elsif ($setting eq 'course') {          } elsif ($setting eq 'course') {
             $defaultrole = $env{'form.courserole'};              $defaultrole = $env{'form.courserole'};
         }                $defaultsec = $env{'form.sections'};
     } elsif ($context eq 'construction_space') {              if ($showcredits) {
                   $commoncredits = $env{'form.credits'};
                   if ($crstype ne 'Community') {
                       my %coursehash=&Apache::lonnet::coursedescription($cid);
                       $defaultcredits = $coursehash{'internal.defaultcredits'};
                   }
               }
           }
       } elsif ($context eq 'author') {
         $defaultrole = $env{'form.defaultrole'};          $defaultrole = $env{'form.defaultrole'};
     }      } elsif ($context eq 'course') {
     if ($context eq 'domain' && $setting eq 'course') {           $defaultrole = $env{'form.defaultrole'};
         if ($env{'form.newsec'} ne '') {          $defaultsec = $env{'form.sections'};
             $defaultsec = $env{'form.newsec'};          if ($showcredits) {
         } elsif ($env{'form.defaultsec'} ne '') {              $commoncredits = $env{'form.credits'};
             $defaultsec = $env{'form.defaultsec'}              $defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'};
           }
       }
       # Check to see if user information can be changed
       my @userinfo = ('firstname','middlename','lastname','generation',
                       'permanentemail','id');
       my %canmodify;
       if (&Apache::lonnet::allowed('mau',$domain)) {
           push(@userinfo,'inststatus');
           foreach my $field (@userinfo) {
               $canmodify{$field} = 1;
           }
       }
       my (%userlist,%modifiable_fields,@poss_roles);
       my $secidx = &Apache::loncoursedata::CL_SECTION();
       my @courseroles = &roles_by_context('course',1,$crstype);
       if (!&Apache::lonnet::allowed('mau',$domain)) {
           if ($context eq 'course' || $context eq 'author') {
               @poss_roles =  &curr_role_permissions($context,'','',$crstype);
               my @statuses = ('active','future');
               my ($indexhash,$keylist) = &make_keylist_array();
               my %info;
               foreach my $role (@poss_roles) {
                   %{$modifiable_fields{$role}} = &can_modify_userinfo($context,$domain,
                                                           \@userinfo,[$role]);
               }
               if ($context eq 'course') {
                   my ($cnum,$cdom) = &get_course_identity();
                   my $roster = &Apache::loncoursedata::get_classlist();
                   if (ref($roster) eq 'HASH') {
                       %userlist = %{$roster};
                   }
                   my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,
                                                            \@statuses,\@poss_roles);
                   &gather_userinfo($context,'view',\%userlist,$indexhash,\%info,
                                   \%advrolehash,$permission);
               } elsif ($context eq 'author') {
                   my %cstr_roles = &Apache::lonnet::get_my_roles(undef,undef,undef,
                                                     \@statuses,\@poss_roles);
                   &gather_userinfo($context,'view',\%userlist,$indexhash,\%info,
                                \%cstr_roles,$permission);
   
               }
         }          }
     }      }
     if ($env{'request.course.id'} ne '') {  
         $cid = $env{'request.course.id'};  
     } elsif ($env{'form.defaultdomain'} ne '' && $env{'form.defaultcourse'} ne '') {  
         $cid = $env{'form.defaultdomain'}.'_'.  
                $env{'form.defaultcourse'};  
     }  
     if ( $domain eq &LONCAPA::clean_domain($domain)      if ( $domain eq &LONCAPA::clean_domain($domain)
         && ($amode ne '')) {          && ($amode ne '')) {
         #######################################          #######################################
Line 2917  sub upfile_drop_add { Line 4177  sub upfile_drop_add {
         #######################################          #######################################
         if ($context eq 'course') {          if ($context eq 'course') {
             $r->print('<h3>'.&mt('Enrolling Users')."</h3>\n<p>\n");              $r->print('<h3>'.&mt('Enrolling Users')."</h3>\n<p>\n");
         } elsif ($context eq 'construction_space') {          } elsif ($context eq 'author') {
             $r->print('<h3>'.&mt('Updating Co-authors')."</h3>\n<p>\n");              $r->print('<h3>'.&mt('Updating Co-authors')."</h3>\n<p>\n");
         } else {          } else {
             $r->print('<h3>'.&mt('Adding/Modifying Users')."</h3>\n<p>\n");              $r->print('<h3>'.&mt('Adding/Modifying Users')."</h3>\n<p>\n");
         }          }
           $r->rflush;
   
         my %counts = (          my %counts = (
                        user => 0,                         user => 0,
                        auth => 0,                         auth => 0,
Line 2929  sub upfile_drop_add { Line 4191  sub upfile_drop_add {
                      );                       );
         my $flushc=0;          my $flushc=0;
         my %student=();          my %student=();
         my %curr_groups;          my (%curr_groups,@sections,@cleansec,$defaultwarn,$groupwarn);
         my %userchg;          my %userchg;
         if ($context eq 'course') {          if ($context eq 'course' || $setting eq 'course') {
             # Get information about course groups              if ($context eq 'course') {
             %curr_groups = &Apache::longroup::coursegroups();                  # Get information about course groups
                   %curr_groups = &Apache::longroup::coursegroups();
               } elsif ($setting eq 'course') {
                   if ($cid) {
                       %curr_groups =
                           &Apache::longroup::coursegroups($env{'form.dcdomain'},
                                                           $env{'form.dccourse'});
                   }
               }
               # determine section number
               if ($defaultsec =~ /,/) {
                   push(@sections,split(/,/,$defaultsec));
               } else {
                   push(@sections,$defaultsec);
               }
               # remove non alphanumeric values from section
               foreach my $item (@sections) {
                   $item =~ s/\W//g;
                   if ($item eq "none" || $item eq 'all') {
                       $defaultwarn = &mt('Default section name [_1] could not be used as it is a reserved word.',$item);
                   } elsif ($item ne ''  && exists($curr_groups{$item})) {
                       $groupwarn = &mt('Default section name "[_1]" is the name of a course group. Section names and group names must be distinct.',$item);
                   } elsif ($item ne '') {
                       push(@cleansec,$item);
                   }
               }
               if ($defaultwarn) {
                   $r->print($defaultwarn.'<br />');
               }
               if ($groupwarn) {
                   $r->print($groupwarn.'<br />');
               }
         }          }
         my (%curr_rules,%got_rules,%alerts);          my (%curr_rules,%got_rules,%alerts,%cancreate);
           my %customroles = &my_custom_roles($crstype);
           my @permitted_roles = 
               &roles_on_upload($context,$setting,$crstype,%customroles);
           my %longtypes = &Apache::lonlocal::texthash(
                               official   => 'Institutional',
                               unofficial => 'Non-institutional',
                           );
           my $newuserdom = $env{'request.role.domain'};
           map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes);
         # Get new users list          # Get new users list
         foreach (@userdata) {          foreach my $line (@userdata) {
             my %entries=&Apache::loncommon::record_sep($_);              my @secs;
               my %entries=&Apache::loncommon::record_sep($line);
             # Determine user name              # Determine user name
               $entries{$fields{'username'}} =~ s/^\s+|\s+$//g;
             unless (($entries{$fields{'username'}} eq '') ||              unless (($entries{$fields{'username'}} eq '') ||
                     (!defined($entries{$fields{'username'}}))) {                      (!defined($entries{$fields{'username'}}))) {
                 my ($fname, $mname, $lname,$gen) = ('','','','');                  my ($fname, $mname, $lname,$gen) = ('','','','');
Line 2960  sub upfile_drop_add { Line 4264  sub upfile_drop_add {
                         $gen=$entries{$fields{'gen'}};                          $gen=$entries{$fields{'gen'}};
                     }                      }
                 }                  }
   
                 if ($entries{$fields{'username'}}                  if ($entries{$fields{'username'}}
                     ne &LONCAPA::clean_username($entries{$fields{'username'}})) {                      ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
                     $r->print('<br />'.                      my $nowhitespace;
       &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',                      if ($entries{$fields{'username'}} =~ /\s/) {
           $entries{$fields{'username'}},$fname,$mname,$lname,$gen).                          $nowhitespace = ' - '.&mt('usernames may not contain spaces.');
                               '</b>');                      }
                       $r->print(
                           '<br />'.
                           &mt('Unacceptable username [_1] for user [_2] [_3] [_4] [_5]',
                                   '"<b>'.$entries{$fields{'username'}}.'</b>"',
                                   $fname,$mname,$lname,$gen).
                           $nowhitespace);
                       next;
                 } else {                  } else {
                       $entries{$fields{'domain'}} =~ s/^\s+|\s+$//g;
                       if ($entries{$fields{'domain'}} 
                           ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {
                           $r->print(
                               '<br />'.
                               &mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]',
                                      '"<b>'.$entries{$fields{'domain'}}.'</b>"',
                                       $fname,$mname,$lname,$gen));
                       next;
                       }
                     my $username = $entries{$fields{'username'}};                      my $username = $entries{$fields{'username'}};
                     my $sec;                      my $userdomain = $entries{$fields{'domain'}};
                     if ($context eq 'course' || $setting eq 'course') {                      if ($userdomain eq '') {
                         # determine section number                          $userdomain = $domain;
                         if (defined($fields{'sec'})) {                      }
                             if (defined($entries{$fields{'sec'}})) {                      if (defined($fields{'sec'})) {
                                 $sec=$entries{$fields{'sec'}};                          if (defined($entries{$fields{'sec'}})) {
                               $entries{$fields{'sec'}} =~ s/\W//g;
                               my $item = $entries{$fields{'sec'}};
                               if ($item eq "none" || $item eq 'all') {
                                   $r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item));
                                   next;
                               } elsif (exists($curr_groups{$item})) {
                                   $r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.'));
                                   next;
                               } else {
                                   push(@secs,$item);
                             }                              }
                         } else {  
                             $sec = $defaultsec;  
                         }                          }
                         # remove non alphanumeric values from section                      }
                         $sec =~ s/\W//g;                      if ($env{'request.course.sec'} ne '') {
                         if ($sec eq "none" || $sec eq 'all') {                          @secs = ($env{'request.course.sec'});
                             $r->print('<br />'.                          if (ref($userlist{$username.':'.$userdomain}) eq 'ARRAY') {
       &mt('<b>[_1]</b>: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.',                              my $currsec = $userlist{$username.':'.$userdomain}[$secidx];
                                       $username,$sec,$fname,$mname,$lname,$gen));                              if ($currsec ne $env{'request.course.sec'}) {
                             next;                                  $r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$secs[0]).'<br />');
                         } elsif (($sec ne '') && (exists($curr_groups{$sec}))) {                                  if ($currsec eq '') {
                             $r->print('<br />'.                                      $r->print(&mt('This user already has an active/future student role in the course, unaffiliated to any section.'));
       &mt('<b>[_1]</b>: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.',  
                                       $username,$sec,$fname,$mname,$lname,$gen));                                  } else {
                             next;                                      $r->print(&mt('This user already has an active/future role in section "[_1]" of the course.',$currsec));
                                   }
                                   $r->print('<br />'.&mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments in other sections.',$secs[0]).'<br />');
                                   next;
                               }
                           }
                       } elsif ($context eq 'course' || $setting eq 'course') {
                           if (@secs == 0) {
                               @secs = @cleansec;
                         }                          }
                     }                      }
                     # determine id number                      # determine id number
Line 3003  sub upfile_drop_add { Line 4341  sub upfile_drop_add {
                     # determine email address                      # determine email address
                     my $email='';                      my $email='';
                     if (defined($fields{'email'})) {                      if (defined($fields{'email'})) {
                           $entries{$fields{'email'}} =~ s/^\s+|\s+$//g;
                         if (defined($entries{$fields{'email'}})) {                          if (defined($entries{$fields{'email'}})) {
                             $email=$entries{$fields{'email'}};                              $email=$entries{$fields{'email'}};
                             unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }                        }                              unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
                           }
                       }
                       # determine affiliation
                       my $inststatus='';
                       if (defined($fields{'inststatus'})) {
                           if (defined($entries{$fields{'inststatus'}})) {
                               $inststatus=$entries{$fields{'inststatus'}};
                           }
                     }                      }
                     # determine user password                      # determine user password
                     my $password = $genpwd;                      my $password = $genpwd;
Line 3018  sub upfile_drop_add { Line 4365  sub upfile_drop_add {
                     my $role = '';                      my $role = '';
                     if (defined($fields{'role'})) {                      if (defined($fields{'role'})) {
                         if ($entries{$fields{'role'}}) {                          if ($entries{$fields{'role'}}) {
                             my @poss_roles =                               $entries{$fields{'role'}}  =~ s/(\s+$|^\s+)//g;
                                  &curr_role_permissions($context,$setting);                              if ($entries{$fields{'role'}} ne '') {
                             if (grep(/^\Q$entries{$fields{'role'}}\E/,@poss_roles)) {                                  if (grep(/^\Q$entries{$fields{'role'}}\E$/,@permitted_roles)) {
                                 $role=$entries{$fields{'role'}};                                      $role = $entries{$fields{'role'}};
                             } else {                                  }
                                 my $rolestr = join(', ',@poss_roles);                              }
                                 $r->print('<br />'.                              if ($role eq '') {
       &mt('<b>[_1]</b>: You do not have permission to add the requested role [_2] for the user.',$entries{$fields{'username'}},$entries{$fields{'role'}}).'<br />'.&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n");                                  my $rolestr = join(', ',@permitted_roles);
                                   $r->print('<br />'
                                            .&mt('[_1]: You do not have permission to add the requested role [_2] for the user.'
                                                ,'<b>'.$entries{$fields{'username'}}.'</b>'
                                                ,$entries{$fields{'role'}})
                                            .'<br />'
                                            .&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n"
                                   );
                                 next;                                  next;
                             }                              }
                         }                          }
Line 3034  sub upfile_drop_add { Line 4388  sub upfile_drop_add {
                         $role = $defaultrole;                          $role = $defaultrole;
                     }                      }
                     # Clean up whitespace                      # Clean up whitespace
                     foreach (\$domain,\$username,\$id,\$fname,\$mname,                      foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) {
                              \$lname,\$gen,\$sec,\$role) {  
                         $$_ =~ s/(\s+$|^\s+)//g;                          $$_ =~ s/(\s+$|^\s+)//g;
                     }                      }
                       my $credits;
                       if ($showcredits) {
                           if (($role eq 'st') && ($crstype ne 'Community')) {
                               $credits = $entries{$fields{'credits'}};
                               if ($credits ne '') {
                                   $credits =~ s/[^\d\.]//g;
                               }
                               if ($credits eq '') {
                                   $credits = $commoncredits;
                               }
                               if ($credits eq $defaultcredits) {
                                   undef($credits);
                               }
                           }
                       }
                     # check against rules                      # check against rules
                     my $checkid = 0;                      my $checkid = 0;
                     my $newuser = 0;                      my $newuser = 0;
                     my (%rulematch,%inst_results,%idinst_results);                      my (%rulematch,%inst_results,%idinst_results);
                     my $uhome=&Apache::lonnet::homeserver($username,$domain);                      my $uhome=&Apache::lonnet::homeserver($username,$userdomain);
                     if ($uhome eq 'no_host') {                      if ($uhome eq 'no_host') {
                           if ($userdomain ne $newuserdom) {
                               if ($context eq 'course') {
                                   $r->print('<br />'.
                                             &mt('[_1]: The domain specified ([_2]) is different to that of the course.',
                                             '<b>'.$username.'</b>',$userdomain).'<br />');
                               } elsif ($context eq 'author') {
                                   $r->print(&mt('[_1]: The domain specified ([_2]) is different to that of the author.',
                                           '<b>'.$username.'</b>',$userdomain).'<br />'); 
                               } else {
                                   $r->print(&mt('[_1]: The domain specified ([_2]) is different to that of your current role.',
                                           '<b>'.$username.'</b>',$userdomain).'<br />');
                               }
                               $r->print(&mt('The user does not already exist, and you may not create a new user in a different domain.'));
                               next;
                           }
                         $checkid = 1;                          $checkid = 1;
                         $newuser = 1;                          $newuser = 1;
                           my $user = $username.':'.$newuserdom;
                         my $checkhash;                          my $checkhash;
                         my $checks = { 'username' => 1 };                          my $checks = { 'username' => 1 };
                         $checkhash->{$username.':'.$domain} = { 'newuser' => 1, };                          $checkhash->{$username.':'.$newuserdom} = { 'newuser' => 1, };
                         &Apache::loncommon::user_rule_check($checkhash,$checks,                          &Apache::loncommon::user_rule_check($checkhash,$checks,
                             \%alerts,\%rulematch,\%inst_results,\%curr_rules,                              \%alerts,\%rulematch,\%inst_results,\%curr_rules,
                             \%got_rules);                              \%got_rules);
                         if (ref($alerts{'username'}) eq 'HASH') {                          if (ref($alerts{'username'}) eq 'HASH') {
                             if (ref($alerts{'username'}{$domain}) eq 'HASH') {                              if (ref($alerts{'username'}{$newuserdom}) eq 'HASH') {
                                 next if ($alerts{'username'}{$domain}{$username});                                  if ($alerts{'username'}{$newuserdom}{$username}) {
                                       $r->print('<br />'.
                                                 &mt('[_1]: matches the username format at your institution, but is not known to your directory service.','<b>'.$username.'</b>').'<br />'.
                                                 &mt('Consequently, the user was not created.'));
                                       next;
                                   }
                               }
                           }
                           my $usertype = 'unofficial';
                           if (ref($rulematch{$user}) eq 'HASH') {
                               if ($rulematch{$user}{'username'}) {
                                   $usertype = 'official';
                               }
                           }
                           unless ($cancreate{$usertype}) {
                               my $showtype = $longtypes{$usertype};
                               $r->print('<br />'.
                                         &mt('[_1]: The user does not exist, and you are not permitted to create users of type: [_2].','<b>'.$username.'</b>',$showtype));
                               next;
                           }
                       } else {
                           if ($context eq 'course' || $context eq 'author') {
                               if ($userdomain eq $domain ) {
                                   if ($role eq '') {
                                       my @checkroles;
                                       foreach my $role (@poss_roles) {
                                           my $endkey;
                                           if ($role ne 'st') {
                                               $endkey = ':'.$role;
                                           }
                                           if (exists($userlist{$username.':'.$userdomain.$endkey})) {
                                               if (!grep(/^\Q$role\E$/,@checkroles)) {
                                                   push(@checkroles,$role);
                                               }
                                           }
                                       }
                                       if (@checkroles > 0) {
                                           %canmodify = &can_modify_userinfo($context,$domain,\@userinfo,\@checkroles);
                                       }
                                   } elsif (ref($modifiable_fields{$role}) eq 'HASH') {
                                       %canmodify = %{$modifiable_fields{$role}};
                                   }
                               }
                               my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id);
                               for (my $i=0; $i<@newinfo; $i++) {
                                   if (${$newinfo[$i]} ne '') {
                                       if (!$canmodify{$userinfo[$i]}) {
                                           ${$newinfo[$i]} = '';
                                       }
                                   }
                             }                              }
                         }                          }
                     }                      }
                     if ($id ne '') {                      if ($id ne '') {
                         if (!$newuser) {                          if (!$newuser) {
                             my %idhash = &Apache::lonnet::idrget($domain,($username));                              my %idhash = &Apache::lonnet::idrget($userdomain,($username));
                             if ($idhash{$username} ne $id) {                              if ($idhash{$username} ne $id) {
                                 $checkid = 1;                                  $checkid = 1;
                             }                              }
Line 3068  sub upfile_drop_add { Line 4501  sub upfile_drop_add {
                         if ($checkid) {                          if ($checkid) {
                             my $checkhash;                              my $checkhash;
                             my $checks = { 'id' => 1 };                              my $checks = { 'id' => 1 };
                             $checkhash->{$username.':'.$domain} = { 'newuser' => $newuser,                              $checkhash->{$username.':'.$userdomain} = { 'newuser' => $newuser,
                                                                     'id'  => $id };                                                                      'id'  => $id };
                             &Apache::loncommon::user_rule_check($checkhash,$checks,                              &Apache::loncommon::user_rule_check($checkhash,$checks,
                                 \%alerts,\%rulematch,\%idinst_results,\%curr_rules,                                  \%alerts,\%rulematch,\%idinst_results,\%curr_rules,
                                 \%got_rules);                                  \%got_rules);
                             if (ref($alerts{'id'}) eq 'HASH') {                              if (ref($alerts{'id'}) eq 'HASH') {
                                 if (ref($alerts{'id'}{$domain}) eq 'HASH') {                                  if (ref($alerts{'id'}{$userdomain}) eq 'HASH') {
                                     next if ($alerts{'id'}{$domain}{$id});                                      if ($alerts{'id'}{$userdomain}{$id}) {
                                           $r->print(&mt('[_1]: has a student/employee ID matching the format at your institution, but the ID is found by your directory service.',
                                                     '<b>'.$username.'</b>').'<br />'.
                                                     &mt('Consequently, the user was not created.'));
                                           next;
                                       }
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                     if ($password || $env{'form.login'} eq 'loc') {                      if ($password || $env{'form.login'} eq 'loc') {
                         my ($userresult,$authresult,$roleresult);                          my $multiple = 0;
                           my ($userresult,$authresult,$roleresult,$idresult);
                           my (%userres,%authres,%roleres,%idres);
                           my $singlesec = '';
                         if ($role eq 'st') {                          if ($role eq 'st') {
                             &modifystudent($domain,$username,$cid,$sec,                              my $sec;
                                            $desiredhost);                              if (@secs > 0) {
                             $roleresult =                                   $sec = $secs[0];
                               }
                               &modifystudent($userdomain,$username,$cid,$sec,
                                              $desiredhost,$context);
                               $roleresult =
                                 &Apache::lonnet::modifystudent                                  &Apache::lonnet::modifystudent
                                     ($domain,$username,$id,$amode,$password,                                      ($userdomain,$username,$id,$amode,$password,
                                      $fname,$mname,$lname,$gen,$sec,$enddate,                                       $fname,$mname,$lname,$gen,$sec,$enddate,
                                      $startdate,$env{'form.forceid'},                                       $startdate,$env{'form.forceid'},
                                      $desiredhost,$email);                                       $desiredhost,$email,'manual','',$cid,
                                        '',$context,$inststatus,$credits);
                               $userresult = $roleresult;
                         } else {                          } else {
                             ($userresult,$authresult,$roleresult) =                               if ($role ne '') { 
                                 &modifyuserrole($context,$setting,                                  if ($context eq 'course' || $setting eq 'course') {
                                     $changeauth,$cid,$domain,$username,                                       if ($customroles{$role}) {
                                     $id,$amode,$password,$fname,                                          $role = 'cr_'.$env{'user.domain'}.'_'.
                                     $mname,$lname,$gen,$sec,                                                  $env{'user.name'}.'_'.$role;
                                     $env{'form.forceid'},$desiredhost,                                      }
                                     $email,$role,$enddate,$startdate,$checkid);                                      if (($role ne 'cc') && ($role ne 'co')) { 
                         }                                          if (@secs > 1) {
                         $flushc =                                               $multiple = 1;
                             &user_change_result($r,$userresult,$authresult,                                              foreach my $sec (@secs) {
                                                 $roleresult,\%counts,$flushc,                                                  ($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) =
                                                 $username,%userchg);                                                  &modifyuserrole($context,$setting,
                                                       $changeauth,$cid,$userdomain,$username,
                                                       $id,$amode,$password,$fname,
                                                       $mname,$lname,$gen,$sec,
                                                       $env{'form.forceid'},$desiredhost,
                                                       $email,$role,$enddate,
                                                       $startdate,$checkid,$inststatus);
                                               }
                                           } elsif (@secs > 0) {
                                               $singlesec = $secs[0];
                                           }
                                       }
                                   }
                               }
                               if (!$multiple) {
                                   ($userresult,$authresult,$roleresult,$idresult) = 
                                       &modifyuserrole($context,$setting,
                                                       $changeauth,$cid,$userdomain,$username, 
                                                       $id,$amode,$password,$fname,
                                                       $mname,$lname,$gen,$singlesec,
                                                       $env{'form.forceid'},$desiredhost,
                                                       $email,$role,$enddate,$startdate,
                                                       $checkid,$inststatus);
                               }
                           }
                           if ($multiple) {
                               foreach my $sec (sort(keys(%userres))) {
                                   $flushc =
                                   &user_change_result($r,$userres{$sec},$authres{$sec},
                                                       $roleres{$sec},$idres{$sec},\%counts,$flushc,
                                                       $username,$userdomain,\%userchg);
   
                               }
                           } else {
                               $flushc = 
                                   &user_change_result($r,$userresult,$authresult,
                                                       $roleresult,$idresult,\%counts,$flushc,
                                                       $username,$userdomain,\%userchg);
                           }
                     } else {                      } else {
                         if ($context eq 'course') {                          if ($context eq 'course') {
                             $r->print('<br />'.                               $r->print('<br />'. 
       &mt('<b>[_1]</b>: Unable to enroll.  No password specified.',$username)        &mt('[_1]: Unable to enroll. No password specified.','<b>'.$username.'</b>')
                                      );                                       );
                         } elsif ($context eq 'construction_space') {                          } elsif ($context eq 'author') {
                             $r->print('<br />'.                              $r->print('<br />'.
       &mt('<b>[_1]</b>: Unable to add co-author.  No password specified.',$username)        &mt('[_1]: Unable to add co-author. No password specified.','<b>'.$username.'</b>')
                                      );                                       );
                         } else {                          } else {
                             $r->print('<br />'.                              $r->print('<br />'.
       &mt('<b>[_1]</b>: Unable to add user.  No password specified.',$username)        &mt('[_1]: Unable to add user. No password specified.','<b>'.$username.'</b>')
                                      );                                       );
                         }                          }
                     }                      }
Line 3123  sub upfile_drop_add { Line 4608  sub upfile_drop_add {
             }              }
         } # end of foreach (@userdata)          } # end of foreach (@userdata)
         # Flush the course logs so reverse user roles immediately updated          # Flush the course logs so reverse user roles immediately updated
         &Apache::lonnet::flushcourselogs();          $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
         $r->print("</p>\n<p>\n".&mt('Processed [_1] user(s).',$counts{'user'}).          $r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}).
                   "</p>\n");                    "</p>\n");
         if ($counts{'role'} > 0) {          if ($counts{'role'} > 0) {
             $r->print("<p>\n".              $r->print("<p>\n".
                       &mt('Roles added for [_1] users. If user is active, the new role will be available when the user next logs in to LON-CAPA.',$counts{'role'})."</p>\n");                        &mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.')."</p>\n");
           } else {
               $r->print('<p>'.&mt('No roles added').'</p>');
         }          }
         if ($counts{'auth'} > 0) {          if ($counts{'auth'} > 0) {
             $r->print("<p>\n".              $r->print("<p>\n".
                       &mt('Authentication changed for [_1] existing users.',                        &mt('Authentication changed for [_1] existing users.',
                           $counts{'auth'})."</p>\n");                            $counts{'auth'})."</p>\n");
         }          }
         if (keys(%alerts) > 0) {          $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules));
             if (ref($alerts{'username'}) eq 'HASH') {  
                 foreach my $dom (sort(keys(%{$alerts{'username'}}))) {  
                     my $count;  
                     if (ref($alerts{'username'}{$dom}) eq 'HASH') {  
                         $count = keys(%{$alerts{'username'}{$dom}});  
                     }   
                     my $domdesc = &Apache::lonnet::domain($domain,'description');  
                     if (ref($curr_rules{$dom}) eq 'HASH') {  
                         $r->print(&Apache::loncommon::instrule_disallow_msg(  
                                  'username',$domdesc,$count,'upload'));  
                     }  
                     $r->print(&Apache::loncommon::user_rule_formats($dom,  
                               $domdesc,$curr_rules{$dom}{'username'},  
                              'username'));  
                 }  
             }  
             if (ref($alerts{'id'}) eq 'HASH') {  
                 foreach my $dom (sort(keys(%{$alerts{'id'}}))) {  
                     my $count;  
                     if (ref($alerts{'id'}{$dom}) eq 'HASH') {  
                         $count = keys(%{$alerts{'id'}{$dom}});  
                     }  
                     my $domdesc = &Apache::lonnet::domain($domain,'description');  
                     if (ref($curr_rules{$dom}) eq 'HASH') {  
                         $r->print(&Apache::loncommon::instrule_disallow_msg(  
                                  'id',$domdesc,$count,'upload'));  
                     }  
                     $r->print(&Apache::loncommon::user_rule_formats($dom,  
                               $domdesc,$curr_rules{$dom}{'id'},'id'));  
                 }  
             }  
         }  
         $r->print('<form name="uploadresult" action="/adm/createuser">');  
         $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','prevphase','currstate']));  
         $r->print('</form>');  
         #####################################          #####################################
         #           Drop students           #          # Display list of students to drop  #
         #####################################          #####################################
         if ($env{'form.fullup'} eq 'yes') {          if ($env{'form.fullup'} eq 'yes') {
             $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");              $r->print('<h3>'.&mt('Students to Drop')."</h3>\n");
             #  Get current classlist              #  Get current classlist
             my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();              my $classlist = &Apache::loncoursedata::get_classlist();
             if (! defined($classlist)) {              if (! defined($classlist)) {
                 $r->print(&mt('There are no students currently enrolled.').                  $r->print('<form name="studentform" method="post" action="/adm/createuser">'.
                           "\n");                            '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
             } else {                            '<p class="LC_info">'.&mt('There are no students with current/future access to the course.').'</p>'.
                             '</form>'."\n");
               } elsif (ref($classlist) eq 'HASH') {
                 # Remove the students we just added from the list of students.                  # Remove the students we just added from the list of students.
                 foreach (@userdata) {                  foreach my $line (@userdata) {
                     my %entries=&Apache::loncommon::record_sep($_);                      my %entries=&Apache::loncommon::record_sep($line);
                     unless (($entries{$fields{'username'}} eq '') ||                      unless (($entries{$fields{'username'}} eq '') ||
                             (!defined($entries{$fields{'username'}}))) {                              (!defined($entries{$fields{'username'}}))) {
                         delete($classlist->{$entries{$fields{'username'}}.                          delete($classlist->{$entries{$fields{'username'}}.
Line 3192  sub upfile_drop_add { Line 4646  sub upfile_drop_add {
                     }                      }
                 }                  }
                 # Print out list of dropped students.                  # Print out list of dropped students.
                 &show_drop_list($r,$classlist,$keylist,'nosort');                  &show_drop_list($r,$classlist,'nosort',$permission);
             }              }
         }          }
     } # end of unless      } # end of unless
       if ($env{'form.fullup'} ne 'yes') {
           $r->print('</form>');
       }
   }
   
   sub print_namespacing_alerts {
       my ($domain,$alerts,$curr_rules) = @_;
       my $output;
       if (ref($alerts) eq 'HASH') {
           if (keys(%{$alerts}) > 0) {
               if (ref($alerts->{'username'}) eq 'HASH') {
                   foreach my $dom (sort(keys(%{$alerts->{'username'}}))) {
                       my $count;
                       if (ref($alerts->{'username'}{$dom}) eq 'HASH') {
                           $count = keys(%{$alerts->{'username'}{$dom}});
                       }
                       my $domdesc = &Apache::lonnet::domain($domain,'description');
                       if (ref($curr_rules->{$dom}) eq 'HASH') {
                           $output .= &Apache::loncommon::instrule_disallow_msg(
                                           'username',$domdesc,$count,'upload');
                       }
                       $output .= &Apache::loncommon::user_rule_formats($dom,
                                      $domdesc,$curr_rules->{$dom}{'username'},
                                      'username');
                   }
               }
               if (ref($alerts->{'id'}) eq 'HASH') {
                   foreach my $dom (sort(keys(%{$alerts->{'id'}}))) {
                       my $count;
                       if (ref($alerts->{'id'}{$dom}) eq 'HASH') {
                           $count = keys(%{$alerts->{'id'}{$dom}});
                       }
                       my $domdesc = &Apache::lonnet::domain($domain,'description');
                       if (ref($curr_rules->{$dom}) eq 'HASH') {
                           $output .= &Apache::loncommon::instrule_disallow_msg(
                                                 'id',$domdesc,$count,'upload');
                       }
                       $output .= &Apache::loncommon::user_rule_formats($dom,
                                       $domdesc,$curr_rules->{$dom}{'id'},'id');
                   }
               }
           }
       }
 }  }
   
 sub user_change_result {  sub user_change_result {
     my ($r,$userresult,$authresult,$roleresult,$counts,$flushc,$username,      my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc,
         $userchg) = @_;          $username,$userdomain,$userchg) = @_;
     my $okresult = 0;      my $okresult = 0;
     if ($userresult ne 'ok') {      if ($userresult ne 'ok') {
         if ($userresult =~ /^error:(.+)$/) {          if ($userresult =~ /^error:(.+)$/) {
             my $error = $1;              my $error = $1;
             $r->print('<br />'.              $r->print('<br />'.
                   &mt('<b>[_1]</b>:  Unable to add/modify: [_2]',$username,$error));                    &mt('[_1]: Unable to add/modify: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error));
         }          }
     } else {      } else {
         $counts->{'user'} ++;          $counts->{'user'} ++;
Line 3216  sub user_change_result { Line 4713  sub user_change_result {
         if ($authresult =~ /^error:(.+)$/) {          if ($authresult =~ /^error:(.+)$/) {
             my $error = $1;              my $error = $1;
             $r->print('<br />'.              $r->print('<br />'.
                   &mt('<b>[_1]</b>:  Unable to modify authentication: [_2]',$username,$error));                    &mt('[_1]: Unable to modify authentication: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error));
         }           } 
     } else {      } else {
         $counts->{'auth'} ++;          $counts->{'auth'} ++;
Line 3226  sub user_change_result { Line 4723  sub user_change_result {
         if ($roleresult =~ /^error:(.+)$/) {          if ($roleresult =~ /^error:(.+)$/) {
             my $error = $1;              my $error = $1;
             $r->print('<br />'.              $r->print('<br />'.
                   &mt('<b>[_1]</b>:  Unable to add role: [_2]',$username,$error));                    &mt('[_1]: Unable to add role: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error));
         }          }
     } else {      } else {
         $counts->{'role'} ++;          $counts->{'role'} ++;
Line 3234  sub user_change_result { Line 4731  sub user_change_result {
     }      }
     if ($okresult) {      if ($okresult) {
         $flushc++;          $flushc++;
         $userchg->{$username}=1;          $userchg->{$username.':'.$userdomain}=1;
         $r->print('. ');          $r->print('. ');
         if ($flushc>15) {          if ($flushc>15) {
             $r->rflush;              $r->rflush;
             $flushc=0;              $flushc=0;
         }          }
     }      }
       if ($idresult) {
           $r->print($idresult);
       }
     return $flushc;      return $flushc;
 }  }
   
 # ========================================================= Menu Phase Two Drop  # ========================================================= Menu Phase Two Drop
 sub print_expire_menu {  sub print_drop_menu {
     my ($r,$context) = @_;      my ($r,$context,$permission,$crstype) = @_;
     $r->print("<h3>".&mt("Expire Users' Roles")."</h3>");      my $heading;
     my $cid=$env{'request.course.id'};      if ($crstype eq 'Community') {
     my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();          $heading = &mt("Drop Members");
       } else {
           $heading = &mt("Drop Students");
       }
       $r->print('<h3>'.$heading.'</h3>'."\n".
                 '<form name="studentform" method="post" action="">'."\n");
       my $classlist = &Apache::loncoursedata::get_classlist();
     if (! defined($classlist)) {      if (! defined($classlist)) {
         $r->print(&mt('There are no students currently enrolled.')."\n");          my $msg = '';
         return;          if ($crstype eq 'Community') {
               $msg = &mt('There are no members currently enrolled.');
           } else {
               $msg = &mt('There are no students currently enrolled.');
           }
           $r->print('<p class="LC_info">'.$msg."</p>\n");
       } else {
           &show_drop_list($r,$classlist,'nosort',$permission,$crstype);
     }      }
     # Print out the available choices      $r->print('</form>'. &Apache::loncommon::end_page());
     &show_drop_list($r,$classlist,$keylist);  
     return;      return;
 }  }
   
   
 # ================================================================== Phase four  # ================================================================== Phase four
   
 sub update_user_list {  sub update_user_list {
     my ($r,$context,$setting,$choice) = @_;      my ($r,$context,$setting,$choice,$crstype) = @_;
     my $now = time;      my $now = time;
     my $count=0;      my $count=0;
       if ($context eq 'course') {
           $crstype = &Apache::loncommon::course_type();
       }
     my @changelist;      my @changelist;
     if ($choice ne '') {      if ($choice eq 'drop') {
         @changelist = &Apache::loncommon::get_env_multiple('form.actionlist');  
     } else {  
         @changelist = &Apache::loncommon::get_env_multiple('form.droplist');          @changelist = &Apache::loncommon::get_env_multiple('form.droplist');
       } else {
           @changelist = &Apache::loncommon::get_env_multiple('form.actionlist');
     }      }
     my %result_text = ( ok    => { 'revoke'   => 'Revoked',      my %result_text = ( ok    => { 'revoke'   => 'Revoked',
                                    'delete'   => 'Deleted',                                     'delete'   => 'Deleted',
                                    'reenable' => 'Re-enabled',                                     'reenable' => 'Re-enabled',
                                    'activate' => 'Activated',                                      'activate' => 'Activated',
                                      'chgdates' => 'Changed Access Dates for',
                                      'chgsec'   => 'Changed section(s) for',
                                      'drop'     => 'Dropped',
                                  },                                   },
                         error => {'revoke'    => 'revoking',                          error => {'revoke'    => 'revoking',
                                   'delete'    => 'deleting',                                    'delete'    => 'deleting',
                                   'reenable'  => 're-enabling',                                    'reenable'  => 're-enabling',
                                   'activate'  => 'activating',                                    'activate'  => 'activating',
                                     'chgdates'  => 'changing access dates for',
                                     'chgsec'    => 'changing section for',
                                     'drop'      => 'dropping',
                                  },                                   },
                       );                        );
     my ($startdate,$enddate);      my ($startdate,$enddate);
Line 3288  sub update_user_list { Line 4808  sub update_user_list {
         ($startdate,$enddate) = &get_dates_from_form();          ($startdate,$enddate) = &get_dates_from_form();
     }      }
     foreach my $item (@changelist) {      foreach my $item (@changelist) {
         my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,@sections,          my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,
             $scopestem);              @sections,$scopestem,$singlesec,$showsecs,$warn_singlesec,
         if ($context eq 'course') {              $nothingtodo,$keepnosection,$credits);
             ($uname,$udom,$role,$sec,$type,$locktype) = split(/\:/,$item,-1);          if ($choice eq 'drop') {
               ($uname,$udom,$sec) = split(/:/,$item,-1);
               $role = 'st';
             $cid = $env{'request.course.id'};              $cid = $env{'request.course.id'};
             $scopestem = '/'.$cid;              $scopestem = '/'.$cid;
             $scopestem =~s/\_/\//g;              $scopestem =~s/\_/\//g;
Line 3300  sub update_user_list { Line 4822  sub update_user_list {
             } else {              } else {
                 $scope = $scopestem.'/'.$sec;                  $scope = $scopestem.'/'.$sec;
             }              }
         } elsif ($context eq 'construction_space') {          } elsif ($context eq 'course') {
               ($uname,$udom,$role,$sec,$type,$locktype,$credits) =
                   split(/\:/,$item);
               $cid = $env{'request.course.id'};
               $scopestem = '/'.$cid;
               $scopestem =~s/\_/\//g;
               if ($sec eq '') {
                   $scope = $scopestem;
               } else {
                   $scope = $scopestem.'/'.$sec;
               }
           } elsif ($context eq 'author') {
             ($uname,$udom,$role) = split(/\:/,$item,-1);              ($uname,$udom,$role) = split(/\:/,$item,-1);
             $scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'};              $scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'};
         } elsif ($context eq 'domain') {          } elsif ($context eq 'domain') {
             if ($setting eq 'domain') {              if ($setting eq 'domain') {
                 ($role,$uname,$udom) = split(/\:/,$item,-1);                  ($role,$uname,$udom) = split(/\:/,$item,-1);
                 $scope = '/'.$env{'request.role.domain'}.'/';                  $scope = '/'.$env{'request.role.domain'}.'/';
             } elsif ($setting eq 'construction_space') {               } elsif ($setting eq 'author') { 
                 ($uname,$udom,$role,$scope) = split(/\:/,$item);                  ($uname,$udom,$role,$scope) = split(/\:/,$item);
             } elsif ($setting eq 'course') {              } elsif ($setting eq 'course') {
                 ($uname,$udom,$role,$cid,$sec,$type,$locktype) =                   ($uname,$udom,$role,$cid,$sec,$type,$locktype,$credits) = 
                     split(/\:/,$item);                      split(/\:/,$item);
                 $scope = '/'.$cid;                  $scope = '/'.$cid;
                 $scope =~s/\_/\//g;                  $scope =~s/\_/\//g;
Line 3319  sub update_user_list { Line 4852  sub update_user_list {
                 }                  }
             }              }
         }          }
         my $plrole = &Apache::lonnet::plaintext($role);          my $plrole = &Apache::lonnet::plaintext($role,$crstype);
         my ($uid,$first,$middle,$last,$gene,$sec);  
         my $start = $env{'form.'.$item.'_start'};          my $start = $env{'form.'.$item.'_start'};
         my $end = $env{'form.'.$item.'_end'};          my $end = $env{'form.'.$item.'_end'};
         # revoke or delete user role          if ($choice eq 'drop') {
         if ($choice eq 'revoke') {              # drop students
               $end = $now;
               $type = 'manual';
               $result =
                   &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
           } elsif ($choice eq 'revoke') {
               # revoke or delete user role
             $end = $now;               $end = $now; 
             if ($role eq 'st') {              if ($role eq 'st') {
                 $result =                   $result = 
                     &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);                      &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
             } else {              } else {
                 $result =                   $result = 
                     &Apache::lonnet::revokerole($udom,$uname,$scope,$role);                      &Apache::lonnet::revokerole($udom,$uname,$scope,$role,
                                                   '','',$context);
             }              }
         } elsif ($choice eq 'delete') {          } elsif ($choice eq 'delete') {
             $start = -1;  
             $end = -1;  
             if ($role eq 'st') {              if ($role eq 'st') {
 # FIXME - how does role deletion affect classlist?                  &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context,$credits);
                 &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);              }
             } else {              $result =
                 $result =                  &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,
                     &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,                                              $start,1,'',$context);
                                                 0,1);  
              }  
         } else {          } else {
             #reenable, activate, change access dates or change section              #reenable, activate, change access dates or change section
             if ($choice ne 'chgsec') {              if ($choice ne 'chgsec') {
Line 3352  sub update_user_list { Line 4887  sub update_user_list {
             }              }
             if ($choice eq 'reenable') {              if ($choice eq 'reenable') {
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);                      $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                 } else {                  } else {
                     $result =                       $result = 
                         &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,                          &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
                                                     $now);                                                      $now,'','',$context);
                 }                  }
             } elsif ($choice eq 'activate') {              } elsif ($choice eq 'activate') {
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);                      $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                 } else {                  } else {
                     $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,                      $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
                                             $now);                                              $now,'','',$context);
                 }                  }
             } elsif ($choice eq 'chgdates') {              } elsif ($choice eq 'chgdates') {
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);                      $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                 } else {                  } else {
                     $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,                      $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
                                                 $start);                                                  $start,'','',$context);
                 }                  }
             } elsif ($choice eq 'chgsec') {              } elsif ($choice eq 'chgsec') {
                 my (@newsecs,$revresult,$nochg,@retained);                  my (@newsecs,$revresult,$nochg,@retained);
                 if ($role ne 'cc') {                  if (($role ne 'cc') && ($role ne 'co')) {
                     @newsecs = split(/,/,$env{'form.newsecs'});                      my @secs = sort(split(/,/,$env{'form.newsecs'}));
                       if (@secs) {
                           my %curr_groups = &Apache::longroup::coursegroups();
                           foreach my $sec (@secs) {
                               next if (($sec =~ /\W/) || ($sec eq 'none') ||
                               (exists($curr_groups{$sec})));
                               push(@newsecs,$sec);
                           }
                       }
                 }                  }
                 # remove existing section if not to be retained.                     # remove existing section if not to be retained.   
                 if (!$env{'form.retainsec'}) {                  if (!$env{'form.retainsec'} || ($role eq 'st')) {
                     if ($sec eq '') {                      if ($sec eq '') {
                         if (@newsecs == 0) {                          if (@newsecs == 0) {
                             $result = &mt('No change in section assignment (none)');                              $result = 'ok';
                             $nochg = 1;                              $nochg = 1;
                         }                              $nothingtodo = 1;
                     } else {                          } else {
                         if (!grep(/^\Q$sec\E$/,@newsecs)) {  
                             $revresult =                              $revresult =
                                &Apache::lonnet::revokerole($udom,$uname,$scope,$role);                                  &Apache::lonnet::revokerole($udom,$uname,
                                                               $scope,$role,
                                                               '','',$context);
                           } 
                       } else {
                           if (@newsecs > 0) {
                               if (grep(/^\Q$sec\E$/,@newsecs)) {
                                   push(@retained,$sec);
                               } else {
                                   $revresult =
                                       &Apache::lonnet::revokerole($udom,$uname,
                                                                   $scope,$role,
                                                                   '','',$context);
                               }
                         } else {                          } else {
                             push(@retained,$sec);                              $revresult =
                                   &Apache::lonnet::revokerole($udom,$uname,
                                                               $scope,$role,
                                                               '','',$context);
                         }                          }
                     }                      }
                 } else {                  } else {
                     push(@retained,$sec);                      if ($sec eq '') {
                           $nochg = 1;
                           $keepnosection = 1;
                       } else {
                           push(@retained,$sec);
                       }
                 }                  }
                 # add new sections                  # add new sections
                   my (@diffs,@shownew);
                   if (@retained) {
                       @diffs = &Apache::loncommon::compare_arrays(\@retained,\@newsecs);
                   } else {
                       @diffs = @newsecs;
                   }
                 if (@newsecs == 0) {                  if (@newsecs == 0) {
                     if (!$nochg) {                      if ($nochg) {
                         if ($sec ne '') {                          $result = 'ok';
                             if ($role eq 'st') {                          $nothingtodo = 1;
                                 $result =                       } else {
                                     &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid);                          if ($role eq 'st') {
                             } else {                              $result = 
                                 my $newscope = $scopestem;                                  &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                                 $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start);                          } else {
                             }                              my $newscope = $scopestem;
                               $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);
                         }                          }
                     }                      }
                       $showsecs = &mt('No section');
                   } elsif (@diffs == 0) {
                       $result = 'ok';
                       $nothingtodo = 1;
                 } else {                  } else {
                     foreach my $newsec (@newsecs) {                       foreach my $newsec (@newsecs) {
                         if (!grep(/^\Q$newsec\E$/,@retained)) {                          if (!grep(/^\Q$newsec\E$/,@retained)) {
                             if ($role eq 'st') {                              if ($role eq 'st') {
                                 $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid);                                  $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                                   if (@newsecs > 1) {
                                       my $showsingle; 
                                       if ($newsec eq '') {
                                           $showsingle = &mt('No section');
                                       } else {
                                           $showsingle = $newsec;
                                       }
                                       if ($crstype eq 'Community') {
                                           $warn_singlesec = &mt('Although more than one section was indicated, a role was only added for the first section - [_1], as each community member may only be in one section at a time.','<i>'.$showsingle.'</i>');
                                       } else { 
                                           $warn_singlesec = &mt('Although more than one section was indicated, a role was only added for the first section - [_1], as each student may only be in one section of a course at a time.','<i>'.$showsingle.'</i>');
                                       }
                                       $showsecs = $showsingle; 
                                       last;
                                   } else {
                                       if ($newsec eq '') {
                                           $showsecs = &mt('No section');
                                       } else {
                                           $showsecs = $newsec;
                                       }
                                   }
                             } else {                              } else {
                                 my $newscope = $scopestem;                                  my $newscope = $scopestem;
                                 if ($newsec ne '') {                                  if ($newsec ne '') {
                                    $newscope .= '/'.$newsec;                                     $newscope .= '/'.$newsec;
                                      push(@shownew,$newsec); 
                                 }                                  }
                                 $result = &Apache::lonnet::assignrole($udom,$uname,                                  $result = &Apache::lonnet::assignrole($udom,$uname,
                                                         $newscope,$role,$end,$start);                                                          $newscope,$role,$end,$start);
                                   
                             }                              }
                         }                          }
                     }                      }
                 }                  }
                   unless ($role eq 'st') {
                       unless ($showsecs) {
                           my @tolist = sort(@shownew,@retained);
                           if ($keepnosection) {
                               push(@tolist,&mt('No section'));
                           }
                           $showsecs = join(', ',@tolist);
                       }
                   }
               }
           }
           my $extent = $scope;
           if ($choice eq 'drop' || $context eq 'course') {
               my ($cnum,$cdom,$cdesc) = &get_course_identity($cid);
               if ($cdesc) {
                   $extent = $cdesc;
             }              }
         }          }
         if ($result eq 'ok' || $result eq 'ok:') {          if ($result eq 'ok' || $result eq 'ok:') {
             $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for [_3]",              my $dates;
                           $plrole,$scope,$uname.':'.$udom).'<br />');              if (($choice eq 'chgsec') || ($choice eq 'chgdates')) {
             $count++;                  $dates = &dates_feedback($start,$end,$now);
               }
               if ($choice eq 'chgsec') {
                   if ($nothingtodo) {
                       $r->print(&mt("Section assignment for role of '[_1]' in [_2] for '[_3]' unchanged.",$plrole,$extent,'<i>'.
                             &Apache::loncommon::plainname($uname,$udom).
                             '</i>').' ');
                       if ($sec eq '') {
                           $r->print(&mt('[_1]No section[_2] - [_3]','<b>','</b>',$dates));
                       } else {
                           $r->print(&mt('Section(s): [_1] - [_2]',
                                         '<b>'.$showsecs.'</b>',$dates));
                       }
                       $r->print('<br />');
                   } else {
                       $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]' to [_4] - [_5]",$plrole,$extent,
                           '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',
                           '<b>'.$showsecs.'</b>',$dates).'<br />');
                      $count ++;
                  }
                  if ($warn_singlesec) {
                      $r->print('<div class="LC_warning">'.$warn_singlesec.'</div>');
                  }
               } elsif ($choice eq 'chgdates') {
                   $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]' - [_4]",$plrole,$extent, 
                         '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',
                         $dates).'<br />');
                  $count ++;
               } else {
                   $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]'.",$plrole,$extent,
                         '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>').
                             '<br />');
                   $count ++;
               }
         } else {          } else {
             $r->print(              $r->print(
                 &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for [_3]:[_4]",                  &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for '[_3]': [_4].",
                     $plrole,$scope,$uname.':'.$udom,$result).'<br />');                      $plrole,$extent,
                       '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',
                       $result).'<br />');
           }
       }
       $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n");
       if ($choice eq 'drop') {
           $r->print('<input type="hidden" name="action" value="listusers" />'."\n".
                     '<input type="hidden" name="Status" value="Active" />'."\n".
                     '<input type="hidden" name="showrole" value="st" />'."\n");
       } else {
           foreach my $item ('action','sortby','roletype','showrole','Status','secfilter','grpfilter') {
               if ($env{'form.'.$item} ne '') {
                   $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.
                             '" />'."\n");
               }
         }          }
     }      }
     $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,users].",$count).'</b></p>');      $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} [quant,_1,user role,user roles,no user roles].",$count).'</b></p>');
     if ($count > 0) {      if ($count > 0) {
         if ($choice eq 'revoke') {          if ($choice eq 'revoke' || $choice eq 'drop') {
             $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.</p>'));              $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>');
         }          }
         # Flush the course logs so reverse user roles immediately updated          # Flush the course logs so reverse user roles immediately updated
         &Apache::lonnet::flushcourselogs();          $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
     }      }
     if ($env{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {          if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {
             $r->print(&make_dates_default($startdate,$enddate));              $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));
           }
       }
       my $linktext = &mt('Display User Lists');
       if ($choice eq 'drop') {
           $linktext = &mt('Display current class roster');
       }
       $r->print(
           &Apache::lonhtmlcommon::actionbox(
               ['<a href="javascript:document.studentform.submit()">'.$linktext.'</a>'])
          .'</form>'."\n");
   }
   
   sub dates_feedback {
       my ($start,$end,$now) = @_;
       my $dates;
       if ($start < $now) {
           if ($end == 0) {
               $dates = &mt('role(s) active now; no end date');
           } elsif ($end > $now) {
               $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end));
           } else {
               $dates = &mt('role(s) expired: [_1].',&Apache::lonlocal::locallocaltime($end));
           }
        } else {
           if ($end == 0 || $end > $now) {
               $dates = &mt('future role(s); starts: [_1].',&Apache::lonlocal::locallocaltime($start));
           } else {
               $dates = &mt('role(s) expired: [_1].',&Apache::lonlocal::locallocaltime($end));
         }          }
     }      }
       return $dates;
 }  }
   
 sub classlist_drop {  sub classlist_drop {
     my ($scope,$uname,$udom,$now,$action) = @_;      my ($scope,$uname,$udom,$now) = @_;
     my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});      my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
     my $cid=$cdom.'_'.$cnum;      if (&Apache::lonnet::is_course($cdom,$cnum)) {
     my $user = $uname.':'.$udom;  
     if ($action eq 'drop') {  
         if (!&active_student_roles($cnum,$cdom,$uname,$udom)) {          if (!&active_student_roles($cnum,$cdom,$uname,$udom)) {
             my $result =              my %user;
                 &Apache::lonnet::cput('classlist',              my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%user,$now);
                                       { $user => $now },  
                                       $env{'course.'.$cid.'.domain'},  
                                       $env{'course.'.$cid.'.num'});  
             return &mt('Drop from classlist: [_1]',              return &mt('Drop from classlist: [_1]',
                        '<b>'.$result.'</b>').'<br />';                         '<b>'.$result.'</b>').'<br />';
         }          }
Line 3529  sub set_login { Line 5214  sub set_login {
 }  }
   
 sub course_sections {  sub course_sections {
     my ($sections_count,$role) = @_;      my ($sections_count,$role,$current_sec) = @_;
     my $output = '';      my $output = '';
     my @sections = (sort {$a <=> $b} keys %{$sections_count});      my @sections = (sort {$a <=> $b} keys %{$sections_count});
     if (scalar(@sections) == 1) {      my $numsec = scalar(@sections);
       my $is_selected = ' selected="selected"';
       if ($numsec <= 1) {
         $output = '<select name="currsec_'.$role.'" >'."\n".          $output = '<select name="currsec_'.$role.'" >'."\n".
                   '  <option value="">Select</option>'."\n".                    '  <option value="">'.&mt('Select').'</option>'."\n";
                   '  <option value="">No section</option>'."\n".          if ($current_sec eq 'none') {
               $output .=       
                     '  <option value=""'.$is_selected.'>'.&mt('No section').'</option>'."\n";
           } else {
               $output .=
                     '  <option value="">'.&mt('No section').'</option>'."\n";
           }
           if ($numsec == 1) {
               if ($current_sec eq $sections[0]) {
                   $output .=
                     '  <option value="'.$sections[0].'"'.$is_selected.'>'.$sections[0].'</option>'."\n";
               } else {
                   $output .=  
                   '  <option value="'.$sections[0].'" >'.$sections[0].'</option>'."\n";                    '  <option value="'.$sections[0].'" >'.$sections[0].'</option>'."\n";
               }
           }
     } else {      } else {
         $output = '<select name="currsec_'.$role.'" ';          $output = '<select name="currsec_'.$role.'" ';
         my $multiple = 4;          my $multiple = 4;
         if (scalar(@sections) < 4) { $multiple = scalar(@sections); }          if (scalar(@sections) < 4) { $multiple = scalar(@sections); }
         $output .= 'multiple="multiple" size="'.$multiple.'">'."\n";          if ($role eq 'st') {
               $output .= '>'."\n".
                          '  <option value="">'.&mt('Select').'</option>'."\n";
               if ($current_sec eq 'none') {
                   $output .= 
                          '  <option value=""'.$is_selected.'>'.&mt('No section')."</option>\n";
               } else {
                   $output .=
                          '  <option value="">'.&mt('No section')."</option>\n";
               }
           } else {
               $output .= 'multiple="multiple" size="'.$multiple.'">'."\n";
           }
         foreach my $sec (@sections) {          foreach my $sec (@sections) {
             $output .= '<option value="'.$sec.'">'.$sec."</option>\n";              if ($current_sec eq $sec) {
                   $output .= '<option value="'.$sec.'"'.$is_selected.'>'.$sec."</option>\n";
               } else {
                   $output .= '<option value="'.$sec.'">'.$sec."</option>\n";
               }
         }          }
     }      }
     $output .= '</select>';      $output .= '</select>';
Line 3561  sub get_groupslist { Line 5278  sub get_groupslist {
 }  }
   
 sub setsections_javascript {  sub setsections_javascript {
     my ($form,$groupslist) = @_;      my ($formname,$groupslist,$mode,$checkauth,$crstype,$showcredits) = @_;
     my ($checkincluded,$finish,$roleplace,$setsection_js);      my ($checkincluded,$finish,$rolecode,$setsection_js);
     if ($form eq 'cu') {      if ($mode eq 'upload') {
         $checkincluded = 'formname.elements[i-1].checked == true';          $checkincluded = 'formname.name == "'.$formname.'"';
         $finish = 'formname.submit()';          $finish = "return 'ok';";
         $roleplace = 3;          $rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n";
       } elsif ($formname eq 'cu') {
           if (($crstype eq 'Course') && ($showcredits)) {
               $checkincluded = "((role == 'st') && (formname.elements[i-2].checked == true)) || ((role != 'st') && (formname.elements[i-1].checked == true))";
           } else {
               $checkincluded = 'formname.elements[i-1].checked == true';
           }
           if ($checkauth) {
               $finish = "var authcheck = auth_check();\n".
                         "   if (authcheck == 'ok') {\n".
                         "       formname.submit();\n".
                         "   }\n";
           } else {
               $finish = 'formname.submit()';
           }
           $rolecode = "var match = str.split('_');
                   var role = match[3];\n";
       } elsif ($formname eq 'enrollstudent') {
           $checkincluded = 'formname.name == "'.$formname.'"';
           if ($checkauth) {
               $finish = "var authcheck = auth_check();\n".
                         "   if (authcheck == 'ok') {\n".
                         "       formname.submit();\n".
                         "   }\n";
           } else {
               $finish = 'formname.submit()';
           }
           $rolecode = "var match = str.split('_');
                   var role = match[1];\n";
     } else {      } else {
         $checkincluded = 'formname.name == "'.$form.'"';           $checkincluded = 'formname.name == "'.$formname.'"'; 
         $finish = "seccheck = 'ok';";          $finish = "seccheck = 'ok';";
         $roleplace = 1;          $rolecode = "var match = str.split('_');
                   var role = match[1];\n";
         $setsection_js = "var seccheck = 'alert';";           $setsection_js = "var seccheck = 'alert';"; 
     }      }
     my %alerts = &Apache::lonlocal::texthash(      my %alerts = &Apache::lonlocal::texthash(
                     secd => 'Section designations do not apply to Course Coordinator roles.',                      secd => 'Section designations do not apply to Course Coordinator roles.',
                       sedn => 'Section designations do not apply to Coordinator roles.',
                     accr => 'A course coordinator role will be added with access to all sections.',                      accr => 'A course coordinator role will be added with access to all sections.',
                       acor => 'A coordinator role will be added with access to all sections',
                     inea => 'In each course, each user may only have one student role at a time.',                      inea => 'In each course, each user may only have one student role at a time.',
                     youh => 'You had selected ',                      inco => 'In each community, each user may only have one member role at a time.',
                       youh => 'You had selected',
                     secs => 'sections.',                      secs => 'sections.',
                     plmo => 'Please modify your selections so they include no more than one section.',                      plmo => 'Please modify your selections so they include no more than one section.',
                     mayn => 'may not be used as the name for a section, as it is a reserved word.',                      mayn => 'may not be used as the name for a section, as it is a reserved word.',
                     plch => 'Please choose a different section name.',                      plch => 'Please choose a different section name.',
                     mnot => 'may not be used as a section name, as it is the name of a course group.',                      mnot => 'may not be used as a section name, as it is the name of a course group.',
                     secn => 'Section names and group names must be distinct. Please choose a different section name.',                      secn => 'Section names and group names must be distinct. Please choose a different section name.',
                       nonw => 'Section names may only contain letters or numbers.',
                  );                                   );                
     $setsection_js .= <<"ENDSECCODE";      $setsection_js .= <<"ENDSECCODE";
   
 function setSections(formname) {  function setSections(formname,crstype) {
     var re1 = /^currsec_/;      var re1 = /^currsec_/;
       var re2 =/\\W/;
       var trimleading = /^\\s+/;
       var trimtrailing = /\\s+\$/;
     var groups = new Array($groupslist);      var groups = new Array($groupslist);
     for (var i=0;i<formname.elements.length;i++) {      for (var i=0;i<formname.elements.length;i++) {
         var str = formname.elements[i].name;          var str = formname.elements[i].name;
         var checkcurr = str.match(re1);          var checkcurr = str.match(re1);
         if (checkcurr != null) {          if (checkcurr != null) {
               var num = i;
               $rolecode
             if ($checkincluded) {              if ($checkincluded) {
                 var match = str.split('_');                  if (role == 'cc' || role == 'co') {
                 var role = match[$roleplace];                      if (role == 'cc') {
                 if (role == 'cc') {                          alert("$alerts{'secd'}\\n$alerts{'accr'}");
                     alert("$alerts{'secd'}\\n$alerts{'accr'}");                      } else {
                 }                          alert("$alerts{'sedn'}\\n$alerts{'acor'}");
                 else {                      }
                   } else {
                     var sections = '';                      var sections = '';
                     var numsec = 0;                      var numsec = 0;
                     var sections;                      var fromexisting = new Array();
                     for (var j=0; j<formname.elements[i].length; j++) {                      for (var j=0; j<formname.elements[num].length; j++) {
                         if (formname.elements[i].options[j].selected == true ) {                          if (formname.elements[num].options[j].selected == true ) {
                             if (formname.elements[i].options[j].value != "") {                              var addsec = formname.elements[num].options[j].value;
                               if ((addsec != "") && (addsec != null)) {
                                   fromexisting.push(addsec);
                                 if (numsec == 0) {                                  if (numsec == 0) {
                                     if (formname.elements[i].options[j].value != "") {                                      sections = addsec;
                                         sections = formname.elements[i].options[j].value;                                  } else {
                                         numsec ++;                                      sections = sections + "," +  addsec;
                                     }  
                                 }  
                                 else {  
                                     sections = sections + "," +  formname.elements[i].options[j].value  
                                     numsec ++;  
                                 }                                  }
                                   numsec ++;
                             }                              }
                         }                          }
                     }                      }
                     if (numsec > 0) {                      var newsecs = formname.elements[num+1].value;
                         if (formname.elements[i+1].value != "" && formname.elements[i+1].value != null) {                      var validsecs = new Array();
                             sections = sections + "," +  formname.elements[i+1].value;                      var validsecstr = '';
                         }                      var badsecs = new Array();
                     }  
                     else {  
                         sections = formname.elements[i+1].value;  
                     }  
                     var newsecs = formname.elements[i+1].value;  
                     var numsplit;  
                     if (newsecs != null && newsecs != "") {                      if (newsecs != null && newsecs != "") {
                         numsplit = newsecs.split(/,/g);                          var numsplit;
                         numsec = numsec + numsplit.length;                          if (newsecs.indexOf(',') == -1) {
                               numsplit = new Array(newsecs);
                           } else {
                               numsplit = newsecs.split(/,/g);
                           }
                           for (var m=0; m<numsplit.length; m++) {
                               var newsec = numsplit[m];
                               newsec = newsec.replace(trimleading,'');
                               newsec = newsec.replace(trimtrailing,'');
                               if (re2.test(newsec) == true) {
                                   badsecs.push(newsec);
                               } else {
                                   if (newsec != '') {
                                       var isnew = 1;
                                       if (fromexisting != null) {
                                           for (var n=0; n<fromexisting.length; n++) {
                                               if (newsec == fromexisting[n]) {
                                                   isnew = 0;
                                               }
                                           }
                                       }
                                       if (isnew == 1) {
                                           validsecs.push(newsec);
                                       }
                                   }
                               }
                           }
                           if (badsecs.length > 0) {
                               alert("$alerts{'nonw'}\\n$alerts{'plch'}");
                               return;
                           }
                           numsec = numsec + validsecs.length;
                     }                      }
   
                     if ((role == 'st') && (numsec > 1)) {                      if ((role == 'st') && (numsec > 1)) {
                         alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}")                          if (crstype == 'Community') {
                               alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                           } else {
                               alert("$alerts{'inco'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                           }
                         return;                          return;
                     }                      } else {
                     else {                          if (validsecs != null) {
                         if (numsplit != null) {                              for (var j=0; j<validsecs.length; j++) {
                             for (var j=0; j<numsplit.length; j++) {                                  if (validsecstr == '' || validsecstr == null) {
                                 if ((numsplit[j] == 'all') ||                                      validsecstr = validsecs[j];
                                     (numsplit[j] == 'none')) {                                  } else {
                                     alert("'"+numsplit[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");                                      validsecstr += ','+validsecs[j];
                                   }
                                   if ((validsecs[j] == 'all') ||
                                       (validsecs[j] == 'none')) {
                                       alert("'"+validsecs[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
                                     return;                                      return;
                                 }                                  }
                                 for (var k=0; k<groups.length; k++) {                                  for (var k=0; k<groups.length; k++) {
                                     if (numsplit[j] == groups[k]) {                                      if (validsecs[j] == groups[k]) {
                                         alert("'"+numsplit[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");                                          alert("'"+validsecs[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
                                         return;                                          return;
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                          }
                         formname.elements[i+2].value = sections;  
                     }                      }
                       if ((validsecstr != '') && (validsecstr != null)) {
                           if ((sections == '') || (sections == null)) {
                               sections = validsecstr;
                           } else {
                               sections = sections + "," + validsecstr;
                           }
                       }
                       formname.elements[num+2].value = sections;
                 }                  }
             }              }
         }          }
Line 3667  ENDSECCODE Line 5460  ENDSECCODE
     return $setsection_js;       return $setsection_js; 
 }  }
   
   sub can_create_user {
       my ($dom,$context,$usertype) = @_;
       my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
       my $cancreate = 1;
       if (&Apache::lonnet::allowed('mau',$dom)) {
           return $cancreate;
       }
       if (ref($domconf{'usercreation'}) eq 'HASH') {
           if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') {
               if ($context eq 'course' || $context eq 'author' || $context eq 'requestcrs') {
                   my $creation = $domconf{'usercreation'}{'cancreate'}{$context};
                   if ($creation eq 'none') {
                       $cancreate = 0;
                   } elsif ($creation ne 'any') {
                       if (defined($usertype)) {
                           if ($creation ne $usertype) {
                               $cancreate = 0;
                           }
                       }
                   }
               }
           }
       }
       return $cancreate;
   }
   
   sub can_modify_userinfo {
       my ($context,$dom,$fields,$userroles) = @_;
       my %domconfig =
          &Apache::lonnet::get_dom('configuration',['usermodification'],
                                   $dom);
       my %canmodify;
       if (ref($fields) eq 'ARRAY') {
           foreach my $field (@{$fields}) {
               $canmodify{$field}  = 0;
               if (&Apache::lonnet::allowed('mau',$dom)) {
                   $canmodify{$field} = 1;
               } else {
                   if (ref($domconfig{'usermodification'}) eq 'HASH') {
                       if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') {
                           if (ref($userroles) eq 'ARRAY') {
                               foreach my $role (@{$userroles}) {
                                   my $testrole;
                                   if ($context eq 'selfcreate') {
                                       $testrole = $role;
                                   } else {
                                       if ($role =~ /^cr\//) {
                                           $testrole = 'cr';
                                       } else {
                                           $testrole = $role;
                                       }
                                   }
                                   if (ref($domconfig{'usermodification'}{$context}{$testrole}) eq 'HASH') {
                                       if ($domconfig{'usermodification'}{$context}{$testrole}{$field}) {
                                           $canmodify{$field} = 1;
                                           last;
                                       }
                                   }
                               }
                           } else {
                               foreach my $key (keys(%{$domconfig{'usermodification'}{$context}})) {
                                   if (ref($domconfig{'usermodification'}{$context}{$key}) eq 'HASH') {
                                       if ($domconfig{'usermodification'}{$context}{$key}{$field}) {
                                           $canmodify{$field} = 1;
                                           last;
                                       }
                                   }
                               }
                           }
                       }
                   } elsif ($context eq 'course') {
                       if (ref($userroles) eq 'ARRAY') {
                           if (grep(/^st$/,@{$userroles})) {
                               $canmodify{$field} = 1;
                           }
                       } else {
                           $canmodify{$field} = 1;
                       }
                   }
               }
           }
       }
       return %canmodify;
   }
   
   sub check_usertype {
       my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_;
       my $usertype;
       if ((ref($got_rules) eq 'HASH') && (ref($curr_rules) eq 'HASH')) {
           if (!$got_rules->{$dom}) {
               my %domconfig = &Apache::lonnet::get_dom('configuration',
                                                 ['usercreation'],$dom);
               if (ref($domconfig{'usercreation'}) eq 'HASH') {
                   foreach my $item ('username','id') {
                       if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') {
                           $curr_rules->{$dom}{$item} =
                                   $domconfig{'usercreation'}{$item.'_rule'};
                       }
                   }
               }
               $got_rules->{$dom} = 1;
           }
           if (ref($rules) eq 'HASH') {
               my @user_rules;
               if (ref($curr_rules->{$dom}{'username'}) eq 'ARRAY') {
                   foreach my $rule (keys(%{$rules})) {
                       if (grep(/^\Q$rule\E/,@{$curr_rules->{$dom}{'username'}})) {
                           push(@user_rules,$rule);
                       }
                   } 
               }
               if (@user_rules > 0) {
                   my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules);
                   if (keys(%rule_check) > 0) {
                       $usertype = 'unofficial';
                       foreach my $item (keys(%rule_check)) {
                           if ($rule_check{$item}) {
                               $usertype = 'official';
                               last;
                           }
                       }
                   }
               }
           }
       }
       return $usertype;
   }
   
   sub roles_by_context {
       my ($context,$custom,$crstype) = @_;
       my @allroles;
       if ($context eq 'course') {
           @allroles = ('st');
           if ($env{'request.role'} =~ m{^dc\./}) {
               push(@allroles,'ad');
           }
           push(@allroles,('ta','ep','in'));
           if ($crstype eq 'Community') {
               push(@allroles,'co');
           } else {
               push(@allroles,'cc');
           }
           if ($custom) {
               push(@allroles,'cr');
           }
       } elsif ($context eq 'author') {
           @allroles = ('ca','aa');
       } elsif ($context eq 'domain') {
           @allroles = ('li','ad','dg','sc','au','dc');
       }
       return @allroles;
   }
   
   sub get_permission {
       my ($context,$crstype) = @_;
       my %permission;
       if ($context eq 'course') {
           my $custom = 1;
           my @allroles = &roles_by_context($context,$custom,$crstype);
           foreach my $role (@allroles) {
               if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
                   $permission{'cusr'} = 1;
                   last;
               }
           }
           if (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) {
               $permission{'custom'} = 1;
           }
           if (&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) {
               $permission{'view'} = 1;
           }
           if (!$permission{'view'}) {
               my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
               $permission{'view'} =  &Apache::lonnet::allowed('vcl',$scope);
               if ($permission{'view'}) {
                   $permission{'view_section'} = $env{'request.course.sec'};
               }
           }
           if (!$permission{'cusr'}) {
               if ($env{'request.course.sec'} ne '') {
                   my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
                   $permission{'cusr'} = (&Apache::lonnet::allowed('cst',$scope));
                   if ($permission{'cusr'}) {
                       $permission{'cusr_section'} = $env{'request.course.sec'};
                   }
               }
           }
           if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
               $permission{'grp_manage'} = 1;
           }
       } elsif ($context eq 'author') {
           $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});
           $permission{'view'} = $permission{'cusr'};
       } else {
           my @allroles = &roles_by_context($context);
           foreach my $role (@allroles) {
               if (&Apache::lonnet::allowed('c'.$role,$env{'request.role.domain'})) {
                   $permission{'cusr'} = 1;
                   last;
               }
           }
           if (!$permission{'cusr'}) {
               if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
                   $permission{'cusr'} = 1;
               }
           }
           if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) {
               $permission{'custom'} = 1;
           }
           $permission{'view'} = $permission{'cusr'};
       }
       my $allowed = 0;
       foreach my $perm (values(%permission)) {
           if ($perm) { $allowed=1; last; }
       }
       return (\%permission,$allowed);
   }
   
   # ==================================================== 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;
   }
   
   sub roles_on_upload {
       my ($context,$setting,$crstype,%customroles) = @_;
       my (@possible_roles,@permitted_roles);
       @possible_roles = &curr_role_permissions($context,$setting,1,$crstype);
       foreach my $role (@possible_roles) {
           if ($role eq 'cr') {
               push(@permitted_roles,keys(%customroles));
           } else {
               push(@permitted_roles,$role);
           }
       }
       return @permitted_roles;
   }
   
   sub get_course_identity {
       my ($cid) = @_;
       my ($cnum,$cdom,$cdesc);
       if ($cid eq '') {
           $cid = $env{'request.course.id'}
       }
       if ($cid ne '') {
           $cnum = $env{'course.'.$cid.'.num'};
           $cdom = $env{'course.'.$cid.'.domain'};
           $cdesc = $env{'course.'.$cid.'.description'};
           if ($cnum eq '' || $cdom eq '') {
               my %coursehash =
                   &Apache::lonnet::coursedescription($cid,{'one_time' => 1});
               $cdom = $coursehash{'domain'};
               $cnum = $coursehash{'num'};
               $cdesc = $coursehash{'description'};
           }
       }
       return ($cnum,$cdom,$cdesc);
   }
   
   sub dc_setcourse_js {
       my ($formname,$mode,$context,$showcredits) = @_;
       my ($dc_setcourse_code,$authen_check);
       my $cctext = &Apache::lonnet::plaintext('cc');
       my $cotext = &Apache::lonnet::plaintext('co');
       my %alerts = &sectioncheck_alerts();
       my $role = 'role';
       if ($mode eq 'upload') {
           $role = 'courserole';
       } else {
           $authen_check = &verify_authen($formname,$context);
       }
       $dc_setcourse_code = (<<"SCRIPTTOP");
   $authen_check
   
   function setCourse() {
       var course = document.$formname.dccourse.value;
       if (course != "") {
           if (document.$formname.dcdomain.value != document.$formname.origdom.value) {
               alert("$alerts{'curd'}");
               return;
           }
           var userrole = document.$formname.$role.options[document.$formname.$role.selectedIndex].value
           var section="";
           var numsections = 0;
           var newsecs = new Array();
           for (var i=0; i<document.$formname.currsec.length; i++) {
               if (document.$formname.currsec.options[i].selected == true ) {
                   if (document.$formname.currsec.options[i].value != "" && document.$formname.currsec.options[i].value != null) {
                       if (numsections == 0) {
                           section = document.$formname.currsec.options[i].value
                           numsections = 1;
                       }
                       else {
                           section = section + "," +  document.$formname.currsec.options[i].value
                           numsections ++;
                       }
                   }
               }
           }
           if (document.$formname.newsec.value != "" && document.$formname.newsec.value != null) {
               if (numsections == 0) {
                   section = document.$formname.newsec.value
               }
               else {
                   section = section + "," +  document.$formname.newsec.value
               }
               newsecs = document.$formname.newsec.value.split(/,/g);
               numsections = numsections + newsecs.length;
           }
           if ((userrole == 'st') && (numsections > 1)) {
               if (document.$formname.crstype.value == 'Community') {
                   alert("$alerts{'inco'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")
               } else {
                   alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")
               }
               return;
           }
           for (var j=0; j<newsecs.length; j++) {
               if ((newsecs[j] == 'all') || (newsecs[j] == 'none')) {
                   alert("'"+newsecs[j]+"' $alerts{'mayn'}.\\n$alerts{'plsc'}.");
                   return;
               }
               if (document.$formname.groups.value != '') {
                   var groups = document.$formname.groups.value.split(/,/g);
                   for (var k=0; k<groups.length; k++) {
                       if (newsecs[j] == groups[k]) {
                           if (document.$formname.crstype.value == 'Community') {
                               alert("'"+newsecs[j]+"' $alerts{'mayc'}.\\n$alerts{'secn'}. $alerts{'plsc'}.");
                           } else {
                               alert("'"+newsecs[j]+"' $alerts{'mayt'}.\\n$alerts{'secn'}. $alerts{'plsc'}.");
                           }
                           return;
                       }
                   }
               }
           }
           if ((userrole == 'cc') && (numsections > 0)) {
               alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}.");
               section = "";
           }
           if ((userrole == 'co') && (numsections > 0)) {
               alert("$alerts{'secd'} $cotext $alerts{'role'}.\\n$alerts{'accr'}.");
               section = "";
           }
   SCRIPTTOP
       if ($mode ne 'upload') {
           $dc_setcourse_code .= (<<"SCRIPTMID");
           var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole
           var numcourse = getIndex(document.$formname.dccourse);
           if (numcourse == "-1") {
               if (document.$formname.type == 'Community') {
                   alert("$alerts{'thwc'}");
               } else {
                   alert("$alerts{'thwa'}");
               }
               return;
           }
           else {
               document.$formname.elements[numcourse].name = "act"+coursename;
               var numnewsec = getIndex(document.$formname.newsec);
               if (numnewsec != "-1") {
                   document.$formname.elements[numnewsec].name = "sec"+coursename;
                   document.$formname.elements[numnewsec].value = section;
               }
               var numstart = getIndex(document.$formname.start);
               if (numstart != "-1") {
                   document.$formname.elements[numstart].name = "start"+coursename;
               }
               var numend = getIndex(document.$formname.end);
               if (numend != "-1") {
                   document.$formname.elements[numend].name = "end"+coursename
               }
   SCRIPTMID
           if ($showcredits) {
               $dc_setcourse_code .= <<ENDCRED;
               var numcredits = getIndex(document.$formname.credits);
               if (numcredits != "-1") {
                   document.$formname.elements[numcredits].name = "credits"+coursename;
               }
   ENDCRED
           }
           $dc_setcourse_code .= <<ENDSCRIPT; 
           }
       }
       var authcheck = auth_check();
       if (authcheck == 'ok') {
           document.$formname.submit();
       }
   }
   ENDSCRIPT
       } else {
           $dc_setcourse_code .=  "
           document.$formname.sections.value = section;
       }
       return 'ok';
   }
   ";
       }
       $dc_setcourse_code .= (<<"ENDSCRIPT");
   
       function getIndex(caller) {
           for (var i=0;i<document.$formname.elements.length;i++) {
               if (document.$formname.elements[i] == caller) {
                   return i;
               }
           }
           return -1;
       }
   ENDSCRIPT
       return $dc_setcourse_code;
   }
   
   sub verify_authen {
       my ($formname,$context) = @_;
       my %alerts = &authcheck_alerts();
       my $finish = "return 'ok';";
       if ($context eq 'author') {
           $finish = "document.$formname.submit();";
       }
       my $outcome = <<"ENDSCRIPT";
   
   function auth_check() {
       var logintype;
       if (document.$formname.login.length) {
           if (document.$formname.login.length > 0) {
               var loginpicked = 0;
               for (var i=0; i<document.$formname.login.length; i++) {
                   if (document.$formname.login[i].checked == true) {
                       loginpicked = 1;
                       logintype = document.$formname.login[i].value;
                   }
               }
               if (loginpicked == 0) {
                   alert("$alerts{'authen'}");
                   return;
               }
           }
       } else {
           logintype = document.$formname.login.value;
       }
       if (logintype == 'nochange') {
           return 'ok';
       }
       var argpicked = document.$formname.elements[logintype+'arg'].value;
       if ((argpicked == null) || (argpicked == '') || (typeof argpicked == 'undefined')) {
           var alertmsg = '';
           switch (logintype) {
               case 'krb':
                   alertmsg = '$alerts{'krb'}';
                   break;
               case 'int':
                   alertmsg = '$alerts{'ipass'}';
               case 'fsys':
                   alertmsg = '$alerts{'ipass'}';
                   break;
               case 'loc':
                   alertmsg = '';
                   break;
               default:
                   alertmsg = '';
           }
           if (alertmsg != '') {
               alert(alertmsg);
               return;
           }
       }
       $finish
   }
   ENDSCRIPT
   }
   
   sub sectioncheck_alerts {
       my %alerts = &Apache::lonlocal::texthash(
                       curd => 'You must select a course or community in the current domain',
                       inea => 'In each course, each user may only have one student role at a time',
                       inco => 'In each community, each user may only have one member role at a time', 
                       youh => 'You had selected',
                       sect => 'sections',
                       plsm => 'Please modify your selections so they include no more than one section',
                       mayn => 'may not be used as the name for a section, as it is a reserved word',
                       plsc => 'Please choose a different section name',
                       mayt => 'may not be used as the name for a section, as it is the name of a course group',
                       mayc => 'may not be used as the name for a section, as it is the name of a community group',
                       secn => 'Section names and group names must be distinct',
                       secd => 'Section designations do not apply to ',
                       role => 'roles',
                       accr => 'role will be added with access to all sections',
                       thwa => 'There was a problem with your course selection',
                       thwc => 'There was a problem with your community selection',
                    );
       return %alerts;
   }
   
   sub authcheck_alerts {
       my %alerts = 
           &Apache::lonlocal::texthash(
                       authen => 'You must choose an authentication type.',
                       krb    => 'You need to specify the Kerberos domain.',
                       ipass  => 'You need to specify the initial password.',
           );
       return %alerts;
   }
   
   sub is_courseowner {
       my ($thiscourse,$courseowner) = @_;
       if ($courseowner eq '') {
           if ($env{'request.course.id'} eq $thiscourse) {
               $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
           }
       }
       if ($courseowner ne '') {
           if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) {
               return 1;
           }
       }
       return;
   }
   
 1;  1;
   

Removed from v.1.11  
changed lines
  Added in v.1.157


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

Internal Server Error

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

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

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