Diff for /loncom/interface/lonparmset.pm between versions 1.522.2.31 and 1.559

version 1.522.2.31, 2024/07/03 04:06:27 version 1.559, 2016/05/13 22:48:05
Line 36  lonparmset - Handler to set parameters f Line 36  lonparmset - Handler to set parameters f
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 lonparmset provides an interface to setting content parameters in a   lonparmset provides an interface to setting course parameters. 
 course.  
   
 =head1 DESCRIPTION  =head1 DESCRIPTION
   
Line 55  Inputs:  $what - a parameter spec (inclu Line 54  Inputs:  $what - a parameter spec (inclu
          $id   - a bighash Id number           $id   - a bighash Id number
          $def  - the resource's default value   'stupid emacs           $def  - the resource's default value   'stupid emacs
   
 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 values that is the active one, the list consists of parm values at the 18 possible levels
   
 14- General Course  18 - General Course
 13- Map or Folder level in course  17 - Map or Folder level in course (recursive) 
 12- resource default  16 - Map or Folder level in course (non-recursive)
 11- map default  15 - resource default
 10- resource level in course  14 - map default
 9 - General for section  13 - resource level in course
 8 - Map or Folder level for section  12 - General for section
 7 - resource level in section  11 - Map or Folder level for section (recursive)
 6 - General for group  10 - Map or Folder level for section (non-recursive)
 5 - Map or Folder level for group  9 - resource level in section
 4 - resource level in group  8 - General for group
 3 - General for specific student  7 - Map or Folder level for group (recursive)
 2 - Map or Folder level for specific student  6 - Map or Folder level for group (non-recursive)
   5 - resource level in group
   4 - General for specific student
   3 - Map or Folder level for specific student (recursive)
   2 - Map or Folder level for specific student (non-recursive)
 1 - resource level for specific student  1 - resource level for specific student
   
 =item parmval_by_symb()  =item parmval_by_symb()
Line 130  javascript function 'pjump'. Line 133  javascript function 'pjump'.
   
 =item print_td()  =item print_td()
   
 =item check_other_groups()  =item print_usergroups()
   
 =item parm_control_group()  =item parm_control_group()
   
Line 150  Input: See list below Line 153  Input: See list below
   
 =back  =back
   
 Outputs: See list below  Outputs: See list below:
   
 =over 4  =over 4
   
Line 321  use Apache::lonnavmaps; Line 324  use Apache::lonnavmaps;
 use Apache::longroup;  use Apache::longroup;
 use Apache::lonrss;  use Apache::lonrss;
 use HTML::Entities;  use HTML::Entities;
 use Text::Wrap();  
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   
   sub startSettingsScreen {
       my ($r,$mode,$crstype)=@_;
   
       my $tabtext = &mt('Course Settings');
       if ($crstype eq 'Community') {
           $tabtext = &mt('Community Settings');
       } 
       $r->print("\n".'<ul class="LC_TabContentBigger" id="main">');
       $r->print("\n".'<li'.($mode eq 'coursepref'?' class="active"':'').'><a href="/adm/courseprefs"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                             $tabtext.
                                             '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
   
       $r->print("\n".'<li'.($mode eq 'parmset'?' class="active"':'').' id="tabbededitor"><a href="/adm/parmset"><b>'.
                                                                    &mt('Content and Problem Settings').'</b></a></li>');
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;" id="parameditor"><div id="maincoursedoc" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">');
   }
   
   sub endSettingsScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
   
   
   
 sub parmval {  sub parmval {
     my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;      my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,      return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
Line 346  sub parmval_by_symb { Line 373  sub parmval_by_symb {
     $map = &Apache::lonnet::deversion($map);      $map = &Apache::lonnet::deversion($map);
   
     my $symbparm=$symb.'.'.$what;      my $symbparm=$symb.'.'.$what;
       my $recurseparm=$map.'___(rec).'.$what; 
     my $mapparm=$map.'___(all).'.$what;      my $mapparm=$map.'___(all).'.$what;
   
     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;      my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;      my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
       my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm;
     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;      my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
   
     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;      my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;      my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
       my $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm;
     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;      my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
   
     my $courselevel=$env{'request.course.id'}.'.'.$what;      my $courselevel=$env{'request.course.id'}.'.'.$what;
     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;      my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
       my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm;
     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;      my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
   
   
 # --------------------------------------------------------- first, check course  # --------------------------------------------------------- first, check course
   
     if (defined($$courseopt{$courselevel})) {      if (defined($$courseopt{$courselevel})) {
     $outpar[14]=$$courseopt{$courselevel};          $outpar[18]=$$courseopt{$courselevel};
     $result=14;          $result=18;
       }
   
       if (defined($$courseopt{$courseleveli})) {
           $outpar[17]=$$courseopt{$courseleveli};
           $result=17;
     }      }
   
     if (defined($$courseopt{$courselevelm})) {      if (defined($$courseopt{$courselevelm})) {
     $outpar[13]=$$courseopt{$courselevelm};          $outpar[16]=$$courseopt{$courselevelm};
     $result=13;          $result=16;
     }      }
   
 # ------------------------------------------------------- second, check default  # ------------------------------------------------------- second, check default
   
     if (defined($def)) { $outpar[12]=$def; $result=12; }      if (defined($def)) { $outpar[15]=$def; $result=15; }
   
 # ------------------------------------------------------ third, check map parms  # ------------------------------------------------------ third, check map parms
   
       
     my $thisparm=&parmhash($symbparm);      my $thisparm=&parmhash($symbparm);
     if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }      if (defined($thisparm)) { $outpar[14]=$thisparm; $result=14; }
   
     if (defined($$courseopt{$courselevelr})) {      if (defined($$courseopt{$courselevelr})) {
     $outpar[10]=$$courseopt{$courselevelr};          $outpar[13]=$$courseopt{$courselevelr};
     $result=10;          $result=13;
     }      }
   
 # ------------------------------------------------------ fourth, back to course  # ------------------------------------------------------ fourth, back to course
     if ($csec ne '') {      if ($csec ne '') {
         if (defined($$courseopt{$seclevel})) {          if (defined($$courseopt{$seclevel})) {
         $outpar[9]=$$courseopt{$seclevel};              $outpar[12]=$$courseopt{$seclevel};
         $result=9;              $result=12;
     }          }
           if (defined($$courseopt{$secleveli})) {
               $outpar[11]=$$courseopt{$secleveli};
               $result=11;
           }
         if (defined($$courseopt{$seclevelm})) {          if (defined($$courseopt{$seclevelm})) {
         $outpar[8]=$$courseopt{$seclevelm};              $outpar[10]=$$courseopt{$seclevelm};
         $result=8;              $result=10;
     }          }
   
         if (defined($$courseopt{$seclevelr})) {          if (defined($$courseopt{$seclevelr})) {
         $outpar[7]=$$courseopt{$seclevelr};              $outpar[9]=$$courseopt{$seclevelr};
         $result=7;              $result=9;
     }          }
     }      }
 # ------------------------------------------------------ fifth, check course group  # ------------------------------------------------------ fifth, check course group
     if ($cgroup ne '') {      if ($cgroup ne '') {
         if (defined($$courseopt{$grplevel})) {          if (defined($$courseopt{$grplevel})) {
             $outpar[6]=$$courseopt{$grplevel};              $outpar[8]=$$courseopt{$grplevel};
             $result=6;              $result=8;
           }
           if (defined($$courseopt{$grpleveli})) {
               $outpar[7]=$$courseopt{$grpleveli};
               $result=7;
         }          }
         if (defined($$courseopt{$grplevelm})) {          if (defined($$courseopt{$grplevelm})) {
             $outpar[5]=$$courseopt{$grplevelm};              $outpar[6]=$$courseopt{$grplevelm};
             $result=5;              $result=6;
         }          }
         if (defined($$courseopt{$grplevelr})) {          if (defined($$courseopt{$grplevelr})) {
             $outpar[4]=$$courseopt{$grplevelr};              $outpar[5]=$$courseopt{$grplevelr};
             $result=4;              $result=5;
         }          }
     }      }
   
 # ---------------------------------------------------------- fifth, check user  # ---------------------------------------------------------- sixth, check user
   
     if ($uname ne '') {      if ($uname ne '') {
     if (defined($$useropt{$courselevel})) {      if (defined($$useropt{$courselevel})) {
         $outpar[3]=$$useropt{$courselevel};          $outpar[4]=$$useropt{$courselevel};
           $result=4;
       }
   
       if (defined($$useropt{$courseleveli})) {
           $outpar[3]=$$useropt{$courseleveli};
         $result=3;          $result=3;
     }      }
   
Line 663  sub storeparm_by_symb_inner { Line 712  sub storeparm_by_symb_inner {
     $map = &Apache::lonnet::deversion($map);      $map = &Apache::lonnet::deversion($map);
   
     my $symbparm=$symb.'.'.$spnam;      my $symbparm=$symb.'.'.$spnam;
       my $recurseparm=$map.'___(rec).'.$spnam;
     my $mapparm=$map.'___(all).'.$spnam;      my $mapparm=$map.'___(all).'.$spnam;
   
     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;      my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;      my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
       my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm;
     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;      my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
   
     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;      my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;      my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
       my $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm;
     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;      my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
   
     my $courselevel=$env{'request.course.id'}.'.'.$spnam;      my $courselevel=$env{'request.course.id'}.'.'.$spnam;
     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;      my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
       my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm;
     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;      my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
   
     my $storeunder='';      my $storeunder='';
     if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }      if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }
     if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }      if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; } 
     if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; }      if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; }
     if ($snum==9) { $storeunder=$seclevel; }      if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }
     if ($snum==8) { $storeunder=$seclevelm; }      if ($snum==12) { $storeunder=$seclevel; }
     if ($snum==7) { $storeunder=$seclevelr; }      if ($snum==11) { $storeunder=$secleveli; }
     if ($snum==6) { $storeunder=$grplevel; }      if ($snum==10) { $storeunder=$seclevelm; }
     if ($snum==5) { $storeunder=$grplevelm; }      if ($snum==9) { $storeunder=$seclevelr; }
     if ($snum==4) { $storeunder=$grplevelr; }      if ($snum==8) { $storeunder=$grplevel; }
       if ($snum==7) { $storeunder=$grpleveli; }
       if ($snum==6) { $storeunder=$grplevelm; }
       if ($snum==5) { $storeunder=$grplevelr; }
   
   
     my $delete;      my $delete;
Line 694  sub storeparm_by_symb_inner { Line 750  sub storeparm_by_symb_inner {
     my %storecontent = ($storeunder         => $nval,      my %storecontent = ($storeunder         => $nval,
             $storeunder.'.type' => $ntype);              $storeunder.'.type' => $ntype);
     my $reply='';      my $reply='';
     if ($snum>3) {      if ($snum>4) {
 # ---------------------------------------------------------------- Store Course  # ---------------------------------------------------------------- Store Course
 #  #
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
 # Expire sheets  # Expire sheets
     &Apache::lonnet::expirespread('','','studentcalc');      &Apache::lonnet::expirespread('','','studentcalc');
     if (($snum==10) || ($snum==7) || ($snum==4)) {      if (($snum==13) || ($snum==9) || ($snum==5)) {
         &Apache::lonnet::expirespread('','','assesscalc',$symb);          &Apache::lonnet::expirespread('','','assesscalc',$symb);
     } elsif (($snum==11) || ($snum==8) || ($snum==5)) {      } elsif (($snum==14) || ($snum==10) || ($snum==6)) {
         &Apache::lonnet::expirespread('','','assesscalc',$map);          &Apache::lonnet::expirespread('','','assesscalc',$map);
     } else {      } else {
         &Apache::lonnet::expirespread('','','assesscalc');          &Apache::lonnet::expirespread('','','assesscalc');
Line 754  sub storeparm_by_symb_inner { Line 810  sub storeparm_by_symb_inner {
   
   
 sub valout {  sub valout {
     my ($value,$type,$editable)=@_;      my ($value,$type,$name,$editable)=@_;
     my $result = '';      my $result = '';
     # Values of zero are valid.      # Values of zero are valid.
     if (! $value && $value ne '0') {      if (! $value && $value ne '0') {
Line 768  sub valout { Line 824  sub valout {
         }          }
     } else {      } else {
         if ($type eq 'date_interval') {          if ($type eq 'date_interval') {
             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);              my ($totalsecs,$donesuffix) = split(/_/,$value,2);
               my ($usesdone,$donebuttontext,$proctor,$secretkey);
               if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) {
                   $donebuttontext = $1;
                   (undef,$proctor,$secretkey) = split(/_/,$2);
                   $usesdone = 'done';
               } elsif ($donesuffix =~ /^done(|_.+)$/) {
                   $donebuttontext = &mt('Done');
                   ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix);
               }
               my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);
             my @timer;              my @timer;
             $year=$year-70;              $year=$year-70;
             $mday--;              $mday--;
Line 801  sub valout { Line 867  sub valout {
                 push(@timer,&mt('[quant,_1,sec]',0));                  push(@timer,&mt('[quant,_1,sec]',0));
             }              }
             $result.=join(", ",@timer);              $result.=join(", ",@timer);
               if ($usesdone eq 'done') {
                   if ($secretkey) {
                       $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey);  
                   } else {
                       $result .= ' + "'.$donebuttontext.'"';
                   }
               }
         } elsif (&isdateparm($type)) {          } elsif (&isdateparm($type)) {
             $result = &Apache::lonlocal::locallocaltime($value).              $result = &Apache::lonlocal::locallocaltime($value).
         &date_sanity_info($value);          &date_sanity_info($value);
Line 827  sub plink { Line 900  sub plink {
     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);      my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);      my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
     unless (defined($winvalue)) { $winvalue=$val; }      unless (defined($winvalue)) { $winvalue=$val; }
     my $valout = &valout($value,$type,1);      my $valout = &valout($value,$type,$parmname,1);
     my $unencmarker = $marker;      my $unencmarker = $marker;
     foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,      foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
               \$hour, \$min, \$sec) {                \$hour, \$min, \$sec) {
Line 880  sub page_js { Line 953  sub page_js {
         var newWin = window.open(url, wdwName, options);          var newWin = window.open(url, wdwName, options);
         newWin.focus();          newWin.focus();
     }      }
   
 // ]]>  // ]]>
   
 </script>  </script>
 $selscript  $selscript
 ENDJS  ENDJS
Line 907  function showHide_courseContent() { Line 982  function showHide_courseContent() {
 COURSECONTENTSCRIPT  COURSECONTENTSCRIPT
 }  }
   
   sub toggleparmtextbox_js {
       return <<"ENDSCRIPT";
   
   if (!document.getElementsByClassName) {
       function getElementsByClassName(node, classname) {
           var a = [];
           var re = new RegExp('(^| )'+classname+'( |$)');
           var els = node.getElementsByTagName("*");
           for(var i=0,j=els.length; i<j; i++)
               if(re.test(els[i].className))a.push(els[i]);
           return a;
       }
   }
   
   function showHideLenient() {
       var lenients;
       var setRegExp = /^set_/;
       if (document.getElementsByClassName) {
           lenients = document.getElementsByClassName('LC_lenient_radio');
       } else {
           lenients = getElementsByClassName(document.body,'LC_lenient_radio');
       }
       if (lenients != 'undefined') {
           for (var i=0; i<lenients.length; i++) {
               if (lenients[i].checked) {
                   if (lenients[i].value == 'weighted') {
                       if (setRegExp.test(lenients[i].name)) {
                           var identifier = lenients[i].name.replace(setRegExp,'');
                           toggleParmTextbox(document.parmform,identifier);
                       }
                   }
               }
           }
       }
       return;
   }
   
   function toggleParmTextbox(form,key) {
       var divfortext = document.getElementById('LC_parmtext_'+key);
       if (divfortext) {
           var caller = form.elements['set_'+key];
           if (caller.length) {
               for (i=0; i<caller.length; i++) {
                   if (caller[i].checked) {
                       if (caller[i].value == 'weighted') {
                           divfortext.style.display = 'inline';
                       } else {
                           divfortext.style.display = 'none';
                       }
                   }
               }
           }
       }
       return;
   }
   
   ENDSCRIPT
   }
   
   sub validateparms_js {
       return <<'ENDSCRIPT';
   
   function validateParms() {
       var textRegExp = /^settext_/;
       var tailLenient = /\.lenient$/;
       var patternRelWeight = /^\-?[\d.]+$/;
       var patternLenientStd = /^(yes|no|default)$/;
       var ipallowRegExp = /^setipallow_/;
       var ipdenyRegExp = /^setipdeny_/; 
       var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;
       if ((document.parmform.elements.length != 'undefined')  && (document.parmform.elements.length) != 'null') {
           if (document.parmform.elements.length) {
               for (i=0; i<document.parmform.elements.length; i++) {
                   var name=document.parmform.elements[i].name;
                   if (textRegExp.test(name)) { 
                       var identifier = name.replace(textRegExp,'');
                       if (tailLenient.test(identifier)) {
                           if (document.parmform.elements['set_'+identifier].length) {
                               for (var j=0; j<document.parmform.elements['set_'+identifier].length; j++) {
                                   if (document.parmform.elements['set_'+identifier][j].checked) {
                                       if (!(patternLenientStd.test(document.parmform.elements['set_'+identifier][j].value))) {
                                           var relweight = document.parmform.elements[i].value;
                                           relweight = relweight.replace(/^\s+|\s+$/g,'');
                                           if (!patternRelWeight.test(relweight)) {
                                               relweight = '0.0';
                                           }
                                           if (document.parmform.elements['set_'+identifier][j].value == 'weighted') {
                                               document.parmform.elements['set_'+identifier][j].value = relweight;
                                           } else {
                                               document.parmform.elements['set_'+identifier][j].value += ','+relweight;
                                           }
                                       }
                                       break;
                                   }
                               }
                           }
                       }
                   } else {
                       if (ipallowRegExp.test(name)) {
                           var identifier = name.replace(ipallowRegExp,'');
                           var possallow = document.parmform.elements[i].value;
                           possallow = possallow.replace(/^\s+|\s+$/g,'');
                           if (patternIP.test(possallow)) {
                               if (document.parmform.elements['set_'+identifier].value) {
                                   possallow = ','+possallow;
                               }
                               document.parmform.elements['set_'+identifier].value += possallow; 
                           }
                       } else {
                           if (ipdenyRegExp.test(name)) {
                               var identifier = name.replace(ipdenyRegExp,'');
                               var possdeny = document.parmform.elements[i].value;
                               possdeny = possdeny.replace(/^\s+|\s+$/g,'');
                               if (patternIP.test(possdeny)) {
                                   possdeny = '!'+possdeny;
                                   if (document.parmform.elements['set_'+identifier].value) {
                                       possdeny = ','+possdeny;
                                   }
                                   document.parmform.elements['set_'+identifier].value += possdeny;
                               }
                           }
                       }
                   }
               }
           }
       }
       return true;
   }
   
   ENDSCRIPT
   }
   
   sub ipacc_boxes_js  {
       my $remove = &mt('Remove');
       return <<"END";
   \$(document).ready(function() {
       var wrapper         = \$(".LC_string_ipacc_wrap");
       var add_button      = \$(".LC_add_ipacc_button");
       var ipaccRegExp     = /^LC_string_ipacc_/;
   
       \$(add_button).click(function(e){
           e.preventDefault();
           var identifier = \$(this).closest("div").attr("id");
           identifier = identifier.replace(ipaccRegExp,'');
           \$(this).closest('div').find('.LC_string_ipacc_inner').append('<div><input type="text" name="setip'+identifier+'" /><a href="#" class="LC_remove_ipacc">$remove</a></div>');
       });
   
       \$(wrapper).delegate(".LC_remove_ipacc","click", function(e){
           e.preventDefault(); \$(this).closest("div").remove();
       })
   });
   
   
   END
   }
   
   sub done_proctor_js {
       return <<"END";
   function toggleSecret(form,radio,key) {
       var radios = form[radio+key];
       if (radios.length) {
           for (var i=0; i<radios.length; i++) {
               if (radios[i].checked) {
                   if (radios[i].value == '_done_proctor') {
                       if (document.getElementById('done_'+key+'_proctorkey')) {
                           document.getElementById('done_'+key+'_proctorkey').type='text';
                       }
                   } else {
                       if (document.getElementById('done_'+key+'_proctorkey')) {
                           document.getElementById('done_'+key+'_proctorkey').type='hidden';
                           document.getElementById('done_'+key+'_proctorkey').value='';
                       }
                   }
               }
           }
       }
   }
   END
   
   }
   
 sub startpage {  sub startpage {
     my ($r,$psymb) = @_;      my ($r,$psymb,$crstype) = @_;
   
     my %loaditems = (      my %loaditems = (
                       'onload'   => "group_or_section('cgroup')",                        'onload'   => "group_or_section('cgroup')",
Line 935  sub startpage { Line 1191  sub startpage {
 </script>  </script>
 ';  ';
     my $start_page =      my $start_page =
     &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,          &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
                        {'add_entries' => \%loaditems,});                                         {'add_entries' => \%loaditems,});
     my $breadcrumbs =      my $breadcrumbs =
     &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');      &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
     my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});      my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});
     my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});      my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDHEAD);      $r->print(<<ENDHEAD);
 <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" />
Line 956  ENDHEAD Line 1213  ENDHEAD
   
 sub print_row {  sub print_row {
     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,      my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
     $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,      $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_;
     $readonly)=@_;  
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
   
 # get the values for the parameter in cascading order  # get the values for the parameter in cascading order
 # empty levels will remain empty  # empty levels will remain empty
     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},      my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
Line 972  sub print_row { Line 1229  sub print_row {
          $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);           $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
 # cascade down manually  # cascade down manually
     my $cascadetype=$$defaulttype{$which};      my $cascadetype=$$defaulttype{$which};
     for (my $i=14;$i>0;$i--) {      for (my $i=18;$i>0;$i--) {
      if ($typeoutpar[$i]) {       if ($typeoutpar[$i]) {
             $cascadetype=$typeoutpar[$i];              $cascadetype=$typeoutpar[$i];
     } else {      } else {
Line 996  sub print_row { Line 1253  sub print_row {
     my $thismarker=$which;      my $thismarker=$which;
     $thismarker=~s/^parameter\_//;      $thismarker=~s/^parameter\_//;
     my $mprefix=$rid.'&'.$thismarker.'&';      my $mprefix=$rid.'&'.$thismarker.'&';
     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);      my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);
     my ($othergrp,$grp_parm,$controlgrp);      my ($othergrp,$grp_parm,$controlgrp);
   
     if ($parmlev eq 'general') {      if ($parmlev eq 'general') {
   
         if ($uname) {          if ($uname) {
             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } else {          } else {
             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         }          }
     } elsif ($parmlev eq 'map') {      } elsif ($parmlev eq 'map') {
   
         if ($uname) {          if ($uname) {
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
               &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); 
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
               &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
               &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } else {          } else {
             &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
               &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         }          }
     } else {      } else {
         if ($uname) {          if ($uname) {
             if (@{$usersgroups} > 1) {              if (@{$usersgroups} > 1) {
                 my ($coursereply,$grp_parm,$controlgrp);                  my ($coursereply,$grp_parm,$controlgrp);
                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =                  ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                     &check_other_groups($$part{$which}.'.'.$$name{$which},                      &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);                         $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                 if ($coursereply && $result > 3) {                  if ($coursereply && $result > 4) {
                     if (defined($controlgrp)) {                      if (defined($controlgrp)) {
                         if ($cgroup ne $controlgrp) {                          if ($cgroup ne $controlgrp) {
                             $effective_parm = $grp_parm;                              $effective_parm = $grp_parm;
Line 1039  sub print_row { Line 1298  sub print_row {
             }              }
         }          }
   
         &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
           &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
   
     if ($csec) {          if ($csec) {
         &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     }              &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
           }
   
         if ($cgroup) {          if ($cgroup) {
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
               &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
         }          }
   
     if ($uname) {          if ($uname) {
             if ($othergrp) {              if ($othergrp) {
                 $r->print($othergrp);                  $r->print($othergrp);
             }              }
         &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     }              &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
           }
   
     } # end of $parmlev if/else      } # end of $parmlev if/else
     $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.'</td>');      $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.'</td>');
Line 1076  sub print_row { Line 1338  sub print_row {
         my $sessionvaltype=$typeoutpar[$result];          my $sessionvaltype=$typeoutpar[$result];
         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }          if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
         $r->print('<td style="background-color:#999999;" align="center"><font color="#FFFFFF">'.          $r->print('<td style="background-color:#999999;" align="center"><font color="#FFFFFF">'.
                   &valout($sessionval,$sessionvaltype).'&nbsp;'.                    &valout($sessionval,$sessionvaltype,$$name{$which}).'&nbsp;'.
                   '</font></td>');                    '</font></td>');
     }      }
     $r->print('</tr>');      $r->print('</tr>');
Line 1084  sub print_row { Line 1346  sub print_row {
 }  }
   
 sub print_td {  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;
     $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).      $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).
               ';" align="center">');                ';" align="center">');
     my $nolink = 0;      my $nolink = 0;
     if ($readonly) {      if ($which == 14 || $which == 15) {
         $nolink = 1;          $nolink = 1;
     } else {      } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {
         if ($which == 11 || $which == 12) {          $nolink = 1;
       } elsif ($which == 5 || $which ==  6 || $which == 7 || $which == 8) {
           if ($noeditgrp) {
             $nolink = 1;              $nolink = 1;
         } elsif (($env{'request.course.sec'} ne '') && ($which > 9)) {          }
       } elsif ($mprefix =~ /availablestudent\&$/) {
           if ($which > 4) {
             $nolink = 1;              $nolink = 1;
         } elsif ($which == 4 || $which ==  5 || $which == 6) {          }
             if ($noeditgrp) {      } elsif ($mprefix =~ /examcode\&$/) {
                 $nolink = 1;          unless ($which == 2) {
             }  
         } elsif ($mprefix =~ /availablestudent\&$/) {  
             $nolink = 1;              $nolink = 1;
         } elsif ($mprefix =~ /examcode\&$/) {  
             unless ($which == 2) {  
                 $nolink = 1;  
             }  
         }          }
     }      }
     if ($nolink) {      if ($nolink) {
         $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));          $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix));
     } else {      } else {
         $r->print(&plink($$typeoutpar[$which],          $r->print(&plink($$typeoutpar[$which],
                          $$display{$value},$$outpar[$which],                           $$display{$value},$$outpar[$which],
Line 1117  sub print_td { Line 1377  sub print_td {
     $r->print('</td>'."\n");      $r->print('</td>'."\n");
 }  }
   
 sub check_other_groups {  sub print_usergroups {
     my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;      my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
     my $courseid = $env{'request.course.id'};      my $courseid = $env{'request.course.id'};
     my $output;      my $output;
     my $symb = &symbcache($rid);      my $symb = &symbcache($rid);
     my $symbparm=$symb.'.'.$what;      my $symbparm=$symb.'.'.$what;
     my $map=(&Apache::lonnet::decode_symb($symb))[0];      my $map=(&Apache::lonnet::decode_symb($symb))[0];
       my $recurseparm=$map.'___(rec).'.$what; 
     my $mapparm=$map.'___(all).'.$what;      my $mapparm=$map.'___(all).'.$what;
     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =      my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =
           &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what,            &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,
                                                                    $courseopt);                                $recurseparm,$what,$courseopt);
     my $bgcolor = $defbg;      my $bgcolor = $defbg;
     my $grp_parm;      my $grp_parm;
     if (($coursereply) && ($cgroup ne $resultgroup)) {      if (($coursereply) && ($cgroup ne $resultgroup)) {
         if ($result > 3) {          if ($result > 3) {
             $bgcolor = '#AAFFAA';              $bgcolor = '#AAFFAA';
               $grp_parm = &valout($coursereply,$resulttype,$what);
         }          }
         $grp_parm = &valout($coursereply,$resulttype);          $grp_parm = &valout($coursereply,$resulttype,$what);
         $output = '<td style="background-color:'.$bgcolor.';" align="center">';          $output = '<td style="background-color:'.$bgcolor.';" align="center">';
         if ($resultgroup && $resultlevel) {          if ($resultgroup && $resultlevel) {
             $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;              $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;
Line 1149  sub check_other_groups { Line 1411  sub check_other_groups {
 }  }
   
 sub parm_control_group {  sub parm_control_group {
     my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_;      my ($courseid,$usersgroups,$symbparm,$mapparm,$recurseparm,$what,$courseopt) = @_;
     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);      my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
     my $grpfound = 0;      my $grpfound = 0;
     my @levels = ($symbparm,$mapparm,$what);      my @levels = ($symbparm,$mapparm,$recurseparm,$what);
     my @levelnames = ('resource','map/folder','general');      my @levelnames = ('resource','map/folder','recursive','general');
     foreach my $group (@{$usersgroups}) {      foreach my $group (@{$usersgroups}) {
         if ($grpfound) { last; }          if ($grpfound) { last; }
         for (my $i=0; $i<@levels; $i++) {          for (my $i=0; $i<@levels; $i++) {
Line 1263  sub extractResourceInformation { Line 1525  sub extractResourceInformation {
                 $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id});                  $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id});
             }              }
             $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};              $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
             $$symbp{$mapid}=$$mapp{$id}.'___(all)';              $$symbp{$mapid}=$$mapp{$id}.'___(all)';  # Added in rev. 1.57, but seems not to be used.
                                                        # Lines 1038 and 1114 which use $symbp{$mapid}
                                                        # are commented out in rev. 1.57
         } else {          } else {
             $$mapp{$id} = $$mapp{$mapid};              $$mapp{$id} = $$mapp{$mapid};
         }          }
Line 1284  sub isdateparm { Line 1548  sub isdateparm {
 # from which you can select all desired parameters.  # from which you can select all desired parameters.
 #  #
 sub parmmenu {  sub parmmenu {
     my ($r)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
       my $tempkey;
     $r->print(<<ENDSCRIPT);      $r->print(<<ENDSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 1363  sub parmmenu { Line 1628  sub parmmenu {
 ENDSCRIPT  ENDSCRIPT
   
     $r->print('<hr />');      $r->print('<hr />');
     &shortCuts($r);      &shortCuts($r,$allparms,$pscat,$keyorder);
     $r->print('<hr />');      $r->print('<hr />');
 }  }
 # return a hash  # return a hash
Line 1427  sub lookUpTableParameter { Line 1692  sub lookUpTableParameter {
         'lenient' => 'grading',          'lenient' => 'grading',
         'retrypartial' => 'tries',          'retrypartial' => 'tries',
         'discussvote'  => 'misc',          'discussvote'  => 'misc',
         'examcode' => 'high_level_randomization',          'examcode' => 'high_level_randomization', 
     );      );    
 }  }
   
 sub whatIsMyCategory {  sub whatIsMyCategory {
Line 1479  sub category_order { Line 1744  sub category_order {
   
 sub parmboxes {  sub parmboxes {
     my ($r,$allparms,$pscat,$keyorder)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
     my $tempkey;      my %categories = &categories();
     my $tempparameter;  
     my %categories = &categories;  
     my %category_order = &category_order();      my %category_order = &category_order();
     my %categoryList = (      my %categoryList = (
         'time_settings' => [],          'time_settings' => [],
Line 1496  sub parmboxes { Line 1759  sub parmboxes {
         'misc' => [],          'misc' => [],
     );      );
   
     foreach $tempparameter (keys %$allparms) {      foreach my $tempparameter (keys(%$allparms)) {
         &whatIsMyCategory($tempparameter, \%categoryList);          &whatIsMyCategory($tempparameter, \%categoryList);
     }      }
     #part to print the parm-list      #part to print the parm-list
     $Text::Wrap::columns=60;      foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {
     $Text::Wrap::separator='<br />';          next if (@{$categoryList{$key}} == 0);
     $r->print('<div class="LC_columnSection">'."\n");          next if ($key eq '');
   
     #Print parameters  
     for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) {  
         next if(@{$categoryList{$key}} == 0);  
         $r->print('<div class="LC_Box LC_400Box">'          $r->print('<div class="LC_Box LC_400Box">'
                   .'<h4 class="LC_hcell">'                   .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");
                   .&mt($categories{$key})          foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
                   .'</h4>'."\n");  
         foreach $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {  
             next if ($tempkey eq '');  
             $r->print('<span class="LC_nobreak">'              $r->print('<span class="LC_nobreak">'
                      .'<label><input type="checkbox" name="pscat" '                       .'<label><input type="checkbox" name="pscat" '
                      .'value="'.$tempkey.'" ');                       .'value="'.$tempkey.'" ');
             if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {              if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                 $r->print(' checked="checked"');                  $r->print( ' checked="checked"');
             }              }
             $r->print(' />'.($$allparms{$tempkey}=~/\S/ ?              $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
                              Text::Wrap::wrap('','&nbsp;'x4,$$allparms{$tempkey})                                                        : $tempkey)
                              : $tempkey)  
                      .'</label></span><br />'."\n");                       .'</label></span><br />'."\n");
         }          }
         $r->print("</div>\n");          $r->print('</div>');
     }      }
       $r->print("\n");
     $r->print("</div>\n");  
 }  }
 #  #
 # This function offers some links on the parameter section to get with one click a group a parameters  # This function offers some links on the parameter section to get with one click a group a parameters
 #  #
 sub shortCuts {  sub shortCuts {
     my ($r)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
   
     # Parameter Selection      # Parameter Selection
     $r->print(      $r->print(
Line 1594  sub partmenu { Line 1848  sub partmenu {
 sub usermenu {  sub usermenu {
     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_;      my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_;
     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.      my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                   &Apache::loncommon::selectstudent_link('parmform','uname','udom','condition').          &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                   &Apache::lonhtmlcommon::scripttag(<<ENDJS);      my $selscript=&Apache::loncommon::studentbrowser_javascript();
 function setCourseadv(form,caller) {  
     if (caller.value == 'st') {  
         form.courseadv.value = 'none';  
     } else {  
         form.courseadv.value = '';  
     }  
     return;  
 }  
 ENDJS  
   
     my (%chkroles,$stuonly,$courseadv);  
     if ($env{'form.userroles'} eq 'any') {  
         $chkroles{'any'} = ' checked="checked"';  
     } else {  
         $chkroles{'st'} = ' checked="checked"';  
         $courseadv = 'none';  
     }  
     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};  
     if ($crstype eq 'Community') {  
         $stuonly = &mt('member only');  
     } else {  
         $stuonly = &mt('student only');  
     }  
     $chooseopt .= '<br /><span class="LC_cusr_subheading">'.  
                   &mt("User's role").':&nbsp;'.  
                   '<label><input type="radio" name="userroles" value="st"'.$chkroles{'st'}.' onclick="setCourseadv(this.form,this);" />'.  
                   $stuonly.'</label>&nbsp;&nbsp;'.  
                   '<label><input type="radio" name="userroles" value="any"'.$chkroles{'any'}.' onclick="setCourseadv(this.form,this);" />'.  
                   &mt('any role').'</label><input type="hidden" id="courseadv" name="courseadv" value="'.$courseadv.'" /></span>';  
     my $sections='';      my $sections='';
     my %sectionhash = &Apache::loncommon::get_sections();      my %sectionhash = &Apache::loncommon::get_sections();
   
Line 1633  ENDJS Line 1859  ENDJS
     if (($pssymb) || &Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {      if (($pssymb) || &Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
         %grouphash = &Apache::longroup::coursegroups();          %grouphash = &Apache::longroup::coursegroups();
     } elsif ($env{'request.course.groups'} ne '') {      } elsif ($env{'request.course.groups'} ne '') {
         map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});          map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
     }      }
   
     my $g_s_header='';      my $g_s_header='';
Line 1651  ENDJS Line 1877  ENDJS
             $sections .= qq| onchange="group_or_section('csec')" |;              $sections .= qq| onchange="group_or_section('csec')" |;
         }          }
         $sections .= '>';          $sections .= '>';
     foreach my $section ('',sort keys %sectionhash) {      foreach my $section ('',sort(keys(%sectionhash))) {
         $sections.='<option value="'.$section.'" '.          $sections.='<option value="'.$section.'" '.
         ($section eq $csec?'selected="selected"':'').'>'.$section.          ($section eq $csec?'selected="selected"':'').'>'.$section.
                                                               '</option>';                                                                '</option>';
Line 1678  function group_or_section(caller) { Line 1904  function group_or_section(caller) {
 // ]]>  // ]]>
 </script>  </script>
 |;  |;
     } elsif ($currsec eq '') {      } else {
         $sections .= qq|          $sections .= qq|
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 1696  function group_or_section(caller) { Line 1922  function group_or_section(caller) {
             $groups .= qq| onchange="group_or_section('cgroup')" |;              $groups .= qq| onchange="group_or_section('cgroup')" |;
         }          }
         $groups .= '>';          $groups .= '>';
         foreach my $grp ('',sort keys %grouphash) {          foreach my $grp ('',sort(keys(%grouphash))) {
             $groups.='<option value="'.$grp.'" ';              $groups.='<option value="'.$grp.'" ';
             if ($grp eq $cgroup) {              if ($grp eq $cgroup) {
                 unless ((defined($uname)) && ($grp eq '')) {                  unless ((defined($uname)) && ($grp eq '')) {
Line 1718  function group_or_section(caller) { Line 1944  function group_or_section(caller) {
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));
         $r->print($sections.$groups);          $r->print($sections.$groups);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
       } else {
           $r->print($sections); 
     }      }
   
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));      $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));
Line 1731  function group_or_section(caller) { Line 1959  function group_or_section(caller) {
 # This function shows on table Mode the available Parameters for the selected Resources  # This function shows on table Mode the available Parameters for the selected Resources
 #  #
 sub displaymenu {  sub displaymenu {
     my ($r,$allparms,$pscat,$keyorder,$divid)=@_;      my ($r,$allparms,$pscat,$psprt,$keyorder,$divid)=@_;
   
     $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::lonhtmlcommon::start_pick_box());
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
   
     &parmmenu($r);      &parmmenu($r,$allparms,$pscat,$keyorder);
     $r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid));      $r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid));
     &parmboxes($r,$allparms,$pscat,$keyorder);      &parmboxes($r,$allparms,$pscat,$keyorder);
     $r->print(&Apache::loncommon::end_scrollbox());      $r->print(&Apache::loncommon::end_scrollbox());
Line 1747  sub displaymenu { Line 1975  sub displaymenu {
 }  }
   
 sub mapmenu {  sub mapmenu {
     my ($r,$allmaps,$pschp,$maptitles,$symbp,$parmlev)=@_;      my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;
     my %allmaps_inverted = reverse %$allmaps;      my %allmaps_inverted = reverse %$allmaps;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $tree=[];      my $tree=[];
Line 1795  sub mapmenu { Line 2023  sub mapmenu {
         }          }
     }      }
 # Show it ...      # Show it ...    
     my $rowattr = ' id="mapmenu"';      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',' id="mapmenu"'));
     if ($parmlev eq 'general') {  
         $rowattr .= ' style="display:none"';  
     }  
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',$rowattr));  
     if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {      if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {
         my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';          my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';
         my $whitespace =          my $whitespace =
Line 1906  sub mapmenu { Line 2130  sub mapmenu {
 sub levelmenu {  sub levelmenu {
     my ($r,$alllevs,$parmlev)=@_;      my ($r,$alllevs,$parmlev)=@_;
   
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').
                                                   &Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
     $r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');      $r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');
     foreach (reverse sort keys %{$alllevs}) {      foreach my $lev (reverse(sort(keys(%{$alllevs})))) {
     $r->print('<option value="'.$$alllevs{$_}.'"');          $r->print('<option value="'.$$alllevs{$lev}.'"');
     if ($parmlev eq $$alllevs{$_}) {          if ($parmlev eq $$alllevs{$lev}) {
         $r->print(' selected="selected"');              $r->print(' selected="selected"');
     }          }
     $r->print('>'.&mt($_).'</option>');          $r->print('>'.&mt($lev).'</option>');
     }      }
     $r->print("</select>");      $r->print("</select>");
 }  }
Line 1935  sub sectionmenu { Line 2160  sub sectionmenu {
     my $output = '<select name="Section" multiple="multiple" size="8"'.$disabled.'>';      my $output = '<select name="Section" multiple="multiple" size="8"'.$disabled.'>';
     foreach my $s (@possibles) {      foreach my $s (@possibles) {
         $output .= '    <option value="'.$s.'"';          $output .= '    <option value="'.$s.'"';
         if ((@{$selectedsections}) && (grep(/^\Q$s\E$/,@{$selectedsections}))) {          if ((@{$selectedsections}) && (grep(/^\Q$s\E$/,@{$selectedsections}))) {  
             $output .= ' selected="selected"';              $output .= ' selected="selected"';
         }          }
         $output .= '>'."$s</option>\n";          $output .= '>'."$s</option>\n";
Line 1950  sub groupmenu { Line 2175  sub groupmenu {
     if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {      if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
         %grouphash = &Apache::longroup::coursegroups();          %grouphash = &Apache::longroup::coursegroups();
     } elsif ($env{'request.course.groups'} ne '') {      } elsif ($env{'request.course.groups'} ne '') {
         map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});           map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
     }      }
     return '' if (!%grouphash);      return '' if (!%grouphash);
   
Line 1958  sub groupmenu { Line 2183  sub groupmenu {
     foreach my $group (sort(keys(%grouphash))) {      foreach my $group (sort(keys(%grouphash))) {
         $output .= '    <option value="'.$group.'"';          $output .= '    <option value="'.$group.'"';
         if ((@{$selectedgroups}) && (grep(/^\Q$group\E$/,\@{$selectedgroups}))) {          if ((@{$selectedgroups}) && (grep(/^\Q$group\E$/,\@{$selectedgroups}))) {
             $output .= ' selected="selected"';              $output .=  ' selected="selected"';
         }          }
         $output .= '>'.$group."</option>\n";          $output .= '>'."$group</option>\n";
     }      }
     $output .= "</select>\n";      $output .= "</select>\n";
     return $output;      return $output;
Line 1975  sub keysinorder { Line 2200  sub keysinorder {
     my ($name,$keyorder)=@_;      my ($name,$keyorder)=@_;
     return sort {      return sort {
     $$keyorder{$a} <=> $$keyorder{$b};      $$keyorder{$a} <=> $$keyorder{$b};
     } (keys %{$name});      } (keys(%{$name}));
 }  }
   
 sub keysinorder_bytype {  sub keysinorder_bytype {
Line 1987  sub keysinorder_bytype { Line 2212  sub keysinorder_bytype {
         return ($a cmp $b);          return ($a cmp $b);
     }      }
     $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};      $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
     } (keys %{$name});      } (keys(%{$name}));
 }  }
   
 sub keysindisplayorder {  sub keysindisplayorder {
     my ($name,$keyorder)=@_;      my ($name,$keyorder)=@_;
     return sort {      return sort {
     $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};      $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
     } (keys %{$name});      } (keys(%{$name}));
 }  }
   
 sub sortmenu {  sub sortmenu {
Line 2041  sub standardkeyorder { Line 2266  sub standardkeyorder {
   
 sub assessparms {  sub assessparms {
   
     my ($r,$parm_permission) = @_;      my $r=shift;
   
   
   
 # -------------------------------------------------------- Variable declaration  # -------------------------------------------------------- Variable declaration
Line 2090  sub assessparms { Line 2316  sub assessparms {
   
 # Check group privs.  # Check group privs.
     $cgroup=$env{'form.cgroup'};      $cgroup=$env{'form.cgroup'};
     my $noeditgrp;      my $noeditgrp; 
     if ($cgroup ne '') {      if ($cgroup ne '') {
         unless (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {          unless (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
             if (($env{'request.course.groups'} eq '') ||              if (($env{'request.course.groups'} eq '') || 
                 (!grep(/^\Q$cgroup\E$/,split(/:/,$env{'request.course.groups'})))) {                  (!grep(/^\Q$cgroup\E$/,split(/,/,$env{'request.course.groups'})))) {
                 $noeditgrp = 1;                  $noeditgrp = 1;
             }              }
         }          }
Line 2113  sub assessparms { Line 2339  sub assessparms {
   
   
     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');      my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
     if (!@psprt) { $psprt[0]='0'; }      if (!@psprt) { $psprt[0]='all'; }
     if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; }      if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; }
   
     my $pssymb='';      my $pssymb='';
Line 2146  sub assessparms { Line 2372  sub assessparms {
   
     my $id=$env{'form.id'};      my $id=$env{'form.id'};
     if (($id) && ($udom)) {      if (($id) && ($udom)) {
         $uname=(&Apache::lonnet::idget($udom,$id))[1];          $uname=(&Apache::lonnet::idget($udom,[$id],'ids'))[1];
         if ($uname) {          if ($uname) {
             $id='';              $id='';
         } else {          } else {
             $message=              $message=
             '<span class="LC_error">'.&mt("Unknown ID")." '$id' ".                  '<p class="LC_warning">'.
             &mt('at domain')." '$udom'</span>";                  &mt('Unknown ID [_1] at domain [_2]',
                       "'".$id."'","'".$udom."'").
                   '</p>';
         }          }
     } else {      } else {
         $uname=$env{'form.uname'};          $uname=$env{'form.uname'};
Line 2163  sub assessparms { Line 2391  sub assessparms {
         $uhome=&Apache::lonnet::homeserver($uname,$udom);          $uhome=&Apache::lonnet::homeserver($uname,$udom);
         if ($uhome eq 'no_host') {          if ($uhome eq 'no_host') {
             $message=              $message=
             '<span class="LC_error">'.&mt("Unknown user")." '$uname' ".                  '<p class="LC_warning">'.
             &mt("at domain")." '$udom'</span>";                  &mt('Unknown user [_1] at domain [_2]',
                       "'".$uname."'","'".$udom."'").
                   '</p>';
             $uname='';              $uname='';
         } else {          } else {
             $csec=&Apache::lonnet::getsection($udom,$uname,              $csec=&Apache::lonnet::getsection($udom,$uname,
                           $env{'request.course.id'});                            $env{'request.course.id'});
             if ($csec eq '-1') {              if ($csec eq '-1') {
                 my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};                  $message=
                 if ($env{'form.userroles'} eq 'any') {                      '<p class="LC_warning">'.
                     if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {                      &mt('User [_1] at domain [_2] not in this course',
                         $csec = $env{'request.course.sec'};                          "'".$uname."'","'".$udom."'").
                         $message = '<span class="LC_info">';                      '</p>';
                         if ($crstype eq 'Community') {                  $uname='';
                             $message .= &mt('User [_1] at domain [_2] has a non-member role in this community',                  $csec=$env{'form.csec'};
                                             $uname,$udom);  
                         } else {  
                             $message .= &mt('User [_1] at domain [_2] has a non-student role in this course',  
                                             $uname,$udom);  
                         }  
                         $message .= '</span>';  
                     } else {  
                         my @possroles = ('in','ep','ta','cr');  
                         if ($crstype eq 'Community') {  
                             unshift(@possroles,'co');  
                         } else {  
                             unshift(@possroles,'cc');  
                         }  
                         my %not_student_roles =  
                             &Apache::lonnet::get_my_roles($uname,$udom,'userroles',['active'],  
                                                           \@possroles,[$udom],1,1);  
                         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
                         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
                         my %sections_by_role;  
                         foreach my $role (keys(%not_student_roles)) {  
                             if ($role =~ /^\Q$cnum:$cdom:\E([^:]+):(|[^:]+)$/) {  
                                 my ($rolename,$sec) = ($1,$2);  
                                 if ($rolename =~ m{^cr/}) {  
                                     $rolename = 'cr';  
                                 }  
                                 push(@{$sections_by_role{$rolename}},$sec);  
                             }  
                         }  
                         my $numroles = scalar(keys(%sections_by_role));  
                         if ($numroles) {  
                             foreach my $role (@possroles) {  
                                 if (ref($sections_by_role{$role}) eq 'ARRAY') {  
                                     my @secs = sort { $a <=> $b } @{$sections_by_role{$role}};  
                                     $csec = $secs[0];   
                                     last;  
                                 }  
                             }  
                         }  
                         if ($csec eq '-1') {  
                             $message = '<span class="LC_warning">';  
                             if ($crstype eq 'Community') {  
                                 $message .= &mt('User [_1] at domain [_2] does not have a role in this community',  
                                                 $uname,$udom);  
                             } else {  
                                 $message .= &mt('User [_1] at domain [_2] does not have a role in this course',  
                                                 $uname,$udom);  
                             }  
                             $message .= '</span>';  
                             $uname='';  
                             if ($env{'request.course.sec'} ne '') {  
                                 $csec=$env{'request.course.sec'};  
                             } else {  
                                 $csec=$env{'form.csec'};  
                             }  
                             $cgroup=$env{'form.cgroup'};  
                         } else {  
                             $message = '<span class="LC_info">';  
                             if ($crstype eq 'Community') {  
                                 $message .= &mt('User [_1] at domain [_2] has a non-member role in this community',  
                                          $uname,$udom);  
                             } else {  
                                 $message .= &mt('User [_1] at domain [_2] has a non-student role in this course',  
                                                 $uname,$udom);  
                             }  
                             $message .= '</span>';  
                         }  
                     }  
                 } else {  
                     $message = '<span class="LC_warning">';  
                     if ($crstype eq 'Community') {  
                         $message .= &mt('User [_1] at domain [_2] does not have a member role in this community',  
                                          $uname,$udom);  
                     } else {  
                          $message .= &mt('User [_1] at domain [_2] does not have a student role in this course',  
                                          $uname,$udom);  
                     }  
                     $message .= '</span>';  
                     $uname='';   
                     if ($env{'request.course.sec'} ne '') {  
                         $csec=$env{'request.course.sec'};  
                     } else {  
                         $csec=$env{'form.csec'};  
                     }  
                     $cgroup=$env{'form.cgroup'};  
                 }  
             } elsif ($env{'request.course.sec'} ne '') {  
                 if ($csec ne $env{'request.course.sec'}) {  
                     $message='<span class="LC_warning">'.  
                               &mt("User '[_1]' at domain '[_2]' not in section '[_3]'",  
                                   $uname,$udom,$env{'request.course.sec'}).  
                               '</span>';  
                     $uname='';  
                     $csec=$env{'request.course.sec'};  
                 }  
                 $cgroup=$env{'form.cgroup'};                  $cgroup=$env{'form.cgroup'};
             }              } else {
             if ($uname ne '') {  
                 my %name=&Apache::lonnet::userenvironment($udom,$uname,                  my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   ('firstname','middlename','lastname','generation','id'));                    ('firstname','middlename','lastname','generation','id'));
                 $message .= "\n<p>\n".&mt('Full Name').': '                  $message="\n<p>\n".&mt("Full Name").": ".
                             .$name{'firstname'}.' '.$name{'middlename'}.' '                  $name{'firstname'}.' '.$name{'middlename'}.' '
                             .$name{'lastname'}.' '.$name{'generation'}                  .$name{'lastname'}.' '.$name{'generation'}.
                             ."<br />\n".&mt('Student/Employee ID').': '.$name{'id'}.'</p>';                  "<br />\n".&mt('Student/Employee ID').": ".$name{'id'}.'<p>';
                 @usersgroups = &Apache::lonnet::get_users_groups(              }
                                    $udom,$uname,$env{'request.course.id'});              @usersgroups = &Apache::lonnet::get_users_groups(
                 if (@usersgroups > 0) {                                         $udom,$uname,$env{'request.course.id'});
                     unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {              if (@usersgroups > 0) {
                         $cgroup = $usersgroups[0];                  unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
                     }                      $cgroup = $usersgroups[0];
                 } else {  
                     $cgroup = '';  
                 }                  }
             }              }
         }          }
Line 2305  sub assessparms { Line 2438  sub assessparms {
     $symbp{'0.0'} = '';      $symbp{'0.0'} = '';
   
 # ---------------------------------------------------------- Anything to store?  # ---------------------------------------------------------- Anything to store?
     if ($env{'form.pres_marker'} && $parm_permission->{'edit'}) {      if ($env{'form.pres_marker'}) {
         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});          my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
         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'});
Line 2314  sub assessparms { Line 2447  sub assessparms {
         my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};          my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
         my ($got_chostname,$chostname,$cmajor,$cminor);          my ($got_chostname,$chostname,$cmajor,$cminor);
         my $totalstored = 0;          my $totalstored = 0;
         my $totalskippeduser = 0;  
         my $now = time;          my $now = time;
         for (my $i=0;$i<=$#markers;$i++) {          for (my $i=0;$i<=$#markers;$i++) {
             my ($needsrelease,$needsnewer,$name);              my ($needsrelease,$needsnewer,$name,$namematch);
             if (($env{'request.course.sec'} ne '') && ($markers[$i] =~ /\&(7|8|9)$/)) {              if (($env{'request.course.sec'} ne '') && ($markers[$i] =~ /\&(9|10|11|12)$/)) {
                 next if ($csec ne $env{'request.course.sec'});                  next if ($csec ne $env{'request.course.sec'});
             }              }
             if ($markers[$i] =~ /\&(6|5|4)$/) {              if ($markers[$i] =~ /\&(8|7|6|5)$/) {
                 next if ($noeditgrp);                  next if ($noeditgrp);
             } elsif ($markers[$i] =~ /\&(3|2|1)$/) {  
                 if ($uname eq '') {  
                     $totalskippeduser ++;  
                     next;  
                 }  
             }              }
             if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {              if ($markers[$i] =~ /\&(17|11|7|3)$/) {
                   $namematch = 'maplevelrecurse';
               }
               if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3|4)$/) {
                 my (@ok_slots,@fail_slots,@del_slots);                  my (@ok_slots,@fail_slots,@del_slots);
                 my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);                  my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
                 my ($level,@all) =                  my ($level,@all) =
Line 2359  sub assessparms { Line 2489  sub assessparms {
                         }                          }
                     }                      }
                 }                  }
             } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode|printstartdate|printenddate)\&\d+$/) {              } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode|printstartdate|printenddate|acc|interval)\&\d+$/) {
                 $name = $1;                  $name = $1;
                 my $val = $values[$i];                  my $val = $values[$i];
                   my $valmatch = '';
                 if ($name eq 'examcode') {                  if ($name eq 'examcode') {
                     if (&Apache::lonnet::validCODE($values[$i])) {                      if (&Apache::lonnet::validCODE($values[$i])) {
                         $val = 'valid';                          $val = 'valid';
Line 2371  sub assessparms { Line 2502  sub assessparms {
                         if ($val > $now) {                          if ($val > $now) {
                             $val = 'future';                              $val = 'future';
                         }                          }
                     }                      } 
                 } elsif ($name eq 'printenddate') {                  } elsif ($name eq 'printenddate') {
                     if ($val =~ /^\d+$/) {                      if ($val =~ /^\d+$/) {
                         if ($val < $now) {                          if ($val < $now) {
                             $val = 'past';                              $val = 'past';
                         }                          }
                     }                      }
                   } elsif (($name eq 'lenient') || ($name eq 'acc')) {
                       my $stringtype = &get_stringtype($name);
                       my $stringmatch = &standard_string_matches($stringtype);
                       if (ref($stringmatch) eq 'ARRAY') {
                           foreach my $item (@{$stringmatch}) {
                               if (ref($item) eq 'ARRAY') {
                                   my ($regexpname,$pattern) = @{$item};
                                   if ($pattern ne '') {
                                       if ($val =~ /$pattern/) {
                                           $valmatch = $regexpname;
                                           $val = '';
                                           last;
                                       }
                                   }
                               }
                           }
                       }
                   } elsif ($name eq 'interval') {
                       my $intervaltype = &get_intervaltype($name);
                       my $intervalmatch = &standard_interval_matches($intervaltype);
                       if (ref($intervalmatch) eq 'ARRAY') {
                           foreach my $item (@{$intervalmatch}) {
                               if (ref($item) eq 'ARRAY') {
                                   my ($regexpname,$pattern) = @{$item};
                                   if ($pattern ne '') {
                                       if ($val =~ /$pattern/) {
                                           $valmatch = $regexpname;
                                           $val = '';
                                           last;
                                       }
                                   }
                               }
                           }
                       }
                 }                  }
                 $needsrelease =                  $needsrelease =
                     $Apache::lonnet::needsrelease{"parameter:$name:$val"};                      $Apache::lonnet::needsrelease{"parameter:$name:$val:$valmatch:"};
                 if ($needsrelease) {                  if ($needsrelease) {
                     unless ($got_chostname) {                      unless ($got_chostname) {
                         ($chostname,$cmajor,$cminor) = &parameter_release_vars();                          ($chostname,$cmajor,$cminor) = &parameter_release_vars();
                         $got_chostname = 1;                          $got_chostname = 1;
                     }                      } 
                     $needsnewer = &parameter_releasecheck($name,$val,                      $needsnewer = &parameter_releasecheck($name,$val,$valmatch,undef,
                                                           $needsrelease,                                                            $needsrelease,
                                                           $cmajor,$cminor);                                                            $cmajor,$cminor);
                 }                  }
             }              }
             if ($needsnewer) {              if ($needsnewer) {
                 $message .= &oldversion_warning($name,$values[$i],$chostname,$cmajor,                  undef($namematch);
               } else {
                   my $currneeded;
                   if ($needsrelease) {
                       $currneeded = $needsrelease;
                   }
                   if ($namematch) {
                       $needsrelease =
                           $Apache::lonnet::needsrelease{"parameter::::$namematch"};
                       if (($needsrelease) && (($currneeded eq '') || ($needsrelease < $currneeded))) {
                           unless ($got_chostname) {
                               ($chostname,$cmajor,$cminor) = &parameter_release_vars();
                               $got_chostname = 1;
                           }
                           $needsnewer = &parameter_releasecheck(undef,undef,undef,$namematch,
                                                                 $needsrelease,
                                                                 $cmajor,$cminor);
                       } else {
                           undef($namematch);
                       }
                   }
               }
               if ($needsnewer) {
                   $message .= &oldversion_warning($name,$namematch,$values[$i],$chostname,$cmajor,
                                                 $cminor,$needsrelease);                                                  $cminor,$needsrelease);
             } else {              } else {
                 $message.=&storeparm(split(/\&/,$markers[$i]),                  $message.=&storeparm(split(/\&/,$markers[$i]),
Line 2405  sub assessparms { Line 2593  sub assessparms {
 # ---------------------------------------------------------------- Done storing  # ---------------------------------------------------------------- Done storing
         if ($totalstored) {          if ($totalstored) {
             $message.='<p class="LC_warning">'              $message.='<p class="LC_warning">'
                      .&mt('Changes for [quant,_1,parameter] saved.',$totalstored)  
                      .'<br />'  
                      .&mt('Changes can take up to 10 minutes before being active for all students.')                       .&mt('Changes can take up to 10 minutes before being active for all students.')
                      .&Apache::loncommon::help_open_topic('Caching')                       .&Apache::loncommon::help_open_topic('Caching')
                      .'</p>';                       .'</p>';
         } else {  
             $message.='<p class="LC_info">'.&mt('No parameter changes saved.').'</p>';  
         }  
         if ($totalskippeduser) {  
             $message .= '<p class="LC_warning">';  
             if ($uhome eq 'no_host') {  
                 $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the username or ID was invalid.',  
                                 $totalskippeduser);  
             } elsif ($env{'form.userroles'} eq 'any') {  
                 $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user does not have a course role.',  
                                 $totalskippeduser);  
             } else {  
                 $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user is not a student.',  
                                 $totalskippeduser);  
             }  
             $message .= '</p>';  
         }          }
     }      }
 #----------------------------------------------- if all selected, fill in array  #----------------------------------------------- if all selected, fill in array
     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}      if ($pscat[0] eq "all") {@pscat = (keys(%allparms));}
     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };      if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };
     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}      if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys(%allparts));}
 # ------------------------------------------------------------------ Start page  # ------------------------------------------------------------------ Start page
   
     &startpage($r,$pssymb);      my $crstype = &Apache::loncommon::course_type();
       &startpage($r,$pssymb,$crstype);
   
     foreach ('tolerance','date_default','date_start','date_end',      foreach my $item ('tolerance','date_default','date_start','date_end',
         'date_interval','int','float','string') {          'date_interval','int','float','string') {
         $r->print('<input type="hidden" value="'.          $r->print('<input type="hidden" value="'.
           &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').            &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').
           '" name="recent_'.$_.'" />');            '" name="recent_'.$item.'" />');
     }      }
   
     # ----- Start Parameter Selection      # ----- Start Parameter Selection
Line 2477  ENDPARMSELSCRIPT Line 2648  ENDPARMSELSCRIPT
         $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));          $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
         &levelmenu($r,\%alllevs,$parmlev);          &levelmenu($r,\%alllevs,$parmlev);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);          &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
         &partmenu($r,\%allparts,\@psprt);          &partmenu($r,\%allparts,\@psprt);
Line 2486  ENDPARMSELSCRIPT Line 2657  ENDPARMSELSCRIPT
   
         # Step 2          # Step 2
         $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));          $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
         &displaymenu($r,\%allparms,\@pscat,\%keyorder,'parmmenuscroll');          &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder,'parmmenuscroll');
   
         # Step 3          # Step 3
         $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));          $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
Line 2514  ENDPARMSELSCRIPT Line 2685  ENDPARMSELSCRIPT
              .'</a>'               .'</a>'
              .'</p>');               .'</p>');
     } else {      } else {
         $r->print();  
         # parameter screen for a single resource.           # parameter screen for a single resource. 
         my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);          my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);
         my $title = &Apache::lonnet::gettitle($pssymb);          my $title = &Apache::lonnet::gettitle($pssymb);
Line 2524  ENDPARMSELSCRIPT Line 2694  ENDPARMSELSCRIPT
                   '<br />');                    '<br />');
         $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));          $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
         $r->print(&Apache::lonhtmlcommon::start_pick_box());          $r->print(&Apache::lonhtmlcommon::start_pick_box());
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')).  
                   '<label>'.  
                   '<input type="checkbox" name="psprt" value="all"'.  
                   ($env{'form.psprt'}?' checked="checked"':'').' />'.  
                   &mt('Show all parts').  
                   '</label></td></tr>');  
         &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);          &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
         $r->print(&Apache::lonhtmlcommon::row_closure(1));          $r->print(&Apache::lonhtmlcommon::row_closure(1));
         $r->print(&Apache::lonhtmlcommon::end_pick_box());          $r->print(&Apache::lonhtmlcommon::end_pick_box());
Line 2554  ENDPARMSELSCRIPT Line 2718  ENDPARMSELSCRIPT
   
     @pscat = @temp_pscat;      @pscat = @temp_pscat;
   
   
     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {      if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
 # ----------------------------------------------------------------- Start Table  # ----------------------------------------------------------------- Start Table
         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;          my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
         my $csuname=$env{'user.name'};          my $csuname=$env{'user.name'};
         my $csudom=$env{'user.domain'};          my $csudom=$env{'user.domain'};
         my $readonly = 1;  
         if ($parm_permission->{'edit'}) {  
             undef($readonly);  
         }  
   
         if ($parmlev eq 'full') {          if ($parmlev eq 'full') {
 #  #
 # This produces the cascading table output of parameters  # This produces the cascading table output of parameters
 #  #
                my $coursespan=$csec?8:5;                 my $coursespan=$csec?10:6;
                my $userspan=3;                 my $userspan=4;
                if ($cgroup ne '') {                 if ($cgroup ne '') {
                   $coursespan += 3;                    $coursespan += 4;
                }                 }
   
                $r->print(&Apache::loncommon::start_data_table());                 $r->print(&Apache::loncommon::start_data_table());
Line 2585  ENDPARMSELSCRIPT Line 2746  ENDPARMSELSCRIPT
                        $userspan ++;                         $userspan ++;
                    }                     }
                    $r->print('<th colspan="'.$userspan.'" rowspan="2">');                     $r->print('<th colspan="'.$userspan.'" rowspan="2">');
                    $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");                     $r->print(&mt('User [_1] at Domain [_2]',"'".$uname."'","'".$udom."'").'</th>');
                }                 }
                my %lt=&Apache::lonlocal::texthash(                 my %lt=&Apache::lonlocal::texthash(
                 'pie'    => "Parameter in Effect",                  'pie'    => "Parameter in Effect",
Line 2601  ENDPARMSELSCRIPT Line 2762  ENDPARMSELSCRIPT
                 'femof'  => 'from Enclosing Map or Folder',                  'femof'  => 'from Enclosing Map or Folder',
                 'gen'    => 'general',                  'gen'    => 'general',
                 'foremf' => 'for Enclosing Map or Folder',                  'foremf' => 'for Enclosing Map or Folder',
                   'formfr' => 'for Map or Folder (recursive)',
                 'fr'     => 'for Resource'                  'fr'     => 'for Resource'
             );              );
                $r->print(<<ENDTABLETWO);                 $r->print(<<ENDTABLETWO);
 <th rowspan="3">$lt{'pie'}</th>  <th rowspan="3">$lt{'pie'}</th>
 <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>  <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>
 </tr><tr><td colspan="5"></td><th colspan="2">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>  </tr><tr><td colspan="5"></td><th colspan="3">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>
 <th colspan="1">$lt{'ic'}</th>  <th colspan="1">$lt{'ic'}</th>
   
 ENDTABLETWO  ENDTABLETWO
                if ($csec) {                 if ($csec) {
                    $r->print('<th colspan="3">'.                     $r->print('<th colspan="4">'.
                   &mt("in Section")." $csec</th>");                    &mt("in Section")." $csec</th>");
                }                 }
                if ($cgroup) {                 if ($cgroup) {
                 $r->print('<th colspan="3">'.                  $r->print('<th colspan="4">'.
                 &mt("in Group")." $cgroup</th>");                  &mt("in Group")." $cgroup</th>");
                }                 }
                $r->print(<<ENDTABLEHEADFOUR);                 $r->print(<<ENDTABLEHEADFOUR);
 </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>  </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
 <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>  <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
 <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>  <th>$lt{'gen'}</th><th>$lt{'formfr'}</th><th>$lt{'foremf'}</th>
 <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>  <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
 ENDTABLEHEADFOUR  ENDTABLEHEADFOUR
   
                if ($csec) {                 if ($csec) {
                    $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');                     $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
                }                 }
   
                if ($cgroup) {                 if ($cgroup) {
                 $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');                     $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.&mt('foremf').'</th><th>'.$lt{'fr'}.'</th>');
                }                 }
   
                if ($uname) {                 if ($uname) {
                 if (@usersgroups > 1) {                      if (@usersgroups > 1) {
                     $r->print('<th>'.&mt('Control by other group?').'</th>');                          $r->print('<th>'.&mt('Control by other group?').'</th>');
                    }                     }
                    $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');                     $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
                }                 }
   
                $r->print('</tr>');                 $r->print('</tr>');
Line 2648  ENDTABLEHEADFOUR Line 2810  ENDTABLEHEADFOUR
                my $defbgtwo='';                 my $defbgtwo='';
                my $defbgthree = '';                 my $defbgthree = '';
   
                foreach (@ids) {                 foreach my $rid (@ids) {
   
                 my $rid=$_;  
                 my ($inmapid)=($rid=~/\.(\d+)$/);                  my ($inmapid)=($rid=~/\.(\d+)$/);
   
                 if ((!$pssymb &&                  if ((!$pssymb &&
Line 2684  ENDTABLEHEADFOUR Line 2845  ENDTABLEHEADFOUR
                     my $uri=&Apache::lonnet::declutter($uris{$rid});                      my $uri=&Apache::lonnet::declutter($uris{$rid});
   
                     my $filter=$env{'form.filter'};                      my $filter=$env{'form.filter'};
                     foreach (&keysplit($keyp{$rid})) {                      foreach my $tempkeyp (&keysplit($keyp{$rid})) {
                         my $tempkeyp = $_;  
                         if (grep $_ eq $tempkeyp, @catmarker) {                          if (grep $_ eq $tempkeyp, @catmarker) {
                           my $parmname=&Apache::lonnet::metadata($uri,$_.'.name');                            my $parmname=&Apache::lonnet::metadata($uri,$tempkeyp.'.name');
 # We may only want certain parameters listed  # We may only want certain parameters listed
                           if ($filter) {                            if ($filter) {
                              unless ($filter=~/\Q$parmname\E/) { next; }                               unless ($filter=~/\Q$parmname\E/) { next; }
                           }                            }
                           $name{$_}=$parmname;                            $name{$tempkeyp}=$parmname;
                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');                            $part{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.part');
   
                           my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');                            my $parmdis=&Apache::lonnet::metadata($uri,$tempkeyp.'.display');
                           if ($allparms{$name{$_}} ne '') {                            if ($allparms{$name{$tempkeyp}} ne '') {
                               my $identifier;                                my $identifier;
                               if ($parmdis =~ /(\s*\[Part.*)$/) {                                if ($parmdis =~ /(\s*\[Part.*)$/) {
                                   $identifier = $1;                                    $identifier = $1;
                               }                                }
                               $display{$_} = $allparms{$name{$_}}.$identifier;                                $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                           } else {                            } else {
                               $display{$_} = $parmdis;                                $display{$tempkeyp} = $parmdis;
                           }                            }
                           unless ($display{$_}) { $display{$_}=''; }                            unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                           $display{$_}.=' ('.$name{$_}.')';                            $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                           $default{$_}=&Apache::lonnet::metadata($uri,$_);                            $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp);
                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');                            $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.type');
                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');                            $thistitle=&Apache::lonnet::metadata($uri,$tempkeyp.'.title');
                         }                          }
                     }                      }
                     my $totalparms=scalar keys %name;                      my $totalparms=scalar(keys(%name));
                     if ($totalparms>0) {                      if ($totalparms>0) {
                            my $firstrow=1;                             my $firstrow=1;
                         my $title=&Apache::lonnet::gettitle($symbp{$rid});                          my $title=&Apache::lonnet::gettitle($symbp{$rid});
Line 2738  ENDTABLEHEADFOUR Line 2898  ENDTABLEHEADFOUR
                         $r->print('<td style="background-color:'.$defbgone.';"'.                          $r->print('<td style="background-color:'.$defbgone.';"'.
                                       ' rowspan='.$totalparms.                                        ' rowspan='.$totalparms.
                                       '>'.$maptitles{$mapp{$rid}}.'</td>');                                        '>'.$maptitles{$mapp{$rid}}.'</td>');
                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {                          foreach my $item (&keysinorder_bytype(\%name,\%keyorder)) {
   
                             unless ($firstrow) {                              unless ($firstrow) {
                                 $r->print('<tr>');                                  $r->print('<tr>');
                             } else {                              } else {
                                 undef $firstrow;                                  undef $firstrow;
                             }                              }
                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,                              &print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default,
                                        \%type,\%display,$defbgone,$defbgtwo,                                         \%type,\%display,$defbgone,$defbgtwo,
                                        $defbgthree,$parmlev,$uname,$udom,$csec,                                         $defbgthree,$parmlev,$uname,$udom,$csec,
                                        $cgroup,\@usersgroups,$noeditgrp,$readonly);                                         $cgroup,\@usersgroups,$noeditgrp);
                         }                          }
                     }                      }
                 }                  }
Line 2772  ENDTABLEHEADFOUR Line 2931  ENDTABLEHEADFOUR
   
 #-------------------------------------------- for each map, gather information  #-------------------------------------------- for each map, gather information
             my $mapid;              my $mapid;
                foreach $mapid (sort { $a <=> $b } keys(%maplist)) {                 foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys(%maplist)) {
                 my $maptitle = $maplist{$mapid};                  my $maptitle = $maplist{$mapid};
   
 #-----------------------  loop through ids and get all parameter types for map  #-----------------------  loop through ids and get all parameter types for map
Line 2786  ENDTABLEHEADFOUR Line 2945  ENDTABLEHEADFOUR
   
 #        $r->print("Catmarker: @catmarker<br />\n");  #        $r->print("Catmarker: @catmarker<br />\n");
   
                 foreach (@ids) {                  foreach my $id (@ids) {
                     ($map)=(/([\d]*?)\./);                      ($map)=($id =~ /([\d]*?)\./);
                       my $rid = $_;                      my $rid = $id;
   
 #                  $r->print("$mapid:$map:   $rid <br /> \n");  #                  $r->print("$mapid:$map:   $rid <br /> \n");
   
Line 2803  ENDTABLEHEADFOUR Line 2962  ENDTABLEHEADFOUR
 # When storing information, store as part 0  # When storing information, store as part 0
 # When requesting information, request from full part  # When requesting information, request from full part
 #-------------------------------------------------------------------  #-------------------------------------------------------------------
                         foreach (&keysplit($keyp{$rid})) {                          foreach my $fullkeyp (&keysplit($keyp{$rid})) {
                              my $tempkeyp = $_;                              my $tempkeyp = $fullkeyp;
                               my $fullkeyp = $tempkeyp;                              $tempkeyp =~ s/_\w+_/_0_/;
                               $tempkeyp =~ s/_\w+_/_0_/;  
   
                               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');
                                 my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                                  my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
Line 2862  ENDTABLEHEADFOUR Line 3020  ENDTABLEHEADFOUR
                 $r->print('<p>'.&Apache::loncommon::start_data_table()                  $r->print('<p>'.&Apache::loncommon::start_data_table()
                          .&Apache::loncommon::start_data_table_header_row()                           .&Apache::loncommon::start_data_table_header_row()
                          .'<th>'.&mt('Parameter Name').'</th>'                           .'<th>'.&mt('Parameter Name').'</th>'
                          .'<th>'.&mt('Default Value').'</th>'                           .'<th>'.&mt('Recursive Value').'</th>'
                            .'<th>'.&mt('Non-Recursive Value').'</th>'
                          .'<th>'.&mt('Parameter in Effect').'</th>'                           .'<th>'.&mt('Parameter in Effect').'</th>'
                          .&Apache::loncommon::end_data_table_header_row()                           .&Apache::loncommon::end_data_table_header_row()
                 );                  );
   
                 foreach (&keysinorder(\%name,\%keyorder)) {                  foreach my $item (&keysinorder(\%name,\%keyorder)) {
                     $r->print(&Apache::loncommon::start_data_table_row());                      $r->print(&Apache::loncommon::start_data_table_row());
                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,                      &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                             \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                            $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,                             $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);
                            $readonly);  
                 }                  }
                 $r->print(&Apache::loncommon::end_data_table().'</p>'                  $r->print(&Apache::loncommon::end_data_table().'</p>'
                          .'</div>'                           .'</div>'
Line 2895  ENDTABLEHEADFOUR Line 3053  ENDTABLEHEADFOUR
             my %type = ();              my %type = ();
             my %default = ();              my %default = ();
   
             foreach (@ids) {              foreach $id (@ids) {
                 my $rid = $_;                  my $rid = $id;
   
                 my $uri=&Apache::lonnet::declutter($uris{$rid});                  my $uri=&Apache::lonnet::declutter($uris{$rid});
   
Line 2907  ENDTABLEHEADFOUR Line 3065  ENDTABLEHEADFOUR
 # When storing information, store as part 0  # When storing information, store as part 0
 # When requesting information, request from full part  # When requesting information, request from full part
 #-------------------------------------------------------------------  #-------------------------------------------------------------------
                 foreach (&keysplit($keyp{$rid})) {                  foreach my $fullkeyp (&keysplit($keyp{$rid})) {
                     my $tempkeyp = $_;                      my $tempkeyp = $fullkeyp;
                       my $fullkeyp = $tempkeyp;                      $tempkeyp =~ s/_\w+_/_0_/;
                       $tempkeyp =~ s/_\w+_/_0_/;                      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');
                         my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                          my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
Line 2959  ENDMAPONE Line 3116  ENDMAPONE
                      .&Apache::loncommon::end_data_table_header_row()                       .&Apache::loncommon::end_data_table_header_row()
             );              );
   
             foreach (&keysinorder(\%name,\%keyorder)) {              foreach my $item (&keysinorder(\%name,\%keyorder)) {
                 $r->print(&Apache::loncommon::start_data_table_row());                  $r->print(&Apache::loncommon::start_data_table_row());
                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,                  &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                         \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                            $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,                                     $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);
                            $readonly);  
             }              }
             $r->print(&Apache::loncommon::end_data_table()              $r->print(&Apache::loncommon::end_data_table()
                      .'</p>'                       .'</p>'
Line 2973  ENDMAPONE Line 3129  ENDMAPONE
         } # end of $parmlev eq general          } # end of $parmlev eq general
     }      }
     $r->print('</form>');      $r->print('</form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 } # end sub assessparms  } # end sub assessparms
   
Line 3014  sub readdata { Line 3171  sub readdata {
 # Read userdata  # Read userdata
   
     my $classlist=&Apache::loncoursedata::get_classlist();      my $classlist=&Apache::loncoursedata::get_classlist();
     foreach (keys %$classlist) {      foreach my $user (keys(%$classlist)) {
         if ($_=~/^($match_username)\:($match_domain)$/) {          if ($user=~/^($match_username)\:($match_domain)$/) {
         my ($tuname,$tudom)=($1,$2);              my ($tuname,$tudom)=($1,$2);
         my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);              my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
             foreach my $userkey (keys %{$useropt}) {              foreach my $userkey (keys(%{$useropt})) {
         if ($userkey=~/^$env{'request.course.id'}/) {                  if ($userkey=~/^\Q$env{'request.course.id'}\E/) {
                     my $newkey=$userkey;                      my $newkey=$userkey;
             $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;                      $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
             $$resourcedata{$newkey}=$$useropt{$userkey};                      $$resourcedata{$newkey}=$$useropt{$userkey};
         }                  }
               }
         }          }
     }      }
     }  
     if (wantarray) {      if (wantarray) {
         return ($resourcedata,$classlist);          return ($resourcedata,$classlist);
     } else {      } else {
Line 3052  sub storedata { Line 3209  sub storedata {
     if ($key =~ /^form\.([a-z]+)\_(.+)$/) {      if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
         my $cmd=$1;          my $cmd=$1;
         my $thiskey=$2;          my $thiskey=$2;
           next if ($cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');
         my ($tuname,$tudom)=&extractuser($thiskey);          my ($tuname,$tudom)=&extractuser($thiskey);
         my $tkey=$thiskey;          my $tkey=$thiskey;
             if ($tuname) {              if ($tuname) {
         $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;          $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
         }          }
         if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {          if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
         my ($data, $typeof, $text, $name, $valchk);          my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);
         if ($cmd eq 'set') {          if ($cmd eq 'set') {
             $data=$env{$key};              $data=$env{$key};
               $valmatch = '';
             $valchk = $data;              $valchk = $data;
             $typeof=$env{'form.typeof_'.$thiskey};              $typeof=$env{'form.typeof_'.$thiskey};
             $text = &mt('Saved modified parameter for');              $text = &mt('Saved modified parameter for');
Line 3068  sub storedata { Line 3227  sub storedata {
                 $name = 'type';                  $name = 'type';
             } elsif ($typeof eq 'string_lenient') {              } elsif ($typeof eq 'string_lenient') {
                 $name = 'lenient';                  $name = 'lenient';
                   my $stringmatch = &standard_string_matches($typeof);
                   if (ref($stringmatch) eq 'ARRAY') {
                       foreach my $item (@{$stringmatch}) {
                           if (ref($item) eq 'ARRAY') {
                               my ($regexpname,$pattern) = @{$item};
                               if ($pattern ne '') {
                                   if ($data =~ /$pattern/) {
                                       $valmatch = $regexpname;
                                       $valchk = '';
                                       last;
                                   }
                               }
                           }
                       }
                   }
             } elsif ($typeof eq 'string_discussvote') {              } elsif ($typeof eq 'string_discussvote') {
                 $name = 'discussvote';                  $name = 'discussvote';
             } elsif ($typeof eq 'string_examcode') {              } elsif ($typeof eq 'string_examcode') {
Line 3101  sub storedata { Line 3275  sub storedata {
             }              }
         } elsif ($cmd eq 'dateinterval') {          } elsif ($cmd eq 'dateinterval') {
             $data=&get_date_interval_from_form($thiskey);              $data=&get_date_interval_from_form($thiskey);
               if ($thiskey =~ /\.interval$/) {
                   $name = 'interval';
                   my $intervaltype = &get_intervaltype($name);
                   my $intervalmatch = &standard_interval_matches($intervaltype);
                   if (ref($intervalmatch) eq 'ARRAY') {
                       foreach my $item (@{$intervalmatch}) {
                           if (ref($item) eq 'ARRAY') {
                               my ($regexpname,$pattern) = @{$item};
                               if ($pattern ne '') {
                                   if ($data =~ /$pattern/) {
                                       $valmatch = $regexpname;
                                       $valchk = '';
                                       last;
                                   }
                               }
                           }
                       }
                   }
               }
             $typeof=$env{'form.typeof_'.$thiskey};              $typeof=$env{'form.typeof_'.$thiskey};
             $text = &mt('Saved modified date for');              $text = &mt('Saved modified date for');
         }          }
         if ($name ne '') {          if ($thiskey =~ m{\.(?:sequence|page)___\(rec\)}) {
               $namematch = 'maplevelrecurse';
           }
           if (($name ne '') || ($namematch ne '')) {
             my ($needsrelease,$needsnewer);              my ($needsrelease,$needsnewer);
             $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk"};              if ($name ne '') {
             if ($needsrelease) {                  $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk:$valmatch:"};
                 unless ($got_chostname) {                  if ($needsrelease) {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                      unless ($got_chostname) {
                     $got_chostname = 1;                          ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                           $got_chostname = 1;
                       }
                       $needsnewer = &parameter_releasecheck($name,$valchk,$valmatch,undef,
                                                             $needsrelease,
                                                             $cmajor,$cminor);
                 }                  }
                 $needsnewer = &parameter_releasecheck($name,$valchk,              }
                                                       $needsrelease,              if ($namematch ne '') {
                                                       $cmajor,$cminor);  
                 if ($needsnewer) {                  if ($needsnewer) {
                     $r->print('<br />'.&oldversion_warning($name,$data,                      undef($namematch);
                                                            $chostname,$cmajor,                  } else {
                                                            $cminor,$needsrelease));                      my $currneeded;
                     next;                      if ($needsrelease) {
                           $currneeded = $needsrelease;
                       }
                       $needsrelease =
                           $Apache::lonnet::needsrelease{"parameter::::$namematch"};
                       if (($needsrelease) && (($currneeded eq '') || ($needsrelease < $currneeded))) {
                           unless ($got_chostname) {
                               ($chostname,$cmajor,$cminor) = &parameter_release_vars();
                               $got_chostname = 1;
                           }
                           $needsnewer = &parameter_releasecheck(undef,$valchk,$valmatch,$namematch,
                                                                 $needsrelease,$cmajor,$cminor);
                       } else {
                           undef($namematch);
                       }
                 }                  }
             }              }
               if ($needsnewer) {
                   $r->print('<br />'.&oldversion_warning($name,$namematch,$data,
                                                          $chostname,$cmajor,
                                                          $cminor,$needsrelease));
                   next;
               }
         }          }
         if (defined($data) and $$olddata{$thiskey} ne $data) {          if (defined($data) and $$olddata{$thiskey} ne $data) {
             if ($tuname) {              if ($tuname) {
Line 3159  sub storedata { Line 3379  sub storedata {
     }      }
 # Store all course level  # Store all course level
     my $delentries=$#deldata+1;      my $delentries=$#deldata+1;
     my @newdatakeys=keys %newdata;      my @newdatakeys=keys(%newdata);
     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') {
Line 3210  sub parse_listdata_key { Line 3430  sub parse_listdata_key {
 }  }
   
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;      my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;
       
 # Start list output  # Start list output
   
     my $oldsection='';      my $oldsection='';
Line 3220  sub listdata { Line 3441  sub listdata {
     $tableopen=0;      $tableopen=0;
     my $foundkeys=0;      my $foundkeys=0;
     my %keyorder=&standardkeyorder();      my %keyorder=&standardkeyorder();
     my $readonlyall = $readonly;  
   
     my ($secidx,%grouphash);      my ($secidx,%grouphash);
     if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {      if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
Line 3228  sub listdata { Line 3448  sub listdata {
         if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {          if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
             %grouphash = &Apache::longroup::coursegroups();              %grouphash = &Apache::longroup::coursegroups();
         } elsif ($env{'request.course.groups'} ne '') {          } elsif ($env{'request.course.groups'} ne '') {
             map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});              map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
         }          }
     }      }
   
Line 3271  sub listdata { Line 3491  sub listdata {
     }      }
   
     $result;      $result;
     } keys %{$listdata}) {      } keys(%{$listdata})) {
   
       my $readonly;
     if ($$listdata{$thiskey.'.type'}) {      if ($$listdata{$thiskey.'.type'}) {
         my $thistype=$$listdata{$thiskey.'.type'};          my $thistype=$$listdata{$thiskey.'.type'};
         if ($$resourcedata{$thiskey.'.type'}) {          if ($$resourcedata{$thiskey.'.type'}) {
Line 3281  sub listdata { Line 3502  sub listdata {
         my ($middle,$part,$name)=          my ($middle,$part,$name)=
         ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);          ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
         my $section=&mt('All Students');          my $section=&mt('All Students');
         $readonly = $readonlyall;  
         my $userscope;  
         my $showval = $$resourcedata{$thiskey};  
         if ($middle=~/^\[(.*)\]/) {          if ($middle=~/^\[(.*)\]/) {
             my $issection=$1;              my $issection=$1;
             if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {              if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
Line 3291  sub listdata { Line 3509  sub listdata {
                 if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {                  if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
                     if (ref($classlist) eq 'HASH') {                      if (ref($classlist) eq 'HASH') {
                         if (ref($classlist->{$stuname.':'.$studom}) eq 'ARRAY') {                          if (ref($classlist->{$stuname.':'.$studom}) eq 'ARRAY') {
                             next unless ($classlist->{$stuname.':'.$studom}->[$secidx] eq $env{'request.course.sec'});                              next unless ($classlist->{$stuname.':'.$studom}->[$secidx] eq $env{'request.course.sec'}); 
                         }                          }
                     }                      }
                 }                  }
                 $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);                  $section=&mt('User').": ".&Apache::loncommon::plainname($stuname,$studom);
                 $userscope = 1;  
             } else {              } else {
                 if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {                  if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
                     if (exists($grouphash{$issection})) {                      if (exists($grouphash{$issection})) {
Line 3304  sub listdata { Line 3521  sub listdata {
                     } elsif ($issection eq $env{'request.course.sec'}) {                      } elsif ($issection eq $env{'request.course.sec'}) {
                         $section = &mt('Section').': '.$issection;                          $section = &mt('Section').': '.$issection;
                     } else {                      } else {
                         next;                          next; 
                     }                      }
                 } else {                  } else {
                     $section=&mt('Group/Section').': '.$issection;                      $section=&mt('Group/Section').': '.$issection;
Line 3317  sub listdata { Line 3534  sub listdata {
         $middle=~s/\.+$//;          $middle=~s/\.+$//;
         $middle=~s/^\.+//;          $middle=~s/^\.+//;
         my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';          my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
           if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {
         if ($middle=~/^(.+)\_\_\_\(all\)$/) {              my $mapurl = $1;
         $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';              my $maplevel = $2;
               my $leveltitle = &mt('Folder/Map');
               if ($maplevel eq 'rec') {
                   $leveltitle = &mt('Recursive');
               }
               $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';
         } elsif ($middle) {          } elsif ($middle) {
         my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);          my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
         next if (($url =~ /\.(page|sequence)$/) && ($parmlev eq 'full') && ($caller eq 'newoverview'));  
         $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';          $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';
         }          }
         if ($sortorder eq 'realmstudent') {          if ($sortorder eq 'realmstudent') {
Line 3362  sub listdata { Line 3583  sub listdata {
               '<td><b>'.&mt($parmitem).                '<td><b>'.&mt($parmitem).
               '</b></td>');                '</b></td>');
         unless ($readonly) {          unless ($readonly) {
             my $disabled;  
             if (($name eq 'availablestudent') &&  
                 (($showval eq '') || ($userscope))) {  
                 $disabled = ' disabled="disabled"';  
             }  
             $r->print('<td><input type="checkbox" name="del_'.              $r->print('<td><input type="checkbox" name="del_'.
                       $thiskey.'"'.$disabled.' /></td>');                        $thiskey.'" /></td>');
         }          }
         $r->print('<td>');          $r->print('<td>');
         $foundkeys++;          $foundkeys++;
Line 3384  sub listdata { Line 3600  sub listdata {
                                                     $jskey,                                                      $jskey,
                                                     $$resourcedata{$thiskey},                                                      $$resourcedata{$thiskey},
                                                     '',1,$state));                                                      '',1,$state));
             unless ($readonly) {              unless  ($readonly) {
                 $r->print(                  $r->print(
 '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.  '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
 (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.  (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
 &mt('Shift all dates based on this date').'</a></span>':'').  &mt('Shift all dates based on this date').'</a></span>':'').
 &date_sanity_info($$resourcedata{$thiskey})  &date_sanity_info($$resourcedata{$thiskey})
               );                  );
             }              }
         } elsif ($thistype eq 'date_interval') {          } elsif ($thistype eq 'date_interval') {
             $r->print(&date_interval_selector($thiskey,              $r->print(&date_interval_selector($thiskey,$name,
                       $$resourcedata{$thiskey},$readonly));                        $$resourcedata{$thiskey},$readonly));
         } elsif ($thistype =~ m/^string/) {          } elsif ($thistype =~ m/^string/) {
             if ($name eq 'availablestudent') {  
                 $readonly = 1;  
             }  
             $r->print(&string_selector($thistype,$thiskey,              $r->print(&string_selector($thistype,$thiskey,
                       $$resourcedata{$thiskey},$name,$readonly));                        $$resourcedata{$thiskey},$name,$readonly));
         } else {          } else {
Line 3414  sub listdata { Line 3627  sub listdata {
     return $foundkeys;      return $foundkeys;
 }  }
   
   
 sub date_interval_selector {  
     my ($thiskey, $showval, $readonly) = @_;  
     my $result;  
     my $currval = $showval;  
     foreach my $which (['days', 86400, 31],  
                ['hours', 3600, 23],  
                ['minutes', 60, 59],  
                ['seconds',  1, 59]) {  
         my ($name, $factor, $max) = @{ $which };  
         my $amount = int($showval/$factor);  
         $showval  %= $factor;  
         my %select = ((map {$_ => $_} (0..$max)),  
                       'select_form_order' => [0..$max]);  
         if ($currval eq '') {  
             unshift(@{$select{'select_form_order'}},'');  
             $select{''} = '';  
             $amount = '';  
         }  
         $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,  
                                                    \%select,'',$readonly);  
         $result .= ' '.&mt($name);  
     }  
     unless ($readonly) {  
         $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';  
     }  
     return $result;  
   
 }  
   
 sub get_date_interval_from_form {  sub get_date_interval_from_form {
     my ($key) = @_;      my ($key) = @_;
     my $seconds = 0;      my $seconds = 0;
     my $numnotnull = 0;  
     foreach my $which (['days', 86400],      foreach my $which (['days', 86400],
                ['hours', 3600],                 ['hours', 3600],
                ['minutes', 60],                 ['minutes', 60],
                ['seconds',  1]) {                 ['seconds',  1]) {
         my ($name, $factor) = @{ $which };      my ($name, $factor) = @{ $which };
         if (defined($env{'form.'.$name.'_'.$key})) {      if (defined($env{'form.'.$name.'_'.$key})) {
             unless ($env{'form.'.$name.'_'.$key} eq '') {          $seconds += $env{'form.'.$name.'_'.$key} * $factor;
                 $numnotnull ++;      }
                 $seconds += $env{'form.'.$name.'_'.$key} * $factor;      }
       if (($key =~ /\.interval$/) && (($env{'form.done_'.$key} eq '_done') || ($env{'form.done_'.$key} eq '_done_proctor'))) {
           if ($env{'form.done_'.$key.'_buttontext'}) {
               $env{'form.done_'.$key.'_buttontext'} =~ s/\://g;
               $seconds .= '_done:'.$env{'form.done_'.$key.'_buttontext'}.':';
               if ($env{'form.done_'.$key} eq '_done_proctor') {
                   $seconds .= '_proctor';
             }              }
           } else {
               $seconds .= $env{'form.done_'.$key}; 
           }
           if (($env{'form.done_'.$key} eq '_done_proctor') && 
               ($env{'form.done_'.$key.'_proctorkey'})) {
               $seconds .= '_'.$env{'form.done_'.$key.'_proctorkey'};
         }          }
     }      }
     return if (!$numnotnull);  
     return $seconds;      return $seconds;
 }  }
   
Line 3474  sub default_selector { Line 3667  sub default_selector {
     return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' />';      return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' />';
 }  }
   
   sub string_ip_selector {
       my ($thiskey, $showval, $readonly) = @_;
       my %access = (
                      allow => [],
                      deny  => [],
                    );
       if ($showval ne '') {
           my @current;
           if ($showval =~ /,/) {
               @current = split(/,/,$showval);
           } else {
               @current = ($showval);
           }
           foreach my $item (@current) {
               if ($item =~ /^\!([\[\]a-zA-Z\.\d\*\-]+)$/) {
                   push(@{$access{'deny'}},$1);
               } elsif ($item =~ /^([\[\]a-zA-Z\.\d\*\-]+)$/) {
                   push(@{$access{'allow'}},$item);
               }
           }
       }
       if (!@{$access{'allow'}}) {
           @{$access{'allow'}} = ('');
       }
       if (!@{$access{'deny'}}) {
           @{$access{'deny'}} = ('');
       }
       my ($disabled,$addmore);
       if ($disabled) {
           $disabled=' disabled="disabled"';
       } else {
           $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';
       }
       my $output = '<input type="hidden" name="set_'.$thiskey.'" />
   <table><tr><th>'.&mt('Allow from').'</th><th>'.&mt('Deny from').'</th></tr><tr>';
       foreach my $acctype ('allow','deny') {
           $output .= '
   <td valign="top">
   <div class="LC_string_ipacc_wrap" id="LC_string_ipacc_'.$acctype.'_'.$thiskey.'">
     <div class="LC_string_ipacc_inner">'."\n";
           my $num = 0;
           foreach my $curr (@{$access{$acctype}}) {
               $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' />';
               if ($num > 0) {
                   $output .= '<a href="#" class="LC_remove_ipacc">'.&mt('Remove').'</a>'; 
               }
               $output .= '</div>'."\n";
               $num ++;
           }
           $output .= '
     </div>'.$addmore.'
   </div>
   </td>';
      }
      $output .= '
   </tr>
   </table>'."\n";
       return $output;
   }
   
   {
 my %strings =  my %strings =
     (      (
      'string_yesno'       'string_yesno'
Line 3488  my %strings = Line 3742  my %strings =
              => [[ 'problem', 'Standard Problem'],               => [[ 'problem', 'Standard Problem'],
                  [ 'survey', 'Survey'],                   [ 'survey', 'Survey'],
                  [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],                   [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],
                  [ 'exam', 'Exam'],                   [ 'exam', 'Bubblesheet Exam'],
                  [ 'anonsurvey', 'Anonymous Survey'],                   [ 'anonsurvey', 'Anonymous Survey'],
                  [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],                   [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],
                  [ 'practice', 'Practice'],                   [ 'practice', 'Practice'],
Line 3496  my %strings = Line 3750  my %strings =
      'string_lenient'       'string_lenient'
              => [['yes', 'Yes' ],               => [['yes', 'Yes' ],
                  [ 'no', 'No' ],                   [ 'no', 'No' ],
                  [ 'default', 'Default - only bubblesheet grading is lenient' ]],                   [ 'default', 'Default - only bubblesheet grading is lenient' ],
                    [ 'weighted', 'Yes, weighted (optionresponse in checkbox mode)' ]],
      'string_discussvote'       'string_discussvote'
              => [['yes','Yes'],               => [['yes','Yes'],
                  ['notended','Yes, unless discussion ended'],                   ['notended','Yes, unless discussion ended'],
                  ['no','No']],                   ['no','No']],
        'string_ip'
                => [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],
                    ['_denyfrom_',], 'Hostname(s) or IP(s) from which access is disallowed'], 
      );       );
   
   my %stringmatches = (
            'string_lenient'
                 => [['weighted','^\-?[.\d]+,\-?[.\d]+,\-?[.\d]+,\-?[.\d]+$'],],
            'string_ip'
                 => [['_allowfrom_','[^\!]+'],
                     ['_denyfrom_','\!']],
       );
   
   my %stringtypes = (
                       type         => 'string_questiontype',
                       lenient      => 'string_lenient',
                       retrypartial => 'string_yesno',
                       discussvote  => 'string_discussvote',
                       examcode     => 'string_examcode',
                       acc          => 'string_ip',
                     );
   
 sub standard_string_options {  sub standard_string_options {
     my ($string_type) = @_;      my ($string_type) = @_;
     if (ref($strings{$string_type}) eq 'ARRAY') {      if (ref($strings{$string_type}) eq 'ARRAY') {
Line 3511  sub standard_string_options { Line 3786  sub standard_string_options {
     return;      return;
 }  }
   
   sub standard_string_matches {
       my ($string_type) = @_;
       if (ref($stringmatches{$string_type}) eq 'ARRAY') {
           return $stringmatches{$string_type};
       }
       return;
   }
   
   sub get_stringtype {
       my ($name) = @_;
       if (exists($stringtypes{$name})) {
           return $stringtypes{$name};
       }
       return;
   }
   
 sub string_selector {  sub string_selector {
     my ($thistype, $thiskey, $showval, $name, $readonly) = @_;      my ($thistype, $thiskey, $showval, $name, $readonly) = @_;
   
     if (!exists($strings{$thistype})) {      if (!exists($strings{$thistype})) {
     return &default_selector($thiskey,$showval,$readonly);          return &default_selector($thiskey,$showval,$readonly);
     }      }
   
     my %skiptype;      my %skiptype;
     if (($thistype eq 'string_questiontype') ||       if (($thistype eq 'string_questiontype') || 
         ($thistype eq 'string_lenient') ||          ($thistype eq 'string_lenient') ||
         ($thistype eq 'string_discussvote') ||          ($thistype eq 'string_discussvote') ||
           ($thistype eq 'string_ip') ||
         ($name eq 'retrypartial')) {          ($name eq 'retrypartial')) {
         my ($got_chostname,$chostname,$cmajor,$cminor);           my ($got_chostname,$chostname,$cmajor,$cminor); 
         foreach my $possibilities (@{ $strings{$thistype} }) {          foreach my $possibilities (@{ $strings{$thistype} }) {
             next unless (ref($possibilities) eq 'ARRAY');              next unless (ref($possibilities) eq 'ARRAY');
             my ($parmval, $description) = @{ $possibilities };              my ($parmval, $description) = @{ $possibilities };
             my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval"};              my $parmmatch;
               if (ref($stringmatches{$thistype}) eq 'ARRAY') {
                   foreach my $item (@{$stringmatches{$thistype}}) {
                       if (ref($item) eq 'ARRAY') {
                           if ($parmval eq $item->[0]) {
                               $parmmatch = $parmval;
                               $parmval = '';
                               last;
                           }
                       }
                   }
               }
               my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval:$parmmatch"}; 
             if ($needsrelease) {              if ($needsrelease) {
                 unless ($got_chostname) {                  unless ($got_chostname) {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                      ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                     $got_chostname = 1;                      $got_chostname = 1;
                 }                  }
                 my $needsnewer=&parameter_releasecheck($name,$parmval,$needsrelease,                  my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,undef,
                                                        $cmajor,$cminor);                                                         $needsrelease,$cmajor,$cminor);
                 if ($needsnewer) {                  if ($needsnewer) {
                     $skiptype{$parmval} = 1;                      if ($parmmatch ne '') {
                           $skiptype{$parmmatch} = 1;
                       } elsif ($parmval ne '') {
                           $skiptype{$parmval} = 1;
                       }
                 }                  }
             }              }
         }          }
     }      }
    
       if ($thistype eq 'string_ip') {
           return &string_ip_selector($thiskey,$showval,$readonly); 
       }
   
     my ($result,$disabled);      my ($result,$disabled);
   
     if ($readonly) {      if ($readonly) {
Line 3561  sub string_selector { Line 3873  sub string_selector {
         foreach my $possibilities (@{ $strings{$thistype} }) {          foreach my $possibilities (@{ $strings{$thistype} }) {
             next unless (ref($possibilities) eq 'ARRAY');              next unless (ref($possibilities) eq 'ARRAY');
             my ($name, $description) = @{ $possibilities };              my ($name, $description) = @{ $possibilities };
             next if ($skiptype{$name});               next if ($skiptype{$name});
             $rem = $i%($numinrow);              $rem = $i%($numinrow);
             if ($rem == 0) {              if ($rem == 0) {
                 if ($i > 0) {                  if ($i > 0) {
Line 3569  sub string_selector { Line 3881  sub string_selector {
                 }                  }
                 $result .= '<tr>';                  $result .= '<tr>';
             }              }
             $result .= '<td class="LC_left_item">'.              my $colspan;
               if ($i == @{ $strings{$thistype} }-1) {
                   $rem = @{ $strings{$thistype} }%($numinrow);
                   if ($rem) {
                       my $colsleft = $numinrow - $rem;
                       if ($colsleft) {
                           $colspan = $colsleft+1;
                           $colspan = ' colspan="'.$colspan.'"';
                       }
                   }
               }
               my ($add,$onchange,$css_class);
               if ($thistype eq 'string_lenient') {
                   if ($name eq 'weighted') {
                       my $display;
                       my %relatives = &Apache::lonlocal::texthash(
                                           corrchkd     => 'Correct (checked)',
                                           corrunchkd   => 'Correct (unchecked)',
                                           incorrchkd   => 'Incorrect (checked)',
                                           incorrunchkd => 'Incorrect (unchecked)',
                       );
                       my %textval = (
                                       corrchkd     => '1.0',
                                       corrunchkd   => '1.0',
                                       incorrchkd   => '0.0',
                                       incorrunchkd => '0.0',
                       );
                       if ($showval =~ /^([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)$/) {
                           $textval{'corrchkd'} = $1;
                           $textval{'corrunchkd'} = $2;
                           $textval{'incorrchkd'} = $3;
                           $textval{'incorrunchkd'} = $4;
                           $display = 'inline';
                           $showval = $name;
                       } else {
                           $display = 'none';
                       }
                       $add = ' <div id="LC_parmtext_'.$thiskey.'" style="display:'.$display.'"><table>'.
                              '<tr><th colspan="2">'.&mt("Foil's submission status").'</th><th>'.&mt('Points').'</th></tr>';  
                       foreach my $reltype ('corrchkd','corrunchkd','incorrchkd','incorrunchkd') {
                           $add .= '<tr><td>&nbsp;</td><td>'.$relatives{$reltype}.'</td>'."\n".
                                   '<td><input type="text" name="settext_'.$thiskey.'"'.
                                   ' value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'.
                                   '</td></tr>';
                       }
                       $add .= '</table></div>'."\n";
                   }
                   $onchange = ' onclick="javascript:toggleParmTextbox(this.form,'."'$thiskey'".');"';
                   $css_class = ' class="LC_lenient_radio"';
               }
               $result .= '<td class="LC_left_item"'.$colspan.'>'.
                        '<span class="LC_nobreak"><label>'.                         '<span class="LC_nobreak"><label>'.
                        '<input type="radio" name="set_'.$thiskey.                         '<input type="radio" name="set_'.$thiskey.
                        '" value="'.$name.'"'.$disabled;                         '" value="'.$name.'"'.$onchange.$css_class.$disabled;
             if ($showval eq $name) {              if ($showval eq $name) {
                 $result .= ' checked="checked"';                  $result .= ' checked="checked"';
             }              }
             $result .= ' />'.&mt($description).'</label></span></td>';              $result .= ' />'.&mt($description).'</label>'.$add.'</span></td>';
             $i++;              $i++;
         }          }
         $rem = @{ $strings{$thistype} }%($numinrow);  
         my $colsleft = $numinrow - $rem;  
         if ($colsleft > 1 ) {  
             $result .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.  
                        '&nbsp;</td>';  
         } elsif ($colsleft == 1) {  
             $result .= '<td class="LC_left_item">&nbsp;</td>';  
         }  
         $result .= '</tr>';          $result .= '</tr>';
     }      }
     if ($result) {      if ($result) {
Line 3595  sub string_selector { Line 3949  sub string_selector {
     return $result;      return $result;
 }  }
   
   my %intervals =
       (
        'date_interval'
                => [[ 'done', 'Yes' ],
                    [ 'done_proctor', 'Yes, with proctor key'],                  
                    [ '', 'No' ]],
       );
   
   my %intervalmatches = (
            'date_interval'
                 => [['done','\d+_done(|\:[^\:]+\:)$'],
                     ['done_proctor','\d+_done(|\:[^\:]+\:)_proctor_']],
       );
   
   my %intervaltypes = (
                         interval => 'date_interval',
       );
   
   sub standard_interval_matches {
       my ($interval_type) = @_;
       if (ref($intervalmatches{$interval_type}) eq 'ARRAY') {
           return $intervalmatches{$interval_type};
       }
       return;
   }
   
   sub get_intervaltype {
       my ($name) = @_;
       if (exists($intervaltypes{$name})) {
           return $intervaltypes{$name};
       }
       return;
   }
   
   sub standard_interval_options {
       my ($interval_type) = @_;
       if (ref($intervals{$interval_type}) eq 'ARRAY') {
           return $intervals{$interval_type};
       }
       return;
   }
   
   sub date_interval_selector {
       my ($thiskey, $name, $showval, $readonly) = @_;
       my ($result,%skipval);
       if ($name eq 'interval') {
           my $intervaltype = &get_intervaltype($name);
           my ($got_chostname,$chostname,$cmajor,$cminor);
           foreach my $possibilities (@{ $intervals{$intervaltype} }) {
               next unless (ref($possibilities) eq 'ARRAY');
               my ($parmval, $description) = @{ $possibilities };
               my $parmmatch;
               if (ref($intervalmatches{$intervaltype}) eq 'ARRAY') {
                   foreach my $item (@{$intervalmatches{$intervaltype}}) {
                       if (ref($item) eq 'ARRAY') {
                           if ($parmval eq $item->[0]) {
                               $parmmatch = $parmval;
                               $parmval = '';
                               last;
                           }
                       }
                   }
               }
               my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval:$parmmatch"};
               if ($needsrelease) {
                   unless ($got_chostname) {
                       ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                       $got_chostname = 1;
                   }
                   my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,undef,
                                                          $needsrelease,$cmajor,$cminor);
                   if ($needsnewer) {
                       if ($parmmatch ne '') {
                           $skipval{$parmmatch} = 1;
                       } elsif ($parmval ne '') {
                           $skipval{$parmval} = 1;
                       }
                   }
               }
           }
       }
   
       my $currval = $showval;
       foreach my $which (['days', 86400, 31],
                  ['hours', 3600, 23],
                  ['minutes', 60, 59],
                  ['seconds',  1, 59]) {
       my ($name, $factor, $max) = @{ $which };
       my $amount = int($showval/$factor);
       $showval  %= $factor;
       my %select = ((map {$_ => $_} (0..$max)),
                 'select_form_order' => [0..$max]);
       $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                              \%select,'',$readonly);
       $result .= ' '.&mt($name);
       }
       if ($name eq 'interval') {
           unless ($skipval{'done'}) {
               my $checkedon = '';
               my $checkedproc = '';
               my $currproctorkey = '';
               my $currprocdisplay = 'hidden';
               my $currdonetext = &mt('Done');
               my $checkedoff = ' checked="checked"';
               if ($currval =~ /^(?:\d+)_done$/) {
                   $checkedon = ' checked="checked"';
                   $checkedoff = '';
               } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {
                   $currdonetext = $1;
                   $checkedon = ' checked="checked"';
                   $checkedoff = '';
               } elsif ($currval =~ /^(?:\d+)_done_proctor_(.+)$/) {
                   $currproctorkey = $1;
                   $checkedproc = ' checked="checked"';
                   $checkedoff = '';
                   $currprocdisplay = 'text';
               } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:_proctor_(.+)$/) {
                   $currdonetext = $1;
                   $currproctorkey = $2;
                   $checkedproc = ' checked="checked"';
                   $checkedoff = '';
                   $currprocdisplay = 'text';
               }
               my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
               $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').
                          '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.' />'.
                          &mt('No').'</label>'.('&nbsp;'x2).
                          '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.' />'.
                          &mt('Yes').'</label>'.('&nbsp;'x2).
                          '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.' />'.
                          &mt('Yes, with proctor key').'</label>'.
                          '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
                          'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'" /></span><br />'.
                          '<span class="LC_nobreak">'.&mt('Button text').': '.
                          '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'" /></span>';
           }
       }
       unless ($readonly) {
           $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
       }
       return $result;
   }
   
   sub oldversion_warning {
       my ($name,$namematch,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
       my $standard_name = &standard_parameter_names($name);
       if ($namematch) {
           my $level = &standard_parameter_levels($namematch);
           my $msg = '';
           if ($level) {
               $msg = &mt('[_1] was [_2]not[_3] set at the level of: [_4].',
                          $standard_name,'<b>','</b>','"'.$level.'"');
           } else {
               $msg = &mt('[_1] was [_2]not[_3] set.',
                         $standard_name,'<b>','</b>');
           }
           return '<p class="LC_warning">'.$msg.'<br />'.
                  &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
                      $cmajor.'.'.$cminor,$chostname,
                      $needsrelease).
                      '</p>';
       }
       my $desc;
       my $stringtype = &get_stringtype($name);
       if ($stringtype ne '') {
           if ($name eq 'examcode') {
               $desc = $value;
           } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
               foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
                   next unless (ref($possibilities) eq 'ARRAY');
                   my ($parmval, $description) = @{ $possibilities };
                   my $parmmatch;
                   if (ref($stringmatches{$stringtypes{$name}}) eq 'ARRAY') {
                       foreach my $item (@{$stringmatches{$stringtypes{$name}}}) {
                           if (ref($item) eq 'ARRAY') {
                               my ($regexpname,$pattern) = @{$item};
                               if ($parmval eq $regexpname) {
                                   if ($value =~ /$pattern/) {
                                       $desc = $description; 
                                       $parmmatch = 1;
                                       last;
                                   }
                               }
                           }
                       }
                       last if ($parmmatch);
                   } elsif ($parmval eq $value) {
                       $desc = $description;
                       last;
                   }
               }
           }
       } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) {
           my $now = time;
           if ($value =~ /^\d+$/) {
               if ($name eq 'printstartdate') {
                   if ($value > $now) {
                       $desc = &Apache::lonlocal::locallocaltime($value);
                   }
               } elsif ($name eq 'printenddate') {
                   if ($value < $now) {
                       $desc = &Apache::lonlocal::locallocaltime($value);
                   }
               }
           }
       }
       return '<p class="LC_warning">'.
          &mt('[_1] was [_2]not[_3] set to [_4].',
              $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.
          &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
          $cmajor.'.'.$cminor,$chostname,
          $needsrelease).
          '</p>';
   }
   
   }
   
 #  #
 # Shift all start and end dates by $shift  # Shift all start and end dates by $shift
 #  #
   
 sub dateshift {  sub dateshift {
     my ($shift,$numchanges)=@_;      my ($shift)=@_;
     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 $sec = $env{'request.course.sec'};  
     my $secgrpregex;  
     if ($sec ne '') {  
         my @groups;  
         if ($env{'request.course.groups'} ne '') {  
             @groups = split(/:/,$env{'request.course.groups'});  
         }  
         if (@groups) {  
             $secgrpregex = '(?:'.join('|',($sec,@groups)).')';  
         } else {  
             $secgrpregex = $sec;  
         }  
     }  
     my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);      my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
 # ugly retro fix for broken version of types  # ugly retro fix for broken version of types
     foreach my $key (keys %data) {      foreach my $key (keys(%data)) {
         if ($key=~/\wtype$/) {          if ($key=~/\wtype$/) {
             my $newkey=$key;              my $newkey=$key;
             $newkey=~s/type$/\.type/;              $newkey=~s/type$/\.type/;
Line 3628  sub dateshift { Line 4186  sub dateshift {
     }      }
     my %storecontent=();      my %storecontent=();
 # go through all parameters and look for dates  # go through all parameters and look for dates
     foreach my $key (keys %data) {      foreach my $key (keys(%data)) {
        if ($data{$key.'.type'}=~/^date_(start|end)$/) {         if ($data{$key.'.type'}=~/^date_(start|end)$/) {
           if ($sec ne '') {  
               next unless ($key =~ /^$env{'request.course.id'}\.\[$secgrpregex\]\./);  
           }  
           my $newdate=$data{$key}+$shift;            my $newdate=$data{$key}+$shift;
           $$numchanges ++;  
           $storecontent{$key}=$newdate;            $storecontent{$key}=$newdate;
        }         }
     }      }
Line 3648  sub dateshift { Line 4202  sub dateshift {
 }  }
   
 sub newoverview {  sub newoverview {
     my ($r,$parm_permission) = @_;      my ($r) = @_;
   
     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 $readonly = 1;      my $crstype =  $env{'course.'.$env{'request.course.id'}.'.type'};
     if ($parm_permission->{'edit'}) {  
         undef($readonly);  
     }  
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
         text=>"Overview Mode"});          text=>"Overview Mode"});
   
     my %loaditems = (      my %loaditems = (
                       'onload'   => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1');",                        'onload'   => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1'); showHideLenient();",
                     );                      );
     my $js = '      my $js = '
 <script type="text/javascript">  <script type="text/javascript">
Line 3668  sub newoverview { Line 4219  sub newoverview {
 '.  '.
             &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".              &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".
             &showhide_js()."\n".              &showhide_js()."\n".
               &toggleparmtextbox_js()."\n".
               &validateparms_js()."\n".
               &ipacc_boxes_js()."\n".
               &done_proctor_js()."\n".
 '// ]]>  '// ]]>
 </script>  </script>
 ';  ';
   
     my $start_page = &Apache::loncommon::start_page('Set Parameters',$js,      my $start_page = &Apache::loncommon::start_page('Set Parameters',$js,
                                                     {'add_entries' => \%loaditems,});                                                      {'add_entries' => \%loaditems,});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDOVER);      $r->print(<<ENDOVER);
 <form method="post" action="/adm/parmset?action=newoverview" name="parmform">  <form method="post" action="/adm/parmset?action=newoverview" name="parmform" onsubmit="return validateParms();">
 ENDOVER  ENDOVER
     my @ids=();      my @ids=();
     my %typep=();      my %typep=();
Line 3703  ENDOVER Line 4260  ENDOVER
     my $pschp=$env{'form.pschp'};      my $pschp=$env{'form.pschp'};
   
     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');      my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
     if (!@psprt) { $psprt[0]='0'; }      if (!@psprt) { $psprt[0]='all'; }
   
     my @selected_sections =      my @selected_sections =
     &Apache::loncommon::get_env_multiple('form.Section');      &Apache::loncommon::get_env_multiple('form.Section');
Line 3742  ENDOVER Line 4299  ENDOVER
     $r->print('<div>');      $r->print('<div>');
     $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));      $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
     &levelmenu($r,\%alllevs,$parmlev);      &levelmenu($r,\%alllevs,$parmlev);
     $r->print(&Apache::lonhtmlcommon::row_closure());      if ($parmlev ne 'general') {
     &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);          $r->print(&Apache::lonhtmlcommon::row_closure());
           &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp);
       }
     $r->print(&Apache::lonhtmlcommon::row_closure(1));      $r->print(&Apache::lonhtmlcommon::row_closure(1));
     $r->print(&Apache::lonhtmlcommon::end_pick_box());      $r->print(&Apache::lonhtmlcommon::end_pick_box());
     $r->print('</div></div>');      $r->print('</div></div>');
Line 3766  ENDOVER Line 4325  ENDOVER
     $r->print('</tr><tr><td>');      $r->print('</tr><tr><td>');
     &partmenu($r,\%allparts,\@psprt);      &partmenu($r,\%allparts,\@psprt);
     $r->print('</td>');      $r->print('</td>');
     if ($sectionselector) {      if ($sectionselector) { 
         $r->print('<td>'.$sectionselector.'</td>');          $r->print('<td>'.$sectionselector.'</td>');
     }      }
     if ($groupselector) {      if ($groupselector) {
Line 3806  ENDOVER Line 4365  ENDOVER
   
 # List data  # List data
   
         &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);          &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview');
     }  
     $r->print(&tableend());  
     unless ($readonly) {  
         $r->print(((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':''));  
     }      }
     $r->print('</form>');      $r->print(&tableend().
            ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
             '</form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 3831  sub secgroup_lister { Line 4389  sub secgroup_lister {
                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};                  $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
             } elsif ($parmlev eq 'map') {              } elsif ($parmlev eq 'map') {
 # map-level parameter  # map-level parameter
                 foreach my $mapid (keys %{$allmaps}) {                  foreach my $mapid (keys(%{$allmaps})) {
                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }                      if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;                      my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                     $$listdata{$newparmkey}=1;                      $$listdata{$newparmkey}=1;
                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};                      $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                       $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(rec).'.$part.'.'.$cat;
                       $$listdata{$newparmkey}=1;
                       $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                 }                  }
             } else {              } else {
 # resource-level parameter  # resource-level parameter
Line 3852  sub secgroup_lister { Line 4413  sub secgroup_lister {
 }  }
   
 sub overview {  sub overview {
     my ($r,$parm_permission) = @_;      my ($r) = @_;
     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 $readonly = 1;      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     if ($parm_permission->{'edit'}) {      my $js = '<script type="text/javascript">'."\n".
         undef($readonly);               '// <![CDATA['."\n".
     }               &toggleparmtextbox_js()."\n".
                &validateparms_js()."\n".
                &ipacc_boxes_js()."\n".
                &done_proctor_js()."\n".
                '// ]]>'."\n".
                '</script>'."\n";
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
     text=>"Overview Mode"});      text=>"Overview Mode"});
     my $start_page=&Apache::loncommon::start_page('Modify Parameters');      my %loaditems = (
                         'onload'   => "showHideLenient();",
                       );
   
       my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js,{'add_entries' => \%loaditems,});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
     $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform">');      &startSettingsScreen($r,'parmset',$crstype);
       $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform" onsubmit="return validateParms();">');
   
 # Store modified  # Store modified
     unless ($readonly) {  
         &storedata($r,$crs,$dom);      &storedata($r,$crs,$dom);
     }  
   
 # Read modified data  # Read modified data
   
Line 3880  sub overview { Line 4450  sub overview {
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder);
   
     my $submitbutton = '<input type="submit" value="'.&mt('Save').'" />';  
   
     if ($readonly) {  
         $r->print('<p>'.$submitbutton.'</p>');  
     }  
   
   
 # List data  # List data
   
     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly);      my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist);
       $r->print(&tableend().'<p>'.
     $r->print(&tableend().'<p>');      ($foundkeys?'<input type="submit" value="'.&mt('Save').'" />':'<span class="LC_info">'.&mt('There are no parameters.').'</span>').'</p></form>'.
     if ($foundkeys) {            &Apache::loncommon::end_page());
         unless ($readonly) {  
             $r->print('<p>'.$submitbutton.'</p>');  
         }  
     } else {  
         $r->print('<p class="LC_info">'.&mt('There are no parameters.').'</p>');  
     }  
     $r->print('</form>'.&Apache::loncommon::end_page());  
 }  }
   
 sub clean_parameters {  sub clean_parameters {
Line 3961  ENDOVER Line 4517  ENDOVER
         $r->print(&mt('All users'));          $r->print(&mt('All users'));
         } elsif ($data{'scope_type'} eq 'user') {          } elsif ($data{'scope_type'} eq 'user') {
         $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));          $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
         } elsif ($data{'scope_type'} eq 'secgroup') {          } elsif ($data{'scope_type'} eq 'section') {
         $r->print(&mt('Group/Section: [_1]',$data{'scope'}));          $r->print(&mt('Section: [_1]',$data{'scope'}));
           } elsif ($data{'scope_type'} eq 'group') {
           $r->print(&mt('Group: [_1]',$data{'scope'}));
         }          }
         $r->print('<br />');          $r->print('<br />');
         if ($data{'realm_type'} eq 'all') {          if ($data{'realm_type'} eq 'all') {
Line 3973  ENDOVER Line 4531  ENDOVER
         my ($map,$resid,$url) =          my ($map,$resid,$url) =
             &Apache::lonnet::decode_symb($data{'realm'});              &Apache::lonnet::decode_symb($data{'realm'});
         $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]',          $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]',
                   $url.' <br />&nbsp;&nbsp;&nbsp;',                        $url.' <br />&nbsp;&nbsp;&nbsp;',
                   $resid.' <br />&nbsp;&nbsp;&nbsp;',$map));                        $resid.' <br />&nbsp;&nbsp;&nbsp;',$map));
         }          }
         $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));          $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));
         $r->print('</td></tr>');          $r->print('</td></tr>');
Line 3984  ENDOVER Line 4542  ENDOVER
     $r->print(&Apache::loncommon::end_data_table().'<p>'.      $r->print(&Apache::loncommon::end_data_table().'<p>'.
           '<input type="submit" value="'.&mt('Delete Selected').'" />'.            '<input type="submit" value="'.&mt('Delete Selected').'" />'.
           '</p></form>');            '</p></form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 3991  sub date_shift_one { Line 4550  sub date_shift_one {
     my ($r) = @_;      my ($r) = @_;
     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 $sec = $env{'request.course.sec'};      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
   
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
         text=>"Shifting Dates"});          text=>"Shifting Dates"});
     my $submit_text = &mt('Shift all dates accordingly');  
     if ($sec ne '') {  
         my @groups;  
         if ($env{'request.course.groups'} ne '') {  
             @groups = split(/:/,$env{'request.course.groups'});  
         }  
         if (@groups) {  
             $submit_text = &mt("Shift dates set just for your section/group(s), accordingly");  
         } else {  
             $submit_text = &mt("Shift dates set just for your section, accordingly");  
         }  
     }  
     my $start_page=&Apache::loncommon::start_page('Shift Dates');      my $start_page=&Apache::loncommon::start_page('Shift Dates');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print('<form name="shiftform" method="post" action="">'.      $r->print('<form name="shiftform" method="post" action="">'.
               '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.                '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
               &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.                &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
Line 4020  sub date_shift_one { Line 4569  sub date_shift_one {
               '</td></tr></table>'.                '</td></tr></table>'.
               '<input type="hidden" name="action" value="dateshift2" />'.                '<input type="hidden" name="action" value="dateshift2" />'.
               '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.                '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
               '<input type="submit" value="'.$submit_text.'" /></form>');                '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 4028  sub date_shift_two { Line 4578  sub date_shift_two {
     my ($r) = @_;      my ($r) = @_;
     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 $sec = $env{'request.course.sec'};      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
         text=>"Shifting Dates"});          text=>"Shifting Dates"});
     my $start_page=&Apache::loncommon::start_page('Shift Dates');      my $start_page=&Apache::loncommon::start_page('Shift Dates');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');      my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
     $r->print('<h2>'.&mt('Shift Dates').'</h2>');      $r->print('<h2>'.&mt('Shift Dates').'</h2>'.
     if ($sec ne '') {                '<p>'.&mt('Shifting all dates such that [_1] becomes [_2]',
         my @groups;                &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
         if ($env{'request.course.groups'} ne '') {                &Apache::lonlocal::locallocaltime($timeshifted)).'</p>');
             @groups = split(/:/,$env{'request.course.groups'});  
         }  
         if (@groups) {  
             $r->print('<p>'.  
                       &mt("Shift dates set just for your section/group(s), such that [_1] becomes [_2]",  
                           &Apache::lonlocal::locallocaltime($env{'form.timebase'}),  
                           &Apache::lonlocal::locallocaltime($timeshifted)).  
                       '</p>');  
         } else {  
             $r->print('<p>'.  
                       &mt("Shift dates set just for your section, such that [_1] becomes [_2]",  
                           &Apache::lonlocal::locallocaltime($env{'form.timebase'}),  
                           &Apache::lonlocal::locallocaltime($timeshifted)).  
                       '</p>');  
         }  
     } else {  
         $r->print('<p>'.&mt('Shifting all dates such that [_1] becomes [_2]',  
                             &Apache::lonlocal::locallocaltime($env{'form.timebase'}),  
                             &Apache::lonlocal::locallocaltime($timeshifted)).  
                   '</p>');  
     }  
     my $delta=$timeshifted-$env{'form.timebase'};      my $delta=$timeshifted-$env{'form.timebase'};
     my $numchanges = 0;      &dateshift($delta);
     my $result = &dateshift($delta,\$numchanges);  
     if ($result eq 'ok') {  
         $r->print(  
             &Apache::lonhtmlcommon::confirm_success(&mt('Completed shifting of [quant,_1,date setting]',  
                                                     $numchanges)));  
     } elsif ($result eq 'con_delayed') {  
         $r->print(  
             &Apache::lonhtmlcommon::confirm_success(&mt('Queued shifting of [quant,_1,date setting]',  
                                                         $numchanges)));  
     } else {  
         $r->print(  
             &Apache::lonhtmlcommon::confirm_success(&mt('An error occurred attempting to shift dates'),1));  
     }  
     $r->print(      $r->print(
           &Apache::lonhtmlcommon::confirm_success(&mt('Done')).
         '<br /><br />'.          '<br /><br />'.
         &Apache::lonhtmlcommon::actionbox(          &Apache::lonhtmlcommon::actionbox(
             ['<a href="/adm/parmset">'.&mt('Content and Problem Settings').'</a>']));              ['<a href="/adm/parmset">'.&mt('Content and Problem Settings').'</a>']));
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 4094  sub parse_key { Line 4613  sub parse_key {
         $data{'scope_type'} = 'user';          $data{'scope_type'} = 'user';
         $data{'scope'} = [$1,$2];          $data{'scope'} = [$1,$2];
     } else {      } else {
         $data{'scope_type'} = 'secgroup';          #FIXME check for group scope
           $data{'scope_type'} = 'section';
     }      }
     $middle=~s/^\[(.*)\]//;      $middle=~s/^\[(.*)\]//;
     }      }
Line 4122  sub parse_key { Line 4642  sub parse_key {
   
   
 sub header {  sub header {
     return &Apache::loncommon::start_page('Content and Problem Settings');      return &Apache::loncommon::start_page('Settings');
 }  }
   
   
Line 4135  sub print_main_menu { Line 4655  sub print_main_menu {
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
   
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDMAINFORMHEAD);      $r->print(<<ENDMAINFORMHEAD);
 <form method="post" enctype="multipart/form-data"  <form method="post" enctype="multipart/form-data"
       action="/adm/parmset" name="studentform">        action="/adm/parmset" name="studentform">
Line 4145  ENDMAINFORMHEAD Line 4666  ENDMAINFORMHEAD
     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});      my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
     my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});      my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});
     my $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'});  
     my $vpa = &Apache::lonnet::allowed('vpa',$env{'request.course.id'});  
     if ((!$dcm) && ($env{'request.course.sec'} ne '')) {      if ((!$dcm) && ($env{'request.course.sec'} ne '')) {
         $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.          $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
                                         '/'.$env{'request.course.sec'});                                          '/'.$env{'request.course.sec'});
     }      }
     if ((!$vcb) && ($env{'request.course.sec'} ne '')) {  
         $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}.  
                                         '/'.$env{'request.course.sec'});  
     }  
     my (%linktext,%linktitle,%url);  
     if ($parm_permission->{'edit'}) {  
         %linktext = (  
                      newoverview     => 'Edit Resource Parameters - Overview Mode',  
                      settable        => 'Edit Resource Parameters - Table Mode',  
                      setoverview     => 'Modify Resource Parameters - Overview Mode',  
                     );  
         %linktitle = (  
                      newoverview     => 'Set/Modify resource parameters in overview mode.',  
                      settable        => 'Set/Modify resource parameters in table mode.',  
                      setoverview     => 'Set/Modify existing resource parameters in overview mode.',  
                      );  
     } else {  
         %linktext = (  
                      newoverview     => 'View Resource Parameters - Overview Mode',  
                      settable        => 'View Resource Parameters - Table Mode',  
                      setoverview     => 'View Resource Parameters - Overview Mode',  
                    );  
         %linktitle = (  
                      newoverview     => 'Display resource parameters in overview mode.',  
                      settable        => 'Display resource parameters in table mode.',  
                      setoverview     => 'Display existing resource parameters in overview mode.',  
                      );  
     }  
     if ($mgr) {  
         $linktext{'resettimes'} = 'Reset Student Access Times';  
         $linktitle{'resettimes'} = "Reset access times for folders/maps, resources or the $lc_crstype.";  
         $url{'resettimes'} = '/adm/helper/resettimes.helper';  
     } elsif ($vgr) {  
         $linktext{'resettimes'} = 'Display Student Access Times',  
         $linktitle{'resettimes'} = "Display access times for folders/maps, resources or the $lc_crstype.",  
         $url{'resettimes'} = '/adm/accesstimes';  
     }  
     my @menu =      my @menu =
         ( { categorytitle=>"Content Settings for this $crstype",          ( { categorytitle=>"Content Settings for this $crstype",
         items => [          items => [
           { linktext => 'Portfolio Metadata',            { linktext => 'Portfolio Metadata',
             url => '/adm/parmset?action=setrestrictmeta',              url => '/adm/parmset?action=setrestrictmeta',
             permission => $parm_permission->{'setrestrictmeta'},              permission => $parm_permission,
             linktitle => "Restrict metadata for this $lc_crstype." ,              linktitle => "Restrict metadata for this $lc_crstype." ,
             icon =>'contact-new.png'   ,              icon =>'contact-new.png'   ,
             },              },
           { linktext => $linktext{'resettimes'},            { linktext => 'Reset Student Access Times',
             url => $url{'resettimes'},              url => '/adm/helper/resettimes.helper',
             permission => ($vgr || $mgr),              permission => $mgr,
             linktitle => $linktitle{'resettimes'},              linktitle => "Reset access times for folders/maps, resources or the $lc_crstype."  ,
             icon => 'start-here.png',              icon => 'start-here.png'  ,
             },              },
           { linktext => 'Blocking Communication/Resource Access',            { linktext => 'Blocking Communication/Resource Access',
             url => '/adm/setblock',              url => '/adm/setblock',
             permission => ($vcb || $dcm),              permission => $dcm,
             linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',              linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',
             icon => 'comblock.png',              icon => 'comblock.png',
             },              },
           { linktext => 'Set Parameter Setting Default Actions',            { linktext => 'Set Parameter Setting Default Actions',
             url => '/adm/parmset?action=setdefaults',              url => '/adm/parmset?action=setdefaults',
             permission => $parm_permission->{'setdefaults'},              permission => $parm_permission,
             linktitle =>'Set default actions for parameters.'  ,              linktitle =>'Set default actions for parameters.'  ,
             icon => 'folder-new.png'  ,              icon => 'folder-new.png'  ,
             }]},              }]},
Line 4219  ENDMAINFORMHEAD Line 4702  ENDMAINFORMHEAD
         items => [          items => [
           { linktext => 'Edit Resource Parameters - Helper Mode',            { linktext => 'Edit Resource Parameters - Helper Mode',
             url => '/adm/helper/parameter.helper',              url => '/adm/helper/parameter.helper',
             permission => $parm_permission->{'helper'},              permission => $parm_permission,
             linktitle =>'Set/Modify resource parameters in helper mode.'  ,              linktitle =>'Set/Modify resource parameters in helper mode.'  ,
             icon => 'dialog-information.png'  ,              icon => 'dialog-information.png'  ,
             #help => 'Parameter_Helper',              #help => 'Parameter_Helper',
             },              },
           { linktext => $linktext{'newoverview'},            { linktext => 'Edit Resource Parameters - Overview Mode',
             url => '/adm/parmset?action=newoverview',              url => '/adm/parmset?action=newoverview',
             permission => $parm_permission->{'newoverview'},              permission => $parm_permission,
             linktitle => $linktitle{'newoverview'},              linktitle =>'Set/Modify resource parameters in overview mode.'  ,
             icon => 'edit-find.png',              icon => 'edit-find.png'  ,
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => $linktext{'settable'},            { linktext => 'Edit Resource Parameters - Table Mode',
             url => '/adm/parmset?action=settable',              url => '/adm/parmset?action=settable',
             permission => $parm_permission->{'settable'},              permission => $parm_permission,
             linktitle => $linktitle{'settable'},              linktitle =>'Set/Modify resource parameters in table mode.'  ,
             icon => 'edit-copy.png',              icon => 'edit-copy.png'  ,
             #help => 'Table_Mode',              #help => 'Table_Mode',
             }]},              }]},
            { categorytitle => 'Existing Parameter Settings for Resources',             { categorytitle => 'Existing Parameter Settings for Resources',
          items => [           items => [
           { linktext => $linktext{'setoverview'},            { linktext => 'Modify Resource Parameters - Overview Mode',
             url => '/adm/parmset?action=setoverview',              url => '/adm/parmset?action=setoverview',
             permission => $parm_permission->{'setoverview'},              permission => $parm_permission,
             linktitle => $linktitle{'setoverview'},              linktitle =>'Set/Modify existing resource parameters in overview mode.'  ,
             icon => 'preferences-desktop-wallpaper.png',              icon => 'preferences-desktop-wallpaper.png'  ,
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => 'Change Log',            { linktext => 'Change Log',
             url => '/adm/parmset?action=parameterchangelog',              url => '/adm/parmset?action=parameterchangelog',
             permission => $parm_permission->{'parameterchangelog'},              permission => $parm_permission,
             linktitle =>"View parameter and $lc_crstype blog posting/user notification change log."  ,              linktitle =>"View parameter and $lc_crstype blog posting/user notification change log."  ,
             icon => 'document-properties.png',              icon => 'document-properties.png',
             }]}              }]}
           );            );
     $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));      $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
     $r->print('</form>'.&Apache::loncommon::end_page());      $r->print('</form>');
       &endSettingsScreen($r);
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 4323  sub order_meta_fields { Line 4808  sub order_meta_fields {
     my $idx = 1;      my $idx = 1;
     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 $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};;
     $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));      $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
         text=>"Add Metadata Field"});          text=>"Add Metadata Field"});
Line 4331  sub order_meta_fields { Line 4817  sub order_meta_fields {
               text=>"Restrict Metadata"},                text=>"Restrict Metadata"},
              {text=>"Order Metadata"});               {text=>"Order Metadata"});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
       &startSettingsScreen($r,'parmset',$crstype);
     if ($env{'form.storeorder'}) {      if ($env{'form.storeorder'}) {
         my $newpos = $env{'form.newpos'} - 1;          my $newpos = $env{'form.newpos'} - 1;
         my $currentpos = $env{'form.currentpos'} - 1;          my $currentpos = $env{'form.currentpos'} - 1;
         my @neworder = ();          my @neworder = ();
         my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};          my @oldorder = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'});
         my $i;          my $i;
         if ($newpos > $currentpos) {          if ($newpos > $currentpos) {
         # moving stuff up          # moving stuff up
Line 4369  sub order_meta_fields { Line 4856  sub order_meta_fields {
     }      }
     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});      my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
     my $ordered_fields;      my $ordered_fields;
     my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};      my @fields_in_order = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'});
     if (!@fields_in_order) {      if (!@fields_in_order) {
         # no order found, pick sorted order then create metadata.addedorder key.          # no order found, pick sorted order then create metadata.addedorder key.
         foreach my $key (sort keys %$fields) {          foreach my $key (sort(keys(%$fields))) {
             push @fields_in_order, $key;              push @fields_in_order, $key;
             $ordered_fields = join ",", @fields_in_order;              $ordered_fields = join ",", @fields_in_order;
         }          }
Line 4400  sub order_meta_fields { Line 4887  sub order_meta_fields {
         $idx ++;          $idx ++;
     }      }
     $r->print('</table>');      $r->print('</table>');
       &endSettingsScreen($r);
     return 'ok';      return 'ok';
 }  }
   
Line 4408  sub continue { Line 4896  sub continue {
     my $output;      my $output;
     $output .= '<form action="" method="post">';      $output .= '<form action="" method="post">';
     $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';      $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
     $output .= '<input type="submit" value="'.&mt('Continue').'" />';      $output .= '<input type="submit" value="Continue" />';
     return ($output);      return ($output);
 }  }
   
Line 4421  sub addmetafield { Line 4909  sub addmetafield {
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
     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 $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
       &startSettingsScreen($r,'parmset',$crstype);
     if (exists($env{'form.undelete'})) {      if (exists($env{'form.undelete'})) {
         my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');          my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
         foreach my $meta_field(@meta_fields) {          foreach my $meta_field(@meta_fields) {
Line 4430  sub addmetafield { Line 4920  sub addmetafield {
             my $put_result = &Apache::lonnet::put('environment',              my $put_result = &Apache::lonnet::put('environment',
                                         {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);                                          {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
   
             $r->print(&mt('Undeleted Metadata Field [_1] with result [_2]',              $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
                           '<strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}.  
                           '</strong>',$put_result).  
                       '<br />');  
         }          }
         $r->print(&continue());          $r->print(&continue());
     } elsif (exists($env{'form.fieldname'})) {      } elsif (exists($env{'form.fieldname'})) {
Line 4445  sub addmetafield { Line 4932  sub addmetafield {
                             {'metadata.'.$meta_field.'.values'=>"",                              {'metadata.'.$meta_field.'.values'=>"",
                              'metadata.'.$meta_field.'.added'=>"$display_field",                               'metadata.'.$meta_field.'.added'=>"$display_field",
                              'metadata.'.$meta_field.'.options'=>""},$dom,$crs);                               'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
         $r->print(&mt('Added new Metadata Field [_1] with result [_2]',          $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
                       '<strong>'.$env{'form.fieldname'}.'</strong>',$put_result).  
                   '<br />');  
         $r->print(&continue());          $r->print(&continue());
     } else {      } else {
         my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});          my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
         if ($fields) {          if ($fields) {
             $r->print(&mt('You may undelete previously deleted fields.').              $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
                       '<br />'.  
                       &mt('Check those you wish to undelete and click Undelete.').  
                       '<br />');  
             $r->print('<form method="post" action="">');              $r->print('<form method="post" action="">');
             foreach my $key(keys(%$fields)) {              foreach my $key(keys(%$fields)) {
                 $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');                  $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
Line 4463  sub addmetafield { Line 4945  sub addmetafield {
             $r->print('<input type="submit" name="undelete" value="Undelete" />');              $r->print('<input type="submit" name="undelete" value="Undelete" />');
             $r->print('</form>');              $r->print('</form>');
         }          }
         $r->print('<hr />'.          $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"');
                   &mt('[_1]Or[_2] you may enter a new metadata field name.',  
                       '<strong>','</strong>').  
                  '<form method="post" action="/adm/parmset?action=addmetadata">');  
         $r->print('<input type="text" name="fieldname" /><br />');          $r->print('<input type="text" name="fieldname" /><br />');
         $r->print('<input type="submit" value="'.&mt('Add Metadata Field').'" />');          $r->print('<input type="submit" value="Add Metadata Field" />');
     }      }
     $r->print('</form>');      $r->print('</form>');
       &endSettingsScreen($r);
 }  }
   
   
Line 4487  sub setrestrictmeta { Line 4967  sub setrestrictmeta {
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('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 $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
       &startSettingsScreen($r,'parmset',$crstype);
     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};      my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
     my $save_field = '';      my $save_field = '';
     my %lt = &Apache::lonlocal::texthash(  
                                            addm => 'Add Metadata Field',  
                                            ordm => 'Order Metadata Fields',  
                                            save => 'Save',  
                                         );  
     if ($env{'form.restrictmeta'}) {      if ($env{'form.restrictmeta'}) {
         foreach my $field (sort(keys(%env))) {          foreach my $field (sort(keys(%env))) {
             if ($field=~m/^form.(.+)_(.+)$/) {              if ($field=~m/^form.(.+)_(.+)$/) {
Line 4532  sub setrestrictmeta { Line 5009  sub setrestrictmeta {
     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');      my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
     # Now get possible added metadata fields      # Now get possible added metadata fields
     my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});      my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
       my $row_alt = 1;
     $output .= &Apache::loncommon::start_data_table();      $output .= &Apache::loncommon::start_data_table();
     foreach my $field (sort(keys(%metadata_fields))) {      foreach my $field (sort(keys(%metadata_fields))) {
         if ($field ne 'courserestricted') {          if ($field ne 'courserestricted') {
               $row_alt = $row_alt ? 0 : 1;
         $output.= &output_row($r, $field, $metadata_fields{$field});          $output.= &output_row($r, $field, $metadata_fields{$field});
     }      }
     }      }
     my $buttons = (<<ENDButtons);      my $buttons = (<<ENDButtons);
         <input type="submit" name="restrictmeta" value="$lt{'save'}" />          <input type="submit" name="restrictmeta" value="Save" />
         </form><br />          </form><br />
         <form method="post" action="/adm/parmset?action=addmetadata" name="form1">          <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
         <input type="submit" name="restrictmeta" value="$lt{'addm'}" />          <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
         </form>          </form>
         <br />          <br />
         <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">          <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
         <input type="submit" name="restrictmeta" value="$lt{'ordm'}" />          <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
 ENDButtons  ENDButtons
     my $added_flag = 1;      my $added_flag = 1;
     foreach my $field (sort(keys(%$added_metadata_fields))) {      foreach my $field (sort(keys(%$added_metadata_fields))) {
         $output.= &output_row($r,$field,$$added_metadata_fields{$field},$added_flag);          $row_alt = $row_alt ? 0 : 1;
           $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
     }      }
     $output .= &Apache::loncommon::end_data_table();      $output .= &Apache::loncommon::end_data_table();
     $r->print(<<ENDenv);      $r->print(<<ENDenv);
Line 4559  ENDButtons Line 5039  ENDButtons
         $buttons          $buttons
         </form>          </form>
 ENDenv  ENDenv
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return 'ok';      return 'ok';
 }  }
Line 4599  sub defaultsetter { Line 5080  sub defaultsetter {
   
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
         text=>"Set Defaults"});          text=>"Set Defaults"});
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     my $start_page =      my $start_page =
     &Apache::loncommon::start_page('Parameter Setting Default Actions');          &Apache::loncommon::start_page('Parameter Setting Default Actions');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');      $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');
   
     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 4657  sub defaultsetter { Line 5140  sub defaultsetter {
         }          }
         }          }
     }      }
     foreach my $key (keys %allparms) {      foreach my $key (keys(%allparms)) {
         $newrules{$key.'_triggers'}=$triggers{$key};          $newrules{$key.'_triggers'}=$triggers{$key};
     }      }
     &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);      &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);
     &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);      &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);
     &resetrulescache();      &resetrulescache();
     }      }
     my %lt=&Apache::lonlocal::texthash('days' => 'Days',      my %lt=&Apache::lonlocal::texthash('days' => 'Days',
Line 4749  ENDYESNO Line 5232  ENDYESNO
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
           "\n".'<input type="submit" name="storerules" value="'.            "\n".'<input type="submit" name="storerules" value="'.
           &mt('Save').'" /></form>'."\n");            &mt('Save').'" /></form>'."\n");
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
Line 4778  sub components { Line 5262  sub components {
     }      }
     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';      my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
     my $realmdescription=&mt('all resources');      my $realmdescription=&mt('all resources');
     if ($middle=~/^(.+)\_\_\_\(all\)$/) {      if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {
     $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';          my $mapurl = $1;
      $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);          my $maplevel = $2;
           my $leveltitle = &mt('Folder/Map');
           if ($maplevel eq 'rec') {
               $leveltitle = &mt('Recursive');
           }
       $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <span class="LC_parm_folder"><br />('.$mapurl.')</span></span>';
        $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($mapurl);
    } elsif ($middle) {     } elsif ($middle) {
     my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);      my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
     $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';      $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';
Line 4795  my %standard_parms; Line 5285  my %standard_parms;
 my %standard_parms_types;  my %standard_parms_types;
   
 sub load_parameter_names {  sub load_parameter_names {
     open(my $config,"<","$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");      open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
     while (my $configline=<$config>) {      while (my $configline=<$config>) {
     if ($configline !~ /\S/ || $configline=~/^\#/) { next; }      if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
     chomp($configline);      chomp($configline);
Line 4810  sub load_parameter_names { Line 5300  sub load_parameter_names {
     close($config);      close($config);
     $standard_parms{'int_pos'}      = 'Positive Integer';      $standard_parms{'int_pos'}      = 'Positive Integer';
     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';      $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
     $standard_parms{'scoreformat'}  = 'Format for display of score';  
 }  }
   
 sub standard_parameter_names {  sub standard_parameter_names {
Line 4836  sub standard_parameter_types { Line 5325  sub standard_parameter_types {
     return;      return;
 }  }
   
   sub standard_parameter_levels {
       my ($name)=@_;
       my %levels = (
                       'resourcelevel'   => 'a single resource',
                       'maplevel'        => 'the enclosing map/folder', 
                       'maplevelrecurse' => 'the enclosing map/folder (recursive into sub-folders)',
                       'courselevel'     => 'the general (course) level',
                    );
       if ($levels{$name}) {
           return $levels{$name};
       }
       return;
   }
   
 sub parm_change_log {  sub parm_change_log {
     my ($r,$parm_permission)=@_;      my ($r)=@_;
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
     text=>"Parameter Change Log"});      text=>"Parameter Change Log"});
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
Line 4847  sub parm_change_log { Line 5353  sub parm_change_log {
              '</script>'."\n";               '</script>'."\n";
     $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));      $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',      &startSettingsScreen($r,'parmset',$crstype);
                       $env{'course.'.$env{'request.course.id'}.'.domain'},      my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum);
                       $env{'course.'.$env{'request.course.id'}.'.num'});  
   
     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }      if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
   
Line 4866  sub parm_change_log { Line 5371  sub parm_change_log {
     $r->print(&Apache::loncommon::display_filter('parmslog').'&nbsp;'."\n".      $r->print(&Apache::loncommon::display_filter('parmslog').'&nbsp;'."\n".
               '<input type="submit" value="'.&mt('Display').'" />'.                '<input type="submit" value="'.&mt('Display').'" />'.
               '</form></fieldset></div><br clear="all" />');                '</form></fieldset></div><br clear="all" />');
     my $readonly = 1;  
     if ($parm_permission->{'edit'}) {      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
         undef($readonly);  
     }  
     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().      $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>'.            '<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>');            &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
     unless ($readonly) {            &Apache::loncommon::end_data_table_header_row());
         $r->print('<th>'.&mt('Announce').'</th>');  
     }  
     $r->print(&Apache::loncommon::end_data_table_header_row());  
     my $shown=0;      my $shown=0;
     my $folder='';      my $folder='';
     if ($env{'form.displayfilter'} eq 'currentfolder') {      if ($env{'form.displayfilter'} eq 'currentfolder') {
Line 4890  sub parm_change_log { Line 5388  sub parm_change_log {
     }      }
     if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }      if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
     }      }
     my $numgroups = 0;  
     my @groups;  
     if ($env{'request.course.groups'} ne '') {  
         @groups = split(/:/,$env{'request.course.groups'});  
         $numgroups = scalar(@groups);  
     }  
     foreach my $id (sort      foreach my $id (sort
             {              {
             if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {              if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
Line 4917  sub parm_change_log { Line 5409  sub parm_change_log {
                            $parmlog{$id}{'exe_uname'},                             $parmlog{$id}{'exe_uname'},
                            $parmlog{$id}{'exe_udom'});                             $parmlog{$id}{'exe_udom'});
     my $send_msg_link='';      my $send_msg_link='';
     if ((!$readonly) &&       if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
         (($parmlog{$id}{'exe_uname'} ne $env{'user.name'})  
          || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {           || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
         $send_msg_link ='<br />'.          $send_msg_link ='<br />'.
         &Apache::loncommon::messagewrapper(&mt('Send message'),          &Apache::loncommon::messagewrapper(&mt('Send message'),
Line 4936  sub parm_change_log { Line 5427  sub parm_change_log {
             my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=              my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
         &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);          &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
         if ($env{'request.course.sec'} ne '') {          if ($env{'request.course.sec'} ne '') {
             next if (($issection ne '') && (!(($issection eq $env{'request.course.sec'}) ||              next if (($issection ne '') && ($issection ne $env{'request.course.sec'}));
                                               ($numgroups && (grep(/^\Q$issection\E$/,@groups))))));  
             if ($uname ne '') {              if ($uname ne '') {
                 my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'});                  my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'});
                 next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'}));                  next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'})); 
             }              }
         }          }
         if ($env{'form.displayfilter'} eq 'currentfolder') {          if ($env{'form.displayfilter'} eq 'currentfolder') {
Line 4996  sub parm_change_log { Line 5486  sub parm_change_log {
             }              }
         }          }
         }          }
         $output .= '</td>';          $output .= '</td><td>';
               
             unless ($readonly) {          if ($stillactive) {
                 $output .= '<td>';                  my $parmitem = &standard_parameter_names($parmname);
                 if ($stillactive) {                  $parmitem = &mt($parmitem);
                     my $parmitem = &standard_parameter_names($parmname);          my $title=&mt('Changed [_1]',$parmitem);
                     $parmitem = &mt($parmitem);                  my $description=&mt('Changed [_1] for [_2] to [_3]',
                     my $title=&mt('Changed [_1]',$parmitem);                                      $parmitem,$realmdescription,
                     my $description=&mt('Changed [_1] for [_2] to [_3]',                      (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
                         $parmitem,$realmdescription,          if (($uname) && ($udom)) {
                         (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));              $output .=
                     if (($uname) && ($udom)) {              &Apache::loncommon::messagewrapper('Notify User',
                         $output .=                                 $uname,$udom,$title,
                             &Apache::loncommon::messagewrapper('Notify User',                                 $description);
                                                                $uname,$udom,$title,          } else {
                                                                $description);              $output .=
                     } else {              &Apache::lonrss::course_blog_link($id,$title,
                         $output .=                                $description);
                             &Apache::lonrss::course_blog_link($id,$title,          }
                                                               $description);          }
                     }          $output .= '</td>'.&Apache::loncommon::end_data_table_row();
                 }  
                 $output .= '</td>';  
             }  
         $output .= &Apache::loncommon::end_data_table_row();  
     }      }
         if ($env{'form.displayfilter'} eq 'containing') {          if ($env{'form.displayfilter'} eq 'containing') {
         my $wholeentry=$about_me_link.':'.          my $wholeentry=$about_me_link.':'.
Line 5040  sub parm_change_log { Line 5526  sub parm_change_log {
           || $shown<=$env{'form.show'})) { last; }            || $shown<=$env{'form.show'})) { last; }
     }      }
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 5088  sub update_slots { Line 5575  sub update_slots {
                           context => 'parameter',                            context => 'parameter',
                         );                          );
         &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,          &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
                                         '',$uname,$udom,$cnum,$cdom);                                     '',$uname,$udom,$cnum,$cdom);
   
         &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,          &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
                                         '',$uname,$udom,$uname,$udom);                                     '',$uname,$udom,$uname,$udom);
     }      }
     return $success;      return $success;
 }  }
Line 5122  sub delete_slots { Line 5609  sub delete_slots {
                                   context => 'parameter',                                    context => 'parameter',
                                 );                                  );
                 &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,                  &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
                                                 1,$uname,$udom,$cnum,$cdom);                                             1,$uname,$udom,$cnum,$cdom);
                 &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,                  &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
                                                 1,$uname,$udom,$uname,$udom);                                             1,$uname,$udom,$uname,$udom);
             }              }
         }          }
     }      }
Line 5147  sub parameter_release_vars { Line 5634  sub parameter_release_vars {
 }  }
   
 sub parameter_releasecheck {  sub parameter_releasecheck {
     my ($name,$value,$needsrelease,$cmajor,$cminor) = @_;      my ($name,$value,$valmatch,$namematch,$needsrelease,$cmajor,$cminor) = @_;
     my $needsnewer;      my $needsnewer;
     my ($needsmajor,$needsminor) = split(/\./,$needsrelease);      my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
     if (($cmajor < $needsmajor) ||       if (($cmajor < $needsmajor) || 
         ($cmajor == $needsmajor && $cminor < $needsminor)) {          ($cmajor == $needsmajor && $cminor < $needsminor)) {
         $needsnewer = 1;          $needsnewer = 1;
     } else {      } elsif ($name) {
         &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});          if ($valmatch) {
     }              &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch.':'});
     return $needsnewer;          } elsif ($value) { 
 }              &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.'::'});
   
 sub oldversion_warning {  
     my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;  
     my $desc;  
     my %stringtypes = (  
                         type         => 'string_questiontype',  
                         lenient      => 'string_lenient',  
                         retrypartial => 'string_yesno',  
                         discussvote  => 'string_discussvote',  
                         examcode     => 'string_examcode',  
                       );  
     if (exists($stringtypes{$name})) {  
         if ($name eq 'examcode') {  
             $desc = $value;  
         } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {  
             foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {  
                 next unless (ref($possibilities) eq 'ARRAY');  
                 my ($parmval, $description) = @{ $possibilities };  
                 if ($parmval eq $value) {  
                     $desc = $description;  
                     last;  
                 }  
             }  
         }          }
     } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) {      } elsif ($namematch) {
         my $now = time;          &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter::::'.$namematch});
         if ($value =~ /^\d+$/) {  
             if ($name eq 'printstartdate') {  
                 if ($value > $now) {  
                     $desc = &Apache::lonlocal::locallocaltime($value);  
                 }  
             } elsif ($name eq 'printenddate') {  
                 if ($value < $now) {  
                     $desc = &Apache::lonlocal::locallocaltime($value);  
                 }  
             }  
         }  
     }  
     my $standard_name = &standard_parameter_names($name);  
     return '<p class="LC_warning">'.  
            &mt('[_1] was [_2]not[_3] set to [_4].',  
                $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.  
            &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',  
            $cmajor.'.'.$cminor,$chostname,  
            $needsrelease).  
            '</p>';  
 }  
   
 sub get_permission {  
     my %permission;  
     my $allowed = 0;  
     return (\%permission,$allowed) unless ($env{'request.course.id'});  
     if ((&Apache::lonnet::allowed('opa',$env{'request.course.id'})) ||  
         (&Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.  
                   $env{'request.course.sec'}))) {  
         %permission= (  
                        'edit'               => 1,  
                        'set'                => 1,  
                        'setoverview'        => 1,  
                        'addmetadata'        => 1,  
                        'ordermetadata'      => 1,  
                        'setrestrictmeta'    => 1,  
                        'newoverview'        => 1,  
                        'setdefaults'        => 1,  
                        'settable'           => 1,  
                        'parameterchangelog' => 1,  
                        'cleanparameters'    => 1,  
                        'dateshift1'         => 1,  
                        'dateshift2'         => 1,  
                        'helper'             => 1,  
          );  
     } elsif ((&Apache::lonnet::allowed('vpa',$env{'request.course.id'})) ||  
              (&Apache::lonnet::allowed('vpa',$env{'request.course.id'}.'/'.  
                   $env{'request.course.sec'}))) {  
         %permission = (  
                        'set'                => 1,  
                        'settable'           => 1,  
                        'newoverview'        => 1,  
                        'setoverview'        => 1,  
                        'parameterchangelog' => 1,  
                       );  
     }      }
     foreach my $perm (values(%permission)) {      return $needsnewer;
         if ($perm) { $allowed=1; last; }  
     }  
     return (\%permission,$allowed);  
 }  }
   
 sub handler {  sub handler {
Line 5273  sub handler { Line 5679  sub handler {
                                             'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});                                              '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,$allowed) = &get_permission();      my $parm_permission =
       (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
        &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
                     $env{'request.course.sec'}));
     my $exists = &check_for_course_info();      my $exists = &check_for_course_info();
   
     if ($env{'request.course.id'} && $allowed && $exists) {      if ($env{'request.course.id'} &&  $parm_permission && $exists) {
         #          #
         # Main switch on form.action and form.state, as appropriate          # Main switch on form.action and form.state, as appropriate
         #          #
         # Check first if coming from someone else headed directly for          # Check first if coming from someone else headed directly for
         #  the table mode          #  the table mode
         if (($parm_permission->{'set'}) &&          if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
             ((($env{'form.command'} eq 'set') && ($env{'form.url'})           && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                && (!$env{'form.dis'})) || ($env{'form.symb'}))) {          &assessparms($r);
             &assessparms($r,$parm_permission);  
         } elsif (! exists($env{'form.action'})) {          } elsif (! exists($env{'form.action'})) {
             &print_main_menu($r,$parm_permission);              &print_main_menu($r,$parm_permission);
         } elsif (!$parm_permission->{$env{'form.action'}}) {  
             &print_main_menu($r,$parm_permission);  
         } elsif ($env{'form.action'} eq 'setoverview') {          } elsif ($env{'form.action'} eq 'setoverview') {
             &overview($r,$parm_permission);          &overview($r);
         } elsif ($env{'form.action'} eq 'addmetadata') {      } elsif ($env{'form.action'} eq 'addmetadata') {
             &addmetafield($r);          &addmetafield($r);
         } elsif ($env{'form.action'} eq 'ordermetadata') {      } elsif ($env{'form.action'} eq 'ordermetadata') {
             &order_meta_fields($r);          &order_meta_fields($r);
         } elsif ($env{'form.action'} eq 'setrestrictmeta') {          } elsif ($env{'form.action'} eq 'setrestrictmeta') {
             &setrestrictmeta($r);          &setrestrictmeta($r);
         } elsif ($env{'form.action'} eq 'newoverview') {          } elsif ($env{'form.action'} eq 'newoverview') {
             &newoverview($r,$parm_permission);          &newoverview($r);
         } elsif ($env{'form.action'} eq 'setdefaults') {          } elsif ($env{'form.action'} eq 'setdefaults') {
             &defaultsetter($r);          &defaultsetter($r);
         } elsif ($env{'form.action'} eq 'settable') {      } elsif ($env{'form.action'} eq 'settable') {
             &assessparms($r,$parm_permission);          &assessparms($r);
         } elsif ($env{'form.action'} eq 'parameterchangelog') {          } elsif ($env{'form.action'} eq 'parameterchangelog') {
             &parm_change_log($r,$parm_permission);          &parm_change_log($r);
         } elsif ($env{'form.action'} eq 'cleanparameters') {          } elsif ($env{'form.action'} eq 'cleanparameters') {
             &clean_parameters($r);          &clean_parameters($r);
         } elsif ($env{'form.action'} eq 'dateshift1') {          } elsif ($env{'form.action'} eq 'dateshift1') {
             &date_shift_one($r);              &date_shift_one($r);
         } elsif ($env{'form.action'} eq 'dateshift2') {          } elsif ($env{'form.action'} eq 'dateshift2') {

Removed from v.1.522.2.31  
changed lines
  Added in v.1.559


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