Diff for /loncom/interface/lonuserutils.pm between versions 1.54 and 1.97.2.13

version 1.54, 2008/05/12 17:52:08 version 1.97.2.13, 2010/01/20 21:42:30
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') {
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;              $role =~ s/_/\//g;
Line 169  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 180  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 213  sub domain_roles_select { Line 235  sub domain_roles_select {
     # domain context         # domain context   
     #      #
     # Role types      # Role types
     my @roletypes = ('domain','author','course');      my @roletypes = ('domain','author','course','community');
     my %lt = &role_type_names();      my %lt = &role_type_names();
     #      #
     # build up the menu information to be passed to      # build up the menu information to be passed to
Line 225  sub domain_roles_select { Line 247  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 239  sub domain_roles_select { Line 265  sub domain_roles_select {
             @roles = &construction_space_roles();              @roles = &construction_space_roles();
         } else {          } else {
             my $custom = 1;              my $custom = 1;
             @roles = &course_roles('domain',undef,$custom);              @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 249  sub domain_roles_select { Line 275  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','author','course']);           'roletype','showrole',\%select_menus,
            ['domain','author','course','community']);
     return $result;      return $result;
 }  }
   
Line 268  sub hidden_input { Line 295  sub hidden_input {
 }  }
   
 sub print_upload_manager_header {  sub print_upload_manager_header {
     my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission)=@_;      my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype)=@_;
     my $javascript;      my $javascript;
     #      #
     if (! exists($env{'form.upfile_associate'})) {      if (! exists($env{'form.upfile_associate'})) {
Line 305  sub print_upload_manager_header { Line 332  sub print_upload_manager_header {
     my $javascript_validations =      my $javascript_validations =
         &javascript_validations('upload',$krbdefdom,$password_choice,undef,          &javascript_validations('upload',$krbdefdom,$password_choice,undef,
                                 $env{'request.role.domain'},$context,                                  $env{'request.role.domain'},$context,
                                 $groupslist);                                  $groupslist,$crstype);
     my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');      my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
     $r->print(&mt('Total number of records found in file: <b>[_1]</b>.',$distotal).      $r->print('<p>'
               "<br />\n");               .&mt('Total number of records found in file: [_1]'
                    ,'<b>'.$distotal.'</b>')
                ."</p>\n");
     $r->print('<div class="LC_left_float"><h3>'.      $r->print('<div class="LC_left_float"><h3>'.
               &mt('Identify fields in uploaded list')."</h3>\n");                &mt('Identify fields in uploaded list')."</h3>\n");
     $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");      $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");
Line 319  sub print_upload_manager_header { Line 348  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('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'.
               'name="'.&mt('Reverse Association').'" '.                &mt('Ignore First Line').'</label><br />');
               'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');      $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '.
     $r->print('<label><input type="checkbox" name="noFirstLine"'.$checked.'/>'.                'name="Reverse Association" '.
               &mt('Ignore First Line').'</label>');                'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');
     $r->print("<br /><br />\n".      $r->print("<br /><br />\n".
               '<script type="text/javascript" language="Javascript">'."\n".                '<script type="text/javascript" language="Javascript">'."\n".
               $javascript."\n".$javascript_validations.'</script>');                '// <![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,
         $context,$groupslist)=@_;          $context,$groupslist,$crstype)=@_;
     my %param = (      my %param = (
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                   curr_authtype => $curr_authtype,                    curr_authtype => $curr_authtype,
Line 354  sub javascript_validations { Line 386  sub javascript_validations {
         if (($context eq 'course') || ($context eq 'domain')) {          if (($context eq 'course') || ($context eq 'domain')) {
             if ($context eq 'course') {              if ($context eq 'course') {
                 if ($env{'request.course.sec'} eq '') {                  if ($env{'request.course.sec'} eq '') {
                     $setsection_call = 'setSections(document.'.$param{'formname'}.');';                      $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');';
                     $setsections_js =                      $setsections_js =
                         &setsections_javascript($param{'formname'},$groupslist,                          &setsections_javascript($param{'formname'},$groupslist,
                                                 $mode);                                                  $mode,'',$crstype);
                 } else {                  } else {
                     $setsection_call = "'ok'";                      $setsection_call = "'ok'";
                 }                  }
Line 379  sub javascript_validations { Line 411  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 (($mode eq 'upload') && ($context eq 'domain')) {
           $alert{'inststatus'} = &mt('The optional affiliation field was not specified'); 
       }
     my $function_name = <<"END";      my $function_name = <<"END";
 $setsections_js  $setsections_js
   
 function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) {  function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus) {
 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 503  END Line 539  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 (($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)) {
Line 532  function verify(vf,sec_caller) { Line 594  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 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 542  function verify(vf,sec_caller) { Line 606  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; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus);
 }  }
   
 //  //
Line 564  function verify(vf,sec_caller) { Line 630  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
   
 function flip(vf,tf) {  function flip(vf,tf) {
    var nw=eval('vf.f'+tf+'.selectedIndex');     var nw=eval('vf.f'+tf+'.selectedIndex');
Line 627  function verify(vf,sec_caller) { Line 695  function verify(vf,sec_caller) {
     var foundid=0;      var foundid=0;
     var foundsec=0;      var foundsec=0;
     var foundrole=0;      var foundrole=0;
       var founddomain=0;
       var foundinststatus=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 636  function verify(vf,sec_caller) { Line 706  function verify(vf,sec_caller) {
         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) { foundrole=1; }
           if (i==10 && tw!=0) { founddomain=1; }
           if (i==13 && tw!=0) { foundinstatus=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain,foundinststatus);
 }  }
   
 function flip(vf,tf) {  function flip(vf,tf) {
Line 676  ENDPICK Line 748  ENDPICK
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub print_upload_manager_footer {  sub print_upload_manager_footer {
     my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission) = @_;      my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype) = @_;
     my $form = 'document.studentform';      my $form = 'document.studentform';
     my $formname = 'studentform';      my $formname = 'studentform';
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
Line 694  sub print_upload_manager_footer { Line 766  sub print_upload_manager_footer {
     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,undef,      my $date_table = &date_setting_table(undef,undef,$context,undef,
                                          $formname,$permission);                                           $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').      } else {
             "</h3>\n";          $Str .= $home_server_pick.
     $Str .= "<p>\n".$date_table."</p>\n";                  &Apache::lonhtmlcommon::row_closure();
       }
   
       $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 .= '<h3>'.&mt('Settings for assigning roles:').'</h3>'."\n".          $Str .= &Apache::lonhtmlcommon::row_title(
                 &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>';                      &mt('Settings for assigning roles'))
     }                 .&mt('Pick the action to take on roles for these users:').'<br />'
     if ($context eq 'author') {                 .'<span class="LC_nobreak"><label>'
         $Str .= '<h3>'.&mt('Default role')."</h3>\n".                 .'<input type="radio" name="roleaction" value="norole" checked="checked" />'
                 &mt('Choose the role to assign to users without a value specified in the uploaded file');                 .'&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/community role').'</label>'
                  .'</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') {      } elsif ($context eq 'course') {
         $Str .= '<h3>'.&mt('Default role and section')."</h3>\n".          $Str .= &Apache::lonhtmlcommon::row_title(
                 &mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file');                      &mt('Default role and section'))
     } else {                 .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.');
         $Str .= '<br /><br /><b>'.&mt('Default role and/or section(s)')."</b><br />\n".      } else {
                 &mt('Role and/or section(s) for users without values specified in the uploaded file.');          $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.');
     }      }
     $Str .= '<br />';  
     if (($context eq 'domain') || ($context eq 'author')) {      if (($context eq 'domain') || ($context eq 'author')) {
           $Str .= '<br />';
         my ($options,$cb_script,$coursepick) = &default_role_selector($context,1);          my ($options,$cb_script,$coursepick) = &default_role_selector($context,1);
         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 .= '<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') {          } elsif ($context eq 'author') {
             $Str .= $options;              $Str .= $options
                      .&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box
         }          }
     } else {      } else {
         my ($cnum,$cdom) = &get_course_identity();          my ($cnum,$cdom) = &get_course_identity();
         my $rowtitle = &mt('section');          my $rowtitle = &mt('section');
         my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,          my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,
                                      $permission,$context,'upload');                                       $permission,$context,'upload',$crstype);
         $Str .= $secbox."<h3>".&mt('Full Update')."</h3>\n".          $Str .= $secbox
                 '<p><label><input type="checkbox" name="fullup" value="yes">'.                 .&Apache::lonhtmlcommon::row_closure();
                 ' '.&mt('Display students with current/future access who are not in the uploaded file.').'</label><br />'.&mt('Students selected from this list can be dropped.').'</p>'."\n";          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;
 }  }
Line 770  sub print_upload_manager_footer { Line 914  sub print_upload_manager_footer {
 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.)')."\n";         .&mt('(only do if you know what you are doing.)')."\n";
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $output .= '<br /><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 Active/Future student,<br />(if forcing change).').    &mt('Update student/employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />').
                    '</label>'."\n";                     '</label>'."\n";
     }      }
     $output .= '</p>';      $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,$permission) = @_;      my ($r,$context,$permission,$crstype) = @_;
     my $firstLine;      my $firstLine;
     my $datatoken;      my $datatoken;
     if (!$env{'form.datatoken'}) {      if (!$env{'form.datatoken'}) {
Line 818  sub print_upload_manager_form { Line 962  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'};      my $defdom = $env{'request.role.domain'};
     if ($context eq 'course') {      if ($context eq 'course') {
Line 833  sub print_upload_manager_form { Line 979  sub print_upload_manager_form {
         &Apache::loncommon::get_kerberos_defaults($defdom);          &Apache::loncommon::get_kerberos_defaults($defdom);
     #      #
     &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context,      &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context,
                                  $permission);                                   $permission,$crstype);
     my $i;      my $i;
     my $keyfields;      my $keyfields;
     if ($total>=0) {      if ($total>=0) {
Line 844  sub print_upload_manager_form { Line 990  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 ($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 867  sub print_upload_manager_form { Line 1015  sub print_upload_manager_form {
     }      }
     $r->print('</div>');      $r->print('</div>');
     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,      &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,
                                  $context,$permission);                                   $context,$permission,$crstype);
 }  }
   
 sub setup_date_selectors {  sub setup_date_selectors {
Line 941  sub get_dates_from_form { Line 1089  sub get_dates_from_form {
 }  }
   
 sub date_setting_table {  sub date_setting_table {
     my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission) = @_;      my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission,$crstype) = @_;
     my $nolink;      my $nolink;
     if ($bulkaction) {      if ($bulkaction) {
         $nolink = 1;          $nolink = 1;
Line 958  sub date_setting_table { Line 1106  sub date_setting_table {
             ($env{'form.action'} eq 'upload')) {              ($env{'form.action'} eq 'upload')) {
             if ($env{'request.course.sec'} eq '') {              if ($env{'request.course.sec'} eq '') {
                 $dateDefault = '<span class="LC_nobreak">'.                  $dateDefault = '<span class="LC_nobreak">'.
                     '<label><input type="checkbox" name="makedatesdefault" value="1" /> '.                      '<label><input type="checkbox" name="makedatesdefault" value="1" /> ';
                     &mt('make these dates the default access dates for future student enrollment').                  if ($crstype eq 'Community') {
                     '</label></span>';                      $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 989  sub date_setting_table { Line 1141  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 ($cnum,$cdom) = &get_course_identity();          my ($cnum,$cdom) = &get_course_identity();
Line 997  sub make_dates_default { Line 1149  sub make_dates_default {
                 {'default_enrollment_start_date'=>$startdate,                  {'default_enrollment_start_date'=>$startdate,
                  'default_enrollment_end_date'  =>$enddate},$cdom,$cnum);                   'default_enrollment_end_date'  =>$enddate},$cdom,$cnum);
         if ($put_result eq 'ok') {          if ($put_result eq 'ok') {
             $result .= &mt('Set default start and end access 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 access 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) = @_;
     my %customroles;      my %customroles;
     my ($options,$coursepick,$cb_jscript);      my ($options,$coursepick,$cb_jscript);
     if ($context ne 'author') {      if ($context ne 'author') {
         %customroles = &my_custom_roles();          %customroles = &my_custom_roles($crstype);
     }      }
   
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 1028  sub default_role_selector { Line 1188  sub default_role_selector {
     $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 'author') {      } elsif ($context eq 'author') {
         my @roles = &construction_space_roles($checkpriv);          my @roles = &construction_space_roles($checkpriv);
         foreach my $role (@roles) {          foreach my $role (@roles) {
Line 1042  sub default_role_selector { Line 1202  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','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course');              ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community');
         $cb_jscript =           $cb_jscript = 
             &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform');              &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community');
         $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>'.
                       &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="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','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">'.
Line 1069  sub default_role_selector { Line 1229  sub default_role_selector {
                       $env{'request.role.domain'}.'" />'.                        $env{'request.role.domain'}.'" />'.
                       '<input type="hidden" name="dccourse" value="" />'.                        '<input type="hidden" name="dccourse" value="" />'.
                       '<input type="hidden" name="dcdomain" value="" />'.                        '<input type="hidden" name="dcdomain" value="" />'.
                         '<input type="hidden" name="crstype" value="" />'.
                       '</td></tr></table></td>'.                        '</td></tr></table></td>'.
                       &Apache::loncommon::end_data_table_row().                        &Apache::loncommon::end_data_table_row().
                       &Apache::loncommon::end_data_table()."\n";                        &Apache::loncommon::end_data_table()."\n";
Line 1078  sub default_role_selector { Line 1239  sub default_role_selector {
 }  }
   
 sub default_course_roles {  sub default_course_roles {
     my ($context,$checkpriv,%customroles) = @_;      my ($context,$checkpriv,$crstype,%customroles) = @_;
     my $output;      my $output;
     my $custom = 1;      my $custom = 1;
     my @roles = &course_roles($context,$checkpriv,$custom);      my @roles = &course_roles($context,$checkpriv,$custom,lc($crstype));
     foreach my $role (@roles) {      foreach my $role (@roles) {
         if ($role ne 'cr') {          if ($role ne 'cr') {
             my $plrole=&Apache::lonnet::plaintext($role);              my $plrole=&Apache::lonnet::plaintext($role,$crstype);
             $output .= '  <option value="'.$role.'">'.$plrole.'</option>';              $output .= '  <option value="'.$role.'">'.$plrole.'</option>';
         }          }
     }      }
Line 1133  sub domain_roles { Line 1294  sub domain_roles {
 }  }
   
 sub course_roles {  sub course_roles {
     my ($context,$checkpriv,$custom) = @_;      my ($context,$checkpriv,$custom,$roletype) = @_;
     my @allroles = &roles_by_context('course',$custom);      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 1145  sub course_roles { Line 1312  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.sec'} 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.sec'})) {                                               $env{'request.course.sec'})) {
Line 1163  sub course_roles { Line 1330  sub course_roles {
 }  }
   
 sub curr_role_permissions {  sub curr_role_permissions {
     my ($context,$setting,$checkpriv) = @_;       my ($context,$setting,$checkpriv,$type) = @_; 
     my $custom = 1;      my $custom = 1;
     my @roles;      my @roles;
     if ($context eq 'author') {      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,$custom);               @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,$custom);          @roles = &course_roles($context,$checkpriv,$custom,$type);
     }      }
     return @roles;      return @roles;
 }  }
Line 1183  sub curr_role_permissions { Line 1350  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 %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 1244  sub print_userlist { Line 1415  sub print_userlist {
                                            'html'  => 'HTML');                                             'html'  => 'HTML');
         my $output_selector = '<select size="1" name="output" >';          my $output_selector = '<select size="1" name="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('<label><span class="LC_nobreak">'
     }                   .&mt('Output Format: [_1]',$output_selector)
     $r->print('<label>'.&mt('User Status: [_1]',$status_select).'</label>'.('&nbsp;'x3)."\n");                   .'</span></label>'.('&nbsp;'x3));
       }
       $r->print('<label><span class="LC_nobreak">'
                .&mt('User Status: [_1]',$status_select)
                .'</span></label>'.('&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 ($cnum,$cdom);      my ($cnum,$cdom);
     $r->print(&role_filter($context));      $r->print(&role_filter($context));
Line 1265  sub print_userlist { Line 1440  sub print_userlist {
         ($cnum,$cdom) = &get_course_identity();          ($cnum,$cdom) = &get_course_identity();
         $r->print(&section_group_filter($cnum,$cdom));          $r->print(&section_group_filter($cnum,$cdom));
     }      }
     if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {      if ($env{'form.phase'} eq '') {
         $r->print('&nbsp;'.&list_submit_button(&mt('Update Display')).          $r->print('<br /><br />'.&list_submit_button(&mt('Display List of Users')).
                   "\n</p>\n");                    "\n</p>\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(
               "\n</p>\n"
              .'<p>'
              .&list_submit_button(&mt('Update Display'))
              ."</p>\n"
           );
     }      }
     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 $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".          $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n".
                   &Apache::lonhtmlcommon::start_pick_box()."\n".                    &Apache::lonhtmlcommon::start_pick_box()."\n".
                   &Apache::lonhtmlcommon::row_title(&mt('Select Course(s)'),                    &Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n".
                                                     'LC_oddrow_value')."\n".  
                   $courseform."\n".                    $courseform."\n".
                   &Apache::lonhtmlcommon::row_closure(1).                    &Apache::lonhtmlcommon::row_closure(1).
                   &Apache::lonhtmlcommon::end_pick_box().'</p>'.                    &Apache::lonhtmlcommon::end_pick_box().'</p>'.
                   '<p>'.&list_submit_button(&mt('Update Display')).                    '<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'.
                   "\n".'</p><span class="LC_warning">'.&mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.').'</span>'."\n");                    &list_submit_button(&mt('Update Display')).
         if ($env{'form.coursepick'}) {                    "\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n");
           $clearcoursepick = 0;
           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 />');              $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');
         }          }
     } else {      } else {
Line 1294  sub print_userlist { Line 1499  sub print_userlist {
     if ($context eq 'course') {      if ($context eq 'course') {
         if (($env{'form.showrole'} eq 'st') || ($env{'form.showrole'} eq 'Any')) {           if (($env{'form.showrole'} eq 'st') || ($env{'form.showrole'} eq 'Any')) { 
             my $classlist = &Apache::loncoursedata::get_classlist();              my $classlist = &Apache::loncoursedata::get_classlist();
             %userlist = %{$classlist};              if (ref($classlist) eq 'HASH') {
                   %userlist = %{$classlist};
               }
         }          }
         if ($env{'form.showrole'} ne 'st') {          if ($env{'form.showrole'} ne 'st') {
             my $showroles;              my $showroles;
Line 1356  sub print_userlist { Line 1563  sub print_userlist {
                     }                      }
                 }                  }
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif ($env{'form.roletype'} eq 'course') {
                 if ($env{'form.coursepick'}) {                  if (($env{'form.coursepick'}) && (!$clearcoursepick)) {
                     my %courses = &process_coursepick();                      my %courses = &process_coursepick();
                     my %allusers;                      my %allusers;
                     my $hidepriv = 1;                      my $hidepriv = 1;
Line 1367  sub print_userlist { Line 1574  sub print_userlist {
                         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,undef,$custom);                              @roles = &course_roles($context,undef,$custom,
                                                      $env{'form.roletype'});
                         } else {                          } else {
                             @roles = ($env{'form.showrole'});                              @roles = ($env{'form.showrole'});
                         }                          }
Line 1413  sub print_userlist { Line 1621  sub print_userlist {
                 $r->print(&mt('There are no authors or co-authors to display.')."\n");                  $r->print(&mt('There are no authors or co-authors to display.')."\n");
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif ($env{'form.roletype'} eq 'course') {
                 $r->print(&mt('There are no course users to display')."\n");                   $r->print(&mt('There are no course users to display')."\n"); 
               } elsif ($env{'form.roletype'} eq 'community') {
                   $r->print(&mt('There are no community users to display')."\n");
             }              }
         } 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");
Line 1428  sub print_userlist { Line 1638  sub print_userlist {
                                $permission,$env{'form.Status'},\%userlist,$keylist);                                 $permission,$env{'form.Status'},\%userlist,$keylist);
         }          }
         if (!$usercount) {          if (!$usercount) {
             $r->print('<br />'.&mt('There are no users matching the search criteria.'));               $r->print('<br /><span class="LC_warning">'
                        .&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="'.
Line 1440  sub role_filter { Line 1653  sub role_filter {
     my $output;      my $output;
     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 ($role_select);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $role_select = &domain_roles_select();          $role_select = &domain_roles_select();
         $output = '<label>'.&mt('Role Type: [_1]',$role_select).'</label>';          $output = '<label><span class="LC_nobreak">'
                    .&mt('Role Type: [_1]',$role_select)
                    .'</span></label>';
     } else {      } else {
         $role_select = '<select name="showrole">'."\n".          $role_select = '<select name="showrole">'."\n".
                        '<option value="Any" '.$roleselected.'>'.                         '<option value="Any" '.$roleselected.'>'.
                        &mt('Any role').'</option>';                         &mt('Any role').'</option>';
         my @poss_roles = &curr_role_permissions($context);          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) {          foreach my $role (@poss_roles) {
             $roleselected = '';              $roleselected = '';
             if ($role eq $env{'form.showrole'}) {              if ($role eq $env{'form.showrole'}) {
                 $roleselected = ' selected="selected" ';                  $roleselected = ' selected="selected"';
             }              }
             my $plrole;              my $plrole;
             if ($role eq 'cr') {              if ($role eq 'cr') {
                 $plrole = &mt('Custom role');                  $plrole = &mt('Custom role');
             } else {              } else {
                 $plrole=&Apache::lonnet::plaintext($role);                  $plrole=&Apache::lonnet::plaintext($role,$crstype);
             }              }
             $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';              $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
         }          }
         $role_select .= '</select>';          $role_select .= '</select>';
         $output = '<label>'.&mt('Role: [_1]',$role_select).'</label>';          $output = '<label><span class="LC_nobreak">'
                    .&mt('Role: [_1]',$role_select)
                    .'</span></label>';
     }      }
     return $output;      return $output;
 }  }
Line 1494  sub section_group_filter { Line 1720  sub section_group_filter {
             $env{'form.'.$name{$item}} = 'all';              $env{'form.'.$name{$item}} = 'all';
         }          }
         if ($item eq 'sec') {          if ($item eq 'sec') {
             if ($env{'form.showrole'} eq 'cc') {              if (($env{'form.showrole'} eq 'cc') || ($env{'form.showrole'} eq 'co')) {
                 $env{'form.'.$name{$item}} = 'none';                  $env{'form.'.$name{$item}} = 'none';
             }              }
             my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);              my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
Line 1505  sub section_group_filter { Line 1731  sub section_group_filter {
         }          }
         if (@options > 0) {          if (@options > 0) {
             my $currsel;              my $currsel;
             $markup = '<select name="'.$name{$item}.'" />'."\n";              $markup = '<select name="'.$name{$item}.'">'."\n";
             foreach my $option ('all','none',@options) {               foreach my $option ('all','none',@options) { 
                 $currsel = '';                  $currsel = '';
                 if ($env{'form.'.$name{$item}} eq $option) {                  if ($env{'form.'.$name{$item}} eq $option) {
                     $currsel = ' selected="selected" ';                      $currsel = ' selected="selected"';
                 }                  }
                 $markup .= ' <option value="'.$option.'"'.$currsel.'>';                  $markup .= ' <option value="'.$option.'"'.$currsel.'>';
                 if (($option eq 'all') || ($option eq 'none')) {                  if (($option eq 'all') || ($option eq 'none')) {
Line 1520  sub section_group_filter { Line 1746  sub section_group_filter {
                 $markup .= '</option>'."\n";                  $markup .= '</option>'."\n";
             }              }
             $markup .= '</select>'."\n";              $markup .= '</select>'."\n";
             $output .= ('&nbsp;'x3).'<label>'.$title{$item}.': '.$markup.'</label>';              $output .= ('&nbsp;'x3).'<span class="LC_nobreak">'
                         .'<label>'.$title{$item}.': '.$markup.'</label>'
                         .'</span> ';
         }          }
     }      }
     return $output;      return $output;
Line 1573  sub gather_userinfo { Line 1801  sub gather_userinfo {
                                            $indexhash,$uniqid,$userlist);                                             $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 1623  sub gather_userinfo { Line 1852  sub gather_userinfo {
 sub build_user_record {  sub build_user_record {
     my ($context,$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');
     if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {      if (!(($context eq 'domain') && (($env{'form.roletype'} eq 'course')
                                && ($env{'form.roletype'} eq 'community')))) {
         &process_date_info($userdata);          &process_date_info($userdata);
     }      }
     my $username = $userdata->{'username'};      my $username = $userdata->{'username'};
Line 1738  sub process_coursepick { Line 1968  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 1863  sub process_date_info { Line 2097  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)=@_;
       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 1878  sub show_users_list { Line 2115  sub show_users_list {
     } else {      } else {
         push(@sortable,'extent');          push(@sortable,'extent');
     }      }
       if ($mode eq 'pickauthor') {
           @sortable = ('username','fullname','email','status');
       }
     if (!grep(/^\Q$sortby\E$/,@sortable)) {      if (!grep(/^\Q$sortby\E$/,@sortable)) {
         $sortby = 'username';          $sortby = 'username';
     }      }
     my $setting = $env{'form.roletype'};      my $setting = $env{'form.roletype'};
     my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers);      my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$crstype);
     if ($context eq 'course') {      if ($context eq 'course') {
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
           $crstype = &Apache::loncommon::course_type();
         ($cnum,$cdom) = &get_course_identity($cid);          ($cnum,$cdom) = &get_course_identity($cid);
         ($classgroups) = &Apache::loncoursedata::get_group_memberships(          ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                      $userlist,$keylist,$cdom,$cnum);                                       $userlist,$keylist,$cdom,$cnum);
Line 1902  sub show_users_list { Line 2143  sub show_users_list {
             if ($env{'course.'.$cid.'.internal.showphoto'}) {              if ($env{'course.'.$cid.'.internal.showphoto'}) {
                 $r->print('                  $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 1909  function photowindow(photolink) { Line 2151  function photowindow(photolink) {
     stdeditbrowser = open(photolink,title,options,"1");      stdeditbrowser = open(photolink,title,options,"1");
     stdeditbrowser.focus();      stdeditbrowser.focus();
 }  }
   // ]]>
 </script>  </script>
                ');                 ');
             }              }
Line 1917  function photowindow(photolink) { Line 2160  function photowindow(photolink) {
 <input type="hidden" name="displayclickers" value="$displayclickers" />  <input type="hidden" name="displayclickers" value="$displayclickers" />
 END  END
         }          }
       } elsif ($context eq 'domain') {
           if ($setting eq 'community') {
               $crstype = 'Community';
           } elsif ($setting eq 'course') {
               $crstype = 'Course';
           }
     }      }
     if ($mode ne 'autoenroll') {      if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
         my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();          my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();
         my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");  
         my $singconfirm = &mt(' for a single user?');  
         my $multconfirm = &mt(' for multiple users?');  
         my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);          my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);
         my %lt = &Apache::lonlocal::texthash(           my $verify_action_js = &bulkaction_javascript($formname);
               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):',  
         );  
         $r->print(<<END);          $r->print(<<END);
   
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   // <![CDATA[
 $check_uncheck_js  $check_uncheck_js
   
 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;  
         var choice = document.studentform.bulkaction[document.studentform.bulkaction.selectedIndex].value;  
         if (numchecked == 1) {   
             message += singconf;  
         }   
         else {  
             message += multconf;   
         }  
         if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate') {  
             var datemsg = '';  
             if ((document.studentform.startdate_month.value == '') &&   
                 (document.studentform.startdate_day.value  == '') &&  
                 (document.studentform.startdate_year.value == '')) {  
                 datemsg = "\\n$lt{'acwi'},\\n$lt{'asyo'}.\\n";  
             }  
             if ((document.studentform.enddate_month.value == '') &&  
                 (document.studentform.enddate_day.value  == '') &&  
                 (document.studentform.enddate_year.value == '')) {  
                 datemsg += "\\n$lt{'accw'},\\n$lt{'asyd'}.\\n";  
             }  
             if (datemsg != '') {  
                 message += "\\n"+datemsg;  
             }  
         }  
         if (choice == 'chgsec') {  
             var rolefilter = document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value;  
             var retained =  document.studentform.retainsec.value;  
             var secshow = document.studentform.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)) {  
             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') {
         if (document.studentform.userwin.checked == true) {          if (document.$formname.userwin.checked == true) {
             var url = '/adm/createuser?srchterm='+username+'&srchdomain='+domain+'&phase=get_user_info&action=singleuser&srchin=dom&srchby=uname&srchtype=exact&popup=1';              var url = '/adm/createuser?srchterm='+username+'&srchdomain='+domain+'&phase=get_user_info&action=singleuser&srchin=dom&srchby=uname&srchtype=exact&popup=1';
             var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';              var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
             modifywin = window.open(url,'',options,1);              modifywin = window.open(url,'',options,1);
             modifywin.focus();              modifywin.focus();
             return;              return;
         } else {          } else {
             document.studentform.srchterm.value=username;              document.$formname.srchterm.value=username;
             document.studentform.srchdomain.value=domain;              document.$formname.srchdomain.value=domain;
             document.studentform.phase.value='get_user_info';              document.$formname.phase.value='get_user_info';
             document.studentform.action.value = 'singleuser';              document.$formname.action.value = 'singleuser';
             document.studentform.submit();              document.$formname.submit();
         }          }
     }      }
     if (target == 'aboutme') {      if (target == 'aboutme') {
         if (document.studentform.userwin.checked == true) {          if (document.$formname.userwin.checked == true) {
             var url = '/adm/'+domain+'/'+username+'/aboutme?popup=1';              var url = '/adm/'+domain+'/'+username+'/aboutme?popup=1';
             var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';              var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
             aboutmewin = window.open(url,'',options,1);              aboutmewin = window.open(url,'',options,1);
Line 2042  function username_display_launch(usernam Line 2212  function username_display_launch(usernam
             document.location.href = '/adm/'+domain+'/'+username+'/aboutme';              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 2064  END Line 2246  END
                        'status'     => "status",                         'status'     => "status",
                        'role'       => "role",                         'role'       => "role",
                        'type'       => "enroll type/action",                         'type'       => "enroll type/action",
                        'email'      => "email address",                         'email'      => "e-mail address",
                        'clicker'    => "clicker id",  
                        'photo'      => "photo",                         'photo'      => "photo",
                        'extent'     => "extent",                         'extent'     => "extent",
                        'go'         => "go",  
                        'pr'         => "Proceed",                         'pr'         => "Proceed",
                        'ca'         => "check all",                         'ca'         => "check all",
                        'ua'         => "uncheck 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",                         '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",
                          'clicker'    => "Clicker-ID",
                       );                        );
     if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {      if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
         $lt{'extent'} = &mt('Course(s): description, section(s), status');          $lt{'extent'} = &mt('Course(s): description, section(s), status');
       } elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') {
           $lt{'extent'} = &mt('Communities: description, section(s), status');
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $lt{'extent'} = &mt('Author');           $lt{'extent'} = &mt('Author'); 
     }      }
     my @cols = ('username','domain','id','fullname');      my @cols;
     if ($context eq 'course') {      if ($mode eq 'pickauthor') {
         push(@cols,'section');          @cols = ('username','fullname','status','email');
     }      } else {
     if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) {           @cols = ('username','domain','id','fullname');
         push(@cols,('start','end'));          if ($context eq 'course') {
     }              push(@cols,'section');
     if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {          }
         push(@cols,'role');          if (!($context eq 'domain' && ($env{'form.roletype'} eq 'course')
     }                                && ($env{'form.roletype'} eq 'community'))) {
     if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||              push(@cols,('start','end'));
                                 $env{'form.roletype'} eq 'course')) {          }
         push (@cols,'extent');          if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
     }              push(@cols,'role');
     if (($statusmode eq 'Any') &&           }
         (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {          if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||
         push(@cols,'status');                                      $env{'form.roletype'} eq 'course' ||
     }                                      $env{'form.roletype'} eq 'community')) {
     if ($context eq 'course') {              push (@cols,'extent');
         push(@cols,'groups');          }
           if (($statusmode eq 'Any') &&
               (!($context eq 'domain' && (($env{'form.roletype'} eq 'course')
                || ($env{'form.roletype'} eq 'community'))))) {
               push(@cols,'status');
           }
           if ($context eq 'course') {
               push(@cols,'groups');
           }
           push(@cols,'email');
     }      }
     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') {
Line 2115  END Line 2307  END
     my $results_description;      my $results_description;
     if ($mode ne 'autoenroll') {      if ($mode ne 'autoenroll') {
         $results_description = &results_header_row($rolefilter,$statusmode,          $results_description = &results_header_row($rolefilter,$statusmode,
                                                    $context,$permission,$mode);                                                     $context,$permission,$mode,$crstype);
         $r->print('<b>'.$results_description.'</b><br />');  
           $r->print('<b>'.$results_description.'</b><br /><br />');
     }      }
     my ($output,$actionselect,%canchange,%canchangesec);      my ($output,$actionselect,%canchange,%canchangesec);
     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {      if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
         if ($mode ne 'autoenroll') {          if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
             if ($permission->{'cusr'}) {              if ($permission->{'cusr'}) {
                 $actionselect = &select_actions($context,$setting,$statusmode);                  unless (($context eq 'domain') && 
                           (($setting eq 'course') || ($setting eq 'community'))) {
                       $actionselect = 
                           &select_actions($context,$setting,$statusmode,$formname);
                   }
             }              }
             $r->print(<<END);              $r->print(<<END);
 <input type="hidden" name="srchby"  value="uname" />  <input type="hidden" name="srchby"  value="uname" />
Line 2131  END Line 2328  END
 <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
             $output = '<p>';  
             my @linkdests = ('aboutme');  
             if ($permission->{'cusr'}) {  
                 unshift (@linkdests,'modify');  
             }  
             $output .= '<span class="LC_nobreak">'.$lt{'link'}.':&nbsp;';  
             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;';  
             }  
             my $checkwin;  
             if ($env{'form.userwin'}) {   
                 $checkwin = 'checked = "checked"';   
             }  
             $output .= '&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="userwin" value="1" $checkwin />'.$lt{'owin'}.'</span><br />';  
             if ($actionselect) {              if ($actionselect) {
                 $output .= <<"END";                  $output .= <<"END";
 $lt{'ac'}:&nbsp;$actionselect <input type="button" value="$lt{'go'}" onclick="javascript:opendatebrowser(this.form,'studentform','go')" /></p>  <div class="LC_left_float"><fieldset><legend><b>$lt{'ac'}</b></legend>
 <p><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.actionlist)" /> &nbsp;  $actionselect
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.actionlist)" /><br /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action(document.studentform.actionlist)" />  <br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> &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>
 END  END
                 my @allroles;                  my @allroles;
                 if ($env{'form.showrole'} eq 'Any') {                  if ($env{'form.showrole'} eq 'Any') {
                     my $custom = 1;                      my $custom = 1;
                     if ($context eq 'domain') {                      if ($context eq 'domain') {
                         @allroles = &roles_by_context($setting,$custom);                          @allroles = &roles_by_context($setting,$custom,$crstype);
                     } else {                      } else {
                         @allroles = &roles_by_context($context,$custom);                          @allroles = &roles_by_context($context,$custom,$crstype);
                     }                      }
                 } else {                  } else {
                     @allroles = ($env{'form.showrole'});                      @allroles = ($env{'form.showrole'});
Line 2199  END Line 2375  END
                     }                      }
                 }                  }
             }              }
               $output .= '<div class="LC_left_float"><fieldset><legend><b>'.$lt{'link'}.'</b></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"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
         }          }
         $output .= "\n<p>\n".          $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\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><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n";
         }          }
         my %role_types = &role_type_names();          my %role_types = &role_type_names();
         if ($context eq 'course' && $mode ne 'autoenroll') {          if ($context eq 'course' && $mode ne 'autoenroll') {
             if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {              if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
                 # Clicker display on or off?                  # Clicker display on or off?
                 my %clicker_options = &Apache::lonlocal::texthash(                  my %clicker_options = (
                                                             'on' => 'Show',                                          'on' => 'Show',
                                                             'off' => 'Hide',                                          'off' => 'Hide',
                                                            );                                        );
                 my $clickerchg = 'on';                  my $clickerchg = 'on';
                 if ($displayclickers eq 'on') {                  if ($displayclickers eq 'on') {
                     $clickerchg = 'off';                      $clickerchg = 'off';
                 }                  }
                 $output .= '    <th>'."\n".'     '.                  $output .= '    <th>'."\n".'     '
                     '<a href="javascript:document.studentform.displayclickers.value='.                          .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id'
                       "'".$clickerchg."'".';document.studentform.submit();">'.                              ,'<a href="javascript:document.'.$formname.'.displayclickers.value='
                       $clicker_options{$clickerchg}.'</a>&nbsp;'.$lt{'clicker'}."\n".                               ."'".$clickerchg."'".';document.'.$formname.'.submit();">'
                       '    </th>'."\n";                              ,'</a>')
                           ."\n".'    </th>'."\n";
   
                 # Photo display on or off?                  # Photo display on or off?
                 if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {                  if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
Line 2245  END Line 2450  END
                         $photochg = 'off';                          $photochg = 'off';
                     }                      }
                     $output .= '    <th>'."\n".'     '.                      $output .= '    <th>'."\n".'     '.
                 '<a href="javascript:document.studentform.displayphotos.value='.                  '<a href="javascript:document.'.$formname.'.displayphotos.value='.
                       "'".$photochg."'".';document.studentform.submit();">'.                        "'".$photochg."'".';document.'.$formname.'.submit();">'.
                       $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".                        $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".
                       '    </th>'."\n";                        '    </th>'."\n";
                 }                  }
Line 2262  END Line 2467  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;
         }          }
         #          #
           push @cols,'clicker';
         # Write headers and data to file          # Write headers and data to file
         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') {
           push @cols,'clicker';
         # Create the excel spreadsheet          # Create the excel spreadsheet
         ($excel_workbook,$excel_filename,$format) =          ($excel_workbook,$excel_filename,$format) =
             &Apache::loncommon::create_workbook($r);              &Apache::loncommon::create_workbook($r);
Line 2282  END Line 2493  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'});
     }      }
   
Line 2303  END Line 2515  END
             $grpfilter = 'all';              $grpfilter = 'all';
         }          }
     }      }
       my %ltstatus = &Apache::lonlocal::texthash(
                                                   Active  => 'Active',
                                                   Future  => 'Future',
                                                   Expired => 'Expired',
                                                  );
     # 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})) {
Line 2330  END Line 2547  END
                 }                  }
             } elsif ($env{'form.roletype'} eq 'author') {              } 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 2433  END Line 2651  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='-'; }
           $in{'clicker'} = $clickers; 
    my $role = $in{'role'};
           $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype); 
         if (! defined($in{'start'}) || $in{'start'} == 0) {          if (! defined($in{'start'}) || $in{'start'} == 0) {
             $in{'start'} = &mt('none');              $in{'start'} = &mt('none');
         } else {          } else {
Line 2445  END Line 2666  END
         } else {          } else {
             $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});              $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
         }          }
         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());
             my $checkval;              my $checkval;
             if ($mode eq 'autoenroll') {              if ($mode eq 'autoenroll') {
Line 2454  END Line 2675  END
                     $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label>';                      $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label>';
                     $autocount ++;                      $autocount ++;
                 } else {                  } else {
                     $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label></nobr></td></tr><tr><td><nobr>';                      $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 ++;                      $manualcount ++;
                     if ($in{'lockedtype'}) {                      if ($in{'lockedtype'}) {
                         $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Unlock').'</label>';                          $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Unlock').'</label>';
Line 2463  END Line 2684  END
                         $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Lock').'</label>';                          $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Lock').'</label>';
                         $lockcount ++;                          $lockcount ++;
                     }                      }
                     $cellentry .= '</nobr></td></tr></table>';                      $cellentry .= '</span></td></tr></table>';
                 }                  }
                 $r->print("<td>$cellentry</td>\n");                  $r->print("<td>$cellentry</td>\n");
             } else {              } else {
                 $r->print("<td>$rowcount</td>\n");                  if ($mode ne 'pickauthor') {  
                       $r->print("<td>$rowcount</td>\n");
                   }
                 if ($actionselect) {                  if ($actionselect) {
                     my $showcheckbox;                      my $showcheckbox;
                     if ($role =~ /^cr\//) {                      if ($role =~ /^cr\//) {
Line 2497  END Line 2720  END
                             }                              }
                         }                          }
                         $r->print('<td><input type="checkbox" name="'.                          $r->print('<td><input type="checkbox" name="'.
                                   'actionlist" value="'.$checkval.'"></td>');                                    'actionlist" value="'.$checkval.'" /></td>');
                     } else {                      } else {
                         $r->print('<td>&nbsp;</td>');                          $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>');
                 }                  }
             }              }
             foreach my $item (@cols) {              foreach my $item (@cols) {
Line 2508  END Line 2733  END
                     $r->print('<td>'.&print_username_link($mode,\%in).'</td>');                      $r->print('<td>'.&print_username_link($mode,\%in).'</td>');
                 } elsif (($item eq 'start' || $item eq 'end') && ($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");
                   } elsif ($item eq 'status') {
                       my $showitem = $in{$item};
                       if (defined($ltstatus{$in{$item}})) {
                           $showitem = $ltstatus{$in{$item}};
                       }
                       $r->print('<td>'.$showitem.'</td>'."\n");
                 } else {                  } else {
                     $r->print('<td>'.$in{$item}.'</td>'."\n");                      $r->print('<td>'.$in{$item}.'</td>'."\n");
                 }                  }
Line 2524  END Line 2755  END
                     }                      }
                     if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {                      if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
                         if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') {                          if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') {
                             $r->print('    <td align="right"><a href="javascript:photowindow('."'".$in{'photo'}."'".')"><img src="'.$in{'thumbnail'}.'" 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 {                          } else {
                             $r->print('    <td>&nbsp;</td>  ');                              $r->print('    <td>&nbsp;</td>  ');
                         }                          }
Line 2549  END Line 2780  END
             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) {
Line 2568  END Line 2799  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 2588  END Line 2816  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 ($mode,$in) = @_;      my ($mode,$in) = @_;
     my $output;      my $output;
Line 2595  sub print_username_link { Line 2942  sub print_username_link {
         $output = $in->{'username'};          $output = $in->{'username'};
     } 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 2606  sub role_type_names { Line 2953  sub role_type_names {
                          'domain' => 'Domain Roles',                           'domain' => 'Domain Roles',
                          'author' => '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 2672  sub select_actions { Line 3021  sub select_actions {
         }          }
     }      }
     if ($options) {      if ($options) {
         $output = '<select name="bulkaction" onchange="javascript:opendatebrowser(this.form,'."'studentform','change'".')" />'."\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 2688  sub select_actions { Line 3037  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 2709  sub date_section_javascript { Line 3059  sub date_section_javascript {
         delete => "Check the boxes for any users for whom roles are to be deleted, and click 'Proceed'",          delete => "Check the boxes for any users for whom roles are to be deleted, and click 'Proceed'",
         none   => "Choose an action to take for selected users",          none   => "Choose an action to take for selected users",
     );        );  
     my $output = '      my $output = <<"ENDONE";
 <script type="text/javascript">'."\n";  <script type="text/javascript">
     $output .= <<"ENDONE";  // <![CDATA[
     function opendatebrowser(callingform,formname,calledby) {      function opendatebrowser(callingform,formname,calledby) {
         var bulkaction = callingform.bulkaction.options[callingform.bulkaction.selectedIndex].value;          var bulkaction = callingform.bulkaction.options[callingform.bulkaction.selectedIndex].value;
         if (bulkaction == 'revoke' || bulkaction == 'delete' || bulkaction == '') {  
             if (calledby == 'go') {  
                 if (bulkaction == 'revoke') {  
                     alert("$nopopup{'revoke'}");  
                 }  
                 if (bulkaction == 'delete') {  
                     alert("$nopopup{'delete'}");   
                 }  
                 if (bulkaction == '') {  
                     alert("$nopopup{'none'}");  
                 }  
             }  
             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 2748  ENDONE Line 3084  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,$permission) = @_;      my ($context,$permission,$crstype) = @_;
     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);
     my $output = <<"END";      my $output = <<"END";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
   
 $sec_js  $sec_js
   
Line 2778  END Line 3116  END
         } else {          } else {
             opener.document.$callingform.retainsec.value = formname.retainsec.value;              opener.document.$callingform.retainsec.value = formname.retainsec.value;
         }          }
         setSections(formname);          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') {
Line 2817  END Line 3153  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 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.',
                  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 2844  END Line 3190  END
         }          }
         $date_items = &date_setting_table($starttime,undef,$context,          $date_items = &date_setting_table($starttime,undef,$context,
                                           $env{'form.bulkaction'},$formname,                                            $env{'form.bulkaction'},$formname,
                                           $permission);                                            $permission,$crstype);
     }      }
     $output .= '<h3>'.$headertext.'</h3>'.      $output .= '<h3>'.$headertext.'</h3>'.
                '<form name="'.$formname.'" method="post">'."\n".                 '<form name="'.$formname.'" method="post">'."\n".
                 $date_items;                  $date_items;
     if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {      if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {
         my ($cnum,$cdom) = &get_course_identity();          my ($cnum,$cdom) = &get_course_identity();
           my $crstype = &Apache::loncommon::course_type();
           if ($crstype eq 'Community') {
               $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.');
               $lt{'forn'} = &mt('For a role in a community that is not a member role, a user may have roles in more than one section of a community 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>'; 
Line 2876  END Line 3228  END
             $info = '<input type="hidden" name="retainsec" value="0" />';               $info = '<input type="hidden" name="retainsec" value="0" />'; 
         }          }
         my $rowtitle = &mt('New section to assign');          my $rowtitle = &mt('New section to assign');
         my $secbox = &section_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context);          my $secbox = &section_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context,'',$crstype);
         $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 {  sub section_picker {
     my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode) = @_;      my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_;
     my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
     my $sections_select .= &course_sections(\%sections_count,$role);      my $sections_select .= &course_sections(\%sections_count,$role);
     my $secbox = '<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n";      my $secbox = '<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n";
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
         my ($options,$cb_script,$coursepick) =          my ($options,$cb_script,$coursepick) =
             &default_role_selector($context,1);              &default_role_selector($context,1,$crstype);
         $secbox .= &Apache::lonhtmlcommon::row_title('role','LC_oddrow_value').          $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').
                    $options. &Apache::lonhtmlcommon::row_closure(1)."\n";                     $options. &Apache::lonhtmlcommon::row_closure(1)."\n";
     }      }
     $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n";      $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n";
Line 2917  sub section_picker { Line 3268  sub section_picker {
 }  }
   
 sub results_header_row {  sub results_header_row {
     my ($rolefilter,$statusmode,$context,$permission,$mode) = @_;      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') {
         if ($mode eq 'csv' || $mode eq 'excel') {          if ($mode eq 'csv' || $mode eq 'excel') {
             $description = &mt('Course - ').$env{'course.'.$env{'request.course.id'}.'.description'}.': ';              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);
                   }
             }              }
         }          }
         my $constraint;          my $constraint;
Line 2944  sub results_header_row { Line 3319  sub results_header_row {
         if ($viewablesec ne '') {          if ($viewablesec ne '') {
             if ($env{'form.showrole'} eq 'st') {              if ($env{'form.showrole'} eq 'st') {
                 $constraint = &mt('only users in section "[_1]"',$viewablesec);                  $constraint = &mt('only users in section "[_1]"',$viewablesec);
             } elsif ($env{'form.showrole'} ne 'cc') {              } elsif (($env{'form.showrole'} ne 'cc') && ($env{'form.showrole'} ne 'co')) {
                 $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec);                  $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'} ne 'all') && ($env{'form.grpfilter'} ne '')) {
Line 2983  sub results_header_row { Line 3358  sub results_header_row {
         }           } 
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $description =           $description = 
             &mt('Author space for <span class="LC_cusr_emph">[_1]</span>',              &mt('Author space for [_1]'
         &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'})).':&nbsp;&nbsp;';                  ,'<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 3000  sub results_header_row { Line 3378  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 3029  sub results_header_row { Line 3407  sub results_header_row {
                     $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 3078  sub viewable_section { Line 3466  sub viewable_section {
 #################################################  #################################################
 #################################################  #################################################
 sub show_drop_list {  sub show_drop_list {
     my ($r,$classlist,$nosort,$permission) = @_;      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);      my ($cnum,$cdom) = &get_course_identity($cid);
     if (! exists($env{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
Line 3096  sub show_drop_list { Line 3484  sub show_drop_list {
 <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 type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
   // <![CDATA[
 $check_uncheck_js  $check_uncheck_js
   // ]]>
 </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 ($indexhash,$keylist) = &make_keylist_array();
     my $studentcount = 0;      my $studentcount = 0;
Line 3122  END Line 3512  END
         }          }
     }      }
     if (!$studentcount) {      if (!$studentcount) {
         $r->print(&mt('There are no students to drop.'));          if ($crstype eq 'Community') {
               $r->print(&mt('There are no members to drop.'));
           } else {
               $r->print(&mt('There are no students to drop.'));
           }
         return;          return;
     }      }
     my ($classgroups) = &Apache::loncoursedata::get_group_memberships(      my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
Line 3130  END Line 3524  END
     my %lt=&Apache::lonlocal::texthash('usrn'   => "username",      my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                                        'dom'    => "domain",                                         'dom'    => "domain",
                                        'sn'     => "student name",                                         'sn'     => "student name",
                                          'mn'     => "member name",
                                        'sec'    => "section",                                         'sec'    => "section",
                                        'start'  => "start date",                                         'start'  => "start date",
                                        'end'    => "end date",                                         'end'    => "end date",
                                        'groups' => "active groups",                                         '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());                    &Apache::loncommon::start_data_table_header_row());
Line 3143  END Line 3542  END
     <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>
Line 3162  END Line 3561  END
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=id">ID</a>         <a href="/adm/createuser?action=$action&sortby=id">ID</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=fullname">$lt{'sn'}</a>         <a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>         <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>
     </th><th>      </th><th>
Line 3217  END Line 3616  END
         #          #
         $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="$studentkey"></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>
Line 3232  END Line 3631  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'   => "Drop Students",                         '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 3250  END Line 3658  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 .= "<p>\n";      $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";
     $str .= '<input type="submit" name="fileupload" value="'.  
         &mt('Upload file of users').'">'."\n";      # Excel and CSV Help
     $str .= '<label><input type="checkbox" name="noFirstLine" /> '.      $str .= '<div class="LC_left_float">'
         &mt('Ignore First Line')."</label></p>\n";             .&Apache::loncommon::help_open_topic("Course_Create_Class_List",
     $str .= &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")).             .'</div><div class="LC_left_float">'."\n"
                              "<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><br clear="all" />'."\n";
                                "<br />\n";      $str .= &Apache::lonhtmlcommon::start_pick_box()
     $str .= &Apache::loncommon::end_page();             .&Apache::lonhtmlcommon::row_title(&mt('File'))
              .&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').'" />'
              .'</p>';
   
     $r->print($str);      $r->print($str);
     return;      return;
 }  }
Line 3295  sub upfile_drop_add { Line 3717  sub upfile_drop_add {
     #      #
     # Store the field choices away      # Store the field choices away
     foreach my $field (qw/username names      foreach my $field (qw/username names
                        fname mname lname gen id sec ipwd email role/) {                         fname mname lname gen id sec ipwd email role domain/) {
         $env{'form.'.$field.'_choice'}=$fields{$field};          $env{'form.'.$field.'_choice'}=$fields{$field};
     }      }
     &Apache::loncommon::store_course_settings('enrollment_upload',      &Apache::loncommon::store_course_settings('enrollment_upload',
Line 3309  sub upfile_drop_add { Line 3731  sub upfile_drop_add {
                                                 'sec_choice' => 'scalar',                                                  'sec_choice' => 'scalar',
                                                 '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 ($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);
           }
       }
     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,$context));          $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 3359  sub upfile_drop_add { Line 3802  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);
     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'};              $defaultsec = $env{'form.sections'};
         }            }
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $defaultrole = $env{'form.defaultrole'};          $defaultrole = $env{'form.defaultrole'};
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         $defaultrole = $env{'form.defaultrole'};          $defaultrole = $env{'form.defaultrole'};
         $defaultsec = $env{'form.sections'};          $defaultsec = $env{'form.sections'};
     }      }
     if ($env{'request.course.id'} ne '') {  
         $cid = $env{'request.course.id'};  
     } elsif ($setting eq 'course') {  
         if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) {  
             $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'};  
         }  
     }  
     # Check to see if user information can be changed      # Check to see if user information can be changed
     my @userinfo = ('firstname','middlename','lastname','generation',      my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');                      'permanentemail','id');
     my %canmodify;      my %canmodify;
     if (&Apache::lonnet::allowed('mau',$domain)) {      if (&Apache::lonnet::allowed('mau',$domain)) {
           push(@userinfo,'inststatus');
         foreach my $field (@userinfo) {          foreach my $field (@userinfo) {
             $canmodify{$field} = 1;              $canmodify{$field} = 1;
         }          }
     }      }
     my (%userlist,%modifiable_fields,@poss_roles);      my (%userlist,%modifiable_fields,@poss_roles);
     my $secidx = &Apache::loncoursedata::CL_SECTION();      my $secidx = &Apache::loncoursedata::CL_SECTION();
     my @courseroles = &roles_by_context('course',1);      my @courseroles = &roles_by_context('course',1,$crstype);
     if (!&Apache::lonnet::allowed('mau',$domain)) {      if (!&Apache::lonnet::allowed('mau',$domain)) {
         if ($context eq 'course' || $context eq 'author') {          if ($context eq 'course' || $context eq 'author') {
             @poss_roles =  &curr_role_permissions($context);              @poss_roles =  &curr_role_permissions($context,'','',$crstype);
             my @statuses = ('active','future');              my @statuses = ('active','future');
             my ($indexhash,$keylist) = &make_keylist_array();              my ($indexhash,$keylist) = &make_keylist_array();
             my %info;              my %info;
Line 3406  sub upfile_drop_add { Line 3842  sub upfile_drop_add {
             if ($context eq 'course') {              if ($context eq 'course') {
                 my ($cnum,$cdom) = &get_course_identity();                  my ($cnum,$cdom) = &get_course_identity();
                 my $roster = &Apache::loncoursedata::get_classlist();                  my $roster = &Apache::loncoursedata::get_classlist();
                 %userlist = %{$roster};                  if (ref($roster) eq 'HASH') {
                       %userlist = %{$roster};
                   }
                 my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,                  my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,
                                                          \@statuses,\@poss_roles);                                                           \@statuses,\@poss_roles);
                 &gather_userinfo($context,'view',\%userlist,$indexhash,\%info,                  &gather_userinfo($context,'view',\%userlist,$indexhash,\%info,
Line 3432  sub upfile_drop_add { Line 3870  sub upfile_drop_add {
         } 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 3477  sub upfile_drop_add { Line 3917  sub upfile_drop_add {
             }              }
         }          }
         my (%curr_rules,%got_rules,%alerts);          my (%curr_rules,%got_rules,%alerts);
         my %customroles = &my_custom_roles();          my %customroles = &my_custom_roles($crstype);
         my @permitted_roles = &roles_on_upload($context,$setting,%customroles);           my @permitted_roles = 
               &roles_on_upload($context,$setting,$crstype,%customroles); 
         # Get new users list          # Get new users list
         foreach my $line (@userdata) {          foreach my $line (@userdata) {
             my @secs;              my @secs;
Line 3507  sub upfile_drop_add { Line 3948  sub upfile_drop_add {
                 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 />'.                      $r->print('<br />'.
       &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',        &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',
           $entries{$fields{'username'}},$fname,$mname,$lname,$gen).            '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen));
                               '</b>');  
                     next;                      next;
                 } else {                  } else {
                       if ($entries{$fields{'domain'}} 
                           ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {
                           $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}.
                                     '</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen));
                           next;
                       }
                     my $username = $entries{$fields{'username'}};                      my $username = $entries{$fields{'username'}};
                       my $userdomain = $entries{$fields{'domain'}};
                       if ($userdomain eq '') {
                           $userdomain = $domain;
                       }
                     if (defined($fields{'sec'})) {                      if (defined($fields{'sec'})) {
                         if (defined($entries{$fields{'sec'}})) {                          if (defined($entries{$fields{'sec'}})) {
                             $entries{$fields{'sec'}} =~ s/\W//g;                              $entries{$fields{'sec'}} =~ s/\W//g;
                             my $item = $entries{$fields{'sec'}};                              my $item = $entries{$fields{'sec'}};
                             if ($item eq "none" || $item eq 'all') {                              if ($item eq "none" || $item eq 'all') {
                                 $r->print('<br />'.&mt('<b>[_1]</b>: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.',$username,$fname,$mname,$lname,$gen,$item));                                  $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;                                  next;
                             } elsif (exists($curr_groups{$item})) {                              } elsif (exists($curr_groups{$item})) {
                                 $r->print('<br />'.&mt('<b>[_1]</b>: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.',$username,$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.'));                                  $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;                                  next;
                             } else {                              } else {
                                 push(@secs,$item);                                  push(@secs,$item);
Line 3530  sub upfile_drop_add { Line 3980  sub upfile_drop_add {
                     }                      }
                     if ($env{'request.course.sec'} ne '') {                      if ($env{'request.course.sec'} ne '') {
                         @secs = ($env{'request.course.sec'});                          @secs = ($env{'request.course.sec'});
                         if (ref($userlist{$username.':'.$domain}) eq 'ARRAY') {                          if (ref($userlist{$username.':'.$userdomain}) eq 'ARRAY') {
                             my $currsec = $userlist{$username.':'.$domain}[$secidx];                              my $currsec = $userlist{$username.':'.$userdomain}[$secidx];
                             if ($currsec ne $env{'request.course.sec'}) {                              if ($currsec ne $env{'request.course.sec'}) {
                                 $r->print('<br />'.&mt('<b>[_1]</b>: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".',$username,$fname,$mname,$lname,$gen,$secs[0]).'<br />');                                  $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 />');
                                 if ($currsec eq '') {                                  if ($currsec eq '') {
                                     $r->print(&mt('This user already has an active/future student role in the course, unaffiliated to any section.'));                                      $r->print(&mt('This user already has an active/future student role in the course, unaffiliated to any section.'));
   
Line 3562  sub upfile_drop_add { Line 4012  sub upfile_drop_add {
                     if (defined($fields{'email'})) {                      if (defined($fields{'email'})) {
                         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 3583  sub upfile_drop_add { Line 4041  sub upfile_drop_add {
                             }                              }
                             if ($role eq '') {                              if ($role eq '') {
                                 my $rolestr = join(', ',@permitted_roles);                                  my $rolestr = join(', ',@permitted_roles);
                                 $r->print('<br />'.                                  $r->print('<br />'
       &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");                                           .&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 3593  sub upfile_drop_add { Line 4056  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) {
                              \$lname,\$gen) {  
                         $$_ =~ s/(\s+$|^\s+)//g;                          $$_ =~ s/(\s+$|^\s+)//g;
                     }                      }
                     # 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') {
                           next if ($userdomain ne $domain);
                         $checkid = 1;                          $checkid = 1;
                         $newuser = 1;                          $newuser = 1;
                         my $checkhash;                          my $checkhash;
Line 3618  sub upfile_drop_add { Line 4081  sub upfile_drop_add {
                         }                          }
                     } else {                      } else {
                         if ($context eq 'course' || $context eq 'author') {                          if ($context eq 'course' || $context eq 'author') {
                             if ($role eq '') {                              if ($userdomain eq $domain ) {
                                 my @checkroles;                                  if ($role eq '') {
                                 foreach my $role (@poss_roles) {                                      my @checkroles;
                                     my $endkey;                                      foreach my $role (@poss_roles) {
                                     if ($role ne 'st') {                                          my $endkey;
                                         $endkey = ':'.$role;                                          if ($role ne 'st') {
                                     }                                              $endkey = ':'.$role;
                                     if (exists($userlist{$username.':'.$domain.$endkey})) {                                          }
                                         if (!grep(/^\Q$role\E$/,@checkroles)) {                                          if (exists($userlist{$username.':'.$userdomain.$endkey})) {
                                             push(@checkroles,$role);                                              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}};
                                 }                                  }
                                 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);
                         my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id);                              for (my $i=0; $i<@newinfo; $i++) {
                         for (my $i=0; $i<@userinfo; $i++) {                                  if (${$newinfo[$i]} ne '') {
                             if (${$newinfo[$i]} ne '') {                                      if (!$canmodify{$userinfo[$i]}) {
                                 if (!$canmodify{$userinfo[$i]}) {                                          ${$newinfo[$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 3657  sub upfile_drop_add { Line 4122  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});                                      next if ($alerts{'id'}{$userdomain}{$id});
                                 }                                  }
                             }                              }
                         }                          }
Line 3679  sub upfile_drop_add { Line 4144  sub upfile_drop_add {
                             if (@secs > 0) {                              if (@secs > 0) {
                                 $sec = $secs[0];                                  $sec = $secs[0];
                             }                              }
                             &modifystudent($domain,$username,$cid,$sec,                              &modifystudent($userdomain,$username,$cid,$sec,
                                            $desiredhost,$context);                                             $desiredhost,$context);
                             $roleresult =                              $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,'manual','',$cid,                                       $desiredhost,$email,'manual','',$cid,
                                      '',$context);                                       '',$context,$inststatus);
                             $userresult = $roleresult;                              $userresult = $roleresult;
                         } else {                          } else {
                             if ($role ne '') {                               if ($role ne '') { 
Line 3696  sub upfile_drop_add { Line 4161  sub upfile_drop_add {
                                         $role = 'cr_'.$env{'user.domain'}.'_'.                                          $role = 'cr_'.$env{'user.domain'}.'_'.
                                                 $env{'user.name'}.'_'.$role;                                                  $env{'user.name'}.'_'.$role;
                                     }                                      }
                                     if ($role ne 'cc') {                                       if (($role ne 'cc') && ($role ne 'co')) {
                                         if (@secs > 1) {                                          if (@secs > 1) {
                                             $multiple = 1;                                              $multiple = 1;
                                             foreach my $sec (@secs) {                                              foreach my $sec (@secs) {
                                                 ($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) =                                                  ($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) =
                                                 &modifyuserrole($context,$setting,                                                  &modifyuserrole($context,$setting,
                                                     $changeauth,$cid,$domain,$username,                                                      $changeauth,$cid,$userdomain,$username,
                                                     $id,$amode,$password,$fname,                                                      $id,$amode,$password,$fname,
                                                     $mname,$lname,$gen,$sec,                                                      $mname,$lname,$gen,$sec,
                                                     $env{'form.forceid'},$desiredhost,                                                      $env{'form.forceid'},$desiredhost,
                                                     $email,$role,$enddate,                                                      $email,$role,$enddate,
                                                     $startdate,$checkid);                                                      $startdate,$checkid,$inststatus);
                                             }                                              }
                                         } elsif (@secs > 0) {                                          } elsif (@secs > 0) {
                                             $singlesec = $secs[0];                                              $singlesec = $secs[0];
Line 3718  sub upfile_drop_add { Line 4183  sub upfile_drop_add {
                             if (!$multiple) {                              if (!$multiple) {
                                 ($userresult,$authresult,$roleresult,$idresult) =                                   ($userresult,$authresult,$roleresult,$idresult) = 
                                     &modifyuserrole($context,$setting,                                      &modifyuserrole($context,$setting,
                                                     $changeauth,$cid,$domain,$username,                                                       $changeauth,$cid,$userdomain,$username, 
                                                     $id,$amode,$password,$fname,                                                      $id,$amode,$password,$fname,
                                                     $mname,$lname,$gen,$singlesec,                                                      $mname,$lname,$gen,$singlesec,
                                                     $env{'form.forceid'},$desiredhost,                                                      $env{'form.forceid'},$desiredhost,
                                                     $email,$role,$enddate,$startdate,$checkid);                                                      $email,$role,$enddate,$startdate,
                                                       $checkid,$inststatus);
                             }                              }
                         }                          }
                         if ($multiple) {                          if ($multiple) {
Line 3730  sub upfile_drop_add { Line 4196  sub upfile_drop_add {
                                 $flushc =                                  $flushc =
                                 &user_change_result($r,$userres{$sec},$authres{$sec},                                  &user_change_result($r,$userres{$sec},$authres{$sec},
                                                     $roleres{$sec},$idres{$sec},\%counts,$flushc,                                                      $roleres{$sec},$idres{$sec},\%counts,$flushc,
                                                     $username,\%userchg);                                                      $username,$userdomain,\%userchg);
   
                             }                              }
                         } else {                          } else {
                             $flushc =                               $flushc = 
                                 &user_change_result($r,$userresult,$authresult,                                  &user_change_result($r,$userresult,$authresult,
                                                     $roleresult,$idresult,\%counts,$flushc,                                                      $roleresult,$idresult,\%counts,$flushc,
                                                     $username,\%userchg);                                                      $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 'author') {                          } 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 3785  sub upfile_drop_add { Line 4251  sub upfile_drop_add {
                           '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.                            '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
                           &mt('There are no students with current/future access to the course.').                            &mt('There are no students with current/future access to the course.').
                           '</form>'."\n");                            '</form>'."\n");
             } else {              } 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 my $line (@userdata) {                  foreach my $line (@userdata) {
                     my %entries=&Apache::loncommon::record_sep($line);                      my %entries=&Apache::loncommon::record_sep($line);
Line 3847  sub print_namespacing_alerts { Line 4313  sub print_namespacing_alerts {
   
 sub user_change_result {  sub user_change_result {
     my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc,      my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc,
         $username,$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 3863  sub user_change_result { Line 4329  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 3873  sub user_change_result { Line 4339  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 3881  sub user_change_result { Line 4347  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;
Line 3896  sub user_change_result { Line 4362  sub user_change_result {
   
 # ========================================================= Menu Phase Two Drop  # ========================================================= Menu Phase Two Drop
 sub print_drop_menu {  sub print_drop_menu {
     my ($r,$context,$permission) = @_;      my ($r,$context,$permission,$crstype) = @_;
     $r->print('<h3>'.&mt("Drop Students").'</h3>'."\n".      my $heading;
       if ($crstype eq 'Community') {
           $heading = &mt("Drop Members");
       } else {
           $heading = &mt("Drop Students");
       }
       $r->print('<h3>'.$heading.'</h3>'."\n".
               '<form name="studentform" method="post">'."\n");                '<form name="studentform" method="post">'."\n");
     my $classlist = &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.')."\n");          if ($crstype eq 'Community') {
               $r->print(&mt('There are no members currently enrolled.')."\n");
           } else {
               $r->print(&mt('There are no students currently enrolled.')."\n");
           }
     } else {      } else {
         &show_drop_list($r,$classlist,'nosort',$permission);          &show_drop_list($r,$classlist,'nosort',$permission,$crstype);
     }      }
     $r->print('</form>'. &Apache::loncommon::end_page());      $r->print('</form>'. &Apache::loncommon::end_page());
     return;      return;
Line 3915  sub update_user_list { Line 4391  sub update_user_list {
     my ($r,$context,$setting,$choice) = @_;      my ($r,$context,$setting,$choice) = @_;
     my $now = time;      my $now = time;
     my $count=0;      my $count=0;
       my $crstype;
       if ($context eq 'course') {
           $crstype = &Apache::loncommon::course_type();
       }
     my @changelist;      my @changelist;
     if ($choice eq 'drop') {      if ($choice eq 'drop') {
         @changelist = &Apache::loncommon::get_env_multiple('form.droplist');          @changelist = &Apache::loncommon::get_env_multiple('form.droplist');
Line 3985  sub update_user_list { Line 4465  sub update_user_list {
                 }                  }
             }              }
         }          }
         my $plrole = &Apache::lonnet::plaintext($role);          my $plrole = &Apache::lonnet::plaintext($role,$crstype);
         my $start = $env{'form.'.$item.'_start'};          my $start = $env{'form.'.$item.'_start'};
         my $end = $env{'form.'.$item.'_end'};          my $end = $env{'form.'.$item.'_end'};
         if ($choice eq 'drop') {          if ($choice eq 'drop') {
Line 4042  sub update_user_list { Line 4522  sub update_user_list {
                 }                  }
             } 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'});                      @newsecs = split(/,/,$env{'form.newsecs'});
                 }                  }
                 # remove existing section if not to be retained.                     # remove existing section if not to be retained.   
Line 4143  sub update_user_list { Line 4623  sub update_user_list {
     $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,no users].",$count).'</b></p>');      $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,no users].",$count).'</b></p>');
     if ($count > 0) {      if ($count > 0) {
         if ($choice eq 'revoke' || $choice eq 'drop') {          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();          &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,$context));              $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));
         }          }
     }      }
     my $linktext = &mt('Display User Lists');      my $linktext = &mt('Display User Lists');
Line 4164  sub classlist_drop { Line 4644  sub classlist_drop {
     my ($scope,$uname,$udom,$now) = @_;      my ($scope,$uname,$udom,$now) = @_;
     my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});      my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
     if (&Apache::lonnet::is_course($cdom,$cnum)) {      if (&Apache::lonnet::is_course($cdom,$cnum)) {
         my $user = $uname.':'.$udom;  
         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 },$cdom,$cnum);  
             return &mt('Drop from classlist: [_1]',              return &mt('Drop from classlist: [_1]',
                        '<b>'.$result.'</b>').'<br />';                         '<b>'.$result.'</b>').'<br />';
         }          }
Line 4239  sub course_sections { Line 4717  sub course_sections {
     my $output = '';      my $output = '';
     my @sections = (sort {$a <=> $b} keys %{$sections_count});      my @sections = (sort {$a <=> $b} keys %{$sections_count});
     my $numsec = scalar(@sections);      my $numsec = scalar(@sections);
     my $is_selected = ' selected="selected" ';      my $is_selected = ' selected="selected"';
     if ($numsec <= 1) {      if ($numsec <= 1) {
         $output = '<select name="currsec_'.$role.'" >'."\n".          $output = '<select name="currsec_'.$role.'" >'."\n".
                   '  <option value="">'.&mt('Select').'</option>'."\n";                    '  <option value="">'.&mt('Select').'</option>'."\n";
Line 4299  sub get_groupslist { Line 4777  sub get_groupslist {
 }  }
   
 sub setsections_javascript {  sub setsections_javascript {
     my ($formname,$groupslist,$mode,$checkauth) = @_;      my ($formname,$groupslist,$mode,$checkauth,$crstype) = @_;
     my ($checkincluded,$finish,$rolecode,$setsection_js);      my ($checkincluded,$finish,$rolecode,$setsection_js);
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
         $checkincluded = 'formname.name == "'.$formname.'"';          $checkincluded = 'formname.name == "'.$formname.'"';
Line 4338  sub setsections_javascript { Line 4816  sub setsections_javascript {
     }      }
     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.',
                       inec => 'In each community, each user may only have one member role at a time.',
                     youh => 'You had selected ',                      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.',
Line 4347  sub setsections_javascript { Line 4828  sub setsections_javascript {
                     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 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;
Line 4359  function setSections(formname) { Line 4842  function setSections(formname) {
         if (checkcurr != null) {          if (checkcurr != null) {
             if ($checkincluded) {              if ($checkincluded) {
                 $rolecode                  $rolecode
                 if (role == 'cc') {                  if (role == 'cc' || role == 'co') {
                     alert("$alerts{'secd'}\\n$alerts{'accr'}");                      if (role == 'cc') {
                 }                          alert("$alerts{'secd'}\\n$alerts{'accr'}");
                 else {                      } else {
                           alert("$alerts{'sedn'}\\n$alerts{'acor'}");
                       }
                   } else {
                     var sections = '';                      var sections = '';
                     var numsec = 0;                      var numsec = 0;
                     var sections;                      var sections;
Line 4392  function setSections(formname) { Line 4878  function setSections(formname) {
                     }                      }
                     var newsecs = formname.elements[i+1].value;                      var newsecs = formname.elements[i+1].value;
                     var numsplit;                      var numsplit;
                       var validsecs = new Array();
                       var badsecs = new Array();
                     if (newsecs != null && newsecs != "") {                      if (newsecs != null && newsecs != "") {
                         numsplit = newsecs.split(/,/g);                          numsplit = newsecs.split(/,/g);
                         numsec = numsec + numsplit.length;                          numsec = numsec + numsplit.length;
                           for (var i=0; i<numsplit.length; i++) {
                               if (re2.test(numsplit[i]) == true) {
                                   badsecs.push(numsplit[i]);
                               } else {
                                   validsecs.push(numsplit[i]);
                               }
                           }
                           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 {
Line 4438  sub can_create_user { Line 4942  sub can_create_user {
     }      }
     if (ref($domconf{'usercreation'}) eq 'HASH') {      if (ref($domconf{'usercreation'}) eq 'HASH') {
         if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') {          if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') {
             if ($context eq 'course' || $context eq 'author') {              if ($context eq 'course' || $context eq 'author' || $context eq 'requestcrs') {
                 my $creation = $domconf{'usercreation'}{'cancreate'}{$context};                  my $creation = $domconf{'usercreation'}{'cancreate'}{$context};
                 if ($creation eq 'none') {                  if ($creation eq 'none') {
                     $cancreate = 0;                      $cancreate = 0;
Line 4472  sub can_modify_userinfo { Line 4976  sub can_modify_userinfo {
                         if (ref($userroles) eq 'ARRAY') {                          if (ref($userroles) eq 'ARRAY') {
                             foreach my $role (@{$userroles}) {                              foreach my $role (@{$userroles}) {
                                 my $testrole;                                  my $testrole;
                                 if ($role =~ /^cr\//) {                                  if ($context eq 'selfcreate') {
                                     $testrole = 'cr';  
                                 } else {  
                                     $testrole = $role;                                      $testrole = $role;
                                   } else {
                                       if ($role =~ /^cr\//) {
                                           $testrole = 'cr';
                                       } else {
                                           $testrole = $role;
                                       }
                                 }                                  }
                                 if (ref($domconfig{'usermodification'}{$context}{$testrole}) eq 'HASH') {                                  if (ref($domconfig{'usermodification'}{$context}{$testrole}) eq 'HASH') {
                                     if ($domconfig{'usermodification'}{$context}{$testrole}{$field}) {                                      if ($domconfig{'usermodification'}{$context}{$testrole}{$field}) {
Line 4532  sub check_usertype { Line 5040  sub check_usertype {
 }  }
   
 sub roles_by_context {  sub roles_by_context {
     my ($context,$custom) = @_;      my ($context,$custom,$crstype) = @_;
     my @allroles;      my @allroles;
     if ($context eq 'course') {      if ($context eq 'course') {
         @allroles = ('st','ad','ta','ep','in','cc');          @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) {          if ($custom) {
             push(@allroles,'cr');              push(@allroles,'cr');
         }          }
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         @allroles = ('ca','aa');          @allroles = ('ca','aa');
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         @allroles = ('li','dg','sc','au','dc');          @allroles = ('li','ad','dg','sc','au','dc');
     }      }
     return @allroles;      return @allroles;
 }  }
   
 sub get_permission {  sub get_permission {
     my ($context,$roles) = @_;      my ($context,$crstype) = @_;
     my %permission;      my %permission;
     if ($context eq 'course') {      if ($context eq 'course') {
         my $custom = 1;          my $custom = 1;
         my @allroles = &roles_by_context($context,$custom);          my @allroles = &roles_by_context($context,$custom,$crstype);
         foreach my $role (@allroles) {          foreach my $role (@allroles) {
             if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {              if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
                 $permission{'cusr'} = 1;                  $permission{'cusr'} = 1;
Line 4621  sub authorpriv { Line 5138  sub authorpriv {
 }  }
   
 sub roles_on_upload {  sub roles_on_upload {
     my ($context,$setting,%customroles) = @_;      my ($context,$setting,$crstype,%customroles) = @_;
     my (@possible_roles,@permitted_roles);      my (@possible_roles,@permitted_roles);
     @possible_roles = &curr_role_permissions($context,$setting,1);      @possible_roles = &curr_role_permissions($context,$setting,1,$crstype);
     foreach my $role (@possible_roles) {      foreach my $role (@possible_roles) {
         if ($role eq 'cr') {          if ($role eq 'cr') {
             push(@permitted_roles,keys(%customroles));              push(@permitted_roles,keys(%customroles));
Line 4659  sub dc_setcourse_js { Line 5176  sub dc_setcourse_js {
     my ($formname,$mode,$context) = @_;      my ($formname,$mode,$context) = @_;
     my ($dc_setcourse_code,$authen_check);      my ($dc_setcourse_code,$authen_check);
     my $cctext = &Apache::lonnet::plaintext('cc');      my $cctext = &Apache::lonnet::plaintext('cc');
       my $cotext = &Apache::lonnet::plaintext('co');
     my %alerts = &sectioncheck_alerts();      my %alerts = &sectioncheck_alerts();
     my $role = 'role';      my $role = 'role';
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
Line 4705  function setCourse() { Line 5223  function setCourse() {
             numsections = numsections + newsecs.length;              numsections = numsections + newsecs.length;
         }          }
         if ((userrole == 'st') && (numsections > 1)) {          if ((userrole == 'st') && (numsections > 1)) {
             alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")              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;              return;
         }          }
         for (var j=0; j<newsecs.length; j++) {          for (var j=0; j<newsecs.length; j++) {
Line 4717  function setCourse() { Line 5239  function setCourse() {
                 var groups = document.$formname.groups.value.split(/,/g);                  var groups = document.$formname.groups.value.split(/,/g);
                 for (var k=0; k<groups.length; k++) {                  for (var k=0; k<groups.length; k++) {
                     if (newsecs[j] == groups[k]) {                      if (newsecs[j] == groups[k]) {
                         alert("'"+newsecs[j]+"' $alerts{'mayt'}.\\n$alerts{'secn'}. $alerts{'plsc'}.");                          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;                          return;
                     }                      }
                 }                  }
Line 4727  function setCourse() { Line 5253  function setCourse() {
             alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}.");              alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}.");
             section = "";              section = "";
         }          }
           if ((userrole == 'co') && (numsections > 0)) {
               alert("$alerts{'secd'} $cotext $alerts{'role'}.\\n$alerts{'accr'}.");
               section = "";
           }
 SCRIPTTOP  SCRIPTTOP
     if ($mode ne 'upload') {      if ($mode ne 'upload') {
         $dc_setcourse_code .= (<<"ENDSCRIPT");          $dc_setcourse_code .= (<<"ENDSCRIPT");
         var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole          var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole
         var numcourse = getIndex(document.$formname.dccourse);          var numcourse = getIndex(document.$formname.dccourse);
         if (numcourse == "-1") {          if (numcourse == "-1") {
             alert("$alerts{'thwa'}");              if (document.$formname.type == 'Community') {
                   alert("$alerts{'thwc'}");
               } else {
                   alert("$alerts{'thwa'}");
               }
             return;              return;
         }          }
         else {          else {
Line 4842  ENDSCRIPT Line 5376  ENDSCRIPT
   
 sub sectioncheck_alerts {  sub sectioncheck_alerts {
     my %alerts = &Apache::lonlocal::texthash(      my %alerts = &Apache::lonlocal::texthash(
                     curd => 'You must select a course in the current domain',                      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',                      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',                      youh => 'You had selected',
                     sect => 'sections',                      sect => 'sections',
                     plsm => 'Please modify your selections so they include no more than one section',                      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',                      mayn => 'may not be used as the name for a section, as it is a reserved word',
                     plsc => 'Please choose a different section name',                      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',                      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',                      secn => 'Section names and group names must be distinct',
                     secd => 'Section designations do not apply to ',                      secd => 'Section designations do not apply to ',
                     role => 'roles',                      role => 'roles',
                     accr => 'role will be added with access to all sections',                      accr => 'role will be added with access to all sections',
                     thwa => 'There was a problem with your course selection'                      thwa => 'There was a problem with your course selection',
                       thwc => 'There was a problem with your community selection',
                  );                   );
     return %alerts;      return %alerts;
 }  }

Removed from v.1.54  
changed lines
  Added in v.1.97.2.13


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.