Diff for /loncom/interface/loncoursegroups.pm between versions 1.35 and 1.41

version 1.35, 2006/07/02 12:46:06 version 1.41, 2006/07/07 17:11:04
Line 112  sub handler { Line 112  sub handler {
                           'privileges in this [_2]',$gpterm,lc($crstype)));                            'privileges in this [_2]',$gpterm,lc($crstype)));
         }          }
     } else {      } else {
         &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx,          &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission,
                          $view_permission,$manage_permission,$action,$state,   $manage_permission,$action,$state,$gpterm,$ucgpterm,
                          $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);   $crstype);
     }      }
     return OK;      return OK;
 }  }
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,      my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission,
         $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,   $action,$state,$gpterm,$ucgpterm,$crstype) = @_;
         $ucgpterm,$crstype) = @_;  
     my $pagename = "$crstype $ucgpterm".'s';      my $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();
 }\n|;  }\n|;
     $r->print(&header($pagename,$jscript,$action,$state,      $r->print(&header($pagename,$jscript,$action,$state));
                       undef,$function));  
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/coursegroups",          ({href=>"/adm/coursegroups",
           text=>"$pagename"});            text=>"$pagename"});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename));      $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename));
     &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,      &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
                     $view_permission,$manage_permission,$action,$state,      $manage_permission,$action,$state,$gpterm,$ucgpterm,
                     $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);      $crstype);
     $r->print(&footer());      $r->print(&footer());
     return;      return;
 }  }
   
 sub display_groups {  sub display_groups {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,      my ($r,$cdom,$cnum,$functions,$idx,$view_permission,
         $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,          $manage_permission,$action,$state,$gpterm,$ucgpterm,$crstype) = @_;
         $ucgpterm,$crstype) = @_;  
     my %curr_groups = ();      my %curr_groups = ();
     my %grp_info = ();      my %grp_info = ();
     my %actionlinks = (      my %actionlinks = (
Line 188  sub display_groups { Line 185  sub display_groups {
                 $r->print('<br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');                  $r->print('<br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
             }              }
             $r->print('<br /><br />');              $r->print('<br /><br />');
             $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row());
         
             $r->print(<<"END");              $r->print(<<"END");
       <table border="0" cellpadding="4" cellspacing="1">          <th>$lt{'act'}</th>
        <tr bgcolor="$tabcol" align="center">          <th><a href="javascript:changeSort('groupname')">$lt{'gname'}</a></th>
         <td><b>$lt{'act'}</b></td>          <th><a href="javascript:changeSort('description')">$lt{'desc'}</a></th>
         <td><b><a href="javascript:changeSort('groupname')">$lt{'gname'}</a></b></td>          <th><a href="javascript:changeSort('creator')">$lt{'crea'}</a></th>
         <td><b><a href="javascript:changeSort('description')">$lt{'desc'}</a></b></td>          <th><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></th>
         <td><b><a href="javascript:changeSort('creator')">$lt{'crea'}</a></b>          <th><a href="javascript:changeSort('modified')">$lt{'last'}</a></th>
         </td>          <th>$lt{'func'}</b></td>
         <td><b><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></b>          <th><a href="javascript:changeSort('quota')">$lt{'quot'}</a></th>
         </td>          <th><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></th>
         <td><b><a href="javascript:changeSort('modified')">$lt{'last'}</a></b>          <th><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></th>
         </td>          <th><a href="javascript:changeSort('boards')">$lt{'dibd'}</a></th>
         <td><b>$lt{'func'}</b>          <th><a href="javascript:changeSort('diskuse')">$lt{'dius'}</a></th>
         </td>  
         <td><b><a href="javascript:changeSort('quota')">$lt{'quot'}</a></b></td>  
         <td><b><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></b></td>  
         <td><b><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></b></td>  
         <td><b><a href="javascript:changeSort('boards')">$lt{'dibd'}</a></b></td>  
         <td><b><a href="javascript:changeSort('diskuse')">$lt{'dius'}</a></b></td>  
        </tr>  
 END  END
       $r->print(&Apache::loncommon::end_data_table_header_row());
             my %Sortby = ();              my %Sortby = ();
             foreach my $group (sort(keys(%curr_groups))) {              foreach my $group (sort(keys(%curr_groups))) {
                 %{$grp_info{$group}} =                   %{$grp_info{$group}} = 
Line 259  END Line 252  END
                     push(@{$Sortby{$group}},$group);                      push(@{$Sortby{$group}},$group);
                 }                  }
             }              }
             my $rowNum = 0;  
             my $rowColor;  
             foreach my $key (sort(keys(%Sortby))) {              foreach my $key (sort(keys(%Sortby))) {
                 foreach my $group (@{$Sortby{$key}}) {                  foreach my $group (@{$Sortby{$key}}) {
                     if ($rowNum %2 == 1) {  
                         $rowColor = $rowColor1;  
                     } else {  
                         $rowColor = $rowColor2;  
                     }  
                     my $description =                       my $description = 
                    &unescape($grp_info{$group}{'description'});   &unescape($grp_info{$group}{'description'});
                     my $creator = $grp_info{$group}{'creator'};                      my $creator = $grp_info{$group}{'creator'};
                     my $creation = $grp_info{$group}{'creation'};                      my $creation = $grp_info{$group}{'creation'};
                     my $modified = $grp_info{$group}{'modified'};                       my $modified = $grp_info{$group}{'modified'}; 
Line 302  END Line 288  END
                                       $group.'">'.$lt{'modify'}.'</a>';                                        $group.'">'.$lt{'modify'}.'</a>';
                         }                          }
                     }                      }
                     $r->print('<tr bgcolor="'.$rowColor.'"><td><small>'.$link.'</small></td><td><small>'.$group.'</small></td><td><small>'.$description.'</small></td><td><small>'.$creator.'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($creation).'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($modified).'</small></td><td><small>'.$functionality.'</small></td><td align="right"><small>'.$quota.'</small></td><td align="right"><small>'.$totalmembers.'</small></td><td align="right"><small><nobr>'.&mt('Files: ').$totalfiles.'</nobr><br /><nobr>'.&mt('Folders: ').$totaldirs.'</nobr></small></td><td align="right"><small>'.$boards.'</small></td><td align="right"><small>'.$diskuse.'</small></td></tr>');                      $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
                     $rowNum ++;        '<td>'.$link.'</td>'.
         '<td>'.$group.'</td>'.
         '<td>'.$description.'</td>'.
         '<td>'.$creator.'</td>'.
         '<td>'. &Apache::lonnavmaps::timeToHumanString($creation).'</td>'.
         '<td>'. &Apache::lonnavmaps::timeToHumanString($modified).'</td>'.
         '<td>'.$functionality.'</td>'.
         '<td align="right">'.$quota.'</td>'.
         '<td align="right">'.$totalmembers.'</td>'.
         '<td align="right"><nobr>'.&mt('Files: ').$totalfiles.'</nobr><br /><nobr>'.&mt('Folders: ').$totaldirs.'</nobr></td>'.
         '<td align="right">'.$boards.'</td>'.
         '<td align="right">'.$diskuse.'</td>'.
         &Apache::loncommon::end_data_table_row());
                 }                  }
             }              }
             $r->print('</table>');              $r->print(&Apache::loncommon::end_data_table());
             $r->print(&Apache::lonhtmlcommon::end_pick_box());  
             $r->print('<input type="hidden" name="refpage" '.              $r->print('<input type="hidden" name="refpage" '.
                       'value="'.$env{'form.refpage'}.'" />');                        'value="'.$env{'form.refpage'}.'" />');
             if ($action eq 'view') {              if ($action eq 'view') {
Line 368  sub group_administration { Line 365  sub group_administration {
     my @member_changes = ('deletion','expire','activate','reenable',      my @member_changes = ('deletion','expire','activate','reenable',
                           'changefunc','changepriv');                            'changefunc','changepriv');
     my ($groupname,$description,$startdate,$enddate,$granularity,$specificity,      my ($groupname,$description,$startdate,$enddate,$granularity,$specificity,
         $quota);          $quota,$validate_script);
   
     if (defined($env{'form.groupname'})) {      if (defined($env{'form.groupname'})) {
         $groupname = $env{'form.groupname'};          $groupname = $env{'form.groupname'};
Line 438  sub group_administration { Line 435  sub group_administration {
         }          }
     }      }
   
     my %toolprivs =      my $toolprivs = &Apache::longroup::get_tool_privs($gpterm);
  (  
  email      => {  
      sgm => 'Send '.$gpterm.' mail',  
      sgb => 'Broadcast mail',  
  },  
  discussion => {  
      cgb => 'Create boards',  
      pgd => 'Post',  
      pag => 'Anon. posts',  
      rgi => 'Get identities',   
      vgb => 'View boards',  
  },  
  chat       => {  
      pgc => 'Chat',  
  },  
  files      => {  
      rgf => 'Retrieve',  
      ugf => 'Upload',  
              mgf => 'Modify',  
      dgf => 'Delete',  
              agf => 'Control Access',  
  },  
  roster     => {  
      vgm => 'View',  
  },  
  homepage   => {  
      vgh => 'View page',  
      mgh => 'Modify page',  
  },  
  );  
   
     my %fixedprivs =       my $fixedprivs = &Apache::longroup::get_fixed_privs();
  (  
  email      => {sgm => 1},  
  discussion => {vgb => 1},  
  chat       => {pgc => 1},  
  files      => {rgf => 1},  
  roster     => {vgm => 1},  
  homepage   => {vgh => 1},  
  );  
   
     my %elements =       my %elements = 
  (   (
Line 686  sub group_administration { Line 645  sub group_administration {
                         }                          }
                         my @currtools = ();                          my @currtools = ();
                         if (@userprivs > 0) {                          if (@userprivs > 0) {
                             foreach my $tool (sort(keys(%fixedprivs))) {                              foreach my $tool (sort(keys(%{$fixedprivs}))) {
                                 foreach my $priv (keys(%{$fixedprivs{$tool}})) {                                  foreach my $priv (keys(%{$$fixedprivs{$tool}})) {
                                     if (grep/^$priv$/,@userprivs) {                                      if (grep/^$priv$/,@userprivs) {
                                         push(@currtools,$tool);                                          push(@currtools,$tool);
                                         last;                                          last;
Line 757  sub group_administration { Line 716  sub group_administration {
         && ($specificity eq 'Yes')) {          && ($specificity eq 'Yes')) {
         foreach my $user (sort(keys(%usertools))) {          foreach my $user (sort(keys(%usertools))) {
             foreach my $tool (keys(%{$usertools{$user}})) {              foreach my $tool (keys(%{$usertools{$user}})) {
                 foreach my $priv (keys(%{$toolprivs{$tool}})) {                  foreach my $priv (keys(%{$$toolprivs{$tool}})) {
                     unless (exists($fixedprivs{$tool}{$priv})) {                      unless (exists($$fixedprivs{$tool}{$priv})) {
                         $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox';                          $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox';
                     }                      }
                 }                  }
             }              }
         }          }
     }      }
    
       if (($action eq 'create' && $state eq 'pick_name') || 
           ($action eq 'modify' && $state eq 'change_settings')) {
           my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,\%stored);
           my $space_trim = '/^\s*|\s*\$/g,""';
           my $float_check = '/^([0-9]*\.?[0-9]*)$/';
           $validate_script = '
       var newquota = document.'.$state.'.quota.value;
       newquota.replace('.$space_trim.');
       if (newquota == "" ) {
           document.'.$state.'.quota.value = 0;
           newquota = 0;       
       }
       var maxposs = '.$maxposs.';
       if (newquota > maxposs) {
           alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number.");
           return;
       }
       var re_quota = '.$float_check.';
       var check_quota = newquota.match(re_quota);
       if (check_quota == null) {
           alert("The quota you entered contains invalid characters, the quota should only include numbers, with or without a decimal point.");
           return;
       }
       if (newquota == 0) {
           var warn_zero = 0;
           for (var i=0; i<document.'.$state.'.tool.length; i++) {
               if (document.'.$state.'.tool[i].value == "files") {
                   if (document.'.$state.'.tool[i].checked) {
                       warn_zero = 1;
                   }
               }
           }
           if (warn_zero == 1) {
               alert("You have indicated that the file repository should be enabled, but you have set the respository quota to 0 Mb.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");
               return;
           }
       } 
   ';
       }
     my $jscript = &Apache::loncommon::check_uncheck_jscript();      my $jscript = &Apache::loncommon::check_uncheck_jscript();
     $jscript .= qq|      $jscript .= qq|
 function nextPage(formname,nextstate) {  function nextPage(formname,nextstate) {
     formname.state.value= nextstate;      formname.state.value= nextstate;
       $validate_script
     formname.submit();      formname.submit();
 }  }
 function backPage(formname,prevstate) {  function backPage(formname,prevstate) {
Line 815  function changeSort(caller) { Line 814  function changeSort(caller) {
     my $loaditems =  &onload_action($action,$state);      my $loaditems =  &onload_action($action,$state);
     my $crumbtitle = "$crstype $ucgpterm".'s';       my $crumbtitle = "$crstype $ucgpterm".'s'; 
     $r->print(&header("$crumbtitle Manager",      $r->print(&header("$crumbtitle Manager",
       $jscript,$action,$state,$page,$function,$loaditems));        $jscript,$action,$state,$page,$loaditems));
   
     if ($env{'form.refpage'} eq 'enrl') {      if ($env{'form.refpage'} eq 'enrl') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
Line 868  function changeSort(caller) { Line 867  function changeSort(caller) {
   ("$crumbtitle Manager"));    ("$crumbtitle Manager"));
                 &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,                  &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                        \%sectioncount,$groupname,$description,$functions,                         \%sectioncount,$groupname,$description,$functions,
                        \@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate,                         \@tools,$toolprivs,$fixedprivs,$startdate,$enddate,
                        \%users,\%userdata,$idx,\%memchg,\%usertools,                         \%users,\%userdata,$idx,\%memchg,\%usertools,
                        $function,$view_permission,$manage_permission,                         $function,$view_permission,$manage_permission,
                        \%stored,$granularity,$quota,$specificity,\@types,\@roles,                         \%stored,$granularity,$quota,$specificity,\@types,\@roles,
Line 893  function changeSort(caller) { Line 892  function changeSort(caller) {
         my $crumbtitle = "$crstype $ucgpterm".'s Manager';          my $crumbtitle = "$crstype $ucgpterm".'s Manager';
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
   (&mt($crumbtitle)));    (&mt($crumbtitle)));
         &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,          &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
                         $view_permission,$manage_permission,$action,$state,   $manage_permission,$action,$state,$gpterm,$ucgpterm,
                         $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);   $crstype);
   
     }      }
     $r->print(&footer());      $r->print(&footer());
Line 1000  sub display_control { Line 999  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_group') {
             &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,              &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
                             $view_permission,$manage_permission,$action,$state,      $manage_permission,$action,$state,$gpterm,
                             $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);      $ucgpterm,$crstype);
         } elsif ($state eq 'pick_task') {          } 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') {
Line 1058  sub display_control { Line 1057  sub display_control {
 }  }
   
 sub header {  sub header {
     my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_;      my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_;
     my $start_page=      my $start_page=
  &Apache::loncommon::start_page($bodytitle,   &Apache::loncommon::start_page($bodytitle,
        '<script type="text/javascript">'.         '<script type="text/javascript">'.
        $jscript.'</script>',         $jscript.'</script>',
        {'function'    => $function,         {'add_entries' => $loaditems,});
  'add_entries' => $loaditems,});  
     my $output = <<"END";      my $output = <<"END";
 $start_page  $start_page
 <form method="POST" name="$state">  <form method="POST" name="$state">
Line 1184  sub general_settings_form { Line 1182  sub general_settings_form {
         $toolprivs,$fixedprivs,$sectioncount,$stored,$states,$navbuttons,          $toolprivs,$fixedprivs,$sectioncount,$stored,$states,$navbuttons,
         $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_;          $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_;
     my ($nexttext,$prevtext);      my ($nexttext,$prevtext);
     $r->print(' <br />  
  <table width="100%" cellpadding="0" cellspacing="0" border="0">  
 ');  
     &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1,      &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1,
                            $gpterm,$ucgpterm,$crstype);                             $gpterm,$ucgpterm,$crstype);
     $r->print('       &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
     &access_date_settings($r,$tabcol,$action,$formname,$stored,2,$gpterm,  
                           $ucgpterm);  
     $r->print('  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
     if ($action eq 'create') {      if ($action eq 'create') {
         &membership_options($r,$action,$formname,$tabcol,$sectioncount,3,          &membership_options($r,$action,$formname,$sectioncount,3,$gpterm,
                             $gpterm,$ucgpterm);      $ucgpterm);
         $nexttext = $$navbuttons{'gtns'};          $nexttext = $$navbuttons{'gtns'};
     } else {      } else {
         my @available = ();          my @available = ();
Line 1211  sub general_settings_form { Line 1197  sub general_settings_form {
         &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action,          &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action,
                                3,$tools,$stored,$toolprivs,$fixedprivs,                                 3,$tools,$stored,$toolprivs,$fixedprivs,
                                \@available,$formname,$gpterm,$ucgpterm);                                 \@available,$formname,$gpterm,$ucgpterm);
         $r->print('  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
         &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount,          &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount,
                          $states,$stored,$navbuttons,4,5,$rowColor1,                           $states,$stored,$navbuttons,4,5,$rowColor1,
                          $rowColor2,$gpterm,$ucgpterm,$crstype);                           $rowColor2,$gpterm,$ucgpterm,$crstype);
Line 1223  sub general_settings_form { Line 1205  sub general_settings_form {
     $prevtext = $$navbuttons{'gtpp'};      $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                         $$states{$action}[$page+1],$nexttext);                          $$states{$action}[$page+1],$nexttext);
     $r->print('  
  </table>');  
     return;      return;
 }  }
   
Line 1242  sub groupsettings_options { Line 1222  sub groupsettings_options {
         'doyo' => "Do you want to assign different functionality ".          'doyo' => "Do you want to assign different functionality ".
                   "to different $gpterm members?",                    "to different $gpterm members?",
     );      );
     my $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'};      my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);
     if ($crsquota eq '') {      &topic_bar($r,$image,$lt{'gnde'});
         $crsquota = 20;  
     }  
     my $freespace = $crsquota - &Apache::longroup::sum_quotas();  
     my $maxposs = $$stored{'quota'} + $freespace;  
     &topic_bar($r,$tabcol,$image,$lt{'gnde'});  
     $r->print('      $r->print('
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">  
      <table border="0" cellpadding="2" cellspacing="2">       <table border="0" cellpadding="2" cellspacing="2">
       <tr>        <tr>
        <td><b>'.$lt{'gnam'}.':</b></td>         <td><b>'.$lt{'gnam'}.':</b></td>
Line 1342  END Line 1314  END
        </td>         </td>
       </tr>        </tr>
      </table>       </table>
     </td>  
    </tr>  
 ');  ');
     return;      return;
 }  }
   
   sub get_quota_constraints {
       my ($action,$stored) = @_;
       my ($crsquota,$freespace,$maxposs); 
       $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'};
       if ($crsquota eq '') {
           $crsquota = 20;
       }
       $freespace = $crsquota - &Apache::longroup::sum_quotas();
       if ($action eq 'create') {
           $maxposs = $freespace;
       } else {
           $maxposs = $$stored{'quota'} + $freespace;
       }
       return ($crsquota,$freespace,$maxposs);
   }
   
 sub membership_options {  sub membership_options {
     my ($r,$action,$state,$tabcol,$sectioncount,$image,$gpterm,$ucgpterm) = @_;      my ($r,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'pipa' => 'Pick parameters to generate membership list',                  'pipa' => 'Pick parameters to generate membership list',
Line 1376  sub membership_options { Line 1362  sub membership_options {
   
     my @sections = keys(%{$sectioncount});      my @sections = keys(%{$sectioncount});
   
     &topic_bar($r,$tabcol,$image,$lt{'pipa'});      &topic_bar($r,$image,$lt{'pipa'});
     $r->print('      $r->print('
    <tr>       <b>'.$lt{'gmem'}.'</b><br />'.$lt{'picr'});
     <td>&nbsp;</td>  
     <td colspan="3">  
      <b>'.$lt{'gmem'}.'</b><br/>'.$lt{'picr'});  
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});          $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});
     } else {      } else {
Line 1390  sub membership_options { Line 1373  sub membership_options {
     $r->print('      $r->print('
      <br />       <br />
      <br />       <br />
      <table border="0">       <table class="LC_status_selector">
       <tr>        <tr>
        <td><b>'.$lt{'acty'}.'</b></td>         <th>'.$lt{'acty'}.'</th>
        <td>&nbsp;</td>         <th>'.$lt{'coro'}.'</th>');
        <td><b>'.$lt{'coro'}.'</b></td>');  
     if (@sections >0) {      if (@sections >0) {
         $r->print('          $r->print('
        <td>&nbsp;</td>         <th>'.$lt{'cose'}.'</th>');
        <td><b>'.$lt{'cose'}.'</b></td>  
        <td>&nbsp;</td>');  
     }      }
     $r->print('</tr><tr>');      $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>&nbsp;</td>');      $r->print('</td><td>');
     $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));      $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));
     if (@sections > 0) {      if (@sections > 0) {
         @sections = sort {$a cmp $b} @sections;          @sections = sort {$a cmp $b} @sections;
         unshift(@sections,'none'); # Put 'no sections' next          unshift(@sections,'none'); # Put 'no sections' next
         unshift(@sections,'all'); # Put 'all' at the front of the list          unshift(@sections,'all'); # Put 'all' at the front of the list
         $r->print('<td>&nbsp;</td>          $r->print('</td><td>'.
                    <td colspan="3" align="center" valign="top">'.  
         &sections_selection(\@sections,'sectionpick').'</td>');          &sections_selection(\@sections,'sectionpick').'</td>');
     }      }
     $r->print('      $r->print('
       </tr>        </tr>
      </table>       </table>');
     </td>  
    </tr>');  
     return;      return;
 }  }
   
Line 1445  sub sections_selection { Line 1422  sub sections_selection {
 }  }
   
 sub access_date_settings {  sub access_date_settings {
     my ($r,$tabcol,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;      my ($r,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'sten' => "Default start and end dates for $gpterm access",                  'sten' => "Default start and end dates for $gpterm access",
              );               );
Line 1457  sub access_date_settings { Line 1434  sub access_date_settings {
             $endtime = $$stored{'enddate'};              $endtime = $$stored{'enddate'};
         }          }
     }      }
     my ($start_table,$end_table) = &date_setting_table      my ($table) = &date_setting_table($starttime,$endtime,$formname);
                                     ($starttime,$endtime,$formname);      &topic_bar($r,$image,$lt{'sten'});
     &topic_bar($r,$tabcol,$image,$lt{'sten'});  
     $r->print('      $r->print('
    <tr>      '.$table.'
     <td>&nbsp;</td>      ');
     <td colspan="3">'.$start_table.'</td>  
    <tr>  
    <tr>  
     <td colspan="4">&nbsp;</td>  
    </tr>  
    <tr>  
     <td>&nbsp;</td>  
     <td colspan="3">'.$end_table.'</td>  
    <tr>');  
     return;      return;
 }  }
   
Line 1488  sub choose_members_form { Line 1455  sub choose_members_form {
          \@regexps));           \@regexps));
     my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,      my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,
                                        $ucgpterm,$crstype);                                         $ucgpterm,$crstype);
     $r->print('  
 <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
 ');  
     if ($earlyout) {      if ($earlyout) {
         $r->print($earlyout.'</td></tr>');  
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],          &display_navbuttons($r,$formname,$$states{$action}[$page-1],
                            $$navbuttons{'gtps'});                             $$navbuttons{'gtps'});
         $r->print('</table>');  
         return;          return;
     }       } 
     my ($specimg,$memimg);      my ($specimg,$memimg);
Line 1506  sub choose_members_form { Line 1465  sub choose_members_form {
     my @unavailable = ();      my @unavailable = ();
     &check_tools($functions,$tools,\@available,\@unavailable);      &check_tools($functions,$tools,\@available,\@unavailable);
     if ($action eq 'create') {      if ($action eq 'create') {
         &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,          &print_current_settings($r,$action,$functions,$startdate,$enddate,
                                 $functions,$startdate,$enddate,$groupname,   $groupname,$description,$granularity,$quota,
                                 $description,$granularity,$quota,\@available,   \@available,\@unavailable,$gpterm,$ucgpterm);
                                 \@unavailable,$gpterm,$ucgpterm);  
         $specimg = 4;          $specimg = 4;
         $memimg = 5;          $memimg = 5;
     } else {      } else {
Line 1544  sub choose_members_form { Line 1502  sub choose_members_form {
         &display_navbuttons($r,$formname,$$states{$action}[$page-1],          &display_navbuttons($r,$formname,$$states{$action}[$page-1],
                             $$navbuttons{'gtps'});                              $$navbuttons{'gtps'});
     }      }
     $r->print('</table>');  
     return;      return;
 }  }
   
 sub display_navbuttons {  sub display_navbuttons {
     my ($r,$formname,$prev,$prevtext,$next,$nexttext) = @_;      my ($r,$formname,$prev,$prevtext,$next,$nexttext) = @_;
     $r->print('  
     <tr>  
      <td colspan="4">&nbsp;</td>  
     </tr>  
     <tr>  
      <td>&nbsp;</td>  
      <td colspan="3">');  
     if ($prev) {      if ($prev) {
         $r->print('          $r->print('
       <input type="button" name="previous" value = "'.$prevtext.'"        <input type="button" name="previous" value = "'.$prevtext.'"
Line 1568  sub display_navbuttons { Line 1518  sub display_navbuttons {
       <input type="button" name="next" value="'.$nexttext.'"        <input type="button" name="next" value="'.$nexttext.'"
  onclick="javascript:nextPage(document.'.$formname.','."'".$next."'".')" />');   onclick="javascript:nextPage(document.'.$formname.','."'".$next."'".')" />');
     }      }
     $r->print('  
      </td>  
     </tr>  
 ');  
 }  }
   
 sub check_tools {  sub check_tools {
Line 1587  sub check_tools { Line 1533  sub check_tools {
 }  }
   
 sub print_current_settings {  sub print_current_settings {
     my ($r,$action,$tabcol,$rowColor1,$rowColor2,$functions,$startdate,$enddate,      my ($r,$action,$functions,$startdate,$enddate,$groupname,$description,
         $groupname,$description,$granularity,$quota,$available,$unavailable,   $granularity,$quota,$available,$unavailable,$gpterm,$ucgpterm) = @_;
         $gpterm,$ucgpterm) = @_;  
   
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         grna => "$ucgpterm Name",          grna => "$ucgpterm Name",
Line 1611  sub print_current_settings { Line 1556  sub print_current_settings {
     } else {      } else {
         $showend = &Apache::lonlocal::locallocaltime($enddate);          $showend = &Apache::lonlocal::locallocaltime($enddate);
     }      }
     $r->print('<table border="0" cellpadding="0" cellspacing="20">');  
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print('          $r->print('
 <tr>  <div><span>'.$lt{'ygrs'}.'</span>
  <td><font face="arial,helvetica,sans-serif"><b>'.$lt{'ygrs'}.'</b></font>  
 <br />'.$lt{'tfwa'}.'  <br />'.$lt{'tfwa'}.'
  </td>  </div>');
 </tr>');  
     }      }
     $r->print('<tr><td>');      $r->print(&Apache::loncommon::start_data_table('LC_course_group_status').
     $r->print(&Apache::lonhtmlcommon::start_pick_box());        &Apache::loncommon::start_data_table_header_row());
     $r->print('      $r->print('
 <tr>    <th>'.$lt{'grna'}.'</th>
  <td>    <th>'.$lt{'desc'}.'</th>
 <table cellspacing="1" cellpadding="4">    <th>'.$lt{'grfn'}.'</th>
  <tr bgcolor="'.$tabcol.'" align="center">    <th>'.$lt{'gran'}.'</th>
   <td><b>'.$lt{'grna'}.'</b></td>    <th>'.$lt{'quot'}.'</th>
   <td><b>'.$lt{'desc'}.'</b></td>    <th>'.$lt{'dfac'}.'</th>
   <td><b>'.$lt{'grfn'}.'</b></td>  ');
   <td><b>'.$lt{'gran'}.'</b></td>      $r->print(&Apache::loncommon::end_data_table_header_row().
   <td><b>'.$lt{'quot'}.'</b></td>        &Apache::loncommon::start_data_table_row('LC_data_table_dense'));
   <td><b>'.$lt{'dfac'}.'</b></td>      $r->print('
  </tr>    <td valign="top">'.$groupname.'</td>
  <tr bgcolor="'.$rowColor2.'">    <td valign="top">'.$description.'</td>
   <td valign="top"><small>'.$groupname.'</small></td>  
   <td valign="top"><small>'.$description.'</small></td>  
   <td>    <td>
 ');  ');
     if (@{$available} > 0) {      if (@{$available} > 0) {
         $r->print('<small><b>Available:</b></small>          $r->print('<b>Available:</b>
                     <table cellpadding="" cellspacing="1"><tr>');                      <table cellpadding="" cellspacing="1"><tr>');
         my $rowcell = int(@{$available}/2) + @{$available}%2;          my $rowcell = int(@{$available}/2) + @{$available}%2;
         for (my $i=0; $i<@{$available}; $i++) {          for (my $i=0; $i<@{$available}; $i++) {
Line 1649  sub print_current_settings { Line 1589  sub print_current_settings {
                     $r->print('</tr><tr>');                      $r->print('</tr><tr>');
                 }                  }
             }              }
             $r->print('<td><small>'.$$functions{$$available[$i]}.              $r->print('<td>'.$$functions{$$available[$i]}.
                                           '</small></td><td>&nbsp;</td>');        '</td><td>&nbsp;</td>');
         }          }
         if ((@{$available} > 3) && (@{$available}%2)) {          if ((@{$available} > 3) && (@{$available}%2)) {
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');              $r->print('<td>&nbsp;</td><td>&nbsp;</td>');
Line 1658  sub print_current_settings { Line 1598  sub print_current_settings {
         $r->print('</tr></table><br />');          $r->print('</tr></table><br />');
     }      }
     if (@{$unavailable} > 0) {      if (@{$unavailable} > 0) {
         $r->print('<small><b>Unavailable:</b></small>          $r->print('<b>Unavailable:</b>
                     <table cellpadding="0" cellspacing="1"  border="0"><tr>');                      <table cellpadding="0" cellspacing="1"  border="0"><tr>');
         my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;          my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;
         for (my $j=0; $j<@{$unavailable}; $j++) {          for (my $j=0; $j<@{$unavailable}; $j++) {
Line 1667  sub print_current_settings { Line 1607  sub print_current_settings {
                     $r->print('</tr><tr>');                      $r->print('</tr><tr>');
                 }                  }
             }              }
             $r->print('<td><small>'.$$functions{$$unavailable[$j]}.              $r->print('<td>'.$$functions{$$unavailable[$j]}.
                                               '</small></td><td>&nbsp;</td>');        '</td><td>&nbsp;</td>');
         }          }
         if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {          if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');              $r->print('<td>&nbsp;</td><td>&nbsp;</td>');
Line 1677  sub print_current_settings { Line 1617  sub print_current_settings {
     }      }
     $r->print(<<"END");      $r->print(<<"END");
   </td>    </td>
   <td valign="top"><small><b>$lt{'difn'}    <td valign="top"><b>$lt{'difn'}</b> $granularity</td>
   </b> $granularity</small></td>    <td valign="top">$quota Mb</td> 
   <td valign="top"><small>$quota Mb</small></td>     <td valign="top"><b>$lt{'stda'}</b> $showstart<br />
   <td valign="top"><small><b>$lt{'stda'}</b> $showstart<br />        <b>$lt{'enda'}</b> $showend
       <b>$lt{'enda'}</b> $showend</small>  
   </td>    </td>
  </tr>  
 </table>  
 </td>  
 </tr>  
 END  END
     $r->print(&Apache::lonhtmlcommon::end_pick_box());      $r->print(&Apache::loncommon::end_data_table_row().
     $r->print('</td></tr></table><br />');        &Apache::loncommon::end_data_table());
     return;      return;
 }  }
   
Line 1732  sub pick_new_members { Line 1667  sub pick_new_members {
             $r->print(&check_uncheck_tools($r,$available));              $r->print(&check_uncheck_tools($r,$available));
         }          }
     }      }
     &topic_bar($r,$tabcol,$img,$lt{'gpme'});      &topic_bar($r,$img,$lt{'gpme'});
     if (keys(%members) > 0) {      if (keys(%members) > 0) {
         $r->print('          $r->print('
  <tr>   <tr>
Line 1908  sub privilege_specificity { Line 1843  sub privilege_specificity {
             }              }
         }          }
     }      }
     &topic_bar($r,$tabcol,$img,$lt{'uprv'});      &topic_bar($r,$img,$lt{'uprv'});
     $r->print('  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
   ');  
     if ((($action eq 'create') && (@{$available} > 0)) ||       if ((($action eq 'create') && (@{$available} > 0)) || 
         (($action eq 'modify') && ($formname eq 'change_settings'))) {            (($action eq 'modify') && ($formname eq 'change_settings'))) {  
         my %specific = (          my %specific = (
Line 1939  sub privilege_specificity { Line 1869  sub privilege_specificity {
         }          }
         if ($totaloptionalprivs) {          if ($totaloptionalprivs) {
             $r->print('              $r->print('
 <br /><br /><label><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr></label><br/>  <br /><br />
 <label><nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr></label>  <label><nobr><input type="radio" name="specificity" value="No" '.$specific{'No'}.' />&nbsp;'.$lt{'algm'}.'</nobr></label><br />
   </td>  <label><nobr><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' />&nbsp;'.$lt{'smgp'}.'</nobr></label>');
  </tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>');  
         } else {          } else {
             $r->print('<input type="hidden" name="specificity" value="No" />');              $r->print('<input type="hidden" name="specificity" value="No" />');
         }          }
         if ($totaloptionalprivs) {          if ($totaloptionalprivs) {
             $r->print('              $r->print($lt{'plin'});
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">'.$lt{'plin'});  
             if ($action eq 'create') {              if ($action eq 'create') {
                 $r->print(' '.$lt{'thwi'});                  $r->print(' '.$lt{'thwi'});
             }              }
Line 1964  sub privilege_specificity { Line 1887  sub privilege_specificity {
                 $r->print('('.&mt('if enabled below').').');                  $r->print('('.&mt('if enabled below').').');
             }              }
             $r->print('<br /><br />              $r->print('<br /><br />
   </td>    <table><tr>');
  </tr>  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="2"><table><tr>');  
         &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});          &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});
         $r->print('          $r->print('
     </tr>      </tr>
    </table>     </table>
   </td>  
   <td width="100%">&nbsp;</td>  
  </tr><tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
    <br />     <br />
 ');  ');
         } else {          } else {
             $r->print('<tr><td>&nbsp;</td><td colspan="3">'.$lt{'algm'}.'<br /><br />');              $r->print($lt{'algm'}.'<br /><br />');
         }          }
         &default_privileges($r,$action,$tabcol,$rowColor1,$rowColor2,          &default_privileges($r,$action,$tabcol,$rowColor1,$rowColor2,
                             $tools,$toolprivs,$fixedprivs,$available);                              $tools,$toolprivs,$fixedprivs,$available);
Line 2004  sub privilege_specificity { Line 1918  sub privilege_specificity {
                               $toolprivs,\@defprivs);                                $toolprivs,\@defprivs);
         }          }
     }      }
     $r->print('  
   </td>  
  </tr>  
 ');  
     return;      return;
 }  }
   
Line 2020  sub default_privileges { Line 1930  sub default_privileges {
                                 'oppr' => 'Optional privileges',                                  'oppr' => 'Optional privileges',
                                 'func' => 'Function',                                  'func' => 'Function',
     );      );
     $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::loncommon::start_data_table().
     $r->print('<tr>        &Apache::loncommon::start_data_table_header_row());
                 <td bgcolor="'.$tabcol.'" valign="top">      $r->print('<th>'.$lt{'func'}.'</th>
                  <table cellspacing="0" cellpadding="1">  
                   <tr>  
                    <td valign="top"><b>'.$lt{'func'}.'</b></td>  
                   </tr>                    </tr>
                   <tr>                    <tr>
                    <td valign="top"><b>'.$lt{'fixp'}.'</b></td>                     <td valign="top"><b>'.$lt{'fixp'}.'</b></td>
Line 2180  sub change_members_form { Line 2087  sub change_members_form {
 <br />  <br />
 <table width="100%" cellpadding="0" cellspacing="0" border="0">  <table width="100%" cellpadding="0" cellspacing="0" border="0">
 ');  ');
     &topic_bar($r,$tabcol,1,$lt{'grse'});      &topic_bar($r,1,$lt{'grse'});
     $r->print('      $r->print('
  <tr>   <tr>
   <td>&nbsp;</td>    <td>&nbsp;</td>
   <td colspan="3">    <td colspan="3">
 ');  ');
     &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,      &print_current_settings($r,$action,$functions,$startdate,$enddate,
                             $functions,$startdate,$enddate,$groupname,      $groupname,$description,$granularity,$quota,
                             $description,$granularity,$quota,\@available,      \@available,\@unavailable,$gpterm,$ucgpterm);
                             \@unavailable,$gpterm,$ucgpterm);  
 $r->print('  $r->print('
 </td></tr><tr><td colspan="4">&nbsp;</td></tr>');  </td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     &topic_bar($r,$tabcol,2,$lt{'mogm'});      &topic_bar($r,2,$lt{'mogm'});
     $r->print('      $r->print('
  <tr>   <tr>
   <td>&nbsp;</td>    <td>&nbsp;</td>
Line 2227  sub current_membership { Line 2133  sub current_membership {
                                           'curf' => 'Current Functionality',                                            'curf' => 'Current Functionality',
                                           'chpr' => 'Change Privileges'                                             'chpr' => 'Change Privileges' 
                                         );                                          );
     if (keys(%membership) > 0) {      my ($current,$hastools,$addtools,$num_reenable,$num_activate,$num_expire) =
         my %current = ();          &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs,
         my %allnames = ();                                              $available);
         my $hastools = 0;      if (keys(%{$current}) > 0) {
         my $addtools = 0;          $r->print('
         my $num_reenable = 0;  
         my $num_activate = 0;  
         my $num_expire = 0;  
         foreach my $key (sort(keys(%membership))) {  
             if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) {  
                 my $uname = $1;  
                 my $udom = $2;  
                 my $user = $uname.':'.$udom;  
                 my($end,$start,@userprivs) = split(/:/,$membership{$key});  
                 unless ($start == -1) {  
                     $allnames{$udom}{$uname} = 1;  
                     $current{$user} = {  
  uname     => $uname,  
  udom      => $udom,  
  start     => &Apache::lonlocal::locallocaltime($start),  
  currtools => [],  
  newtools  => [],  
     };  
   
                     if ($end == 0) {  
                         $current{$user}{end} =  'No end date';  
                     } else {  
                         $current{$user}{end} =   
                                      &Apache::lonlocal::locallocaltime($end);  
                     }  
                     my $now = time;  
                     if (($end > 0) && ($end < $now)) {  
                         $current{$user}{changestate} = 'reenable';  
                         $num_reenable++;  
                     } elsif (($start > $now)) {  
                         $current{$user}{changestate} = 'activate';  
                         $num_activate ++;  
                     } else {  
                         $current{$user}{changestate} = 'expire';  
                         $num_expire ++;  
                     }  
                     if (@userprivs > 0) {  
                         foreach my $tool (sort(keys(%{$fixedprivs}))) {  
                             foreach my $priv (keys(%{$$fixedprivs{$tool}})) {  
                                 if (grep/^$priv$/,@userprivs) {  
                                     push(@{$current{$user}{currtools}},$tool);  
                                     last;  
                                 }  
                             }  
                         }  
                         $hastools = 1;  
                     }  
                     if (@{$available} > 0) {  
                         if (@{$current{$user}{currtools}} > 0) {  
                             if ("@{$available}" ne "@{$current{$user}{currtools}}") {  
                                 foreach my $tool (@{$available}) {  
                                     unless (grep/^$tool$/,@{$current{$user}{currtools}}) {  
                                         push(@{$current{$user}{newtools}},$tool);  
                                     }  
                                 }  
                             }  
                         } else {  
                             @{$current{$user}{newtools}} = @{$available};  
                         }  
                         if (@{$current{$user}{newtools}} > 0) {  
                             $addtools = 1;  
                         }  
                     }  
                 }  
             }  
         }  
         if (keys(%current) > 0) {  
             my %idhash;  
             foreach my $udom (keys(%allnames)) {  
                 %{$idhash{$udom}} = &Apache::lonnet::idrget($udom,  
                                                 keys(%{$allnames{$udom}}));  
                 foreach my $uname (keys(%{$idhash{$udom}})) {  
                     $current{$uname.':'.$udom}{'id'} = $idhash{$udom}{$uname};  
                 }  
                 foreach my $uname (keys(%{$allnames{$udom}})) {  
                     $current{$uname.':'.$udom}{'fullname'} =  
                                 &Apache::loncommon::plainname($uname,$udom,  
                                                                   'lastname');  
                 }  
             }  
             $r->print('  
  <tr>   <tr>
   <td>&nbsp;</td>    <td>&nbsp;</td>
   <td colspan="2">    <td colspan="2">
    <table>     <table>
     <tr>');      <tr>');
             if ($num_expire) {          if ($num_expire) {
                 &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});              &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
             }          }
             if ($num_reenable) {          if ($num_reenable) {
                 &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});              &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
             }          }
             if ($num_activate) {          if ($num_activate) {
                 &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});              &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
           }
           &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
           if (@{$available} > 0) {
               if ($specificity eq 'Yes') {
                   &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
             }              }
             &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});              if ($granularity eq 'Yes') {
             if (@{$available} > 0) {                  $r->print(&check_uncheck_tools($r,$available));
                 if ($specificity eq 'Yes') {                  $r->print('
                     &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});  
                 }  
                 if ($granularity eq 'Yes') {  
                     $r->print(&check_uncheck_tools($r,$available));  
                     $r->print('  
      <td>       <td>
       <nobr>        <nobr>
        <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>         <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>
Line 2347  sub current_membership { Line 2172  sub current_membership {
      </nobr>       </nobr>
     </td>      </td>
 ');  ');
                 }  
             }              }
             $r->print(<<"END");          }
           $r->print(<<"END");
    </tr>     </tr>
   </table>    </table>
   </td>    </td>
Line 2362  sub current_membership { Line 2187  sub current_membership {
   <td>&nbsp;</td>    <td>&nbsp;</td>
   <td colspan="3">    <td colspan="3">
 END  END
             $r->print(&Apache::lonhtmlcommon::start_pick_box());          $r->print(&Apache::lonhtmlcommon::start_pick_box());
             $r->print(<<"END");          $r->print(<<"END");
    <table border="0" cellpadding="4" cellspacing="1">     <table border="0" cellpadding="4" cellspacing="1">
     <tr bgcolor="$tabcol" align="center">      <tr bgcolor="$tabcol" align="center">
      <td><b>$lt{'actn'}</b></td>       <td><b>$lt{'actn'}</b></td>
Line 2375  END Line 2200  END
      <td><b><a href="javascript:changeSort('start')">$lt{'stda'}</a></b></td>       <td><b><a href="javascript:changeSort('start')">$lt{'stda'}</a></b></td>
      <td><b><a href="javascript:changeSort('end')">$lt{'enda'}</a></b></td>       <td><b><a href="javascript:changeSort('end')">$lt{'enda'}</a></b></td>
 END  END
             my $colspan = 0;          my $colspan = 0;
             if ($hastools) {          if ($hastools) {
                 $r->print('<td><b>'.$lt{'curf'}.'</b></td>');              $r->print('<td><b>'.$lt{'curf'}.'</b></td>');
                 $colspan ++;                $colspan ++;  
             }          }
             if ($addtools) {          if ($addtools) {
                 $r->print('<td><b>Additional Functionality</b></td>');              $r->print('<td><b>Additional Functionality</b></td>');
                 $colspan ++;              $colspan ++;
             }          }
             $r->print('</tr>');          $r->print('</tr>');
             if ($colspan) {          if ($colspan) {
                 if ($granularity eq 'Yes') {              if ($granularity eq 'Yes') {
                     $r->print('<tr bgcolor="#cccccc">                  $r->print('<tr bgcolor="#cccccc">
  <td colspan="7">&nbsp;</td>   <td colspan="7">&nbsp;</td>
  <td colspan="'.$colspan.'" align="center"><small><nobr><b>'.&mt('All:').   <td colspan="'.$colspan.'" align="center"><small><nobr><b>'.&mt('All:').
   '</b>&nbsp;');    '</b>&nbsp;');
                     foreach my $tool (@{$available}) {                  foreach my $tool (@{$available}) {
                         $r->print('<label><input type="checkbox" name="togglefunc"'.                      $r->print('<label><input type="checkbox" name="togglefunc"'.
    ' onclick="javascript:toggleTools(document.'.$formname.'.user_'.$tool.',this);"'.     ' onclick="javascript:toggleTools(document.'.$formname.'.user_'.$tool.',this);"'.
    ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');     ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>&nbsp;&nbsp;&nbsp;');
                     }  
                     $r->print('</nobr></small></td></tr>');  
                 }                  }
                   $r->print('</nobr></small></td></tr>');
             }              }
             my %Sortby = ();          }
             foreach my $user (sort(keys(%current))) {          my %Sortby = ();
                 if ($env{'form.sortby'} eq 'fullname') {          foreach my $user (sort(keys(%{$current}))) {
                     push(@{$Sortby{$current{$user}{fullname}}},$user);              if ($env{'form.sortby'} eq 'fullname') {
                 } elsif ($env{'form.sortby'} eq 'username') {                  push(@{$Sortby{$$current{$user}{fullname}}},$user);
                     push(@{$Sortby{$current{$user}{uname}}},$user);              } elsif ($env{'form.sortby'} eq 'username') {
                 } elsif ($env{'form.sortby'} eq 'domain') {                  push(@{$Sortby{$$current{$user}{uname}}},$user);
                     push(@{$Sortby{$current{$user}{udom}}},$user);              } elsif ($env{'form.sortby'} eq 'domain') {
                 } elsif ($env{'form.sortby'} eq 'id') {                  push(@{$Sortby{$$current{$user}{udom}}},$user);
                     push(@{$Sortby{$current{$user}{id}}},$user);              } elsif ($env{'form.sortby'} eq 'id') {
                   push(@{$Sortby{$$current{$user}{id}}},$user);
               } else {
                   push(@{$Sortby{$$current{$user}{fullname}}},$user);
               }
           }
           my $rowNum = 0;
           my $rowColor;
           foreach my $key (sort(keys(%Sortby))) {
               foreach my $user (@{$Sortby{$key}}) {
                   if ($rowNum %2 == 1) {
                       $rowColor = $rowColor1;
                 } else {                  } else {
                     push(@{$Sortby{$current{$user}{fullname}}},$user);                      $rowColor = $rowColor2;
                 }                  }
             }                  my $id = $$current{$user}{id};
             my $rowNum = 0;                  my $fullname = $$current{$user}{fullname};
             my $rowColor;                  my $udom = $$current{$user}{udom};
             foreach my $key (sort(keys(%Sortby))) {                  my $uname = $$current{$user}{uname};
                 foreach my $user (@{$Sortby{$key}}) {                  my $start = $$current{$user}{start};
                     if ($rowNum %2 == 1) {                  my $end = $$current{$user}{end};
                         $rowColor = $rowColor1;                  $r->print('<tr bgcolor="'.$rowColor.'">
                     } else {                              <td><small>');
                         $rowColor = $rowColor2;                  if ($$current{$user}{changestate} eq 'reenable') {
                     }                      $r->print('<nobr><label>'. 
                     my $id = $current{$user}{id};  
                     my $fullname = $current{$user}{fullname};  
                     my $udom = $current{$user}{udom};  
                     my $uname = $current{$user}{uname};  
                     my $start = $current{$user}{start};  
                     my $end = $current{$user}{end};  
                     $r->print('<tr bgcolor="'.$rowColor.'">  
                                 <td><small>');  
                     if ($current{$user}{changestate} eq 'reenable') {  
                         $r->print('<nobr><label>'.   
    '<input type="checkbox" name="reenable" value="'.$user.'" />'.     '<input type="checkbox" name="reenable" value="'.$user.'" />'.
    $lt{'reen'}.'</label></nobr><br />');     $lt{'reen'}.'</label></nobr><br />');
                     } elsif ($current{$user}{changestate} eq 'expire') {                  } elsif ($$current{$user}{changestate} eq 'expire') {
                         $r->print('<nobr><label>'.                      $r->print('<nobr><label>'.
    '<input type="checkbox" name="expire" value="'.$user.'" />'.     '<input type="checkbox" name="expire" value="'.$user.'" />'.
    $lt{'expi'}.'</label></nobr><br />');     $lt{'expi'}.'</label></nobr><br />');
                     } elsif ($current{$user}{changestate} eq 'activate') {                  } elsif ($$current{$user}{changestate} eq 'activate') {
                         $r->print('<nobr><label>'.                      $r->print('<nobr><label>'.
    '<input type="checkbox" name="activate" value="'.$user.'" />'.     '<input type="checkbox" name="activate" value="'.$user.'" />'.
    $lt{'acti'}.'</label></nobr><br />');     $lt{'acti'}.'</label></nobr><br />');
                     }                  }
                     $r->print('<nobr><label>'.                  $r->print('<nobr><label>'.
    '<input type="checkbox" name="deletion" value="'.$user.'" />'.     '<input type="checkbox" name="deletion" value="'.$user.'" />'.
    $lt{'dele'}.'</label></nobr>');     $lt{'dele'}.'</label></nobr>');
                     if ($specificity eq 'Yes') {                  if ($specificity eq 'Yes') {
                         $r->print('<br /><nobr><label>'.                      $r->print('<br /><nobr><label>'.
    '<input type="checkbox" name="changepriv" value="'.$user.'" />'.$lt{'chpr'}.     '<input type="checkbox" name="changepriv" value="'.$user.'" />'.$lt{'chpr'}.
    '</label></nobr>');     '</label></nobr>');
                     }                  }
                     $r->print('                  $r->print('
    </td>     </td>
    <td><small>'.     <td><small>'.
     $fullname.'</small></td><td><small>'.$uname.'</small></td><td><small>'.      $fullname.'</small></td><td><small>'.$uname.'</small></td><td><small>'.
     $udom.'</small></td><td><small>'.$id.'</small></td><td><small>'.$start.      $udom.'</small></td><td><small>'.$id.'</small></td><td><small>'.$start.
     '</small></td><td><small>'.$end.'</small></td>');      '</small></td><td><small>'.$end.'</small></td>');
                     if ($hastools) {                  if ($hastools) {
                         $r->print('<td align="left"><small><nobr>'.                      $r->print('<td align="left"><small><nobr>'.
                                   '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');                                    '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
                         foreach my $tool (@{$current{$user}{currtools}}) {                      foreach my $tool (@{$$current{$user}{currtools}}) {
                             if ($granularity eq 'Yes') {                          if ($granularity eq 'Yes') {
                                 $r->print('<label><input type="checkbox" '.                               $r->print('<label><input type="checkbox" '. 
                                        'checked="checked" '.                                          'checked="checked" '. 
                                        'name="user_'.$tool.'" value="'.                                         'name="user_'.$tool.'" value="'.
                                        $user.'" />'.$tool.'</label>');                                         $user.'" />'.$tool.'</label>');
                              } else {                           } else {
                                $r->print('<input type="hidden" '.                               $r->print('<input type="hidden" '.
                                        'checked="checked" '.                                         'checked="checked" '.
                                        'name="user_'.$tool.'" value="'.                                         'name="user_'.$tool.'" value="'.
                                        $user.'" />'.$tool);                                         $user.'" />'.$tool);
                              }                           }
                              $r->print('&nbsp;&nbsp;&nbsp;');                           $r->print('&nbsp;&nbsp;&nbsp;');
                         }  
                         $r->print('</nobr></small></td>');  
                     }                      }
                     if ($addtools) {                      $r->print('</nobr></small></td>');
                         $r->print('<td align="left"><small>');                  }
                         if ($granularity eq 'Yes') {                  if ($addtools) {
                             foreach my $tool (@{$current{$user}{newtools}}) {                      $r->print('<td align="left"><small>');
                                 $r->print('<nobr><label><input type="checkbox"                      if ($granularity eq 'Yes') {
                           foreach my $tool (@{$$current{$user}{newtools}}) {
                               $r->print('<nobr><label><input type="checkbox"
                                           name="user_'.$tool.'" value="'.                                            name="user_'.$tool.'" value="'.
                                           $user.'" />'.$tool.                                            $user.'" />'.$tool.
                                           '</label></nobr>&nbsp;&nbsp;&nbsp;');                                            '</label></nobr>&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('<nobr><input type="hidden" 
                                           name="user_'. $tool.'" value="'.                                            name="user_'. $tool.'" value="'.
                                           $user.'" />'.$tool.                                            $user.'" />'.$tool.
                                           '</nobr>&nbsp;&nbsp;&nbsp;');                                            '</nobr>&nbsp;&nbsp;&nbsp;');
                             }  
                         }                          }
                         $r->print('</small></td>');  
                     }                      }
                     $r->print('</tr>'."\n");                      $r->print('</small></td>');
                     $rowNum ++;  
                 }                  }
                   $r->print('</tr>'."\n");
                   $rowNum ++;
             }              }
             $r->print(&Apache::lonhtmlcommon::end_pick_box());          }
             $r->print('          $r->print(&Apache::lonhtmlcommon::end_pick_box());
           $r->print('
   </td>    </td>
  </tr>');   </tr>');
         }  
     }      }
     return;      return;
 }  }
Line 2547  sub change_privs_form { Line 2371  sub change_privs_form {
         $nexttext = $$navbuttons{'mose'};          $nexttext = $$navbuttons{'mose'};
     }      }
     $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');      $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');
     &topic_bar($r,$tabcol,3,&mt('Members to delete or expire'));      &topic_bar($r,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 2576  sub change_privs_form { Line 2400  sub change_privs_form {
                   '</td></tr><tr><td colspan="4">&nbsp;</td></tr>');                    '</td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     }      }
           
     &topic_bar($r,$tabcol,4,&mt('[_1] member privileges',$ucgpterm));      &topic_bar($r,4,&mt('[_1] member privileges',$ucgpterm));
   
     my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools,      my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools,
                                           $toolprivs,$fixedprivs,$userdata,                                            $toolprivs,$fixedprivs,$userdata,
Line 2599  sub add_members_form { Line 2423  sub add_members_form {
     my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname,      my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname,
         $description,$granularity,$quota,$sectioncount,$tools,$functions,          $description,$granularity,$quota,$sectioncount,$tools,$functions,
         $stored,$states,$navbuttons,$rowColor1,$rowColor2,$gpterm,$ucgpterm)=@_;           $stored,$states,$navbuttons,$rowColor1,$rowColor2,$gpterm,$ucgpterm)=@_; 
     $r->print(' <br />      $r->print(' <br />');
 <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  <tr>  
   <td>&nbsp;</td>  
   <td colspan="3">  
 ');  
     my @available = ();      my @available = ();
     my @unavailable = ();      my @unavailable = ();
     &check_tools($functions,$tools,\@available,\@unavailable);      &check_tools($functions,$tools,\@available,\@unavailable);
     &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,      &print_current_settings($r,$action,$functions,$startdate,$enddate,
                             $functions,$startdate,$enddate,$groupname,      $groupname,$description,$granularity,$quota,
                             $description,$granularity,$quota,\@available,      \@available,\@unavailable,$gpterm,$ucgpterm);
                             \@unavailable,$gpterm,$ucgpterm);      &membership_options($r,$action,$formname,$sectioncount,1,$gpterm,$ucgpterm);
     $r->print('  
    </td>  
   </tr>  
   <tr>  
    <td colspan="4">&nbsp;</td>  
   </tr>');  
   
     &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm,  
                         $ucgpterm);  
     my $nexttext = $$navbuttons{'gtns'};      my $nexttext = $$navbuttons{'gtns'};
     my $prevtext = $$navbuttons{'gtpp'};      my $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
                         $$states{$action}[$page+1],$nexttext);                          $$states{$action}[$page+1],$nexttext);
     $r->print('  
  </table>');  
     return;      return;
 }  }
   
Line 2652  sub choose_privs_form { Line 2460  sub choose_privs_form {
     }      }
   
     $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');      $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');
     &topic_bar($r,$tabcol,6,&mt('[_1] member privileges',$ucgpterm));      &topic_bar($r,6,&mt('[_1] member privileges',$ucgpterm));
   
     &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs,      &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs,
                             $fixedprivs,$userdata,$usertools,$idx,undef,                              $fixedprivs,$userdata,$usertools,$idx,undef,
Line 2995  sub write_group_data { Line 2803  sub write_group_data {
                              'specificity','autoadd','autodrop','quota');                               'specificity','autoadd','autodrop','quota');
     my @mult_attributes = ('roles','types','sectionpick','defpriv');      my @mult_attributes = ('roles','types','sectionpick','defpriv');
   
       my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,
                                                                   $stored);
       my $quota = $env{'form.quota'};
       
       $quota =~ s/^\s*([^\s]*)\s*$/$1/;
       if ($quota eq '') {
           $quota = 0;
       }
       if ($quota !~ /^\d*\.?\d*$/) {
           $quota = 0;
           $r->print(&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));
       }
       if ($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));
       }
     my %groupinfo = (      my %groupinfo = (
                      description => $esc_description,                       description => $esc_description,
                      startdate => $startdate,                       startdate => $startdate,
Line 3006  sub write_group_data { Line 2830  sub write_group_data {
                      specificity => $specificity,                       specificity => $specificity,
                      autoadd => $env{'form.autoadd'},                       autoadd => $env{'form.autoadd'},
                      autodrop => $env{'form.autodrop'},                       autodrop => $env{'form.autodrop'},
                      quota => $env{'form.quota'},                                       quota => $quota,
                    );                     );
   
     foreach my $func (keys(%{$functions})) {      foreach my $func (keys(%{$functions})) {
         my $status;          my $status;
         if (grep(/^$func$/,@{$tools})) {          if (grep(/^$func$/,@{$tools})) {
Line 3058  sub write_group_data { Line 2883  sub write_group_data {
                                            $description,$tools,\%groupinfo,                                             $description,$tools,\%groupinfo,
                                            $gpterm,$ucgpterm,$crstype);                                             $gpterm,$ucgpterm,$crstype);
             if ($result ne 'ok') {              if ($result ne 'ok') {
                 $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].',$gpterm,$result));                      $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].<br />',$gpterm,$result));
             }              }
             $r->print(&mt('[_1] [_2] was created.<br />',$ucgpterm,$groupname));              $r->print(&mt('[_1] [_2] was created.<br />',$ucgpterm,$groupname));
         } else {          } else {
Line 3072  sub write_group_data { Line 2897  sub write_group_data {
         &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".          &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
                                  'in '.lc($crstype).': '.$cnum.                                   'in '.lc($crstype).': '.$cnum.
                                  ' in domain: '.$cdom);                                   ' in domain: '.$cdom);
         $r->print(&mt('An error occurred when [_1] the new [_2]. '.          $r->print(&mt('An error occurred when [_1] the [_2]. '.
                       'Please try again.',$actiontype{$action},$gpterm));                        'Please try again.',$actiontype{$action},$gpterm));
     }      }
     return $result;      return $result;
Line 3192  sub process_membership { Line 3017  sub process_membership {
         my $start = $startdate;          my $start = $startdate;
         my $end = $enddate;          my $end = $enddate;
         if ($state eq 'memresult') {          if ($state eq 'memresult') {
             if ($curr_privs{$user} eq $group_privs{$user}) {  
                push(@unchanged,$user);  
                next;  
             }  
             if (exists($curr_start{$user})) {  
                 $start = $curr_start{$user};  
             }  
             if (exists($curr_end{$user})) {  
                 $end = $curr_end{$user};  
             }  
             $type = 'modified';  
             if (@activate > 0) {              if (@activate > 0) {
                 if (grep/^$user$/,@activate) {                  if (grep/^$user$/,@activate) {
                     $start = $now;                      $start = $now;
Line 3217  sub process_membership { Line 3031  sub process_membership {
                     $type = 'reenabled';                      $type = 'reenabled';
                 }                  }
             }              }
               if ($type eq '') {
                   if ($curr_privs{$user} eq $group_privs{$user}) {
                       push(@unchanged,$user);
                       next;
                   }
                   if (exists($curr_start{$user})) {
                       $start = $curr_start{$user};
                   }
                   if (exists($curr_end{$user})) {
                       $end = $curr_end{$user};
                   }
                   $type = 'modified';
               }
         } else {          } else {
             $type = 'added';              $type = 'added';
         }          }
Line 3325  sub automapping { Line 3152  sub automapping {
     if (exists($$stored{'autodrop'})) {      if (exists($$stored{'autodrop'})) {
         $drop = $$stored{'autodrop'};          $drop = $$stored{'autodrop'};
     }      }
     &topic_bar($r,$tabcol,$image,$$lt{'endi'});      &topic_bar($r,$image,$$lt{'endi'});
     $r->print('      $r->print('
   <tr>    <tr>
    <td>&nbsp;</td>     <td>&nbsp;</td>
Line 3379  sub mapping_settings { Line 3206  sub mapping_settings {
         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
     }      }
     &topic_bar($r,$tabcol,$image,$$lt{'pirs'});      &topic_bar($r,$image,$$lt{'pirs'});
     $r->print('      $r->print('
    <tr>     <tr>
     <td>&nbsp;</td>      <td>&nbsp;</td>
Line 3566  sub date_setting_table { Line 3393  sub date_setting_table {
                                                       'startdate',$starttime);                                                        'startdate',$starttime);
     my $endform = &Apache::lonhtmlcommon::date_setter($formname,      my $endform = &Apache::lonhtmlcommon::date_setter($formname,
                                                       'enddate',$endtime);                                                        'enddate',$endtime);
     my $perpetual = '<nobr><label><input type="checkbox" name="no_end_date" />      my $perpetual = 
                                                 no ending date</label></nobr>';   '<nobr><label><input type="checkbox" name="no_end_date" />'.
     my $start_table = '';   &mt('None').'</label></nobr>';
     $start_table .= "<table>\n";      my $table = "<table>\n".
     $start_table .= '<tr><td align="right">Default starting date for    '<tr><td align="right">'.&mt('Start:').'</td>'.
                                            member access</td>'.  
         '<td>'.$startform.'</td>'.          '<td>'.$startform.'</td>'.
         '<td>&nbsp;</td>'."</tr>\n";          '<td>&nbsp;</td>'."</tr>\n".
     $start_table .= "</table>";   '<tr><td align="right">'.&mt('End:').'</td>'.
     my $end_table = '';  
     $end_table .= "<table>\n";  
     $end_table .= '<tr><td align="right">Default ending date for   
                                          member access</td>'.  
         '<td>'.$endform.'</td>'.          '<td>'.$endform.'</td>'.
         '<td>'.$perpetual.'</td>'."</tr>\n";          '<td>'.$perpetual.'</td>'."</tr>\n".
     $end_table .= "</table>\n";   "</table>\n";
     return ($start_table, $end_table);      return $table;
 }  }
   
 sub add_group_folder {  sub add_group_folder {
Line 3675  sub map_updater { Line 3497  sub map_updater {
     my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,      my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,
                                                         $newfile);                                                          $newfile);
     if ($newmapurl !~ m|^/uploaded|) {      if ($newmapurl !~ m|^/uploaded|) {
         $outcome = "Error uploading new folder ($newfile): $newmapurl";          $outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'<br />';
         return $outcome;          return $outcome;
     }       } 
     my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap);      my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap);
     if ($fatal) {      if ($fatal) {
         $outcome = "Error reading contents of parent folder ($parentmap): $errtext\n";          $outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'<br />';
         return $outcome;          return $outcome;
     } else {      } else {
         my $newidx=&Apache::lonratedt::getresidx($newmapurl);          my $newidx=&Apache::lonratedt::getresidx($newmapurl);
Line 3689  sub map_updater { Line 3511  sub map_updater {
         $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;          $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;
         my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1);          my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1);
         if ($errtext) {          if ($errtext) {
            $outcome = "Error storing updated parent folder ($parentmap):  $errtext\n";              $outcome = &mt('Error storing updated parent folder')." ($parentmap):  $errtext".'<br />';
             return $outcome;              return $outcome;
         }          }
     }      }
Line 3710  sub new_map { Line 3532  sub new_map {
   
 sub parm_setter {  sub parm_setter {
     my ($navmap,$cdom,$url,$groupname) = @_;      my ($navmap,$cdom,$url,$groupname) = @_;
     my %parmresult;      my $allresults;
     my %hide_settings = (      my %hide_settings = (
                            'course' =>  {                             'course' =>  {
                                           'num' => 13,                                            'num' => 13,
Line 3725  sub parm_setter { Line 3547  sub parm_setter {
     my $res = $navmap->getResourceByUrl($url);      my $res = $navmap->getResourceByUrl($url);
     my $symb = $res->symb();      my $symb = $res->symb();
     foreach my $level (keys(%hide_settings)) {      foreach my $level (keys(%hide_settings)) {
         $parmresult{$level} =  &Apache::lonparmset::storeparm_by_symb($symb,          my $parmresult =  &Apache::lonparmset::storeparm_by_symb($symb,
                                                  '0_hiddenresource',                                                   '0_hiddenresource',
                                                  $hide_settings{$level}{'num'},                                                   $hide_settings{$level}{'num'},
                                                  $hide_settings{$level}{'set'},                                                   $hide_settings{$level}{'set'},
                                                  'string_yesno',undef,$cdom,                                                   'string_yesno',undef,$cdom,
                                                  undef,undef,                                                   undef,undef,
                                                  $hide_settings{$level}{'extra'});                                                   $hide_settings{$level}{'extra'});
           if ($parmresult) {
               $allresults .= $level.': '.$parmresult;
           }
     }      }
     return %parmresult;      return $allresults;
 }  }
   
 sub create_homepage {  sub create_homepage {
Line 3839  sub validate_groupname { Line 3664  sub validate_groupname {
 }  }
   
 sub topic_bar {  sub topic_bar {
     my ($r,$tabcol,$imgnum,$title) = @_;      my ($r,$imgnum,$title) = @_;
     $r->print('      $r->print('
  <tr bgcolor="'.$tabcol.'">  <div class="LC_topic_bar">
   <td>&nbsp;</td>      <img src="/res/adm/pages/bl_step'.$imgnum.'.gif" />&nbsp;
   <td valign="middle" align="left">      <span>'.$title.'<span>
    <nobr>  </div>
     <img src="/res/adm/pages/bl_step'.$imgnum.'.gif" valign="middle">&nbsp;  
    </nobr>  
   </td>  
   <th align="left"><nobr>'.$title.'<nobr>  
   </th>  
   <td width="100%">&nbsp;</td>  
  </tr>  
  <tr>  
   <td colspan="4">&nbsp;</td>  
  </tr>  
 ');  ');
     return;      return;
 }  }

Removed from v.1.35  
changed lines
  Added in v.1.41


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