Diff for /loncom/interface/lonuserutils.pm between versions 1.75 and 1.116

version 1.75, 2008/12/06 20:32:37 version 1.116, 2010/02/19 15:41:40
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 235  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 247  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 261  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 271  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',(' 'x3).&mt('Role: '),$env{'form.roletype'},          ('studentform',(' '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 290  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 327  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: [_1]','<b>'.$distotal.'</b>').      $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 341  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 /><label><input type="checkbox" name="noFirstLine"'.$checked.'/>'.      $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'.
               &mt('Ignore First Line').'</label><br />');                &mt('Ignore First Line').'</label><br />');
     $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '.      $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '.
               'name="Reverse Association" '.                'name="Reverse Association" '.
               'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');                '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 376  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 401  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 e-mail 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.',           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,foundrole,founddomain) {  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 538  END Line 551  END
         }          }
         message+='$alert{'domain'}';          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 568  function verify(vf,sec_caller) { Line 595  function verify(vf,sec_caller) {
     var foundemail=0;      var foundemail=0;
     var foundrole=0;      var foundrole=0;
     var founddomain=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 579  function verify(vf,sec_caller) { Line 607  function verify(vf,sec_caller) {
         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==12) { founddomain=1; }
           if (tw==13) { foundinststatus=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus);
 }  }
   
 //  //
Line 602  function verify(vf,sec_caller) { Line 631  function verify(vf,sec_caller) {
 // 10 = email address  // 10 = email address
 // 11 = role  // 11 = role
 // 12 = domain  // 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 666  function verify(vf,sec_caller) { Line 696  function verify(vf,sec_caller) {
     var foundsec=0;      var foundsec=0;
     var foundrole=0;      var foundrole=0;
     var founddomain=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 676  function verify(vf,sec_caller) { Line 707  function verify(vf,sec_caller) {
         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==10 && tw!=0) { founddomain=1; }
           if (i==13 && tw!=0) { foundinstatus=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain,foundinststatus);
 }  }
   
 function flip(vf,tf) {  function flip(vf,tf) {
Line 716  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 734  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 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>';           $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('Default domain').'</h3>'."\n".      } else {
             &Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1);          $Str .= $home_server_pick.
     $Str .= '<h3>'.&mt('Starting and Ending Dates').                  &Apache::lonhtmlcommon::row_closure();
             "</h3>\n";      }
     $Str .= "<p>\n".$date_table."</p>\n";  
       $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 .= &Apache::lonhtmlcommon::end_pick_box();
     $Str .= '</div>';      $Str .= '</div>';
     $Str .= '<div class="LC_clear_float_footer">';  
       # Footer
       $Str .= '<div class="LC_clear_float_footer">'
              .'<hr />';
     if ($context eq 'course') {      if ($context eq 'course') {
         $Str .= '<div class="LC_info">'          $Str .= '<p class="LC_info">'
                .&mt('Note: For large courses, this operation may be time consuming.')                 .&mt('Note: This operation may be time consuming when adding several users.')
                .'</div>';                 .'</p>';
     }      }
     $Str .= '<input type="button"'      $Str .= '<p><input type="button"'
            .'onClick="javascript:verify(this.form,this.form.csec)" '             .' onclick="javascript:verify(this.form,this.form.csec)"'
            .'value="'.&mt('Update Users').'" />'."\n"             .' value="'.&mt('Update Users').'" />'
              .'</p>'."\n"
            .'</div>';             .'</div>';
     $r->print($Str);      $r->print($Str);
     return;      return;
Line 815  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('Student/Employee ID')."</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 Student/Employee ID Safeguard and force change of conflicting IDs').         .&mt('Disable Student/Employee ID Safeguard and force change 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 Student/Employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />').    &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 864  sub print_upload_manager_form { Line 963  sub print_upload_manager_form {
                                'email_choice' => 'scalar',                                 'email_choice' => 'scalar',
                                'role_choice' => 'scalar',                                 'role_choice' => 'scalar',
                                'domain_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 879  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 895  sub print_upload_manager_form { Line 995  sub print_upload_manager_form {
              ['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'}]);               ['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 914  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 988  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 1005  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>';
             }              }
         }          }
     }      }
Line 1036  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 1044  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 1075  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 1089  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 1116  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 1125  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 1180  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 1192  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 1210  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 1230  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 1291  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;
Line 1308  sub print_userlist { Line 1432  sub print_userlist {
              .'</span></label>'.('&nbsp;'x3)."\n");               .'</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 1316  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 1408  sub print_userlist { Line 1562  sub print_userlist {
                         }                          }
                     }                      }
                 }                  }
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif (($env{'form.roletype'} eq 'course') ||
                 if ($env{'form.coursepick'}) {                       ($env{'form.roletype'} eq 'community')) {
                   if (($env{'form.coursepick'}) && (!$clearcoursepick)) {
                     my %courses = &process_coursepick();                      my %courses = &process_coursepick();
                     my %allusers;                      my %allusers;
                     my $hidepriv = 1;                      my $hidepriv = 1;
Line 1420  sub print_userlist { Line 1575  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 1466  sub print_userlist { Line 1622  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 1496  sub role_filter { Line 1654  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') {
Line 1508  sub role_filter { Line 1666  sub role_filter {
         $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><span class="LC_nobreak">'          $output = '<label><span class="LC_nobreak">'
                  .&mt('Role: [_1]',$role_select)                   .&mt('Role: [_1]',$role_select)
                  .'</span></label>';                   .'</span></label> ';
     }      }
     return $output;      return $output;
 }  }
Line 1554  sub section_group_filter { Line 1721  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 1565  sub section_group_filter { Line 1732  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 1580  sub section_group_filter { Line 1747  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 1633  sub gather_userinfo { Line 1802  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 1683  sub gather_userinfo { Line 1853  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 1798  sub process_coursepick { Line 1969  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 1908  sub aggregate_user_info { Line 2083  sub aggregate_user_info {
 sub process_date_info {  sub process_date_info {
     my ($userdata) = @_;      my ($userdata) = @_;
     my $now = time;      my $now = time;
     $userdata->{'status'} = &mt('Active');      $userdata->{'status'} = 'Active';
     if ($userdata->{'start'} > 0) {      if ($userdata->{'start'} > 0) {
         if ($now < $userdata->{'start'}) {          if ($now < $userdata->{'start'}) {
             $userdata->{'status'} = &mt('Future');              $userdata->{'status'} = 'Future';
         }          }
     }      }
     if ($userdata->{'end'} > 0) {      if ($userdata->{'end'} > 0) {
         if ($now > $userdata->{'end'}) {          if ($now > $userdata->{'end'}) {
             $userdata->{'status'} = &mt('Expired');              $userdata->{'status'} = 'Expired';
         }          }
     }      }
     return;      return;
Line 1948  sub show_users_list { Line 2123  sub show_users_list {
         $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 1968  sub show_users_list { Line 2144  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 1975  function photowindow(photolink) { Line 2152  function photowindow(photolink) {
     stdeditbrowser = open(photolink,title,options,"1");      stdeditbrowser = open(photolink,title,options,"1");
     stdeditbrowser.focus();      stdeditbrowser.focus();
 }  }
   // ]]>
 </script>  </script>
                ');                 ');
             }              }
Line 1983  function photowindow(photolink) { Line 2161  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' && $mode ne 'pickauthor') {      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();
Line 1991  END Line 2175  END
         $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
   
 $verify_action_js  $verify_action_js
Line 2028  function username_display_launch(usernam Line 2213  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 2050  END Line 2247  END
                        'status'     => "status",                         'status'     => "status",
                        'role'       => "role",                         'role'       => "role",
                        'type'       => "enroll type/action",                         'type'       => "enroll type/action",
                        'email'      => "email address",                         'email'      => "e-mail address",
                        'photo'      => "photo",                         'photo'      => "photo",
                        'extent'     => "extent",                         'extent'     => "extent",
                        'pr'         => "Proceed",                         'pr'         => "Proceed",
Line 2058  END Line 2255  END
                        'ua'         => "uncheck all",                         'ua'         => "uncheck all",
                        'ac'         => "Action to take for selected users",                         'ac'         => "Action to take for selected users",
                        'link'       => "Behavior of clickable username link for each user",                         '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",                         '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'); 
     }      }
Line 2076  END Line 2276  END
         if ($context eq 'course') {          if ($context eq 'course') {
             push(@cols,'section');              push(@cols,'section');
         }          }
         if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) {           if (!($context eq 'domain' && ($env{'form.roletype'} eq 'course')
                                 && ($env{'form.roletype'} eq 'community'))) { 
             push(@cols,('start','end'));              push(@cols,('start','end'));
         }          }
         if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {          if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
             push(@cols,'role');              push(@cols,'role');
         }          }
         if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||          if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||
                                     $env{'form.roletype'} eq 'course')) {                                      $env{'form.roletype'} eq 'course' ||
                                       $env{'form.roletype'} eq 'community')) {
             push (@cols,'extent');              push (@cols,'extent');
         }          }
         if (($statusmode eq 'Any') &&           if (($statusmode eq 'Any') && 
             (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {              (!($context eq 'domain' && (($env{'form.roletype'} eq 'course')
                || ($env{'form.roletype'} eq 'community'))))) {
             push(@cols,'status');              push(@cols,'status');
         }          }
         if ($context eq 'course') {          if ($context eq 'course') {
Line 2100  END Line 2303  END
     if ($env{'form.showrole'} eq 'cr') {      if ($env{'form.showrole'} eq 'cr') {
         $rolefilter = &mt('custom');            $rolefilter = &mt('custom');  
     } elsif ($env{'form.showrole'} ne 'Any') {      } elsif ($env{'form.showrole'} ne 'Any') {
         $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'});          $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'},$crstype);
     }      }
     my $results_description;      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 /><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' || $mode eq 'pickauthor') {      if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
         if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {          if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
             if ($permission->{'cusr'}) {              if ($permission->{'cusr'}) {
                 $actionselect = &select_actions($context,$setting,$statusmode,$formname);                  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 2123  END Line 2330  END
 END  END
             if ($actionselect) {              if ($actionselect) {
                 $output .= <<"END";                  $output .= <<"END";
 <div class="LC_left_float"><fieldset><legend><b>$lt{'ac'}</b></legend>  <div class="LC_left_float"><fieldset><legend>$lt{'ac'}</legend>
 $actionselect  $actionselect
 <br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> &nbsp;  <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>  <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>
Line 2132  END Line 2339  END
                 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 2168  END Line 2375  END
                     }                      }
                 }                  }
             }              }
             $output .= '<div class="LC_left_float"><fieldset><legend><b>'.$lt{'link'}.'</b></legend>'.              $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'.
                        '<table><tr>';                         '<table><tr>';
             my @linkdests = ('aboutme');              my @linkdests = ('aboutme');
             if ($permission->{'cusr'}) {              if ($permission->{'cusr'}) {
                 unshift (@linkdests,'modify');                  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>';              $output .= '<td>';
             my $usernamelink = $env{'form.usernamelink'};              my $usernamelink = $env{'form.usernamelink'};
             if ($usernamelink eq '') {              if ($usernamelink eq '') {
Line 2182  END Line 2395  END
             foreach my $item (@linkdests) {              foreach my $item (@linkdests) {
                 my $checkedstr = '';                  my $checkedstr = '';
                 if ($item eq $usernamelink) {                  if ($item eq $usernamelink) {
                     $checkedstr = ' checked="checked" ';                      $checkedstr = ' checked="checked"';
                 }                  }
                 $output .= '<span class="LC_nobreak"><label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.'>&nbsp;'.$lt{$item}.'</label></span><br />';                  $output .= '<span class="LC_nobreak"><label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.' />&nbsp;'.$lt{$item}.'</label></span><br />';
             }              }
             my $checkwin;              my $checkwin;
             if ($env{'form.userwin'}) {              if ($env{'form.userwin'}) {
                 $checkwin = 'checked = "checked"';                  $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 .= '</td><td valign="top"  style="border-left: 1px solid;"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
         }          }
         $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".          $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".
                   &Apache::loncommon::start_data_table().                    &Apache::loncommon::start_data_table().
Line 2200  END Line 2413  END
  <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>   <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>
             ";              ";
         } else {          } else {
             if ($mode eq 'pickauthor') {              $output .= "\n".'<th>&nbsp;</th>'."\n";
                 $output .= "\n".'<th>&nbsp;</th>'."\n";  
             } else {   
                 $output .= "\n".'<th>'.&mt('Count').'</th>'."\n";  
             }  
             if ($actionselect) {              if ($actionselect) {
                 $output .= '<th>'.&mt('Select').'</th>'."\n";                  $output .= '<th>'.&mt('Select').'</th>'."\n";
             }              }
Line 2259  END Line 2468  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(&mt('Problems occurred in writing the CSV file. '              $r->print(
                          .'This error has been logged. '                  '<p class="LC_error">'
                          .'Please alert your LON-CAPA administrator.'));                 .&mt('Problems occurred in writing the CSV file.')
                  .' '.&mt('This error has been logged.')
                  .' '.&mt('Please alert your LON-CAPA administrator.')
                  .'</p>'
               );
             $CSVfile = undef;              $CSVfile = undef;
         }          }
         #          #
Line 2303  END Line 2516  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 2548  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 2437  END Line 2656  END
         if ($clickers!~/\w/) { $clickers='-'; }          if ($clickers!~/\w/) { $clickers='-'; }
         $in{'clicker'} = $clickers;           $in{'clicker'} = $clickers; 
  my $role = $in{'role'};   my $role = $in{'role'};
         $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'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 2457  END Line 2676  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 2466  END Line 2685  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 {
Line 2502  END Line 2721  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>');
                     }                      }
Line 2515  END Line 2734  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 2531  END Line 2756  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 2718  sub print_username_link { Line 2943  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 2729  sub role_type_names { Line 2954  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;
 }  }
Line 2818  sub select_actions { Line 3044  sub select_actions {
             }              }
         }          }
         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 2833  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;
         var url = '/adm/createuser?';          var url = '/adm/createuser?';
Line 2858  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 2888  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;
         }          }
Line 2939  END Line 3167  END
   
 $verify_action_js  $verify_action_js
   
   // ]]>
 </script>  </script>
 ENDJS  ENDJS
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
Line 2947  ENDJS Line 3176  ENDJS
                  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 2961  ENDJS Line 3190  ENDJS
         }          }
         $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();
           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 2993  ENDJS Line 3227  ENDJS
             $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>'.
 '<input type="button" name="dateselection" value="'.&mt('Make changes').'" 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(&mt('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";
     }      }
Line 3033  sub section_picker { Line 3267  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 - [_1]:',$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 3060  sub results_header_row { Line 3318  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 3145  sub results_header_row { Line 3403  sub results_header_row {
                 if ($rolefilter eq 'Any') {                  if ($rolefilter eq 'Any') {
                     $description .= &mt('All users with co-author roles in domain',$showfilter);                      $description .= &mt('All users with co-author roles in domain',$showfilter);
                 } else {                  } else {
                     $description .= &mt('All co-authors in domain  with [_1] roles',$rolefilter);                      $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter);
                 }                  }
             }              }
         } elsif ($env{'form.roletype'} eq 'course') {          } elsif (($env{'form.roletype'} eq 'course') || 
                    ($env{'form.roletype'} eq 'community')) {
             my $coursefilter = $env{'form.coursepick'};              my $coursefilter = $env{'form.coursepick'};
             if ($coursefilter eq 'category') {              if ($env{'form.roletype'} eq 'course') {
                 my $instcode = &instcode_from_coursefilter();                  if ($coursefilter eq 'category') {
                 if ($instcode eq '.') {                      my $instcode = &instcode_from_coursefilter();
                       if ($instcode eq '.') {
                           $description .= &mt('All courses in domain').' - ';
                       } else {
                           $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';
                       }
                   } elsif ($coursefilter eq 'selected') {
                       $description .= &mt('Selected courses in domain').' - ';
                   } elsif ($coursefilter eq 'all') {
                     $description .= &mt('All courses in domain').' - ';                      $description .= &mt('All courses in domain').' - ';
                 } else {  
                     $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';  
                 }                  }
             } elsif ($coursefilter eq 'selected') {              } elsif ($env{'form.roletype'} eq 'community') {
                 $description .= &mt('Selected courses in domain').' - ';                  if ($coursefilter eq 'selected') {
             } elsif ($coursefilter eq 'all') {                      $description .= &mt('Selected communities in domain').' - ';
                 $description .= &mt('All courses in domain').' - ';                  } elsif ($coursefilter eq 'all') {
                       $description .= &mt('All communities in domain').' - ';
                   }
             }              }
             if ($statusmode eq 'Expired') {              if ($statusmode eq 'Expired') {
                 $description .= &mt('users with expired [_1] roles',$showfilter);                  $description .= &mt('users with expired [_1] roles',$showfilter);
Line 3197  sub viewable_section { Line 3464  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 3215  sub show_drop_list { Line 3482  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 3241  END Line 3510  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 3249  END Line 3522  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 3262  END Line 3540  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 3281  END Line 3559  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 3336  END Line 3614  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 3351  END Line 3629  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 3369  END Line 3656  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 .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";
     $str .= '<p>';  
     $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",      # Excel and CSV Help
                          &mt("How do I create a users list from a spreadsheet")).      $str .= '<div class="LC_left_float">'
                              "<br />\n";             .&Apache::loncommon::help_open_topic("Course_Create_Class_List",
     $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",                  &mt("How do I create a users list from a spreadsheet"))
                            &mt("How do I create a CSV file from a spreadsheet"));             .'</div><div class="LC_left_float">'."\n"
     $str .= "</p>\n";             .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
     $str .= "<p>\n";                  &mt("How do I create a CSV file from a spreadsheet"))
     $str .= '<label><input type="checkbox" name="noFirstLine" /> '.             .'</div><br clear="all" />'."\n";
         &mt('Ignore First Line')."</label></p>\n";      $str .= &Apache::lonhtmlcommon::start_pick_box()
     $str .= '<input type="submit" name="fileupload" value="'.             .&Apache::lonhtmlcommon::row_title(&mt('File'));
         &mt('Go to next step').'">'."<br />\n";      if (&Apache::lonlocal::current_language() ne 'en') {
     $str .= &Apache::loncommon::end_page();          if ($context eq 'course') { 
               $str .= '<p class="LC_info">'."\n"
                      .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n"
                      .'</p>'."\n";
           }
       }
       $str .= &Apache::loncommon::upfile_select_html()
              .&Apache::lonhtmlcommon::row_closure()
              .&Apache::lonhtmlcommon::row_title(
                   '<label for="noFirstLine">'
                  .&mt('Ignore First Line')
                  .'</label>')
              .'<input type="checkbox" name="noFirstLine" id="noFirstLine" />'
              .&Apache::lonhtmlcommon::row_closure(1)
              .&Apache::lonhtmlcommon::end_pick_box();
   
       $str .= '<p>'
              .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />'
              .'</p>';
   
     $r->print($str);      $r->print($str);
     return;      return;
 }  }
Line 3430  sub upfile_drop_add { Line 3736  sub upfile_drop_add {
                                                 'ipwd_choice' => 'scalar',                                                  'ipwd_choice' => 'scalar',
                                                 'email_choice' => 'scalar',                                                  'email_choice' => 'scalar',
                                                 'role_choice'  => 'scalar',                                                  'role_choice'  => 'scalar',
                                                 'domain_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 $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
Line 3486  sub upfile_drop_add { Line 3806  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') {
Line 3501  sub upfile_drop_add { Line 3820  sub upfile_drop_add {
         $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 3561  sub upfile_drop_add { Line 3874  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 3606  sub upfile_drop_add { Line 3921  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 3637  sub upfile_drop_add { Line 3953  sub upfile_drop_add {
                     ne &LONCAPA::clean_username($entries{$fields{'username'}})) {                      ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
                     $r->print('<br />'.                      $r->print('<br />'.
       &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',        &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',
           '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen).            '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen));
                               '</b>');  
                     next;                      next;
                 } else {                  } else {
                     if ($entries{$fields{'domain'}}                       if ($entries{$fields{'domain'}} 
                         ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {                          ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {
                         $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}.                          $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}.
                                   '</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen).'</b>');                                    '</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen));
                         next;                          next;
                     }                      }
                     my $username = $entries{$fields{'username'}};                      my $username = $entries{$fields{'username'}};
Line 3701  sub upfile_drop_add { Line 4016  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 3784  sub upfile_drop_add { Line 4107  sub upfile_drop_add {
                                 }                                  }
                             }                              }
                             my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id);                              my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id);
                             for (my $i=0; $i<@userinfo; $i++) {                              for (my $i=0; $i<@newinfo; $i++) {
                                 if (${$newinfo[$i]} ne '') {                                  if (${$newinfo[$i]} ne '') {
                                     if (!$canmodify{$userinfo[$i]}) {                                      if (!$canmodify{$userinfo[$i]}) {
                                         ${$newinfo[$i]} = '';                                          ${$newinfo[$i]} = '';
Line 3833  sub upfile_drop_add { Line 4156  sub upfile_drop_add {
                                      $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 3842  sub upfile_drop_add { Line 4165  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) {
Line 3853  sub upfile_drop_add { Line 4176  sub upfile_drop_add {
                                                     $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 3868  sub upfile_drop_add { Line 4191  sub upfile_drop_add {
                                                     $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 4042  sub user_change_result { Line 4366  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 4061  sub update_user_list { Line 4395  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 4131  sub update_user_list { Line 4469  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 4188  sub update_user_list { Line 4526  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 4296  sub update_user_list { Line 4634  sub update_user_list {
     }      }
     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 4383  sub course_sections { Line 4721  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 4443  sub get_groupslist { Line 4781  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 4482  sub setsections_javascript { Line 4820  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 on 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 4491  sub setsections_javascript { Line 4832  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 trimleading = /^\\s+/;
       var trimtrailing = /\\s+\$/;
     var groups = new Array($groupslist);      var groups = new Array($groupslist);
     for (var i=0;i<formname.elements.length;i++) {      for (var i=0;i<formname.elements.length;i++) {
         var str = formname.elements[i].name;          var str = formname.elements[i].name;
         var checkcurr = str.match(re1);          var checkcurr = str.match(re1);
         if (checkcurr != null) {          if (checkcurr != null) {
               var num = i;
             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 fromexisting = new Array();
                     for (var j=0; j<formname.elements[i].length; j++) {                      for (var j=0; j<formname.elements[num].length; j++) {
                         if (formname.elements[i].options[j].selected == true ) {                          if (formname.elements[num].options[j].selected == true ) {
                             if (formname.elements[i].options[j].value != "") {                              var addsec = formname.elements[num].options[j].value;
                               if (addsec != "") {
                                   fromexisting.push(addsec);
                                 if (numsec == 0) {                                  if (numsec == 0) {
                                     if (formname.elements[i].options[j].value != "") {                                      sections = addsec;
                                         sections = formname.elements[i].options[j].value;                                  } else {
                                         numsec ++;                                      sections = sections + "," +  addsec;
                                     }  
                                 }  
                                 else {  
                                     sections = sections + "," +  formname.elements[i].options[j].value  
                                     numsec ++;  
                                 }                                  }
                                   numsec ++;
                             }                              }
                         }                          }
                     }                      }
                     if (numsec > 0) {                      var newsecs = formname.elements[num+1].value;
                         if (formname.elements[i+1].value != "" && formname.elements[i+1].value != null) {                      var validsecs = new Array();
                             sections = sections + "," +  formname.elements[i+1].value;                      var validsecstr = '';
                         }                      var badsecs = new Array();
                     }  
                     else {  
                         sections = formname.elements[i+1].value;  
                     }  
                     var newsecs = formname.elements[i+1].value;  
                     var numsplit;  
                     if (newsecs != null && newsecs != "") {                      if (newsecs != null && newsecs != "") {
                         numsplit = newsecs.split(/,/g);                          var numsplit;
                         numsec = numsec + numsplit.length;                          if (newsecs.indexOf(',') == -1) {
                               numsplit = new Array(newsecs);
                           } else {
                               numsplit = newsecs.split(/,/g);
                           }
                           for (var i=0; i<numsplit.length; i++) {
                               var newsec = numsplit[i];
                               newsec = newsec.replace(trimleading,'');
                               newsec = newsec.replace(trimtrailing,'');
                               if (re2.test(newsec) == true) {
                                   badsecs.push(newsec);
                               } else {
                                   if (newsec != '') {
                                       var isnew = 1;
                                       if (fromexisting != null) {
                                           for (var m=0; m<fromexisting.length; m++) {
                                               if (newsec == fromexisting[m]) {
                                                   isnew = 0;
                                               }
                                           }
                                       }
                                       if (isnew == 1) {
                                           validsecs.push(newsec);
                                       }
                                   }
                               }
                           }
                           if (badsecs.length > 0) {
                               alert("$alerts{'nonw'}\\n$alerts{'plch'}");
                               return;
                           }
                           numsec = numsec + validsecs.length;
                     }                      }
   
                     if ((role == 'st') && (numsec > 1)) {                      if ((role == 'st') && (numsec > 1)) {
                         alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}")                          if (crstype == 'Community') {
                               alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                           } else {
                               alert("$alerts{'inco'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                           }
                         return;                          return;
                     }                      } else {
                     else {                          if (validsecs != null) {
                         if (numsplit != null) {                              for (var j=0; j<validsecs.length; j++) {
                             for (var j=0; j<numsplit.length; j++) {                                  if (validsecstr == '' || validsecstr == null) {
                                 if ((numsplit[j] == 'all') ||                                      validsecstr = validsecs[j];
                                     (numsplit[j] == 'none')) {                                  } else {
                                     alert("'"+numsplit[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");                                      validsecstr += ','+validsecs[j];
                                   }
                                   if ((validsecs[j] == 'all') ||
                                       (validsecs[j] == 'none')) {
                                       alert("'"+validsecs[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
                                     return;                                      return;
                                 }                                  }
                                 for (var k=0; k<groups.length; k++) {                                  for (var k=0; k<groups.length; k++) {
                                     if (numsplit[j] == groups[k]) {                                      if (validsecs[j] == groups[k]) {
                                         alert("'"+numsplit[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");                                          alert("'"+validsecs[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
                                         return;                                          return;
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                          }
                         formname.elements[i+2].value = sections;  
                     }                      }
                       if ((validsecstr != '') && (validsecstr != null)) {
                           if (numsec > 0) {
                               sections = sections + "," + validsecstr;
                           } else {
                               sections = validsecstr;
                           }
                       }
                       formname.elements[num+2].value = sections;
                 }                  }
             }              }
         }          }
Line 4582  sub can_create_user { Line 4968  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 4680  sub check_usertype { Line 5066  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 4769  sub authorpriv { Line 5164  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 4807  sub dc_setcourse_js { Line 5202  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 4853  function setCourse() { Line 5249  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 4865  function setCourse() { Line 5265  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 4875  function setCourse() { Line 5279  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 4990  ENDSCRIPT Line 5402  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.75  
changed lines
  Added in v.1.116


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.