Diff for /loncom/interface/lonparmset.pm between versions 1.277 and 1.313

version 1.277, 2006/03/04 22:17:36 version 1.313, 2006/06/12 23:17:48
Line 63  use Apache::lonhomework; Line 63  use Apache::lonhomework;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
   use Apache::longroup;
   use Apache::lonrss;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 # --- Caches local to lonparmset  # --- Caches local to lonparmset
   
Line 90  Inputs:  $what - a parameter spec (inclu Line 94  Inputs:  $what - a parameter spec (inclu
   
 Returns:  A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels  Returns:  A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels
   
 14 - General Course  14- General Course
 13 - Map or Folder level in course  13- Map or Folder level in course
 12- resource default  12- resource default
 11- map default  11- map default
 10 - resource level in course  10- resource level in course
 9 - General for section  9 - General for section
 8 - Map or Folder level for section  8 - Map or Folder level for section
 7 - resource level in section  7 - resource level in section
Line 117  sub parmval { Line 121  sub parmval {
 sub parmval_by_symb {  sub parmval_by_symb {
     my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;      my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
 # load caches  # load caches
   
     &cacheparmhash();      &cacheparmhash();
   
     my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);      my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
Line 126  sub parmval_by_symb { Line 129  sub parmval_by_symb {
     my @outpar=();      my @outpar=();
 # ----------------------------------------------------- Cascading lookup scheme  # ----------------------------------------------------- Cascading lookup scheme
     my $map=(&Apache::lonnet::decode_symb($symb))[0];          my $map=(&Apache::lonnet::decode_symb($symb))[0];    
       $map = &Apache::lonnet::deversion($map);
   
     my $symbparm=$symb.'.'.$what;      my $symbparm=$symb.'.'.$what;
     my $mapparm=$map.'___(all).'.$what;      my $mapparm=$map.'___(all).'.$what;
Line 394  sub storeparm_by_symb { Line 398  sub storeparm_by_symb {
     return '';      return '';
 }  }
   
   sub log_parmset {
       return &Apache::lonnet::instructor_log('parameterlog',@_);
   }
   
 sub storeparm_by_symb_inner {  sub storeparm_by_symb_inner {
 # ---------------------------------------------------------- Get symb, map, etc  # ---------------------------------------------------------- Get symb, map, etc
     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;      my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
 # ---------------------------------------------------------- Construct prefixes  # ---------------------------------------------------------- Construct prefixes
     $spnam=~s/\_([^\_]+)$/\.$1/;      $spnam=~s/\_([^\_]+)$/\.$1/;
     my $map=(&Apache::lonnet::decode_symb($symb))[0];          my $map=(&Apache::lonnet::decode_symb($symb))[0];    
       $map = &Apache::lonnet::deversion($map);
   
     my $symbparm=$symb.'.'.$spnam;      my $symbparm=$symb.'.'.$spnam;
     my $mapparm=$map.'___(all).'.$spnam;      my $mapparm=$map.'___(all).'.$spnam;
   
Line 450  sub storeparm_by_symb_inner { Line 460  sub storeparm_by_symb_inner {
  if ($delete) {   if ($delete) {
     $reply=&Apache::lonnet::del      $reply=&Apache::lonnet::del
  ('resourcedata',[keys(%storecontent)],$cdom,$cnum);   ('resourcedata',[keys(%storecontent)],$cdom,$cnum);
               &log_parmset(\%storecontent,1);
  } else {   } else {
     $reply=&Apache::lonnet::cput      $reply=&Apache::lonnet::cput
  ('resourcedata',\%storecontent,$cdom,$cnum);   ('resourcedata',\%storecontent,$cdom,$cnum);
       &log_parmset(\%storecontent);
  }   }
  &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);   &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
     } else {      } else {
Line 473  sub storeparm_by_symb_inner { Line 485  sub storeparm_by_symb_inner {
  if ($delete) {   if ($delete) {
     $reply=&Apache::lonnet::del      $reply=&Apache::lonnet::del
  ('resourcedata',[keys(%storecontent)],$udom,$uname);   ('resourcedata',[keys(%storecontent)],$udom,$uname);
       &log_parmset(\%storecontent,1,$uname,$udom);
  } else {   } else {
     $reply=&Apache::lonnet::cput      $reply=&Apache::lonnet::cput
  ('resourcedata',\%storecontent,$udom,$uname);   ('resourcedata',\%storecontent,$udom,$uname);
       &log_parmset(\%storecontent,0,$uname,$udom);
  }   }
  &Apache::lonnet::devalidateuserresdata($uname,$udom);   &Apache::lonnet::devalidateuserresdata($uname,$udom);
     }      }
Line 580  sub plink { Line 594  sub plink {
  &valout($value,$type).'</a></td></tr></table>';   &valout($value,$type).'</a></td></tr></table>';
 }  }
   
 sub startpage {  sub page_js {
     my $r=shift;  
     my $loaditems = qq|onUnload="pclose()" onLoad="group_or_section('cgroup')"|;  
     my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',  
                                             $loaditems);  
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table Mode Parameter Setting');  
     my $selscript=&Apache::loncommon::studentbrowser_javascript();      my $selscript=&Apache::loncommon::studentbrowser_javascript();
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $html=&Apache::lonxml::xmlbegin();  
     $r->print(<<ENDHEAD);      return(<<ENDJS);
 $html  <script type="text/javascript">
 <head>  
 <title>LON-CAPA Course Parameters</title>  
 <script>  
   
     function pclose() {      function pclose() {
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",          parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
Line 635  $html Line 642  $html
     }      }
 </script>  </script>
 $selscript  $selscript
 </head>  ENDJS
 $bodytag  
   }
   sub startpage {
       my ($r) = @_;
   
       my %loaditems = ('onunload' => "pclose()",
        'onload'   => "group_or_section('cgroup')",);
   
       my $start_page = 
    &Apache::loncommon::start_page('Set/Modify Course Parameters',
          &page_js(),
          {'add_entries' => \%loaditems,});
       my $breadcrumbs = 
    &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting');
       $r->print(<<ENDHEAD);
   $start_page
 $breadcrumbs  $breadcrumbs
 <form method="post" action="/adm/parmset?action=settable" name="parmform">  <form method="post" action="/adm/parmset?action=settable" name="parmform">
 <input type="hidden" value='' name="pres_value">  <input type="hidden" value='' name="pres_value" />
 <input type="hidden" value='' name="pres_type">  <input type="hidden" value='' name="pres_type" />
 <input type="hidden" value='' name="pres_marker">  <input type="hidden" value='' name="pres_marker" />
 <input type="hidden" value='1' name="prevvisit">  <input type="hidden" value='1' name="prevvisit" />
 ENDHEAD  ENDHEAD
 }  }
   
Line 1102  sub usermenu { Line 1124  sub usermenu {
     'oi'    => "or ID",      'oi'    => "or ID",
     'ad'    => "at Domain"      'ad'    => "at Domain"
        );         );
     my %sectionhash=();  
     my $sections='';      my $sections='';
     my $numsec = &Apache::loncommon::get_sections(      my %sectionhash = &Apache::loncommon::get_sections();
                  $env{'course.'.$env{'request.course.id'}.'.domain'},  
                  $env{'course.'.$env{'request.course.id'}.'.num'},  
  \%sectionhash);  
     my $groups;      my $groups;
     my %grouphash;      my %grouphash = &Apache::longroup::coursegroups();
     my $numgrp = &Apache::loncommon::coursegroups(  
                  \%grouphash,      if (%sectionhash) {
                  $env{'course.'.$env{'request.course.id'}.'.domain'},  
                  $env{'course.'.$env{'request.course.id'}.'.num'});  
     if ($numsec > 0) {  
         $sections=$lt{'se'}.': <select name="csec"';          $sections=$lt{'se'}.': <select name="csec"';
         if ($numsec && $numgrp && $parmlev ne 'full') {          if (%grouphash && $parmlev ne 'full') {
             $sections .= qq| onchange="group_or_section('csec')" |;              $sections .= qq| onchange="group_or_section('csec')" |;
         }          }
         $sections .= '>';          $sections .= '>';
Line 1127  sub usermenu { Line 1143  sub usermenu {
         }          }
         $sections.='</select>';          $sections.='</select>';
     }      }
     if ($numsec && $numgrp && $parmlev ne 'full') {      if (%sectionhash && %grouphash && $parmlev ne 'full') {
         $sections .= '&nbsp;or&nbsp;';          $sections .= '&nbsp;or&nbsp;';
         $sections .= qq|          $sections .= qq|
 <script type="text/javascript">  <script type="text/javascript">
Line 1153  function group_or_section(caller) { Line 1169  function group_or_section(caller) {
 </script>  </script>
 |;  |;
     }       } 
     if ($numgrp > 0) {  
       if (%grouphash) {
         $groups=$lt{'gr'}.': <select name="cgroup"';          $groups=$lt{'gr'}.': <select name="cgroup"';
         if ($numsec && $numgrp && $env{'form.action'} eq 'settable') {          if (%sectionhash && $env{'form.action'} eq 'settable') {
             $groups .= qq| onchange="group_or_section('cgroup')" |;              $groups .= qq| onchange="group_or_section('cgroup')" |;
         }          }
         $groups .= '>';          $groups .= '>';
Line 1232  sub levelmenu { Line 1249  sub levelmenu {
   
 sub sectionmenu {  sub sectionmenu {
     my ($r,$selectedsections)=@_;      my ($r,$selectedsections)=@_;
     my %sectionhash=();      my %sectionhash = &Apache::loncommon::get_sections();
     my $sections='';      return if (!%sectionhash);
     my $numsec = &Apache::loncommon::get_sections(  
                  $env{'course.'.$env{'request.course.id'}.'.domain'},      $r->print('<select name="Section" multiple="true" size="8" >');
                  $env{'course.'.$env{'request.course.id'}.'.num'},      foreach my $s ('all',sort keys %sectionhash) {
  \%sectionhash);   $r->print('    <option value="'.$s.'"');
     if ($numsec) {   foreach (@{$selectedsections}) {
  $r->print('<select name="Section" multiple="true" size="8" >');      if ($s eq $_) {
  foreach my $s ('all',sort keys %sectionhash) {   $r->print(' selected');
     $r->print('    <option value="'.$s.'"');   last;
     foreach (@{$selectedsections}) {  
  if ($s eq $_) {  
     $r->print(' selected');  
     last;  
  }  
     }      }
     $r->print('>'.$s."</option>\n");  
  }   }
         $r->print("</select>\n");   $r->print('>'.$s."</option>\n");
    }      }
       $r->print("</select>\n");
 }  }
   
 sub groupmenu {  sub groupmenu {
     my ($r,$selectedgroups)=@_;      my ($r,$selectedgroups)=@_;
     my %grouphash;      my %grouphash = &Apache::longroup::coursegroups();
     my $numgrp = &Apache::loncommon::coursegroups(      return if (!%grouphash);
                  \%grouphash,  
                  $env{'course.'.$env{'request.course.id'}.'.domain'},      $r->print('<select name="Group" multiple="true" size="8" >');
                  $env{'course.'.$env{'request.course.id'}.'.num'});      foreach my $group (sort(keys(%grouphash))) {
     if ($numgrp) {   $r->print('    <option value="'.$group.'"');
         $r->print('<select name="Group" multiple="true" size="8" >');   foreach (@{$selectedgroups}) {
         foreach my $group (sort(keys(%grouphash))) {      if ($group eq $_) {
             $r->print('    <option value="'.$group.'"');   $r->print(' selected');
             foreach (@{$selectedgroups}) {   last;
                 if ($group eq $_) {      }
                     $r->print(' selected');   }
                     last;   $r->print('>'.$group."</option>\n");
                 }  
             }  
             $r->print('>'.$group."</option>\n");  
         }  
         $r->print("</select>\n");  
     }      }
       $r->print("</select>\n");
 }  }
   
   
Line 1399  sub assessparms { Line 1407  sub assessparms {
     my $uhome;      my $uhome;
     my $csec;      my $csec;
     my $cgroup;      my $cgroup;
     my $grouplist;  
     my @usersgroups = ();      my @usersgroups = ();
     
     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};      my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
Line 1505  sub assessparms { Line 1512  sub assessparms {
  .$name{'lastname'}.' '.$name{'generation'}.   .$name{'lastname'}.' '.$name{'generation'}.
     "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';      "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
     }      }
             $grouplist = &Apache::lonnet::get_users_groups(              @usersgroups = &Apache::lonnet::get_users_groups(
                                        $udom,$uname,$env{'request.course.id'});                                         $udom,$uname,$env{'request.course.id'});
             if ($grouplist) {              if (@usersgroups > 0) {
                 @usersgroups = &Apache::lonnet::sort_course_groups($grouplist,                  unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
                                                     $env{'request.course.id'});  
                 unless (grep/^\Q$cgroup\E$/,@usersgroups) {  
                     $cgroup = $usersgroups[0];                      $cgroup = $usersgroups[0];
                 }                   }
             } else {  
                 $cgroup = '';  
             }              }
         }          }
     }      }
Line 1570  sub assessparms { Line 1573  sub assessparms {
  &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);
         $r->print(&mt('Specific Resource').": ".$resource.   my $title = &Apache::lonnet::gettitle($pssymb);
                   '<input type="hidden" value="'.$pssymb.'" name="symb">'.          $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
                     '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
   '<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 />');
     }      }
Line 1731  ENDTABLEHEADFOUR Line 1735  ENDTABLEHEADFOUR
                              '</font></tt><p><b>'.                               '</font></tt><p><b>'.
                              "<a href=\"javascript:openWindow('".                               "<a href=\"javascript:openWindow('".
   &Apache::lonnet::clutter($uri).'?symb='.    &Apache::lonnet::clutter($uri).'?symb='.
   &Apache::lonnet::escape($symbp{$rid}).    &escape($symbp{$rid}).
                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".                               "', 'metadatafile', '450', '500', 'no', 'yes')\";".
                              " TARGET=_self>$title");                               " TARGET=_self>$title");
   
Line 1930  ENDMAPONE Line 1934  ENDMAPONE
             }              }
                           
             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};              if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$csec</i></font>\n")};              if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
             $r->print("</h4>\n");              $r->print("</h4>\n");
 #---------------------------------------------------------------- print table  #---------------------------------------------------------------- print table
             $r->print('<p><table border="2">');              $r->print('<p><table border="2">');
Line 1947  ENDMAPONE Line 1951  ENDMAPONE
             $r->print("</table></center>");              $r->print("</table></center>");
         } # end of $parmlev eq general          } # end of $parmlev eq general
     }      }
     $r->print('</form></body></html>');      $r->print('</form>'.&Apache::loncommon::end_page());
 } # end sub assessparms  } # end sub assessparms
   
   
Line 1972  Returns: nothing Line 1976  Returns: nothing
 sub crsenv {  sub crsenv {
     my $r=shift;      my $r=shift;
     my $setoutput='';      my $setoutput='';
     my $bodytag=&Apache::loncommon::bodytag(  
                              'Set Course Environment Parameters');      my $breadcrumbs = 
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,   &Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
     'Edit Course Environment');  
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
   
Line 2078  sub crsenv { Line 2081  sub crsenv {
     }      }
 # ------------------------- 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'},
          {'freshen_cache' => 1});
   
 # -------------------------------------------------------- Get parameters again  # -------------------------------------------------------- Get parameters again
   
Line 2191  sub crsenv { Line 2195  sub crsenv {
              'disable_receipt_display'               'disable_receipt_display'
                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.                   => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',                      ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
        'task_messages'
            => '<b>'.&mt('Send message to student when clicking Done on Tasks. [_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','<tt>only_student</tt>','<tt>student_and_user_notes_screen</tt>').'</b>',
      'disablesigfigs'       'disablesigfigs'
          => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.           => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',                      ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
      'disableexampointprint'       'disableexampointprint'
          => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.           => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',                      ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
                'externalsyllabus'
                    => '<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>'
              );                ); 
         my @Display_Order = ('url','description','courseid','cloners','grading',          my @Display_Order = ('url','description','courseid','cloners','grading',
                                'externalsyllabus',
                              'default_xml_style','pageseparators',                               'default_xml_style','pageseparators',
                              'question.email','comment.email','policy.email',                               'question.email','comment.email','policy.email',
                              'student_classlist_view',                               'student_classlist_view',
Line 2224  sub crsenv { Line 2233  sub crsenv {
                              'default_enrollment_end_date',                               'default_enrollment_end_date',
      'tthoptions',       'tthoptions',
      'disablesigfigs',       'disablesigfigs',
      'disableexampointprint'       'disableexampointprint',
        'task_messages'
                              );                               );
  foreach my $parameter (sort(keys(%values))) {   foreach my $parameter (sort(keys(%values))) {
             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {              unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
Line 2279  sub crsenv { Line 2289  sub crsenv {
     my $Parameter=&mt('Parameter');      my $Parameter=&mt('Parameter');
     my $Value=&mt('Value');      my $Value=&mt('Value');
     my $Set=&mt('Set');      my $Set=&mt('Set');
     my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');      my $browse_js=
     my $html=&Apache::lonxml::xmlbegin();   '<script type="text/javascript" language="Javascript">'.
     $r->print(<<ENDenv);   &Apache::loncommon::browser_and_searcher_javascript('parmset').
 $html   '</script>';
 <head>      
 <script type="text/javascript" language="Javascript" >      my $start_page = 
 $browse_js   &Apache::loncommon::start_page('Set Course Environment Parameters',
 </script>         $browse_js);
 <title>LON-CAPA Course Environment</title>      my $end_page = 
 </head>   &Apache::loncommon::end_page();
 $bodytag      $r->print(<<ENDENV);
   $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
Line 2300  $output Line 2311  $output
 </table>  </table>
 <input type="submit" name="crsenv" value="$lt{'sce'}">  <input type="submit" name="crsenv" value="$lt{'sce'}">
 </form>  </form>
 </body>  $end_page
 </html>      ENDENV
 ENDenv  
 }  }
 ##################################################  ##################################################
 # Overview mode  # Overview mode
Line 2314  sub tablestart { Line 2324  sub tablestart {
  return '';   return '';
     } else {      } else {
  $tableopen=1;   $tableopen=1;
  return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.   return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
     &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';      &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
     }      }
 }  }
Line 2322  sub tablestart { Line 2332  sub tablestart {
 sub tableend {  sub tableend {
     if ($tableopen) {      if ($tableopen) {
  $tableopen=0;   $tableopen=0;
  return '</table>';   return &Apache::loncommon::end_data_table();
     } else {      } else {
  return'';   return'';
     }      }
Line 2381  sub storedata { Line 2391  sub storedata {
  if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,   if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
  $tkey.'.type' => $typeof},   $tkey.'.type' => $typeof},
  $tudom,$tuname) eq 'ok') {   $tudom,$tuname) eq 'ok') {
       &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
     $r->print('<br />'.&mt('Stored modified parameter for').' '.      $r->print('<br />'.&mt('Stored modified parameter for').' '.
       &Apache::loncommon::plainname($tuname,$tudom));        &Apache::loncommon::plainname($tuname,$tudom));
  } else {   } else {
Line 2396  sub storedata { Line 2407  sub storedata {
     } elsif ($cmd eq 'del') {      } elsif ($cmd eq 'del') {
  if ($tuname) {   if ($tuname) {
     if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {      if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
       &log_parmset({$tkey=>''},1,$tuname,$tudom);
  $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));   $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
     } else {      } else {
  $r->print('<h2><font color="red">'.   $r->print('<h2><font color="red">'.
Line 2413  sub storedata { Line 2425  sub storedata {
  if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,   if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
  $tkey.'.type' => $typeof},   $tkey.'.type' => $typeof},
  $tudom,$tuname) eq 'ok') {   $tudom,$tuname) eq 'ok') {
       &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
     $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));      $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
  } else {   } else {
     $r->print('<h2><font color="red">'.      $r->print('<h2><font color="red">'.
Line 2433  sub storedata { Line 2446  sub storedata {
     my $putentries=$#newdatakeys+1;      my $putentries=$#newdatakeys+1;
     if ($delentries) {      if ($delentries) {
  if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {   if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
       my %loghash=map { $_ => '' } @deldata;
       &log_parmset(\%loghash,1);
     $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));      $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
  } else {   } else {
     $r->print('<h2><font color="red">'.      $r->print('<h2><font color="red">'.
Line 2442  sub storedata { Line 2457  sub storedata {
     }      }
     if ($putentries) {      if ($putentries) {
  if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {   if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
       &log_parmset(\%newdata,0);
     $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');      $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
  } else {   } else {
     $r->print('<h2><font color="red">'.      $r->print('<h2><font color="red">'.
Line 2567  sub listdata { Line 2583  sub listdata {
 #  #
 # Ready to print  # Ready to print
 #  #
     $r->print(&tablestart().'<tr><td><b>'.$name.      $r->print(&tablestart().
       ':</b></td><td><input type="checkbox" name="del_'.        &Apache::loncommon::start_data_table_row().
         '<td><b>'.&standard_parameter_names($name).
         '</b></td><td><input type="checkbox" name="del_'.
       $thiskey.'" /></td><td>');        $thiskey.'" /></td><td>');
     $foundkeys++;      $foundkeys++;
     if (&isdateparm($thistype)) {      if (&isdateparm($thistype)) {
Line 2613  sub listdata { Line 2631  sub listdata {
     }      }
     $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.      $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
       $thistype.'">');        $thistype.'">');
     $r->print('</td></tr>');      $r->print('</td>'.&Apache::loncommon::end_data_table_row());
  }   }
     }      }
     return $foundkeys;      return $foundkeys;
 }  }
   
 sub newoverview {  sub newoverview {
     my $r=shift;      my ($r) = @_;
     my $bodytag=&Apache::loncommon::bodytag('Set Parameters');  
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');      my $start_page = &Apache::loncommon::start_page('Set Parameters');
     my $html=&Apache::lonxml::xmlbegin();      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print(<<ENDOVER);      $r->print(<<ENDOVER);
 $html  $start_page
 <head>  
 <title>LON-CAPA Parameters</title>  
 </head>  
 $bodytag  
 $breadcrumbs  $breadcrumbs
 <form method="post" action="/adm/parmset?action=newoverview" name="parmform">  <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
 ENDOVER  ENDOVER
Line 2739  ENDOVER Line 2753  ENDOVER
     }      }
     $r->print(&tableend().      $r->print(&tableend().
      ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').       ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
       '</form></body></html>');        '</form>'.&Apache::loncommon::end_page());
 }  }
   
 sub secgroup_lister {  sub secgroup_lister {
Line 2778  sub secgroup_lister { Line 2792  sub secgroup_lister {
 }  }
   
 sub overview {  sub overview {
     my $r=shift;      my ($r) = @_;
     my $bodytag=&Apache::loncommon::bodytag('Modify Parameters');  
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');  
     my $html=&Apache::lonxml::xmlbegin();      my $start_page=&Apache::loncommon::start_page('Modify Parameters');
       my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print(<<ENDOVER);      $r->print(<<ENDOVER);
 $html  $start_page
 <head>  
 <title>LON-CAPA Parameters</title>  
 </head>  
 $bodytag  
 $breadcrumbs  $breadcrumbs
 <form method="post" action="/adm/parmset?action=setoverview" name="parmform">  <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
 ENDOVER  ENDOVER
Line 2811  ENDOVER Line 2821  ENDOVER
     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);      my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
   
     $r->print(&tableend().'<p>'.      $r->print(&tableend().'<p>'.
  ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form></body></html>');   ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
         &Apache::loncommon::end_page());
 }  }
   
 ##################################################  ##################################################
Line 2960  Output html header for page Line 2971  Output html header for page
 ##################################################  ##################################################
 ##################################################  ##################################################
 sub header {  sub header {
     my $html=&Apache::lonxml::xmlbegin();      return &Apache::loncommon::start_page('Parameter Manager');
     my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');  
     my $title = &mt('LON-CAPA Parameter Manager');  
     return(<<ENDHEAD);  
 $html  
 <head>  
 <title>$title</title>  
 </head>  
 $bodytag  
 ENDHEAD  
 }  }
 ##################################################  ##################################################
 ##################################################  ##################################################
Line 3021  ENDMAINFORMHEAD Line 3023  ENDMAINFORMHEAD
           { text => 'Set Parameter Setting Default Actions',            { text => 'Set Parameter Setting Default Actions',
             action => 'setdefaults',              action => 'setdefaults',
             permission => $parm_permission,              permission => $parm_permission,
               },          
     { text => 'Parameter Change Log and Course Blog Posting/User Notification',
               action => 'parameterchangelog',
               permission => $parm_permission,
             },              },
           );            );
     my $menu_html = '';      my $menu_html = '';
Line 3079  sub setrestrictmeta { Line 3085  sub setrestrictmeta {
     my $output;      my $output;
     my $item_num;      my $item_num;
     my $put_result;      my $put_result;
     $r->print(&Apache::lonxml::xmlbegin());      
     $r->print('<head>      $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
             <title>LON-CAPA Restrict Metadata</title>      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
             </head>');  
     $r->print(&Apache::loncommon::bodytag('Restrict Metadata'));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,  
     'Restrict Metadata'));  
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};      my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
Line 3116  sub setrestrictmeta { Line 3118  sub setrestrictmeta {
             }              }
         }          }
     }      }
     &Apache::lonnet::coursedescription($env{'request.course.id'});      &Apache::lonnet::coursedescription($env{'request.course.id'},
          {'freshen_cache' => 1});
     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');      my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
     foreach my $field (sort(keys(%metadata_fields))) {      foreach my $field (sort(keys(%metadata_fields))) {
         &Apache::lonnet::logthis ($field);          &Apache::lonnet::logthis ($field);
Line 3131  sub setrestrictmeta { Line 3134  sub setrestrictmeta {
         <input type="submit" name="restrictmeta" value="Update Metadata Restrictions">          <input type="submit" name="restrictmeta" value="Update Metadata Restrictions">
         </form>          </form>
 ENDenv  ENDenv
     $r->print('</body>      $r->print(&Apache::loncommon::end_page());
                 </html>');  
     return 'ok';      return 'ok';
 }  }
 ##################################################  ##################################################
   
 sub defaultsetter {  sub defaultsetter {
     my $r=shift;      my ($r) = @_;
     my $bodytag=&Apache::loncommon::bodytag('Parameter Setting Default Actions');  
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $start_page = 
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};   &Apache::loncommon::start_page('Parameter Setting Default Actions');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Defaults');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
     my $html=&Apache::lonxml::xmlbegin();  
     $r->print(<<ENDDEFHEAD);      $r->print(<<ENDDEFHEAD);
 $html  $start_page
 <head>  
 <title>LON-CAPA Parameters</title>  
 </head>  
 $bodytag  
 $breadcrumbs  $breadcrumbs
 <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">  <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
 ENDDEFHEAD  ENDDEFHEAD
   
       my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my @ids=();      my @ids=();
     my %typep=();      my %typep=();
     my %keyp=();      my %keyp=();
Line 3289  ENDYESNO Line 3289  ENDYESNO
         $r->print('</td></tr>');          $r->print('</td></tr>');
     }      }
     $r->print("</table>\n<input type='submit' name='storerules' value='".      $r->print("</table>\n<input type='submit' name='storerules' value='".
       &mt('Store Rules')."' /></form>\n</body>\n</html>");        &mt('Store Rules')."' /></form>\n".
         &Apache::loncommon::end_page());
     return;      return;
 }  }
   
   sub components {
       my ($key,$uname,$udom,$exeuser,$exedomain)=@_;
       my $typeflag=0;
       if ($key=~/\.type$/) {
    $key=~s/\.type$//;
           $typeflag=1;
       }
       my $issection;
       my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
       my $section=&mt('All Students');
       if ($middle=~/^\[(.*)\]/) {
    $issection=$1;
    $section=&mt('Group/Section').': '.$issection;
    $middle=~s/^\[(.*)\]//;
       }
       $middle=~s/\.+$//;
       $middle=~s/^\.+//;
       if ($uname) {
    $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
    $issection='';
       }
       my $realm='<font color="red">'.&mt('All Resources').'</font>';
       my $realmdescription=&mt('all resources'); 
       if ($middle=~/^(.+)\_\_\_\(all\)$/) {
    $realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
     $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
      } elsif ($middle) {
    my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
    $realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
    $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
       }
       my $what=$part.'.'.$name;
       return ($realm,$section,$name,$part,$typeflag,
       $what,$middle,$uname,$udom,$issection,$realmdescription);
   }
   
   sub standard_parameter_names {
       my ($name)=@_;
       my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date',
      'answerdate' => 'Answer Date',
      'opendate' => 'Open Date',
      'maxtries' => 'Max. Number of Tries',
      'weight' => 'Weight',
      'date_start' => 'Starting Date',
      'date_end' => 'Ending Date',
                                                      'interval' => 'Time Interval Length',
                                                      'tol' => 'Numerical Tolerance',
                                                      'sig' => 'Significant Digits',
                                                      'contentopen' => 'Content Opening Date',
                                                      'contentclose' => 'Content Closing Date',
                                                      'discussend' => 'End of Discussion Time',
                                                      'discusshide' => 'Discussion Hidden',
                                                      'problemstatus' => 'Problem Status Visible',
      'int_pos' => 'Positive Integer',
      'int_zero_pos' => 'Positive Integer or Zero',
      'hinttries' => 'Number of Tries till Hints appear',
                                                      'numbubbles' => 'Number of Bubbles in Exam Mode');
       if ($standard_parms{$name}) {
    return $standard_parms{$name}; 
       } else { 
    return $name; 
       }
   }
   
   #
   # Parameter Change Log
   #
   
   
   sub parm_change_log {
       my ($r)=@_;
       &startpage($r);
       my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
         $env{'course.'.$env{'request.course.id'}.'.domain'},
         $env{'course.'.$env{'request.course.id'}.'.num'});
   
       if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
   
       $r->print('<form action="/adm/parmset?action=settable"
                        method="post" name"parameterlog">
                  <input type="hidden" name="action"
                         value="parameterchangelog" />');
       
       my %saveable_parameters = ('show' => 'scalar',);
       &Apache::loncommon::store_course_settings('parameter_log',
                                                 \%saveable_parameters);
       &Apache::loncommon::restore_course_settings('parameter_log',
                                                   \%saveable_parameters);
       if (!$env{'form.show'}) { $env{'form.show'}=10; }
   
       my $countselect =
    &Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
       (&mt('all'),10,20,50,100,1000,10000));
   
       $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
         '<input type="submit" value="'.&mt('Display').'" />');
   
       my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
        $env{'course.'.$env{'request.course.id'}.'.domain'});
       $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
         &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
         &Apache::loncommon::end_data_table_header_row());
       my $shown=0;
       foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
           my @changes=keys(%{$parmlog{$id}{'logentry'}});
    my $count=$#changes+1;
    my $time =
       &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
    my $plainname = 
       &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
     $parmlog{$id}{'exe_udom'});
    my $about_me_link = 
       &Apache::loncommon::aboutmewrapper($plainname,
          $parmlog{$id}{'exe_uname'},
          $parmlog{$id}{'exe_udom'});
    my $send_msg_link='';
    if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
        || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
       $send_msg_link ='<br />'.
    &Apache::loncommon::messagewrapper(&mt('Send message'),
      $parmlog{$id}{'exe_uname'},
      $parmlog{$id}{'exe_udom'});
    }
    my $row_start=&Apache::loncommon::start_data_table_row();
    $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
                          <td rowspan="'.$count.'">'.$about_me_link.
     '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
             ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
     $send_msg_link.'</td>');
    my $makenewrow=0;
    my %istype=();
    foreach my $changed (reverse(sort(@changes))) {
               my $value=$parmlog{$id}{'logentry'}->{$changed};
               my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)=
    &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
       if ($typeflag) { $istype{$parmname}=$value; }
       if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; }
       $r->print('<td>'.$realm.'</td><td>'.$section.'</td><td>'.
         &standard_parameter_names($parmname).'</td><td>'.
         ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>');
       my $stillactive=0;
       if ($parmlog{$id}{'deleteflag'}) {
    $r->print(&mt('Deleted'));
       } else {
    if ($typeflag) {
       $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
    } else {
       my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
         $uname,$udom,$issection,$issection,$courseopt);
       if (&isdateparm($istype{$parmname})) {
    $r->print(&Apache::lonlocal::locallocaltime($value));
       } else {
    $r->print($value);
       }
       if ($value ne $all[$level]) {
    $r->print('<br /><font color="red">'.&mt('Not active anymore').'</font>');
       } else {
    $stillactive=1;
       }
    }
       }
       $r->print('</td>');
       if ($stillactive) {
    my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
                   my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
       (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
    if (($uname) && ($udom)) {
       $r->print('<td>'.
         &Apache::loncommon::messagewrapper('Notify User',$uname,$udom,$title,$description).
         '</td>');
    } else {
       $r->print('<td>'.
         &Apache::lonrss::course_blog_link($id,$title,$description).
         '</td>');
    }
       } else {
    $r->print('<td>&nbsp;</td>');
       }
       $r->print(&Apache::loncommon::end_data_table_row());
    }
    $shown++;
    if (!($env{'form.show'} eq &mt('all') 
         || $shown<=$env{'form.show'})) { last; }
       }
       $r->print(&Apache::loncommon::end_data_table());
       $r->print('</form>');
       $r->print(&Apache::loncommon::end_page());
   }
   
 ##################################################  ##################################################
 ##################################################  ##################################################
   
Line 3357  sub handler { Line 3548  sub handler {
   
         } elsif (! exists($env{'form.action'})) {          } elsif (! exists($env{'form.action'})) {
             $r->print(&header());              $r->print(&header());
             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
  'Parameter Manager'));  
             &print_main_menu($r,$parm_permission);              &print_main_menu($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {          } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',              &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
Line 3385  sub handler { Line 3575  sub handler {
     text=>"Table Mode",      text=>"Table Mode",
     help => 'Course_Setting_Parameters'});      help => 'Course_Setting_Parameters'});
     &assessparms($r);      &assessparms($r);
         }          } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                       &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
       text=>"Parameter Change Log"});
       &parm_change_log($r);
    }       
     } else {      } else {
 # ----------------------------- Not in a course, or not allowed to modify parms  # ----------------------------- Not in a course, or not allowed to modify parms
  $env{'user.error.msg'}=   $env{'user.error.msg'}=

Removed from v.1.277  
changed lines
  Added in v.1.313


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