Diff for /loncom/interface/loncoursegroups.pm between versions 1.50 and 1.127.2.1

version 1.50, 2006/07/07 21:57:58 version 1.127.2.1, 2017/03/19 17:59:15
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::lonhtmlgateway;
 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 HTML::Entities;
   use LONCAPA::map();
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
   
Line 53  sub handler { Line 56  sub handler {
     if (! ($env{'request.course.fn'})) {      if (! ($env{'request.course.fn'})) {
         # Not in a course          # Not in a course
         $env{'user.error.msg'}=          $env{'user.error.msg'}=
      "/adm/coursegroups:mdg:0:0:Cannot edit or view course groups";       "/adm/coursegroups:mdg:0:0:Cannot edit or view course/community groups";
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
   
Line 63  sub handler { Line 66  sub handler {
     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 74  sub handler { Line 77  sub handler {
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
   
     my %functions = (      my %functions = (
                       email => 'E-mail',                        email => 'Send Messages', 
                       discussion => 'Discussion boards',                        discussion => 'Discussion Boards',
                       chat => 'Chat',                        chat => 'Chat Room',
                       files => 'File repository',                        files => 'Group Portfolio',
                       roster => 'Membership roster',                        roster => 'Membership Roster',
                       homepage => $ucgpterm.' home page',                        homepage => $ucgpterm.' home page',
                     );                      );
   
Line 91  sub handler { Line 94  sub handler {
   
     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,              if ($state eq 'view') {
                                   \%functions,\%idx,$view_permission,                  &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,
                                   $manage_permission,$gpterm,$ucgpterm,                                   $view_permission,$manage_permission,
   $crstype);                                   $action,$state,$gpterm,$ucgpterm,$crstype);
               } else {
                   &group_administration($r,$action,$state,$cdom,$cnum,
                                         \%functions,\%idx,$view_permission,
                                         $manage_permission,$gpterm,$ucgpterm,
           $crstype);
               }
         } else {          } else {
             $r->print(&mt('You do not have [_1] administration '.              $r->print('<div class="LC_warning">'
                           'privileges in this [_2]',$gpterm,lc($crstype)));                       .&mt('You do not have '.$gpterm.' administration '
                            .'privileges in this '.lc($crstype).'.')
                        .'</div>');
         }          }
     } else {      } else {
         &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission,          &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission,
Line 117  sub handler { Line 129  sub handler {
 sub print_main_menu {  sub print_main_menu {
     my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission,      my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission,
  $action,$state,$gpterm,$ucgpterm,$crstype) = @_;   $action,$state,$gpterm,$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+'&amp;status='+status+'&amp;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('My Space',$jscript,$action,$state));
       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;
       if ($manage_permission) {
           $helpitem = 'Creating_Groups';
       }
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups',$helpitem));
     &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,      &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
     $manage_permission,$action,$state,$gpterm,$ucgpterm,      $manage_permission,$action,$state,$gpterm,$ucgpterm,
     $crstype);      $crstype);
Line 141  sub display_groups { Line 170  sub display_groups {
     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   => '/adm/coursegroups?action=modify&refpage='.
                          $env{'form.refpage'}.'&groupname=',                    $env{'form.refpage'}.'&state=pick_task&groupname=',
       view => '<a href="/adm/'.$cdom.'/'.$cnum.'/',        view     => '',
       delete => '<a href="/adm/coursegroups?action=delete&refpage='.        delete   => '/adm/coursegroups?action=delete&refpage='.
                          $env{'form.refpage'}.'&groupname=',                    $env{'form.refpage'}.'&state=verify&groupname=',
         reenable => '/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) {
               my $navmap=Apache::lonnavmaps::navmap->new();
               if (!defined($navmap)) {
                   $r->print('<div class="LC_error">'.
                             &mt('An error occurred retrieving information about resources in the course.').'<br />'.
                             &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this page.','<a href="/adm/roles?selectrole=1&amp;newrole='.$env{'request.role'}.'&amp;orgurl=%2fadm%2fcoursegroups">','</a>').
                             '</div>');
                   return;
               }
             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::loncommon::start_data_table().      $r->print(&Apache::loncommon::start_data_table().
Line 190  sub display_groups { Line 250  sub display_groups {
         <th><a href="javascript:changeSort('creator')">$lt{'crea'}</a></th>          <th><a href="javascript:changeSort('creator')">$lt{'crea'}</a></th>
         <th><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></th>          <th><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></th>
         <th><a href="javascript:changeSort('modified')">$lt{'last'}</a></th>          <th><a href="javascript:changeSort('modified')">$lt{'last'}</a></th>
         <th>$lt{'func'}</b></td>          <th>$lt{'func'}</th>
         <th><a href="javascript:changeSort('quota')">$lt{'quot'}</a></th>          <th><a href="javascript:changeSort('quota')">$lt{'quot'}</a></th>
         <th><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></th>          <th><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></th>
         <th><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></th>          <th><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></th>
Line 206  END Line 266  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 269  END Line 329  END
                     if (!$functionality) {                      if (!$functionality) {
                         $functionality = &mt('None available');                          $functionality = &mt('None available');
                     }                      }
                     my $link = $actionlinks{$action};                      my $link;
                     if ($action eq 'modify' || $action eq 'delete') {                      if ($action eq 'modify' || $action eq 'delete' || 
                         $link .= $group;                          $action eq 'reenable') {
                           $link = '<a href="'.&HTML::Entities::encode($actionlinks{$action}.$group,'<>&"').
                                   '">'.$lt{$action}.'</a>';
                     } else {                      } else {
                         $link .= $group.'/smppg';                          $link = 
                               &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap); 
                           if ($link) {
                               $link = '<a href="'.$link;
                               $link .= (($link=~/\?/)?'&amp;':'?').'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;<a href="'.
                             $link .= '&nbsp;&nbsp;'.$actionlinks{'modify'}.                                        &HTML::Entities::encode($actionlinks{'modify'}.$group,'<>&"').
                                       $group.'">'.$lt{'modify'}.'</a>';                                        '">'.$lt{'modify'}.'</a>&nbsp;&nbsp;<a href="'.
                                         &HTML::Entities::encode($actionlinks{'delete'}.$group,'<>&"').
                                         '">'.$lt{'delete'}.'</a>';
                         }                          }
                     }                      }
                     $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').                      $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
Line 293  END Line 365  END
       '<td>'.$functionality.'</td>'.        '<td>'.$functionality.'</td>'.
       '<td align="right">'.$quota.'</td>'.        '<td align="right">'.$quota.'</td>'.
       '<td align="right">'.$totalmembers.'</td>'.        '<td align="right">'.$totalmembers.'</td>'.
       '<td align="right"><nobr>'.&mt('Files: ').$totalfiles.'</nobr><br /><nobr>'.&mt('Folders: ').$totaldirs.'</nobr></td>'.        '<td align="right">'.
                                     '<span class="LC_nobreak">'.&mt('Files: [_1]',$totalfiles).'</span><br />'.
                                     '<span class="LC_nobreak">'.&mt('Folders: [_1]',$totaldirs).'</span>'.
                                     '</td>'.
       '<td align="right">'.$boards.'</td>'.        '<td align="right">'.$boards.'</td>'.
       '<td align="right">'.$diskuse.'</td>'.        '<td align="right">'.$diskuse.'</td>'.
       &Apache::loncommon::end_data_table_row());        &Apache::loncommon::end_data_table_row());
Line 312  END Line 387  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 324  END Line 403  END
             $r->print('<br /><br />');              $r->print('<br /><br />');
             my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);              my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
             if (%curr_groups) {              if (%curr_groups) {
                   my $navmap=Apache::lonnavmaps::navmap->new();
                   if (!defined($navmap)) {
                       $r->print('<div class="LC_error">'.
                                 &mt('An error occurred retrieving information about resources in the course.').'<br />'.
                                 &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this page.','<a href="/adm/roles?selectrole=1&amp;newrole='.$env{'request.role'}.'&amp;orgurl=%2fadm%2fcoursegroups">','</a>').
                                 '</div>');
                       return;
                   }
                 foreach my $group (@coursegroups) {                  foreach my $group (@coursegroups) {
                     my %group_info =  &Apache::longroup::get_group_settings(                      my %group_info =  &Apache::longroup::get_group_settings(
                                         $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});                      my $link = 
                     $r->print('<font size="+1"><a href="/adm/'.$udom.'/'.$uname.'/'.$group.'/smppg">'.$group,'</a><font><br /><small>'.$description.'</small><br /><br />');                          &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap).
                           '&amp;ref=grouplist';
                       $r->print('<span style="font-size: larger"><a href="'.$link.'">'.$group,'</a></span><br /><small>'.$description.'</small><br /><br />');
                 }                  }
             }              }
         } else {          } else {
             $r->print(&mt('You are not currently a member of any '.              $r->print(
                           'active [_1]s in this [_2]',$gpterm,                  '<p class="LC_info">'
                           lc($crstype)));                 .&mt('You are not currently a member of any active '.$gpterm.'s'
                      .' in this '.lc($crstype).'.')
                  .'</p>'
               );
         }          }
     }      }
     return;      return;
Line 401  sub group_administration { Line 493  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 480  sub group_administration { Line 570  sub group_administration {
   
     if (ref($stored{'autorole'}) eq 'ARRAY') {      if (ref($stored{'autorole'}) eq 'ARRAY') {
         foreach my $role (@{$stored{'autorole'}}) {          foreach my $role (@{$stored{'autorole'}}) {
             unless ($role eq 'cc') {              unless (($role eq 'cc') || ($role eq 'co')) {
                 $elements{'modify'}{'change_settings'}{'sec_'.$role} =                   $elements{'modify'}{'change_settings'}{'sec_'.$role} = 
                                                                    'selectbox';                                                                     'selectbox';
             }              }
Line 496  sub group_administration { Line 586  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 513  sub group_administration { Line 601  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 556  sub group_administration { Line 641  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 725  sub group_administration { Line 810  sub group_administration {
         my $space_trim = '/^\s*|\s*\$/g,""';          my $space_trim = '/^\s*|\s*\$/g,""';
         my $float_check = '/^([0-9]*\.?[0-9]*)$/';          my $float_check = '/^([0-9]*\.?[0-9]*)$/';
         $validate_script = '          $validate_script = '
     var newquota = document.'.$state.'.quota.value;      var newquota = new String(document.'.$state.'.quota.value);
     newquota.replace('.$space_trim.');      newquota.replace('.$space_trim.');
     if (newquota == "" ) {      if (newquota == "" ) {
         document.'.$state.'.quota.value = 0;          document.'.$state.'.quota.value = 0;
         newquota = 0;                 newquota = "0";
     }      }
     var maxposs = '.$maxposs.';      var maxposs = '.sprintf("%.2f",$maxposs).';
     if (newquota > 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.");          alert("The group portfolio quota you entered for this group ("+newquota+" MB) exceeds the maximum possible ("+maxposs+" MB). Please enter a smaller number.");
         return;          return;
     }      }
     var re_quota = '.$float_check.';      var re_quota = '.$float_check.';
Line 752  sub group_administration { Line 837  sub group_administration {
             }              }
         }          }
         if (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.");              alert("You have indicated that the group portfolio should be enabled, but you have set the repository quota to 0 MB.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");
             return;              return;
         }          }
     }       } 
Line 782  function changeSort(caller) { Line 867  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 793  function changeSort(caller) { Line 880  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 806  function changeSort(caller) { Line 893  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,$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&amp;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 830  function changeSort(caller) { Line 927  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 843  function changeSort(caller) { Line 939  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 => 'Next',#'Go to next step',
                              gtps => 'Go to previous step',                               gtps => 'Back',#'Go to previous step',
                              crgr => 'Create '.$gpterm,                               crgr => 'Create '.$gpterm,
                              mose => 'Modify settings',                               mose => 'Save',#'Modify settings',
                              gtpp => 'Go to previous page',                               gtpp => 'Back',#'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,$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,
Line 869  function changeSort(caller) { Line 973  function changeSort(caller) {
  $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,$functions,$idx,$view_permission,          &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
  $manage_permission,$action,$state,$gpterm,$ucgpterm,   $manage_permission,$action,$state,$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 942  sub retrieve_settings { Line 1054  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 989  sub display_control { Line 1102  sub display_control {
         }          }
     } 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,$functions,$idx,$view_permission,  
     $manage_permission,$action,$state,$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,$state,$page,              &general_settings_form($r,$cdom,$cnum,$action,$state,$page,
Line 1007  sub display_control { Line 1116  sub display_control {
                                  $userdata,$granularity,$quota,$specificity,                                   $userdata,$granularity,$quota,$specificity,
                                  $idx,$states,$navbuttons,$gpterm,$ucgpterm);                                   $idx,$states,$navbuttons,$gpterm,$ucgpterm);
         } elsif ($state eq 'add_members') {          } elsif ($state eq 'add_members') {
             &add_members_form($r,$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,$gpterm,$ucgpterm);                                $states,$navbuttons,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'pick_members') {          } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$action,$state,$page,              &choose_members_form($r,$cdom,$cnum,$action,$state,$page,
                                  $groupname,$description,$granularity,$quota,                                   $groupname,$description,$granularity,$quota,
Line 1039  sub display_control { Line 1148  sub display_control {
                              $sections,$states,$navbuttons,$memchg,                               $sections,$states,$navbuttons,$memchg,
                              $sectioncount,$stored,$gpterm,$ucgpterm,$crstype);                               $sectioncount,$stored,$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,$crstype);
           } elsif ($state eq 'result') {
               &delete_group($r,$cdom,$cnum,$groupname,$crstype);
           }
       } 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,$crstype);
           } elsif ($state eq 'result') {
               &reenable_group($r,$cdom,$cnum,$groupname,$crstype);
           }
       }
   }
   
   sub verify_delete {
       my ($r,$groupname,$formname,$action,$page,$states,$stored,$crstype) = @_;
       $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>');
       if ($crstype eq 'Community') {
           $r->print( '<li>'.&mt("The group folder is removed from the folder containing it - normally this is the 'Community Groups' folder which contains folders for all groups in the community.").'</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 community in the future."));
       } else { 
           $r->print( '<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,$crstype) = @_;
       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,$crstype);
               if ($outcome eq '') {
                   my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully deleted.'));
                   $message = &Apache::loncommon::confirmwrapper($message);
                   $r->print($message);
               } else {
                   $r->print('<div class="LC_error">');
                   if ($crstype eq 'Community') {
                       $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Community Groups' folder: [_1]",$outcome));
                   } else {
                       $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Course Groups' folder: [_1]",$outcome));
                   }
                   $r->print('</div>');
               }
           } else {
               my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('Group deletion failed.'),1);
               $msg = &Apache::loncommon::confirmwrapper($msg);
               $r->print($msg);
           }
       }
       return;
   }
   
   sub reenable_folder {
       my ($cdom,$cnum,$groupname,$description,$crstype) = @_;
       my $outcome;
       my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
       my $allgrpsmap = $crspath.'group_allfolders.sequence';
       my $foldertitle;
       if ($crstype eq 'Community') {
           $foldertitle = &mt("Community Folder -[_1]",$description);
       } else {
           $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,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,$crstype) = @_;
       my ($outcome,$groupmap,$groupmapres,$map,$id,$src);
       my $navmap = Apache::lonnavmaps::navmap->new();
       if (!defined($navmap)) {
           $outcome = '<div class="LC_error">';
           if ($crstype eq 'Community') {
               $outcome .= &mt("Error reading community contents.").' '.
                      &mt("You need to re-initialize the community.");
           } else {
               $outcome .= &mt("Error reading course contents.").' '.
                      &mt("You need to re-initialize the course.");
           }
           $outcome .= '</div>';
           return $outcome;
       }
       $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.
                      $groupname.'.sequence';
       $groupmapres = $navmap->getResourceByUrl($groupmap);
       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,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,$crstype) = @_;
       $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>');
       if ($crstype eq 'Community') {
           $r->print(&mt("A group folder is added to the 'Community Groups' folder which contains folders for all groups in the community."));
       } else {
           $r->print(&mt("A group folder is added to the 'Course Groups' folder which contains folders for all groups in the course."));
       }
       $r->print('</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,$crstype) = @_;
       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,$crstype);
           if ($outcome eq '') {
               my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully re-enabled.'));
               $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
           } else {
               $r->print('<div class="LC_error">');
               if ($crstype eq 'Community') {
                   $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Community Groups' folder: [_1]",$outcome));
               } else {
                   $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome));
               }
               $r->print('</div>');
           }
       } else {
           my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling group failed.'),1);
           $message = &Apache::loncommon::confirmwrapper($message);
           $r->print($message);
     }      }
       return;
 }  }
   
 sub header {  sub header {
Line 1051  sub header { Line 1499  sub header {
        {'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" action="">
   
 END  END
     if ($action eq 'create' || $action eq 'modify') {      if ($action eq 'create' || $action eq 'modify') {
Line 1078  sub onload_action { Line 1526  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 1110  sub build_members_list { Line 1557  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 ($dirlistref,$listerror) = 
     foreach my $line (@dir_list) {          &Apache::portfolio::get_dir_list($portpath,undef,$group);
         my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);      if (ref($dirlistref) eq 'ARRAY') {
         if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) {           foreach my $line (@{$dirlistref}) {
             if ($dirptr&$testdir) {              my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);
                 $currdir .= '/'.$filename;              if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) { 
                 $$numdirs ++;                  if ($dirptr&$testdir) {
                 &group_files($numfiles,$numdirs)                      $portpath .= '/'.$filename;
             } else {                      $$numdirs ++;
                 $$numfiles ++;                      &group_files($group,$portpath,$numfiles,$numdirs)
                   } else {
                       $$numfiles ++;
                   }
             }              }
         }          }
     }      }
Line 1132  sub group_members { Line 1582  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;      foreach my $member (keys(%memberhash)) {
     my $previous = 0;  
     my $future = 0;  
     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'} = '<nobr>'.$active.          foreach my $type ('active','previous','future') {
             '&nbsp;-&nbsp;active</nobr><br /><nobr>'.$previous.              $$group_info{$group}{'totalmembers'} .= 
             '&nbsp;-&nbsp;previous</nobr><br /><nobr>'.$future.                 &open_list_window($group,$type,$membercounts{$type},$lt{$type});
             '&nbsp;-&nbsp;future</nobr>';          }
     }      }
     return 'ok';      return 'ok';
 }  }
   
   sub open_list_window {
       my ($group,$status,$count,$text) = @_;
       my $entry;
       if ($count > 0) {
           $entry = '<span class="LC_nobreak"><a href="javascript:openGroupRoster('.
                    "'$group','$status'".')">'.$text.'</a>&nbsp;-&nbsp;'.$count.
                    '</span><br />';
       } else {
           $entry = '<span class="LC_nobreak">'.$text.'&nbsp;-&nbsp;'.$count.'</span><br />';
       }
       return $entry;
   }
   
   
 sub general_settings_form {  sub general_settings_form {
     my ($r,$cdom,$cnum,$action,$formname,$page,$functions,$tools,      my ($r,$cdom,$cnum,$action,$formname,$page,$functions,$tools,
Line 1175  sub general_settings_form { Line 1640  sub general_settings_form {
                            $gpterm,$ucgpterm,$crstype);                             $gpterm,$ucgpterm,$crstype);
     &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);      &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);
     if ($action eq 'create') {      if ($action eq 'create') {
         &membership_options($r,$action,$formname,$sectioncount,3,$gpterm,          &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3,
     $ucgpterm);                              $gpterm,$ucgpterm,$crstype);
         $nexttext = $$navbuttons{'gtns'};          $nexttext = $$navbuttons{'gtns'};
     } else {      } else {
         my @available = ();          my @available = ();
Line 1185  sub general_settings_form { Line 1650  sub general_settings_form {
         @{$tools} = sort(keys(%{$functions}));          @{$tools} = sort(keys(%{$functions}));
         &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs,          &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs,
        $fixedprivs,\@available,$formname,         $fixedprivs,\@available,$formname,
        $gpterm,$ucgpterm);         $gpterm,$ucgpterm,$functions,$crstype);
         &mapping_options($r,$action,$formname,$page,$sectioncount,          &mapping_options($r,$action,$formname,$page,$sectioncount,
                          $states,$stored,$navbuttons,4,5,                           $states,$stored,$navbuttons,4,5,
  $gpterm,$ucgpterm,$crstype);   $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
         $nexttext = $$navbuttons{'mose'};          $nexttext = $$navbuttons{'mose'};
     }      }
     $prevtext = $$navbuttons{'gtpp'};      $prevtext = $$navbuttons{'gtpp'};
Line 1201  sub groupsettings_options { Line 1666  sub groupsettings_options {
     my ($r,$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?",          'gran' => 'Granularity',
           'dquo' => 'Disk quota',
     );      );
     my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);      my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);
     &topic_bar($r,$image,$lt{'gnde'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}));
     $r->print('  
      <table class="LC_descriptive_input">      # Group Name
       <tr>      $r->print(&Apache::lonhtmlcommon::start_pick_box()
        <td class="LC_description">'.$lt{'gnam'}.':</td>               .&Apache::lonhtmlcommon::row_title($lt{'gnam'})
        <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" />'
                    .' <span class="LC_nobreak">('
                    .$lt{'lett'}.')</span>'
           );
     } 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'});
     }      }
     $r->print(<<"END");      $r->print(&Apache::lonhtmlcommon::row_closure());
        </td>  
       <tr>      # Group Title
       <tr>      $r->print(&Apache::lonhtmlcommon::row_title($lt{'desc'})
        <td class="LC_description">$lt{'desc'}:</td>               .'<input type="text" name="description" size="40" value="" />'
        <td colspan="5"><input type="text" name="description" size="40"               .&Apache::lonhtmlcommon::row_closure()
                                                     value="" />      );
        </td>  
       <tr>      # Collaborative Tools
       <tr>  
        <td class="LC_description">$lt{'func'}:</td>  
 END  
     my $numitems = keys(%{$functions});      my $numitems = keys(%{$functions});
     my $halfnum = int($numitems/2);      my $halfnum = int($numitems/2);
     my $remnum = $numitems%2;      my $remnum = $numitems%2;
     if ($remnum) {      if ($remnum) {
         $halfnum ++;          $halfnum ++;
     }      }
     my @allfunctions = sort(keys (%{$functions}));      my @allfunctions = sort(keys(%{$functions}));
     for (my $i=0; $i<$halfnum; $i++) {  
         $r->print('<td><label><input type="checkbox" name="tool" value="'.      $r->print(&Apache::lonhtmlcommon::row_title($lt{'func'})
                   $allfunctions[$i].'" />&nbsp;'.               .'<div>'
                    $$functions{$allfunctions[$i]}.'</label></td>               .'<input type="button" value="'.&mt('check all').'"'
                    <td>&nbsp;</td><td>&nbsp;</td>');               .' onclick="javascript:checkAll(document.'.$formname.'.tool)" />'
     }               .'&nbsp;<input type="button" value="'.&mt('uncheck all').'"'
     $r->print('<td><input type="button" value="check all" '.               .' onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />'
               'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'.               .'</div>'
               '</td></tr><tr><td>&nbsp;</td>');               .'<table cellpadding="5px"><tr>' # FIXME Get rid of inflexible table (-> float)
     for (my $j=$halfnum; $j<@allfunctions; $j++) {      );
         $r->print('<td><label><input type="checkbox" name="tool" value="'.      for (my $i=0; $i<@allfunctions; $i++) {
                   $allfunctions[$j].'" />&nbsp;'.          $r->print('<td><label><span class="LC_nobreak">'
                   $$functions{$allfunctions[$j]}.'</label></td>                   .'<input type="checkbox" name="tool" value="'
                   <td>&nbsp;</td><td>&nbsp;</td>');                   .$allfunctions[$i].'" /> '
     }                   .&mt($$functions{$allfunctions[$i]})
     if ($remnum) {                   .'</span></label></td>'
         $r->print('<td>&nbsp;</td>');          );
           if ($i == $halfnum - 1) {
               $r->print('</tr><tr>');
           }
     }      }
     $r->print('      $r->print('</tr></table>'
        <td>               .&Apache::lonhtmlcommon::row_closure()
         <input type="button" value="uncheck all"      );
           onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />  
        </td>      # Granularity
       </tr>      $r->print(&Apache::lonhtmlcommon::row_title($lt{'gran'})
       <tr>               .$lt{'doyo'}.'<br />'
        <td class="LC_description">'.&mt('Granularity:').'</td>               .'<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>');               .'<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(' <span class="LC_nobreak">('
                                       $$stored{'granularity'}).')');                   .&mt('Currently set to [_1].'
                        ,'"'.&mt($$stored{'granularity'}).'"')
                    .')</span>'
           );
     }      }
     $r->print('      $r->print(&Apache::lonhtmlcommon::row_closure());
        </td>  
       </tr>      # Disk Quota
       <tr>      $r->print(&Apache::lonhtmlcommon::row_title($lt{'dquo'}));
        <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('<span class="LC_info">'
                    .&mt('If you enable the group portfolio for the '.$gpterm
                        .', allocate a disk quota.')
                    .'</span>'
           );
     } else {      } else {
         $r->print(&mt('Quota allocated to file repository:'));          $r->print(&mt('Quota allocated to group portfolio:'));
     }       } 
     $r->print('&nbsp;<input type="text" name="quota" size="4" />Mb');      $r->print(' '.&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(&Apache::lonhtmlcommon::row_closure(1));
        </td>  
       </tr>      $r->print(&Apache::lonhtmlcommon::end_pick_box());
      </table>  
 ');  
     return;      return;
 }  }
   
Line 1324  sub get_quota_constraints { Line 1803  sub get_quota_constraints {
 }  }
   
 sub membership_options {  sub membership_options {
     my ($r,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm) = @_;      my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm,$crstype)=@_;
     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 course users from which you will select members of the new group.',
                           lc($crstype).' users from which you will select ',                  'pica' => 'Pick the criteria to use to build a list of course users from which you will select additional members of the group.',
                 'meof' => "members of the new $gpterm.",                  'ifno' => 'If you do not wish to add members when you first create the group, there is no need to pick any criteria.', 
                 'admg' => "additional members of the $gpterm.",  
                 'ifno' => "If you do not wish to add members when you first ".  
                           "create the $gpterm, do not make any selections.",  
                 'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of $gpterm members triggered by specified role and section changes.",  
                 'acty' => 'Access types',                  'acty' => 'Access types',
                 'coro' => $crstype.' roles',                  'coro' => 'Course roles',
                 'cose' => $crstype.' sections',                  'cose' => 'Course sections',
              );               );
       if ($crstype eq 'Community') {
           $lt{'picr'} = &mt('Pick the criteria to use to build a list of community participants from which you will select ');
           $lt{'asub'} = &mt('A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section [_1]changes[_2] in the course.','<i>','</i>');
           $lt{'coro'} = &mt('Community roles');
           $lt{'cose'} = &mt('Community sections');
       } else {
           $lt{'asub'} = &mt('A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section [_1]changes[_2] in the course.','<i>','</i>');
       }
     my %status_types = (      my %status_types = (
                    active => &mt('Currently has access'),                     active => &mt('Currently has access'),
                    previous => &mt('Previously had access'),                     previous => &mt('Previously had access'),
                    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');
     my @roles = ('st','cc','in','ta','ep');      if ($crstype eq 'Community') {
           push(@roles,'co');
       } else {
           push(@roles,'cc');
       }
       push (@roles,('in','ta','ep','ad','cr'));
   
     my @sections = keys(%{$sectioncount});      my @sections = keys(%{$sectioncount});
   
     &topic_bar($r,$image,$lt{'pipa'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
     $r->print('       <b>'.$lt{'gmem'}.'</b><br />');
      <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{'picr'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});
     } else {      } else {
         $r->print($lt{'admg'});          $r->print($lt{'pica'});
     }      }
     $r->print('      $r->print('
      <br />       <br />
Line 1365  sub membership_options { Line 1851  sub membership_options {
      <table class="LC_status_selector">       <table class="LC_status_selector">
       <tr>        <tr>
        <th>'.$lt{'acty'}.'</th>         <th>'.$lt{'acty'}.'</th>
        <th>'.$lt{'coro'}.'</th>');         <th>'.$lt{'coro'}.'</th>
     if (@sections >0) {         <th>'.$lt{'cose'}.'</th>
         $r->print('        </tr><tr><td>');
        <th>'.$lt{'cose'}.'</th>');  
     }  
     $r->print('</tr><tr><td>');  
     $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types));      $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types));
     $r->print('</td><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><td>'.      } else {
         &sections_selection(\@sections,'sectionpick').'</td>');          @sections = ('all','none');
     }      }
     $r->print('      $r->print('</td><td>'.
                 &sections_selection(\@sections,'sectionpick').'</td>
       </tr>        </tr>
      </table>');       </table>');
     return;      return;
Line 1396  sub sections_selection { Line 1880  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 1404  sub sections_selection { Line 1888  sub sections_selection {
         }          }
     }      }
     my $output = '      my $output = '
         <select name="'.$elementname.'" multiple="true" size="'.$numvisible.'">          <select name="'.$elementname.'" multiple="multiple" size="'.$numvisible.'">
           '.$section_sel.'            '.$section_sel.'
         </select>';          </select>';
     return $output;      return $output;
Line 1412  sub sections_selection { Line 1896  sub sections_selection {
   
 sub access_date_settings {  sub access_date_settings {
     my ($r,$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 1424  sub access_date_settings { Line 1906  sub access_date_settings {
         }          }
     }      }
     my ($table) = &date_setting_table($starttime,$endtime,$formname);      my ($table) = &date_setting_table($starttime,$endtime,$formname);
     &topic_bar($r,$image,$lt{'sten'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$sten).'
     $r->print('  
     '.$table.'      '.$table.'
     ');      ');
     return;      return;
Line 1478  sub choose_members_form { Line 1959  sub choose_members_form {
         }          }
     }      }
     &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,      &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,
                           $fixedprivs,\@available,$formname,$gpterm,$ucgpterm);                            $fixedprivs,\@available,$formname,$gpterm,$ucgpterm,
                             $functions,$crstype);
     my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx,      my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx,
      $stored,$memimg,$users,$userdata,       $stored,$memimg,$users,$userdata,
      $granularity,\%origmembers,$gpterm,       $granularity,\%origmembers,$gpterm,
Line 1502  sub display_navbuttons { Line 1984  sub display_navbuttons {
       <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('
Line 1528  sub print_current_settings { Line 2015  sub print_current_settings {
  $granularity,$quota,$available,$unavailable,$gpterm,$ucgpterm) = @_;   $granularity,$quota,$available,$unavailable,$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:',          stda => 'Start date:',
         stda => 'Start date',  
         enda => 'End date:',          enda => 'End date:',
     );      );
       $lt{'difn'} = &mt('Different collaborative tools[_1]for different members:','<br />');
     my $showstart = &Apache::lonlocal::locallocaltime($startdate);      my $showstart = &Apache::lonlocal::locallocaltime($startdate);
     my $showend;      my $showend;
     if ($enddate == 0) {      if ($enddate == 0) {
Line 1570  sub print_current_settings { Line 2057  sub print_current_settings {
   <td valign="top">'.$description.'</td>    <td valign="top">'.$description.'</td>
   <td>    <td>
 ');  ');
   
     if (@{$available} > 0) {      if (@{$available} > 0) {
         $r->print('<b>Available:</b>          $r->print('<b>'.&mt('Available for assignment to members:').'</b>');
                     <table class="LC_group_priv"><tr>');          $r->print('<ul>');
         my $rowcell = int(@{$available}/2) + @{$available}%2;  
         for (my $i=0; $i<@{$available}; $i++) {          for (my $i=0; $i<@{$available}; $i++) {
             if (@{$available} > 3) {              $r->print('<li>'.&mt($$functions{$$available[$i]}).'</li>');
                 if ($i==$rowcell) {  
                     $r->print('</tr><tr>');  
                 }  
             }  
             $r->print('<td>'.$$functions{$$available[$i]}.  
       '</td><td>&nbsp;</td>');  
         }  
         if ((@{$available} > 3) && (@{$available}%2)) {  
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');  
         }          }
         $r->print('</tr></table><br />');          $r->print('</ul>');
     }      }
   
     if (@{$unavailable} > 0) {      if (@{$unavailable} > 0) {
         $r->print('<b>Unavailable:</b>          $r->print('<b>'.&mt('Unavailable for assignment:').'</b>');
                     <table class="LC_group_priv"><tr>');          $r->print('<ul>');
         my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;          for (my $i=0; $i<@{$unavailable}; $i++) {
         for (my $j=0; $j<@{$unavailable}; $j++) {              $r->print('<li>'.&mt($$functions{$$unavailable[$i]}).'</li>');
             if (@{$unavailable} > 3) {  
                 if ($j==$rowcell) {  
                     $r->print('</tr><tr>');  
                 }  
             }  
             $r->print('<td>'.$$functions{$$unavailable[$j]}.  
       '</td><td>&nbsp;</td>');  
         }          }
         if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {          $r->print('</ul>');
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');  
         }  
         $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"><b>$lt{'difn'}</b> $granularity</td>    <td valign="top"><b>$lt{'difn'}</b> $granu_text</td>
   <td valign="top">$quota Mb</td>     <td valign="top">$quota_text</td> 
   <td valign="top"><b>$lt{'stda'}</b> $showstart<br />    <td valign="top"><b>$lt{'stda'}</b> $showstart<br />
       <b>$lt{'enda'}</b> $showend        <b>$lt{'enda'}</b> $showend
   </td>    </td>
Line 1623  sub pick_new_members { Line 2095  sub pick_new_members {
     my ($r,$action,$formname,$available,$idx,$stored,$img,$users,$userdata,      my ($r,$action,$formname,$available,$idx,$stored,$img,$users,$userdata,
  $granularity,$origmembers,$gpterm,$ucgpterm) = @_;   $granularity,$origmembers,$gpterm,$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 1657  sub pick_new_members { Line 2130  sub pick_new_members {
             $r->print(&check_uncheck_tools($r,$available));              $r->print(&check_uncheck_tools($r,$available));
         }          }
     }      }
     &topic_bar($r,$img,$lt{'gpme'});      $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'gpme'}));
     if (keys(%members) > 0) {      if (keys(%members) > 0) {
         $r->print('          $r->print('
     <table>      <table>
Line 1665  sub pick_new_members { Line 2138  sub pick_new_members {
         &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>              $r->print('<td>
      <fieldset><legend><b>'.$lt{'setf'}.'</b></legend>       <fieldset><legend>'.$lt{'setf'}.'</legend>
       <nobr>        <span class="LC_nobreak">
       <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.')" />
       </nobr>        </span>
      </fieldset></td>');       </fieldset></td>');
         }          }
         $r->print('</tr></table>          $r->print('</tr></table>
Line 1695  sub pick_new_members { Line 2168  sub pick_new_members {
             if ($granularity eq 'Yes') {              if ($granularity eq 'Yes') {
                 $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'                  $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"><nobr><b>'.&mt('All:').'</b>&nbsp;');   <td align="center"><span class="LC_nobreak"><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></td></tr>');                  $r->print('</span></td></tr>');
             }              }
         }          }
         my %Sortby = ();          my %Sortby = ();
Line 1735  sub pick_new_members { Line 2208  sub pick_new_members {
   '<td>'.$id.'</td>'.    '<td>'.$id.'</td>'.
   '<td>'.$section.'</td>');    '<td>'.$section.'</td>');
                 if (@{$available} > 0) {                  if (@{$available} > 0) {
                     $r->print('<td align="center"><nobr>'.                      $r->print('<td align="center"><span class="LC_nobreak">'.
                               '&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 1746  sub pick_new_members { Line 2219  sub pick_new_members {
                           $tool.'" value="'.$user.'" />'.$tool.'&nbsp;&nbsp;&nbsp;');                            $tool.'" value="'.$user.'" />'.$tool.'&nbsp;&nbsp;&nbsp;');
                         }                          }
                     }                      }
                     $r->print('</nobr></td>');                      $r->print('</span></td>');
                 }                  }
                 $r->print(&Apache::loncommon::end_data_table_row()."\n");                  $r->print(&Apache::loncommon::end_data_table_row()."\n");
             }              }
Line 1764  sub pick_new_members { Line 2237  sub pick_new_members {
   
 sub privilege_specificity {  sub privilege_specificity {
     my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,      my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,
  $formname,$gpterm,$ucgpterm) = @_;   $formname,$gpterm,$ucgpterm,$functions,$crstype) = @_;
     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 '.                  'will receive by default for a specific tool.',
                 'will receive by default.',  
       'oppr' => 'Optional privileges',        'oppr' => 'Optional privileges',
       'defp' => 'The default privileges new members will receive are:',         'defp' => 'The default privileges new members will receive are:', 
     );      );
       $lt{'plin'} = &mt('Indicate which [_1]optional[_2] privileges members '.
                         'will receive by default for a specific tool.','<b>','</b>');
       if ($crstype eq 'Community') {
           $lt{'thes'} = &mt('These will be the privileges given to members assigned in the future via automatic group assignment for users who receive specific sections/roles in the community '); 
       }
     my $totaloptionalprivs = 0;      my $totaloptionalprivs = 0;
     foreach my $tool (@{$tools}) {      foreach my $tool (@{$tools}) {
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {          foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
Line 1805  sub privilege_specificity { Line 2283  sub privilege_specificity {
             }              }
         }          }
     }      }
     &topic_bar($r,$img,$lt{'uprv'});      $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'uprv'}));
     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 1815  sub privilege_specificity { Line 2293  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 1831  sub privilege_specificity { Line 2309  sub privilege_specificity {
         }          }
         if ($totaloptionalprivs) {          if ($totaloptionalprivs) {
             $r->print('              $r->print('
 <br /><br />  <br />
 <label><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr></label><br />  <label><span class="LC_nobreak"><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</span></label><br />
 <label><nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr></label>');  <label><span class="LC_nobreak"><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</span></label><br /><br />');
         } 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($lt{'plin'});              $r->print($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 1860  sub privilege_specificity { Line 2338  sub privilege_specificity {
             $r->print($lt{'algm'}.'<br /><br />');              $r->print($lt{'algm'}.'<br /><br />');
         }          }
         &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs,          &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs,
     $available);      $available,$functions);
     } 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 1883  sub privilege_specificity { Line 2362  sub privilege_specificity {
 }  }
   
 sub default_privileges {  sub default_privileges {
     my ($r,$action,$tools,$toolprivs,$fixedprivs,$available) = @_;      my ($r,$action,$tools,$toolprivs,$fixedprivs,$available,$functions) = @_;
     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('LC_group_priv_box').      $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').
       &Apache::lonhtmlcommon::row_title($lt{'func'},undef,        &Apache::lonhtmlcommon::row_title($lt{'func'},undef,
  'LC_groups_functionality'));        'LC_groups_functionality'));
     $r->print(join('</td><td class="LC_groups_functionality">',@{$tools}));      my @tableHeader;
       if ((ref($functions) eq 'HASH') && (ref($tools) eq 'ARRAY')) {
           @tableHeader = map { $functions->{$_}; } @{$tools};
       }
    $r->print(join('</td><td class="LC_groups_functionality">', @tableHeader));
     $r->print(&Apache::lonhtmlcommon::row_closure(1));      $r->print(&Apache::lonhtmlcommon::row_closure(1));
     my $fixed = '';      my $fixed = '';
     my $dynamic = '';      my $dynamic = '';
Line 1908  sub default_privileges { Line 2391  sub default_privileges {
  if ($fixed ne '') {   if ($fixed ne '') {
     $fixed .= '</td><td class="LC_groups_fixed">';      $fixed .= '</td><td class="LC_groups_fixed">';
  }   }
                 $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'&nbsp;';                  $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />'
                            .'<span class="LC_nobreak">'.&mt($$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;';
Line 1916  sub default_privileges { Line 2400  sub default_privileges {
                         $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>'."\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.'" />'.&mt($$toolprivs{$tool}{$priv}).'</label></span></td>'."\n";
             }              }
         }          }
         if ($privcount == 0) {          if ($privcount == 0) {
             $dynamic .= '<td>None</td>'."\n";              $dynamic .= '<td>'.&mt('None').'</td>'."\n";
         }          }
         if ($privcount < 3) {          if ($privcount < 3) {
             $dynamic .= '</td>              $dynamic .= '<td>&nbsp;</td>'."\n";
                          <td>&nbsp;</td>'."\n";  
         } elsif ($privcount%2) {          } elsif ($privcount%2) {
             $dynamic = '<td>&nbsp;</td>'."\n";              $dynamic = '<td>&nbsp;</td>'."\n";
         }          }
Line 1957  sub display_defprivs { Line 2441  sub display_defprivs {
     my $rowColor2 = "#eeeeee";      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 2045  sub change_members_form { Line 2529  sub change_members_form {
     $r->print('      $r->print('
 <br />  <br />
 ');  ');
     &topic_bar($r,1,$lt{'grse'});      $r->print(&Apache::lonhtmlcommon::topic_bar(1,$lt{'grse'}));
     &print_current_settings($r,$action,$functions,$startdate,$enddate,      &print_current_settings($r,$action,$functions,$startdate,$enddate,
     $groupname,$description,$granularity,$quota,      $groupname,$description,$granularity,$quota,
     \@available,\@unavailable,$gpterm,$ucgpterm);      \@available,\@unavailable,$gpterm,$ucgpterm);
     &topic_bar($r,2,$lt{'mogm'});      $r->print(&Apache::lonhtmlcommon::topic_bar(2,$lt{'mogm'}));
     &current_membership($r,$cdom,$cnum,$formname,$groupname,\@available,      my $numcurrent = &current_membership($r,$cdom,$cnum,$formname,$groupname,
  \@unavailable,$fixedprivs,$granularity,$specificity);                                           \@available,\@unavailable,$fixedprivs,
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,                   $granularity,$specificity);
                         $$states{$action}[$page+1],$nexttext);      if ($numcurrent > 0) {
           &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                               $$states{$action}[$page+1],$nexttext);
       } else {
           &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
       }
     return;      return;
 }  }
   
Line 2066  sub current_membership { Line 2555  sub current_membership {
                                           'actn' => 'Action?',                                            'actn' => 'Action?',
                                           'name' => 'Name',                                            'name' => 'Name',
                                           'usnm' => 'Username',                                            'usnm' => 'Username',
                                             'stid' => 'ID',
                                           'doma' => 'Domain',                                            'doma' => 'Domain',
                                           'stda' => 'Start Date',                                            'stda' => 'Start Date',
                                           'enda' => 'End Date',                                            'enda' => 'End Date',
Line 2073  sub current_membership { Line 2563  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('
    <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 2101  sub current_membership { Line 2592  sub current_membership {
                 $r->print(&check_uncheck_tools($r,$available));                  $r->print(&check_uncheck_tools($r,$available));
                 $r->print('                  $r->print('
      <td>       <td>
       <nobr>        <span class="LC_nobreak">
        <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>         <fieldset><legend>'.$lt{'curf'}.'</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>       </span>
     </td>      </td>
 ');  ');
             }              }
Line 2126  END Line 2617  END
      <th><a href="javascript:changeSort('fullname')">$lt{'name'}</a></th>       <th><a href="javascript:changeSort('fullname')">$lt{'name'}</a></th>
      <th><a href="javascript:changeSort('username')">$lt{'usnm'}</a></th>       <th><a href="javascript:changeSort('username')">$lt{'usnm'}</a></th>
      <th><a href="javascript:changeSort('domain')">$lt{'doma'}</a></th>       <th><a href="javascript:changeSort('domain')">$lt{'doma'}</a></th>
      <th><a href="javascript:changeSort('id')">ID</a></th>       <th><a href="javascript:changeSort('id')">$lt{'ID'}</a></th>
      <th><a href="javascript:changeSort('start')">$lt{'stda'}</a></th>       <th><a href="javascript:changeSort('start')">$lt{'stda'}</a></th>
      <th><a href="javascript:changeSort('end')">$lt{'enda'}</a></th>       <th><a href="javascript:changeSort('end')">$lt{'enda'}</a></th>
 END  END
Line 2136  END Line 2627  END
             $colspan++;                $colspan++;  
         }          }
         if ($addtools) {          if ($addtools) {
             $r->print('<th>'.&mt('Additional Functionality').'</th>');              $r->print('<th>'.&mt('Additional Tools').'</th>');
             $colspan++;              $colspan++;
         }          }
         $r->print(&Apache::loncommon::end_data_table_header_row());          $r->print(&Apache::loncommon::end_data_table_header_row());
Line 2144  END Line 2635  END
             if ($granularity eq 'Yes') {              if ($granularity eq 'Yes') {
                 $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'                  $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"><nobr><b>'.&mt('All:').   <td colspan="'.$colspan.'" align="center"><span class="LC_nobreak"><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></td></tr>');                  $r->print('</span></td></tr>');
             }              }
         }          }
         my %Sortby = ();          my %Sortby = ();
Line 2179  END Line 2670  END
                 $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').'                  $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').'
                             <td>');                              <td>');
                 if ($$current{$user}{changestate} eq 'reenable') {                  if ($$current{$user}{changestate} eq 'reenable') {
                     $r->print('<nobr><label>'.                       $r->print('<span class="LC_nobreak"><label>'. 
    '<input type="checkbox" name="reenable" value="'.$user.'" />'.     '<input type="checkbox" name="reenable" value="'.$user.'" />'.
    $lt{'reen'}.'</label></nobr><br />');     $lt{'reen'}.'</label></span><br />');
                 } elsif ($$current{$user}{changestate} eq 'expire') {                  } elsif ($$current{$user}{changestate} eq 'expire') {
                     $r->print('<nobr><label>'.                      $r->print('<span class="LC_nobreak"><label>'.
    '<input type="checkbox" name="expire" value="'.$user.'" />'.     '<input type="checkbox" name="expire" value="'.$user.'" />'.
    $lt{'expi'}.'</label></nobr><br />');     $lt{'expi'}.'</label></span><br />');
                 } elsif ($$current{$user}{changestate} eq 'activate') {                  } elsif ($$current{$user}{changestate} eq 'activate') {
                     $r->print('<nobr><label>'.                      $r->print('<span class="LC_nobreak"><label>'.
    '<input type="checkbox" name="activate" value="'.$user.'" />'.     '<input type="checkbox" name="activate" value="'.$user.'" />'.
    $lt{'acti'}.'</label></nobr><br />');     $lt{'acti'}.'</label></span><br />');
                 }                  }
                 $r->print('<nobr><label>'.                  $r->print('<span class="LC_nobreak"><label>'.
    '<input type="checkbox" name="deletion" value="'.$user.'" />'.     '<input type="checkbox" name="deletion" value="'.$user.'" />'.
    $lt{'dele'}.'</label></nobr>');     $lt{'dele'}.'</label></span>');
                 if ($specificity eq 'Yes') {                  if ($specificity eq 'Yes') {
                     $r->print('<br /><nobr><label>'.                      $r->print('<br /><span class="LC_nobreak"><label>'.
    '<input type="checkbox" name="changepriv" value="'.$user.'" />'.$lt{'chpr'}.     '<input type="checkbox" name="changepriv" value="'.$user.'" />'.$lt{'chpr'}.
    '</label></nobr>');     '</label></span>');
                 }                  }
                 $r->print('                  $r->print('
    </td>'.     </td>'.
Line 2208  END Line 2699  END
    '<td>'.$start.'</td>'.     '<td>'.$start.'</td>'.
    '<td>'.$end.'</td>');     '<td>'.$end.'</td>');
                 if ($hastools) {                  if ($hastools) {
                     $r->print('<td align="left"><nobr>'.                      $r->print('<td align="left"><span class="LC_nobreak">'.
                                   '&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 2224  END Line 2715  END
                          }                           }
                          $r->print('&nbsp;&nbsp;&nbsp;');                           $r->print('&nbsp;&nbsp;&nbsp;');
                     }                      }
                     $r->print('</nobr></td>');                      $r->print('</span></td>');
                 }                  }
                 if ($addtools) {                  if ($addtools) {
                     $r->print('<td align="left">');                      $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('<span class="LC_nobreak"><label><input type="checkbox"
                                           name="user_'.$tool.'" value="'.                                            name="user_'.$tool.'" value="'.
                                           $user.'" />'.$tool.                                            $user.'" />'.$tool.
                                           '</label></nobr>&nbsp;&nbsp;&nbsp;');                                            '</label></span>&nbsp;&nbsp;&nbsp;');
                         }                          }
                     } else {                      } else {
                         foreach my $tool (@{$$current{$user}{newtools}}) {                          foreach my $tool (@{$$current{$user}{newtools}}) {
                             $r->print('<nobr><input type="hidden"                               $r->print('<span class="LC_nobreak"><input type="hidden" 
                                           name="user_'. $tool.'" value="'.                                            name="user_'. $tool.'" value="'.
                                           $user.'" />'.$tool.                                            $user.'" />'.$tool.
                                           '</nobr>&nbsp;&nbsp;&nbsp;');                                            '</span>&nbsp;&nbsp;&nbsp;');
                         }                          }
                     }                      }
                     $r->print('</td>');                      $r->print('</td>');
Line 2249  END Line 2740  END
             }              }
         }          }
         $r->print(&Apache::loncommon::end_data_table());          $r->print(&Apache::loncommon::end_data_table());
       } else {
           $r->print(
               '<p class="LC_info">'
              .&mt('There are no active, future or previous group members to modify.')
              .'</p>');
     }      }
     return;      return $numcurrent;
 }  }
   
 sub check_uncheck_buttons {  sub check_uncheck_buttons {
Line 2258  sub check_uncheck_buttons { Line 2754  sub check_uncheck_buttons {
     $r->print('      $r->print('
      <td '.$colspan.'>       <td '.$colspan.'>
        <fieldset>         <fieldset>
        <legend><b>'.$title.'</b></legend>         <legend>'.$title.'</legend>
       <nobr>        <span class="LC_nobreak">
        <input type="button" value="check all"         <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.')" />
       </nobr>        </span>
        </fieldset>         </fieldset>
      </td>       </td>
 ');  ');
Line 2291  sub change_privs_form { Line 2787  sub change_privs_form {
     } else {      } else {
         $nexttext = $$navbuttons{'mose'};          $nexttext = $$navbuttons{'mose'};
     }      }
     &topic_bar($r,3,&mt('Members to delete or expire'));      $r->print(&Apache::lonhtmlcommon::topic_bar(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) {
Line 2316  sub change_privs_form { Line 2812  sub change_privs_form {
         }          }
     }      }
     if (!$exp_or_del) {      if (!$exp_or_del) {
         $r->print($lt{'nome'}.'<br />');          $r->print('<p class="LC_info">'.$lt{'nome'}.'</p>');
     }      }
           
     &topic_bar($r,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,$action,$formname,$tools,      my $numchgs = &member_privileges_form($r,$action,$formname,$tools,
                                           $toolprivs,$fixedprivs,$userdata,                                            $toolprivs,$fixedprivs,$userdata,
Line 2336  sub change_privs_form { Line 2832  sub change_privs_form {
 }  }
   
 sub add_members_form {  sub add_members_form {
     my ($r,$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,$gpterm,$ucgpterm)=@_;           $stored,$states,$navbuttons,$gpterm,$ucgpterm,$crstype)=@_;
     $r->print(' <br />');      $r->print(' <br />');
     my @available = ();      my @available = ();
     my @unavailable = ();      my @unavailable = ();
Line 2346  sub add_members_form { Line 2842  sub add_members_form {
     &print_current_settings($r,$action,$functions,$startdate,$enddate,      &print_current_settings($r,$action,$functions,$startdate,$enddate,
     $groupname,$description,$granularity,$quota,      $groupname,$description,$granularity,$quota,
     \@available,\@unavailable,$gpterm,$ucgpterm);      \@available,\@unavailable,$gpterm,$ucgpterm);
     &membership_options($r,$action,$formname,$sectioncount,1,$gpterm,$ucgpterm);      &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm,
                           $ucgpterm,$crstype);
     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,
Line 2375  sub choose_privs_form { Line 2872  sub choose_privs_form {
         $nexttext = $$navbuttons{'adme'};          $nexttext = $$navbuttons{'adme'};
     }      }
   
     &topic_bar($r,6,&mt('[_1] member privileges',$ucgpterm));      $r->print(&Apache::lonhtmlcommon::topic_bar(6,&mt('Setting optional privileges for specific group members')));
   
     &member_privileges_form($r,$action,$formname,$tools,$toolprivs,      &member_privileges_form($r,$action,$formname,$tools,$toolprivs,
                             $fixedprivs,$userdata,$usertools,$idx,undef,                              $fixedprivs,$userdata,$usertools,$idx,undef,
                             $states,$stored,$gpterm);                              $states,$stored,$gpterm);
   
     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,$sectioncount,                           $states,$stored,$navbuttons,$img1,$img2,
                              $states,$stored,$navbuttons,$img1,$img2,                           $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
                              $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,
Line 2459  sub member_privileges_form { Line 2954  sub member_privileges_form {
         $usertools,$idx,$memchg,$states,$stored,$gpterm) = @_;          $usertools,$idx,$memchg,$states,$stored,$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 2539  sub member_privileges_form { Line 3038  sub member_privileges_form {
                     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>'.                              $r->print('<fieldset><legend>'.&mt($tool).'</legend>');
       '<th colspan="'.$colspan.'">'.                              $r->print('<table><tr>');
                                       $tool.'</th></tr><tr>');  
                             my $privcount = 0;                              my $privcount = 0;
                             foreach my $priv (@{$showboxes{$tool}}) {                              foreach my $priv (@{$showboxes{$tool}}) {
                                 $privcount ++;                                  $privcount ++;
Line 2555  sub member_privileges_form { Line 3053  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>'.&mt($$toolprivs{$tool}{$priv}).'</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 2575  sub member_privileges_form { Line 3074  sub member_privileges_form {
                                     }                                      }
                                 }                                  }
                             }                              }
                             $r->print('</tr></table></td><td>&nbsp;</td>');                              $r->print('</tr></table></fieldset></td><td>&nbsp;</td>');
                         }                          }
                     }                      }
                     $r->print('</tr></table>');                      $r->print('</tr></table>');
Line 2599  END Line 3098  END
             }              }
         } else {          } else {
             if (keys(%{$usertools}) > 0) {              if (keys(%{$usertools}) > 0) {
                 $r->print($lt{'algr'}.'<br /><br />');                  $r->print($lt{'algr'}.'<br />'.$lt{'ifex'}.'<br /><br />');
                 &display_defprivs($r,$tools,$toolprivs,\@defprivs);                  &display_defprivs($r,$tools,$toolprivs,\@defprivs);
             } else {              } else {
                 $r->print($lt{'asno'}.'<br />');                  $r->print($lt{'asno'}.'<br />');
Line 2675  sub process_request { Line 3174  sub process_request {
         &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,          &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,
                             $enddate,$startdate,$userdata,$idx,$toolprivs,                              $enddate,$startdate,$userdata,$idx,$toolprivs,
                             $usertools,$specificity,\@defprivs,$memchg,$gpterm,                              $usertools,$specificity,\@defprivs,$memchg,$gpterm,
                             $ucgpterm);                              $ucgpterm,$crstype);
     }      }
     return;      return;
 }  }
Line 2707  sub write_group_data { Line 3206  sub write_group_data {
     }      }
     if ($quota !~ /^\d*\.?\d*$/) {      if ($quota !~ /^\d*\.?\d*$/) {
         $quota = 0;          $quota = 0;
         $r->print(&mt('The value you entered for the quota for the file repository in this [_1] contained invalid characters, so it has been set to 0 Mb. You can change this by modifying the [_1] settings.<br />',$gpterm));          $r->print('<div class="LC_warning">'
                    .&mt('The value you entered for the quota for the group portfolio 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) {      if ($quota > $maxposs) {
         $quota = $maxposs;          $quota = $maxposs;
         $r->print(&mt('The value you entered for the quota for the file repository in this [_1] exceeded the maximum possible value, so it has been set to [_2] Mb (the maximum possible value).<br />',$gpterm,$maxposs));          $r->print('<div class="LC_warning">'
                    .&mt('The value you entered for the quota for the group portfolio 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,
Line 2776  sub write_group_data { Line 3283  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].<br />',$gpterm,$result));                  my $msg = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was created.','<i>'.$groupname.'</i>'));
                   $msg = &Apache::loncommon::confirmwrapper($msg);
                   $r->print($msg);
               } else {
                   my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
                                                                        ,'<i>'.$groupname.'</i>')
                                                                        .'<br />'.$result,1);
                   $msg = &Apache::loncommon::confirmwrapper($msg);
                   $r->print($msg);
               }
           } 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,$error);
                   if (defined($navmap)) {
                       $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);
                           # modify parameter
                           if ($outcome eq 'ok') {
                               $navmap = Apache::lonnavmaps::navmap->new();
                               if (defined($navmap)) {
                                   my $parm_result = &parm_setter($navmap,$cdom,$boardsmap,
                                                                  $groupname);
                                   if ($parm_result) {
                                       $error = &mt('An error occurred while setting parameters '
                                                .'for Discussion Boards folder: '
                                                .'[_1]',$parm_result);
                                   } else {
                                       $r->print('<div class="LC_success">'.
                                                 &mt('Discussion Boards Folder created.')
                                                 .'</div>');
                                   }
                                   undef($navmap);
                               } else {
                                   if ($crstype eq 'Community') {
                                       $error = &mt("An error occurred while setting parameters '.
                                                'for Discussion Boards folder: '.
                                                'Could not retrieve community information");
                                   } else {
                                       $error = &mt("An error occurred while setting parameters '.
                                                'for Discussion Boards folder: '.
                                                'Could not retrieve course information");
                                   }
                               }
                           } else {
                               $r->print($outcome);
                           }
                       }
                   } else {
                       $error = &mt("An error occurred while retrieving the contents of the group's folder.").'<br />';
                       if ($crstype eq 'Community') {
                           $error .= &mt("You need to re-initialize the community.");
   
                       } else {
                           $error .= &mt("You need to re-initialize the course.");
                       }
                   }
                   if ($error ne '') {
                       $r->print('<div class="LC_error">'.$error.'</div>');
                   }
             }              }
             $r->print(&mt('[_1] [_2] was created.<br />',$ucgpterm,$groupname));              my $message = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was updated.','<i>'.$groupname.'</i>'));
         } else {              $message = &Apache::loncommon::confirmwrapper($message);
             $r->print(&mt('[_1] [_2] was updated.<br />',$ucgpterm,$groupname));              $r->print($message);
         }          }
     } else {      } else {
         my %actiontype = (          my %actiontype = (
Line 2791  sub write_group_data { Line 3375  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 [_2]. '.          $r->print('<p class="LC_error">'
                       'Please try again.',$actiontype{$action},$gpterm));                   .&mt('An error occurred when '.$actiontype{$action}.' the '.$gpterm.'. '
                    .'Please try again.')
                    .'</p');
     }      }
     return $result;      return $result;
 }  }
Line 2800  sub write_group_data { Line 3386  sub write_group_data {
 sub process_membership {  sub process_membership {
     my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,      my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
         $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,          $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
         $gpterm,$ucgpterm)=@_;          $gpterm,$ucgpterm,$crstype)=@_;
     my %usersettings = ();      my %usersettings = ();
     my %added= ();      my %added= ();
     my %failed = ();      my %failed = ();
Line 2811  sub process_membership { Line 3397  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 2880  sub process_membership { Line 3467  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 2891  sub process_membership { Line 3478  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 2922  sub process_membership { Line 3509  sub process_membership {
                 if (grep/^$user$/,@reenable) {                  if (grep/^$user$/,@reenable) {
                     $start = $startdate;                      $start = $startdate;
                     $end = $enddate;                      $end = $enddate;
                     $type = 'reenabled';                      $type = 're-enabled';
                 }                  }
             }              }
             if ($type eq '') {              if ($type eq '') {
Line 2945  sub process_membership { Line 3532  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 2956  sub process_membership { Line 3543  sub process_membership {
     my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,      my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,
                                                        $cnum,\%usersettings);                                                         $cnum,\%usersettings);
     if ($num_ok) {      if ($num_ok) {
         foreach my $type (sort(keys(%added))) {           my $msgall ='';
             $r->print(&mt('The following users were successfully [_1]',$type));          foreach my $type (sort(keys(%added))) {
               my $message;
               my $tmsg = "The following users were successfully $type"; 
             if (!($type eq 'deleted' || $type eq 'expired')) {                 if (!($type eq 'deleted' || $type eq 'expired')) {   
                 $r->print(&mt(' with the following privileges'));                  $tmsg .= ' with the following privileges';
             }              }
             $r->print(':<br />');              $message .= &mt($tmsg.':').'<br/>';
             foreach my $user (@{$added{$type}}) {              foreach my $user (@{$added{$type}}) {
                 my $privlist = '';                  my $privlist = '';
                 if (!($type eq 'deleted' ||  $type eq 'expired')) {                  if (!($type eq 'deleted' ||  $type eq 'expired')) {
Line 2977  sub process_membership { Line 3566  sub process_membership {
                     }                      }
                     $privlist =~ s/, $//;                      $privlist =~ s/, $//;
                 }                  }
                 $r->print($$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />');                  $message .= $$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />';
             }              }
             $r->print('<br />');              $message .= '<br/>';
               $message = &Apache::lonhtmlcommon::confirm_success($message);
               $msgall .= $message;
         }          }
           $msgall = &Apache::loncommon::confirmwrapper($msgall);
           $r->print($msgall);
     }      }
     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 />');
             }              }
         }          }
         $r->print('<br />');          $r->print('<br />');
     }      }
     if (@unchanged > 0) {  # Is that really needed?
         $r->print(&mt('No change occurred for the following users:<br />'));  #
         foreach my $user (sort(@unchanged)) {  #    if (@unchanged > 0) {
             $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');  #        $r->print(&mt('No change occurred for the following users:').'<br />');
         }  #        foreach my $user (sort(@unchanged)) {
         $r->print('<br />');  #            $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<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.')
                    .'</div>');
    $r->print('<p class="LC_info">');
           if ($crstype eq 'Community') {
               $r->print(&mt("Any currently logged in community 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>'));
   
           } else {  
               $r->print(&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>'));
           } 
           $r->print('</p>');
     } else {      } else {
         $r->print('<br />'.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.'<br />');          $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,$sectioncount,$states,$stored,      my ($r,$action,$formname,$page,$sectioncount,$states,$stored,
         $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype) = @_;          $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype,$cdom,$cnum) = @_;
     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',  
         'on' => 'on',          'on' => 'on',
         'off' => 'off',          'off' => 'off',
         'auad' => "Automatically enable $gpterm membership when roles are added?",          'auad' => "Automatically enable $gpterm membership when roles are added?",
Line 3026  sub mapping_options { Line 3640  sub mapping_options {
         '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,$stored,\%lt,$img1);      &automapping($r,$action,$stored,\%lt,$img1);
     &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype);      &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype,$cdom,$cnum,
                         $action);
     return;      return;
 }  }
   
Line 3040  sub automapping { Line 3655  sub automapping {
     if (exists($$stored{'autodrop'})) {      if (exists($$stored{'autodrop'})) {
         $drop = $$stored{'autodrop'};          $drop = $$stored{'autodrop'};
     }      }
     &topic_bar($r,$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 />      <b>'.$$lt{'gmma'}.':</b><br />'.$$lt{'adds'}.'<br />'.$$lt{'drops'}.'<br /><br />
    <nobr>'.$$lt{'auad'}.':&nbsp;     <span class="LC_nobreak">'.$$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;('.&mt('Currently set to [_1].','<b>'.$$lt{$add}.'</b>').')');
     }      }
     $r->print('      $r->print('
     </nobr><br />      </span><br />
     <nobr>'.$$lt{'auex'}.':&nbsp;      <span class="LC_nobreak">'.$$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;('.&mt('Currently set to [_1].','<b>'.$$lt{$drop}.'</b>').')');
     }      }
     $r->print('</nobr><br /><br />'.$$lt{'mapr'});      $r->print('</span><br /><br />'.$$lt{'mapr'});
 }  }
   
 sub mapping_settings {  sub mapping_settings {
     my ($r,$sectioncount,$lt,$stored,$image,$crstype) = @_;      my ($r,$sectioncount,$lt,$stored,$image,$crstype,$cdom,$cnum,$action) = @_;
     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,$image,$$lt{'pirs'});      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
     my @roles = &standard_roles();      my @roles = &standard_roles($crstype);
     my %customroles = &my_custom_roles();      my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
     $r->print(&Apache::loncommon::start_data_table().      $r->print(&Apache::loncommon::start_data_table().
       &Apache::loncommon::start_data_table_header_row());        &Apache::loncommon::start_data_table_header_row());
     $r->print('      $r->print('
Line 3079  sub mapping_settings { Line 3695  sub mapping_settings {
     }      }
     $r->print(&Apache::loncommon::end_data_table_header_row()."\n");      $r->print(&Apache::loncommon::end_data_table_header_row()."\n");
     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>';  
             }  
         }  
         $r->print(&Apache::loncommon::start_data_table_row().  
   '<td><input type="checkbox" '.  
                   'name="autorole" value="'.$role.'" /></td><td>'.$plrole.  
                   '</td>'.$sections_sel.  
   &Apache::loncommon::end_data_table_row());  
     }      }
       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 =           $r->print(&print_autorole_item($role,$roletitle,\@sections));
  '<td>'.&sections_selection(\@sections,'sec_'.$role).'</td>';      }
         }      if ($action eq 'modify') {
         $r->print(&Apache::loncommon::start_data_table_row().          foreach my $role (@{$$stored{'autorole'}}) {
   '<td><input type="checkbox" '.              if ((!grep(/^\Q$role\E$/,@customs)) && 
                   'value="'.$role.'" /></td><td>'.$role.'</td>'.                  (!grep(/^\Q$role\E$/,@roles))) {
                   $sections_sel.                  my $roletitle;
   &Apache::loncommon::end_data_table_row());                  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());      $r->print(&Apache::loncommon::end_data_table());
     return;      return;
 }  }
   
 sub standard_roles {  sub print_autorole_item {
     my @roles = ('cc','in','ta','ep','st');      my ($role,$roletitle,$sections) = @_;
     return @roles;      my $sections_sel;
 }      if (@{$sections} > 0) {
           if (($role eq 'cc') || ($role eq 'co')) {
 sub my_custom_roles {              $sections_sel = '<td align="right">'.
     my %returnhash=();                              &mt('all sections').'<input type="hidden" '.
     my %rolehash=&Apache::lonnet::dump('roles');                              'name="sec_'.$role.'" value="all" /></td>';
     foreach (keys %rolehash) {          } else {
         if ($_=~/^rolesdef\_(\w+)$/) {              $sections_sel='<td align="right">'.
             $returnhash{$1}=$1;                            &sections_selection($sections,'sec_'.$role).
                             '</td>';
         }          }
     }      }
     return %returnhash;      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 {
       my ($crstype) = @_;
       my @roles = qw(in ta ep ad st);
       if ($crstype eq 'Community') {
           unshift(@roles,'co');
       } else {
           unshift(@roles,'cc');
       }
       return @roles;
 }  }
   
 sub modify_menu {  sub modify_menu {
     my ($r,$groupname,$page,$gpterm) = @_;      my ($r,$groupname,$page,$gpterm) = @_;
     my @menu =      my @menu =
         (          ( { categorytitle =>'Group Actions',
           { text => "Modify default $gpterm settings",   items => [
             help => 'Course_Modify_Group',  
             state => 'change_settings',            { linktext => "Modify default $gpterm settings",
             branch => 'settings',              url => '/adm/coursegroups?action=modify&amp;refpage='.$env{'form.refpage'}.'&amp;groupname='.$groupname.'&amp;state=change_settings&amp;branch=settings',
               icon => 'grp_settings.png',
               alttext => "Modify default $gpterm settings",
               permission => '1',
               help => 'Course_Modify_Group',            
             },              },
           { text => 'Modify access, tools and/or privileges for previous, '.            { linktext => 'Modify access, tools and privileges for members',
                     'future, or current members',              url => '/adm/coursegroups?action=modify&amp;refpage='.$env{'form.refpage'}.'&amp;groupname='.$groupname.'&amp;state=change_members&amp;branch=members',
               icon => 'grp_tools.png',
               alttext => 'Modify access, tools and privileges for members',
               permission => '1',
             help => 'Course_Modify_Group_Membership',              help => 'Course_Modify_Group_Membership',
             state => 'change_members',  
             branch => 'members',  
             },              },
           { text => "Add member(s) to the $gpterm",            { linktext => "Add member(s) to the $gpterm",
               url => '/adm/coursegroups?action=modify&amp;refpage='.$env{'form.refpage'}.'&amp;groupname='.$groupname.'&amp;state=add_members&amp;branch=adds',
               icon => 'grp_add.png',
               alttext =>  "Add member(s) to the $gpterm",
               permission => '1',
             help => 'Course_Group_Add_Members',              help => 'Course_Group_Add_Members',
             state => 'add_members',              }]}
             branch => 'adds',            );   
             },      $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
           );  
     my $menu_html = '';  
     foreach my $menu_item (@menu) {  
         $menu_html .=  
         '<p><font size="+1"><a href="/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state='.$menu_item->{'state'}.'&branch='.$menu_item->{'branch'}.'">';  
         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';  
         if (exists($menu_item->{'help'})) {  
             $menu_html.=  
                 &Apache::loncommon::help_open_topic($menu_item->{'help'});  
         }  
         $menu_html.='</p>'.$/;  
     }  
     $r->print($menu_html);  
     return;      return;
 }  }
   
Line 3182  sub member_privs_entries { Line 3803  sub member_privs_entries {
                 <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><th colspan="2">'.$tool.'</th></tr>');                  $r->print('<td valign="top"><table><tr><th colspan="2">'.$tool.'</th></tr>');
Line 3197  sub member_privs_entries { Line 3831  sub member_privs_entries {
                         if ($privcount == 3) {                          if ($privcount == 3) {
                             $dynamic .= '</tr><tr>';                              $dynamic .= '</tr><tr>';
                         }                          }
                         $dynamic .='<td><nobr><label><input type="checkbox" '.                          $dynamic .='<td><span class="LC_nobreak"><label><input type="checkbox" '.
                                'name="userpriv_'.$priv.'" value="'.$user.'"';                                 'name="userpriv_'.$priv.'" value="'.$user.'"';
                         if (grep/^\Q$priv\E$/,@{$defprivs}) {                          if (grep/^\Q$priv\E$/,@{$defprivs}) {
                             $dynamic .= ' checked="checked" ';                              $dynamic .= ' checked="checked" ';
                         }                          }
                         $dynamic .= ' />'.$$toolprivs{$tool}{$priv}.                          $dynamic .= ' />'.$$toolprivs{$tool}{$priv}.
                                     '</label></nobr></td>';                                      '</label></span></td>';
                     }                      }
                 }                  }
                 $r->print('<tr><td colspan="2"><nobr>'.$fixed.'</nobr></td></tr><tr>'.$dynamic.'</tr></table></td>');                  $r->print('<tr><td colspan="2"><span class="LC_nobreak">'.$fixed.'</span></td></tr><tr>'.$dynamic.'</tr></table></td>');
             } else {              } else {
                 $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>');                  $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>');
             }              }
Line 3232  sub date_setting_table { Line 3866  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 =       my $perpetual = ' <span class="LC_nobreak"><label>'
  '<nobr><label><input type="checkbox" name="no_end_date" />'.                     .'<input type="checkbox" name="no_end_date" />'
  &mt('None').'</label></nobr>';                     .&mt('No end date')
     my $table = "<table class=\"LC_descriptive_input\">\n".                     .'</label></span>';
  '<tr><td class="LC_description">'.&mt('Start:').'</td>'.      my $table = &Apache::lonhtmlcommon::start_pick_box()
         '<td>'.$startform.'</td>'.                 .&Apache::lonhtmlcommon::row_title(&mt('Start Date'))
         '<td>&nbsp;</td>'."</tr>\n".                 .$startform
  '<tr><td class="LC_description">'.&mt('End:').'</td>'.                 .&Apache::lonhtmlcommon::row_closure()
         '<td>'.$endform.'</td>'.                 .&Apache::lonhtmlcommon::row_title(&mt('End Date'))
         '<td>'.$perpetual.'</td>'."</tr>\n".                 .$endform
  "</table>\n";                 .$perpetual
                  .&Apache::lonhtmlcommon::row_closure(1)
                  .&Apache::lonhtmlcommon::end_pick_box();
     return $table;      return $table;
 }  }
   
Line 3250  sub add_group_folder { Line 3886  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');            my $error = '<span class="LC_error">';
           if ($crstype eq 'Community') { 
               $error .= &mt("Error: invalid community domain or number - group folder creation failed.");
           } else {
               $error .= &mt("Error: invalid course domain or number - group folder creation failed.");
           }
           $error .= '</span>';
           return $error;
     }      }
     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.'group_allfolders.sequence';      $allgrpsmap = $crspath.'group_allfolders.sequence';
     my $topmap = $navmap->getResourceByUrl($allgrpsmap);  
     undef($navmap);  
     if ($action eq 'create') {      if ($action eq 'create') {
     # check if group_allfolders.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,'group_allfolders.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') {
                     return $outcome;                      my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders');
                       if ($delresult ne 'ok') {
                           $warning = $delresult;
                       }
                       return $outcome.$warning;
                 }                  }
             } else {  
                 $outcome = &mt('Non-standard course - folder for all groups 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.')
                         .'</span>';
               return $outcome;
         }          }
         my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description;          my $grpfolder = &mt($ucgpterm.' Folder - [_1]',$description);
         $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg';          $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,'group_folder_'.$groupname.'.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.'group_folder_'.$groupname.'.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,'group_boards_'.$groupname.              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.'group_boards_'.$groupname.'.sequence';              $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
         }          }
Line 3303  sub add_group_folder { Line 3959  sub add_group_folder {
         #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();
       if (!defined($navmap)) {
           $warning .= '<span class="LC_error">';
           if ($crstype eq 'Community') {
               $warning .= &mt("Error retrieving community contents").
                           ' '.&mt("You need to re-initialize the community.");
           } else {
               $warning  .= &mt("Error retrieving course contents").
                            ' '.&mt("You need to re-initialize the course.");
           }
           $warning .= '</span>';
           return $warning;
       }
     # 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 3320  sub add_group_folder { Line 3985  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 3336  sub map_updater { Line 4035  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 = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'<br />';          $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 = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'<br />';          $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,1);
         if ($errtext) {          if ($errtext) {
             $outcome = &mt('Error storing updated parent folder')." ($parentmap):  $errtext".'<br />';              $outcome = '<div class="LC_error">'
                         .&mt('Error saving updated parent folder.')." ($parentmap):  $errtext"
                         .'</div>';
             return $outcome;              return $outcome;
         }          }
     }      }
Line 3370  sub new_map { Line 4075  sub new_map {
 }  }
   
 sub parm_setter {  sub parm_setter {
     my ($navmap,$cdom,$url,$groupname) = @_;      my ($navmap,$cdom,$url,$groupname,$crstype) = @_;
     my $allresults;      if (!defined($navmap)) {
           my $allresults;
           if ($crstype eq 'Community') { 
               $allresults = &mt("Parameters not set for [_1] because the contents of the community could not be retrieved.",$url).' '.
                             &mt("You need to reinitialize the community.");
           } else {
               $allresults = &mt("Parameters not set for [_1] because the contents of the course could not be retrieved.",$url).' '.
                             &mt("You need to reinitialize the course.");
   
           }
           return '<div class="LC_warning">'.$allresults.'</div>';
       }
     my %hide_settings = (      my %hide_settings = (
                            'course' =>  {                             'course' =>  {
                                           'num' => 13,                                            'num' => 13,
Line 3384  sub parm_setter { Line 4100  sub parm_setter {
                                         },                                          },
                         );                          );
     my $res = $navmap->getResourceByUrl($url);      my $res = $navmap->getResourceByUrl($url);
     my $symb = $res->symb();      my $allresults;
     foreach my $level (keys(%hide_settings)) {      if ($res) {
         my $parmresult =  &Apache::lonparmset::storeparm_by_symb($symb,          my $symb = $res->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) {              if ($parmresult) {
             $allresults .= $level.': '.$parmresult;                  $allresults .= $level.': '.$parmresult;
               }
         }          }
       } else {
           $allresults = '<div class="LC_warning">';
           if ($crstype eq 'Community') {
               $allresults .= &mt("Parameters not set for [_1] because the resource was not recognized as part of the community.",'<tt>'.$url.'</tt>');
           } else {
               $allresults .= &mt('Parameters not set for [_1] because the resource was not recognized as part of the course.','<tt>'.$url.'</tt>');
           }
           $allresults .= '</div>';
     }      }
     return $allresults;      return $allresults;
 }  }
Line 3404  sub create_homepage { Line 4132  sub create_homepage {
     my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_;      my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_;
     my $functionality = join(',',@{$tools});      my $functionality = join(',',@{$tools});
     my $content = &unescape($$groupinfo{description});      my $content = &unescape($$groupinfo{description});
     $content=~s/\s+$//s;      chomp($content);
     $content=~s/^\s+//s;      my $gateway = Apache::lonhtmlgateway->new();
     $content=~s/\<br\s*\/*\>$//s;      $content = $gateway->process_incoming_html($content,1);
     $content=&Apache::lonfeedback::clear_out_html($content,1);  
   
     my %pageinfo = (      my %pageinfo = (
                      'aaa_title' => "$ucgpterm: $name",                       'aaa_title' => "$ucgpterm: $name",
Line 3459  sub validate_groupname { Line 4186  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 ",  
                       grna => "$ucgpterm names and section names used in a ".                        grna => "$ucgpterm names and section names used in a ".
                                "$crstype must be unique.",                                 "$crstype must be unique.",
                       isno => "is not a valid name.",  
                       gnmo => "$ucgpterm names may only contain letters, ".                         gnmo => "$ucgpterm names may only contain letters, ". 
                               "numbers or underscores.",                                "numbers or underscores.",
                       cnnb => "can not be used as it is the name of ",  
                       inth => " in this $crstype",   
                       thgr => "- does not correspond to the name of an ".  
                               "existing $gpterm",      
     );      );
   
     my $exitmsg = '<span class="LC_error">'.$lt{'igna'}.'</span><br /><br />'.      my $exitmsg = '<span class="LC_error">'.$lt{'igna'}.'</span><br /><br />';
  $lt{'tgne'}.' "'.$groupname.'" ';      my $nameshown = &Apache::loncommon::cleanup_html($groupname);
     my $dupmsg = $lt{'grna'};  
     my $earlyout;  
     if (($groupname eq '') || ($groupname =~ /\W/)) {      if (($groupname eq '') || ($groupname =~ /\W/)) {
         $earlyout = $exitmsg.$lt{'isno'}.'<br />'.$lt{'gnmo'};          return $exitmsg.
         return $earlyout;                 &mt("The $gpterm name entered '[_1]' is not a valid name.",$nameshown).
                  '<br />'.$lt{'gnmo'};
       } elsif ($groupname eq 'syllabus') {
           return $exitmsg.
                  &mt("The $gpterm name entered '[_1]' is reserved for use by LON-CAPA.",$nameshown);
     }      }
     if (exists($sectioncount{$groupname})) {      if (exists($sectioncount{$groupname})) {
  return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.   return  $exitmsg.
     '<br />'.$lt{'grna'};                  &mt("The $gpterm name entered '[_1]' can not be used as it is the name of a section in this $crstype.",$nameshown).
     }          '<br />'.$lt{'grna'};
     if ($action eq 'create'       }
  && exists($curr_groups{$groupname})) {      if ($action eq 'create') { 
    if (exists($curr_groups{$groupname})) {
  return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).      return $exitmsg.
     $lt{'inth'}.'<br />'.$lt{'grna'};                     &mt("The $gpterm name entered '[_1]' can not be used as it is the name of an existing $gpterm in this $crstype.",$nameshown).
                     '<br />'.$lt{'grna'};
           } elsif (exists($deleted_groups{$groupname})) {
               return $exitmsg.
                      &mt("The $gpterm name entered '[_1]' can not be used as it is the name of a $gpterm which previously existed in this $crstype.",$nameshown).
                      '<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'}.              return &mt("$ucgpterm name: [_1] does not correspond to the name of an existing $gpterm in this $crstype.",$nameshown);
                         $lt{'inth'};  
             return $earlyout;  
         }          }
     }      }
     return;      return;
 }  }
   
 sub topic_bar {  
     my ($r,$imgnum,$title) = @_;  
     $r->print('  
 <div class="LC_topic_bar">  
     <img alt="'.&mt('Step [_1]',$imgnum).  
       '"src="/res/adm/pages/bl_step'.$imgnum.'.gif" />&nbsp;  
     <span>'.$title.'</span>  
 </div>  
 ');  
     return;  
 }  
   
 sub check_changes {  sub check_changes {
     my ($member_changes,$memchg) = @_;      my ($member_changes,$memchg) = @_;
     my %exclusions;      my %exclusions;
Line 3553  sub check_changes { Line 4272  sub check_changes {
 }  }
   
 1;  1;
   

Removed from v.1.50  
changed lines
  Added in v.1.127.2.1


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