Diff for /loncom/interface/loncoursegroups.pm between versions 1.5 and 1.18

version 1.5, 2006/02/18 01:27:07 version 1.18, 2006/05/18 14:03:23
Line 30  use Apache::loncommon; Line 30  use Apache::loncommon;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
   use Apache::longroup;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
   
 sub handler {  sub handler {
Line 37  sub handler { Line 38  sub handler {
   
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
                                                                                   
     if ($r->header_only) {      if ($r->header_only) {
         return OK;          return OK;
     }      }
Line 88  sub handler { Line 89  sub handler {
                                   \%functions,\%idx,$view_permission,                                    \%functions,\%idx,$view_permission,
                                   $manage_permission,$rowColor1,$rowColor2);                                    $manage_permission,$rowColor1,$rowColor2);
         } else {          } else {
             $r->print('You do not have group administration '.              $r->print(&mt('You do not have group administration '.
                       'privileges in this course');                            'privileges in this course'));
         }          }
     } else {      } else {
         &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx,          &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx,
Line 102  sub handler { Line 103  sub handler {
 sub print_main_menu {  sub print_main_menu {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,      my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,
         $manage_permission,$action,$rowColor1,$rowColor2) = @_;          $manage_permission,$action,$rowColor1,$rowColor2) = @_;
     $r->print(&header('Course Groups',&mt('LON-CAPA Course Groups'),      $r->print(&header('Course Groups',undef,undef,undef,undef,$function));
               undef,undef,undef,undef,$function));  
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/coursegroups",          ({href=>"/adm/coursegroups",
           text=>"Course Groups",});            text=>"Course Groups",});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Groups'));
               (undef,'Course Groups'));  
     &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,      &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
                     $view_permission,$manage_permission,$action,$rowColor1,                      $view_permission,$manage_permission,$action,$rowColor1,
                     $rowColor2);                      $rowColor2);
Line 129  sub display_groups { Line 128  sub display_groups {
       delete => '<a href="/adm/coursegroups?action=delete&refpage='.        delete => '<a href="/adm/coursegroups?action=delete&refpage='.
                 $env{'form.refpage'}.'&groupname=',                  $env{'form.refpage'}.'&groupname=',
     );      );
     my %actiontext = &Apache::lonlocal::texthash(       my %lt = &Apache::lonlocal::texthash( 
                           modify => 'Modify',                            modify => 'Modify',
                           view => 'View',                            view   => 'View',
                           delete => 'Delete',                            delete => 'Delete',
                      );                              act    => 'Action',
     $r->print('<br /><br />');                            gname  => 'Group Name',
                             desc   => 'Description',
                             crea   => 'Creator',
                             crtd   => 'Created',
                             last   => 'Last Modified',
                             func   => 'Functionality',
                             quot   => 'Quota (Mb)',
                             memb   => 'Members',
                             file   => 'Files',
                             dibd   => 'Discussion Boards',
                             dius   => 'Disk Use',
                             nogr   => 'No groups exist.',
                             crng   => 'Create a new group',
                             alth   => 'Although your current role has privileges'.
                                       ' to view any existing groups in this course,'.
                                       ' you do not have privileges to create new'.
                                       ' groups.',
                        );
     if ($view_permission) {      if ($view_permission) {
         if (!defined($action)) {          if (!defined($action)) {
             $action = 'view';              $action = 'view';
         }          }
         my %curr_groups;          my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
         if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {          if (%curr_groups) {
               $r->print('<br /><br />');
             $r->print(&Apache::lonhtmlcommon::start_pick_box());              $r->print(&Apache::lonhtmlcommon::start_pick_box());
             $r->print(<<"END");              $r->print(<<"END");
       <table border="0" cellpadding="4" cellspacing="1">        <table border="0" cellpadding="4" cellspacing="1">
        <tr bgcolor="$tabcol" align="center">         <tr bgcolor="$tabcol" align="center">
         <td><b>Action</b></td>          <td><b>$lt{'act'}</b></td>
         <td><b><a href="javascript:changeSort('groupname')">Group Name</a></b></td>          <td><b><a href="javascript:changeSort('groupname')">$lt{'gname'}</a></b></td>
         <td><b><a href="javascript:changeSort('description')">Description</a></b></td>          <td><b><a href="javascript:changeSort('description')">$lt{'desc'}</a></b></td>
         <td><b><a href="javascript:changeSort('creator')">Creator</a></b>          <td><b><a href="javascript:changeSort('creator')">$lt{'crea'}</a></b>
         </td>          </td>
         <td><b><a href="javascript:changeSort('creation')">Created</a></b>          <td><b><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></b>
         </td>          </td>
         <td><b><a href="javascript:changeSort('modified')">Last Modified</a></b>          <td><b><a href="javascript:changeSort('modified')">$lt{'last'}</a></b>
         </td>          </td>
         <td><b>Functionality</b>          <td><b>$lt{'func'}</b>
         </td>          </td>
         <td><b><a href="javascript:changeSort('quota')">Quota (Mb)</a></b></td>          <td><b><a href="javascript:changeSort('quota')">$lt{'quot'}</a></b></td>
         <td><b><a href="javascript:changeSort('totalmembers)">Members</a></b></td>          <td><b><a href="javascript:changeSort('totalmembers)">$lt{'memb'}</a></b></td>
         <td><b><a href="javascript:changeSort('totalfiles')">Files</a></b></td>          <td><b><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></b></td>
         <td><b><a href="javascript:changeSort('boards')">Discussion boards</a></b></td>          <td><b><a href="javascript:changeSort('boards')">$lt{'dibd'}</a></b></td>
         <td><b><a href="javascript:changeSort('diskuse')">Disk use</a></b></td>          <td><b><a href="javascript:changeSort('diskuse')">$lt{'dius'}</a></b></td>
        </tr>         </tr>
 END  END
             my %Sortby = ();              my %Sortby = ();
             foreach my $group (sort(keys(%curr_groups))) {              foreach my $group (sort(keys(%curr_groups))) {
                 %{$grp_info{$group}} =                   %{$grp_info{$group}} = 
                                   &Apache::loncommon::get_group_settings(                                    &Apache::longroup::get_group_settings(
                                                          $curr_groups{$group});                                                           $curr_groups{$group});
                 my $members_result = &group_members($cdom,$cnum,$group,                  my $members_result = &group_members($cdom,$cnum,$group,
                                                     \%grp_info);                                                      \%grp_info);
Line 218  END Line 235  END
                     my $diskuse = $grp_info{$group}{'diskuse'};                      my $diskuse = $grp_info{$group}{'diskuse'};
                     my $functionality;                      my $functionality;
                     foreach my $tool (sort(keys(%{$functions}))) {                      foreach my $tool (sort(keys(%{$functions}))) {
                         if (defined($grp_info{$group}{functions}{$tool})) {                          if ($grp_info{$group}{functions}{$tool} eq 'on') {
                             $functionality .= ' '.$tool;                              $functionality .= ' '.$tool;
                         }                          }
                     }                      }
                     if (!$functionality) {                      if (!$functionality) {
                         $functionality = 'None available';                          $functionality = &mt('None available');
                     }                      }
                     my $link = $actionlinks{$action};                      my $link = $actionlinks{$action};
                     if ($action eq 'modify' || $action eq 'delete') {                      if ($action eq 'modify' || $action eq 'delete') {
Line 231  END Line 248  END
                     } else {                      } else {
                         $link .= $group.'/grppg?register=1';                          $link .= $group.'/grppg?register=1';
                     }                      }
                     $link .= '">'.$actiontext{$action}.'</a>';                        $link .= '">'.$lt{$action}.'</a>';  
                     $r->print('<tr bgcolor="'.$rowColor.'"><td><small>'.$link.'</small></td><td><small>'.$group.'</small></td><td><small>'.$description.'</small></td><td><small>'.$creator.'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($creation).'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($modified).'</small></td><td><small>'.$functionality.'</small></td><td><small>'.$quota.'</small></td><td><small>'.$totalmembers.'</small></td><td><small>'.$totalfiles.'</small></td><td><small>'.$boards.'</small></td><td><small>'.$diskuse.'</small></td></tr>');                      $r->print('<tr bgcolor="'.$rowColor.'"><td><small>'.$link.'</small></td><td><small>'.$group.'</small></td><td><small>'.$description.'</small></td><td><small>'.$creator.'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($creation).'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($modified).'</small></td><td><small>'.$functionality.'</small></td><td><small>'.$quota.'</small></td><td><small>'.$totalmembers.'</small></td><td><small>'.$totalfiles.'</small></td><td><small>'.$boards.'</small></td><td><small>'.$diskuse.'</small></td></tr>');
                     $rowNum ++;                      $rowNum ++;
                 }                  }
Line 239  END Line 256  END
             $r->print('</table>');              $r->print('</table>');
             $r->print(&Apache::lonhtmlcommon::end_pick_box());              $r->print(&Apache::lonhtmlcommon::end_pick_box());
         } else {          } else {
             $r->print('No groups exist');              $r->print($lt{'nogr'});
               if ($manage_permission) {
                   $r->print('<br /><br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
               } else {
                   $r->print('<br /><br />'.$lt{'crng'});
   
               }
         }          }
     } else {      } else {
         my @coursegroups = split(/:/,$env{'request.course.groups'});          my @coursegroups = split(/:/,$env{'request.course.groups'});
         if (@coursegroups > 0) {          if (@coursegroups > 0) {
             my %curr_groups;              $r->print('<br /><br />');
             if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {              my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
               if (%curr_groups) {
                 foreach my $group (@coursegroups) {                  foreach my $group (@coursegroups) {
                     my %group_info =  &Apache::loncommon::get_group_settings(                      my %group_info =  &Apache::longroup::get_group_settings(
                                         $curr_groups{$group});                                          $curr_groups{$group});
                     my $description = &Apache::lonnet::unescape(                      my $description = &Apache::lonnet::unescape(
                                         $group_info{description});                                          $group_info{description});
Line 256  END Line 280  END
                 }                  }
             }              }
         } else {          } else {
             $r->print('You are not currently a member of any active groups in this course');              $r->print(&mt('You are not currently a member of any '.
                             'active groups in this course'));
         }          }
     }      }
     return;      return;
Line 276  sub group_administration { Line 301  sub group_administration {
     my %usertools = ();      my %usertools = ();
     my %stored = ();      my %stored = ();
     my %memchg;      my %memchg;
     my @member_changes = ('delete','expire','activate','reenable',      my @member_changes = ('deletion','expire','activate','reenable',
                           'changefunc','changepriv');                            'changefunc','changepriv');
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     my ($groupname,$description,$startdate,$enddate,$granularity,$specificity);      my ($groupname,$description,$startdate,$enddate,$granularity,$specificity);
Line 315  sub group_administration { Line 340  sub group_administration {
         }          }
     }      }
   
     if (($action eq 'modify') && (($state eq 'change_privs') || ($state eq 'memresult'))) {  
         foreach my $chg (@member_changes) {  
             if (defined($env{'form.'.$chg})) {  
                 @{$memchg{$chg}} = &Apache::loncommon::get_env_multiple('form.'.$chg);  
             }  
         }  
         &check_changes(\@member_changes,\%memchg);  
         foreach my $change (@member_changes) {  
             if (($change eq 'delete') || ($change eq 'expire')) {  
                 next;  
             }   
             foreach my $user (@{$memchg{$change}}) {  
                 %{$usertools{$user}} = ();  
             }  
         }  
     }  
   
     if ($action eq 'modify') {      if ($action eq 'modify') {
         if ($state eq '') {          if ($state eq '') {
             $state = 'pick_group';              $state = 'pick_group';
Line 426  sub group_administration { Line 434  sub group_administration {
                                    );                                     );
     if (ref($stored{'autorole'}) eq 'ARRAY') {      if (ref($stored{'autorole'}) eq 'ARRAY') {
         foreach my $role (@{$stored{'autorole'}}) {          foreach my $role (@{$stored{'autorole'}}) {
             $elements{'modify'}{'change_settings'}{'sec_'.$role} = 'selectbox';               unless ($role eq 'cc') {
                   $elements{'modify'}{'change_settings'}{'sec_'.$role} = 
                                                                      'selectbox';
               }
         }          }
     }      }
     %{$elements{'create'}{'pick_members'}} = (      %{$elements{'create'}{'pick_members'}} = (
Line 447  sub group_administration { Line 458  sub group_administration {
         (($state eq 'pick_name') || ($state eq 'pick_privs'))) ||          (($state eq 'pick_name') || ($state eq 'pick_privs'))) ||
        (($action eq 'modify') && (($state eq 'change_settings') ||         (($action eq 'modify') && (($state eq 'change_settings') ||
                                   ($state eq 'add_members')))) {                                    ($state eq 'add_members')))) {
         my $numsections = &Apache::loncommon::get_sections($cdom,$cnum,          %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
                                                            \%sectioncount);          if (%sectioncount) {
         if ($numsections > 0) {  
             $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox';              $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox';
             $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox';              $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox';
             $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox';              $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox';
         }          }
     }      }
   
     if ($action eq 'create') {      if (($action eq 'create') || 
           ($action eq 'modify' && $state eq 'pick_members')) {
         if (defined($env{'form.types'})) {          if (defined($env{'form.types'})) {
             @types=&Apache::loncommon::get_env_multiple('form.types');              @types=&Apache::loncommon::get_env_multiple('form.types');
         }          }
Line 471  sub group_administration { Line 482  sub group_administration {
         }          }
     }      }
   
     if (($state eq 'pick_members') || ($state eq 'pick_privs')) {      if (($state eq 'pick_members') || ($state eq 'pick_privs') || ($state eq 'change_privs')) {
         &build_members_list($cdom,$cnum,\@types,\@roles,          &build_members_list($cdom,$cnum,\@types,\@roles,\@sections,\%users,
                             \@sections,\%users,\%userdata);                              \%userdata);
       }
       if ($state eq 'pick_members') {
         if ((keys(%users) > 0) && (@tools > 0)) {          if ((keys(%users) > 0) && (@tools > 0)) {
               if ($granularity eq 'Yes') {
                   $elements{$action}{'pick_members'}{'togglefunc'} = 'checkbox';
               }
             foreach my $tool (@tools) {              foreach my $tool (@tools) {
                 if ($granularity eq 'Yes') {                  if ($granularity eq 'Yes') {
                     $elements{$action}{'pick_members'}{'user_'.$tool} = 'checkbox';                      $elements{$action}{'pick_members'}{'user_'.$tool} = 'checkbox';
Line 483  sub group_administration { Line 499  sub group_administration {
             $elements{$action}{'pick_members'}{'specificity'} = 'radio';              $elements{$action}{'pick_members'}{'specificity'} = 'radio';
         }          }
     }      }
       if ($state eq 'change_members') {
           my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                                  $groupname);
           my $now = time;
           my $num_expire = 0;
           my $num_activate = 0;
           my $num_reenable = 0;
           my $num_deletion = 0;
           my $numusers = 0;
           foreach my $key (sort(keys(%membership))) {
               if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
                   my $user = $1;
                   my($end,$start,@userprivs) = split(/:/,$membership{$key});
                   unless ($start == -1) {
                       $numusers ++;
                       $num_deletion ++;
                       if (($end > 0) && ($end < $now)) {
                           $num_reenable ++;
                           next;
                       } elsif (($start > $now)) {
                           $num_activate = 1;
                           next;
                       } else {
                           $num_expire ++;
                           next;
                       }
                       next;
                   }
                   if ($num_reenable && $num_activate && $num_expire) {
                       last;
                   }
               }
           }
           if ($num_deletion) {
               $elements{$action}{'change_members'}{'deletion'} = 'checkbox';
           }
           if ($num_expire) {
               $elements{$action}{'change_members'}{'expire'} = 'checkbox';
           }
           if ($num_activate) {
               $elements{$action}{'change_members'}{'activate'} = 'checkbox';
           }
           if ($num_reenable) {
               $elements{$action}{'change_members'}{'reenable'} = 'checkbox';
           }
           if ($numusers) {
               if ($granularity eq 'Yes') {
                   $elements{$action}{'change_members'}{'togglefunc'} = 'checkbox';
               }
               foreach my $tool (@tools) {
                   if ($granularity eq 'Yes') {
                       $elements{$action}{'change_members'}{'user_'.$tool} = 'checkbox';
                   }
               }
               if ($specificity eq 'Yes') {
                   $elements{$action}{'change_members'}{'changepriv'} = 'checkbox';
               }
           }
       }
   
     if (($state eq 'pick_privs') || ($state eq 'change_privs') ||      if (($state eq 'pick_privs') || ($state eq 'change_privs') ||
         (($specificity eq 'No') &&           (($specificity eq 'No') && 
Line 495  sub group_administration { Line 570  sub group_administration {
                 }                  }
             }              }
         }          }
         if ((($state eq 'pick_privs') || ($state eq 'change_privs'))      }
             && ($specificity eq 'Yes')) {  
             foreach my $user (sort(keys(%usertools))) {      if (($action eq 'modify') && (($state eq 'change_privs') || ($state eq 'memresult'))) {
                 foreach my $tool (keys(%{$usertools{$user}})) {          foreach my $chg (@member_changes) {
                     foreach my $priv (keys(%{$toolprivs{$tool}})) {              if (defined($env{'form.'.$chg})) {
                         unless (exists($fixedprivs{$tool}{$priv})) {                  @{$memchg{$chg}} = &Apache::loncommon::get_env_multiple('form.'.$chg);
                             $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox';              }
           }
                                                                                 
           if ($state eq 'change_privs') {
               my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                                      $groupname);
               my $now = time;
               foreach my $key (sort(keys(%membership))) {
                   if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
                       my $user = $1;
                       my $changefunc = 0;
                       my ($end,$start,@userprivs) = split(/:/,$membership{$key});
                       unless ($start == -1) {
                           if (($end > 0) && ($end < $now)) {
                               unless (grep/^$user$/,$memchg{'reenable'}) {
                                   next;
                               }
                           }
                           my @currtools = ();
                           if (@userprivs > 0) {
                               foreach my $tool (sort(keys(%fixedprivs))) {
                                   foreach my $priv (keys(%{$fixedprivs{$tool}})) {
                                       if (grep/^$priv$/,@userprivs) {
                                           push(@currtools,$tool);
                                           last;
                                       }
                                   }
                               }
                           }
                           foreach my $tool (@currtools) {
                               if (keys(%{$usertools{$user}}) > 0) {
                                   if (!$usertools{$user}{$tool}) {
                                       push(@{$memchg{'changefunc'}},$user);
                                       $changefunc = 1;
                                       last;
                                   }
                               } else {
                                   push(@{$memchg{'changefunc'}},$user);
                                   $changefunc = 1;
                               }
                           }
                           if ($changefunc) {
                               next;
                           }
                           if (keys(%{$usertools{$user}}) > 0) {
                               foreach my $tool (keys(%{$usertools{$user}})) {
                                   if (!grep/^$tool$/,@currtools) {
                                       push(@{$memchg{'changefunc'}},$user);
                                       $changefunc = 1;
                                       last;
                                   }
                               }
                           }
                       }
                   }
               }
               &check_changes(\@member_changes,\%memchg);
               my %temptools;
               foreach my $change (@member_changes) {
                   if (($change eq 'deletion') || ($change eq 'expire')) {
                       next;
                   }
                   foreach my $user (@{$memchg{$change}}) {
                       unless (exists($usertools{$user})) {
                           %{$usertools{$user}} = ();
                       }
                       %{$temptools{$user}} = %{$usertools{$user}}; 
                   }
               }
               %usertools = %temptools;
           } elsif ($state eq 'memresult') {
               foreach my $change (@member_changes) {
                   if ($change eq 'expire' || $change eq 'deletion') {
                       next;
                   }
                   if (ref($memchg{$change}) eq 'ARRAY') { 
                       my @users = @{$memchg{$change}};
                       foreach my $user (@users) {
                           unless (exists($usertools{$user})) {
                               %{$usertools{$user}} = ();
                         }                          }
                     }                      }
                 }                  }
             }              }
         }          }
     }      }
   
       if ((($state eq 'pick_privs') || ($state eq 'change_privs'))
           && ($specificity eq 'Yes')) {
           foreach my $user (sort(keys(%usertools))) {
               foreach my $tool (keys(%{$usertools{$user}})) {
                   foreach my $priv (keys(%{$toolprivs{$tool}})) {
                       unless (exists($fixedprivs{$tool}{$priv})) {
                           $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox';
                       }
                   }
               }
           }
       }
     
     my $jscript = &Apache::loncommon::check_uncheck_jscript();      my $jscript = &Apache::loncommon::check_uncheck_jscript();
     $jscript .= qq|      $jscript .= qq|
Line 519  function backPage(formname,prevstate) { Line 686  function backPage(formname,prevstate) {
     formname.state.value = prevstate;      formname.state.value = prevstate;
     formname.submit();      formname.submit();
 }  }
                                                                                         function changeSort(caller) {
       document.$state.state.value = '$state';
       document.$state.sortby.value = caller;
       document.$state.submit();
   } 
   
 |;  |;
     $jscript .= &Apache::lonhtmlcommon::set_form_elements(      $jscript .= &Apache::lonhtmlcommon::set_form_elements(
                            \%{$elements{$action}{$state}},\%stored);                             \%{$elements{$action}{$state}},\%stored);
Line 551  function backPage(formname,prevstate) { Line 723  function backPage(formname,prevstate) {
     }      }
   
     my $loaditems =  &onload_action($action,$state);      my $loaditems =  &onload_action($action,$state);
     $r->print(&header('Course Groups Manager',&mt('LON-CAPA Groups Manager'),      $r->print(&header('Course Groups Manager',
                           $jscript,$action,$state,$page,$function,$loaditems));        $jscript,$action,$state,$page,$function,$loaditems));
   
     if ($env{'form.refpage'} eq 'enrl') {      if ($env{'form.refpage'} eq 'enrl') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
Line 602  function backPage(formname,prevstate) { Line 774  function backPage(formname,prevstate) {
                 &Apache::lonhtmlcommon::add_breadcrumb(                  &Apache::lonhtmlcommon::add_breadcrumb(
                    {text=>"$trail{$action}{$state}"});                     {text=>"$trail{$action}{$state}"});
                 $r->print(&Apache::lonhtmlcommon::breadcrumbs                  $r->print(&Apache::lonhtmlcommon::breadcrumbs
                      (undef,'Course Groups Manager'));    ('Course Groups Manager'));
                 &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,                  &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                        \%sectioncount,$groupname,$description,$functions,                         \%sectioncount,$groupname,$description,$functions,
                        \@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate,                         \@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate,
Line 612  function backPage(formname,prevstate) { Line 784  function backPage(formname,prevstate) {
                        \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2);                         \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2);
                 last;                  last;
             } else {              } else {
                 if (($state  =~ /^\w+result$/) && ($i > 0)) {                  if (($state eq 'result') && ($i > 0)) {
                     &Apache::lonhtmlcommon::add_breadcrumb(                      &Apache::lonhtmlcommon::add_breadcrumb(
     {href=>"javascript:backPage(document.$state,'$states{$action}[0]')",      {href=>"javascript:backPage(document.$state,'$states{$action}[0]')",
       text=>"$trail{$action}{$states{$action}[$i]}"});        text=>"$trail{$action}{$states{$action}[$i]}"});
Line 627  function backPage(formname,prevstate) { Line 799  function backPage(formname,prevstate) {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
                    {text=>"View groups"});                     {text=>"View groups"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
                      (undef,'Course Groups Manager'));    ('Course Groups Manager'));
         &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,          &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
                         $view_permission,$manage_permission,$action,                          $view_permission,$manage_permission,$action,
                         $rowColor1,$rowColor2);                          $rowColor1,$rowColor2);
Line 639  function backPage(formname,prevstate) { Line 811  function backPage(formname,prevstate) {
   
 sub retrieve_settings {  sub retrieve_settings {
     my ($cdom,$cnum,$groupname) = @_;      my ($cdom,$cnum,$groupname) = @_;
     my %groupinfo;      my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname);
   
       return if (!%curr_groups);
   
       my %groupinfo = 
    &Apache::longroup::get_group_settings($curr_groups{$groupname});
   
     my %stored;      my %stored;
     my %curr_groups;  
     my $numgroups = &Apache::loncommon::coursegroups(\%curr_groups,$cdom,      $stored{'description'} = 
                                                              $cnum,$groupname);   &Apache::lonnet::unescape($groupinfo{'description'});
     if ($numgroups > 0) {      $stored{'startdate'} = $groupinfo{'startdate'};
         %groupinfo = &Apache::loncommon::get_group_settings(      $stored{'enddate'} = $groupinfo{'enddate'};
                                                      $curr_groups{$groupname});      if ($stored{'enddate'} == 0) {
         $stored{'description'} = &Apache::lonnet::unescape(   $stored{'no_end_date'} = 1;
                                                     $groupinfo{'description'});      }
         $stored{'startdate'} = $groupinfo{'startdate'};      $stored{'granularity'} = $groupinfo{'granularity'};
         $stored{'enddate'} = $groupinfo{'enddate'};      $stored{'specificity'} = $groupinfo{'specificity'};
         if ($stored{'enddate'} == 0) {      $stored{'creation'} = $groupinfo{'creation'};
             $stored{'no_end_date'} = 1;      $stored{'creator'} = $groupinfo{'creator'};
         }  
         $stored{'granularity'} = $groupinfo{'granularity'};      foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) {
         $stored{'specificity'} = $groupinfo{'specificity'};   if ($groupinfo{functions}{$tool} eq 'on') {
         $stored{'creation'} = $groupinfo{'creation'};      push(@{$stored{tool}},$tool);
         $stored{'creator'} = $groupinfo{'creator'};   }
       }
         foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) {      foreach my $role (@{$groupinfo{'roles'}}) {
             if ($groupinfo{functions}{$tool} eq 'on') {   push(@{$stored{roles}},$role);
                 push(@{$stored{tool}},$tool);      }
             }      foreach my $type (@{$groupinfo{'types'}}) {
         }   push(@{$stored{types}},$type);
         foreach my $role (@{$groupinfo{'roles'}}) {      }
             push(@{$stored{roles}},$role);      foreach my $section (@{$groupinfo{'sectionpick'}}) {
         }   push(@{$stored{sectionpick}},$section);
         foreach my $type (@{$groupinfo{'types'}}) {      }
             push(@{$stored{types}},$type);      foreach my $defpriv (@{$groupinfo{'defpriv'}}) {
         }   push(@{$stored{defpriv}},$defpriv);
         foreach my $section (@{$groupinfo{'sectionpick'}}) {      }
             push(@{$stored{sectionpick}},$section);      $stored{'autoadd'} = $groupinfo{'autoadd'};
         }      $stored{'autodrop'} = $groupinfo{'autodrop'};
         foreach my $defpriv (@{$groupinfo{'defpriv'}}) {      if (exists($groupinfo{'autosec'})) {
             push(@{$stored{defpriv}},$defpriv);   foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {
         }              if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') {
         $stored{'autoadd'} = $groupinfo{'autoadd'};          foreach my $section (@{$groupinfo{'autosec'}{$role}}) {
         $stored{'autodrop'} = $groupinfo{'autodrop'};              push (@{$stored{'sec_'.$role}},$section);
         if (exists($groupinfo{'autosec'})) {          }
             foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {          if (@{$groupinfo{'autosec'}{$role}} > 0) {
                 foreach my $section (@{$groupinfo{'autosec'}{$role}}) {      push(@{$stored{'autorole'}},$role);
                     push (@{$stored{'sec_'.$role}},$section);          }
                 }  
                 if (@{$groupinfo{'autosec'}{$role}} > 0) {  
                     push(@{$stored{'autorole'}},$role);  
                 }  
             }              }
         }   }
     }      }
     return %stored;      return %stored;
 }  }
Line 767  sub display_control { Line 941  sub display_control {
                                $startdate,$enddate,$tools,$functions,                                 $startdate,$enddate,$tools,$functions,
                                $toolprivs,$fixedprivs,$userdata,$usertools,                                 $toolprivs,$fixedprivs,$userdata,$usertools,
                                $memchg,$idx,$states,$stored,$sectioncount,                                 $memchg,$idx,$states,$stored,$sectioncount,
                                $navbuttons,$rowColor1,$rowColor2) = @_;                                 $navbuttons,$rowColor1,$rowColor2);
         } elsif ($state eq 'chgresult' || $state eq 'memresult' ||           } elsif ($state eq 'chgresult' || $state eq 'memresult' || 
                  $state eq 'addresult') {                   $state eq 'addresult') {
             &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page,
Line 781  sub display_control { Line 955  sub display_control {
 }  }
   
 sub header {  sub header {
     my ($bodytitle,$title,$jscript,$action,$state,$page,$function,$loaditems) = @_;      my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_;
     my $html=&Apache::lonxml::xmlbegin();      my $start_page=
     my $bodytag=&Apache::loncommon::bodytag($bodytitle,$function,$loaditems);   &Apache::loncommon::start_page($bodytitle,
          '<script type="text/javascript">'.
          $jscript.'</script>',
          {'function'    => $function,
    'add_entries' => $loaditems,});
     my $output = <<"END";      my $output = <<"END";
 $html  $start_page
 <head>  <form method="POST" name="$state">
 <title>$title</title>  
 <script type="text/javascript">  
 $jscript  
 </script>  
 </head>  
 $bodytag  
 <form method="post" name="$state">  
   
 END  END
     if ($action eq 'create' || $action eq 'modify') {      if ($action eq 'create' || $action eq 'modify') {
Line 809  END Line 980  END
   
 sub onload_action {  sub onload_action {
     my ($action,$state) = @_;      my ($action,$state) = @_;
     my $loaditems;      my %loaditems;
     if ((defined($env{'form.origin'})) && ($action eq 'create') &&      if ((defined($env{'form.origin'})) && ($action eq 'create') &&
                 ($state eq 'pick_name' || $state eq 'pick_members' ||                   ($state eq 'pick_name' || $state eq 'pick_members' || 
                  $state eq 'pick_privs')) {                   $state eq 'pick_privs')) {
         unless ($env{'form.origin'} eq '') {          unless ($env{'form.origin'} eq '') {
             $loaditems =       $loaditems{'onload'} = 
              'onload="javascript:setFormElements(document.'.$state.')"';   'javascript:setFormElements(document.'.$state.')';
         }          }
     }      }
     if (($action eq 'modify') &&      if (($action eq 'modify') &&
                 ($state eq 'change_settings' || $state eq 'change_members' ||                  ($state eq 'change_settings' || $state eq 'change_members' ||
                  $state eq 'change_privs') || $state eq 'add_members') {                   $state eq 'change_privs' || $state eq 'add_members' ||
             $loaditems =                   $state eq 'pick_members')) {
              'onload="javascript:setFormElements(document.'.$state.')"';   $loaditems{'onload'} = 
       'javascript:setFormElements(document.'.$state.')';
     }      }
     return $loaditems;      return \%loaditems;
 }  }
   
 sub footer {  sub footer {
       my $end_page = &Apache::loncommon::end_page();
        return(<<ENDFOOT);         return(<<ENDFOOT);
      <input type="hidden" name="sortby" value="$env{'form.sortby'}" />
   </form>    </form>
  </body>  $end_page
 </html>  
 ENDFOOT  ENDFOOT
 }  }
   
Line 870  sub group_members { Line 1043  sub group_members {
     foreach my $member (keys %memberhash) {      foreach my $member (keys %memberhash) {
         $totalmembers ++;          $totalmembers ++;
         my ($end,$start) = split(/:/,$memberhash{$member});          my ($end,$start) = split(/:/,$memberhash{$member});
         if (($end!=0) && ($end<$now)) {          unless ($start == -1) {
             $previous ++;              if (($end!=0) && ($end<$now)) {
         } elsif (($start!=0) && ($start>$now)) {                  $previous ++;
             $future ++;              } elsif (($start!=0) && ($start>$now)) {
         } else {                  $future ++;
             $active ++;              } else {
                  $active ++;
               }
         }          }
     }      }
     if ($totalmembers == 0) {      if ($totalmembers == 0) {
Line 982  END Line 1157  END
     }      }
     my @allfunctions = sort(keys (%{$functions}));      my @allfunctions = sort(keys (%{$functions}));
     for (my $i=0; $i<$halfnum; $i++) {      for (my $i=0; $i<$halfnum; $i++) {
         $r->print('<td><input type="checkbox" name="tool" value="'.          $r->print('<td><label><input type="checkbox" name="tool" value="'.
                   $allfunctions[$i].'" />&nbsp;'.                    $allfunctions[$i].'" />&nbsp;'.
                    $$functions{$allfunctions[$i]}.'</td>                     $$functions{$allfunctions[$i]}.'</label></td>
                    <td>&nbsp;</td><td>&nbsp;</td>');                     <td>&nbsp;</td><td>&nbsp;</td>');
     }      }
     $r->print('<td><input type="button" value="check all" '.      $r->print('<td><input type="button" value="check all" '.
               'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'.                'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'.
               '</td></tr><tr><td>&nbsp;</td>');                '</td></tr><tr><td>&nbsp;</td>');
     for (my $j=$halfnum; $j<@allfunctions; $j++) {      for (my $j=$halfnum; $j<@allfunctions; $j++) {
         $r->print('<td><input type="checkbox" name="tool" value="'.          $r->print('<td><label><input type="checkbox" name="tool" value="'.
                   $allfunctions[$j].'" />&nbsp;'.                    $allfunctions[$j].'" />&nbsp;'.
                   $$functions{$allfunctions[$j]}.'</td>                    $$functions{$allfunctions[$j]}.'</label></td>
                   <td>&nbsp;</td><td>&nbsp;</td>');                    <td>&nbsp;</td><td>&nbsp;</td>');
     }      }
     if ($remnum) {      if ($remnum) {
Line 1007  END Line 1182  END
       </tr>        </tr>
       <tr>        <tr>
        <td><b>Granularity:</b></td>         <td><b>Granularity:</b></td>
        <td colspan="9">'.$lt{'doyo'}.'&nbsp;<input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'&nbsp;<input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No'));         <td colspan="9">'.$lt{'doyo'}.'&nbsp;<label><input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'</label>&nbsp;<label><input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No').'</label>');
     if ($action eq 'modify') {      if ($action eq 'modify') {
         $r->print('&nbsp;&nbsp;('.&mt('Currently set to "[_1]"',          $r->print('&nbsp;&nbsp;('.&mt('Currently set to "[_1]"',
                                       $$stored{'granularity'}).')');                                        $$stored{'granularity'}).')');
Line 1030  sub membership_options { Line 1205  sub membership_options {
                 'picr' => 'Pick the criteria to use to build a list of '.                  'picr' => 'Pick the criteria to use to build a list of '.
                           'course users from which you will select ',                            'course users from which you will select ',
                 'meof' => 'members of the new group.',                  'meof' => 'members of the new group.',
                 'adme' => 'additional members of the group.',                  'admg' => 'additional members of the group.',
                 'ifno' => 'If you do not wish to add members when you first '.                  'ifno' => 'If you do not wish to add members when you first '.
                           'create the group, do not make any selections',                              'create the group, do not make any selections',  
                 'acty' => 'Access types',                  'acty' => 'Access types',
Line 1042  sub membership_options { Line 1217  sub membership_options {
                    previous => &mt('Previously had access'),                     previous => &mt('Previously had access'),
                    future => &mt('Will have future access'),                     future => &mt('Will have future access'),
                    );                     );
                                                                                    
     my @roles = ('st','cc','in','ta','ep','cr');      my @roles = ('st','cc','in','ta','ep','cr');
   
     my @sections = keys(%{$sectioncount});      my @sections = keys(%{$sectioncount});
Line 1056  sub membership_options { Line 1231  sub membership_options {
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print($lt{'meof'}.'<br />'.$lt{'ifno'});          $r->print($lt{'meof'}.'<br />'.$lt{'ifno'});
     } else {      } else {
         $r->print($lt{'adme'});          $r->print($lt{'admg'});
     }      }
     $r->print('      $r->print('
      <br />       <br />
Line 1078  sub membership_options { Line 1253  sub membership_options {
     $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));      $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));
     if (@sections > 0) {      if (@sections > 0) {
         @sections = sort {$a cmp $b} @sections;          @sections = sort {$a cmp $b} @sections;
         unshift(@sections,'_all'); # Put 'all' at the front of the list          unshift(@sections,'all'); # Put 'all' at the front of the list
         unshift(@sections,'_nosec'); # Put 'no sections' next          unshift(@sections,'none'); # Put 'no sections' next
         $r->print('<td>&nbsp;</td>          $r->print('<td>&nbsp;</td>
                    <td colspan="3" align="center" valign="top">'.                     <td colspan="3" align="center" valign="top">'.
         &sections_selection(\@sections,'sectionpick').'</td>');          &sections_selection(\@sections,'sectionpick').'</td>');
Line 1100  sub sections_selection { Line 1275  sub sections_selection {
         $numvisible = @{$sections};          $numvisible = @{$sections};
     }      }
     foreach my $sec (@{$sections}) {      foreach my $sec (@{$sections}) {
         if ($sec eq '_all') {          if ($sec eq 'all') {
             $section_sel .= '  <option value="'.$sec.'" />all sections'."\n";              $section_sel .= '  <option value="'.$sec.'" />all sections'."\n";
         } elsif ($sec eq '_nosec') {          } elsif ($sec eq 'none') {
             $section_sel .= '  <option value="'.$sec.'" />no section'."\n";               $section_sel .= '  <option value="'.$sec.'" />no section'."\n"; 
         } else {          } else {
             $section_sel .= '  <option value="'.$sec.'" />'.$sec."\n";              $section_sel .= '  <option value="'.$sec.'" />'.$sec."\n";
Line 1155  sub choose_members_form { Line 1330  sub choose_members_form {
     my %origmembers;      my %origmembers;
     $r->print(&Apache::lonhtmlcommon::echo_form_input(      $r->print(&Apache::lonhtmlcommon::echo_form_input(
          ['origin','action','state','page','member','specificity','branch',           ['origin','action','state','page','member','specificity','branch',
           'defpriv','autorole','autoadd','autodrop'],            'defpriv','autorole','autoadd','autodrop','sortby','togglefunc'],
          \@regexps));           \@regexps));
     my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum);      my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum);
     $r->print('      $r->print('
Line 1189  sub choose_members_form { Line 1364  sub choose_members_form {
                                                                $groupname);                                                                 $groupname);
         foreach my $key (sort(keys(%membership))) {          foreach my $key (sort(keys(%membership))) {
             if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) {              if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) {
                 my $uname = $1;                  my ($end,$start,@userprivs) = split(/:/,$membership{$key});
                 my $udom = $2;                  unless ($start == -1) {  
                 my $user = $uname.':'.$udom;                      my $uname = $1;
                 $origmembers{$user} = 1;                       my $udom = $2;
                       my $user = $uname.':'.$udom;
                       $origmembers{$user} = 1; 
                   }
             }              }
         }          }
     }      }
Line 1442  sub pick_new_members { Line 1620  sub pick_new_members {
             if ($granularity eq 'Yes') {              if ($granularity eq 'Yes') {
                 $r->print('<tr bgcolor="#cccccc">                  $r->print('<tr bgcolor="#cccccc">
  <td colspan="5">&nbsp;</td>   <td colspan="5">&nbsp;</td>
  <td align="center"><small><nobr><b>All:</b>&nbsp;');   <td align="center"><small><nobr><b>'.&mt('All:').'</b>&nbsp;');
                 foreach my $tool (@{$available}) {                  foreach my $tool (@{$available}) {
                     $r->print('<input type="checkbox" name="togglefunc" '.                      $r->print('<label><input type="checkbox" name="togglefunc" '.
    'onclick="javascript:toggleTools(document.'.$formname.'.user_'.$tool.',this);">'.     'onclick="javascript:toggleTools(document.'.$formname.'.user_'.$tool.',this);"'.
    '<b>'.$tool.'</b>&nbsp;&nbsp;&nbsp;');     ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');
                 }                  }
                 $r->print('</nobr></small></td></tr>');                  $r->print('</nobr></small></td></tr>');
             }              }
Line 1596  sub privilege_specificity { Line 1774  sub privilege_specificity {
         }          }
         if ($totaloptionalprivs) {          if ($totaloptionalprivs) {
             $r->print('              $r->print('
 <br /><br /><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr><br/>  <br /><br /><label><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr></label><br/>
 <nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr>  <label><nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr></label>
   </td>    </td>
  </tr>   </tr>
  <tr>   <tr>
Line 1719  sub default_privileges { Line 1897  sub default_privileges {
                     $dynamic .= '</tr>                      $dynamic .= '</tr>
                                  <tr bgcolor="'.$rowColor1.'">'."\n";                                   <tr bgcolor="'.$rowColor1.'">'."\n";
                 }                  }
                 $dynamic .= '<td><input type="checkbox" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'</td>'."\n";                  $dynamic .= '<td><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'</label></td>'."\n";
             }              }
         }          }
         if ($dynamic eq '') {          if ($dynamic eq '') {
Line 1824  sub change_members_form { Line 2002  sub change_members_form {
                                         );                                          );
     my @regexps = ('user_','userpriv_');      my @regexps = ('user_','userpriv_');
     $r->print(&Apache::lonhtmlcommon::echo_form_input(      $r->print(&Apache::lonhtmlcommon::echo_form_input(
                          ['origin','action','state','page','expire','delete',                           ['origin','action','state','page','expire','deletion',
                           'changefunc','changepriv'],\@regexps));                            'reenable','activate','changepriv','sortby',
                             'togglefunc'],\@regexps));
     my $rowimg = 1;      my $rowimg = 1;
     my @available = ();      my @available = ();
     my @unavailable = ();      my @unavailable = ();
Line 1869  sub current_membership { Line 2048  sub current_membership {
     my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,      my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                                    $groupname);                                                                     $groupname);
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                             'actn' => 'Action?',
                                             'name' => 'Name',
                                             'usnm' => 'Username',
                                             'doma' => 'Domain',
                                             'stda' => 'Start Date',
                                             'enda' => 'End Date',
                                           'expi' => 'Expire',                                            'expi' => 'Expire',
                                           'reen' => 'Re-enable',                                            'reen' => 'Re-enable',
                                           'acti' => 'Activate',                                            'acti' => 'Activate',
                                           'dele' => 'Delete',                                            'dele' => 'Delete',
                                           'curf' => 'Current Functionality',                                            'curf' => 'Current Functionality',
                                           'chfn' => 'Change Functions',  
                                           'chpr' => 'Change Privileges'                                             'chpr' => 'Change Privileges' 
                                         );                                          );
     if (keys(%membership) > 0) {      if (keys(%membership) > 0) {
Line 1976  sub current_membership { Line 2160  sub current_membership {
             if ($num_activate) {              if ($num_activate) {
                 &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});                  &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
             }              }
             &check_uncheck_buttons($r,$formname,'delete',$lt{'dele'});              &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
             if (@{$available} > 0) {              if (@{$available} > 0) {
                 if ($granularity eq 'Yes') {  
                     &check_uncheck_buttons($r,$formname,'changefunc',$lt{'chfn'});  
                 }  
                 if ($specificity eq 'Yes') {                  if ($specificity eq 'Yes') {
                     &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});                      &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
                 }                  }
Line 2018  END Line 2199  END
             $r->print(<<"END");              $r->print(<<"END");
    <table border="0" cellpadding="4" cellspacing="1">     <table border="0" cellpadding="4" cellspacing="1">
     <tr bgcolor="$tabcol" align="center">      <tr bgcolor="$tabcol" align="center">
      <td><b>Action?</b></td>       <td><b>$lt{'actn'}</b></td>
      <td><b><a href="javascript:changeSort('fullname')">Name</a></b></td>       <td><b><a href="javascript:changeSort('fullname')">$lt{'name'}</a></b></td>
      <td><b><a href="javascript:changeSort('username')">Username</a></b>       <td><b><a href="javascript:changeSort('username')">$lt{'usnm'}</a></b>
      </td>       </td>
      <td><b><a href="javascript:changeSort('domain')">Domain</a></b></td>       <td><b><a href="javascript:changeSort('domain')">$lt{'doma'}</a></b></td>
      <td><b><a href="javascript:changeSort('id')">ID</a></b></td>       <td><b><a href="javascript:changeSort('id')">ID</a></b></td>
      <td><b><a href="javascript:changeSort('start')">Start Date</a></b></td>       <td><b><a href="javascript:changeSort('start')">$lt{'stda'}</a></b></td>
      <td><b><a href="javascript:changeSort('end')">End Date</a></b></td>       <td><b><a href="javascript:changeSort('end')">$lt{'enda'}</a></b></td>
 END  END
               my $colspan = 0;
             if ($hastools) {              if ($hastools) {
                 $r->print('<td><b>'.$lt{'curf'}.'</b></td>');                  $r->print('<td><b>'.$lt{'curf'}.'</b></td>');
                   $colspan ++;  
             }              }
             if ($addtools) {              if ($addtools) {
                 $r->print('<td><b>Additional Functionality</b></td>');                  $r->print('<td><b>Additional Functionality</b></td>');
                   $colspan ++;
             }              }
             $r->print('</tr>');              $r->print('</tr>');
               if ($colspan) {
                   if ($granularity eq 'Yes') {
                       $r->print('<tr bgcolor="#cccccc">
    <td colspan="7">&nbsp;</td>
    <td colspan="'.$colspan.'" align="center"><small><nobr><b>'.&mt('All:').
     '</b>&nbsp;');
                       foreach my $tool (@{$available}) {
                           $r->print('<label><input type="checkbox" name="togglefunc"'.
      ' onclick="javascript:toggleTools(document.'.$formname.'.user_'.$tool.',this);"'.
      ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');
                       }
                       $r->print('</nobr></small></td></tr>');
                   }
               }
             my %Sortby = ();              my %Sortby = ();
             foreach my $user (sort(keys(%current))) {              foreach my $user (sort(keys(%current))) {
                 if ($env{'form.sortby'} eq 'fullname') {                  if ($env{'form.sortby'} eq 'fullname') {
Line 2066  END Line 2264  END
                     $r->print('<tr bgcolor="'.$rowColor.'">                      $r->print('<tr bgcolor="'.$rowColor.'">
                                 <td><small>');                                  <td><small>');
                     if ($current{$user}{changestate} eq 'reenable') {                      if ($current{$user}{changestate} eq 'reenable') {
                         $r->print('<nobr>'.                           $r->print('<nobr><label>'. 
    '<input type="checkbox" name="reenable" value="'.$user.'" />'.     '<input type="checkbox" name="reenable" value="'.$user.'" />'.
    $lt{'reen'}.'</nobr><br />');     $lt{'reen'}.'</label></nobr><br />');
                     } elsif ($current{$user}{changestate} eq 'expire') {                      } elsif ($current{$user}{changestate} eq 'expire') {
                         $r->print('<nobr>'.                          $r->print('<nobr><label>'.
    '<input type="checkbox" name="expire" value="'.$user.'" />'.     '<input type="checkbox" name="expire" value="'.$user.'" />'.
    $lt{'expi'}.'</nobr><br />');     $lt{'expi'}.'</label></nobr><br />');
                     } elsif ($current{$user}{changestate} eq 'activate') {                      } elsif ($current{$user}{changestate} eq 'activate') {
                         $r->print('<nobr>'.                          $r->print('<nobr><label>'.
    '<input type="checkbox" name="activate" value="'.$user.'" />'.     '<input type="checkbox" name="activate" value="'.$user.'" />'.
    $lt{'acti'}.'</nobr><br />');     $lt{'acti'}.'</label></nobr><br />');
                     }  
                     $r->print('<nobr>'.  
    '<input type="checkbox" name="delete" value="'.$user.'" />'.  
    $lt{'dele'}.'</nobr>');  
                     if ($granularity eq 'Yes') {  
                         $r->print('<br /><nobr>'.  
    '<input type="checkbox" name="changefunc" value="'.$user.'" />'.$lt{'chfn'}.  
    '</nobr>');  
                     }                      }
                       $r->print('<nobr><label>'.
      '<input type="checkbox" name="deletion" value="'.$user.'" />'.
      $lt{'dele'}.'</label></nobr>');
                     if ($specificity eq 'Yes') {                      if ($specificity eq 'Yes') {
                         $r->print('<br /><nobr>'.                          $r->print('<br /><nobr><label>'.
    '<input type="checkbox" name="changepriv" value="'.$user.'" />'.$lt{'chpr'}.     '<input type="checkbox" name="changepriv" value="'.$user.'" />'.$lt{'chpr'}.
    '</nobr>');     '</label></nobr>');
                     }                      }
                     $r->print('                      $r->print('
    </td>     </td>
Line 2098  END Line 2291  END
     $udom.'</small></td><td><small>'.$id.'</small></td><td><small>'.$start.      $udom.'</small></td><td><small>'.$id.'</small></td><td><small>'.$start.
     '</small></td><td><small>'.$end.'</small></td>');      '</small></td><td><small>'.$end.'</small></td>');
                     if ($hastools) {                      if ($hastools) {
                         $r->print('<td align="left"><small><nobr>');                          $r->print('<td align="left"><small><nobr>'.
                                     '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
                         foreach my $tool (@{$current{$user}{currtools}}) {                          foreach my $tool (@{$current{$user}{currtools}}) {
                             if ($granularity eq 'Yes') {                              if ($granularity eq 'Yes') {
                                 $r->print('<input type="checkbox"                                   $r->print('<label><input type="checkbox" '. 
                                        checked="checked"                                           'checked="checked" '. 
                                        name="user_'.$tool.'" value="'.                                         'name="user_'.$tool.'" value="'.
                                        $user.'" />');                                         $user.'" />'.$tool.'</label>');
                              } else {                               } else {
                                $r->print('<input type="hidden"                                 $r->print('<input type="hidden" '.
                                        checked="checked"                                         'checked="checked" '.
                                        name="user_'.$tool.'" value="'.                                         'name="user_'.$tool.'" value="'.
                                        $user.'" />');                                         $user.'" />'.$tool);
                              }                               }
                              $r->print($tool.'&nbsp;&nbsp;&nbsp;');                               $r->print('&nbsp;&nbsp;&nbsp;');
                         }                          }
                         $r->print('</nobr></small></td>');                          $r->print('</nobr></small></td>');
                     }                      }
Line 2119  END Line 2313  END
                         $r->print('<td align="left"><small>');                          $r->print('<td align="left"><small>');
                         if ($granularity eq 'Yes') {                          if ($granularity eq 'Yes') {
                             foreach my $tool (@{$current{$user}{newtools}}) {                              foreach my $tool (@{$current{$user}{newtools}}) {
                                 $r->print('<nobr><input type="checkbox"                                    $r->print('<nobr><label><input type="checkbox"
                                           name="user_'.$tool.'" value="'.                                            name="user_'.$tool.'" value="'.
                                           $user.'" />'.$tool.                                            $user.'" />'.$tool.
                                                   '</nobr>&nbsp;&nbsp;&nbsp;');                                            '</label></nobr>&nbsp;&nbsp;&nbsp;');
                             }                              }
                         } else {                          } else {
                             foreach my $tool (@{$current{$user}{newtools}}) {                              foreach my $tool (@{$current{$user}{newtools}}) {
Line 2173  sub change_privs_form { Line 2367  sub change_privs_form {
        $rowColor2) = @_;         $rowColor2) = @_;
     my @regexps = ('userpriv_');      my @regexps = ('userpriv_');
     my $nexttext;      my $nexttext;
                                                                                             my %lt = &Apache::lonlocal::texthash(
                  'tode' => 'To be deleted',
                  'toex' => 'To be expired',
                  'nome' => 'No members to be deleted or expired from the group.',
       );
     $r->print(&Apache::lonhtmlcommon::echo_form_input(      $r->print(&Apache::lonhtmlcommon::echo_form_input(
          ['origin','action','state','page'],\@regexps));           ['origin','action','state','page','sortby'],\@regexps));
     $nexttext = $$navbuttons{'adme'};      if ($env{'form.branch'} eq 'adds') {
                                                                                                 $nexttext = $$navbuttons{'adme'};
       } else {
           $nexttext = $$navbuttons{'mose'};
       }
     $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');      $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');
       &topic_bar($r,$tabcol,3,&mt('Members to delete or expire'));
       my $exp_or_del = 0;
       if (ref($$memchg{'deletion'}) eq 'ARRAY') {
           if (@{$$memchg{'deletion'}} > 0) {
               $r->print('<tr><td>&nbsp;</td><td colspan="3"><b>'.$lt{'tode'}.':</b><br /><ul>');
               foreach my $user (@{$$memchg{'deletion'}}) {
                   $r->print('<li>'.$$userdata{$user}[$$idx{fullname}].
                             '&nbsp;('.$user.')</li>');
               }
               $r->print('</ul></td><tr><td colspan="4">&nbsp;</td></tr>');
               $exp_or_del += @{$$memchg{'deletion'}};
           }
       }
       if (ref($$memchg{'expire'}) eq 'ARRAY') {
           if (@{$$memchg{'expire'}} > 0) {
               $r->print('<tr><td>&nbsp;</td><td colspan="3"><b>'.$lt{'toex'}.':</b><br /><ul>');
               foreach my $user (@{$$memchg{'expire'}}) {
                   $r->print('<li>'.$$userdata{$user}[$$idx{fullname}].
                             '&nbsp;('.$user.')</li>');
               }
               $r->print('</ul></td><tr><td colspan="4">&nbsp;</td></tr>');
               $exp_or_del += @{$$memchg{'expire'}};
           }
       }
       if (!$exp_or_del) {
           $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'nome'}.
                     '</td></tr><tr><td colspan="4">&nbsp;</td></tr>');
       }
           
     &topic_bar($r,$tabcol,3,&mt('Group member privileges'));      &topic_bar($r,$tabcol,4,&mt('Group member privileges'));
                                                                                         
     &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs,      my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools,
                             $fixedprivs,$userdata,$usertools,$idx,$memchg,                                            $toolprivs,$fixedprivs,$userdata,
                             $states,$stored,$rowColor1,$rowColor2);                                            $usertools,$idx,$memchg,$states,
                                                                                                                                   $stored,$rowColor1,$rowColor2);
     $r->print('</td></tr><tr><td colspan="4">&nbsp;</td></tr>');      $r->print('</td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     my $prevtext = $$navbuttons{'gtps'};      my $prevtext = $$navbuttons{'gtps'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      if ($numchgs || $exp_or_del) {
                         $$states{$action}[$page+1],$nexttext);          &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                               $$states{$action}[$page+1],$nexttext);
       } else {
           &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
       }
     $r->print('</table>');      $r->print('</table>');
     return;      return;
 }  }
Line 2238  sub choose_privs_form { Line 2471  sub choose_privs_form {
     if ($action eq 'create') {      if ($action eq 'create') {
         push(@regexps,'sec_');          push(@regexps,'sec_');
         $r->print(&Apache::lonhtmlcommon::echo_form_input(          $r->print(&Apache::lonhtmlcommon::echo_form_input(
          ['origin','action','state','page','autoadd','autodrop'],           ['origin','action','state','page','sortby','autoadd','autodrop'],
          \@regexps));           \@regexps));
         $nexttext = $$navbuttons{'crgr'};          $nexttext = $$navbuttons{'crgr'};
     } else {      } else {
         $r->print(&Apache::lonhtmlcommon::echo_form_input(          $r->print(&Apache::lonhtmlcommon::echo_form_input(
          ['origin','action','state','page'],\@regexps));           ['origin','action','state','page','sortby'],\@regexps));
         $nexttext = $$navbuttons{'adme'};          $nexttext = $$navbuttons{'adme'};
     }      }
   
Line 2273  sub choose_privs_form { Line 2506  sub choose_privs_form {
   
 sub build_boxes {  sub build_boxes {
     my ($r,$tools,$usertools,$fixedprivs,$toolprivs,$showtools,      my ($r,$tools,$usertools,$fixedprivs,$toolprivs,$showtools,
         $showboxes,$prefix,$specificity) = @_;          $showboxes,$prefix,$specificity,$excluded) = @_;
     my $totalboxes = 0;      my $totalboxes = 0;
     if (@{$tools} > 0) {      if (@{$tools} > 0) {
         if ($specificity eq 'Yes') {          if ($specificity eq 'Yes') {
             foreach my $tool (@{$tools}) {              foreach my $tool (@{$tools}) {
                 @{$$showboxes{$tool}} = ();                  @{$$showboxes{$tool}} = ();
                 foreach my $user (sort(keys(%{$usertools}))) {                  foreach my $user (sort(keys(%{$usertools}))) {
                     unless (grep/^$tool$/,@{$showtools}) {                      if (ref($excluded) eq 'ARRAY') {
                         push(@{$showtools},$tool);                          if (grep/^$user$/,@{$excluded}) {
                               next;
                           }
                     }                      }
                     foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {                      if ($$usertools{$user}{$tool}) {
                         unless (exists($$fixedprivs{$tool}{$priv})) {                          unless (grep/^$tool$/,@{$showtools}) {
                             unless(grep(/^$priv$/,@{$$showboxes{$tool}})) {                              push(@{$showtools},$tool);
                                 push(@{$$showboxes{$tool}},$priv);                          }
                                 $totalboxes ++;                          foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
                               unless (exists($$fixedprivs{$tool}{$priv})) {
                                   unless(grep(/^$priv$/,@{$$showboxes{$tool}})) {
                                       push(@{$$showboxes{$tool}},$priv);
                                       $totalboxes ++;
                                   }
                             }                              }
                         }                          }
                     }                      }
Line 2338  sub member_privileges_form { Line 2578  sub member_privileges_form {
                       'there are no specific user privileges to set.',                        'there are no specific user privileges to set.',
             'asng' => 'As no group tools will be made available to users, '.              'asng' => 'As no group tools will be made available to users, '.
                       'there are no specific user privileges to set.',                        'there are no specific user privileges to set.',
               'nogm' => 'No group member privileges to display or set, '.
                         'as you have not indicated that you will be activating,'.
                         ' re-enabling, changing privileges, or adding/removing '.
                         'functionality for any current members ',
             'full' => 'Fullname',              'full' => 'Fullname',
             'user' => 'Username',              'user' => 'Username',
             'doma' => 'Domain',              'doma' => 'Domain',
Line 2350  sub member_privileges_form { Line 2594  sub member_privileges_form {
         }          }
         $specificity = $env{'form.specificity'};          $specificity = $env{'form.specificity'};
     } else {      } else {
         @defprivs = @{$$stored{'defpriv'}};          if (defined($$stored{'defpriv'})) {
               @defprivs = @{$$stored{'defpriv'}};
           }
         $specificity = $$stored{'specificity'};          $specificity = $$stored{'specificity'};
     }      }
     my @showtools;      my @showtools;
     my %showboxes = ();      my %showboxes = ();
     my $totalboxes = 0;  
     my $numtools = 1 + @{$tools};      my $numtools = 1 + @{$tools};
   
     $totalboxes = &build_boxes($r,$tools,$usertools,$fixedprivs,$toolprivs,      my @excluded = ();
                                \@showtools,\%showboxes,'userpriv_',      my $numchgs = 0;
                                $specificity);      if ($formname eq 'change_privs') {
           my @currmembers = ();
           if (ref($$memchg{'deletion'}) eq 'ARRAY') {
               push(@excluded,@{$$memchg{'deletion'}});
           }
           if (ref($$memchg{'expire'}) eq 'ARRAY') {
               push(@excluded,@{$$memchg{'expire'}});
           }
           if (@excluded > 0) {
               foreach my $user (sort(keys(%{$usertools}))) {
                   if (grep/^$user$/,@excluded) {
                       next;
                   }
                   push(@currmembers,$user);
               }
           } else {
               @currmembers = sort(keys(%{$usertools}));
           }
           $numchgs = @currmembers;
           if (!$numchgs) {
               $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'nogm'}); 
               return $numchgs;
           }
       }
    
       my $totalboxes = &build_boxes($r,$tools,$usertools,$fixedprivs,
                                      $toolprivs,\@showtools,\%showboxes,
                                      'userpriv_',$specificity,\@excluded);
     if (@{$tools} > 0) {      if (@{$tools} > 0) {
         if ($specificity eq 'Yes') {          if ($specificity eq 'Yes') {
             if ($totalboxes > 0) {              if ($totalboxes > 0) {
                 my $numcells = 2;                  my $numcells = 2;
                 my $colspan = $numcells + 1;                  my $colspan = $numcells + 1;
                 my %total;                  my %total;
                 $r->print('                  if (keys(%{$usertools}) > 1) {
                       $r->print('
  <tr>   <tr>
   <td>&nbsp;</td>    <td>&nbsp;</td>
   <td colspan="3">    <td colspan="3">
    <table border="0" cellspacing="2" cellpadding="2" border="0">     <table border="0" cellspacing="2" cellpadding="2" border="0">
     <tr>      <tr>
 ');  ');
                 foreach my $tool (@{$tools}) {                      foreach my $tool (@{$tools}) {
                     if (@{$showboxes{$tool}} > 0) {                          if (@{$showboxes{$tool}} > 0) {
                         $r->print('<td valign="top">');                              $r->print('<td valign="top">');
                         $r->print('<table class="thinborder"><tr bgcolor="'.$tabcol.                              $r->print('<table class="thinborder"><tr bgcolor="'.
                       '"><th colspan="'.$colspan.'">'.$tool.'</th></tr><tr>');                                        $tabcol.'"><th colspan="'.$colspan.'">'.
                         my $privcount = 0;                                        $tool.'</th></tr><tr>');
                         foreach my $priv (@{$showboxes{$tool}}) {                              my $privcount = 0;
                             $privcount ++;                              foreach my $priv (@{$showboxes{$tool}}) {
                             if (($privcount == @{$showboxes{$tool}}) && ($privcount > 1)) {                                  $privcount ++;
                                 if ($privcount%$numcells) {                                  if (($privcount == @{$showboxes{$tool}}) && 
                                     $r->print('<td colspan="'.$colspan.'">');                                      ($privcount > 1)) {
                                       if ($privcount%$numcells) {
                                           $r->print('<td colspan="'.$colspan.'">');
                                       } else {
                                           $r->print('<td>');
                                       }
                                 } else {                                  } else {
                                     $r->print('<td>');                                      $r->print('<td>');
                                 }                                  }
                             } else {                                  $r->print(qq|
                                 $r->print('<td>');  
                             }  
                             $r->print(qq|  
        <fieldset><legend><b>$$toolprivs{$tool}{$priv}</b></legend>         <fieldset><legend><b>$$toolprivs{$tool}{$priv}</b></legend>
        <nobr>         <nobr>
        <input type="button" value="check all"         <input type="button" value="check all"
Line 2400  sub member_privileges_form { Line 2675  sub member_privileges_form {
        <input type="button" value="uncheck all"         <input type="button" value="uncheck all"
         onclick="javascript:uncheckAll(document.$formname.userpriv_$priv)" />          onclick="javascript:uncheckAll(document.$formname.userpriv_$priv)" />
       </nobr></fieldset><br />|);        </nobr></fieldset><br />|);
                             $r->print('</td>');                                  $r->print('</td>');
                             if ($privcount < @{$showboxes{$tool}}) {                                  if ($privcount < @{$showboxes{$tool}}) {
                                 if (@{$showboxes{$tool}} > 2) {                                      if (@{$showboxes{$tool}} > 2) {
                                     if ($privcount%$numcells == 0) {                                          if ($privcount%$numcells == 0) {
                                         $r->print('</tr><tr>');                                              $r->print('</tr><tr>');
                                           }
                                       } else {
                                           $r->print('<tr></tr>');
                                     }                                      }
                                 } else {  
                                     $r->print('<tr></tr>');  
                                 }                                  }
                             }                              }
                               $r->print('</tr></table></td><td>&nbsp;</td>');
                         }                          }
                         $r->print('</tr></table></td><td>&nbsp;</td>');  
                     }                      }
                       $r->print('</tr></table></td></tr>');
                       $r->print('<tr><td colspan="4">&nbsp;</td></tr>');
                 }                  }
                 $r->print('</tr></table></td></tr>');                  $r->print('<tr><td>&nbsp;</td><td colspan="3">');
                 $r->print('<tr><td colspan="4">&nbsp;</td></tr><tr><td>&nbsp;</td><td colspan="3">');  
                 $r->print(&Apache::lonhtmlcommon::start_pick_box());                  $r->print(&Apache::lonhtmlcommon::start_pick_box());
                 $r->print(<<"END");                  $r->print(<<"END");
    <tr bgcolor="$tabcol">     <tr bgcolor="$tabcol">
Line 2427  sub member_privileges_form { Line 2704  sub member_privileges_form {
 END  END
                 &member_privs_entries($r,$tabcol,$rowColor1,$rowColor2,                  &member_privs_entries($r,$tabcol,$rowColor1,$rowColor2,
                                       $usertools,$toolprivs,$fixedprivs,                                        $usertools,$toolprivs,$fixedprivs,
                                       $userdata,$idx,\@showtools,\@defprivs);                                        $userdata,$idx,\@showtools,\@defprivs,
                                         \@excluded);
                 $r->print('</td>');                  $r->print('</td>');
                 $r->print(&Apache::lonhtmlcommon::end_pick_box());                  $r->print(&Apache::lonhtmlcommon::end_pick_box());
                 $r->print('</td></tr>                  $r->print('</td></tr>
Line 2440  END Line 2718  END
                           '<br />');                            '<br />');
                 &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,                  &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,
                             $toolprivs,\@defprivs);                              $toolprivs,\@defprivs);
                                                                                         
             }              }
         } else {          } else {
             if (keys(%{$usertools}) > 0) {              if (keys(%{$usertools}) > 0) {
Line 2456  END Line 2733  END
     } else {      } else {
         $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'asng'});          $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'asng'});
     }      }
     return;      return $numchgs;
 }  }
   
 sub process_request {  sub process_request {
Line 2466  sub process_request { Line 2743  sub process_request {
         $sectioncount,$stored,$rowColor1,$rowColor2) = @_;          $sectioncount,$stored,$rowColor1,$rowColor2) = @_;
   
     $r->print(&Apache::lonhtmlcommon::echo_form_input(      $r->print(&Apache::lonhtmlcommon::echo_form_input(
                                         ['origin','action','state','page']));                                   ['origin','action','state','page','sortby']));
   
     my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum);      my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum);
     if ($earlyout) {      if ($earlyout) {
Line 2503  sub process_request { Line 2780  sub process_request {
             @defprivs = @temp;               @defprivs = @temp; 
         }          }
     } else {      } else {
         @defprivs = @{$$stored{'defpriv'}};          if (defined($$stored{'defpriv'})) {
               @defprivs = @{$$stored{'defpriv'}};
           }
     }      }
   
     my $outcome;      my $outcome;
Line 2516  sub process_request { Line 2795  sub process_request {
     }      }
     if (($action eq 'create' && $outcome eq 'ok') || (($action eq 'modify') &&       if (($action eq 'create' && $outcome eq 'ok') || (($action eq 'modify') && 
        (($state eq 'memresult') || ($state eq 'addresult')))) {         (($state eq 'memresult') || ($state eq 'addresult')))) {
         &process_membership($r,$cdom,$cnum,$groupname,$tools,$enddate,          &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,
                             $startdate,$userdata,$idx,$toolprivs,$usertools,                              $enddate,$startdate,$userdata,$idx,$toolprivs,
                             $specificity,\@defprivs);                              $usertools,$specificity,\@defprivs,$memchg);
     }      }
     return;      return;
 }  }
Line 2539  sub write_group_data { Line 2818  sub write_group_data {
                              'creation','modified','creator','granularity',                               'creation','modified','creator','granularity',
                              'specificity','autoadd','autodrop');                               'specificity','autoadd','autodrop');
     my @mult_attributes = ('roles','types','sectionpick','defpriv');      my @mult_attributes = ('roles','types','sectionpick','defpriv');
                                                                                       
     my %groupinfo = (      my %groupinfo = (
                      description => $esc_description,                       description => $esc_description,
                      startdate => $startdate,                       startdate => $startdate,
Line 2578  sub write_group_data { Line 2857  sub write_group_data {
     }      }
     my $autosec;      my $autosec;
     my @autorole = &Apache::loncommon::get_env_multiple('form.autorole');      my @autorole = &Apache::loncommon::get_env_multiple('form.autorole');
                                                                                       
     foreach my $role (@autorole) {      foreach my $role (@autorole) {
         if (defined($env{'form.sec_'.$role})) {          if (defined($env{'form.sec_'.$role})) {
             my @autosections=&Apache::loncommon::get_env_multiple('form.sec_'.              my @autosections=&Apache::loncommon::get_env_multiple('form.sec_'.
                                                                   $role);                                                                    $role);
             if (grep/^_all$/,@autosections) {  
                 @autosections = sort {$a cmp $b} keys(%{$sectioncount});  
             }  
             $autosec .= '<role id="'.$role.'">';              $autosec .= '<role id="'.$role.'">';
             foreach my $sec (@autosections) {              foreach my $sec (@autosections) {
                 $autosec .= '<section>'.$sec.'</section>';                  $autosec .= '<section>'.$sec.'</section>';
Line 2621  sub write_group_data { Line 2897  sub write_group_data {
 }  }
   
 sub process_membership {  sub process_membership {
     my ($r,$cdom,$cnum,$groupname,$tools,$enddate,$startdate,$userdata,$idx,      my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
         $toolprivs,$usertools,$specificity,$defprivs) = @_;          $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg)=@_;
     my %usersettings = ();      my %usersettings = ();
     my @added= ();      my %added= ();
     my @failed = ();      my %failed = ();
       my $num_ok = 0;
       my $num_fail = 0;
     my %group_privs = ();      my %group_privs = ();
     my %tooltype = ();      my %tooltype = ();
   
Line 2637  sub process_membership { Line 2915  sub process_membership {
                   &Apache::loncommon::get_env_multiple('form.userpriv_'.$priv);                    &Apache::loncommon::get_env_multiple('form.userpriv_'.$priv);
                 foreach my $user (@users) {                  foreach my $user (@users) {
                     $group_privs{$user} .= $priv.':';                      $group_privs{$user} .= $priv.':';
                       if ($state eq 'memresult') { 
                           unless (exists($$usertools{$user}{$tool})) {
                               $$usertools{$user}{$tool} = 1;
                           }
                       }
                 }                  }
             } else {              } else {
                 if (@{$defprivs} > 0) {                  if (@{$defprivs} > 0) {
Line 2655  sub process_membership { Line 2938  sub process_membership {
         $group_privs{$user} =~ s/:$//;          $group_privs{$user} =~ s/:$//;
     }      }
   
       my $now = time;
       my @activate = ();
       my @expire = ();
       my @deletion = ();
       my @reenable = ();
       if ($state eq 'memresult') {
           if (ref($$memchg{'activate'}) eq 'ARRAY') {
               @activate = @{$$memchg{'activate'}};
           }
           if (ref($$memchg{'expire'}) eq 'ARRAY') {
               @expire = @{$$memchg{'expire'}};
           }
           if (ref($$memchg{'deletion'}) eq 'ARRAY') {
               @deletion = @{$$memchg{'deletion'}};
           }
           if (ref($$memchg{'reenable'}) eq 'ARRAY') {
               @reenable = @{$$memchg{'reenable'}};
           }
           if (@expire + @deletion > 0) {
               my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                                      $groupname);
               foreach my $user (@expire) {
                   my ($currend,$currstart,@userprivs) = 
                                     split(/:/,$membership{$groupname.':'.$user});
                   $group_privs{$user} = join(':',@userprivs); 
                   if ($currstart > $now) {
                       $currstart = $now;
                   }
                   $usersettings{$groupname.':'.$user} = $now.':'.$currstart.':'.
                                                         $group_privs{$user};
                   if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
                                                          $user,$now,$currstart,
                                                          $group_privs{$user}) eq 'ok') {
                       push(@{$added{'expired'}},$user);
                       $num_ok ++;
                   } else {
                       push(@{$failed{'expired'}},$user);
                       $num_fail ++;
                   }
               }
               foreach my $user (@deletion) {
                   $usersettings{$groupname.':'.$user} = $now.':-1:';
                   if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
                                                          $user,$now,'-1','')
                                                            eq 'ok') {
                       push(@{$added{'deleted'}},$user);
                       $num_ok ++;
                   } else {
                       push(@{$failed{'deleted'}},$user);
                       $num_fail ++;
                   }
               }
           }
       }
   
     foreach my $user (sort(keys(%{$usertools}))) {      foreach my $user (sort(keys(%{$usertools}))) {
         $usersettings{$groupname.':'.$user} = $enddate.':'.$startdate.':'.          my $type;
           my $start = $startdate;
           my $end = $enddate;
           if ($state eq 'memresult') {
               $type = 'modified';
               if (@activate > 0) {
                   if (grep/^$user$/,@activate) {
                       $start = $now;
                       $type = 'activated';
                   }
               }
               if (@reenable > 0) {
                   if (grep/^$user$/,@reenable) {
                       $type = 'reenabled';
                   }
               }
           } else {
               $type = 'added';
           }
           $usersettings{$groupname.':'.$user} = $end.':'.$start.':'.
                                               $group_privs{$user};                                                $group_privs{$user};
         if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,          if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
                                                 $user,$enddate,$startdate,                                                  $user,$end,$start,
                                                 $group_privs{$user}) eq 'ok') {                                                  $group_privs{$user}) eq 'ok') {
             push(@added,$user);              push(@{$added{$type}},$user);
               $num_ok ++;
         } else {          } else {
             push(@failed,$user);              push(@{$failed{$type}},$user);
               $num_fail ++;
         }          }
     }      }
     my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,      my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,
                                                        $cnum,\%usersettings);                                                         $cnum,\%usersettings);
     if (@added > 0) {      if ($num_ok) {
         $r->print('Users were added with following privileges:<br />');          foreach my $type (sort(keys(%added))) { 
         foreach my $user (@added) {              $r->print(&mt('The following users were successfully [_1]',$type));
             my @privs = split(/:/,$group_privs{$user});              if (!($type eq 'deleted' ||  $type eq 'expired')) {   
             my $privlist= '';                  $r->print(&mt(' with the following privileges'));
             my $curr_tool = '';              }
             foreach my $priv (@privs) {              $r->print(':<br />');
                 unless ($curr_tool eq $tooltype{$priv}) {              foreach my $user (@{$added{$type}}) {
                     $curr_tool = $tooltype{$priv};                  my $privlist = '';
                     $privlist .= '<b>'.$curr_tool.'</b>: ';                  if (!($type eq 'deleted' ||  $type eq 'expired')) {
                 }                      $privlist = ': ';
                 $privlist .= $$toolprivs{$curr_tool}{$priv}.', ';                      my @privs = split(/:/,$group_privs{$user});
             }                      my $curr_tool = '';
             $privlist =~ s/, $//;                      foreach my $priv (@privs) {
             $r->print($$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.': '.$privlist.'<br />');                          unless ($curr_tool eq $tooltype{$priv}) {
         }                              $curr_tool = $tooltype{$priv};
     }                              $privlist .= '<b>'.$curr_tool.'</b>: ';
     if (@failed > 0) {                          }
         $r->print('Addition of the following users was unsuccessful:<br />');                          $privlist .= $$toolprivs{$curr_tool}{$priv}.', ';
         foreach my $user (@failed) {                      }
             $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');                      $privlist =~ s/, $//;
                   }
                   $r->print($$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />');
               }
           }
       }
       if ($num_fail) {
           foreach my $type (sort(keys(%failed))) {
               $r->print(&mt('The following users could not be [_1], because an error occurred:<br />',$type));
               foreach my $user (@{$failed{$type}}) {
                   $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');
               }
         }          }
     }      }
     if ($roster_result eq 'ok') {      if ($roster_result eq 'ok') {
         $r->print('<br />Group membership list updated.');          $r->print('<br />'.&mt('Group membership list updated.'));
     } else {      } else {
         $r->print('<br />An error occurred while updating the group membership list -'.$roster_result.'<br />');          $r->print('<br />'.&mt('An error occurred while updating the group membership list -').$roster_result.'<br />');
     }      }
     return;      return;
 }  }
Line 2752  sub automapping { Line 3122  sub automapping {
    <td>&nbsp;</td>     <td>&nbsp;</td>
    <td colspan="3">     <td colspan="3">
    <nobr>'.$$lt{'auad'}.':&nbsp;     <nobr>'.$$lt{'auad'}.':&nbsp;
     <input type="radio" name="autoadd" value="on" />on&nbsp;&nbsp;<input type="radio" name="autoadd" value="off" />off');      <label><input type="radio" name="autoadd" value="on" />on&nbsp;&nbsp;</label><label><input type="radio" name="autoadd" value="off" checked="checked" />off</label>');
     if ($action eq 'modify') {      if ($action eq 'modify') {
         $r->print('&nbsp;&nbsp;&nbsp;&nbsp;('.$$lt{'curr'}.' <b>'.$$lt{$add}.'</b>)');          $r->print('&nbsp;&nbsp;&nbsp;&nbsp;('.$$lt{'curr'}.' <b>'.$$lt{$add}.'</b>)');
     }      }
Line 2764  sub automapping { Line 3134  sub automapping {
    <td>&nbsp;</td>     <td>&nbsp;</td>
    <td colspan="3">     <td colspan="3">
     <nobr>'.$$lt{'auex'}.':&nbsp;      <nobr>'.$$lt{'auex'}.':&nbsp;
     <input type="radio" name="autodrop" value="on" />on&nbsp;&nbsp;<input type="radio" name="autodrop" value="off" />off');      <label><input type="radio" name="autodrop" value="on" />on&nbsp;&nbsp;</label><label><input type="radio" name="autodrop" value="off" checked="checked" />off</label>');
     if ($action eq 'modify') {      if ($action eq 'modify') {
         $r->print('&nbsp;&nbsp;&nbsp;&nbsp;('.$$lt{'curr'}.' <b>'.$$lt{$drop}.'</b>)');          $r->print('&nbsp;&nbsp;&nbsp;&nbsp;('.$$lt{'curr'}.' <b>'.$$lt{$drop}.'</b>)');
     }      }
Line 2787  sub mapping_settings { Line 3157  sub mapping_settings {
     my @sections = keys(%{$sectioncount});      my @sections = keys(%{$sectioncount});
     if (@sections > 0) {      if (@sections > 0) {
         @sections = sort {$a cmp $b} @sections;          @sections = sort {$a cmp $b} @sections;
         unshift(@sections,'_nosec'); # Put 'no sections' next          unshift(@sections,'none'); # Put 'no sections' next
         unshift(@sections,'_all'); # Put 'all' at the front of the list          unshift(@sections,'all'); # Put 'all' at the front of the list
     }      }
     &topic_bar($r,$tabcol,$image,$$lt{'pirs'});      &topic_bar($r,$tabcol,$image,$$lt{'pirs'});
     $r->print('      $r->print('
Line 2812  sub mapping_settings { Line 3182  sub mapping_settings {
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role);
         my $sections_sel;          my $sections_sel;
         if (@sections > 0) {          if (@sections > 0) {
             $sections_sel='<td>'.&sections_selection(\@sections,'sec_'.$role).              if ($role eq 'cc') {
                                                                        '</td>';                  $sections_sel = '<td align="right">'.
                                   &mt('all sections').'<input type="hidden" '. 
                                   'name="sec_cc" value="all" /></td>';
               } else { 
                   $sections_sel='<td align="right">'.
                                 &sections_selection(\@sections,'sec_'.$role).
                                 '</td>';
               }
         }          }
         if ($rowNum %2 == 1) {          if ($rowNum %2 == 1) {
             $rowColor = $rowColor1;              $rowColor = $rowColor1;
Line 2846  sub mapping_settings { Line 3223  sub mapping_settings {
 }  }
   
 sub standard_roles {  sub standard_roles {
     my @roles = ('st','ep','ta','in','cc');      my @roles = ('cc','in','ta','ep','st');
     return @roles;      return @roles;
 }  }
   
Line 2870  sub modify_menu { Line 3247  sub modify_menu {
             state => 'change_settings',              state => 'change_settings',
             branch => 'settings',              branch => 'settings',
             },              },
           { text => 'Modify access, tools and/or privileges for previous,future'.            { text => 'Modify access, tools and/or privileges for previous, '.
                     'or current members',                      'future, or current members',
             help => 'Course_Modify_Group_Membership',              help => 'Course_Modify_Group_Membership',
             state => 'change_members',              state => 'change_members',
             branch => 'members',              branch => 'members',
Line 2899  sub modify_menu { Line 3276  sub modify_menu {
   
 sub member_privs_entries {  sub member_privs_entries {
     my ($r,$tabcol,$rowColor1,$rowColor2,$usertools,$toolprivs,      my ($r,$tabcol,$rowColor1,$rowColor2,$usertools,$toolprivs,
         $fixedprivs,$userdata,$idx,$showtools,$defprivs) = @_;          $fixedprivs,$userdata,$idx,$showtools,$defprivs,$excluded) = @_;
     my $rowColor;      my $rowColor;
     my $rowNum = 0;      my $rowNum = 0;
     foreach my $user (sort(keys(%{$usertools}))) {      foreach my $user (sort(keys(%{$usertools}))) {
           if (defined($excluded)) {
               if (ref($excluded) eq 'ARRAY') {
                   if (grep/^$user$/,@{$excluded}) {
                       next;
                   }
               }
           }
         my ($uname,$udom) = split(/:/,$user);          my ($uname,$udom) = split(/:/,$user);
         if ($rowNum %2 == 1) {          if ($rowNum %2 == 1) {
             $rowColor = $rowColor1;              $rowColor = $rowColor1;
Line 2928  sub member_privs_entries { Line 3312  sub member_privs_entries {
                         if ($privcount == 3) {                          if ($privcount == 3) {
                             $dynamic .= '</tr><tr>';                              $dynamic .= '</tr><tr>';
                         }                          }
                         $dynamic .='<td><nobr><input type="checkbox" '.                          $dynamic .='<td><nobr><label><input type="checkbox" '.
                                'name="userpriv_'.$priv.'" value="'.$user.'"';                                 'name="userpriv_'.$priv.'" value="'.$user.'"';
                         if (grep/^\Q$priv\E$/,@{$defprivs}) {                          if (grep/^\Q$priv\E$/,@{$defprivs}) {
                             $dynamic .= ' checked="checked" ';                              $dynamic .= ' checked="checked" ';
                         }                          }
                         $dynamic .= ' />'.$$toolprivs{$tool}{$priv}.                          $dynamic .= ' />'.$$toolprivs{$tool}{$priv}.
                                     '</nobr></td>';                                      '</label></nobr></td>';
                     }                      }
                 }                  }
                 $r->print('<tr><td colspan="2"><nobr>'.$fixed.'</nobr></td></tr><tr>'.$dynamic.'</tr></table></td>');                  $r->print('<tr><td colspan="2"><nobr>'.$fixed.'</nobr></td></tr><tr>'.$dynamic.'</tr></table></td>');
Line 2963  sub date_setting_table { Line 3347  sub date_setting_table {
                                                       'startdate',$starttime);                                                        'startdate',$starttime);
     my $endform = &Apache::lonhtmlcommon::date_setter($formname,      my $endform = &Apache::lonhtmlcommon::date_setter($formname,
                                                       'enddate',$endtime);                                                        'enddate',$endtime);
     my $perpetual = '<nobr><input type="checkbox" name="no_end_date" />      my $perpetual = '<nobr><label><input type="checkbox" name="no_end_date" />
                                                   no ending date</nobr>';                                                  no ending date</label></nobr>';
     my $start_table = '';      my $start_table = '';
     $start_table .= "<table>\n";      $start_table .= "<table>\n";
     $start_table .= '<tr><td align="right">Default starting date for       $start_table .= '<tr><td align="right">Default starting date for 
Line 3039  function toggleTools(field,caller) { Line 3423  function toggleTools(field,caller) {
   
 sub validate_groupname {  sub validate_groupname {
     my ($groupname,$action,$cdom,$cnum) = @_;      my ($groupname,$action,$cdom,$cnum) = @_;
     my %sectioncount;      my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
     my $numsec=&Apache::loncommon::get_sections($cdom,$cnum,\%sectioncount);      my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
     my %curr_groups;  
     my $numgroups=&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum);  
                                                                                            
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                       igna => 'Invalid group name',                        igna => 'Invalid group name',
                       tgne => 'The group name entered ',                        tgne => 'The group name entered ',
Line 3057  sub validate_groupname { Line 3439  sub validate_groupname {
                       thgr => '- does not correspond to the name of an existing'.                          thgr => '- does not correspond to the name of an existing'.  
                               ' group ',                                    ' group ',    
     );      );
                                                                                            
     my $exitmsg = '<b>'.$lt{'igna'}.'</b><br /><br />'.$lt{'tgne'}.' "'.      my $exitmsg = '<b>'.$lt{'igna'}.'</b><br /><br />'.$lt{'tgne'}.' "'.
                   $groupname.'" ';                    $groupname.'" ';
     my $dupmsg = $lt{'grna'};      my $dupmsg = $lt{'grna'};
Line 3066  sub validate_groupname { Line 3448  sub validate_groupname {
         $earlyout = $exitmsg.$lt{'isno'}.'<br />'.$lt{'gnmo'};          $earlyout = $exitmsg.$lt{'isno'}.'<br />'.$lt{'gnmo'};
         return $earlyout;          return $earlyout;
     }      }
     if ($numsec) {      if (exists($sectioncount{$groupname})) {
         if (exists($sectioncount{$groupname})) {   return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
             $earlyout = $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.      '<br />'.$lt{'grna'};
                         '<br />'.$lt{'grna'};  
             return $earlyout;  
         }  
     }      }
     if ($action eq 'create') {      if ($action eq 'create' 
         if ($numgroups) {   && exists($curr_groups{$groupname})) {
             if (exists($curr_groups{$groupname})) {  
                 $earlyout = $exitmsg.$lt{'cnnb'}.&mt('an existing group').   return $exitmsg.$lt{'cnnb'}.&mt('an existing group').
                             $lt{'inth'}.'<br />'.$lt{'grna'};      $lt{'inth'}.'<br />'.$lt{'grna'};
                 return $earlyout;  
             }  
         }  
     } elsif ($action eq 'modify') {      } elsif ($action eq 'modify') {
         unless(exists($curr_groups{$groupname})) {          unless(exists($curr_groups{$groupname})) {
             $earlyout = &mt('Group name:').' '.$groupname.$lt{'thgr'}.$lt{'inth'};              $earlyout = &mt('Group name:').' '.$groupname.$lt{'thgr'}.$lt{'inth'};
Line 3118  sub check_changes { Line 3495  sub check_changes {
     @{$exclusions{'changepriv'}} = ('expire','changefunc');      @{$exclusions{'changepriv'}} = ('expire','changefunc');
   
     foreach my $change (@{$member_changes}) {      foreach my $change (@{$member_changes}) {
         if ($change eq 'delete') {          if ($change eq 'deletion') {
             next;              next;
         }          }
         my @checks = ('delete');          my @checks = ('deletion');
         if (exists($exclusions{$change})) {          if (exists($exclusions{$change})) {
             push(@checks,@{$exclusions{$change}});              push(@checks,@{$exclusions{$change}});
         }          }
Line 3129  sub check_changes { Line 3506  sub check_changes {
         foreach my $item (@{$$memchg{$change}}) {          foreach my $item (@{$$memchg{$change}}) {
             my $match = 0;              my $match = 0;
             foreach my $check (@checks) {              foreach my $check (@checks) {
                 if (@{$$memchg{$check}} > 0) {                  if (defined($$memchg{$check})) { 
                     if (grep/^$item$/,@{$$memchg{$check}}) {                      if (ref(@{$$memchg{$check}}) eq 'ARRAY') {
                         $match = 1;                          if (@{$$memchg{$check}} > 0) {
                         last;                              if (grep/^$item$/,@{$$memchg{$check}}) {
                                   $match = 1;
                                   last;
                               }
                           }
                     }                      }
                 }                  }
             }              }

Removed from v.1.5  
changed lines
  Added in v.1.18


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