Diff for /loncom/interface/loncoursegroups.pm between versions 1.36 and 1.80

version 1.36, 2006/07/02 17:08:42 version 1.80, 2008/10/22 17:39:05
Line 29  package Apache::loncoursegroups; Line 29  package Apache::loncoursegroups;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  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::longroup();
 use Apache::portfolio;  use Apache::portfolio();
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
   use LONCAPA::map();
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
   
Line 59  sub handler { Line 60  sub handler {
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                         ['action','refpage','state','groupname','branch']);                          ['action','refpage','state','groupname','branch']);
     my $function = &Apache::loncommon::get_users_function();  
     my $tabcol = &Apache::loncommon::designparm($function.'.tabbg');  
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   
     my $view_permission =      my $view_permission =
           &Apache::lonnet::allowed('vcg',$env{'request.course.id'});            &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
     my $manage_permission =      my $manage_permission =
           &Apache::lonnet::allowed('mdg',$env{'request.course.id'});            &Apache::lonnet::allowed('mdg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     my $gpterm = &Apache::loncommon::group_term();      my $gpterm = &Apache::loncommon::group_term();
Line 91  sub handler { Line 90  sub handler {
     $idx{uname} = &Apache::loncoursedata::CL_SNAME();      $idx{uname} = &Apache::loncoursedata::CL_SNAME();
     $idx{section} = &Apache::loncoursedata::CL_SECTION();      $idx{section} = &Apache::loncoursedata::CL_SECTION();
   
     my $rowColor1 = "#dddddd";  
     my $rowColor2 = "#eeeeee";  
   
     my $action = $env{'form.action'};      my $action = $env{'form.action'};
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     if ((!defined($action)) || ($action eq 'view')) {      if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) {
         if (!defined($state)) {          if (!defined($state)) {
             $state = 'view';              $state = 'view';
         }          }
     }      }
     if ($action eq 'create' || $action eq 'modify' || $action eq 'view') {       if ($action eq 'create' || $action eq 'modify' || $action eq 'view' || 
           $action eq 'delete' || $action eq 'reenable') { 
         if ($view_permission || $manage_permission) {          if ($view_permission || $manage_permission) {
             &group_administration($r,$action,$state,$cdom,$cnum,$function,              if ($state eq 'view') {
                                   $tabcol,\%functions,\%idx,$view_permission,                  &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,
                                   $manage_permission,$rowColor1,$rowColor2,                                   $view_permission,$manage_permission,
                                   $gpterm,$ucgpterm,$crstype);                                   $action,$state,$gpterm,$ucgpterm,$crstype);
         } else {              } else {
             $r->print(&mt('You do not have [_1] administration '.                  &group_administration($r,$action,$state,$cdom,$cnum,
                           'privileges in this [_2]',$gpterm,lc($crstype)));                                        \%functions,\%idx,$view_permission,
                                         $manage_permission,$gpterm,$ucgpterm,
           $crstype);
               }
           } else {
               $r->print('<div class="LC_warning">'
                        .&mt('You do not have '.$gpterm.' administration '
                            .'privileges in this '.lc($crstype).'.')
                        .'</div>');
         }          }
     } else {      } else {
         &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx,          &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission,
                          $view_permission,$manage_permission,$action,$state,   $manage_permission,$action,$state,$gpterm,$ucgpterm,
                          $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);   $crstype);
     }      }
     return OK;      return OK;
 }  }
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,      my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission,
         $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,   $action,$state,$gpterm,$ucgpterm,$crstype) = @_;
         $ucgpterm,$crstype) = @_;  
     my $pagename = "$crstype $ucgpterm".'s';  
     my $jscript = qq|      my $jscript = qq|
 function changeSort(caller) {  function changeSort(caller) {
     document.$state.sortby.value = caller;      document.$state.sortby.value = caller;
     document.$state.submit();      document.$state.submit();
   }
   function openGroupRoster(group,status) {
       var url = '/adm/grouproster?';
       url += 'group='+group+'&status='+status+'&ref=popup';
       var title = 'Group Membership';
       var options = 'scrollbars=1,resizable=1,menubar=0';
       options += ',width=700,height=600';
       rosterbrowser = open(url,title,options,'1');
       rosterbrowser.focus();
 }\n|;  }\n|;
     $r->print(&header($pagename,$jscript,$action,$state,      $r->print(&header('Groups',$jscript,$action,$state));
                       undef,$function));      if ($env{'form.refpage'} eq 'cusr') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"/adm/createuser",
                 text=>"User Management"});
       }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/coursegroups",          ({href=>"/adm/coursegroups",
           text=>"$pagename"});            text=>"Groups"});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename));      my $helpitem;
     &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,      if ($manage_permission) {
                     $view_permission,$manage_permission,$action,$state,          $helpitem = 'Creating_Groups';
                     $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);      }
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups',$helpitem));
       &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
       $manage_permission,$action,$state,$gpterm,$ucgpterm,
       $crstype);
     $r->print(&footer());      $r->print(&footer());
     return;      return;
 }  }
   
 sub display_groups {  sub display_groups {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,      my ($r,$cdom,$cnum,$functions,$idx,$view_permission,
         $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,          $manage_permission,$action,$state,$gpterm,$ucgpterm,$crstype) = @_;
         $ucgpterm,$crstype) = @_;  
     my %curr_groups = ();      my %curr_groups = ();
     my %grp_info = ();      my %grp_info = ();
     my %actionlinks = (      my %actionlinks = (
       modify => '<a href="/adm/coursegroups?action=modify&refpage='.        modify => '<a href="/adm/coursegroups?action=modify&refpage='.
                          $env{'form.refpage'}.'&groupname=',                           $env{'form.refpage'}.'&state=pick_task&groupname=',
       view => '<a href="/adm/'.$cdom.'/'.$cnum.'/',        view => '<a href="/adm/'.$cdom.'/'.$cnum.'/',
       delete => '<a href="/adm/coursegroups?action=delete&refpage='.        delete => '<a href="/adm/coursegroups?action=delete&refpage='.
                          $env{'form.refpage'}.'&groupname=',                           $env{'form.refpage'}.'&state=verify&groupname=',
         reenable => '<a href="/adm/coursegroups?action=reenable&refpage='.
                            $env{'form.refpage'}.'&state=verify&groupname=',
     );      );
     my %lt = &Apache::lonlocal::texthash(       my %lt = &Apache::lonlocal::texthash( 
                           modify => 'Modify',                            modify => 'Modify',
                           view   => 'View',                            view   => 'View',
                           delete => 'Delete',                            delete => 'Delete',
                             reenable => 'Re-enable',
                           act    => 'Action',                            act    => 'Action',
                           gname  => "$ucgpterm Name",                            gname  => 'Group Name',
                           desc   => 'Description',                            desc   => 'Group Title',
                           crea   => 'Creator',                            crea   => 'Creator',
                           crtd   => 'Created',                            crtd   => 'Created',
                           last   => 'Last Modified',                            last   => 'Last Modified',
                           func   => 'Functionality',                            func   => 'Collaborative Tools',
                           quot   => 'Quota (Mb)',                            quot   => 'Quota (Mb)',
                           memb   => 'Members',                            memb   => 'Members',
                           file   => 'Files',                            file   => 'Files',
                           dibd   => 'Discussion Boards',                            dibd   => 'Discussion Boards',
                           dius   => 'Disk Use (%)',                            dius   => 'Disk Use (%)',
                           nogr   => 'No '.$gpterm.'s exist.',                            nogr   => 'No groups exist.',
                           crng   => 'Create a new '.$gpterm,                            crng   => 'Create a new group',
                             redg   => 'Re-enable a deleted group',
                           alth   => 'Although your current role has privileges'.                            alth   => 'Although your current role has privileges'.
                                     ' to view any existing '.$gpterm.'s in this'.                                      ' to view any existing groups in this '.
                                     lc($crstype).', you do not have privileges'.                                      lc($crstype).', you do not have privileges '.
                                     'to create new '.$gpterm.'s.',                                      'to create new groups.',
                      );                       );
     if ($view_permission) {      if ($view_permission) {
         if (!defined($action)) {          if (!defined($action)) {
             $action = 'view';              $action = 'view';
         }          }
         my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);          my ($status,$reenable_link);
           if ($action eq 'reenable') {
               $status = 'deleted_groups';
           } else {
               if ($manage_permission) {
                   my %deleted_groups = 
                       &Apache::longroup::coursegroups($cdom,$cnum,undef,'deleted_groups');
                   if (keys(%deleted_groups) > 0) {
                       $reenable_link = '&nbsp;&nbsp;&nbsp;&nbsp;<a href="/adm/coursegroups?action=reenable&amp;refpage='.$env{'form.refpage'}.'">'.$lt{'redg'}.'</a>';
                   }
               }
           }
           my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef,
                                                             $status);
   
         if (%curr_groups) {          if (%curr_groups) {
             if ($manage_permission) {              if ($manage_permission) {
                 $r->print('<br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');                  if ($action ne 'reenable') {
                       $r->print('<br /><a href="/adm/coursegroups?action=create&amp;refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
                   }
                   if ($reenable_link) {
                       $r->print($reenable_link);
                   }
             }              }
             $r->print('<br /><br />');              $r->print('<br /><br />');
             $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row());
         
             $r->print(<<"END");              $r->print(<<"END");
       <table border="0" cellpadding="4" cellspacing="1">          <th>$lt{'act'}</th>
        <tr bgcolor="$tabcol" align="center">          <th><a href="javascript:changeSort('groupname')">$lt{'gname'}</a></th>
         <td><b>$lt{'act'}</b></td>          <th><a href="javascript:changeSort('description')">$lt{'desc'}</a></th>
         <td><b><a href="javascript:changeSort('groupname')">$lt{'gname'}</a></b></td>          <th><a href="javascript:changeSort('creator')">$lt{'crea'}</a></th>
         <td><b><a href="javascript:changeSort('description')">$lt{'desc'}</a></b></td>          <th><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></th>
         <td><b><a href="javascript:changeSort('creator')">$lt{'crea'}</a></b>          <th><a href="javascript:changeSort('modified')">$lt{'last'}</a></th>
         </td>          <th>$lt{'func'}</b></td>
         <td><b><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></b>          <th><a href="javascript:changeSort('quota')">$lt{'quot'}</a></th>
         </td>          <th><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></th>
         <td><b><a href="javascript:changeSort('modified')">$lt{'last'}</a></b>          <th><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></th>
         </td>          <th><a href="javascript:changeSort('boards')">$lt{'dibd'}</a></th>
         <td><b>$lt{'func'}</b>          <th><a href="javascript:changeSort('diskuse')">$lt{'dius'}</a></th>
         </td>  
         <td><b><a href="javascript:changeSort('quota')">$lt{'quot'}</a></b></td>  
         <td><b><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></b></td>  
         <td><b><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></b></td>  
         <td><b><a href="javascript:changeSort('boards')">$lt{'dibd'}</a></b></td>  
         <td><b><a href="javascript:changeSort('diskuse')">$lt{'dius'}</a></b></td>  
        </tr>  
 END  END
       $r->print(&Apache::loncommon::end_data_table_header_row());
             my %Sortby = ();              my %Sortby = ();
             foreach my $group (sort(keys(%curr_groups))) {              foreach my $group (sort(keys(%curr_groups))) {
                 %{$grp_info{$group}} =                   %{$grp_info{$group}} = 
Line 218  END Line 256  END
                 my $members_result = &group_members($cdom,$cnum,$group,                  my $members_result = &group_members($cdom,$cnum,$group,
                                                     \%grp_info);                                                      \%grp_info);
                 my $port_path = '/userfiles/groups/'.$group.'/portfolio';                  my $port_path = '/userfiles/groups/'.$group.'/portfolio';
                 my $port_dir = &Apache::loncommon::propath($cdom,$cnum).$port_path;  
                 my $totaldirs = 0;                  my $totaldirs = 0;
                 my $totalfiles = 0;                  my $totalfiles = 0;
                 &group_files($group,$port_dir,\$totalfiles,\$totaldirs);                  &group_files($group,$port_path,\$totalfiles,\$totaldirs);
                 $grp_info{$group}{'totalfiles'} = $totalfiles;                  $grp_info{$group}{'totalfiles'} = $totalfiles;
                 $grp_info{$group}{'totaldirs'} = $totaldirs;                  $grp_info{$group}{'totaldirs'} = $totaldirs;
                 my $diskuse = &Apache::lonnet::diskusage($cdom,$cnum,$port_dir);                  my $getpropath = 1;  
                   my $diskuse = &Apache::lonnet::diskusage($cdom,$cnum,$port_path,                                                         $getpropath);
                 if ($grp_info{$group}{'quota'} > 0) {                  if ($grp_info{$group}{'quota'} > 0) {
                     my $pct_use = 0.1 * $diskuse/$grp_info{$group}{'quota'};                      my $pct_use = 0.1 * $diskuse/$grp_info{$group}{'quota'};
                     $grp_info{$group}{'diskuse'} = sprintf("%.0f",$pct_use);                      $grp_info{$group}{'diskuse'} = sprintf("%.0f",$pct_use);
Line 259  END Line 297  END
                     push(@{$Sortby{$group}},$group);                      push(@{$Sortby{$group}},$group);
                 }                  }
             }              }
             my $rowNum = 0;  
             my $rowColor;  
             foreach my $key (sort(keys(%Sortby))) {              foreach my $key (sort(keys(%Sortby))) {
                 foreach my $group (@{$Sortby{$key}}) {                  foreach my $group (@{$Sortby{$key}}) {
                     if ($rowNum %2 == 1) {  
                         $rowColor = $rowColor1;  
                     } else {  
                         $rowColor = $rowColor2;  
                     }  
                     my $description =                       my $description = 
                    &unescape($grp_info{$group}{'description'});   &unescape($grp_info{$group}{'description'});
                     my $creator = $grp_info{$group}{'creator'};                      my $creator = $grp_info{$group}{'creator'};
                     my $creation = $grp_info{$group}{'creation'};                      my $creation = $grp_info{$group}{'creation'};
                     my $modified = $grp_info{$group}{'modified'};                       my $modified = $grp_info{$group}{'modified'}; 
Line 289  END Line 320  END
                         $functionality = &mt('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' || 
                           $action eq 'reenable') {
                         $link .= $group;                          $link .= $group;
                     } else {                      } else {
                         $link .= $group.'/grppg';                          $link .= $group.'/smppg?ref=grouplist';
                           if (exists($env{'form.refpage'})) {
                               $link .= '&amp;refpage='.$env{'form.refpage'};
                           }
                     }                      }
                     $link .= '">'.$lt{$action}.'</a>';                      $link .= '">'.$lt{$action}.'</a>';
                     if ($action eq 'view') {                       if ($action eq 'view') { 
                         if (($manage_permission) &&                           if ($manage_permission) { 
                             ($env{'form.refpage'} ne 'enrl')) {  
                             $link .= '&nbsp;&nbsp;'.$actionlinks{'modify'}.                              $link .= '&nbsp;&nbsp;'.$actionlinks{'modify'}.
                                       $group.'">'.$lt{'modify'}.'</a>';                                        $group.'">'.$lt{'modify'}.'</a>'.
                                        '&nbsp;&nbsp;'.$actionlinks{'delete'}.
                                         $group.'">'.$lt{'delete'}.'</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 align="right"><small>'.$quota.'</small></td><td align="right"><small>'.$totalmembers.'</small></td><td align="right"><small><nobr>'.&mt('Files: ').$totalfiles.'</nobr><br /><nobr>'.&mt('Folders: ').$totaldirs.'</nobr></small></td><td align="right"><small>'.$boards.'</small></td><td align="right"><small>'.$diskuse.'</small></td></tr>');                      $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
                     $rowNum ++;        '<td>'.$link.'</td>'.
         '<td>'.$group.'</td>'.
         '<td>'.$description.'</td>'.
         '<td>'.$creator.'</td>'.
         '<td>'. &Apache::lonnavmaps::timeToHumanString($creation).'</td>'.
         '<td>'. &Apache::lonnavmaps::timeToHumanString($modified).'</td>'.
         '<td>'.$functionality.'</td>'.
         '<td align="right">'.$quota.'</td>'.
         '<td align="right">'.$totalmembers.'</td>'.
         '<td align="right">'.
                                     '<div class="LC_nobreak">'.&mt('Files: [_1]',$totalfiles).'</div>'.
                                     '<div class="LC_nobreak">'.&mt('Folders: [_1]',$totaldirs).'</div>'.
                                     '</td>'.
         '<td align="right">'.$boards.'</td>'.
         '<td align="right">'.$diskuse.'</td>'.
         &Apache::loncommon::end_data_table_row());
                 }                  }
             }              }
             $r->print('</table>');              $r->print(&Apache::loncommon::end_data_table());
             $r->print(&Apache::lonhtmlcommon::end_pick_box());  
             $r->print('<input type="hidden" name="refpage" '.              $r->print('<input type="hidden" name="refpage" '.
                       'value="'.$env{'form.refpage'}.'" />');                        'value="'.$env{'form.refpage'}.'" />');
             if ($action eq 'view') {              if ($action eq 'view') {
Line 320  END Line 370  END
         } else {          } else {
             $r->print($lt{'nogr'});              $r->print($lt{'nogr'});
             if ($manage_permission) {              if ($manage_permission) {
                 $r->print('<br /><br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');                  $r->print('<br /><br /><a href="/adm/coursegroups?action=create&amp;refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
                   if ($action ne 'reenable') {
                       if ($reenable_link) {
                           $r->print($reenable_link);
                       }
                   }
             } else {              } else {
                 $r->print('<br /><br />'.$lt{'alth'});                  $r->print('<br /><br />'.$lt{'alth'});
   
             }              }
         }          }
     } else {      } else {
Line 337  END Line 391  END
                                         $curr_groups{$group});                                          $curr_groups{$group});
                     my $description = &unescape(                      my $description = &unescape(
                                         $group_info{description});                                          $group_info{description});
                     my ($uname,$udom) = split(/:/,$group_info{creator});                      $r->print('<font size="+1"><a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/smppg?ref=grouplist">'.$group,'</a><font><br /><small>'.$description.'</small><br /><br />');
                     $r->print('<font size="+1"><a href="/adm/'.$udom.'/'.$uname.'/'.$group.'/grppg">'.$group,'</a><font><br /><small>'.$description.'</small><br /><br />');  
                 }                  }
             }              }
         } else {          } else {
             $r->print(&mt('You are not currently a member of any '.              $r->print(&mt('You are not currently a member of any active '.$gpterm.'s in this '.lc($crstype).'.'));
                           'active [_1]s in this [_2]',$gpterm,  
                           lc($crstype)));  
         }          }
     }      }
     return;      return;
 }  }
   
 sub group_administration {  sub group_administration {
     my ($r,$action,$state,$cdom,$cnum,$function,$tabcol,$functions,$idx,      my ($r,$action,$state,$cdom,$cnum,$functions,$idx,$view_permission,
         $view_permission,$manage_permission,$rowColor1,$rowColor2,$gpterm,   $manage_permission,$gpterm,$ucgpterm,$crstype) = @_;
         $ucgpterm,$crstype) = @_;  
     my %sectioncount = ();      my %sectioncount = ();
     my @tools = ();      my @tools = ();
     my @types = ();      my @types = ();
Line 368  sub group_administration { Line 418  sub group_administration {
     my @member_changes = ('deletion','expire','activate','reenable',      my @member_changes = ('deletion','expire','activate','reenable',
                           'changefunc','changepriv');                            'changefunc','changepriv');
     my ($groupname,$description,$startdate,$enddate,$granularity,$specificity,      my ($groupname,$description,$startdate,$enddate,$granularity,$specificity,
         $quota);          $quota,$validate_script);
   
     if (defined($env{'form.groupname'})) {      if (defined($env{'form.groupname'})) {
         $groupname = $env{'form.groupname'};          $groupname = $env{'form.groupname'};
Line 410  sub group_administration { Line 460  sub group_administration {
         if ($state eq '') {          if ($state eq '') {
             if (defined($env{'form.groupname'})) {              if (defined($env{'form.groupname'})) {
                 $state = 'pick_task';                  $state = 'pick_task';
             } else {  
                 $state = 'pick_group';  
             }              }
         } else {          } else {
             %stored = &retrieve_settings($cdom,$cnum,$groupname);              %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
             if (ref($stored{'types'}) eq 'ARRAY') {              if (ref($stored{'types'}) eq 'ARRAY') {
                 @types = @{$stored{'types'}};                  @types = @{$stored{'types'}};
             }              }
Line 505  sub group_administration { Line 553  sub group_administration {
        (($action eq 'modify') && (($state eq 'change_settings') ||         (($action eq 'modify') && (($state eq 'change_settings') ||
                                   ($state eq 'add_members')))) {                                    ($state eq 'add_members')))) {
         %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);          %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
         if (%sectioncount) {          $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') || 
Line 522  sub group_administration { Line 568  sub group_administration {
         }          }
         if (defined($env{'form.sectionpick'})) {          if (defined($env{'form.sectionpick'})) {
             @sections=&Apache::loncommon::get_env_multiple('form.sectionpick');              @sections=&Apache::loncommon::get_env_multiple('form.sectionpick');
             if (grep/^all$/,@sections) {  
                 @sections = sort {$a cmp $b} keys(%sectioncount);  
             }  
         }          }
     }      }
   
Line 565  sub group_administration { Line 608  sub group_administration {
                         $num_reenable ++;                          $num_reenable ++;
                         next;                          next;
                     } elsif (($start > $now)) {                      } elsif (($start > $now)) {
                         $num_activate = 1;                          $num_activate ++;
                         next;                          next;
                     } else {                      } else {
                         $num_expire ++;                          $num_expire ++;
Line 727  sub group_administration { Line 770  sub group_administration {
             }              }
         }          }
     }      }
    
       if (($action eq 'create' && $state eq 'pick_name') || 
           ($action eq 'modify' && $state eq 'change_settings')) {
           my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,\%stored);
           my $space_trim = '/^\s*|\s*\$/g,""';
           my $float_check = '/^([0-9]*\.?[0-9]*)$/';
           $validate_script = '
       var newquota = new String(document.'.$state.'.quota.value);
       newquota.replace('.$space_trim.');
       if (newquota == "" ) {
           document.'.$state.'.quota.value = 0;
           newquota = "0";
       }
       var maxposs = '.sprintf("%.2f",$maxposs).';
       if (newquota > maxposs) {
           alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number.");
           return;
       }
       var re_quota = '.$float_check.';
       var check_quota = newquota.match(re_quota);
       if (check_quota == null) {
           alert("The quota you entered contains invalid characters, the quota should only include numbers, with or without a decimal point.");
           return;
       }
       if (newquota == 0) {
           var warn_zero = 0;
           for (var i=0; i<document.'.$state.'.tool.length; i++) {
               if (document.'.$state.'.tool[i].value == "files") {
                   if (document.'.$state.'.tool[i].checked) {
                       warn_zero = 1;
                   }
               }
           }
           if (warn_zero == 1) {
               alert("You have indicated that the file repository should be enabled, but you have set the respository quota to 0 Mb.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");
               return;
           }
       } 
   ';
       }
     my $jscript = &Apache::loncommon::check_uncheck_jscript();      my $jscript = &Apache::loncommon::check_uncheck_jscript();
     $jscript .= qq|      $jscript .= qq|
 function nextPage(formname,nextstate) {  function nextPage(formname,nextstate) {
     formname.state.value= nextstate;      formname.state.value= nextstate;
       $validate_script
     formname.submit();      formname.submit();
 }  }
 function backPage(formname,prevstate) {  function backPage(formname,prevstate) {
Line 751  function changeSort(caller) { Line 834  function changeSort(caller) {
     my %states = ();      my %states = ();
     my %branchstates = ();      my %branchstates = ();
     @{$states{'create'}} = ('pick_name','pick_members','pick_privs','result');      @{$states{'create'}} = ('pick_name','pick_members','pick_privs','result');
     @{$states{'modify'}} = ('pick_group','pick_task');      @{$states{'modify'}} = ('pick_task');
       @{$states{'delete'}} = ('verify','result');
       @{$states{'reenable'}} = ('verify','result');
     @{$branchstates{'noprivs'}} = ('result');      @{$branchstates{'noprivs'}} = ('result');
     @{$branchstates{'settings'}} = ('change_settings','chgresult');      @{$branchstates{'settings'}} = ('change_settings','chgresult');
     @{$branchstates{'members'}} = ('change_members','change_privs','memresult');      @{$branchstates{'members'}} = ('change_members','change_privs','memresult');
Line 762  function changeSort(caller) { Line 847  function changeSort(caller) {
         push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}});          push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}});
     }      }
   
     if (($action eq 'create') || ($action eq 'modify')) {      if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) {
         my $done = 0;          my $done = 0;
         my $i=0;          my $i=0;
         while ($i<@{$states{$action}} && !$done) {          while ($i<@{$states{$action}} && !$done) {
Line 775  function changeSort(caller) { Line 860  function changeSort(caller) {
     }      }
   
     my $loaditems =  &onload_action($action,$state);      my $loaditems =  &onload_action($action,$state);
     my $crumbtitle = "$crstype $ucgpterm".'s';       $r->print(&header("Groups Manager",
     $r->print(&header("$crumbtitle Manager",        $jscript,$action,$state,$page,$loaditems));
       $jscript,$action,$state,$page,$function,$loaditems));  
   
     if ($env{'form.refpage'} eq 'enrl') {      if ($env{'form.refpage'} eq 'cusr') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/dropadd",          ({href=>"/adm/createuser",
           text=>"Enrollment Manager",            text=>"User Management",
           faq=>9,bug=>'Instructor Interface',});            faq=>9,bug=>'Instructor Interface',});
     } else {          if ($action eq 'modify' || $action eq 'delete') {
               &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"/adm/coursegroups?refpage=cusr&action=$action",
                 text=>"Groups",
                 faq=>9,bug=>'Instructor Interface',});
           }
       } else { 
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"/adm/coursegroups",            ({href=>"/adm/coursegroups",
           text=>"$crumbtitle",              text=>"Groups",
           faq=>9,bug=>'Instructor Interface',});              faq=>9,bug=>'Instructor Interface',});
           if ($env{'form.refpage'} eq 'grouplist') {
               &Apache::lonhtmlcommon::add_breadcrumb
                ({href=>"/adm/$cdom/$cnum/$env{'form.groupname'}/smppg?ref=grouplist",
                  text=>"Group: $description",});
           }
     }      }
   
     my %trail = ();      my %trail = ();
Line 799  function changeSort(caller) { Line 894  function changeSort(caller) {
                             result => 'Creation Complete',                              result => 'Creation Complete',
                           );                            );
     %{$trail{'modify'}} = &Apache::lonlocal::texthash(      %{$trail{'modify'}} = &Apache::lonlocal::texthash(
                             pick_group => $ucgpterm.'s',  
                             pick_task => 'Choose Task',                              pick_task => 'Choose Task',
                             change_settings => "$ucgpterm Settings",                              change_settings => "$ucgpterm Settings",
                             change_members => 'Modify/Delete Members',                              change_members => 'Modify/Delete Members',
Line 812  function changeSort(caller) { Line 906  function changeSort(caller) {
                             memresult => 'Modifications Complete',                              memresult => 'Modifications Complete',
                             addresult => 'Additions Complete',                              addresult => 'Additions Complete',
                           );                            );
       %{$trail{'delete'}} = &Apache::lonlocal::texthash(
                               verify => 'Verify deletion',
                               result => 'Deletion Complete'
                             );
       %{$trail{'reenable'}} = &Apache::lonlocal::texthash(
                               verify => 'Verify Re-enable',
                               result => 'Re-enabled'
                             );
     my %navbuttons = &Apache::lonlocal::texthash(      my %navbuttons = &Apache::lonlocal::texthash(
                              gtns => 'Go to next step',                               gtns => 'Go to next step',
                              gtps => 'Go to previous step',                               gtps => 'Go to previous step',
Line 820  function changeSort(caller) { Line 922  function changeSort(caller) {
                              gtpp => 'Go to previous page',                               gtpp => 'Go to previous page',
                              adme => 'Add members',                               adme => 'Add members',
     );      );
     if ((($action eq 'create') || ($action eq 'modify')) &&      if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) &&
               ($manage_permission)) {                ($manage_permission)) {
         for (my $i=0; $i<@{$states{$action}}; $i++) {          for (my $i=0; $i<@{$states{$action}}; $i++) {
             if ($state eq $states{$action}[$i]) {              if ($state eq $states{$action}[$i]) {
                 &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
   ("$crumbtitle Manager"));    ("Groups Manager","Creating_Groups"));
                 &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,                  &display_control($r,$cdom,$cnum,$action,$state,$page,
                        \%sectioncount,$groupname,$description,$functions,                         \%sectioncount,$groupname,$description,$functions,
                        \@tools,$toolprivs,$fixedprivs,$startdate,$enddate,                         \@tools,$toolprivs,$fixedprivs,$startdate,$enddate,
                        \%users,\%userdata,$idx,\%memchg,\%usertools,                         \%users,\%userdata,$idx,\%memchg,\%usertools,
                        $function,$view_permission,$manage_permission,                         $view_permission,$manage_permission,
                        \%stored,$granularity,$quota,$specificity,\@types,\@roles,                         \%stored,$granularity,$quota,$specificity,\@types,\@roles,
                        \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2,                         \@sections,\%states,\%navbuttons,$gpterm,$ucgpterm,
                        $gpterm,$ucgpterm,$crstype);   $crstype);
                 last;                  last;
             } else {              } else {
                 if (($state eq 'result') && ($i > 0)) {                  if (($action eq 'create') || ($action eq 'modify')) {
                     &Apache::lonhtmlcommon::add_breadcrumb(                      if (($state eq 'result') && ($i > 0)) {
                           &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]}"});
                 } else {                       } else { 
                     &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
      {href=>"javascript:backPage(document.$state,'$states{$action}[$i]')",       {href=>"javascript:backPage(document.$state,'$states{$action}[$i]')",
       text=>"$trail{$action}{$states{$action}[$i]}"});        text=>"$trail{$action}{$states{$action}[$i]}"});
                       }
                 }                  }
             }              }             
         }          }
     } elsif (($action eq 'view') && ($view_permission)) {      } elsif (($action eq 'view') && ($view_permission)) {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
                    {text=>"View $gpterm".'s'});                     {text=>"View $gpterm".'s'});
         my $crumbtitle = "$crstype $ucgpterm".'s Manager';  
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
   (&mt($crumbtitle)));    ('Groups Manager'));
         &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,          &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
                         $view_permission,$manage_permission,$action,$state,   $manage_permission,$action,$state,$gpterm,$ucgpterm,
                         $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);   $crstype);
   
     }      }
     $r->print(&footer());      $r->print(&footer());
     return;      return;
 }  }
   
 sub retrieve_settings {  sub retrieve_settings {
     my ($cdom,$cnum,$groupname) = @_;      my ($cdom,$cnum,$groupname,$action) = @_;
     my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname);      my %curr_groups;
       my $namespace;
       if ($action eq 'reenable') {
           $namespace = 'deleted_groups';
       } else {
           $namespace = 'coursegroups';
       }
       %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname,
                                                      $namespace);
   
     return if (!%curr_groups);      return if (!%curr_groups);
   
Line 911  sub retrieve_settings { Line 1021  sub retrieve_settings {
  foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {   foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {
             if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') {              if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') {
         foreach my $section (@{$groupinfo{'autosec'}{$role}}) {          foreach my $section (@{$groupinfo{'autosec'}{$role}}) {
   
             push (@{$stored{'sec_'.$role}},$section);              push (@{$stored{'sec_'.$role}},$section);
         }          }
         if (@{$groupinfo{'autosec'}{$role}} > 0) {          if (@{$groupinfo{'autosec'}{$role}} > 0) {
Line 923  sub retrieve_settings { Line 1034  sub retrieve_settings {
 }  }
   
 sub display_control {  sub display_control {
     my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$sectioncount,$groupname,      my ($r,$cdom,$cnum,$action,$state,$page,$sectioncount,$groupname,
         $description,$functions,$tools,$toolprivs,$fixedprivs,$startdate,          $description,$functions,$tools,$toolprivs,$fixedprivs,$startdate,
         $enddate,$users,$userdata,$idx,$memchg,$usertools,$function,          $enddate,$users,$userdata,$idx,$memchg,$usertools,
         $view_permission,$manage_permission,$stored,$granularity,$quota,          $view_permission,$manage_permission,$stored,$granularity,$quota,
         $specificity,$types,$roles,$sections,$states,$navbuttons,$rowColor1,          $specificity,$types,$roles,$sections,$states,$navbuttons,
         $rowColor2,$gpterm,$ucgpterm,$crstype) = @_;   $gpterm,$ucgpterm,$crstype) = @_;
     if ($action eq 'create') {      if ($action eq 'create') {
         if ($state eq 'pick_name') {          if ($state eq 'pick_name') {
             &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page,              &general_settings_form($r,$cdom,$cnum,$action,$state,$page,
                                    $functions,$tools,$toolprivs,$fixedprivs,                                     $functions,$tools,$toolprivs,$fixedprivs,
                                    $sectioncount,$stored,$states,$navbuttons,                                     $sectioncount,$stored,$states,$navbuttons,
                                    $rowColor1,$rowColor2,$gpterm,$ucgpterm,                                     $gpterm,$ucgpterm,$crstype);
                                    $crstype);  
         } elsif ($state eq 'pick_members') {          } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &choose_members_form($r,$cdom,$cnum,$action,$state,$page,
                                  $groupname,$description,$granularity,$quota,                                   $groupname,$description,$granularity,$quota,
                                  $startdate,$enddate,$tools,$fixedprivs,                                   $startdate,$enddate,$tools,$fixedprivs,
                                  $toolprivs,$functions,$users,$userdata,$idx,                                   $toolprivs,$functions,$users,$userdata,$idx,
                                  $stored,$states,$navbuttons,$rowColor1,                                   $stored,$states,$navbuttons,$gpterm,$ucgpterm,
                                  $rowColor2,$gpterm,$ucgpterm,$crstype);   $crstype);
         } elsif ($state eq 'pick_privs') {          } elsif ($state eq 'pick_privs') {
             &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &choose_privs_form($r,$cdom,$cnum,$action,$state,$page,
                                $startdate,$enddate,$tools,$functions,                                 $startdate,$enddate,$tools,$functions,
                                $toolprivs,$fixedprivs,$userdata,$usertools,                                 $toolprivs,$fixedprivs,$userdata,$usertools,
                                $idx,$states,$stored,$sectioncount,$navbuttons,                                 $idx,$states,$stored,$sectioncount,$navbuttons,
                                $rowColor1,$rowColor2,$gpterm,$ucgpterm,                                 $gpterm,$ucgpterm,$crstype);
                                $crstype);  
         } elsif ($state eq 'result') {          } elsif ($state eq 'result') {
             &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &process_request($r,$cdom,$cnum,$action,$state,$page,
                              $groupname,$description,$specificity,$userdata,                               $groupname,$description,$specificity,$userdata,
                              $startdate,$enddate,$tools,$functions,                               $startdate,$enddate,$tools,$functions,
                              $toolprivs,$usertools,$idx,$types,$roles,                               $toolprivs,$usertools,$idx,$types,$roles,
                              $sections,$states,$navbuttons,$memchg,                               $sections,$states,$navbuttons,$memchg,
                              $sectioncount,$stored,$rowColor1,$rowColor2,                               $sectioncount,$stored,$gpterm,$ucgpterm,$crstype);
                              $gpterm,$ucgpterm,$crstype);  
         }          }
     } elsif ($action eq 'modify') {      } elsif ($action eq 'modify') {
         my $groupname = $env{'form.groupname'};          my $groupname = $env{'form.groupname'};
         if ($state eq 'pick_group') {          if ($state eq 'pick_task') {
             &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,  
                             $view_permission,$manage_permission,$action,$state,  
                             $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);  
         } elsif ($state eq 'pick_task') {  
             &modify_menu($r,$groupname,$page,$gpterm);              &modify_menu($r,$groupname,$page,$gpterm);
         } elsif ($state eq 'change_settings') {          } elsif ($state eq 'change_settings') {
             &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page,              &general_settings_form($r,$cdom,$cnum,$action,$state,$page,
                                    $functions,$tools,$toolprivs,$fixedprivs,                                     $functions,$tools,$toolprivs,$fixedprivs,
                                    $sectioncount,$stored,$states,$navbuttons,                                     $sectioncount,$stored,$states,$navbuttons,
                                    $rowColor1,$rowColor2,$gpterm,$ucgpterm,                                     $gpterm,$ucgpterm,$crstype);
                                    $crstype);  
         } elsif ($state eq 'change_members') {          } elsif ($state eq 'change_members') {
             &change_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &change_members_form($r,$cdom,$cnum,$action,$state,$page,
                                  $groupname,$description,$startdate,$enddate,                                   $groupname,$description,$startdate,$enddate,
                                  $tools,$fixedprivs,$functions,$users,                                   $tools,$fixedprivs,$functions,$users,
                                  $userdata,$granularity,$quota,$specificity,                                   $userdata,$granularity,$quota,$specificity,
                                  $idx,$states,$navbuttons,$rowColor1,$rowColor2,                                   $idx,$states,$navbuttons,$gpterm,$ucgpterm);
                                  $gpterm,$ucgpterm);  
         } elsif ($state eq 'add_members') {          } elsif ($state eq 'add_members') {
             &add_members_form($r,$tabcol,$action,$state,$page,$startdate,              &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate,
                               $enddate,$groupname,$description,$granularity,                                $enddate,$groupname,$description,$granularity,
                               $quota,$sectioncount,$tools,$functions,$stored,                                $quota,$sectioncount,$tools,$functions,$stored,
                               $states,$navbuttons,$rowColor1,$rowColor2,$gpterm,                                $states,$navbuttons,$gpterm,$ucgpterm);
                               $ucgpterm);  
         } elsif ($state eq 'pick_members') {          } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &choose_members_form($r,$cdom,$cnum,$action,$state,$page,
                                  $groupname,$description,$granularity,$quota,                                   $groupname,$description,$granularity,$quota,
                                  $startdate,$enddate,$tools,$fixedprivs,                                   $startdate,$enddate,$tools,$fixedprivs,
                                  $toolprivs,$functions,$users,$userdata,$idx,                                   $toolprivs,$functions,$users,$userdata,$idx,
                                  $stored,$states,$navbuttons,$rowColor1,                                   $stored,$states,$navbuttons,$gpterm,$ucgpterm,
                                  $rowColor2,$gpterm,$ucgpterm,$crstype);   $crstype);
         } elsif ($state eq 'pick_privs') {          } elsif ($state eq 'pick_privs') {
             &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &choose_privs_form($r,$cdom,$cnum,$action,$state,$page,
                                $startdate,$enddate,$tools,$functions,                                 $startdate,$enddate,$tools,$functions,
                                $toolprivs,$fixedprivs,$userdata,$usertools,                                 $toolprivs,$fixedprivs,$userdata,$usertools,
                                $idx,$states,$stored,$sectioncount,$navbuttons,                                 $idx,$states,$stored,$sectioncount,$navbuttons,
                                $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);                                 $gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'change_privs') {          } elsif ($state eq 'change_privs') {
             &change_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,              &change_privs_form($r,$cdom,$cnum,$action,$state,$page,
                                $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,$gpterm,                                 $navbuttons,$gpterm,$ucgpterm);
                                $ucgpterm);  
         } 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,$action,$state,$page,
                              $groupname,$description,$specificity,$userdata,                               $groupname,$description,$specificity,$userdata,
                              $startdate,$enddate,$tools,$functions,                               $startdate,$enddate,$tools,$functions,
                              $toolprivs,$usertools,$idx,$types,$roles,                               $toolprivs,$usertools,$idx,$types,$roles,
                              $sections,$states,$navbuttons,$memchg,                               $sections,$states,$navbuttons,$memchg,
                              $sectioncount,$stored,$rowColor1,$rowColor2,                               $sectioncount,$stored,$gpterm,$ucgpterm,$crstype);
                              $gpterm,$ucgpterm,$crstype);          }
       } elsif ($action eq 'delete') {
           my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
           if ($state eq 'verify') {
               &verify_delete($r,$groupname,$state,$action,$page,$states,
                              \%stored);
           } elsif ($state eq 'result') {
               &delete_group($r,$cdom,$cnum,$groupname);
           }
       } elsif ($action eq 'reenable') {
           my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
           if ($state eq 'verify') {
               &verify_reenable($r,$groupname,$state,$action,$page,$states,
                              \%stored);
           } elsif ($state eq 'result') {
               &reenable_group($r,$cdom,$cnum,$groupname);
           }
       }
   }
   
   sub verify_delete {
       my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
       $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
       $r->print(&mt('You have requested deletion of the group [_1].'
                    ,'<i>'.$stored->{'description'}.'</i>').
                 '<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'.
                 '<li>'.&mt('All group membership is terminated.').'</li>'.
                 '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>'.
                 '<li>'.&mt('The group folder is removed from the folder containing it - normally this is the "Course Groups" folder which contains folders for all groups in the course.').'</li>'.
                 '</ul>'.&mt('Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future.'));
       my $prevtext = &mt('Go back');
       my $nexttext = &mt('Delete group');
       my $prev;
       if ($env{'form.refpage'} eq 'cusr')  {
           $prev = 'view';
       }
       &display_navbuttons($r,$formname,$prev,$prevtext,
                           $$states{$action}[$page+1],$nexttext);
       return;
   }
   
   sub delete_group {
       my ($r,$cdom,$cnum,$groupname) = @_;
       my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                              $groupname);
       my $now = time;
       my $num_users = 0;
       my $num_fail = 0;
       my $num_ok = 0;
       my @deleted;
       my @undeleted;
       my %usersettings;
       my $context = 'deletegroup';
       foreach my $key (sort(keys(%membership))) {
           if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
               my $user = $1;
               my($end,$start,$userprivs) = split(/:/,$membership{$key},3);
               if ($start != -1) {
                   $num_users ++;
                   $usersettings{$groupname.':'.$user} = $now.':-1:'.$userprivs;
                   if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
                                                           $groupname,$user,
                                                           $now,'-1',$userprivs,
                                                           '',$context)
                       eq 'ok') {
                       $num_ok ++;
                       push(@deleted,$user);
                   } else {
                       push(@undeleted,$user);
                       $num_fail ++;
                   }
               }
         }          }
     }      }
       if ($num_ok > 0) {
           my $roster_result = 
               &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum,
                                                              \%usersettings);
       }
       if ($num_fail > 0) {
           $r->print('<div class="LC_error">'
                    .&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.'
                        ,$num_fail,$num_users)
                    .'</div>');
           
       } else {
           my ($result,$message) = 
                &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,
                                                           $groupname,'delete');
           if ($result eq 'ok') {
               my $outcome = &modify_folders($cdom,$cnum,$groupname);
               if ($outcome eq '') {
                   $r->print('<div class="LC_success">'
                            .&mt('Group successfully deleted.')
                            .'</div>');
               } else {
                   $r->print('<div class="LC_error">'
                            .&mt("Although the group was deleted, an error occurred when removing"
                                ." the group's folder from the 'Course Groups' folder: [_1]",$outcome)
                            .'</div>');
               }
           } else {
               $r->print('<div class="LC_error">'
                        .&mt('Group deletion failed.')
                        .'</div>');
           }
       }
       return;
   }
   
   sub reenable_folder {
       my ($cdom,$cnum,$groupname,$description) = @_;
       my $outcome;
       my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
       my $allgrpsmap = $crspath.'group_allfolders.sequence';
       my $foldertitle = &mt('Course Folder -[_1]',$description);
       my $mapurl = $crspath.'group_folder_'.
                      $groupname.'.sequence';
       my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);
       if ($fatal) {
           $outcome='<div class="LC_error">'
                   .&mt('An error occurred when reading contents of parent folder to group:')
                   ."<br />($allgrpsmap): $errtext"
                   .'</div>';
       } else {
           my $idx=&LONCAPA::map::getresidx($mapurl);
           $LONCAPA::map::resources[$idx] = $foldertitle.':'.$mapurl.
                                            ':false:normal:res';
           $LONCAPA::map::order[1+$#LONCAPA::map::order]=$idx;
           my ($outtext,$errtext) = &LONCAPA::map::storemap($allgrpsmap,1);
           if ($errtext) {
               $outcome='<div class="LC_error">'
                       .&mt('An error occurred when saving updated parent folder to group:'
                           ,"<br />$allgrpsmap - $errtext")
                       .'</div>';
           } else {
               my ($furl,$ferr) =
                        &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
           }
       }
       return $outcome;
   }
   
   sub modify_folders {
       my ($cdom,$cnum,$groupname) = @_;
       my $outcome;
       my $navmap = Apache::lonnavmaps::navmap->new();
       my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.
                      $groupname.'.sequence';
       my $groupmapres = $navmap->getResourceByUrl($groupmap);
       my ($map,$id,$src);
       if ($groupmapres) {
           ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb());
       }
       undef($navmap);
       if ($map) {
           $map = '/'.$map;
           my ($errtext,$fatal) = &LONCAPA::map::mapread($map);
           if ($fatal) {
               $outcome='<div class="LC_error">'
                       .&mt('An error occurred when reading contents of parent folder to group:')
                       ."<br />($map): $errtext"
                       .'</div>';
           } else {
               my $idx = 0;
               my $grpidx;
               foreach my $item (@LONCAPA::map::order) {
                   my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$item]);
                   $url=&LONCAPA::map::qtescape($url);
                   if ($url eq $groupmap) {
                       $grpidx = $idx;
                       last;
                   } else {
                       $idx++;
                   }
               }
   
               if ($grpidx ne '') {
                   &LONCAPA::map::makezombie($LONCAPA::map::order[$grpidx]);
                   for (my $i=$grpidx;$i<$#LONCAPA::map::order;$i++) {
                       $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
                   }
                   $#LONCAPA::map::order--;
                   my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1);
                   if ($errtext) {
                       $outcome='<div class="LC_error">'
                               .&mt('An error occurred when saving updated parent folder to group:')
                               ."<br />$map - $errtext"
                               .'</div>';
                   } else {
                       my ($furl,$ferr) =
                           &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
                   }  
               }
           }
       }
       return $outcome;
   }
   
   sub verify_reenable {
       my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
       $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
       $r->print(&mt('You have requested enabling the previously deleted group [_1].'
                    ,'<i>'.$stored->{'description'}.'</i>').
                 '<br /><br />'.&mt('When a deleted group is re-enabled the following occurs:').'<ul>'.
                 '<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li>'.
                 '<li>'.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'</li></ul>');
       my $prevtext = &mt('Go back');
       my $nexttext = &mt('Reenable group');
       my $prev;
       if ($env{'form.refpage'} eq 'cusr')  {
           $prev = 'view';
       }
       &display_navbuttons($r,$formname,$prev,$prevtext,
                           $$states{$action}[$page+1],$nexttext);
       return;
   }
   
   sub reenable_group {
       my ($r,$cdom,$cnum,$groupname) = @_;
       my %groups = 
           &Apache::longroup::coursegroups($cdom,$cnum,$groupname,
                                           'deleted_groups');
       if (keys(%groups) == 0) {
           $r->print(&mt('The group [_1] was not re-enabled, because it is not a deleted group.[_2]Perhaps it has already been re-enabled?','<i>'.$groupname.'</i>'),'<br />');
           return;
       }
       my %groupinfo = 
           &Apache::longroup::get_group_settings($groups{$groupname});
       my $defstart = $groupinfo{'startdate'};
       my $defend = $groupinfo{'enddate'};
       my $showstart = &Apache::lonlocal::locallocaltime($defstart);
       my $showend;
       if ($defend == 0) {
           $showend = &mt('No end date set');
       } else {
           $showend = &Apache::lonlocal::locallocaltime($defend);
       }
       my $description = &unescape($groupinfo{'description'});
       my $num_users = 0;
       my $num_ok = 0;
       my $num_fail = 0;
       my $context = 'reenablegroup';
       my (%usersettings,@enabled,@unenabled);
       my ($result,$message) =
             &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,$groupname,
                                                        'reenable');
       if ($result eq 'ok') {
           my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                              $groupname);
           foreach my $key (sort(keys(%membership))) {
               if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
                   my $user = $1;
                   my($end,$start,$userprivs) = split(/:/,$membership{$key},3);
                   if (($start == -1) && ($end == $groupinfo{'modified'})) {
                       $num_users ++;
                       $usersettings{$groupname.':'.$user} = $defend.':'.
                                                             $defstart.':'.
                                                             $userprivs;
                       if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
                                                               $groupname,$user,
                                                               $defend,$defstart,
                                                               $userprivs,'',
   $context) eq 'ok') {
                           $num_ok ++;
                           push(@enabled,$user);
                       } else {
                           push(@unenabled,$user);
                           $num_fail ++;
                       }
                   }
               }
           }
           if ($num_users > 0) {
               if ($num_ok > 0) {
                   my $roster_result =
           &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum,
                                                          \%usersettings);
                   if ($roster_result eq 'ok') {
                       $r->print('<div class="LC_success">'
                                .&mt('Membership reinstated for [quant,_1,user], each with start and end dates for group access set to defaults: [_2] and [_3]',$num_ok,$showstart,$showend)
                                .'</div>');
                   }
               } else {
                   $r->print('<div class="LC_error">'
                            .&mt('A problem occurred when trying to reinstate [_1] of the [_2] members of the pre-existing group.',$num_fail,$num_users)
                            .'</div>');
               }
           } else {
               $r->print('<div class="LC_info">'
                        .&mt('There were no group members to reinstate, as none were removed when the group was deleted.')
                        .'</div>');
           }
           my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description);
           if ($outcome eq '') {
               $r->print('<div class="LC_success">'
                        .&mt('Group successfully re-enabled.')
                        .'</div>');
           } else {
               $r->print('<div class="LC_error">'
                        .&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome)
                        .'</div>');
           }
       } else {
           $r->print('<div class="LC_error">'
                    .&mt('Re-enabling group failed.')
                    .'</div>');
       }
       return;
 }  }
   
 sub header {  sub header {
     my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_;      my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_;
     my $start_page=      my $start_page=
  &Apache::loncommon::start_page($bodytitle,   &Apache::loncommon::start_page($bodytitle,
        '<script type="text/javascript">'.         '<script type="text/javascript">'.
        $jscript.'</script>',         $jscript.'</script>',
        {'function'    => $function,         {'add_entries' => $loaditems,});
  'add_entries' => $loaditems,});  
     my $output = <<"END";      my $output = <<"END";
 $start_page  $start_page
 <form method="POST" name="$state">  <form method="POST" name="$state">
Line 1056  sub onload_action { Line 1461  sub onload_action {
     }      }
     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')) {
                  $state eq 'pick_members')) {  
  $loaditems{'onload'} =    $loaditems{'onload'} = 
     'javascript:setFormElements(document.'.$state.')';      'javascript:setFormElements(document.'.$state.')';
     }      }
Line 1088  sub build_members_list { Line 1492  sub build_members_list {
 }  }
   
 sub group_files {  sub group_files {
     my ($group,$currdir,$numfiles,$numdirs) = @_;      my ($group,$portpath,$numfiles,$numdirs) = @_;
     my $dirptr=16384;      my $dirptr=16384;
     my @dir_list=&Apache::portfolio::get_dir_list($currdir,$group);      my @dir_list=&Apache::portfolio::get_dir_list($portpath,undef,$group);
     foreach my $line (@dir_list) {      foreach my $line (@dir_list) {
         my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);          my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);
         if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) {           if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) { 
             if ($dirptr&$testdir) {              if ($dirptr&$testdir) {
                 $currdir .= '/'.$filename;                  $portpath .= '/'.$filename;
                 $$numdirs ++;                  $$numdirs ++;
                 &group_files($numfiles,$numdirs)                  &group_files($group,$portpath,$numfiles,$numdirs)
             } else {              } else {
                 $$numfiles ++;                  $$numfiles ++;
             }              }
Line 1110  sub group_members { Line 1514  sub group_members {
     my ($cdom,$cnum,$group,$group_info) = @_;      my ($cdom,$cnum,$group,$group_info) = @_;
     my %memberhash = &Apache::lonnet::get_group_membership($cdom,$cnum,$group);      my %memberhash = &Apache::lonnet::get_group_membership($cdom,$cnum,$group);
     my $now = time;      my $now = time;
     my ($tmp)=keys(%memberhash);      my %lt = &Apache::lonlocal::texthash (
     if ($tmp=~/^error:/) {                                            active => 'active',
         $$group_info{'totalmembers'} = 'Unknown - an error occurred';                                            previous => 'previous',
         return $tmp;                                            future => 'future',
     }      );
       my %membercounts = (  
                            active => 0,
                            previous => 0,
                            future => 0,
                          );
     my $totalmembers = 0;      my $totalmembers = 0;
     my $active = 0;  
     my $previous = 0;  
     my $future = 0;  
     foreach my $member (keys %memberhash) {      foreach my $member (keys %memberhash) {
         $totalmembers ++;          $totalmembers ++;
         my ($end,$start) = split(/:/,$memberhash{$member});          my ($end,$start) = split(/:/,$memberhash{$member});
         unless ($start == -1) {          unless ($start == -1) {
             if (($end!=0) && ($end<$now)) {              if (($end!=0) && ($end<$now)) {
                 $previous ++;                  $membercounts{previous} ++;
             } elsif (($start!=0) && ($start>$now)) {              } elsif (($start!=0) && ($start>$now)) {
                 $future ++;                  $membercounts{future} ++;
             } else {              } else {
                $active ++;                  $membercounts{active} ++;
             }              }
         }          }
     }      }
     if ($totalmembers == 0) {      if ($totalmembers == 0) {
         $$group_info{$group}{'totalmembers'} = 'None';          $$group_info{$group}{'totalmembers'} = 'None';
     } else {      } else {
         $$group_info{$group}{'totalmembers'} = $active.' - active<br />'.$previous.' -previous<br />'.$future.' -future';          foreach my $type ('active','previous','future') {
               $$group_info{$group}{'totalmembers'} .= 
                  &open_list_window($group,$type,$membercounts{$type},$lt{$type});
           }
     }      }
     return 'ok';      return 'ok';
 }  }
   
   sub open_list_window {
       my ($group,$status,$count,$text) = @_;
       my $entry;
       if ($count > 0) {
           $entry = '<nobr><a href="javascript:openGroupRoster('.
                    "'$group','$status'".')">'.$text.'</a>&nbsp;-&nbsp;'.$count.
                    '</nobr><br />';
       } else {
           $entry = '<nobr>'.$text.'&nbsp;-&nbsp;'.$count.'</nobr><br />';
       }
       return $entry;
   }
   
   
 sub general_settings_form {  sub general_settings_form {
     my ($r,$cdom,$cnum,$action,$tabcol,$formname,$page,$functions,$tools,      my ($r,$cdom,$cnum,$action,$formname,$page,$functions,$tools,
         $toolprivs,$fixedprivs,$sectioncount,$stored,$states,$navbuttons,          $toolprivs,$fixedprivs,$sectioncount,$stored,$states,$navbuttons,
         $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_;          $gpterm,$ucgpterm,$crstype) = @_;
     my ($nexttext,$prevtext);      my ($nexttext,$prevtext);
     $r->print(' <br />      &groupsettings_options($r,$functions,$action,$formname,$stored,1,
  <table width="100%" cellpadding="0" cellspacing="0" border="0">  
 ');  
     &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1,  
                            $gpterm,$ucgpterm,$crstype);                             $gpterm,$ucgpterm,$crstype);
     $r->print('       &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
     &access_date_settings($r,$tabcol,$action,$formname,$stored,2,$gpterm,  
                           $ucgpterm);  
     $r->print('  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
     if ($action eq 'create') {      if ($action eq 'create') {
         &membership_options($r,$action,$formname,$tabcol,$sectioncount,3,          &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3,
                             $gpterm,$ucgpterm);                              $gpterm,$ucgpterm);
         $nexttext = $$navbuttons{'gtns'};          $nexttext = $$navbuttons{'gtns'};
     } else {      } else {
Line 1170  sub general_settings_form { Line 1580  sub general_settings_form {
         my @unavailable = ();          my @unavailable = ();
         &check_tools($functions,$tools,\@available,\@unavailable);          &check_tools($functions,$tools,\@available,\@unavailable);
         @{$tools} = sort(keys(%{$functions}));          @{$tools} = sort(keys(%{$functions}));
         &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action,          &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs,
                                3,$tools,$stored,$toolprivs,$fixedprivs,         $fixedprivs,\@available,$formname,
                                \@available,$formname,$gpterm,$ucgpterm);         $gpterm,$ucgpterm);
         $r->print('          &mapping_options($r,$action,$formname,$page,$sectioncount,
   <tr>                           $states,$stored,$navbuttons,4,5,
    <td colspan="4">&nbsp;</td>   $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
   </tr>');  
         &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount,  
                          $states,$stored,$navbuttons,4,5,$rowColor1,  
                          $rowColor2,$gpterm,$ucgpterm,$crstype);  
         $nexttext = $$navbuttons{'mose'};          $nexttext = $$navbuttons{'mose'};
     }      }
     $prevtext = $$navbuttons{'gtpp'};      $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                         $$states{$action}[$page+1],$nexttext);                          $$states{$action}[$page+1],$nexttext);
     $r->print('  
  </table>');  
     return;      return;
 }  }
   
 sub groupsettings_options {  sub groupsettings_options {
     my ($r,$tabcol,$functions,$action,$formname,$stored,$image,$gpterm,      my ($r,$functions,$action,$formname,$stored,$image,$gpterm,
         $ucgpterm,$crstype) = @_;          $ucgpterm,$crstype) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'gdat' => "$ucgpterm open and close dates",          'gdat' => "Group access start and end dates",
         'sten' => "Set a start date/time and end date/time for the $gpterm",          'gnde' => "Group name, title and available collaborative tools",
         'gfun' => "$ucgpterm functionality",          'desc' => 'Group Title',
         'gnde' => "$ucgpterm name, description and available functionality",          'func' => 'Collaborative Tools',
         'desc' => 'Description',          'gnam' => 'Group Name',
         'func' => 'Functionality',          'lett' => 'Letters, numbers and underscore only',
         'gnam' => "$ucgpterm Name",          'doyo' => 'Different subsets of the chosen collaborative tools '.
         'doyo' => "Do you want to assign different functionality ".                    'for different group members?',
                   "to different $gpterm members?",  
     );      );
     my $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'};      my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);
     if ($crsquota eq '') {      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}).'
         $crsquota = 20;       <table class="LC_descriptive_input">
     }  
     my $freespace = $crsquota - &Apache::longroup::sum_quotas();  
     my $maxposs = $$stored{'quota'} + $freespace;  
     &topic_bar($r,$tabcol,$image,$lt{'gnde'});  
     $r->print('  
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">  
      <table border="0" cellpadding="2" cellspacing="2">  
       <tr>        <tr>
        <td><b>'.$lt{'gnam'}.':</b></td>         <td class="LC_description">'.$lt{'gnam'}.':</td>
        <td colspan="5">         <td colspan="5">
 ');  ');
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print('<input type="text" name="groupname" size="25" />');          $r->print('<input type="text" name="groupname" size="25" />&nbsp;('.
                     $lt{'lett'}.')');
     } else {      } else {
         $r->print('<input type="hidden" name="groupname" value="'.          $r->print('<input type="hidden" name="groupname" value="'.
                          $env{'form.groupname'}.'" />'.$env{'form.groupname'});                           $env{'form.groupname'}.'" />'.$env{'form.groupname'});
Line 1230  sub groupsettings_options { Line 1625  sub groupsettings_options {
        </td>         </td>
       <tr>        <tr>
       <tr>        <tr>
        <td><b>$lt{'desc'}:</b></td>         <td class="LC_description">$lt{'desc'}:</td>
        <td colspan="5"><input type="text" name="description" size="40"         <td colspan="5"><input type="text" name="description" size="40"
                                                     value="" />                                                      value="" />
        </td>         </td>
       <tr>        <tr>
       <tr>        <tr>
        <td><b>$lt{'func'}:</b></td>         <td class="LC_description">$lt{'func'}:</td>
 END  END
     my $numitems = keys(%{$functions});      my $numitems = keys(%{$functions});
     my $halfnum = int($numitems/2);      my $halfnum = int($numitems/2);
Line 1251  END Line 1646  END
                    $$functions{$allfunctions[$i]}.'</label></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="'.&mt('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++) {
Line 1265  END Line 1660  END
     }      }
     $r->print('      $r->print('
        <td>         <td>
         <input type="button" value="uncheck all"          <input type="button" value="'.&mt('uncheck all').'"
           onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />            onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />
        </td>         </td>
       </tr>        </tr>
       <tr>        <tr>
        <td><b>'.&mt('Granularity:').'</b></td>         <td class="LC_description">'.&mt('Granularity:').'</td>
        <td colspan="10">'.$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>');         <td colspan="10">'.$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'}).')');                                        &mt($$stored{'granularity'})).')');
     }      }
     $r->print('      $r->print('
        </td>         </td>
       </tr>        </tr>
       <tr>        <tr>
        <td valign="top">'.&mt('<b>Disk quota:</b> ').'</td><td colspan="10">');         <td class="LC_description">'.&mt('Disk quota: ').'</td><td colspan="10">');
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print(&mt('If you enable the file repository for the [_1], allocate a disk quota.',$gpterm));          $r->print(&mt('If you enable the file repository for the '.$gpterm.', allocate a disk quota.'));
     } else {      } else {
         $r->print(&mt('Quota allocated to file repository:'));          $r->print(&mt('Quota allocated to file repository:'));
     }       } 
     $r->print('&nbsp;<input type="text" name="quota" size="4" />Mb');      $r->print('&nbsp;'.&mt('[_1] Mb','<input type="text" name="quota" size="4" />'));
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print('<br />'.          $r->print('<br />'
                   &mt('A total of [_1] Mb is shared between all [_2]s in the '.                   .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the '
                   '[_3], and [_4] Mb are currently unallocated.',$crsquota,                       .lc($crstype).', and [_2] Mb are currently unallocated.'
                   $gpterm,lc($crstype),$freespace));                       ,$crsquota,sprintf("%.2f",$freespace))
                    );
     } else {      } else {
         $r->print('&nbsp;&nbsp;('.&mt('The quota is currently [_1] Mb',          $r->print('&nbsp;&nbsp;('.&mt('The quota is currently [_1] Mb',
                                       $$stored{'quota'}).').');                                        $$stored{'quota'}).').');
   
         $r->print('<br />'.&mt('The quota can be increased to [_1] Mb, '.          $r->print('<br />'
                   'by adding all unallocated space for [_2]s in the [_3].',                   .&mt('The quota can be increased to [_1] Mb, '
                   $maxposs,$gpterm,lc($crstype)));                   .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.'
                     ,sprintf("%.2f",$maxposs)));
     }      }
     $r->print('      $r->print('
        </td>         </td>
       </tr>        </tr>
      </table>       </table>
     </td>  
    </tr>  
 ');  ');
     return;      return;
 }  }
   
   sub get_quota_constraints {
       my ($action,$stored) = @_;
       my ($crsquota,$freespace,$maxposs); 
       $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'};
       if ($crsquota eq '') {
           $crsquota = 20;
       }
       $freespace = $crsquota - &Apache::longroup::sum_quotas();
       if ($action eq 'create') {
           $maxposs = $freespace;
       } else {
           $maxposs = $$stored{'quota'} + $freespace;
       }
       return ($crsquota,$freespace,$maxposs);
   }
   
 sub membership_options {  sub membership_options {
     my ($r,$action,$state,$tabcol,$sectioncount,$image,$gpterm,$ucgpterm) = @_;      my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'pipa' => 'Pick parameters to generate membership list',                  'pipa' => 'Build a list of users for selection of group members',
                 'gmem' => "$ucgpterm membership options",                  'gmem' => "Group membership selection list criteria:",
                 'picr' => 'Pick the criteria to use to build a list of '.                  'picr' => 'Pick the criteria to use to build a list of '.
                           lc($crstype).' users from which you will select ',                            lc($crstype).' users from which you will select ',
                 'meof' => "members of the new $gpterm.",                  'meof' => "members of the new group.",
                 'admg' => "additional members of the $gpterm.",                  '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 $gpterm, do not make any selections.",                            "create the group, there is no need to pick any criteria.",
                 'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of $gpterm members triggered by specified role and section changes.",                  'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section <i>changes</i> in the course.",
                 'acty' => 'Access types',                  'acty' => 'Access types',
                 'coro' => $crstype.' roles',                  'coro' => $crstype.' roles',
                 'cose' => $crstype.' sections',                  'cose' => $crstype.' sections',
Line 1333  sub membership_options { Line 1744  sub membership_options {
                    future => &mt('Will have future access'),                     future => &mt('Will have future access'),
                    );                     );
   
     #FIXME need to plumb around for the various cr roles defined by the user      my @roles = ('st','cc','in','ta','ep','cr');
     my @roles = ('st','cc','in','ta','ep');  
   
     my @sections = keys(%{$sectioncount});      my @sections = keys(%{$sectioncount});
   
     &topic_bar($r,$tabcol,$image,$lt{'pipa'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
     $r->print('       <b>'.$lt{'gmem'}.'</b><br />'.$lt{'picr'});
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">  
      <b>'.$lt{'gmem'}.'</b><br/>'.$lt{'picr'});  
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});          $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});
     } else {      } else {
Line 1352  sub membership_options { Line 1758  sub membership_options {
     $r->print('      $r->print('
      <br />       <br />
      <br />       <br />
      <table border="0">       <table class="LC_status_selector">
       <tr>        <tr>
        <td><b>'.$lt{'acty'}.'</b></td>         <th>'.$lt{'acty'}.'</th>
        <td>&nbsp;</td>         <th>'.$lt{'coro'}.'</th>
        <td><b>'.$lt{'coro'}.'</b></td>');         <th>'.$lt{'cose'}.'</th>
     if (@sections >0) {        </tr><tr><td>');
         $r->print('  
        <td>&nbsp;</td>  
        <td><b>'.$lt{'cose'}.'</b></td>  
        <td>&nbsp;</td>');  
     }  
     $r->print('</tr><tr>');  
     $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types));      $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types));
     $r->print('<td>&nbsp;</td>');      $r->print('</td><td>');
     $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));      $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles,undef,undef,1,$cdom,$cnum));
     if (@sections > 0) {      if (@sections > 0) {
         @sections = sort {$a cmp $b} @sections;          @sections = sort {$a cmp $b} @sections;
         unshift(@sections,'none'); # 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
         $r->print('<td>&nbsp;</td>      } else {
                    <td colspan="3" align="center" valign="top">'.          @sections = ('all','none');
         &sections_selection(\@sections,'sectionpick').'</td>');  
     }      }
     $r->print('      $r->print('</td><td>'.
                 &sections_selection(\@sections,'sectionpick').'</td>
       </tr>        </tr>
      </table>       </table>');
     </td>  
    </tr>');  
     return;      return;
 }  }
   
Line 1392  sub sections_selection { Line 1790  sub sections_selection {
     }      }
     foreach my $sec (@{$sections}) {      foreach my $sec (@{$sections}) {
         if ($sec eq 'all') {          if ($sec eq 'all') {
             $section_sel .= '  <option value="'.$sec.'" selected="selected">'.&mt('all sections').'</option>'."\n";              $section_sel .= '  <option value="'.$sec.'">'.&mt('all sections').'</option>'."\n";
         } elsif ($sec eq 'none') {          } elsif ($sec eq 'none') {
             $section_sel .= '  <option value="'.$sec.'">'.&mt('no section').'</option>'."\n";               $section_sel .= '  <option value="'.$sec.'">'.&mt('no section').'</option>'."\n"; 
         } else {          } else {
Line 1407  sub sections_selection { Line 1805  sub sections_selection {
 }  }
   
 sub access_date_settings {  sub access_date_settings {
     my ($r,$tabcol,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;      my ($r,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;
     my %lt = &Apache::lonlocal::texthash(      my $sten = &mt("Default start and end dates for $gpterm access");
                 'sten' => "Default start and end dates for $gpterm access",  
              );  
     my $starttime = time;      my $starttime = time;
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx      my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
     if ($action eq 'modify') {      if ($action eq 'modify') {
Line 1419  sub access_date_settings { Line 1815  sub access_date_settings {
             $endtime = $$stored{'enddate'};              $endtime = $$stored{'enddate'};
         }          }
     }      }
     my ($start_table,$end_table) = &date_setting_table      my ($table) = &date_setting_table($starttime,$endtime,$formname);
                                     ($starttime,$endtime,$formname);      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$sten).'
     &topic_bar($r,$tabcol,$image,$lt{'sten'});      '.$table.'
     $r->print('      ');
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">'.$start_table.'</td>  
    <tr>  
    <tr>  
     <td colspan="4">&nbsp;</td>  
    </tr>  
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">'.$end_table.'</td>  
    <tr>');  
     return;      return;
 }  }
   
 sub choose_members_form {  sub choose_members_form {
     my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description,      my ($r,$cdom,$cnum,$action,$formname,$page,$groupname,$description,
         $granularity,$quota,$startdate,$enddate,$tools,$fixedprivs,$toolprivs,          $granularity,$quota,$startdate,$enddate,$tools,$fixedprivs,$toolprivs,
         $functions,$users,$userdata,$idx,$stored,$states,$navbuttons,          $functions,$users,$userdata,$idx,$stored,$states,$navbuttons,
         $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_;          $gpterm,$ucgpterm,$crstype) = @_;
     my @regexps = ('user_','userpriv_','sec_');      my @regexps = ('user_','userpriv_','sec_');
     my %origmembers;      my %origmembers;
     $r->print(&Apache::lonhtmlcommon::echo_form_input(      $r->print(&Apache::lonhtmlcommon::echo_form_input(
Line 1450  sub choose_members_form { Line 1835  sub choose_members_form {
          \@regexps));           \@regexps));
     my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,      my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,
                                        $ucgpterm,$crstype);                                         $ucgpterm,$crstype);
     $r->print('  
 <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
 ');  
     if ($earlyout) {      if ($earlyout) {
         $r->print($earlyout.'</td></tr>');   $r->print($earlyout);
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],          &display_navbuttons($r,$formname,$$states{$action}[$page-1],
                            $$navbuttons{'gtps'});                             $$navbuttons{'gtps'});
         $r->print('</table>');  
         return;          return;
     }       } 
     my ($specimg,$memimg);      my ($specimg,$memimg);
Line 1468  sub choose_members_form { Line 1846  sub choose_members_form {
     my @unavailable = ();      my @unavailable = ();
     &check_tools($functions,$tools,\@available,\@unavailable);      &check_tools($functions,$tools,\@available,\@unavailable);
     if ($action eq 'create') {      if ($action eq 'create') {
         &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,          &print_current_settings($r,$action,$functions,$startdate,$enddate,
                                 $functions,$startdate,$enddate,$groupname,   $groupname,$description,$granularity,$quota,
                                 $description,$granularity,$quota,\@available,   \@available,\@unavailable,$gpterm,$ucgpterm);
                                 \@unavailable,$gpterm,$ucgpterm);  
         $specimg = 4;          $specimg = 4;
         $memimg = 5;          $memimg = 5;
     } else {      } else {
Line 1491  sub choose_members_form { Line 1868  sub choose_members_form {
             }              }
         }          }
     }      }
     &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action,      &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,
                           $specimg,$tools,$stored,$toolprivs,  
                           $fixedprivs,\@available,$formname,$gpterm,$ucgpterm);                            $fixedprivs,\@available,$formname,$gpterm,$ucgpterm);
     my $newusers = &pick_new_members($r,$action,$formname,$tabcol,$rowColor1,      my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx,
                                     $rowColor2,\@available,$idx,$stored,       $stored,$memimg,$users,$userdata,
                                     $memimg,$users,$userdata,$granularity,       $granularity,\%origmembers,$gpterm,
                                     \%origmembers,$gpterm,$ucgpterm);       $ucgpterm);
     if ($newusers || $action eq 'create') {      if ($newusers || $action eq 'create') {
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],          &display_navbuttons($r,$formname,$$states{$action}[$page-1],
                             $$navbuttons{'gtps'},$$states{$action}[$page+1],                              $$navbuttons{'gtps'},$$states{$action}[$page+1],
Line 1506  sub choose_members_form { Line 1882  sub choose_members_form {
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],          &display_navbuttons($r,$formname,$$states{$action}[$page-1],
                             $$navbuttons{'gtps'});                              $$navbuttons{'gtps'});
     }      }
     $r->print('</table>');  
     return;      return;
 }  }
   
 sub display_navbuttons {  sub display_navbuttons {
     my ($r,$formname,$prev,$prevtext,$next,$nexttext) = @_;      my ($r,$formname,$prev,$prevtext,$next,$nexttext) = @_;
     $r->print('      $r->print('<div class="LC_navbuttons">');
     <tr>  
      <td colspan="4">&nbsp;</td>  
     </tr>  
     <tr>  
      <td>&nbsp;</td>  
      <td colspan="3">');  
     if ($prev) {      if ($prev) {
         $r->print('          $r->print('
       <input type="button" name="previous" value = "'.$prevtext.'"        <input type="button" name="previous" value = "'.$prevtext.'"
     onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/>      onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/>
    &nbsp;&nbsp;&nbsp;');     &nbsp;&nbsp;&nbsp;');
       } elsif ($prevtext) {
           $r->print('
         <input type="button" name="previous" value = "'.$prevtext.'"
       onclick="javascript:history.back()"/>
      &nbsp;&nbsp;&nbsp;');
     }      }
     if ($next) {      if ($next) {
         $r->print('          $r->print('
       <input type="button" name="next" value="'.$nexttext.'"        <input type="button" name="next" value="'.$nexttext.'"
  onclick="javascript:nextPage(document.'.$formname.','."'".$next."'".')" />');   onclick="javascript:nextPage(document.'.$formname.','."'".$next."'".')" />');
     }      }
     $r->print('      $r->print('</div>');
      </td>  
     </tr>  
 ');  
 }  }
   
 sub check_tools {  sub check_tools {
Line 1549  sub check_tools { Line 1920  sub check_tools {
 }  }
   
 sub print_current_settings {  sub print_current_settings {
     my ($r,$action,$tabcol,$rowColor1,$rowColor2,$functions,$startdate,$enddate,      my ($r,$action,$functions,$startdate,$enddate,$groupname,$description,
         $groupname,$description,$granularity,$quota,$available,$unavailable,   $granularity,$quota,$available,$unavailable,$gpterm,$ucgpterm) = @_;
         $gpterm,$ucgpterm) = @_;  
   
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         grna => "$ucgpterm Name",          grna => 'Group Name',
         desc => 'Description',          desc => 'Group Title',
         grfn => "$ucgpterm Functions",          grfn => "Collaborative Tools",
         gran => 'Granularity',          gran => 'Granularity',
         quot => 'File quota',          quot => 'File quota',
         dfac => 'Default access dates',          dfac => 'Default access dates',
         ygrs => "Your $gpterm selections",          ygrs => "Your group selections - ",
         tfwa => "The following settings will apply to the $gpterm:",          tfwa => "The following settings will apply to the group:",
         difn => 'Different functionality<br />for different members:',          difn => 'Different collaborative tools<br />for different members:',
         stda => 'Start date',          stda => 'Start date:',
         enda => 'End date:',          enda => 'End date:',
     );      );
     my $showstart = &Apache::lonlocal::locallocaltime($startdate);      my $showstart = &Apache::lonlocal::locallocaltime($startdate);
Line 1573  sub print_current_settings { Line 1943  sub print_current_settings {
     } else {      } else {
         $showend = &Apache::lonlocal::locallocaltime($enddate);          $showend = &Apache::lonlocal::locallocaltime($enddate);
     }      }
     $r->print('<table border="0" cellpadding="0" cellspacing="20">');  
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print('          $r->print('
 <tr>  <div><span style="font-size: larger">'.$lt{'ygrs'}.'</span>
  <td><font face="arial,helvetica,sans-serif"><b>'.$lt{'ygrs'}.'</b></font>  
 <br />'.$lt{'tfwa'}.'  <br />'.$lt{'tfwa'}.'
  </td>  </div>');
 </tr>');  
     }      }
     $r->print('<tr><td>');      $r->print(&Apache::loncommon::start_data_table('LC_course_group_status').
     $r->print(&Apache::lonhtmlcommon::start_pick_box());        &Apache::loncommon::start_data_table_header_row());
     $r->print('      $r->print('
 <tr>    <th>'.$lt{'grna'}.'</th>
  <td>    <th>'.$lt{'desc'}.'</th>
 <table cellspacing="1" cellpadding="4">    <th>'.$lt{'grfn'}.'</th>
  <tr bgcolor="'.$tabcol.'" align="center">    <th>'.$lt{'gran'}.'</th>
   <td><b>'.$lt{'grna'}.'</b></td>    <th>'.$lt{'quot'}.'</th>
   <td><b>'.$lt{'desc'}.'</b></td>    <th>'.$lt{'dfac'}.'</th>
   <td><b>'.$lt{'grfn'}.'</b></td>  ');
   <td><b>'.$lt{'gran'}.'</b></td>      $r->print(&Apache::loncommon::end_data_table_header_row().
   <td><b>'.$lt{'quot'}.'</b></td>        &Apache::loncommon::start_data_table_row('LC_data_table_dense'));
   <td><b>'.$lt{'dfac'}.'</b></td>      $r->print('
  </tr>    <td valign="top">'.$groupname.'</td>
  <tr bgcolor="'.$rowColor2.'">    <td valign="top">'.$description.'</td>
   <td valign="top"><small>'.$groupname.'</small></td>  
   <td valign="top"><small>'.$description.'</small></td>  
   <td>    <td>
 ');  ');
     if (@{$available} > 0) {      if (@{$available} > 0) {
         $r->print('<small><b>Available:</b></small>          $r->print('<b>'.&mt('Available for assignment to members:').'</b>'.
                     <table cellpadding="" cellspacing="1"><tr>');                      '<table class="LC_group_priv"><tr>');
         my $rowcell = int(@{$available}/2) + @{$available}%2;          my $rowcell = int(@{$available}/2) + @{$available}%2;
         for (my $i=0; $i<@{$available}; $i++) {          for (my $i=0; $i<@{$available}; $i++) {
             if (@{$available} > 3) {              if (@{$available} > 3) {
Line 1611  sub print_current_settings { Line 1976  sub print_current_settings {
                     $r->print('</tr><tr>');                      $r->print('</tr><tr>');
                 }                  }
             }              }
             $r->print('<td><small>'.$$functions{$$available[$i]}.              $r->print('<td>'.$$functions{$$available[$i]}.
                                           '</small></td><td>&nbsp;</td>');        '</td><td>&nbsp;</td>');
         }          }
         if ((@{$available} > 3) && (@{$available}%2)) {          if ((@{$available} > 3) && (@{$available}%2)) {
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');              $r->print('<td>&nbsp;</td><td>&nbsp;</td>');
Line 1620  sub print_current_settings { Line 1985  sub print_current_settings {
         $r->print('</tr></table><br />');          $r->print('</tr></table><br />');
     }      }
     if (@{$unavailable} > 0) {      if (@{$unavailable} > 0) {
         $r->print('<small><b>Unavailable:</b></small>          $r->print('<b>'.&mt('Unavailable for assignment:').'</b>'.
                     <table cellpadding="0" cellspacing="1"  border="0"><tr>');                      '<table class="LC_group_priv"><tr>');
         my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;          my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;
         for (my $j=0; $j<@{$unavailable}; $j++) {          for (my $j=0; $j<@{$unavailable}; $j++) {
             if (@{$unavailable} > 3) {              if (@{$unavailable} > 3) {
Line 1629  sub print_current_settings { Line 1994  sub print_current_settings {
                     $r->print('</tr><tr>');                      $r->print('</tr><tr>');
                 }                  }
             }              }
             $r->print('<td><small>'.$$functions{$$unavailable[$j]}.              $r->print('<td>'.$$functions{$$unavailable[$j]}.
                                               '</small></td><td>&nbsp;</td>');        '</td><td>&nbsp;</td>');
         }          }
         if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {          if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');              $r->print('<td>&nbsp;</td><td>&nbsp;</td>');
         }          }
         $r->print('</tr></table>');          $r->print('</tr></table>');
     }      }
       my $quota_text=&mt('[_1] Mb',$quota);
       my $granu_text=&mt($granularity);
     $r->print(<<"END");      $r->print(<<"END");
   </td>    </td>
   <td valign="top"><small><b>$lt{'difn'}    <td valign="top"><b>$lt{'difn'}</b> $granu_text</td>
   </b> $granularity</small></td>    <td valign="top">$quota_text</td> 
   <td valign="top"><small>$quota Mb</small></td>     <td valign="top"><b>$lt{'stda'}</b> $showstart<br />
   <td valign="top"><small><b>$lt{'stda'}</b> $showstart<br />        <b>$lt{'enda'}</b> $showend
       <b>$lt{'enda'}</b> $showend</small>  
   </td>    </td>
  </tr>  
 </table>  
 </td>  
 </tr>  
 END  END
     $r->print(&Apache::lonhtmlcommon::end_pick_box());      $r->print(&Apache::loncommon::end_data_table_row().
     $r->print('</td></tr></table><br />');        &Apache::loncommon::end_data_table());
     return;      return;
 }  }
   
 sub pick_new_members {  sub pick_new_members {
     my ($r,$action,$formname,$tabcol,$rowColor1,$rowColor2,$available,$idx,      my ($r,$action,$formname,$available,$idx,$stored,$img,$users,$userdata,
         $stored,$img,$users,$userdata,$granularity,$origmembers,$gpterm,   $granularity,$origmembers,$gpterm,$ucgpterm) = @_;
         $ucgpterm) = @_;  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
           'gpme' => "$ucgpterm membership",            'gpme' => "Group membership",
           'addm' => 'Add members',            'addm' => 'Add members',
           'setf' => 'Set functionality',            'setf' => 'Assign collaborative tools', 
           'func' => 'Functionality',            'func' => 'Tools',
           'nome' => 'No members to add at this time.',            'nome' => 'No members to add at this time, as there are no users '.
                        'matching the specified type(s), role(s) and section(s).',
           'nnew' => "There are no users to add as new members, as all users".            'nnew' => "There are no users to add as new members, as all users".
                     " matching the specified type(s), role(s), and/or ".                      " matching the specified type(s), role(s), and ".
                     "section(s) are already affiliated with this $gpterm.",                      "section(s) are already affiliated with this group.",
           'yoma' =>  'You may need to use the '."'".'modify existing, past or '.            'yoma' =>  "You may need to use the 'modify existing, past or ".
                      'future members'."'".' page if you need to re-enable '.                       "future members' page if you need to re-enable ".
                      'or activate access for previous or future members.',                       "or activate access for previous or future members.",
     );      );
     my %members;      my %members;
     my $totalusers = 0;      my $totalusers = 0;
Line 1694  sub pick_new_members { Line 2056  sub pick_new_members {
             $r->print(&check_uncheck_tools($r,$available));              $r->print(&check_uncheck_tools($r,$available));
         }          }
     }      }
     &topic_bar($r,$tabcol,$img,$lt{'gpme'});      $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'gpme'}));
     if (keys(%members) > 0) {      if (keys(%members) > 0) {
         $r->print('          $r->print('
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
     <table>      <table>
      <tr>');       <tr>');
         &check_uncheck_buttons($r,$formname,'member',$lt{'addm'});          &check_uncheck_buttons($r,$formname,'member',$lt{'addm'});
         if (@{$available} > 0 && $granularity eq 'Yes') {          if (@{$available} > 0 && $granularity eq 'Yes') {
             $r->print('<td><nobr>              $r->print('<td>
      <fieldset><legend><b>'.$lt{'setf'}.'</b></legend>       <fieldset><legend><b>'.$lt{'setf'}.'</b></legend>
       <input type="button" value="check all"        <nobr>
         <input type="button" value="'.&mt('check all').'"
         onclick="javascript:checkAllTools(document.'.$formname.')" />          onclick="javascript:checkAllTools(document.'.$formname.')" />
         &nbsp;&nbsp;          &nbsp;&nbsp;
       <input type="button" value="uncheck all"        <input type="button" value="'.&mt('uncheck all').'"
         onclick="javascript:uncheckAllTools(document.'.$formname.')" />          onclick="javascript:uncheckAllTools(document.'.$formname.')" />
      </fieldset></nobr></td>');        </nobr>
        </fieldset></td>');
         }          }
         $r->print('</tr></table>          $r->print('</tr></table>
   </td>  
  </tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
         ');          ');
         $r->print(&Apache::lonhtmlcommon::start_pick_box());          $r->print(&Apache::loncommon::start_data_table().
     &Apache::loncommon::start_data_table_header_row());
         $r->print('          $r->print('
    <table border="0" cellpadding="4" cellspacing="1">       <th>'.&mt('Add?').'</b></td>
     <tr bgcolor="'.$tabcol.'" align="center">       <th><a href="javascript:changeSort('."'fullname'".')">'.&mt('Name').'</a></td>
      <td><b>'.&mt('Add?').'</b></td>       <th><a href="javascript:changeSort('."'username'".')">'.&mt('Username').'</a></td>
      <td><b><a href="javascript:changeSort('."'fullname'".')">'.&mt('Name').'</a></b></td>       <th><a href="javascript:changeSort('."'domain'".')">'.&mt('Domain').'</a></td>
      <td><b><a href="javascript:changeSort('."'username'".')">'.&mt('Username').'</a></b>       <th><a href="javascript:changeSort('."'id'".')">'.&mt('ID').'</a></td>
      </td>       <th><a href="javascript:changeSort('."'section'".')">'.&mt('Section').'</a></td>
      <td><b><a href="javascript:changeSort('."'domain'".')">'.&mt('Domain').'</a></b></td>  
      <td><b><a href="javascript:changeSort('."'id'".')">ID</a></b></td>  
      <td><b><a href="javascript:changeSort('."'section'".')">Section</a></b></td>  
 ');  ');
         if (@{$available} > 0) {          if (@{$available} > 0) {
             $r->print('<td><b>'.$lt{'func'}.'</b></td>');              $r->print('<th>'.$lt{'func'}.'</th>');
         }          }
         $r->print('</tr>');          $r->print(&Apache::loncommon::end_data_table_header_row());
         if (@{$available} > 0) {          if (@{$available} > 0) {
             if ($granularity eq 'Yes') {              if ($granularity eq 'Yes') {
                 $r->print('<tr bgcolor="#cccccc">                  $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
  <td colspan="6">&nbsp;</td>   <td colspan="6">&nbsp;</td>
  <td align="center"><small><nobr><b>'.&mt('All:').'</b>&nbsp;');   <td align="center"><nobr><b>'.&mt('All:').'</b>&nbsp;');
                 foreach my $tool (@{$available}) {                  foreach my $tool (@{$available}) {
                     $r->print('<label><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);"'.
    ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');     ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');
                 }                  }
                 $r->print('</nobr></small></td></tr>');                  $r->print('</nobr></td></tr>');
             }              }
         }          }
         my %Sortby = ();          my %Sortby = ();
Line 1768  sub pick_new_members { Line 2119  sub pick_new_members {
                 push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user);                  push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user);
             }              }
         }          }
         my $rowNum = 0;  
         my $rowColor;  
         foreach my $key (sort(keys(%Sortby))) {          foreach my $key (sort(keys(%Sortby))) {
             foreach my $user (@{$Sortby{$key}}) {              foreach my $user (@{$Sortby{$key}}) {
                 if ($rowNum %2 == 1) {  
                     $rowColor = $rowColor1;  
                 } else {  
                     $rowColor = $rowColor2;  
                 }  
                 my $id = $members{$user}[$$idx{id}];                  my $id = $members{$user}[$$idx{id}];
                 my $fullname = $members{$user}[$$idx{fullname}];                  my $fullname = $members{$user}[$$idx{fullname}];
                 my $udom = $members{$user}[$$idx{udom}];                  my $udom = $members{$user}[$$idx{udom}];
                 my $uname = $members{$user}[$$idx{uname}];                  my $uname = $members{$user}[$$idx{uname}];
                 my $section = $members{$user}[$$idx{section}];                  my $section = $members{$user}[$$idx{section}];
                 $r->print('<tr bgcolor="'.$rowColor.'"><td align="right">                  $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
    <input type="checkbox" name="member" value="'.$user.'" /></td><td><small>'.    '<td align="right"><input type="checkbox" name="member" value="'.$user.'" /></td>'.
     $fullname.'</small></td><td><small>'.$uname.'</small></td><td><small>'.    '<td>'.$fullname.'</td>'.
     $udom.'</small></td><td><small>'.$id.'</small></td>'.    '<td>'.$uname.'</td>'.
   '<td><small>'.$section.'</small></td>');    '<td>'.$udom.'</td>'.
     '<td>'.$id.'</td>'.
     '<td>'.$section.'</td>');
                 if (@{$available} > 0) {                  if (@{$available} > 0) {
                     $r->print('<td align="center"><nobr><small>'.                      $r->print('<td align="center"><nobr>'.
                               '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');                                '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
                     foreach my $tool (@{$available}) {                      foreach my $tool (@{$available}) {
                         if ($granularity eq 'Yes') {                          if ($granularity eq 'Yes') {
Line 1799  sub pick_new_members { Line 2145  sub pick_new_members {
                           $tool.'" value="'.$user.'" />'.$tool.'&nbsp;&nbsp;&nbsp;');                            $tool.'" value="'.$user.'" />'.$tool.'&nbsp;&nbsp;&nbsp;');
                         }                          }
                     }                      }
                     $r->print('</small></nobr></td>');                      $r->print('</nobr></td>');
                 }                  }
                 $r->print('</tr>'."\n");                  $r->print(&Apache::loncommon::end_data_table_row()."\n");
                 $rowNum ++;  
             }              }
         }          }
         $r->print(&Apache::lonhtmlcommon::end_pick_box());          $r->print(&Apache::loncommon::end_data_table());
         $r->print('  
      </td>  
     </tr>');  
     } else {      } else {
         $r->print('  
     <tr>  
      <td>&nbsp;</td>  
      <td colspan="3">  
 ');  
         if ($totalusers > 0) {          if ($totalusers > 0) {
             $r->print($lt{'nnew'}.'<br /><br />'.$lt{'yoma'});              $r->print($lt{'nnew'}.'<br /><br />'.$lt{'yoma'});
         } else {           } else { 
             $r->print($lt{'nome'});              $r->print($lt{'nome'});
         }          }
         $r->print('  
      </td>  
     </tr>');  
     }      }
     return $newusers;      return $newusers;
 }  }
   
 sub privilege_specificity {  sub privilege_specificity {
     my ($r,$tabcol,$rowColor1,$rowColor2,$action,$img,$tools,$stored,      my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,
         $toolprivs,$fixedprivs,$available,$formname,$gpterm,$ucgpterm) = @_;   $formname,$gpterm,$ucgpterm) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
       'uprv' => 'User privileges',        'uprv' => 'User privileges for collaborative tools',
       'frty' => 'For each type of functionality you have chosen to include, '.        'frty' => 'For each collaborative tool you have chosen to include, '.
                 'there is a set of standard privileges which apply to all '.                  'there is a set of core privileges which all group members '.
                 'of those for whom the functionality is enabled.',                  'assigned use of the tool will receive.',
       'thar' => 'There are also additional privileges which can be set for '.        'thar' => 'For some tools there are also additional optional '.
                 'some, or all, members. Please choose one of the following:',                   'privileges which can be set.',
       'fort' => 'For the types of functionality you have chosen to include '.        'plch' => 'Choose one of the following:',
                 'there are no additional privileges which can be set for some '.        'fort' => 'For the collaborative tools you have chosen to include '.
                 'or all members.',                  'only core privileges are available, '.
       'eaty' => 'Each of the types of functionality includes standard '.                  'so there are no optional privileges to assign.',
                 'privileges which apply to members with access to that '.        'eaty' => 'Each collaborative tool includes core '.
                 'functionality, and may also include additional privileges '.                  'privileges assigned to all members with access to the '.
                   'tool. Some tools may also feature additional privileges '.
                 'which can be set for specific members.',                  'which can be set for specific members.',
       'cutg' => "Currently the $gpterm is configured ",        'cutg' => 'Currently the group is configured ',
       'sdif' => "so different $gpterm members can receive different privileges.",        'sdif' => 'so different members can receive different optional privileges for a particular tool.',
       'sall' => "so all $gpterm members will receive the same privileges.",        'sall' => 'so all members will receive the same optional privileges for a particular tool.',
       'algm' => "All $gpterm members will receive the same privileges.",        'algm' => 'All group members will receive the same privileges for any tool assigned to them, including the default set of optional privileges.',
       'smgp' => "Some $gpterm members will receive different privileges from ".        'smgp' => 'Different group members may receive different privileges from '.
                 "others.",                  'others for the tools they have been assigned.',
       'thwi' => "These will be the privileges all $gpterm members receive, ".         'thwi' => 'These will be the privileges all group members receive for a particular assigned tool, '. 
                 "if you selected the first option above.",                  'if you selected the first option above.',
       'thes' => "These will be the privileges given to members assigned ".           'thes' => "These will be the privileges given to members assigned ".   
                 "in the future, including via automatic $gpterm assignment ".                  "in the future via automatic group assignment ".
                 "for specific sections/roles ",                  "for users who receive specific sections/roles in the course ",
       'asyo' => "As you have chosen not to include any functionality in the ".        'asyo' => "As you have chosen not to include any collaborative tools ".
                 "$gpterm, no default user privileges settings need to be set.",                  "in the group, no default optional privileges need to be set.",
       'plin' => 'Please indicate which <b>optional</b> privileges members '.        'plin' => 'Indicate which <b>optional</b> privileges members '.
                 'will receive by default.',                  'will receive by default for a specific tool.',
       'oppr' => 'Optional privileges',        'oppr' => 'Optional privileges',
       'defp' => 'The default privileges new members will receive are:',         'defp' => 'The default privileges new members will receive are:', 
     );      );
Line 1870  sub privilege_specificity { Line 2205  sub privilege_specificity {
             }              }
         }          }
     }      }
     &topic_bar($r,$tabcol,$img,$lt{'uprv'});      $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'uprv'}));
     $r->print('  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
   ');  
     if ((($action eq 'create') && (@{$available} > 0)) ||       if ((($action eq 'create') && (@{$available} > 0)) || 
         (($action eq 'modify') && ($formname eq 'change_settings'))) {            (($action eq 'modify') && ($formname eq 'change_settings'))) {
         my %specific = (          my %specific = (
                       'No'  => 'checked="checked"',                        'No'  => 'checked="checked"',
                       'Yes' => '',                        'Yes' => '',
Line 1885  sub privilege_specificity { Line 2215  sub privilege_specificity {
         if ($action eq 'create') {          if ($action eq 'create') {
             $r->print($lt{'frty'}.'<br />');              $r->print($lt{'frty'}.'<br />');
             if ($totaloptionalprivs) {              if ($totaloptionalprivs) {
                 $r->print($lt{'thar'});                  $r->print($lt{'thar'}.'<br /><br />'.$lt{'plch'});
             } else {              } else {
                 $r->print($lt{'fort'});                  $r->print($lt{'fort'});
             }              }
Line 1901  sub privilege_specificity { Line 2231  sub privilege_specificity {
         }          }
         if ($totaloptionalprivs) {          if ($totaloptionalprivs) {
             $r->print('              $r->print('
 <br /><br /><label><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr></label><br/>  <br />
 <label><nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr></label>  <label><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr></label><br />
   </td>  <label><nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr></label><br /><br />');
  </tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>');  
         } else {          } else {
             $r->print('<input type="hidden" name="specificity" value="No" />');              $r->print('<input type="hidden" name="specificity" value="No" />');
         }          }
         if ($totaloptionalprivs) {          if ($totaloptionalprivs) {
             $r->print('              $r->print($lt{'plin'});
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">'.$lt{'plin'});  
             if ($action eq 'create') {              if ($action eq 'create') {
                 $r->print(' '.$lt{'thwi'});                  $r->print('<br />'.$lt{'thwi'});
             }              }
             $r->print('<br />'.$lt{'thes'});              $r->print('<br />'.$lt{'thes'});
             if ($action eq 'create') {              if ($action eq 'create') {
Line 1926  sub privilege_specificity { Line 2249  sub privilege_specificity {
                 $r->print('('.&mt('if enabled below').').');                  $r->print('('.&mt('if enabled below').').');
             }              }
             $r->print('<br /><br />              $r->print('<br /><br />
   </td>    <table><tr>');
  </tr>  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="2"><table><tr>');  
         &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});          &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});
         $r->print('          $r->print('
     </tr>      </tr>
    </table>     </table>
   </td>  
   <td width="100%">&nbsp;</td>  
  </tr><tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
    <br />     <br />
 ');  ');
         } else {          } else {
             $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'algm'}.'<br /><br />');              $r->print($lt{'algm'}.'<br /><br />');
         }          }
         &default_privileges($r,$action,$tabcol,$rowColor1,$rowColor2,          &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs,
                             $tools,$toolprivs,$fixedprivs,$available);      $available);
     } else {      } else {
         if ($action eq 'create') {          if ($action eq 'create') {
             $r->print($lt{'asyo'});              $r->print($lt{'asyo'});
               $r->print('<input type="hidden" name="specificity" value="No" />');
         } elsif ($action eq 'modify' && $formname eq 'pick_members') {          } elsif ($action eq 'modify' && $formname eq 'pick_members') {
             my @defprivs;              my @defprivs;
             if (ref($$stored{'defpriv'}) eq 'ARRAY') {              if (ref($$stored{'defpriv'}) eq 'ARRAY') {
Line 1962  sub privilege_specificity { Line 2277  sub privilege_specificity {
                 $r->print($lt{'sall'});                  $r->print($lt{'sall'});
             }              }
             $r->print(' '.$lt{'defp'}.'<br /><br />');              $r->print(' '.$lt{'defp'}.'<br /><br />');
             &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,              &display_defprivs($r,$tools,$toolprivs,\@defprivs);
                               $toolprivs,\@defprivs);  
         }          }
     }      }
     $r->print('  
   </td>  
  </tr>  
 ');  
     return;      return;
 }  }
   
 sub default_privileges {  sub default_privileges {
     my ($r,$action,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs,      my ($r,$action,$tools,$toolprivs,$fixedprivs,$available) = @_;
         $fixedprivs,$available) = @_;  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                 'addp' => 'Additional privileges',                                  'addp' => 'Additional privileges',
                                 'fixp' => 'Fixed privileges',                                  'fixp' => 'Fixed privileges',
                                 'oppr' => 'Optional privileges',                                  'oppr' => 'Optional privileges',
                                 'func' => 'Function',                                  'func' => 'Collaborative Tool',
     );      );
     $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').
     $r->print('<tr>        &Apache::lonhtmlcommon::row_title($lt{'func'},undef,
                 <td bgcolor="'.$tabcol.'" valign="top">   'LC_groups_functionality'));
                  <table cellspacing="0" cellpadding="1">      $r->print(join('</td><td class="LC_groups_functionality">',@{$tools}));
                   <tr>      $r->print(&Apache::lonhtmlcommon::row_closure(1));
                    <td valign="top"><b>'.$lt{'func'}.'</b></td>      my $fixed = '';
                   </tr>      my $dynamic = '';
                   <tr>  
                    <td valign="top"><b>'.$lt{'fixp'}.'</b></td>  
                   </tr>  
                   <tr>  
                    <td valign="top"><b>'.$lt{'oppr'}.'</b></td>  
                   </tr>  
                  </table>  
                 </td>  
     ');  
     foreach my $tool (@{$tools}) {      foreach my $tool (@{$tools}) {
         $r->print('<td align="center" valign="top">  
                     <table cellspacing="0" cellpadding="1">  
                      <tr bgcolor="#cccccc">  
                       <td colspan="2" align="center"><b>'.$tool.'</b></td>  
                      </tr>  
         ');  
         my $privcount = 0;          my $privcount = 0;
         my $fixed = '';   if ($dynamic ne '') {
         my $dynamic = '';      $dynamic .= '</td><td class="LC_groups_optional">';
    }
    $dynamic .= '<table class="LC_group_priv"><tr>';
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {          foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
             if (exists($$fixedprivs{$tool}{$priv})) {              if (exists($$fixedprivs{$tool}{$priv})) {
                 $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'&nbsp;';   if ($fixed ne '') {
       $fixed .= '</td><td class="LC_groups_fixed">';
    }
                   $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />'
                            .'<span class="LC_nobreak">'.$$toolprivs{$tool}{$priv}.'&nbsp;';
                 if ($action eq 'modify') {                  if ($action eq 'modify') {
                     if (grep/^$tool$/,@{$available}) {                      if (grep(/^$tool$/,@{$available})) {
                         $fixed .= '<small>'.&mt('(on)').'<small>&nbsp;';                          $fixed .= '<small>'.&mt('(on)').'<small>&nbsp;';
                     } else {                      } else {
                         $fixed .= '<small>'.&mt('(off)').'<small>&nbsp;';                          $fixed .= '<small>'.&mt('(off)').'<small>&nbsp;';
                     }                      }
                 }                  }
                   $fixed .= '</span>';
             } else {              } else {
                 $privcount ++;                  $privcount++;
                 if ($privcount == 3) {                  if ($privcount == 3) {
                     $dynamic .= '</tr>                      $dynamic .= '</tr>
                                  <tr bgcolor="'.$rowColor1.'">'."\n";                                   <tr>'."\n";
                 }                  }
                 $dynamic .= '<td><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'</label></td>'."\n";                  $dynamic .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'</label></span></td>'."\n";
             }              }
         }          }
         if ($dynamic eq '') {          if ($privcount == 0) {
             $dynamic = '<td>None</td>'."\n";              $dynamic .= '<td>'.&mt('None').'</td>'."\n";
         }          }
         if ($privcount < 3) {          if ($privcount < 3) {
             $dynamic .= '</tr>              $dynamic .= '<td>&nbsp;</td>'."\n";
                          <tr bgcolor="'.$rowColor1.'">  
                           <td colspan="2">&nbsp;</td>'."\n";  
         } elsif ($privcount%2) {          } elsif ($privcount%2) {
             $dynamic = '<td>&nbsp;</td>'."\n";              $dynamic = '<td>&nbsp;</td>'."\n";
         }          }
         $r->print('<tr bgcolor="'.$rowColor2.'">   $dynamic .= '</tr></table>';
                     <td colspan="2" align="center"><nobr>'.$fixed.'</nobr></td>  
                    </tr>  
                    <tr bgcolor="'.$rowColor1.'">'."\n".$dynamic.'</tr>'."\n".'</table>'."\n".'</td>  
         ');  
     }      }
     $r->print('</tr>'."\n");      $r->print(&Apache::lonhtmlcommon::row_title($lt{'fixp'},undef,
     $r->print(&Apache::lonhtmlcommon::end_pick_box());   'LC_groups_fixed').
         $fixed.
         &Apache::lonhtmlcommon::row_closure(1));
       $r->print(&Apache::lonhtmlcommon::row_title($lt{'oppr'},undef,
    'LC_groups_optional').
         $dynamic.
         &Apache::lonhtmlcommon::end_pick_box());
     $r->print('<br />');      $r->print('<br />');
     return;      return;
   
 }  }
   
 sub display_defprivs {  sub display_defprivs {
     my ($r,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs,$defprivs) = @_;      my ($r,$tools,$toolprivs,$defprivs) = @_;
       my $function = &Apache::loncommon::get_users_function();
       my $tabcol = &Apache::loncommon::designparm($function.'.tabbg');
       my $rowColor1 = "#dddddd";
       my $rowColor2 = "#eeeeee";
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                 'priv' => 'Privileges',                                  'priv' => 'Privileges',
                                 'func' => 'Function',                                  'func' => 'Collaborative Tool',
     );      );
     $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::lonhtmlcommon::start_pick_box());
     $r->print('<tr>');      $r->print('<tr>');
Line 2063  sub display_defprivs { Line 2369  sub display_defprivs {
         @{$currprivs{$tool}} = ();          @{$currprivs{$tool}} = ();
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {          foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
             if (ref($defprivs) eq 'ARRAY') {              if (ref($defprivs) eq 'ARRAY') {
                 if (grep/^\Q$priv\E$/,@{$defprivs}) {                  if (grep(/^\Q$priv\E$/,@{$defprivs})) {
                     push(@{$currprivs{$tool}},$priv);                      push(@{$currprivs{$tool}},$priv);
                 }                  }
             }              }
Line 2119  sub display_defprivs { Line 2425  sub display_defprivs {
   
   
 sub change_members_form {  sub change_members_form {
     my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description,      my ($r,$cdom,$cnum,$action,$formname,$page,$groupname,$description,
         $startdate,$enddate,$tools,$fixedprivs,$functions,$users,$userdata,          $startdate,$enddate,$tools,$fixedprivs,$functions,$users,$userdata,
         $granularity,$quota,$specificity,$idx,$states,$navbuttons,$rowColor1,          $granularity,$quota,$specificity,$idx,$states,$navbuttons,$gpterm,
         $rowColor2,$gpterm,$ucgpterm) = @_;   $ucgpterm) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                          grse => "$ucgpterm settings",                                           grse => "$ucgpterm settings",
                                          mogm => "Modify $gpterm membership",                                           mogm => "Modify $gpterm membership",
Line 2140  sub change_members_form { Line 2446  sub change_members_form {
     my $prevtext = $$navbuttons{'gtpp'};      my $prevtext = $$navbuttons{'gtpp'};
     $r->print('      $r->print('
 <br />  <br />
 <table width="100%" cellpadding="0" cellspacing="0" border="0">  
 ');  ');
     &topic_bar($r,$tabcol,1,$lt{'grse'});      $r->print(&Apache::lonhtmlcommon::topic_bar(1,$lt{'grse'}));
     $r->print('      &print_current_settings($r,$action,$functions,$startdate,$enddate,
  <tr>      $groupname,$description,$granularity,$quota,
   <td>&nbsp;</td>      \@available,\@unavailable,$gpterm,$ucgpterm);
   <td colspan="3">      $r->print(&Apache::lonhtmlcommon::topic_bar(2,$lt{'mogm'}));
 ');      my $numcurrent = &current_membership($r,$cdom,$cnum,$formname,$groupname,
     &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,                                           \@available,\@unavailable,$fixedprivs,
                             $functions,$startdate,$enddate,$groupname,                   $granularity,$specificity);
                             $description,$granularity,$quota,\@available,      if ($numcurrent > 0) {
                             \@unavailable,$gpterm,$ucgpterm);          &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
 $r->print('                              $$states{$action}[$page+1],$nexttext);
 </td></tr><tr><td colspan="4">&nbsp;</td></tr>');      } else {
     &topic_bar($r,$tabcol,2,$lt{'mogm'});          &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
     $r->print('      }
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
 ');  
     &current_membership($r,$cdom,$cnum,$formname,$tabcol,$rowColor1,  
                         $rowColor2,$groupname,\@available,\@unavailable,  
                         $fixedprivs,$granularity,$specificity);  
     $r->print('</td>');  
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,  
                         $$states{$action}[$page+1],$nexttext);  
     $r->print('</table>');  
     return;      return;
 }  }
   
 sub current_membership {  sub current_membership {
     my ($r,$cdom,$cnum,$formname,$tabcol,$rowColor1,$rowColor2,$groupname,      my ($r,$cdom,$cnum,$formname,$groupname,$available,$unavailable,
         $available,$unavailable,$fixedprivs,$granularity,$specificity) = @_;   $fixedprivs,$granularity,$specificity) = @_;
     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(
Line 2186  sub current_membership { Line 2480  sub current_membership {
                                           'reen' => 'Re-enable',                                            'reen' => 'Re-enable',
                                           'acti' => 'Activate',                                            'acti' => 'Activate',
                                           'dele' => 'Delete',                                            'dele' => 'Delete',
                                           'curf' => 'Current Functionality',                                            'curf' => 'Current Tool Set',
                                           'chpr' => 'Change Privileges'                                             'chpr' => 'Change Privileges' 
                                         );                                          );
     my ($current,$hastools,$addtools,$num_reenable,$num_activate,$num_expire) =      my ($current,$num_items,$hastools,$addtools) =
         &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs,          &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs,
                                             $available);                                              $available);
     if (keys(%{$current}) > 0) {      my $numcurrent = scalar(keys(%{$current}));
       if ($numcurrent > 0) {
         $r->print('          $r->print('
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="2">  
    <table>     <table>
     <tr>');      <tr>');
         if ($num_expire) {          if ($num_items->{'active'}) {
             &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});              &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
         }          }
         if ($num_reenable) {          if ($num_items->{'previous'}) {
             &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});              &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
         }          }
         if ($num_activate) {          if ($num_items->{'future'}) {
             &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});              &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
         }          }
         &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});          &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
Line 2219  sub current_membership { Line 2511  sub current_membership {
      <td>       <td>
       <nobr>        <nobr>
        <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>         <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>
        <input type="button" value="check all"         <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAllTools(document.'.$formname.')" />         onclick="javascript:checkAllTools(document.'.$formname.')" />
        &nbsp;&nbsp;         &nbsp;&nbsp;
        <input type="button" value="uncheck all"         <input type="button" value="'.&mt('uncheck all').'"
         onclick="javascript:uncheckAllTools(document.'.$formname.')" />          onclick="javascript:uncheckAllTools(document.'.$formname.')" />
       </fieldset>        </fieldset>
      </nobr>       </nobr>
Line 2233  sub current_membership { Line 2525  sub current_membership {
         $r->print(<<"END");          $r->print(<<"END");
    </tr>     </tr>
   </table>    </table>
   </td>    <br />
   <td width="100%">&nbsp;</td>  
  </tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
 END  END
         $r->print(&Apache::lonhtmlcommon::start_pick_box());          $r->print(&Apache::loncommon::start_data_table().
     &Apache::loncommon::start_data_table_header_row());
         $r->print(<<"END");          $r->print(<<"END");
    <table border="0" cellpadding="4" cellspacing="1">       <th>$lt{'actn'}</th>
     <tr bgcolor="$tabcol" align="center">       <th><a href="javascript:changeSort('fullname')">$lt{'name'}</a></th>
      <td><b>$lt{'actn'}</b></td>       <th><a href="javascript:changeSort('username')">$lt{'usnm'}</a></th>
      <td><b><a href="javascript:changeSort('fullname')">$lt{'name'}</a></b></td>       <th><a href="javascript:changeSort('domain')">$lt{'doma'}</a></th>
      <td><b><a href="javascript:changeSort('username')">$lt{'usnm'}</a></b>       <th><a href="javascript:changeSort('id')">ID</a></th>
      </td>       <th><a href="javascript:changeSort('start')">$lt{'stda'}</a></th>
      <td><b><a href="javascript:changeSort('domain')">$lt{'doma'}</a></b></td>       <th><a href="javascript:changeSort('end')">$lt{'enda'}</a></th>
      <td><b><a href="javascript:changeSort('id')">ID</a></b></td>  
      <td><b><a href="javascript:changeSort('start')">$lt{'stda'}</a></b></td>  
      <td><b><a href="javascript:changeSort('end')">$lt{'enda'}</a></b></td>  
 END  END
         my $colspan = 0;          my $colspan = 0;
         if ($hastools) {          if ($hastools) {
             $r->print('<td><b>'.$lt{'curf'}.'</b></td>');              $r->print('<th>'.$lt{'curf'}.'</th>');
             $colspan ++;                $colspan++;  
         }          }
         if ($addtools) {          if ($addtools) {
             $r->print('<td><b>Additional Functionality</b></td>');              $r->print('<th>'.&mt('Additional Tools').'</th>');
             $colspan ++;              $colspan++;
         }          }
         $r->print('</tr>');          $r->print(&Apache::loncommon::end_data_table_header_row());
         if ($colspan) {          if ($colspan) {
             if ($granularity eq 'Yes') {              if ($granularity eq 'Yes') {
                 $r->print('<tr bgcolor="#cccccc">                  $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
  <td colspan="7">&nbsp;</td>   <td colspan="7">&nbsp;</td>
  <td colspan="'.$colspan.'" align="center"><small><nobr><b>'.&mt('All:').   <td colspan="'.$colspan.'" align="center"><nobr><b>'.&mt('All:').
   '</b>&nbsp;');    '</b>&nbsp;');
                 foreach my $tool (@{$available}) {                  foreach my $tool (@{$available}) {
                     $r->print('<label><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);"'.
    ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');     ' value="'.$tool.'" />'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');
                 }                  }
                 $r->print('</nobr></small></td></tr>');                  $r->print('</nobr></td></tr>');
             }              }
         }          }
         my %Sortby = ();          my %Sortby = ();
Line 2294  END Line 2576  END
                 push(@{$Sortby{$$current{$user}{fullname}}},$user);                  push(@{$Sortby{$$current{$user}{fullname}}},$user);
             }              }
         }          }
         my $rowNum = 0;  
         my $rowColor;  
         foreach my $key (sort(keys(%Sortby))) {          foreach my $key (sort(keys(%Sortby))) {
             foreach my $user (@{$Sortby{$key}}) {              foreach my $user (@{$Sortby{$key}}) {
                 if ($rowNum %2 == 1) {  
                     $rowColor = $rowColor1;  
                 } else {  
                     $rowColor = $rowColor2;  
                 }  
                 my $id = $$current{$user}{id};                  my $id = $$current{$user}{id};
                 my $fullname = $$current{$user}{fullname};                  my $fullname = $$current{$user}{fullname};
                 my $udom = $$current{$user}{udom};                  my $udom = $$current{$user}{udom};
                 my $uname = $$current{$user}{uname};                  my $uname = $$current{$user}{uname};
                 my $start = $$current{$user}{start};                  my $start = $$current{$user}{start};
                 my $end = $$current{$user}{end};                  my $end = $$current{$user}{end};
                 $r->print('<tr bgcolor="'.$rowColor.'">                  $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').'
                             <td><small>');                              <td>');
                 if ($$current{$user}{changestate} eq 'reenable') {                  if ($$current{$user}{changestate} eq 'reenable') {
                     $r->print('<nobr><label>'.                       $r->print('<nobr><label>'. 
    '<input type="checkbox" name="reenable" value="'.$user.'" />'.     '<input type="checkbox" name="reenable" value="'.$user.'" />'.
Line 2333  END Line 2608  END
    '</label></nobr>');     '</label></nobr>');
                 }                  }
                 $r->print('                  $r->print('
    </td>     </td>'.
    <td><small>'.     '<td>'.$fullname.'</td>'.
     $fullname.'</small></td><td><small>'.$uname.'</small></td><td><small>'.     '<td>'.$uname.'</td>'.
     $udom.'</small></td><td><small>'.$id.'</small></td><td><small>'.$start.     '<td>'. $udom.'</td>'.
     '</small></td><td><small>'.$end.'</small></td>');     '<td>'.$id.'</td>'.
      '<td>'.$start.'</td>'.
      '<td>'.$end.'</td>');
                 if ($hastools) {                  if ($hastools) {
                     $r->print('<td align="left"><small><nobr>'.                      $r->print('<td align="left"><nobr>'.
                                   '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');                                    '&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') {
Line 2355  END Line 2632  END
                          }                           }
                          $r->print('&nbsp;&nbsp;&nbsp;');                           $r->print('&nbsp;&nbsp;&nbsp;');
                     }                      }
                     $r->print('</nobr></small></td>');                      $r->print('</nobr></td>');
                 }                  }
                 if ($addtools) {                  if ($addtools) {
                     $r->print('<td align="left"><small>');                      $r->print('<td align="left">');
                     if ($granularity eq 'Yes') {                      if ($granularity eq 'Yes') {
                         foreach my $tool (@{$$current{$user}{newtools}}) {                          foreach my $tool (@{$$current{$user}{newtools}}) {
                             $r->print('<nobr><label><input type="checkbox"                              $r->print('<nobr><label><input type="checkbox"
Line 2374  END Line 2651  END
                                           '</nobr>&nbsp;&nbsp;&nbsp;');                                            '</nobr>&nbsp;&nbsp;&nbsp;');
                         }                          }
                     }                      }
                     $r->print('</small></td>');                      $r->print('</td>');
                 }                  }
                 $r->print('</tr>'."\n");                  $r->print(&Apache::loncommon::end_data_table_row()."\n");
                 $rowNum ++;  
             }              }
         }          }
         $r->print(&Apache::lonhtmlcommon::end_pick_box());          $r->print(&Apache::loncommon::end_data_table());
         $r->print('      } else {
   </td>          $r->print(&mt('There are no active, future or previous group members to modify.'));
  </tr>');  
     }      }
     return;      return $numcurrent;
 }  }
   
 sub check_uncheck_buttons {  sub check_uncheck_buttons {
     my ($r,$formname,$field,$title,$colspan) = @_;      my ($r,$formname,$field,$title,$colspan) = @_;
     $r->print('      $r->print('
      <td '.$colspan.'>       <td '.$colspan.'>
       <nobr>  
        <fieldset>         <fieldset>
        <legend><b>'.$title.'</b></legend>         <legend><b>'.$title.'</b></legend>
        <input type="button" value="check all"        <nobr>
          <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAll(document.'.$formname.'.'.$field.')" />         onclick="javascript:checkAll(document.'.$formname.'.'.$field.')" />
        &nbsp;&nbsp;         &nbsp;&nbsp;
        <input type="button" value="uncheck all"         <input type="button" value="'.&mt('uncheck all').'"
        onclick="javascript:uncheckAll(document.'.$formname.'.'.$field.')" />         onclick="javascript:uncheckAll(document.'.$formname.'.'.$field.')" />
        </fieldset>  
       </nobr>        </nobr>
          </fieldset>
      </td>       </td>
 ');  ');
 }  }
   
   
 sub change_privs_form {  sub change_privs_form {
     my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate,      my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,
        $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,   $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,
        $memchg,$idx,$states,$stored,$sectioncount,$navbuttons,$rowColor1,   $memchg,$idx,$states,$stored,$sectioncount,$navbuttons,$gpterm,
        $rowColor2,$gpterm,$ucgpterm) = @_;   $ucgpterm) = @_;
     my @regexps = ('userpriv_');      my @regexps = ('userpriv_');
     my $nexttext;      my $nexttext;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
Line 2426  sub change_privs_form { Line 2701  sub change_privs_form {
     } else {      } else {
         $nexttext = $$navbuttons{'mose'};          $nexttext = $$navbuttons{'mose'};
     }      }
     $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');      $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('Members to delete or expire')));
     &topic_bar($r,$tabcol,3,&mt('Members to delete or expire'));  
     my $exp_or_del = 0;      my $exp_or_del = 0;
     if (ref($$memchg{'deletion'}) eq 'ARRAY') {      if (ref($$memchg{'deletion'}) eq 'ARRAY') {
         if (@{$$memchg{'deletion'}} > 0) {          if (@{$$memchg{'deletion'}} > 0) {
             $r->print('<tr><td>&nbsp;</td><td colspan="3"><b>'.$lt{'tode'}.':</b><br /><ul>');              $r->print('<b>'.$lt{'tode'}.':</b><br /><ul>');
             foreach my $user (@{$$memchg{'deletion'}}) {              foreach my $user (@{$$memchg{'deletion'}}) {
                 $r->print('<li>'.$$userdata{$user}[$$idx{fullname}].                  $r->print('<li>'.$$userdata{$user}[$$idx{fullname}].
                           '&nbsp;('.$user.')</li>');                            '&nbsp;('.$user.')</li>');
             }              }
             $r->print('</ul></td><tr><td colspan="4">&nbsp;</td></tr>');              $r->print('</ul>');
             $exp_or_del += @{$$memchg{'deletion'}};              $exp_or_del += @{$$memchg{'deletion'}};
         }          }
     }      }
     if (ref($$memchg{'expire'}) eq 'ARRAY') {      if (ref($$memchg{'expire'}) eq 'ARRAY') {
         if (@{$$memchg{'expire'}} > 0) {          if (@{$$memchg{'expire'}} > 0) {
             $r->print('<tr><td>&nbsp;</td><td colspan="3"><b>'.$lt{'toex'}.':</b><br /><ul>');              $r->print('<b>'.$lt{'toex'}.':</b><br /><ul>');
             foreach my $user (@{$$memchg{'expire'}}) {              foreach my $user (@{$$memchg{'expire'}}) {
                 $r->print('<li>'.$$userdata{$user}[$$idx{fullname}].                  $r->print('<li>'.$$userdata{$user}[$$idx{fullname}].
                           '&nbsp;('.$user.')</li>');                            '&nbsp;('.$user.')</li>');
             }              }
             $r->print('</ul></td><tr><td colspan="4">&nbsp;</td></tr>');              $r->print('</ul>');
             $exp_or_del += @{$$memchg{'expire'}};              $exp_or_del += @{$$memchg{'expire'}};
         }          }
     }      }
     if (!$exp_or_del) {      if (!$exp_or_del) {
         $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'nome'}.          $r->print($lt{'nome'}.'<br />');
                   '</td></tr><tr><td colspan="4">&nbsp;</td></tr>');  
     }      }
           
     &topic_bar($r,$tabcol,4,&mt('[_1] member privileges',$ucgpterm));      $r->print(&Apache::lonhtmlcommon::topic_bar(4,&mt('Setting optional privileges for specific group members')));
   
     my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools,      my $numchgs = &member_privileges_form($r,$action,$formname,$tools,
                                           $toolprivs,$fixedprivs,$userdata,                                            $toolprivs,$fixedprivs,$userdata,
                                           $usertools,$idx,$memchg,$states,                                            $usertools,$idx,$memchg,$states,
                                           $stored,$rowColor1,$rowColor2,                                            $stored,$gpterm);
                                           $gpterm);  
     $r->print('</td></tr><tr><td colspan="4">&nbsp;</td></tr>');  
     my $prevtext = $$navbuttons{'gtps'};      my $prevtext = $$navbuttons{'gtps'};
     if ($numchgs || $exp_or_del) {      if ($numchgs || $exp_or_del) {
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,          &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
Line 2471  sub change_privs_form { Line 2742  sub change_privs_form {
     } else {      } else {
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);          &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
     }      }
     $r->print('</table>');  
     return;      return;
 }  }
   
 sub add_members_form {  sub add_members_form {
     my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname,      my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname,
         $description,$granularity,$quota,$sectioncount,$tools,$functions,          $description,$granularity,$quota,$sectioncount,$tools,$functions,
         $stored,$states,$navbuttons,$rowColor1,$rowColor2,$gpterm,$ucgpterm)=@_;           $stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_; 
     $r->print(' <br />      $r->print(' <br />');
 <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
 ');  
     my @available = ();      my @available = ();
     my @unavailable = ();      my @unavailable = ();
     &check_tools($functions,$tools,\@available,\@unavailable);      &check_tools($functions,$tools,\@available,\@unavailable);
     &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,      &print_current_settings($r,$action,$functions,$startdate,$enddate,
                             $functions,$startdate,$enddate,$groupname,      $groupname,$description,$granularity,$quota,
                             $description,$granularity,$quota,\@available,      \@available,\@unavailable,$gpterm,$ucgpterm);
                             \@unavailable,$gpterm,$ucgpterm);      &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm,
     $r->print('  
    </td>  
   </tr>  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
   
     &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm,  
                         $ucgpterm);                          $ucgpterm);
     my $nexttext = $$navbuttons{'gtns'};      my $nexttext = $$navbuttons{'gtns'};
     my $prevtext = $$navbuttons{'gtpp'};      my $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                         $$states{$action}[$page+1],$nexttext);                          $$states{$action}[$page+1],$nexttext);
     $r->print('  
  </table>');  
     return;      return;
 }  }
   
 sub choose_privs_form {  sub choose_privs_form {
     my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate,      my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,
        $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx,   $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx,
        $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2,   $states,$stored,$sectioncount,$navbuttons,$gpterm,$ucgpterm,
        $gpterm,$ucgpterm,$crstype) = @_;   $crstype) = @_;
   
     my @regexps = ('userpriv_');      my @regexps = ('userpriv_');
     my $nexttext;      my $nexttext;
Line 2531  sub choose_privs_form { Line 2786  sub choose_privs_form {
         $nexttext = $$navbuttons{'adme'};          $nexttext = $$navbuttons{'adme'};
     }      }
   
     $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');      $r->print(&Apache::lonhtmlcommon::topic_bar(6,&mt('Setting optional privileges for specific group members')));
     &topic_bar($r,$tabcol,6,&mt('[_1] member privileges',$ucgpterm));  
   
     &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs,      &member_privileges_form($r,$action,$formname,$tools,$toolprivs,
                             $fixedprivs,$userdata,$usertools,$idx,undef,                              $fixedprivs,$userdata,$usertools,$idx,undef,
                             $states,$stored,$rowColor1,$rowColor2,$gpterm);                              $states,$stored,$gpterm);
   
     $r->print('</td></tr><tr><td colspan="4">&nbsp;</td></tr>');  
     if ($action eq 'create') {      if ($action eq 'create') {
         if (keys(%{$sectioncount}) > 0) {          my $img1 = 7;
             my $img1 = 7;          my $img2 = 8;
             my $img2 = 8;          &mapping_options($r,$action,$formname,$page,$sectioncount,
             &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount,                           $states,$stored,$navbuttons,$img1,$img2,
                              $states,$stored,$navbuttons,$img1,$img2,                           $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
                              $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);  
         }  
     }      }
     my $prevtext = $$navbuttons{'gtps'};      my $prevtext = $$navbuttons{'gtps'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                         $$states{$action}[$page+1],$nexttext);                          $$states{$action}[$page+1],$nexttext);
     $r->print('</table>');  
     return;      return;
 }  }
   
Line 2614  function uncheckAllTools(formname) { Line 2864  function uncheckAllTools(formname) {
 }  }
   
 sub member_privileges_form {  sub member_privileges_form {
     my ($r,$tabcol,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata,      my ($r,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata,
         $usertools,$idx,$memchg,$states,$stored,$rowColor1,$rowColor2,          $usertools,$idx,$memchg,$states,$stored,$gpterm) = @_;
         $gpterm) = @_;  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
             'addp' => 'Additional privileges',              'addp' => 'Additional privileges',
             'fixp' => 'Fixed privileges',              'fixp' => 'Core privileges',
             'oppr' => 'Optional privileges',              'oppr' => 'Optional privileges',
             'func' => 'Function',              'func' => 'Tool',
             'forf' => 'For the functionality you have chosen to include '.              'forf' => 'For the collaborative tools included for group '.
                       'there are no optional privileges to set besides '.                        'members being added or modified, '. 
                       'the standard privileges.',                        'there are no optional privileges to set '.
             'algr' => "All $gpterm members will receive the same privileges.",                        'for specific members.',
             'asno' => "As no $gpterm members are being added, ".              'algr' => 'All new group members will receive the same privileges.',
                       "there are no specific user privileges to set.",              'ifex' => 'If previously expired members are being re-enabled, or '.
             'asng' => "As no $gpterm tools will be made available to users, ".                        'if access for future members is being activated now, '.
                       "there are no specific user privileges to set.",                        'previously set privileges will be preserved.',
             'nogm' => "No $gpterm member privileges to display or set, ".              'asno' => 'As no group members are being added, '.
                       "as you have not indicated that you will be activating,".                        'there are no specific user privileges to set.',
                       " re-enabling, changing privileges, or adding/removing ".              'asng' => 'As no group tools will be made available to users, '.
                       "functionality for any current members ",                        '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 '.
                         'tools for any current members.',
             'full' => 'Fullname',              'full' => 'Fullname',
             'user' => 'Username',              'user' => 'Username',
             'doma' => 'Domain',              'doma' => 'Domain',
Line 2677  sub member_privileges_form { Line 2930  sub member_privileges_form {
         }          }
         $numchgs = @currmembers;          $numchgs = @currmembers;
         if (!$numchgs) {          if (!$numchgs) {
             $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'nogm'});               $r->print($lt{'nogm'}); 
             return $numchgs;              return $numchgs;
         }          }
     }      }
Line 2693  sub member_privileges_form { Line 2946  sub member_privileges_form {
                 my %total;                  my %total;
                 if (keys(%{$usertools}) > 1) {                  if (keys(%{$usertools}) > 1) {
                     $r->print('                      $r->print('
  <tr>     <table border="0" cellspacing="2" cellpadding="2">
   <td>&nbsp;</td>  
   <td colspan="3">  
    <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="'.                              $r->print('<table class="thinborder"><tr>'.
                                       $tabcol.'"><th colspan="'.$colspan.'">'.        '<th colspan="'.$colspan.'">'.
                                       $tool.'</th></tr><tr>');                                        &mt($tool).'</th></tr><tr>');
                             my $privcount = 0;                              my $privcount = 0;
                             foreach my $priv (@{$showboxes{$tool}}) {                              foreach my $priv (@{$showboxes{$tool}}) {
                                 $privcount ++;                                  $privcount ++;
Line 2718  sub member_privileges_form { Line 2968  sub member_privileges_form {
                                 } else {                                  } else {
                                     $r->print('<td>');                                      $r->print('<td>');
                                 }                                  }
                                 $r->print(qq|                                  $r->print(
        <fieldset><legend><b>$$toolprivs{$tool}{$priv}</b></legend>   '<fieldset><legend><b>'.&mt($$toolprivs{$tool}{$priv}).'</b></legend>'
        <nobr>  .'<span class="LC_nobreak">'
        <input type="button" value="check all"  .' <input type="button" value="'.&mt('check all').'"'
          onclick="javascript:checkAll(document.$formname.userpriv_$priv)" />  .' onclick="javascript:checkAll(document.'.$formname.'.userpriv_'.$priv.')" />'
        &nbsp;  .'&nbsp;'
        <input type="button" value="uncheck all"  .'<input type="button" value="'.&mt('uncheck all').'"'
         onclick="javascript:uncheckAll(document.$formname.userpriv_$priv)" />  .' onclick="javascript:uncheckAll(document.'.$formname.'.userpriv_'.$priv.')" />'
       </nobr></fieldset><br />|);  .'</span></fieldset><br />'
                                   );
                                 $r->print('</td>');                                  $r->print('</td>');
                                 if ($privcount < @{$showboxes{$tool}}) {                                  if ($privcount < @{$showboxes{$tool}}) {
                                     if (@{$showboxes{$tool}} > 2) {                                      if (@{$showboxes{$tool}} > 2) {
Line 2741  sub member_privileges_form { Line 2992  sub member_privileges_form {
                             $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></table>');
                     $r->print('<tr><td colspan="4">&nbsp;</td></tr>');  
                 }                  }
                 $r->print('<tr><td>&nbsp;</td><td colspan="3">');                  $r->print(&Apache::loncommon::start_data_table().
                 $r->print(&Apache::lonhtmlcommon::start_pick_box());    &Apache::loncommon::start_data_table_header_row());
                 $r->print(<<"END");                  $r->print(<<"END");
    <tr bgcolor="$tabcol">      <th>$lt{'full'}</th>
     <th><b>$lt{'full'}</th>      <th>$lt{'user'}</th>
     <th><b>$lt{'user'}</th>  
     <th>$lt{'doma'}</th>      <th>$lt{'doma'}</th>
     <th colspan="$numtools">$lt{'addp'}</th>      <th colspan="$numtools">$lt{'addp'}</th>
   </tr>  
 END  END
                 &member_privs_entries($r,$tabcol,$rowColor1,$rowColor2,                  $r->print(&Apache::loncommon::end_data_table_header_row());
                                       $usertools,$toolprivs,$fixedprivs,                  &member_privs_entries($r,$usertools,$toolprivs,$fixedprivs,
                                       $userdata,$idx,\@showtools,\@defprivs,                                        $userdata,$idx,\@showtools,\@defprivs,
                                       \@excluded);                                        \@excluded);
                 $r->print('</td>');                  $r->print(&Apache::loncommon::end_data_table());
                 $r->print(&Apache::lonhtmlcommon::end_pick_box());  
                 $r->print('</td></tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>  
 ');  
             } else {              } else {
                 $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'forf'}.                  $r->print($lt{'forf'}.'<br />');
                           '<br />');                  &display_defprivs($r,$tools,$toolprivs,\@defprivs);
                 &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,  
                             $toolprivs,\@defprivs);  
             }              }
         } else {          } else {
             if (keys(%{$usertools}) > 0) {              if (keys(%{$usertools}) > 0) {
                 $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'algr'}.                  $r->print($lt{'algr'}.'<br />'.$lt{'ifex'}.'<br /><br />');
                           '<br /><br />');                  &display_defprivs($r,$tools,$toolprivs,\@defprivs);
                 &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,  
                             $toolprivs,\@defprivs);  
             } else {              } else {
                 $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'asno'}.                  $r->print($lt{'asno'}.'<br />');
                           '<br />');  
             }              }
         }          }
     } else {      } else {
         $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'asng'});          $r->print($lt{'asng'});
     }      }
     return $numchgs;      return $numchgs;
 }  }
   
 sub process_request {  sub process_request {
     my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$groupname,$description,      my ($r,$cdom,$cnum,$action,$state,$page,$groupname,$description,
         $specificity,$userdata,$startdate,$enddate,$tools,$functions,$toolprivs,          $specificity,$userdata,$startdate,$enddate,$tools,$functions,$toolprivs,
         $usertools,$idx,$types,$roles,$sections,$states,$navbuttons,$memchg,          $usertools,$idx,$types,$roles,$sections,$states,$navbuttons,$memchg,
         $sectioncount,$stored,$rowColor1,$rowColor2,$gpterm,$ucgpterm,          $sectioncount,$stored,$gpterm,$ucgpterm,$crstype) = @_;
         $crstype) = @_;  
   
     $r->print(&Apache::lonhtmlcommon::echo_form_input(      $r->print(&Apache::lonhtmlcommon::echo_form_input(
                                  ['origin','action','state','page','sortby']));                                   ['origin','action','state','page','sortby']));
Line 2875  sub write_group_data { Line 3111  sub write_group_data {
                              'specificity','autoadd','autodrop','quota');                               'specificity','autoadd','autodrop','quota');
     my @mult_attributes = ('roles','types','sectionpick','defpriv');      my @mult_attributes = ('roles','types','sectionpick','defpriv');
   
       my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,
                                                                   $stored);
       my $quota = $env{'form.quota'};
       
       $quota =~ s/^\s*([^\s]*)\s*$/$1/;
       if ($quota eq '') {
           $quota = 0;
       }
       if ($quota !~ /^\d*\.?\d*$/) {
           $quota = 0;
           $r->print('<div class="LC_warning">'
                    .&mt('The value you entered for the quota for the file repository in this '.$gpterm
                    .' contained invalid characters, so it has been set to 0 Mb. You can change this by'
                    .' modifying the '.$gpterm.' settings.')
                    .'</div>');
       }
       if ($quota > $maxposs) {
           $quota = $maxposs;
           $r->print('<div class="LC_warning">'
                    .&mt('The value you entered for the quota for the file repository in this '.$gpterm
                    .' exceeded the maximum possible value, so it has been set to [_1] Mb '
                    .'(the maximum possible value).',sprintf("%.2f",$maxposs))
                    .'</div>');
       }
     my %groupinfo = (      my %groupinfo = (
                      description => $esc_description,                       description => $esc_description,
                      startdate => $startdate,                       startdate => $startdate,
Line 2886  sub write_group_data { Line 3146  sub write_group_data {
                      specificity => $specificity,                       specificity => $specificity,
                      autoadd => $env{'form.autoadd'},                       autoadd => $env{'form.autoadd'},
                      autodrop => $env{'form.autodrop'},                       autodrop => $env{'form.autodrop'},
                      quota => $env{'form.quota'},                                       quota => $quota,
                    );                     );
   
     foreach my $func (keys(%{$functions})) {      foreach my $func (keys(%{$functions})) {
         my $status;          my $status;
         if (grep(/^$func$/,@{$tools})) {          if (grep(/^$func$/,@{$tools})) {
Line 2937  sub write_group_data { Line 3198  sub write_group_data {
             my $result = &add_group_folder($cdom,$cnum,$now,$groupname,$action,              my $result = &add_group_folder($cdom,$cnum,$now,$groupname,$action,
                                            $description,$tools,\%groupinfo,                                             $description,$tools,\%groupinfo,
                                            $gpterm,$ucgpterm,$crstype);                                             $gpterm,$ucgpterm,$crstype);
             if ($result ne 'ok') {              if ($result eq 'ok') {
                 $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].',$gpterm,$result));                      $r->print('<div class="LC_success">'
                            .&mt($ucgpterm.' [_1] was created.','<i>'.$groupname.'</i>')
                            .'</div>');
               } else {
                   $r->print('<div class="LC_error">'
                            .&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
                                ,'<i>'.$groupname.'</i>')
                            .'<br />'.$result
                            .'</div>');
               }
           } elsif ($action eq 'modify') {
               my (@oldtools,@newtools); 
               if (ref($$stored{'tool'}) eq 'ARRAY') {
                   @oldtools = @{$$stored{'tool'}};
               }
               if (ref($tools) eq 'ARRAY') {
                   @newtools = @{$tools};
               }
               if (!grep(/^discussion$/,@oldtools) && 
                    grep(/^discussion$/,@newtools)) {
                   my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
                   my $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
                   my $navmap = Apache::lonnavmaps::navmap->new();
                   my $bbmapres = $navmap->getResourceByUrl($boardsmap);
                   undef($navmap);
                   if (!$bbmapres) {
                       my $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';
                       my $disctitle = &mt('Discussion Boards');
                       my $outcome = &map_updater($cdom,$cnum,'group_boards_'.
                                                  $groupname.'.sequence','bbseq',
                                                  $disctitle,$grpmap);
                       my ($furl,$ferr) = 
                           &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
                       $navmap = Apache::lonnavmaps::navmap->new();
                       # modify parameter
                       if ($outcome eq 'ok') {
                           my $parm_result = &parm_setter($navmap,$cdom,$boardsmap,
                                                          $groupname);
                           if ($parm_result) {
                               $r->print('<div class="LC_error">'
                                        .&mt('An error occurred while setting parameters '
                                            .'for Discussion Boards folder: '
                                            .'[_1]',$parm_result)
                                        .'</div>');
                           } else {
                               $r->print('<div class="LC_success">'
                                        .&mt('Discussion Boards Folder created.')
                                        .'</div>');
                           }
                       } else {
                           $r->print($outcome);
                       }
                       undef($navmap);
                   }
             }              }
             $r->print(&mt('[_1] [_2] was created.<br />',$ucgpterm,$groupname));              $r->print('<div class="LC_success">'
         } else {                       .&mt($ucgpterm.' [_1] was updated.','<i>'.$groupname.'</i>')
             $r->print(&mt('[_1] [_2] was updated.<br />',$ucgpterm,$groupname));                       .'</div>');
         }          }
     } else {      } else {
         my %actiontype = (          my %actiontype = (
Line 2952  sub write_group_data { Line 3266  sub write_group_data {
         &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".          &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
                                  'in '.lc($crstype).': '.$cnum.                                   'in '.lc($crstype).': '.$cnum.
                                  ' in domain: '.$cdom);                                   ' in domain: '.$cdom);
         $r->print(&mt('An error occurred when [_1] the new [_2]. '.          $r->print('<div class="LC_error">'
                       'Please try again.',$actiontype{$action},$gpterm));                   .&mt('An error occurred when [_1] the '.$gpterm.'. '
                    .'Please try again.',$actiontype{$action})
                    .'</div>');
     }      }
     return $result;      return $result;
 }  }
Line 2972  sub process_membership { Line 3288  sub process_membership {
     my %curr_start = ();      my %curr_start = ();
     my %curr_end = ();      my %curr_end = ();
     my %tooltype = ();      my %tooltype = ();
       my $context = 'processgroupmembership';
   
     foreach my $tool (@{$tools}) {      foreach my $tool (@{$tools}) {
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {          foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
Line 3041  sub process_membership { Line 3358  sub process_membership {
                                                       $curr_privs{$user};                                                        $curr_privs{$user};
                 if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,                  if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
                                                        $user,$now,$savestart,                                                         $user,$now,$savestart,
                                                        $curr_privs{$user}) eq 'ok') {                                                         $curr_privs{$user},'',$context) eq 'ok') {
                     push(@{$added{'expired'}},$user);                      push(@{$added{'expired'}},$user);
                     $num_ok ++;                      $num_ok ++;
                 } else {                  } else {
Line 3052  sub process_membership { Line 3369  sub process_membership {
             foreach my $user (@deletion) {              foreach my $user (@deletion) {
                 $usersettings{$groupname.':'.$user} = $now.':-1:';                  $usersettings{$groupname.':'.$user} = $now.':-1:';
                 if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,                  if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
                                                        $user,$now,'-1','')                                                         $user,$now,'-1','','',$context)
                                                          eq 'ok') {                                                           eq 'ok') {
                     push(@{$added{'deleted'}},$user);                      push(@{$added{'deleted'}},$user);
                     $num_ok ++;                      $num_ok ++;
Line 3072  sub process_membership { Line 3389  sub process_membership {
         my $start = $startdate;          my $start = $startdate;
         my $end = $enddate;          my $end = $enddate;
         if ($state eq 'memresult') {          if ($state eq 'memresult') {
             if ($curr_privs{$user} eq $group_privs{$user}) {  
                push(@unchanged,$user);  
                next;  
             }  
             if (exists($curr_start{$user})) {  
                 $start = $curr_start{$user};  
             }  
             if (exists($curr_end{$user})) {  
                 $end = $curr_end{$user};  
             }  
             $type = 'modified';  
             if (@activate > 0) {              if (@activate > 0) {
                 if (grep/^$user$/,@activate) {                  if (grep/^$user$/,@activate) {
                     $start = $now;                      $start = $now;
Line 3097  sub process_membership { Line 3403  sub process_membership {
                     $type = 'reenabled';                      $type = 'reenabled';
                 }                  }
             }              }
               if ($type eq '') {
                   if ($curr_privs{$user} eq $group_privs{$user}) {
                       push(@unchanged,$user);
                       next;
                   }
                   if (exists($curr_start{$user})) {
                       $start = $curr_start{$user};
                   }
                   if (exists($curr_end{$user})) {
                       $end = $curr_end{$user};
                   }
                   $type = 'modified';
               }
         } else {          } else {
             $type = 'added';              $type = 'added';
         }          }
Line 3104  sub process_membership { Line 3423  sub process_membership {
                                               $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,$end,$start,                                                  $user,$end,$start,
                                                 $group_privs{$user}) eq 'ok') {                                                  $group_privs{$user},'',$context) eq 'ok') {
             push(@{$added{$type}},$user);              push(@{$added{$type}},$user);
             $num_ok ++;              $num_ok ++;
         } else {          } else {
Line 3143  sub process_membership { Line 3462  sub process_membership {
     }      }
     if ($num_fail) {      if ($num_fail) {
         foreach my $type (sort(keys(%failed))) {          foreach my $type (sort(keys(%failed))) {
             $r->print(&mt('The following users could not be [_1], because an error occurred:<br />',$type));              $r->print('<div class="LC_error">'
                        .&mt("The following users could not be $type, because an error occurred:")
                        .'</div>');
             foreach my $user (@{$failed{$type}}) {              foreach my $user (@{$failed{$type}}) {
                 $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');                  $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');
             }              }
Line 3151  sub process_membership { Line 3472  sub process_membership {
         $r->print('<br />');          $r->print('<br />');
     }      }
     if (@unchanged > 0) {      if (@unchanged > 0) {
         $r->print(&mt('No change occurred for the following users:<br />'));          $r->print(&mt('No change occurred for the following users:').'<br />');
         foreach my $user (sort(@unchanged)) {          foreach my $user (sort(@unchanged)) {
             $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');              $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');
         }          }
         $r->print('<br />');          $r->print('<br />');
     }      }
     if ($roster_result eq 'ok') {      if ($roster_result eq 'ok') {
         $r->print('<br />'.&mt('[_1] membership list updated.',$ucgpterm));          $r->print('<div class="LC_success">'
  $r->print('<p>'.&mt("For full access to all of [_1]'s privileges, users will need to log out and log back in.",$groupname).'</p>');                   .&mt($ucgpterm.' membership list updated.')
     } else {                   .'</div>');
         $r->print('<br />'.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.'<br />');   $r->print('<p class="LC_info">'
                    .&mt('Any currently logged in course users affected by the changes you made'
                        .' to group membership or privileges for the [_1] group will need to log out'
                        .' and log back in for their LON-CAPA sessions to reflect these changes.'
                        ,'<i>'.$groupname.'</i>')
                    .'</p>'
           );
       } else {
           $r->print('<div class="LC_error">'
                    .&mt("An error occurred while updating the $gpterm membership list:")
                    .'<br />'.$roster_result
                    .'</div>');
     }      }
     return;      return;
 }  }
   
 sub mapping_options {  sub mapping_options {
     my ($r,$action,$formname,$page,$tabcol,$sectioncount,$states,$stored,      my ($r,$action,$formname,$page,$sectioncount,$states,$stored,
         $navbuttons,$img1,$img2,$rowColor1,$rowColor2,$gpterm,$ucgpterm,          $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype,$cdom,$cnum) = @_;
         $crstype) = @_;  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'auto' => "Settings for automatic $gpterm enrollment",          'auto' => "Settings for automatic $gpterm enrollment",
         'gmma' => "$ucgpterm membership mapping to specific sections/roles",          'gmma' => "$ucgpterm membership mapping to specific sections/roles",
         'endi' => "Enable/disable automatic $gpterm enrollment for ".          'endi' => "Enable/disable automatic $gpterm enrollment for ".
                           "users in specified roles and sections",                            "users in specified roles and sections",
         'adds'  => "If automatic $gpterm enrollment is enabled, when a user is assigned a ".lc($crstype)."-wide or section-specific role, he/she will automatically be added as a member of the $gpterm, with start and end access dates defined by the default dates set for the $gpterm, unless he/she is already a $gpterm member, with access dates that permit either current or future $gpterm access.",          'adds'  => "If automatic $gpterm enrollment is enabled, when a user is newly assigned a ".lc($crstype)."-wide or section-specific role, he/she will automatically be added as a member of the $gpterm, with start and end access dates defined by the default dates set for the $gpterm, unless he/she is already a $gpterm member, with access dates that permit either current or future $gpterm access.",
         'drops'  => "If automatic $gpterm disenrollment is enabled, when a user's role is expired, access to the $gpterm will be terminated unless the user continues to have other ".lc($crstype)."-wide or section-specific active or future roles which receive automatic membership in the $gpterm.",          'drops'  => "If automatic $gpterm disenrollment is enabled, when a user's role is expired, access to the $gpterm will be terminated unless the user continues to have other ".lc($crstype)."-wide or section-specific active or future roles which receive automatic membership in the $gpterm.",
         'pirs' => "Pick roles and sections for automatic $gpterm enrollment",          'pirs' => "Pick roles and sections for automatic $gpterm enrollment",
         'curr' => 'Currently set to',          'curr' => 'Currently set to',
Line 3185  sub mapping_options { Line 3516  sub mapping_options {
         'auex' => "Automatically expire $gpterm membership when roles are removed?",          'auex' => "Automatically expire $gpterm membership when roles are removed?",
         'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.",          'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.",
     );      );
     &automapping($r,$action,$tabcol,$stored,\%lt,$img1);      &automapping($r,$action,$stored,\%lt,$img1);
     $r->print('      &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype,$cdom,$cnum,
    <tr>                        $action);
     <td colspan="4">&nbsp;</td>  
    </tr>');  
     &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt,  
                       $stored,$img2,$crstype);  
     return;      return;
 }  }
   
 sub automapping {  sub automapping {
     my ($r,$action,$tabcol,$stored,$lt,$image) = @_;      my ($r,$action,$stored,$lt,$image) = @_;
     my $add = 'off';      my $add = 'off';
     my $drop = 'off';      my $drop = 'off';
     if (exists($$stored{'autoadd'})) {      if (exists($$stored{'autoadd'})) {
Line 3205  sub automapping { Line 3532  sub automapping {
     if (exists($$stored{'autodrop'})) {      if (exists($$stored{'autodrop'})) {
         $drop = $$stored{'autodrop'};          $drop = $$stored{'autodrop'};
     }      }
     &topic_bar($r,$tabcol,$image,$$lt{'endi'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'endi'}).'
     $r->print('      <b>'.$$lt{'gmma'}.':</b><br />'.$$lt{'adds'}.'<br />'.$$lt{'drops'}.'<br /><br />
   <tr>  
    <td>&nbsp;</td>  
    <td colspan="3">  
     <b>'.$$lt{'gmma'}.':</b><br />'.$$lt{'adds'}.'<br />'.$$lt{'drops'}.'<br />  
    </td>  
   </tr>  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>  
   <tr>  
    <td>&nbsp;</td>  
    <td colspan="3">  
    <nobr>'.$$lt{'auad'}.':&nbsp;     <nobr>'.$$lt{'auad'}.':&nbsp;
     <label><input type="radio" name="autoadd" value="on" />on&nbsp;&nbsp;</label><label><input type="radio" name="autoadd" value="off" checked="checked" />off</label>');      <label><input type="radio" name="autoadd" value="on" />'.&mt('on').'&nbsp;&nbsp;</label><label><input type="radio" name="autoadd" value="off" checked="checked" />'.&mt('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>)');
     }      }
     $r->print('      $r->print('
     </nobr>      </nobr><br />
    </td>  
   </tr>  
   <tr>  
    <td>&nbsp;</td>  
    <td colspan="3">  
     <nobr>'.$$lt{'auex'}.':&nbsp;      <nobr>'.$$lt{'auex'}.':&nbsp;
     <label><input type="radio" name="autodrop" value="on" />on&nbsp;&nbsp;</label><label><input type="radio" name="autodrop" value="off" checked="checked" />off</label>');      <label><input type="radio" name="autodrop" value="on" />'.&mt('on').'&nbsp;&nbsp;</label><label><input type="radio" name="autodrop" value="off" checked="checked" />'.&mt('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>)');
     }      }
     $r->print('</nobr>      $r->print('</nobr><br /><br />'.$$lt{'mapr'});
    </td>  
   </tr>  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>  
   <tr>  
    <td>&nbsp;</td>  
    <td colspan="3">'.$$lt{'mapr'}.'  
    </td>  
   </tr>  
 ');  
 }  }
   
 sub mapping_settings {  sub mapping_settings {
     my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image,      my ($r,$sectioncount,$lt,$stored,$image,$crstype,$cdom,$cnum,$action) = @_;
         $crstype) = @_;  
     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,'none'); # 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
       } else {
           @sections = ('all','none');
     }      }
     &topic_bar($r,$tabcol,$image,$$lt{'pirs'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
     $r->print('  
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">  
 ');  
     my @roles = &standard_roles();      my @roles = &standard_roles();
     my %customroles = &my_custom_roles();      my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
     $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row());
     $r->print('      $r->print('
                 <tr bgcolor="'.$tabcol.'">  
                  <th>'.&mt('Active?').'</th>                   <th>'.&mt('Active?').'</th>
                  <th>'.&mt('Role').'</th>');                   <th>'.&mt('Role').'</th>');
     if (@sections > 0) {      if (@sections > 0) {
         $r->print('<th>'.&mt('Sections').'</th></tr>'."\n");          $r->print('<th>'.&mt('Sections').'</th>');
     }      }
     my $rowNum = 0;      $r->print(&Apache::loncommon::end_data_table_header_row()."\n");
     my $rowColor;  
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role,$crstype);          my $roletitle=&Apache::lonnet::plaintext($role,$crstype);
         my $sections_sel;          $r->print(&print_autorole_item($role,$roletitle,\@sections));
         if (@sections > 0) {  
             if ($role eq 'cc') {  
                 $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) {  
             $rowColor = $rowColor1;  
         } else {  
             $rowColor = $rowColor2;  
         }  
         $r->print('<tr bgcolor="'.$rowColor.'"><td><input type="checkbox" '.  
                   'name="autorole" value="'.$role.'"></td><td>'.$plrole.  
                   '</td>'.$sections_sel.'</tr>');  
         $rowNum ++;  
     }      }
       my @customs;
     foreach my $role (sort(keys(%customroles))) {      foreach my $role (sort(keys(%customroles))) {
         my $sections_sel;          my ($roletitle) = ($role =~ m|^cr/[^/]+/[^/]+/(.+)$|);
         if (@sections > 0) {          push (@customs,$role);
             $sections_sel = '<td>'.&sections_selection(\@sections,'sec_'.$role).          $r->print(&print_autorole_item($role,$roletitle,\@sections));
                                                                         '</td>';  
         }  
         if ($rowNum %2 == 1) {  
             $rowColor = $rowColor1;  
         } else {  
             $rowColor = $rowColor2;  
         }  
         $r->print('<tr bgcolor="'.$rowColor.'"><td><input type="checkbox" '.  
                   'value="'.$role.'"></td><td>'.$role.'</td>'.  
                   $sections_sel.'</tr>');  
         $rowNum ++;  
     }      }
     $r->print(&Apache::lonhtmlcommon::end_pick_box());      if ($action eq 'modify') {
           foreach my $role (@{$$stored{'autorole'}}) {
               if ((!grep(/^\Q$role\E$/,@customs)) && 
                   (!grep(/^\Q$role\E$/,@roles))) {
                   my $roletitle;
                   if ($role =~ /^cr/) {
                       ($roletitle) = ($role =~ m|_([^_]+)$|);
                   } else {
                       $roletitle = &Apache::lonnet::plaintext($role,$crstype);
                   }
                   $r->print(&print_autorole_item($role,$roletitle,\@sections));
               }
           }
       }
       $r->print(&Apache::loncommon::end_data_table());
     return;      return;
 }  }
   
   sub print_autorole_item {
       my ($role,$roletitle,$sections) = @_;
       my $sections_sel;
       if (@{$sections} > 0) {
           if ($role eq 'cc') {
               $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>';
           }
       }
       my $output = &Apache::loncommon::start_data_table_row().
                    '<td><input type="checkbox" '.
                    'name="autorole" value="'.$role.'" />'.
                    '</td><td>'.$roletitle.'</td>'.$sections_sel.
                    &Apache::loncommon::end_data_table_row();
       return $output;
   } 
   
 sub standard_roles {  sub standard_roles {
     my @roles = ('cc','in','ta','ep','st');      my @roles = ('cc','in','ta','ep','st');
     return @roles;      return @roles;
 }  }
   
 sub my_custom_roles {  
     my %returnhash=();  
     my %rolehash=&Apache::lonnet::dump('roles');  
     foreach (keys %rolehash) {  
         if ($_=~/^rolesdef\_(\w+)$/) {  
             $returnhash{$1}=$1;  
         }  
     }  
     return %returnhash;  
 }  
   
 sub modify_menu {  sub modify_menu {
     my ($r,$groupname,$page,$gpterm) = @_;      my ($r,$groupname,$page,$gpterm) = @_;
     my @menu =      my @menu =
Line 3374  sub modify_menu { Line 3663  sub modify_menu {
 }  }
   
 sub member_privs_entries {  sub member_privs_entries {
     my ($r,$tabcol,$rowColor1,$rowColor2,$usertools,$toolprivs,      my ($r,$usertools,$toolprivs,$fixedprivs,$userdata,$idx,$showtools,
         $fixedprivs,$userdata,$idx,$showtools,$defprivs,$excluded) = @_;   $defprivs,$excluded) = @_;
     my $rowColor;  
     my $rowNum = 0;  
     foreach my $user (sort(keys(%{$usertools}))) {      foreach my $user (sort(keys(%{$usertools}))) {
         if (defined($excluded)) {          if (defined($excluded)) {
             if (ref($excluded) eq 'ARRAY') {              if (ref($excluded) eq 'ARRAY') {
Line 3387  sub member_privs_entries { Line 3674  sub member_privs_entries {
             }              }
         }          }
         my ($uname,$udom) = split(/:/,$user);          my ($uname,$udom) = split(/:/,$user);
         if ($rowNum %2 == 1) {          $r->print(&Apache::loncommon::start_data_table_row().'
             $rowColor = $rowColor1;  
         } else {  
             $rowColor = $rowColor2;  
         }  
         $r->print('<tr bgcolor="'.$rowColor.'">  
                 <td>'.$$userdata{$user}[$$idx{fullname}].'</td>                  <td>'.$$userdata{$user}[$$idx{fullname}].'</td>
                 <td>'.$uname.'</td>                  <td>'.$uname.'</td>
                 <td>'.$udom.'</td>                  <td>'.$udom.'</td>
                 <td valign="top"><table><tr><td><b>Function</b></td></tr><tr><td><b>Fixed</b></td></tr><tr><td><b>Optional</b></td></tr></table></td>');                  <td valign="top">
                     <table>
                      <tr>
                       <td><b>'.
                       &mt('Collaborative Tool').'</b></td>
                      </tr>
                      <tr>
                       <td><b>'.&mt('Fixed').'</b></td>
                      </tr>
                      <tr>
                       <td><b>'.&mt('Optional').'</b></td>
                      </tr>
                     </table>
                    </td>');
         foreach my $tool (@{$showtools}) {          foreach my $tool (@{$showtools}) {
             if (exists($$usertools{$user}{$tool})) {              if (exists($$usertools{$user}{$tool})) {
                 $r->print('<td valign="top"><table><tr bgcolor="'.$tabcol.'"><td colspan="2" align="center"><b>'.$tool.'</b></td></tr>');                  $r->print('<td valign="top"><table><tr><th colspan="2">'.$tool.'</th></tr>');
                 my $privcount = 0;                  my $privcount = 0;
                 my $fixed = '';                  my $fixed = '';
                 my $dynamic = '';                  my $dynamic = '';
Line 3422  sub member_privs_entries { Line 3717  sub member_privs_entries {
                 }                  }
                 $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>');
             } else {              } else {
                 $r->print('<td valign="top"><table width="100%"><tr bgcolor="'.$tabcol.'"><td colspan="2" align="center"><b>'.$tool.'</b></td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr></table></td>');                  $r->print('<td valign="top"><table width="100%"><tr><th colspan="2">'.$tool.'</th></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr></table></td>');
             }              }
         }          }
         $rowNum ++;          $r->print(&Apache::loncommon::end_data_table_row());
     }      }
 }  }
   
Line 3446  sub date_setting_table { Line 3741  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><label><input type="checkbox" name="no_end_date" />      my $perpetual = 
                                                 no ending date</label></nobr>';   '<nobr><label><input type="checkbox" name="no_end_date" />'.
     my $start_table = '';   &mt('None').'</label></nobr>';
     $start_table .= "<table>\n";      my $table = "<table class=\"LC_descriptive_input\">\n".
     $start_table .= '<tr><td align="right">Default starting date for    '<tr><td class="LC_description">'.&mt('Start:').'</td>'.
                                            member access</td>'.  
         '<td>'.$startform.'</td>'.          '<td>'.$startform.'</td>'.
         '<td>&nbsp;</td>'."</tr>\n";          '<td>&nbsp;</td>'."</tr>\n".
     $start_table .= "</table>";   '<tr><td class="LC_description">'.&mt('End:').'</td>'.
     my $end_table = '';  
     $end_table .= "<table>\n";  
     $end_table .= '<tr><td align="right">Default ending date for   
                                          member access</td>'.  
         '<td>'.$endform.'</td>'.          '<td>'.$endform.'</td>'.
         '<td>'.$perpetual.'</td>'."</tr>\n";          '<td>'.$perpetual.'</td>'."</tr>\n".
     $end_table .= "</table>\n";   "</table>\n";
     return ($start_table, $end_table);      return $table;
 }  }
   
 sub add_group_folder {  sub add_group_folder {
     my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,      my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,
         $gpterm,$ucgpterm,$crstype) = @_;          $gpterm,$ucgpterm,$crstype) = @_;
     if ($cdom eq '' || $cnum eq '') {      if ($cdom eq '' || $cnum eq '') {
         return &mt('Error: invalid course domain or number - group folder creation failed');            return '<span class="LC_error">'
                 .&mt('Error: invalid course domain or number - group folder creation failed.')
                 .'</span>';
     }      }
     my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage);      my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage,$warning);
     my $navmap = Apache::lonnavmaps::navmap->new();  
     my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';      my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
     $allgrpsmap = $crspath.'default_0.sequence';      $allgrpsmap = $crspath.'group_allfolders.sequence';
     my $topmap = $navmap->getResourceByUrl($allgrpsmap);  
     undef($navmap);  
     if ($action eq 'create') {      if ($action eq 'create') {
     # check if default_0.sequence exists.          if (&get_folder_lock($cdom,$cnum,'group_allfolders',$now) eq 'ok') {
         if (!$topmap) {              # check if group_allfolders.sequence exists.
             my $grpstitle = &mt('[_1] [_2]',$crstype,$ucgpterm);              my $mapcontents = &Apache::lonnet::getfile($allgrpsmap);
             my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'};              if ($mapcontents eq '-1') { #file does not exist;
             $topmap_url =~ s|/+|/|g;                  my $grpstitle = &mt("$crstype $ucgpterm".'s');
             if ($topmap_url =~ m|^/uploaded|) {                  my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'};
                 $outcome = &map_updater($cdom,$cnum,'default_0.sequence',                  $topmap_url =~ s|/+|/|g;
                                         'toplevelgroup',$grpstitle,$topmap_url);                  if ($topmap_url =~ m|^/uploaded|) {
                       $outcome = &map_updater($cdom,$cnum,'group_allfolders.sequence',
                                               'toplevelgroup',$grpstitle,$topmap_url);
                   } else {
                       $outcome = '<span class="LC_warning">'
                                 .&mt('Non-standard course - folder for all groups not added.')
                                 .'</span>';
                   }
                 if ($outcome ne 'ok') {                  if ($outcome ne 'ok') {
                       my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders');
                       if ($delresult ne 'ok') {
                           $warning = $delresult;
                       }
                     return $outcome;                      return $outcome;
                 }                  }
             } else {  
                 $outcome = &mt('Non-standard course - group folder not added.');  
                 return $outcome;  
             }              }
               my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders');
               if ($delresult ne 'ok') {
                   $warning = $delresult ;
               }
           } else {
               $outcome = '<span class="LC_error">'
                         .&mt('Could not obtain exclusive lock to check status of the folder for all groups. No group folder added.')
                         .'</div>';
               return $outcome;
         }          }
         my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description;          my $grpfolder = &mt($ucgpterm.' Folder - [_1]',$description);
         $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/grppg';          $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg';
         my $grptitle = &mt('Group homepage').' - '.$description;          my $grptitle = &mt('Group homepage - [_1]',$description);
         my ($seqid,$discussions,$disctitle);          my ($discussions,$disctitle);
         my $outcome = &map_updater($cdom,$cnum,'default_'.$now.'.sequence',          my $outcome = &map_updater($cdom,$cnum,'group_folder_'.$groupname.'.sequence',
                                    'grpseq',$grpfolder,$allgrpsmap,$grppage,                                     'grpseq',$grpfolder,$allgrpsmap,$grppage,
                                    $grptitle);                                     $grptitle);
         if ($outcome ne 'ok') {          if ($outcome ne 'ok') {
             return $outcome;              return $outcome.$warning;
         }          }
         my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo,          my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo,
                                        $tools,$gpterm,$ucgpterm,$now);                                         $tools,$gpterm,$ucgpterm,$now);
         # Link to folder for bulletin boards          # Link to folder for bulletin boards
         $grpmap = $crspath.'default_'.$now.'.sequence';          $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';
         if (grep/^discussion$/,@{$tools}) {          if (grep/^discussion$/,@{$tools}) {
             $seqid = $now + 1;  
             $disctitle = &mt('Discussion Boards');              $disctitle = &mt('Discussion Boards');
             my $outcome = &map_updater($cdom,$cnum,'default_'.$seqid.              my $outcome = &map_updater($cdom,$cnum,'group_boards_'.$groupname.
                                        '.sequence','bbseq',$disctitle,$grpmap);                                         '.sequence','bbseq',$disctitle,$grpmap);
             if ($outcome ne 'ok') {              if ($outcome ne 'ok') {
                 return $outcome;                  return $outcome.$warning;
             }              }
             $boardsmap = $crspath.'default_'.$seqid.'.sequence';              $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
         }          }
     } else {      } else {
         #modify group folder if status of discussions tools is changed          #modify group folder if status of discussions tools is changed
     }      }
     my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);      my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
     $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     # modify parameters      # modify parameters
     my $parm_result;      my $parm_result;
     if ($action eq 'create') {      if ($action eq 'create') {
         if ($allgrpsmap) {   
             $parm_result .= &parm_setter($navmap,$cdom,$allgrpsmap,$groupname);  
         }  
         if ($grpmap) {          if ($grpmap) {
             $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname);              $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname);
         }          }
Line 3539  sub add_group_folder { Line 3841  sub add_group_folder {
             $parm_result .= &parm_setter($navmap,$cdom,$boardsmap,$groupname);              $parm_result .= &parm_setter($navmap,$cdom,$boardsmap,$groupname);
         }          }
     }      }
       undef($navmap);
     if ($parm_result) {      if ($parm_result) {
         return $parm_result;          return $warning.$parm_result;
       } else {
           return 'ok';
       }
   }
   
   sub get_folder_lock {
       my ($cdom,$cnum,$folder_name,$now) = @_;  
       # get lock for folder being edited.
       my $lockhash = {
                     $folder_name."\0".'locked_folder' => $now.':'.$env{'user.name'}.
                                                        ':'.$env{'user.domain'},
                      };
       my $tries = 0;
       my $gotlock = &Apache::lonnet::newput('coursegroups',$lockhash,$cdom,$cnum);
   
       while (($gotlock ne 'ok') && $tries <3) {
           $tries ++;
           sleep(1);
           $gotlock = &Apache::lonnet::newput('coursegroups',$lockhash,$cdom,$cnum);
       }
       return $gotlock;
   }
   
   sub release_folder_lock {
       my ($cdom,$cnum,$folder_name) = @_;  
       #  remove lock
       my @del_lock = ($folder_name."\0".'locked_folder');
       my $dellockoutcome=&Apache::lonnet::del('coursegroups',\@del_lock,$cdom,$cnum);
       if ($dellockoutcome ne 'ok') {
           return ('<div class="LC_error">'
                  .&mt('Warning: failed to release lock for folder: [_1].','<tt>'.$folder_name.'</tt>')
                  .'</div>'
                  );
     } else {      } else {
         return 'ok';          return 'ok';
     }      }
Line 3555  sub map_updater { Line 3891  sub map_updater {
     my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,      my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,
                                                         $newfile);                                                          $newfile);
     if ($newmapurl !~ m|^/uploaded|) {      if ($newmapurl !~ m|^/uploaded|) {
         $outcome = "Error uploading new folder ($newfile): $newmapurl";          $outcome = '<div class="LC_error">'
                     .&mt('Error uploading new folder.')." ($newfile): $newmapurl"
                     .'</div>';
         return $outcome;          return $outcome;
     }       }
     my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap);      my ($errtext,$fatal)=&LONCAPA::map::mapread($parentmap);
     if ($fatal) {      if ($fatal) {
         $outcome = "Error reading contents of parent folder ($parentmap): $errtext\n";          $outcome = '<div class="LC_error">'
                     .&mt('Error reading contents of parent folder.')." ($parentmap): $errtext"
                     .'</div>';
         return $outcome;          return $outcome;
     } else {      } else {
         my $newidx=&Apache::lonratedt::getresidx($newmapurl);          my $newidx=&LONCAPA::map::getresidx($newmapurl);
         $Apache::lonratedt::resources[$newidx] = $itemtitle.':'.$newmapurl.          $LONCAPA::map::resources[$newidx] = $itemtitle.':'.$newmapurl.
                                                  ':false:normal:res';                                                   ':false:normal:res';
         $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;          $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
         my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1);          my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);
         if ($errtext) {          if ($errtext) {
            $outcome = "Error storing updated parent folder ($parentmap):  $errtext\n";              $outcome = '<div class="LC_error">'
                         .&mt('Error saving updated parent folder.')." ($parentmap):  $errtext"
                         .'</div>';
             return $outcome;              return $outcome;
         }          }
     }      }
Line 3590  sub new_map { Line 3932  sub new_map {
   
 sub parm_setter {  sub parm_setter {
     my ($navmap,$cdom,$url,$groupname) = @_;      my ($navmap,$cdom,$url,$groupname) = @_;
     my %parmresult;      my $allresults;
     my %hide_settings = (      my %hide_settings = (
                            'course' =>  {                             'course' =>  {
                                           'num' => 13,                                            'num' => 13,
Line 3603  sub parm_setter { Line 3945  sub parm_setter {
                                         },                                          },
                         );                          );
     my $res = $navmap->getResourceByUrl($url);      my $res = $navmap->getResourceByUrl($url);
     my $symb = $res->symb();      if ($res) {
     foreach my $level (keys(%hide_settings)) {          my $symb = $res->symb();
         $parmresult{$level} =  &Apache::lonparmset::storeparm_by_symb($symb,          foreach my $level (keys(%hide_settings)) {
               my $parmresult =  
                          &Apache::lonparmset::storeparm_by_symb($symb,
                                                  '0_hiddenresource',                                                   '0_hiddenresource',
                                                  $hide_settings{$level}{'num'},                                                   $hide_settings{$level}{'num'},
                                                  $hide_settings{$level}{'set'},                                                   $hide_settings{$level}{'set'},
                                                  'string_yesno',undef,$cdom,                                                   'string_yesno',undef,$cdom,
                                                  undef,undef,                                                   undef,undef,
                                                  $hide_settings{$level}{'extra'});                                                   $hide_settings{$level}{'extra'});
               if ($parmresult) {
                   $allresults .= $level.': '.$parmresult;
               }
           }
       } else {
           $allresults = '<div class="LC_warning">' 
                        .&mt('Parameters not set for [_1] because the resource was not recognized'
                            .' as part of the course.','<tt>'.$url.'</tt>')
                        .'</div>';
     }      }
     return %parmresult;      return $allresults;
 }  }
   
 sub create_homepage {  sub create_homepage {
Line 3675  sub validate_groupname { Line 4028  sub validate_groupname {
     my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_;      my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_;
     my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);      my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
     my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);      my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
       my %deleted_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef,
                                                            'deleted_groups');
       if (my $tmp = &Apache::lonnet::error(%deleted_groups)) {
           undef(%deleted_groups);
           &Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom);
       }
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                       igna => "Invalid $gpterm name",                        igna => "Invalid $gpterm name",
                       tgne => "The $gpterm name entered ",                        tgne => "The $gpterm name entered ",
Line 3690  sub validate_groupname { Line 4048  sub validate_groupname {
                               "existing $gpterm",                                    "existing $gpterm",    
     );      );
   
     my $exitmsg = '<b>'.$lt{'igna'}.'</b><br /><br />'.$lt{'tgne'}.' "'.      my $exitmsg = '<span class="LC_error">'.$lt{'igna'}.'</span><br /><br />'.
                   $groupname.'" ';   $lt{'tgne'}.' "'.$groupname.'" ';
     my $dupmsg = $lt{'grna'};      my $dupmsg = $lt{'grna'};
     my $earlyout;      my $earlyout;
     if (($groupname eq '') || ($groupname =~ /\W/)) {      if (($groupname eq '') || ($groupname =~ /\W/)) {
Line 3702  sub validate_groupname { Line 4060  sub validate_groupname {
  return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.   return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
     '<br />'.$lt{'grna'};      '<br />'.$lt{'grna'};
     }      }
     if ($action eq 'create'       if ($action eq 'create') { 
  && exists($curr_groups{$groupname})) {   if (exists($curr_groups{$groupname})) {
       return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).
  return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).             $lt{'inth'}.'.<br />'.$lt{'grna'};
     $lt{'inth'}.'<br />'.$lt{'grna'};          } elsif (exists($deleted_groups{$groupname})) {
               return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm).
                      $lt{'inth'}.'.<br />'.$lt{'grna'};
           }
     } elsif ($action eq 'modify') {      } elsif ($action eq 'modify') {
         unless(exists($curr_groups{$groupname})) {          unless(exists($curr_groups{$groupname})) {
             $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.              $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.
Line 3718  sub validate_groupname { Line 4078  sub validate_groupname {
     return;      return;
 }  }
   
 sub topic_bar {  
     my ($r,$tabcol,$imgnum,$title) = @_;  
     $r->print('  
  <tr bgcolor="'.$tabcol.'">  
   <td>&nbsp;</td>  
   <td valign="middle" align="left">  
    <nobr>  
     <img src="/res/adm/pages/bl_step'.$imgnum.'.gif" valign="middle">&nbsp;  
    </nobr>  
   </td>  
   <th align="left"><nobr>'.$title.'<nobr>  
   </th>  
   <td width="100%">&nbsp;</td>  
  </tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>  
 ');  
     return;  
 }  
   
 sub check_changes {  sub check_changes {
     my ($member_changes,$memchg) = @_;      my ($member_changes,$memchg) = @_;
     my %exclusions;      my %exclusions;

Removed from v.1.36  
changed lines
  Added in v.1.80


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