Diff for /loncom/interface/lonparmset.pm between versions 1.432 and 1.445

version 1.432, 2009/02/15 17:19:39 version 1.445, 2009/05/08 22:47:01
Line 973  sub print_row { Line 973  sub print_row {
     if ($parmlev eq 'full') {      if ($parmlev eq 'full') {
         $r->print('<td style="background-color:'.$defbgtwo.';" align="center">'          $r->print('<td style="background-color:'.$defbgtwo.';" align="center">'
                   .$$part{$which}.'</td>');                    .$$part{$which}.'</td>');
     } else {          } else {
         $parm=~s|\[.*\]\s||g;          $parm=~s|\[.*\]\s||g;
         $parm=&mt($parm);  
     }      }
     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');      my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
     if ($automatic) {      if ($automatic) {
Line 1077  sub print_td { Line 1076  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
     $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).      $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).
               ';" align="center">');                ';" align="center">');
     if ($which<11 || $which > 12) {      my $nolink = 0;
  $r->print(&plink($$typeoutpar[$which],      if ($which == 11 || $which == 12) {
  $$display{$value},$$outpar[$which],          $nolink = 1;
  $mprefix."$which",'parmform.pres','psub'));      } elsif ($mprefix =~ /availablestudent\&$/) {
           if ($which > 3) {
               $nolink = 1;
           }
       }
       if ($nolink) {
           $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
     } else {      } else {
  $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));          $r->print(&plink($$typeoutpar[$which],
                            $$display{$value},$$outpar[$which],
                            $mprefix."$which",'parmform.pres','psub'));
     }      }
     $r->print('</td>'."\n");      $r->print('</td>'."\n");
 }  }
Line 1314  sub parmmenu { Line 1321  sub parmmenu {
   
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     $r->print();      $r->print();    
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
     $r->print("\n".'<table id="LC_parm_overview_parm_menu"><tr>');      $r->print("\n".'<table id="LC_parm_overview_parm_menu"><tr>');
     my $cnt=0;      my $cnt=0;
     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {      foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
Line 1375  ENDSCRIPT Line 1383  ENDSCRIPT
 }  }
   
 sub partmenu {  sub partmenu {
     my ($r,$allparts,$psprt)=@_;      my ($r,$allparts,$psprt)=@_;    
       
     $r->print('<select multiple="multiple" name="psprt" size="8">');      $r->print('<select multiple="multiple" name="psprt" size="8">');
     $r->print('<option value="all"');      $r->print('<option value="all"');
     $r->print(' selected="selected"') unless (@{$psprt});      $r->print(' selected="selected"') unless (@{$psprt});
Line 1393  sub partmenu { Line 1402  sub partmenu {
     $r->print('>'.$$allparts{$tempkey}.'</option>');      $r->print('>'.$$allparts{$tempkey}.'</option>');
  }   }
     }      }
     $r->print('</select>');      $r->print('</select>');    
 }  }
   
 sub usermenu {  sub usermenu {
Line 1410  sub usermenu { Line 1419  sub usermenu {
   
     my $g_s_header='';      my $g_s_header='';
     my $g_s_footer='';      my $g_s_footer='';
       
     if (%sectionhash) {      if (%sectionhash) {
         $sections=&mt('Section:').' <select name="csec"';          $sections=&mt('Section:').' <select name="csec"';
         if (%grouphash && $parmlev ne 'full') {          if (%grouphash && $parmlev ne 'full') {
Line 1477  function group_or_section(caller) { Line 1486  function group_or_section(caller) {
     }      }
   
     if (%sectionhash || %grouphash) {      if (%sectionhash || %grouphash) {
         $g_s_header='<fieldset><legend>'.&mt('Group/Section').'</legend><div>';          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));       
         $g_s_footer='</div></fieldset>';          $r->print($sections.$groups);        
     }      }
       
     $r->print('<b>'      $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));             
              .$g_s_header      $r->print(&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
              .$sections  
              .$groups  
              .$g_s_footer  
              .'<fieldset><legend>'.&mt('User').'</legend><div>'  
              .&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'  
                  ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'                   ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'
                  ,'<input type="text" value="'.$id.'" size="12" name="id" /> '                   ,'<input type="text" value="'.$id.'" size="12" name="id" /> '
                  ,$chooseopt)                   ,$chooseopt));  
              .'</div></fieldset>'  
              .'</b>'  
     );  
 }  }
   
 sub displaymenu {  sub displaymenu {
     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;      my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.      $r->print('<div class="LC_ContentBoxSpecial">');
      &mt('Select Parts to View').'</th></tr><tr><td>');        $r->print('<h2 class="LC_hcell">Step 2</h2>');
       $r->print('<div class="LC_BoxPadding">' );
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
       
     &parmmenu($r,$allparms,$pscat,$keyorder);      &parmmenu($r,$allparms,$pscat,$keyorder);
     $r->print('</td><td valign="top" align="center">');     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
     &partmenu($r,$allparts,$psprt);      &partmenu($r,$allparts,$psprt);
     $r->print('</td></tr></table>');      $r->print(&Apache::lonhtmlcommon::end_pick_box());
       $r->print('</div></div>');
 }  }
   
 sub mapmenu {  sub mapmenu {
     my ($r,$allmaps,$pschp,$maptitles)=@_;      my ($r,$allmaps,$pschp,$maptitles)=@_; 
     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');     
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder')));
     $r->print('<select name="pschp">');      $r->print('<select name="pschp">');
     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');      $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {      foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
Line 1517  sub mapmenu { Line 1523  sub mapmenu {
  $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');   $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
     }      }
     $r->print("</select>");      $r->print("</select>");
      
 }  }
   
 sub levelmenu {  sub levelmenu {
     my ($r,$alllevs,$parmlev)=@_;      my ($r,$alllevs,$parmlev)=@_;    
     $r->print('<b>'.&mt('Select Parameter Level').      
       &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
     $r->print('<select name="parmlev">');      $r->print('<select name="parmlev">');
     foreach (reverse sort keys %{$alllevs}) {      foreach (reverse sort keys %{$alllevs}) {
  $r->print('<option value="'.$$alllevs{$_}.'"');   $r->print('<option value="'.$$alllevs{$_}.'"');
Line 1531  sub levelmenu { Line 1538  sub levelmenu {
  }   }
  $r->print('>'.&mt($_).'</option>');   $r->print('>'.&mt($_).'</option>');
     }      }
     $r->print("</select>");      $r->print("</select>");    
 }  }
   
   
Line 1798  sub assessparms { Line 1805  sub assessparms {
         my @values=split(/\&\&\&/,$env{'form.pres_value'});          my @values=split(/\&\&\&/,$env{'form.pres_value'});
         my @types=split(/\&\&\&/,$env{'form.pres_type'});          my @types=split(/\&\&\&/,$env{'form.pres_type'});
  for (my $i=0;$i<=$#markers;$i++) {   for (my $i=0;$i<=$#markers;$i++) {
               if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
                   my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   my (@ok_slots,@fail_slots,@del_slots);
                   my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
                   my ($level,@all) =
                       &parmval_by_symb('0.availablestudent',$pssymb,'',$uname,$udom,
                                        $csec,$cgroup,$courseopt);
                   foreach my $slot_name (split(/:/,$values[$i])) {
                       next if ($slot_name eq '');
                       if (&update_slots($slot_name,$cdom,$cnum,$pssymb,$uname,$udom) eq 'ok') {
                           push(@ok_slots,$slot_name);
   
                       } else {
                           push(@fail_slots,$slot_name);
                       }
                   }
                   if (@ok_slots) {
                       $values[$i] = join(':',@ok_slots);
                   } else {
                       $values[$i] = '';
                   }
                   if ($all[$level] ne '') {
                       my @existing = split(/:/,$all[$level]);
                       foreach my $slot_name (@existing) {
                           if (!grep(/^\Q$slot_name\E$/,split(/:/,$values[$i]))) {
                               if (&delete_slots($slot_name,$cdom,$cnum,$uname,$udom,$pssymb) eq 'ok') {
                                   push(@del_slots,$slot_name);
                               }
                           }
                       }
                   }
               }
     $message.=&storeparm(split(/\&/,$markers[$i]),      $message.=&storeparm(split(/\&/,$markers[$i]),
  $values[$i],   $values[$i],
  $types[$i],   $types[$i],
Line 1822  sub assessparms { Line 1862  sub assessparms {
     }      }
                                                   
     if (!$pssymb) {      if (!$pssymb) {
         $r->print('<table border="1"><tr><td>');  
           $r->print('<div class="LC_ContentBoxSpecial">');
           $r->print('<h2 class="LC_hcell">Step 1</h2>');
           $r->print('<div class="LC_BoxPadding">' );
           $r->print(&Apache::lonhtmlcommon::start_pick_box());
          
         &levelmenu($r,\%alllevs,$parmlev);          &levelmenu($r,\%alllevs,$parmlev);
         $r->print('</td>');         
  if ($parmlev ne 'general') {   if ($parmlev ne 'general') {           
             $r->print('<td>');      &mapmenu($r,\%allmaps,$pschp,\%maptitles);    
     &mapmenu($r,\%allmaps,$pschp,\%maptitles);   }
     $r->print('</td>');             
  }          $r->print(&Apache::lonhtmlcommon::end_pick_box());        
         $r->print('</tr></table>');          $r->print('</div></div>');
   
  &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);   &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
     } else {      } else {
         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);          my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
Line 1840  sub assessparms { Line 1886  sub assessparms {
   '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.    '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
   ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');    ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
     }      }
     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);          $r->print('<div class="LC_ContentBoxSpecial">');
       $r->print('<h2 class="LC_hcell">Step 3</h2>');
       $r->print('<div class="LC_BoxPadding">' );
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
       &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
      
       $r->print(&Apache::lonhtmlcommon::end_pick_box());
       $r->print('</div></div>');
   
     $r->print('<p>'.$message.'</p>');      $r->print('<p>'.$message.'</p>');
   
Line 1977  ENDTABLEHEADFOUR Line 2030  ENDTABLEHEADFOUR
                         if (grep $_ eq $tempkeyp, @catmarker) {                          if (grep $_ eq $tempkeyp, @catmarker) {
                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');                            $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');                            $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');                            my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
                             if ($allparms{$name{$_}} ne '') {
                                 my $identifier;
                                 if ($parmdis =~ /(\s*\[Part.*)$/) {
                                     $identifier = $1;
                                 }
                                 $display{$_} = $allparms{$name{$_}}.$identifier;
                             } else {
                                 $display{$_} = $parmdis;
                             }
                           unless ($display{$_}) { $display{$_}=''; }                            unless ($display{$_}) { $display{$_}=''; }
                           $display{$_}.=' ('.$name{$_}.')';                            $display{$_}.=' ('.$name{$_}.')';
                           $default{$_}=&Apache::lonnet::metadata($uri,$_);                            $default{$_}=&Apache::lonnet::metadata($uri,$_);
Line 2084  ENDTABLEHEADFOUR Line 2146  ENDTABLEHEADFOUR
                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                        if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                         $part{$tempkeyp}="0";                          $part{$tempkeyp}="0";
                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                          $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                          my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                           if ($allparms{$name{$tempkeyp}} ne '') {
                               my $identifier;
                               if ($parmdis =~ /(\s*\[Part.*)$/) {
                                   $identifier = $1;
                               }
                               $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                           } else {
                               $display{$tempkeyp} = $parmdis;
                           }
                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                          unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                          $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                         $display{$tempkeyp} =~ s/_\w+_/_0_/;                          $display{$tempkeyp} =~ s/_\w+_/_0_/;
Line 2177  ENDTABLEHEADFOUR Line 2248  ENDTABLEHEADFOUR
                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                    if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                     $part{$tempkeyp}="0";                      $part{$tempkeyp}="0";
                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                      $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                      my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                       if ($allparms{$name{$tempkeyp}} ne '') {
                           my $identifier;
                           if ($parmdis =~ /(\s*\[Part.*)$/) {
                               $identifier = $1;
                           }
                           $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                       } else {
                           $display{$tempkeyp} = $parmdis;
                       }
                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                      unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                      $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                     $display{$tempkeyp} =~ s/_\w+_/_0_/;                      $display{$tempkeyp} =~ s/_\w+_/_0_/;
Line 2242  sub crsenv { Line 2322  sub crsenv {
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
   
     my (%crsinfo,$chome);      my (%crsinfo,$chome);
       my $crstype = &Apache::loncommon::course_type();
   
     #      #
     # Go through list of changes      # Go through list of changes
Line 2252  sub crsenv { Line 2333  sub crsenv {
         if ($name eq 'newp') {          if ($name eq 'newp') {
             $name = $env{'form.newp_name'};              $name = $env{'form.newp_name'};
         }          }
           if ($name =~ /^rolenames_([^_]+)$/) {
               $name = $1.'.plaintext';
               my $standardtitle = 
                   &Apache::lonnet::plaintext($1,$crstype,$env{'request.course.id'},1);
               my %adv_roles =
                   &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);
               if ($value ne '') {
                   foreach my $role (keys(%adv_roles)) {
                       if ($role =~ m{^cr/$match_domain/$match_name/\Q$value\E$}) {
                           $setoutput.= '<span class="LC_error">'.
                                        &mt('Requested replacement title for [_1] role is already used as the name of a custom role ([_2]).',$standardtitle,$value).
                                        '</span><br />';
                           undef($value);
                       }
                   }
               }
           }
         if ($name eq 'url') {          if ($name eq 'url') {
             $value=~s/^\/res\///;              $value=~s/^\/res\///;
             my $bkuptime=time;              my $bkuptime=time;
Line 2413  sub crsenv { Line 2511  sub crsenv {
         }          }
     }      }
   
     my $start_table     =&Apache::loncommon::start_data_table();  
     my $start_header_row=&Apache::loncommon::start_data_table_header_row();  
     my $end_header_row  =&Apache::loncommon::end_data_table_header_row();  
 # ------------------------- Re-init course environment entries for this session  # ------------------------- Re-init course environment entries for this session
   
     &Apache::lonnet::coursedescription($env{'request.course.id'},      &Apache::lonnet::coursedescription($env{'request.course.id'},
Line 2427  sub crsenv { Line 2522  sub crsenv {
     my $SelectStyleFile=&mt('Select Style File');      my $SelectStyleFile=&mt('Select Style File');
     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');      my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
     my $output='';      my $output='';
       my $output_SB = ''; # will be replaced by "$output" when all changes are done
     my $can_categorize;      my $can_categorize;
       my %lt=&Apache::lonlocal::texthash(
                  'par'   => 'Parameter',
                  'val'   => 'Value',
                  'set'   => 'Set?',
                  'sav'   => 'Save',
              );
     if (! exists($values{'con_lost'})) {      if (! exists($values{'con_lost'})) {
         my %descriptions=          my %descriptions=
     ('url'            => '<b>'.&mt('Top Level Map').'</b><br />'.      ('url'            => '<b>'.&mt('Top Level Map').'</b><br />'.
Line 2436  sub crsenv { Line 2538  sub crsenv {
                                  &mt('Select Map').'</a><br /><span class="LC_warning"> '.                                   &mt('Select Map').'</a><br /><span class="LC_warning"> '.
                                  &mt('Modification may make assessment data inaccessible!').                                   &mt('Modification may make assessment data inaccessible!').
                                  '</span>',                                   '</span>',
              'description'    => '<b>'.&mt('Course Description').'</b>',               'description'    => '<b>'.&mt('Course Title').'</b>',
              'courseid'       => '<b>'.&mt('Course ID or number').               'courseid'       => '<b>'.&mt('Course ID or number').
                                  '</b><br />'.                                   '</b><br />'.
                                  '('.&mt('internal, optional').')',                                   '('.&mt('internal, optional').')',
Line 2474  sub crsenv { Line 2576  sub crsenv {
                                              .'('.&mt("[_1] for link to each a listing of each student's files.",'"<tt>yes</tt>"').')',                                               .'('.&mt("[_1] for link to each a listing of each student's files.",'"<tt>yes</tt>"').')',
              'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'               'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'
                                            .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"<tt>yes</tt>"').')',                                             .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"<tt>yes</tt>"').')',
              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').'</b><br />'               'plc.roles.denied'=> '<b>'.&mt('Disallow chat room use for Roles').'</b><br />'
                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'                                   .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'
                                  .'("<tt>'.&mt('role,role,...').'</tt>") '                                   .'("<tt>'.&mt('role,role,...').'</tt>") '
                          .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),                           .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
              'plc.users.denied' =>                'plc.users.denied' => 
                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.                            '<b>'.&mt('Disallow chat room use for Users').'</b><br />'.
                                   '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',                                    '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',
   
              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').'</b><br />'               'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').'</b><br />'
Line 2554  sub crsenv { Line 2656  sub crsenv {
              'externalsyllabus'               'externalsyllabus'
                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',                   => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
      'tthoptions'       'tthoptions'
          => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>',           => '<b>'.&mt('Default set of options to pass to tth/m when converting TeX').'</b>',
   
      'texengine'       'texengine'
          => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'           => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'
Line 2573  sub crsenv { Line 2675  sub crsenv {
                     &mt('Display Categories').'</a>',                      &mt('Display Categories').'</a>',
              'datelocale'                'datelocale' 
                  => '<b>'.&mt('Locale used for course calendar').'</b>',                   => '<b>'.&mt('Locale used for course calendar').'</b>',
                'rolenames'
                    => '<b>'.&mt('Replacement titles for standard course roles').'</b><br />'.
                       '('.&mt('To replace the standard title for a course role, enter the title you wish to use, otherwise leave blank.').')',
              );               );
         my @Display_Order = ('url','description','courseid','cloners');  
         (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom);  
         if ($can_toggle_cat) {  # ----------------------------------------------------------------
             push(@Display_Order,'hidefromcat');  # Begin: New Version with Parameter Categories
         }  
         if ($can_categorize) {      sub parameter_row {
             push(@Display_Order,'categories');          # Create parameter row for course environment screen
         }  
         push (@Display_Order,('grading',          my ($parameter, $description) = @_;
                              'externalsyllabus',  
                              'default_xml_style','pageseparators',          # Start Parameter Row
                              'question.email','question.email.text','comment.email',          my $output = &Apache::loncommon::start_data_table_row();
                              'comment.email.text','policy.email','policy.email.text',  
                              'student_classlist_view',          # Column 1/3: Descriptive text of current parameter
                              'student_classlist_opt_in',          $output .= '<td>'.$description.'</td>';
                              'student_classlist_portfiles',  
                              'plc.roles.denied','plc.users.denied',          # Column 2/3: Input field (Sometimes special field(s), depending on parameter)
                              'pch.roles.denied','pch.users.denied',  
                              'allow_limited_html_in_feedback',          # onchange is javascript to automatically check the 'Set' button.
                              'allow_discussion_post_editing',          my $onchange = 'onFocus="javascript:window.document.forms'
                              'languages',                        ."['envform'].elements['".$parameter."_setparmval']"
                              'timezone',                        .'.checked=true;"';
                              'datelocale',  
      'nothideprivileged',  
                              'rndseed',  
                              'receiptalg',  
                              'problem_stream_switch',  
      'suppress_tries',  
                              'suppress_embed_prompt',  
                              'default_paper_size',  
      'print_header_format',  
                              'disable_receipt_display',  
                              'spreadsheet_default_classcalc',  
                              'spreadsheet_default_studentcalc',  
                              'spreadsheet_default_assesscalc',   
                              'hideemptyrows',  
                              'default_enrollment_start_date',  
                              'default_enrollment_end_date',  
      'tthoptions',  
      'texengine',  
      'disablesigfigs',  
      'disableexampointprint',  
      'task_messages','task_grading'));  
  foreach my $parameter (sort(keys(%values))) {  
             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||  
                     ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)  
                     || ($parameter eq 'type')) {  
                 if (! $descriptions{$parameter}) {  
                     $descriptions{$parameter}=$parameter;  
                     push(@Display_Order,$parameter);  
                 }  
             }  
  }  
   
         foreach my $parameter (@Display_Order) {  
             my $description = $descriptions{$parameter};  
             # onchange is javascript to automatically check the 'Set' button.  
             my $onchange = 'onFocus="javascript:window.document.forms'.  
                 "['envform'].elements['".$parameter."_setparmval']".  
                 '.checked=true;"';  
             $output .= &Apache::loncommon::start_data_table_row().  
  '<td>'.$description.'</td>';  
             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {              if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                 $output .= '<td>'.                  $output .= '<td>'.
                     &Apache::lonhtmlcommon::date_setter('envform',                      &Apache::lonhtmlcommon::date_setter('envform',
Line 2660  sub crsenv { Line 2725  sub crsenv {
                 $output .= '<td>'.                  $output .= '<td>'.
                     &Apache::loncommon::select_datelocale($parameter.'_value',                      &Apache::loncommon::select_datelocale($parameter.'_value',
                                                           $currdatelocale,                                                            $currdatelocale,
                                                           $onchange,$includeempty).'</td>';                                                             $onchange,$includeempty).'</td>';
               } elsif ($parameter eq 'rolenames') {
                   $output.= '<td><table>';
                   foreach my $role ('cc','in','ta','ep','ad','st') {
                       my $onchange = 'onFocus="javascript:window.document.forms'.
                                      "['envform'].elements['".
                                      $parameter.'_'.$role."_setparmval']".
                                      '.checked=true;"';
                       $output.= '<tr><td>'.&Apache::lonnet::plaintext($role,$crstype,undef,1).
                                 '</td><td>'.
                                 &Apache::lonhtmlcommon::textbox($parameter.'_'.$role.'_value',
                                                       $values{$role.'.plaintext'},
                                                       15,$onchange).
                                 '</td></tr>';
                   }
                   $output .= '</table></td><td><table>';
                   foreach my $role ('cc','in','ta','ep','ad','st') {
                       $output .= '<tr><td>'.&Apache::lonhtmlcommon::checkbox($parameter.'_'.$role.'_setparmval').
                                 '</td></tr>';
                   }
                   $output .= '</table></td>';
             } elsif ($parameter eq 'categories') {              } elsif ($parameter eq 'categories') {
                 my $catdisplay;                  my $catdisplay;
                 if ($values{'categories'} ne '') {                  if ($values{'categories'} ne '') {
Line 2676  sub crsenv { Line 2761  sub crsenv {
                            $values{'categories'}.'" />'.                             $values{'categories'}.'" />'.
                            '<input type="textbox" name="categories_display" value="'.                             '<input type="textbox" name="categories_display" value="'.
                            $catdisplay.'" readonly="readonly" size="40" /></td>';                             $catdisplay.'" readonly="readonly" size="40" /></td>';
             } else {              } else { # Display default textbox in all other cases
                 $output .= '<td>'.                  $output .= '<td>'
                     &Apache::lonhtmlcommon::textbox($parameter.'_value',                            .&Apache::lonhtmlcommon::textbox($parameter.'_value',
                                                     $values{$parameter},                                                             $values{$parameter},
                                                     40,$onchange).'</td>';                                                             40,
             }                                                             $onchange)
             $output .= '<td>'.                            .'</td>';
                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').              }
                 '</td>';  
             $output .= &Apache::loncommon::end_data_table_row()."\n";          # Column 3/3: Check Box (in most cases)
  }          unless ($parameter eq 'rolenames') {
         my $onchange = 'onFocus="javascript:window.document.forms'.              $output .= '<td>'
             '[\'envform\'].elements[\'newp_setparmval\']'.                        .&Apache::lonhtmlcommon::checkbox($parameter.'_setparmval')
             '.checked=true;"';                        .'</td>';
  $output.=&Apache::loncommon::start_data_table_row().          }
     '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.  
     '<input type="text" size="40" name="newp_name" '.          # End Parameter Row
                 $onchange.' /></td><td>'.          $output .= &Apache::loncommon::end_data_table_row();
             '<input type="text" size="40" name="newp_value" '.  
                 $onchange.' /></td><td>'.          return $output;
     '<input type="checkbox" name="newp_setparmval" /></td>'.      } # End sub parameter_row
     &Apache::loncommon::end_data_table_row()."\n";  
   
       # Parameter Category Names
       my %parm_cat_names = &Apache::lonlocal::texthash (
           'cat_0'      => 'Parameter Category Zero',
           'cat_1'      => 'Parameter Category One',
           'cat_2'      => 'Parameter Category Two',
           'cat_3'      => 'Parameter Category Three',
           'cat_4'      => 'Parameter Category Four',
           'cat_5'      => 'Parameter Category Five',
           'cat_6'      => 'Parameter Category Six',
           'cat_7'      => 'Parameter Category Seven',
           'cat_can'    => 'Parameter Category Can',
           'cat_custom' => 'Parameter Category Custom',
       );
   
       # Display Order of Parameter Categories
       my @Display_Order = (
           'cat_0',
           'cat_1',
           'cat_2',
           'cat_3',
           'cat_4',
           'cat_5',
           'cat_6',
           'cat_7',
           'cat_can',
           'cat_custom',
       );
   
       # Link Parameter Categories with Parameters
       # Order of parameters is display order
       my %parm_cat_parms = (
           'cat_0' => [
               'url',
               'description',
               'courseid',
               'cloners'
           ],
           'cat_1' => [
               'grading',
               'externalsyllabus',
               'default_xml_style',
               'pageseparators'
           ],
           'cat_2' => [
               'question.email',
               'question.email.text',
               'comment.email',
               'comment.email.text',
               'policy.email',
               'policy.email.text',
           ],
           'cat_3' => [
               'student_classlist_view',
               'student_classlist_opt_in',
               'student_classlist_portfiles',
               'plc.roles.denied',
               'plc.users.denied',
               'pch.roles.denied',
               'pch.users.denied',
               'allow_limited_html_in_feedback',
               'allow_discussion_post_editing',
           ],
           'cat_4' => [
               'languages',
               'timezone',
               'datelocale',
               'rolenames',
               'nothideprivileged',
               'rndseed',
               'receiptalg',
               'problem_stream_switch',
               'suppress_tries',
               'suppress_embed_prompt',
               'default_paper_size',
               'print_header_format',
               'disable_receipt_display',
           ],
           'cat_5' => [
               'spreadsheet_default_classcalc',
               'spreadsheet_default_studentcalc',
               'spreadsheet_default_assesscalc',
               'hideemptyrows',
           ],
           'cat_6' => [
               'default_enrollment_start_date',
               'default_enrollment_end_date',
           ],
           'cat_7' => [
               'tthoptions',
               'texengine',
               'disablesigfigs',
               'disableexampointprint',
               'task_messages',
               'task_grading',
           ],
       );
   
       # Add special parameters depending on special context to parameter categories hash
       my @can_cats;
       (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom);
       if ($can_toggle_cat) {
           push(@can_cats,'hidefromcat');
     }      }
     my %lt=&Apache::lonlocal::texthash(      if ($can_categorize) {
     'par'   => 'Parameter',          push(@can_cats,'categories');
     'val'   => 'Value',      }
     'set'   => 'Set?',      $parm_cat_parms{'cat_can'} = [@can_cats];
     'sav'   => 'Save'  
        );      # Add custom parameters to custom parameter category
       my @custom_cats;
     my $Parameter=&mt('Parameter');      foreach my $parameter (sort(keys(%values))) {
     my $Value=&mt('Value');          unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
     my $Set=&mt('Set');                  ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
                   || ($parameter eq 'type') ||
                   ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) {
               if (! $descriptions{$parameter}) {
                   $descriptions{$parameter}=$parameter;
                   push(@custom_cats,$parameter);
               }
           }
       }
       $parm_cat_parms{'cat_custom'} = [@custom_cats];
   
   
   # Display Course Parameter Overview
   # Provide hyperlinks to detailed parameter settings
   $output_SB .= '<a name="parmlist" />'
                .'<div class="LC_ContentBoxSpecial">'
                .'<h2 class="LC_hcell">'.&mt('Course Parameter Overview').'</h2>'
                .'<ul>';
   foreach my $catkey (@Display_Order) {
       if (!@{$parm_cat_parms{$catkey}}) { next; } # Only display non-empty categories 
       $output_SB .= '<li>'
                    .'<a href="#parmlist_'.$catkey.'">'
                    .$parm_cat_names{$catkey}
                    .'</a>'
                    .'</li>';
   }
   $output_SB .= '</ul>'
               .'</div>';
   
   
   my $buttons='<div align="right">'
              .'<input type="submit" name="crsenv" value="'.&mt('Save All').'" />'
              .'<br /><a href="#parmlist">'.&mt('Back to Course Parameter Overview').'</a>'
              .'</div>';
   
   # Display all Parameters grouped by categories
   $output_SB .= '<h2>'.&mt('Course Parameters').'</h2>';
   
   foreach my $catkey (@Display_Order) {
       if (!@{$parm_cat_parms{$catkey}}) { next; } # Only display non-empty categories 
       $output_SB .= &Apache::loncommon::start_data_table();
       $output_SB .= &Apache::loncommon::start_data_table_empty_row()
                    .'<td colspan="3">'
                    .'<a name="parmlist_'.$catkey.'" />'
                    .'<h3>'.$parm_cat_names{$catkey}.'</h3>'
                    .'</td>'
                    .&Apache::loncommon::end_data_table_empty_row
                    .&Apache::loncommon::start_data_table_header_row()
                    .'<th>'.$lt{'par'}.'</th><th>'.$lt{'val'}.'</th><th>'.$lt{'set'}.'</th>'
                    .&Apache::loncommon::end_data_table_header_row();
   
       foreach my $parameter (@{$parm_cat_parms{$catkey}}) {
           my $description = $descriptions{$parameter};
           $output_SB .= &parameter_row($parameter, $description);
       }
       # Add special row to custom category
       # Offer possibilty to create a new environment variable
       if ($catkey eq 'cat_custom') {
           my $onchange = 'onFocus="javascript:window.document.forms'
                         .'[\'envform\'].elements[\'newp_setparmval\']'
                         .'.checked=true;"';
           $output_SB .= &Apache::loncommon::start_data_table_row()
                      .'<td>'
                      .'<i>'.&mt('Create New Environment Variable').'</i><br />'
                      .'<input type="text" size="40" name="newp_name" '.$onchange.' />'
                      .'</td><td>'
                      .'<input type="text" size="40" name="newp_value" '.$onchange.' />'
                      .'</td><td>'
                      .'<input type="checkbox" name="newp_setparmval" /></td>'
                      .&Apache::loncommon::end_data_table_row();
       }
       # Add buttons row at end of each category
       $output_SB .= &Apache::loncommon::start_data_table_empty_row()
                    .'<td colspan="3">'
                    .$buttons
                    .'</td>'
                    .&Apache::loncommon::end_data_table_empty_row;
   
       $output_SB .= &Apache::loncommon::end_data_table()
                   . '<br />';
   }
   
   # End: New Version with Parameter Categories
   # ----------------------------------------------------------------
   
   
       }
   
     my ($jscript,$categorize_js);      my ($jscript,$categorize_js);
     my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');      my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');
     if ($can_categorize) {      if ($can_categorize) {
Line 2731  ENDSCRIPT Line 3006  ENDSCRIPT
        $jscript);         $jscript);
     my $end_page =       my $end_page = 
  &Apache::loncommon::end_page();   &Apache::loncommon::end_page();
     my $end_table=&Apache::loncommon::end_data_table();  
     $r->print(<<ENDENV);      $r->print(<<ENDENV);
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
 <form method="post" action="/adm/parmset?action=crsenv" name="envform">  <form method="post" action="/adm/parmset?action=crsenv" name="envform">
 $setoutput  $setoutput
 <div><input type="submit" name="crsenv" value="$lt{'sav'}" /></div>  $output_SB
 $start_table  
 $start_header_row  
 <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}</th>  
 $end_header_row  
 $output  
 $end_table  
 <input type="submit" name="crsenv" value="$lt{'sav'}" />  
 </form>  </form>
 $end_page  $end_page
 ENDENV  ENDENV
Line 3336  ENDOVER Line 3603  ENDOVER
     }      }
 # Menu to select levels, etc  # Menu to select levels, etc
   
     $r->print('<table id="LC_parm_overview_scope">      #$r->print('<table id="LC_parm_overview_scope">
                <tr><td class="LC_parm_overview_level_menu">');      #           <tr><td class="LC_parm_overview_level_menu">');
       $r->print('<div class="LC_ContentBoxSpecial">');
       #$r->print('<h2 class="LC_hcell">Step 1</h2>');
       $r->print('<div class="LC_BoxPadding">' );
       $r->print(&Apache::lonhtmlcommon::start_pick_box());
     &levelmenu($r,\%alllevs,$parmlev);      &levelmenu($r,\%alllevs,$parmlev);
     if ($parmlev ne 'general') {      if ($parmlev ne 'general') {
  $r->print('<td class="LC_parm_overview_map_menu">');   #$r->print('<td class="LC_parm_overview_map_menu">');
  &mapmenu($r,\%allmaps,$pschp,\%maptitles);   &mapmenu($r,\%allmaps,$pschp,\%maptitles);
  $r->print('</td>');   #$r->print('</td>');
     }      }
     $r->print('</td></tr></table>');      $r->print(&Apache::lonhtmlcommon::end_pick_box());
       $r->print('</div></div>');
     $r->print('<table id="LC_parm_overview_controls">      #$r->print('</td></tr></table>');
                <tr><td class="LC_parm_overview_parm_selectors">');        
       #$r->print('<table id="LC_parm_overview_controls">
       #           <tr><td class="LC_parm_overview_parm_selectors">');
       $r->print('<div class="LC_ContentBoxSpecial">');
       $r->print('<div class="LC_BoxPadding">' );
       $r->print(&Apache::lonhtmlcommon::start_pick_box());  
     &parmmenu($r,\%allparms,\@pscat,\%keyorder);      &parmmenu($r,\%allparms,\@pscat,\%keyorder);
     $r->print('</td><td class="LC_parm_overview_restrictions">  
                 <table class="LC_parm_overview_restrictions">'.      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));    
       #$r->print('</td><td class="LC_parm_overview_restrictions">'.
        $r->print('<table>'.
               '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').                '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
               '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');                '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
     &partmenu($r,\%allparts,\@psprt);      &partmenu($r,\%allparts,\@psprt);
Line 3359  ENDOVER Line 3637  ENDOVER
     $r->print('</td><td>');      $r->print('</td><td>');
     &groupmenu($r,\@selected_groups);      &groupmenu($r,\@selected_groups);
     $r->print('</td></tr></table>');      $r->print('</td></tr></table>');
     $r->print('</td></tr></table>');      #$r->print('</td></tr></table>');
        $r->print(&Apache::lonhtmlcommon::end_pick_box());
       $r->print('</div></div>');
   
       $r->print('<div class="LC_ContentBoxSpecial">');
       $r->print('<div class="LC_BoxPadding">' );
     my $sortorder=$env{'form.sortorder'};      my $sortorder=$env{'form.sortorder'};
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder);
       $r->print('</div></div>');
      
     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');      $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
       
 # Build the list data hash from the specified parms  # Build the list data hash from the specified parms
   
     my $listdata;      my $listdata;
Line 4321  ENDINPUTDATE Line 4604  ENDINPUTDATE
  } elsif ($defkeytype{$tempkey} eq 'string_yesno') {   } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
             my $yeschecked='';              my $yeschecked='';
             my $nochecked='';              my $nochecked='';
             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }              if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }              if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
   
     $r->print(<<ENDYESNO);      $r->print(<<ENDYESNO);
 <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />  <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
 <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>  <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
 ENDYESNO  ENDYESNO
         } else {          } else {
     $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');      $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
Line 4571  sub parm_change_log { Line 4854  sub parm_change_log {
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub update_slots {
       my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
       my %slot=&Apache::lonnet::get_slot($slot_name);
       if (!keys(%slot)) {
           return 'error: slot does not exist';
       }
       my $max=$slot{'maxspace'};
       if (!defined($max)) { $max=99999; }
   
       my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
                                          "^$slot_name\0");
       my ($tmp)=%consumed;
       if ($tmp=~/^error: 2 / ) {
           return 'error: unable to determine current slot status';
       }
       my $last=0;
       foreach my $key (keys(%consumed)) {
           my $num=(split('\0',$key))[1];
           if ($num > $last) { $last=$num; }
           if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
               return 'ok';
           }
       }
   
       if (scalar(keys(%consumed)) >= $max) {
           return 'error: no space left in slot';
       }
       my $wanted=$last+1;
   
       my %reservation=('name'      => $uname.':'.$udom,
                        'timestamp' => time,
                        'symb'      => $symb);
   
       my $success=&Apache::lonnet::newput('slot_reservations',
                                           {"$slot_name\0$wanted" =>
                                                \%reservation},
                                           $cdom, $cnum);
       if ($success eq 'ok') {
           my %storehash = (
                             symb    => $symb,
                             slot    => $slot_name,
                             action  => 'reserve',
                             context => 'parameter',
                           );
           &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
                                           '',$uname,$udom,$cnum,$cdom);
   
           &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                           '',$uname,$udom,$uname,$udom);
       }
       return $success;
   }
   
   sub delete_slots {
       my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
       my $delresult;
       my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom,
                                            $cnum, "^$slot_name\0");
       if (&Apache::lonnet::error(%consumed)) {
           return 'error: unable to determine current slot status';
       }
       my ($tmp)=%consumed;
       if ($tmp=~/^error: 2 /) {
           return 'error: unable to determine current slot status';
       }
       foreach my $key (keys(%consumed)) {
           if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
               my $num=(split('\0',$key))[1];
               my $entry = $slot_name.'\0'.$num;
               $delresult = &Apache::lonnet::del('slot_reservations',[$entry],
                                                 $cdom,$cnum);
               if ($delresult eq 'ok') {
                   my %storehash = (
                                     symb    => $symb,
                                     slot    => $slot_name,
                                     action  => 'release',
                                     context => 'parameter',
                                   );
                   &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
                                                   1,$uname,$udom,$cnum,$cdom);
                   &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                                   1,$uname,$udom,$uname,$udom);
               }
           }
       }
       return $delresult;
   }
   
 sub check_for_course_info {  sub check_for_course_info {
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     return 1 if ($navmap);      return 1 if ($navmap);
Line 4600  sub handler { Line 4971  sub handler {
     text=>"Parameter Manager",      text=>"Parameter Manager",
     faq=>10,      faq=>10,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
                                             help => 'Parameter_Manager'});                                              help =>
                                               'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
   
 # ----------------------------------------------------- Needs to be in a course  # ----------------------------------------------------- Needs to be in a course
     my $parm_permission =      my $parm_permission =

Removed from v.1.432  
changed lines
  Added in v.1.445


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