Diff for /loncom/interface/lonparmset.pm between versions 1.565 and 1.578

version 1.565, 2016/08/08 18:19:16 version 1.578, 2017/07/13 15:29:56
Line 371  sub endSettingsScreen { Line 371  sub endSettingsScreen {
 # (parmval is also used for the log of parameter changes)  # (parmval is also used for the log of parameter changes)
 ##################################################  ##################################################
   
 # Calls parmval_by_symb, getting the symb from $id (the big hash resource id) with &symbcache.  # Calls parmval_by_symb, getting the symb from $id with &symbcache.
 #  #
 # @param {string} $what - part info and parameter name separated by a dot, e.g. '0.weight'  # @param {string} $what - part info and parameter name separated by a dot, e.g. '0.weight'
 # @param {string} $id - big hash resource id  # @param {string} $id - resource id or map pc
 # @param {string} $def - the resource's default value for this parameter  # @param {string} $def - the resource's default value for this parameter
 # @param {string} $uname - user name  # @param {string} $uname - user name
 # @param {string} $udom - user domain  # @param {string} $udom - user domain
Line 394  sub parmval { Line 394  sub parmval {
 #   (level 1 is the most specific and will have precedence)  #   (level 1 is the most specific and will have precedence)
 #  #
 # @param {string} $what - part info and parameter name separated by a dot, e.g. '0.weight'  # @param {string} $what - part info and parameter name separated by a dot, e.g. '0.weight'
 # @param {string} $symb - resource symb  # @param {string} $symb - resource symb or map src
 # @param {string} $def - the resource's default value for this parameter  # @param {string} $def - the resource's default value for this parameter
 # @param {string} $uname - user name  # @param {string} $uname - user name
 # @param {string} $udom - user domain  # @param {string} $udom - user domain
Line 597  sub reset_caches { Line 597  sub reset_caches {
     }      }
 }  }
   
 # cache big hash id -> symb, using lonnavmaps to find association  # cache resource id or map pc -> resource symb or map src, using lonnavmaps to find association
 {  {
     my $symbsid; # course identifier, to initialize the cache only once for a course      my $symbsid; # course identifier, to initialize the cache only once for a course
     my %symbs; # hash id->symb      my %symbs; # hash id->symb
Line 607  sub reset_caches { Line 607  sub reset_caches {
         undef(%symbs);          undef(%symbs);
     }      }
   
     # returns the symb corresponding to a big hash id (using lonnavmaps and a cache)      # returns the resource symb or map src corresponding to a resource id or map pc
       # (using lonnavmaps and a cache)
     sub symbcache {      sub symbcache {
         my $id=shift;          my $id=shift;
         if ($symbsid ne $env{'request.course.id'}) {          if ($symbsid ne $env{'request.course.id'}) {
Line 718  sub date_sanity_info { Line 719  sub date_sanity_info {
   
 # Store a parameter value and type by ID, also triggering more parameter changes based on parameter default actions.  # Store a parameter value and type by ID, also triggering more parameter changes based on parameter default actions.
 #  #
 # @param {string} $sresid - resource big hash id  # @param {string} $sresid - resource id or map pc
 # @param {string} $spnam - part info and parameter name separated by a dot or underscore, e.g. '0.weight'  # @param {string} $spnam - part info and parameter name separated by a dot or underscore, e.g. '0.weight'
 # @param {integer} $snum - level  # @param {integer} $snum - level
 # @param {string} $nval - new value  # @param {string} $nval - new value
Line 737  my %recstack; # hash parameter name -> 1 Line 738  my %recstack; # hash parameter name -> 1
 # Store a parameter value and type by symb, also triggering more parameter changes based on parameter default actions.  # Store a parameter value and type by symb, also triggering more parameter changes based on parameter default actions.
 # Uses storeparm_by_symb_inner to actually store the parameter, ignoring any returned error.  # Uses storeparm_by_symb_inner to actually store the parameter, ignoring any returned error.
 #  #
 # @param {string} $symb - resource symb  # @param {string} $symb - resource symb or map src
 # @param {string} $spnam - part info and parameter name separated by a dot or underscore, e.g. '0.weight'  # @param {string} $spnam - part info and parameter name separated by a dot or underscore, e.g. '0.weight'
 # @param {integer} $snum - level  # @param {integer} $snum - level
 # @param {string} $nval - new value  # @param {string} $nval - new value
Line 807  sub log_parmset { Line 808  sub log_parmset {
 # Store a parameter value and type by symb, without using the parameter default actions.  # Store a parameter value and type by symb, without using the parameter default actions.
 # Expire related sheets.  # Expire related sheets.
 #  #
 # @param {string} $symb - resource symb  # @param {string} $symb - resource symb or map src
 # @param {string} $spnam - part info and parameter name separated by a dot, e.g. '0.weight'  # @param {string} $spnam - part info and parameter name separated by a dot, e.g. '0.weight'
 # @param {integer} $snum - level  # @param {integer} $snum - level
 # @param {string} $nval - new value  # @param {string} $nval - new value
Line 845  sub storeparm_by_symb_inner { Line 846  sub storeparm_by_symb_inner {
     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;      my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
   
     my $storeunder='';      my $storeunder='';
       my $possreplace='';
     if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }      if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }
     if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; }       if (($snum==17) || ($snum==3)) { 
     if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; }          $storeunder=$courseleveli;
           $possreplace=$courselevelm; 
       } 
       if (($snum==16) || ($snum==2)) { 
           $storeunder=$courselevelm;
           $possreplace=$courseleveli;
       }
     if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }      if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }
     if ($snum==12) { $storeunder=$seclevel; }      if ($snum==12) { $storeunder=$seclevel; }
     if ($snum==11) { $storeunder=$secleveli; }      if ($snum==11) { 
     if ($snum==10) { $storeunder=$seclevelm; }          $storeunder=$secleveli;
           $possreplace=$seclevelm; 
       }
       if ($snum==10) { 
           $storeunder=$seclevelm;
           $possreplace=$secleveli;
       }
     if ($snum==9) { $storeunder=$seclevelr; }      if ($snum==9) { $storeunder=$seclevelr; }
     if ($snum==8) { $storeunder=$grplevel; }      if ($snum==8) { $storeunder=$grplevel; }
     if ($snum==7) { $storeunder=$grpleveli; }      if ($snum==7) { 
     if ($snum==6) { $storeunder=$grplevelm; }          $storeunder=$grpleveli;
           $possreplace=$grplevelm;
       }
       if ($snum==6) {
           $storeunder=$grplevelm;
           $possreplace=$grpleveli;
       }
     if ($snum==5) { $storeunder=$grplevelr; }      if ($snum==5) { $storeunder=$grplevelr; }
   
   
Line 874  sub storeparm_by_symb_inner { Line 894  sub storeparm_by_symb_inner {
         &Apache::lonnet::expirespread('','','studentcalc');          &Apache::lonnet::expirespread('','','studentcalc');
         if (($snum==13) || ($snum==9) || ($snum==5)) {          if (($snum==13) || ($snum==9) || ($snum==5)) {
             &Apache::lonnet::expirespread('','','assesscalc',$symb);              &Apache::lonnet::expirespread('','','assesscalc',$symb);
         } elsif (($snum==14) || ($snum==10) || ($snum==6)) {          } elsif (($snum==17) || ($snum==16) || ($snum==11) || ($snum==10) || ($snum==7) || ($snum==6)) {
             &Apache::lonnet::expirespread('','','assesscalc',$map);              &Apache::lonnet::expirespread('','','assesscalc',$map);
         } else {          } else {
             &Apache::lonnet::expirespread('','','assesscalc');              &Apache::lonnet::expirespread('','','assesscalc');
Line 888  sub storeparm_by_symb_inner { Line 908  sub storeparm_by_symb_inner {
             $reply=&Apache::lonnet::cput              $reply=&Apache::lonnet::cput
             ('resourcedata',\%storecontent,$cdom,$cnum);              ('resourcedata',\%storecontent,$cdom,$cnum);
             &log_parmset(\%storecontent);              &log_parmset(\%storecontent);
               if ($possreplace) {
                   my $resdata = &Apache::lonnet::get_courseresdata($cnum,$cdom);
                   if (ref($resdata) eq 'HASH') {
                       if (exists($resdata->{$possreplace})) {
                           if (&Apache::lonnet::del
                               ('resourcedata',[$possreplace,$possreplace.'.type'],$cdom,$cnum) eq 'ok') {
                               &log_parmset({$possreplace => '', $possreplace.'.type' => $ntype},1);   
                           }
                       }
                   }
               }
         }          }
         &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);          &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
     } else {      } else {
Line 898  sub storeparm_by_symb_inner { Line 929  sub storeparm_by_symb_inner {
         if ($snum==1) {          if ($snum==1) {
             &Apache::lonnet::expirespread              &Apache::lonnet::expirespread
             ($uname,$udom,'assesscalc',$symb);              ($uname,$udom,'assesscalc',$symb);
         } elsif ($snum==2) {          } elsif (($snum==2) || ($snum==3)) {
             &Apache::lonnet::expirespread              &Apache::lonnet::expirespread
             ($uname,$udom,'assesscalc',$map);              ($uname,$udom,'assesscalc',$map);
         } else {          } else {
Line 913  sub storeparm_by_symb_inner { Line 944  sub storeparm_by_symb_inner {
             $reply=&Apache::lonnet::cput              $reply=&Apache::lonnet::cput
             ('resourcedata',\%storecontent,$udom,$uname);              ('resourcedata',\%storecontent,$udom,$uname);
             &log_parmset(\%storecontent,0,$uname,$udom);              &log_parmset(\%storecontent,0,$uname,$udom);
               if ($possreplace) {
                   my $resdata = &Apache::lonnet::get_userresdata($uname,$udom);
                   if (ref($resdata) eq 'HASH') {
                       if (exists($resdata->{$possreplace})) {
                           if (&Apache::lonnet::del
                               ('resourcedata',[$possreplace,$possreplace.'.type'],$udom,$uname) eq 'ok') {
                               &log_parmset({$possreplace => '',$possreplace.'.type' => $ntype},1,
                                             $uname,$udom);
                           }
                       }
                   }
               }
         }          }
         &Apache::lonnet::devalidateuserresdata($uname,$udom);          &Apache::lonnet::devalidateuserresdata($uname,$udom);
     }      }
Line 1021  sub valout { Line 1064  sub valout {
 # @param {string} $marker - identifier for the parameter, "resource id&part_parameter name&level", will be passed as pres_marker when the user submits a change.  # @param {string} $marker - identifier for the parameter, "resource id&part_parameter name&level", will be passed as pres_marker when the user submits a change.
 # @param {string} $return - prefix for the name of the form and field names that will be used to submit the form ('parmform.pres')  # @param {string} $return - prefix for the name of the form and field names that will be used to submit the form ('parmform.pres')
 # @param {string} $call - javascript function to call to submit the form ('psub')  # @param {string} $call - javascript function to call to submit the form ('psub')
   # @param {boolean} $recursive - true if link is for a map/folder where parameter is currently set to be recursive. 
 sub plink {  sub plink {
     my ($type,$dis,$value,$marker,$return,$call)=@_;      my ($type,$dis,$value,$marker,$return,$call,$recursive)=@_;
     my $winvalue=$value;      my $winvalue=$value;
     unless ($winvalue) {      unless ($winvalue) {
         if (&isdateparm($type)) {          if (&isdateparm($type)) {
Line 1044  sub plink { Line 1088  sub plink {
     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.      return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
     '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"      '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
         .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.          .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
         $valout.'</a></td></tr></table>';          $valout.'</a></td></tr>'.($recursive?'<tr><td align="center" class="LC_parm_recursive">'.
                                                 &mt('recursive').'</td></tr>' : '').'</table>';
   
 }  }
   
 # Javascript for table mode.  # Javascript for table mode.
Line 1364  ENDHEAD Line 1410  ENDHEAD
 # @param {string} $which - parameter key ('parameter_'.part.'_'.name)  # @param {string} $which - parameter key ('parameter_'.part.'_'.name)
 # @param {hash reference} $part - parameter key -> parameter part (can be problem part.'_'.response id for response parameters)  # @param {hash reference} $part - parameter key -> parameter part (can be problem part.'_'.response id for response parameters)
 # @param {hash reference} $name - parameter key -> parameter name  # @param {hash reference} $name - parameter key -> parameter name
 # @param {hash reference} $symbp - resource id -> symb  # @param {hash reference} $symbp - map pc or resource/map id -> map src.'___(all)' or resource symb
 # @param {string} $rid - resource id  # @param {string} $rid - resource id
 # @param {hash reference} $default - parameter key -> resource parameter default value  # @param {hash reference} $default - parameter key -> resource parameter default value
 # @param {hash reference} $defaulttype - parameter key -> resource parameter default type  # @param {hash reference} $defaulttype - parameter key -> resource parameter default type
Line 1379  ENDHEAD Line 1425  ENDHEAD
 # @param {string} $cgroup - group name  # @param {string} $cgroup - group name
 # @param {array reference} $usersgroups - list of groups the user belongs to, if any  # @param {array reference} $usersgroups - list of groups the user belongs to, if any
 # @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters  # @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters
   # @param {boolean} $readonly - true if no editing allowed. 
 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);
Line 1422  sub print_row { Line 1470  sub print_row {
     $thismarker=~s/^parameter\_//;      $thismarker=~s/^parameter\_//;
     my $mprefix=$rid.'&'.$thismarker.'&';      my $mprefix=$rid.'&'.$thismarker.'&';
     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);      my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);
     my ($othergrp,$grp_parm,$controlgrp);      my ($othergrp,$grp_parm,$controlgrp,$effparm_rec);
       if ($result == 17 || $result == 11 || $result == 7 || $result == 3) {
           $effparm_rec = 1;
       }
     if ($parmlev eq 'general') {      if ($parmlev eq 'general') {
         if ($uname) {          if ($uname) {
             &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);              &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         } else {          } else {
             &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         }          }
     } elsif ($parmlev eq 'map') {      } elsif ($parmlev eq 'map') {
         if ($uname) {          if ($uname) {
             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1); 
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);   
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);              &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1);
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);  
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
             &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         } else {          } else {
             &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
             &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         }          }
     } else {      } else {
         if ($uname) {          if ($uname) {
Line 1466  sub print_row { Line 1512  sub print_row {
             }              }
         }          }
   
         &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@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,'',$readonly,1);
         &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
   
         if ($csec) {          if ($csec) {
             &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@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,'',$readonly,1);
             &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         }          }
   
         if ($cgroup) {          if ($cgroup) {
             &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);              &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@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,$readonly,1);
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);              &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp.$readonly);
             &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,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@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,'',$readonly,1);
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
             &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.
                 ($effparm_rec?'<br /><span class="LC_parm_recursive">'.&mt('recursive').
                               '</span>':'').'</td>');
   
     if ($parmlev eq 'full') {      if ($parmlev eq 'full') {
         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.          my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
Line 1531  sub print_row { Line 1575  sub print_row {
 # @param {array reference} $typeoutpar - array level -> parameter type (when defined)  # @param {array reference} $typeoutpar - array level -> parameter type (when defined)
 # @param {hash reference} $display - parameter key -> full title for the parameter  # @param {hash reference} $display - parameter key -> full title for the parameter
 # @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters  # @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters
   # @param {boolean} $readonly -true if editing not allowed.
   # @param {boolean} $ismaplevel - true if level is for a map. 
 sub print_td {  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,
     $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).          $noeditgrp,$readonly,$ismaplevel)=@_;
       my ($ineffect,$recursive,$currval,$currtype,$currlevel);
       $ineffect = 0;
       $currval = $$outpar[$which];
       $currtype = $$typeoutpar[$which];
       $currlevel = $which;
       if (($result) && ($result == $which)) {
           $ineffect = 1;
       } 
       if ($ismaplevel) {
           if ($mprefix =~ /(hiddenresource|encrypturl)\&/) {
               if (($result) && ($result == $which)) {
                   $recursive = 1;
               }
           } elsif ($$outpar[$which+1] ne '') {
               $recursive = 1;
               $currlevel = $which+1;
               $currval = $$outpar[$currlevel];
               $currtype = $$typeoutpar[$currlevel];
               if (($result) && ($result == $currlevel)) {
                   $ineffect = 1;
               }
           }
       }
       $r->print('<td style="background-color:'.($ineffect?'#AAFFAA':$defbg).
               ';" align="center">');                ';" align="center">');
     my $nolink = 0;      my $nolink = 0;
     if ($which == 14 || $which == 15) {      if ($readonly) {
         $nolink = 1;  
     } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {  
         $nolink = 1;          $nolink = 1;
     } elsif ($which == 5 || $which ==  6 || $which == 7 || $which == 8) {      } else { 
         if ($noeditgrp) {          if ($which == 14 || $which == 15 || $mprefix =~ /mapalias\&$/) {
             $nolink = 1;              $nolink = 1;
         }          } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {
     } elsif ($mprefix =~ /availablestudent\&$/) {  
         if ($which > 4) {  
             $nolink = 1;  
         }  
     } elsif ($mprefix =~ /examcode\&$/) {  
         unless ($which == 2) {  
             $nolink = 1;              $nolink = 1;
           } elsif ($which == 5 || $which ==  6 || $which == 7 || $which == 8) {
               if ($noeditgrp) {
                   $nolink = 1;
               }
           } elsif ($mprefix =~ /availablestudent\&$/) {
               if ($which > 4) {
                   $nolink = 1;
               }
           } elsif ($mprefix =~ /examcode\&$/) {
               unless ($which == 2) {
                   $nolink = 1;
               }
         }          }
     }      }
     if ($nolink) {      if ($nolink) {
         $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix));          my ($parmname)=((split(/\&/,$mprefix))[1]=~/\_([^\_]+)$/);
 # FIXME: probably a good thing that mprefix is not used in valout, because it does not look like a parameter name !          $r->print(&valout($currval,$currtype,$parmname));
     } else {      } else {
         $r->print(&plink($$typeoutpar[$which],          $r->print(&plink($currtype,
                          $$display{$value},$$outpar[$which],                           $$display{$value},$currval,
                          $mprefix."$which",'parmform.pres','psub'));                           $mprefix.$currlevel,'parmform.pres','psub',$recursive));
     }      }
     $r->print('</td>'."\n");      $r->print('</td>'."\n");
 }  }
Line 1650  sub parm_control_group { Line 1724  sub parm_control_group {
 # Extracts lots of information about all of the the course's resources into a variety of hashes, using lonnavmaps and lonnet::metadata.  # Extracts lots of information about all of the the course's resources into a variety of hashes, using lonnavmaps and lonnet::metadata.
 # All the parameters are references and are filled by the sub.  # All the parameters are references and are filled by the sub.
 #  #
 # @param {array reference} $ids - resource ids  # @param {array reference} $ids - resource and map ids
 # @param {hash reference} $typep - hash resource id (from big hash) -> resource type (file extension)  # @param {hash reference} $typep - hash resource/map id -> resource type (file extension)
 # @param {hash reference} $keyp - hash resource id -> comma-separated list of parameter keys from lonnet::metadata  # @param {hash reference} $keyp - hash resource/map id -> comma-separated list of parameter keys from lonnet::metadata
 # @param {hash reference} $allparms - hash parameter name -> parameter title  # @param {hash reference} $allparms - hash parameter name -> parameter title
 # @param {hash reference} $allparts - hash parameter part -> part title (a parameter part can be problem part.'_'.response id for response parameters)  # @param {hash reference} $allparts - hash parameter part -> part title (a parameter part can be problem part.'_'.response id for response parameters)
 # @param {hash reference} $allmaps - hash map id (from big hash) -> map src  # @param {hash reference} $allmaps - hash map pc -> map src
 # @param {hash reference} $mapp - hash resource id -> enclosing map src  # @param {hash reference} $mapp - hash map pc or resource/map id -> enclosing map src
 # @param {hash reference} $symbp - hash map id or resource id -> map src.'___(all)' for a map or resource symb for a resource  # @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' for a map or resource symb for a resource
 # @param {hash reference} $maptitles - hash map id or src -> map title (this should really be two separate hashes)  # @param {hash reference} $maptitles - hash map pc or src -> map title (this should really be two separate hashes)
 # @param {hash reference} $uris - hash resource id -> resource src  # @param {hash reference} $uris - hash resource/map id -> resource src
 # @param {hash reference} $keyorder - hash parameter key -> appearance rank for this parameter when looking through every resource and every parameter, starting at 100 (integer)  # @param {hash reference} $keyorder - hash parameter key -> appearance rank for this parameter when looking through every resource and every parameter, starting at 100 (integer)
 # @param {hash reference} $defkeytype - hash parameter name -> parameter type  # @param {hash reference} $defkeytype - hash parameter name -> parameter type
 sub extractResourceInformation {  sub extractResourceInformation {
Line 1927  sub lookUpTableParameter { Line 2001  sub lookUpTableParameter {
         'retrypartial' => 'tries',          'retrypartial' => 'tries',
         'discussvote'  => 'misc',          'discussvote'  => 'misc',
         'examcode' => 'high_level_randomization',           'examcode' => 'high_level_randomization', 
     );          );
 }  }
   
 # Adds the given parameter name to an array of arrays listing all parameters for each category.  # Adds the given parameter name to an array of arrays listing all parameters for each category.
Line 2021  sub parmboxes { Line 2095  sub parmboxes {
         $r->print('<div class="LC_Box LC_400Box">'          $r->print('<div class="LC_Box LC_400Box">'
                  .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");                   .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");
         foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {          foreach my $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.'" ');
Line 2260  sub displaymenu { Line 2335  sub displaymenu {
 # Used by table mode and overview mode.  # Used by table mode and overview mode.
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 # @param {hash reference} $allmaps - hash map id -> map src  # @param {hash reference} $allmaps - hash map pc -> map src
 # @param {string} $pschp - selected map id, or 'all'  # @param {string} $pschp - selected map pc, or 'all'
 # @param {hash reference} $maptitles - hash map id or src -> map title  # @param {hash reference} $maptitles - hash map id or src -> map title
 # @param {hash reference} $symbp - hash map id or resource id -> map src.'___(all)' for a map or resource symb for a resource  # @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb
 sub mapmenu {  sub mapmenu {
     my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;      my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;
     my %allmaps_inverted = reverse %$allmaps;      my %allmaps_inverted = reverse %$allmaps;
Line 2619  sub standardkeyorder { Line 2694  sub standardkeyorder {
 # pres_value - &&&-separated parameter values  # pres_value - &&&-separated parameter values
 # prevvisit - '1' if the user has submitted the form before  # prevvisit - '1' if the user has submitted the form before
 # pscat (multiple values) - selected parameter names  # pscat (multiple values) - selected parameter names
 # pschp - selected map id, or 'all'  # pschp - selected map pc, or 'all'
 # psprt (multiple values) - list of selected parameter parts  # psprt (multiple values) - list of selected parameter parts
 # filter - part of or whole parameter name, to be filtered out when parameters are displayed (unused ?)  # filter - part of or whole parameter name, to be filtered out when parameters are displayed (unused ?)
 # recent_* (* = parameter type) - recent values entered by the user for parameter types  # recent_* (* = parameter type) - recent values entered by the user for parameter types
Line 2629  sub standardkeyorder { Line 2704  sub standardkeyorder {
 # url - used only with command 'set', the resource url  # url - used only with command 'set', the resource url
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
   # @param $parm_permission - ref to hash of permissions
   #                           if $parm_permission->{'edit'} is true, editing is allowed.
 sub assessparms {  sub assessparms {
   
     my $r=shift;      my ($r,$parm_permission) = @_;
   
   
 # -------------------------------------------------------- Variable declaration  # -------------------------------------------------------- Variable declaration
     my @ids=(); # resource ids      my @ids=(); # resource and map ids
     my %symbp=(); # hash map id or resource id -> map src.'___(all)' for a map or resource symb for a resource      my %symbp=(); # hash map pc or resource/map id -> map src.'___(all)' or resource symb
     my %mapp=(); # hash resource id -> enclosing map src      my %mapp=(); # hash map pc or resource/map id -> enclosing map src
     my %typep=(); # hash resource id (from big hash) -> resource type (file extension)      my %typep=(); # hash resource/map id -> resource type (file extension)
     my %keyp=(); # hash resource id -> comma-separated list of parameter keys      my %keyp=(); # hash resource/map id -> comma-separated list of parameter keys
     my %uris=(); # hash resource id -> resource src      my %uris=(); # hash resource/map id -> resource src
     my %maptitles=(); # hash map id or src -> map title      my %maptitles=(); # hash map pc or src -> map title
     my %allmaps=(); # hash map id (from big hash) -> map src      my %allmaps=(); # hash map pc -> map src
     my %alllevs=(); # hash English level title -> value      my %alllevs=(); # hash English level title -> value
   
     my $uname; # selected user name      my $uname; # selected user name
Line 2802  sub assessparms { Line 2879  sub assessparms {
     $symbp{'0.0'} = '';      $symbp{'0.0'} = '';
   
 # ---------------------------------------------------------- Anything to store?  # ---------------------------------------------------------- Anything to store?
     if ($env{'form.pres_marker'}) {      if ($env{'form.pres_marker'} && $parm_permission->{'edit'}) {
         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 3095  ENDPARMSELSCRIPT Line 3172  ENDPARMSELSCRIPT
         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?10:6;              my $coursespan=$csec?8:5;
             my $userspan=4;              my $userspan=3;
             if ($cgroup ne '') {              if ($cgroup ne '') {
                 $coursespan += 4;                  $coursespan += 3;
             }              }
   
             $r->print(&Apache::loncommon::start_data_table());              $r->print(&Apache::loncommon::start_data_table());
Line 3133  ENDPARMSELSCRIPT Line 3214  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="3">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>  </tr><tr><td colspan="5"></td><th colspan="2">$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="4">'.                  $r->print('<th colspan="3">'.
                 &mt("in Section")." $csec</th>");                  &mt("in Section")." $csec</th>");
             }              }
             if ($cgroup) {              if ($cgroup) {
                 $r->print('<th colspan="4">'.                  $r->print('<th colspan="3">'.
                 &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{'formfr'}</th><th>$lt{'foremf'}</th>  <th>$lt{'gen'}</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>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
             }              }
   
             if ($cgroup) {              if ($cgroup) {
                 $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.&mt('foremf').'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'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>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
             }              }
   
             $r->print('</tr>');              $r->print('</tr>');
Line 3278  ENDTABLEHEADFOUR Line 3358  ENDTABLEHEADFOUR
                             &print_row($r,$item,\%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);                                         $cgroup,\@usersgroups,$noeditgrp,$readonly);
                         }                          }
                     }                      }
                 }                  }
Line 3391  ENDTABLEHEADFOUR Line 3471  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('Recursive Value').'</th>'                           .'<th>'.&mt('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()
                 );                  );
Line 3401  ENDTABLEHEADFOUR Line 3480  ENDTABLEHEADFOUR
                     $r->print(&Apache::loncommon::start_data_table_row());                      $r->print(&Apache::loncommon::start_data_table_row());
                     &print_row($r,$item,\%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 3490  ENDMAPONE Line 3570  ENDMAPONE
             foreach my $item (&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,$item,\%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 3516  my $tableopen; # boolean, true if HTML t Line 3597  my $tableopen; # boolean, true if HTML t
 # @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)  # @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)
 # @returns {string}  # @returns {string}
 sub tablestart {  sub tablestart {
     my ($readonly) = @_;      my ($readonly,$is_map) = @_;
     if ($tableopen) {      if ($tableopen) {
         return '';          return '';
     } else {      } else {
Line 3525  sub tablestart { Line 3606  sub tablestart {
         if ($readonly) {          if ($readonly) {
             $output .= '<th>'.&mt('Current value').'</th>';              $output .= '<th>'.&mt('Current value').'</th>';
         } else {          } else {
             $output .= '<th>'.&mt('Delete').'</th><th>'.&mt('Set to ...').'</th>';              $output .= '<th>'.&mt('Delete').'</th>'.
                          '<th>'.&mt('Set to ...').'</th>';
               if ($is_map) {
                   $output .= '<th>'.&mt('Recursive?').'</th>';
               }
         }          }
         $output .= '</tr>';          $output .= '</tr>';
         return $output;          return $output;
Line 3604  sub storedata { Line 3689  sub storedata {
     my %newdata=();      my %newdata=();
     undef %newdata;      undef %newdata;
     my @deldata=();      my @deldata=();
       my @delrec=();
       my @delnonrec=();
     undef @deldata;      undef @deldata;
     my ($got_chostname,$chostname,$cmajor,$cminor);      my ($got_chostname,$chostname,$cmajor,$cminor);
     my $now = time;      my $now = time;
Line 3611  sub storedata { Line 3698  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 ($altkey,$recursive,$tkey,$tkeyrec,$tkeynonrec);
               next if ($cmd eq 'rec' || $cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');
               if ((($cmd eq 'set') || ($cmd eq 'datepointer') || ($cmd eq 'dateinterval') || ($cmd eq 'del')) && 
                    ($thiskey =~ /(?:sequence|page)\Q___(all)\E/)) {
                   unless ($thiskey =~ /(encrypturl|hiddenresource)$/) {
                       $altkey = $thiskey;
                       $altkey =~ s/\Q___(all)\E/___(rec)/;
                       if ($env{'form.rec_'.$thiskey}) {
                           $recursive = 1;
                       }
                   }
               }
             my ($tuname,$tudom)=&extractuser($thiskey);              my ($tuname,$tudom)=&extractuser($thiskey);
             my $tkey=$thiskey;  
             if ($tuname) {              if ($tuname) {
                   $tkey=$thiskey;
                 $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;                  $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   if ($altkey) {
                       $tkeynonrec = $tkey; 
                       $tkeyrec = $altkey;
                       $tkeyrec=~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, $valmatch, $namematch);                  my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);
Line 3699  sub storedata { Line 3802  sub storedata {
                     $typeof=$env{'form.typeof_'.$thiskey};                      $typeof=$env{'form.typeof_'.$thiskey};
                     $text = &mt('Saved modified date for');                      $text = &mt('Saved modified date for');
                 }                  }
                 if ($thiskey =~ m{\.(?:sequence|page)___\(rec\)}) {                  if ($recursive) {
                     $namematch = 'maplevelrecurse';                      $namematch = 'maplevelrecurse';
                 }                  }
                 if (($name ne '') || ($namematch ne '')) {                  if (($name ne '') || ($namematch ne '')) {
Line 3746  sub storedata { Line 3849  sub storedata {
                         next;                          next;
                     }                      }
                 }                  }
                 if (defined($data) and $$olddata{$thiskey} ne $data) {                  my ($reconlychg,$haschange,$storekey);
                     if ($tuname) {                  if ($tuname) {
                         if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,                      my $ustorekey;
                                             $tkey.'.type' => $typeof},                      if ($altkey) {
                                     $tudom,$tuname) eq 'ok') {                          if ($recursive) {
                             &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);                              if (exists($$olddata{$thiskey})) {
                             $r->print('<br />'.$text.' '.                                  if ($$olddata{$thiskey} eq $data) {
                                 &Apache::loncommon::plainname($tuname,$tudom));                                      $reconlychg = 1;
                                   }
                                   &Apache::lonnet::del('resourcedata',[$tkeynonrec,$tkeynonrec.'.type'],$tudom,$tuname);
                               }
                               if (exists($$olddata{$altkey})) {
                                   if (defined($data) && $$olddata{$altkey} ne $data) {
                                       $haschange = 1;
                                   }
                               } elsif ((!$reconlychg) && ($data ne '')) {
                                   $haschange = 1;
                               }
                               $ustorekey = $tkeyrec;
                           } else {
                               if (exists($$olddata{$altkey})) {
                                   if ($$olddata{$altkey} eq $data) {
                                       $reconlychg = 1;
                                   }
                                   &Apache::lonnet::del('resourcedata',[$tkeyrec,$tkeyrec.'.type'],$tudom,$tuname);
                               }
                               if (exists($$olddata{$thiskey})) {
                                   if (defined($data) && $$olddata{$thiskey} ne $data) {
                                       $haschange = 1;
                                   }
                               } elsif ((!$reconlychg) && ($data ne '')) {
                                   $haschange = 1;
                               }
                               $ustorekey = $tkeynonrec;
                           }
                       } else {
                           if (exists($$olddata{$tkey})) {
                               if (defined($data) && $$olddata{$tkey} ne $data) {
                                   $haschange = 1;
                               }
                               $ustorekey = $tkey;
                           }
                       }
                       if ($haschange || $reconlychg)  {
                           unless ($env{'form.del_'.$thiskey}) {
                               if (&Apache::lonnet::put('resourcedata',{$ustorekey=>$data,
                                                                        $ustorekey.'.type' => $typeof},
                                                                        $tudom,$tuname) eq 'ok') {
                                   &log_parmset({$ustorekey=>$data,$ustorekey.'.type' => $typeof},0,$tuname,$tudom);
                                   $r->print('<br />'.$text.' '.
                                             &Apache::loncommon::plainname($tuname,$tudom));
                               } else {
                                   $r->print('<div class="LC_error">'.
                                             &mt('Error saving parameters').'</div>');
                               }
                               &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                           }
                       }
                   } else {
                       if ($altkey) {
                           if ($recursive) {
                               if (exists($$olddata{$thiskey})) {
                                   if ($$olddata{$thiskey} eq $data) {
                                       $reconlychg = 1;
                                   }
                                   push(@delnonrec,($thiskey,$thiskey.'.type'));
                               }
                               if (exists($$olddata{$altkey})) {
                                   if (defined($data) && $$olddata{$altkey} ne $data) {
                                       $haschange = 1;
                                   }
                               } elsif (($data ne '') && (!$reconlychg)) {
                                   $haschange = 1;
                               }
                               $storekey = $altkey;
                         } else {                          } else {
                             $r->print('<div class="LC_error">'.                              if (exists($$olddata{$altkey})) {
                                 &mt('Error saving parameters').'</div>');                                  if ($$olddata{$altkey} eq $data) {
                                       $reconlychg = 1;
                                   }
                                   push(@delrec,($altkey,$altkey.'.type'));
                               } 
                               if (exists($$olddata{$thiskey})) {
                                   if (defined($data) && $$olddata{$thiskey} ne $data) {
                                       $haschange = 1;
                                   }
                               } elsif (($data ne '') && (!$reconlychg)) {
                                   $haschange = 1;
                               }
                               $storekey = $thiskey;
                         }                          }
                         &Apache::lonnet::devalidateuserresdata($tuname,$tudom);  
                     } else {                      } else {
                         $newdata{$thiskey}=$data;                          if (defined($data) && $$olddata{$thiskey} ne $data) {
                         $newdata{$thiskey.'.type'}=$typeof;                              $haschange = 1;
                               $storekey = $thiskey;
                           }
                       }
                   }
                   if ($reconlychg || $haschange) {
                       unless ($env{'form.del_'.$thiskey}) {
                           $newdata{$storekey}=$data;
                           $newdata{$storekey.'.type'}=$typeof;
                     }                      }
                 }                  }
             } elsif ($cmd eq 'del') {              } elsif ($cmd eq 'del') {
                 if ($tuname) {                  if ($tuname) {
                     if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {                      my $error;
                             &log_parmset({$tkey=>''},1,$tuname,$tudom);                      if ($altkey) {  
                         $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));                          if (exists($$olddata{$altkey})) {
                               if (&Apache::lonnet::del('resourcedata',[$tkeyrec,$tkeyrec.'.type'],$tudom,$tuname) eq 'ok') {
                                   &log_parmset({$tkeyrec=>''},1,$tuname,$tudom);
                                   if ($recursive) {
                                       $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                                   }
                               } elsif ($recursive) {
                                   $error = 1;
                               }
                           }
                           if (exists($$olddata{$thiskey})) {
                               if (&Apache::lonnet::del('resourcedata',[$tkeynonrec,$tkeynonrec.'.type'],$tudom,$tuname) eq 'ok') {
                                   &log_parmset({$tkeynonrec=>''},1,$tuname,$tudom);
                                   unless ($recursive) {
                                       $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                                   }
                               } elsif (!$recursive) {
                                   $error = 1;
                               }
                           }
                     } else {                      } else {
                           if (exists($$olddata{$thiskey})) {
                               if (&Apache::lonnet::del('resourcedata',[$tkey,$tkey.'.type'],$tudom,$tuname) eq 'ok') {
                                   &log_parmset({$tkey=>''},1,$tuname,$tudom);
                                   $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                               } else {
                                   $error = 1;
                               }
                           }
                       }
                       if ($error) { 
                         $r->print('<div class="LC_error">'.                          $r->print('<div class="LC_error">'.
                             &mt('Error deleting parameters').'</div>');                              &mt('Error deleting parameters').'</div>');
                     }                      }
                     &Apache::lonnet::devalidateuserresdata($tuname,$tudom);                      &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                 } else {                  } else {
                     push (@deldata,$thiskey,$thiskey.'.type');                      if ($altkey) {
                           if (exists($$olddata{$altkey})) {
                               unless (grep(/^\Q$altkey\E$/,@delrec)) {
                                   push(@deldata,($altkey,$altkey.'.type'));
                               }
                           }
                           if (exists($$olddata{$thiskey})) {
                               unless (grep(/^\Q$thiskey\E$/,@delnonrec)) {
                                   push(@deldata,($thiskey,$thiskey.'.type'));
                               }
                           }
                       } elsif (exists($$olddata{$thiskey})) {
                           push(@deldata,($thiskey,$thiskey.'.type'));
                       }
                 }                  }
             }              }
         }          }
     }      }
 # Store all course level  # Store all course level
     my $delentries=$#deldata+1;      my $delentries=$#deldata+1;
       my @alldels;
       if (@delrec) {
           push(@alldels,@delrec);
       }
       if (@delnonrec) {
           push(@alldels,@delnonrec);
       }
       if (@deldata) {
           push(@alldels,@deldata);
       }
     my @newdatakeys=keys(%newdata);      my @newdatakeys=keys(%newdata);
     my $putentries=$#newdatakeys+1;      my $putentries=$#newdatakeys+1;
     if ($delentries) {      my ($delresult,$devalidate);
         if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {      if (@alldels) {
             my %loghash=map { $_ => '' } @deldata;          if (&Apache::lonnet::del('resourcedata',\@alldels,$dom,$crs) eq 'ok') {
               my %loghash=map { $_ => '' } @alldels;
             &log_parmset(\%loghash,1);              &log_parmset(\%loghash,1);
             $r->print('<h2>'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'</h2>');              if ($delentries) {
         } else {                  $r->print('<h2>'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'</h2>');
               }
           } elsif ($delentries) {
             $r->print('<div class="LC_error">'.              $r->print('<div class="LC_error">'.
                 &mt('Error deleting parameters').'</div>');                  &mt('Error deleting parameters').'</div>');
         }          }
         &Apache::lonnet::devalidatecourseresdata($crs,$dom);          $devalidate = 1; 
     }      }
     if ($putentries) {      if ($putentries) {
         if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {          if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
Line 3803  sub storedata { Line 4047  sub storedata {
             $r->print('<div class="LC_error">'.              $r->print('<div class="LC_error">'.
                 &mt('Error saving parameters').'</div>');                  &mt('Error saving parameters').'</div>');
         }          }
           $devalidate = 1; 
       }
       if ($devalidate) {
         &Apache::lonnet::devalidatecourseresdata($crs,$dom);          &Apache::lonnet::devalidatecourseresdata($crs,$dom);
     }      }
 }  }
Line 3849  sub parse_listdata_key { Line 4096  sub parse_listdata_key {
 # @param {string} $sortorder - realmstudent|studentrealm  # @param {string} $sortorder - realmstudent|studentrealm
 # @param {string} $caller - name of the calling sub (overview|newoverview)  # @param {string} $caller - name of the calling sub (overview|newoverview)
 # @param {hash reference} $classlist - from loncoursedata::get_classlist  # @param {hash reference} $classlist - from loncoursedata::get_classlist
   # @param {boolean} $readonly - true if editing not allowed
 # @returns{integer} - number of $listdata parameters processed  # @returns{integer} - number of $listdata parameters processed
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;      my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;
           
 # Start list output  # Start list output
   
Line 3873  sub listdata { Line 4121  sub listdata {
         }          }
     }      }
   
     foreach my $thiskey (sort {      foreach my $key (sort {
         my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);          my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
         my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);          my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
   
Line 3913  sub listdata { Line 4161  sub listdata {
   
         $result;          $result;
                   
     } keys(%{$listdata})) { # foreach my $thiskey      } keys(%{$listdata})) { # foreach my $key
           my $thiskey = $key;
         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'}) {
                 $thistype=$$resourcedata{$thiskey.'.type'};                  $thistype=$$resourcedata{$thiskey.'.type'};
             }              }
             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');
               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 3956  sub listdata { Line 4204  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)\)$/) {              my ($is_map,$is_recursive,$mapurl,$maplevel);
                 my $mapurl = $1;              if ($caller eq 'overview') {
                 my $maplevel = $2;                  if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {
                       $mapurl = $1;
                       $maplevel = $2;
                       $is_map = 1;
                   }
               } elsif ($caller eq 'newoverview') {
                   if ($middle=~/^(.+)\_\_\_\((all)\)$/) {
                       $mapurl = $1;
                       $maplevel = $2;
                       $is_map = 1;
                   }
               }
               if ($is_map) {
                 my $leveltitle = &mt('Folder/Map');                  my $leveltitle = &mt('Folder/Map');
                 if ($maplevel eq 'rec') {                  unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) {   
                     $leveltitle = &mt('Recursive');                      if ($caller eq 'newoverview') {
                           my $altkey = $thiskey;
                           $altkey =~ s/\Q___(all)\E/___(rec)/;
                           if ((exists($$resourcedata{$altkey})) & (!exists($$resourcedata{$thiskey}))) {
                               $is_recursive = 1;
                               if ($$resourcedata{$altkey.'.type'}) {
                                   $thistype=$$resourcedata{$altkey.'.type'};
                               }
                               $showval = $$resourcedata{$altkey};
                           }
                       } elsif (($caller eq 'overview') && ($maplevel eq 'rec')) {
                           $thiskey =~ s/\Q___(rec)\E/___(all)/;
                           $is_recursive = 1;
                       }
                 }                  }
                 $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';                  $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) {
Line 4003  sub listdata { Line 4276  sub listdata {
     # Ready to print      # Ready to print
     #      #
             my $parmitem = &standard_parameter_names($name);              my $parmitem = &standard_parameter_names($name);
             $r->print(&tablestart($readonly).              $r->print(&tablestart($readonly,$is_map).
                 &Apache::loncommon::start_data_table_row().                  &Apache::loncommon::start_data_table_row().
                 '<td><b>'.&mt($parmitem).                  '<td><b>'.&mt($parmitem).
                 '</b></td>');                  '</b></td>');
Line 4023  sub listdata { Line 4296  sub listdata {
                 $r->print(                  $r->print(
                     &Apache::lonhtmlcommon::date_setter('parmform',                      &Apache::lonhtmlcommon::date_setter('parmform',
                                                         $jskey,                                                          $jskey,
                                                         $$resourcedata{$thiskey},                                                          $showval,
                                                         '',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}.'">'.      (($showval!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$showval.'">'.
     &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($showval)
                     );                      );
                 }                  }
             } elsif ($thistype eq 'date_interval') {              } elsif ($thistype eq 'date_interval') {
                 $r->print(&date_interval_selector($thiskey,$name,                  $r->print(&date_interval_selector($thiskey,$name,
                         $$resourcedata{$thiskey},$readonly));                            $showval,$readonly));
             } elsif ($thistype =~ m/^string/) {              } elsif ($thistype =~ m/^string/) {
                 $r->print(&string_selector($thistype,$thiskey,                  $r->print(&string_selector($thistype,$thiskey,
                         $$resourcedata{$thiskey},$name,$readonly));                            $showval,$name,$readonly));
             } else {              } else {
                 $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly));                  $r->print(&default_selector($thiskey,$showval,$readonly));
             }              }
             unless ($readonly) {              unless ($readonly) {
                 $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.                  $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                         $thistype.'" />');                          $thistype.'" />');
             }              }
             $r->print('</td>'.&Apache::loncommon::end_data_table_row());              $r->print('</td>');
               if ($is_map) {
                   if (($name eq 'encrypturl') || ($name eq 'hiddenresource')) {
                       $r->print('<td><table><tr><td>'.&mt('Yes').'</td></tr></table></td>');
                   } else {
                       my ($disabled,$recon,$recoff);
                       if ($readonly) {
                           $disabled = ' disabled="disabled"';
                       }
                       if ($is_recursive) {
                           $recon = ' checked="checked"';
                       } else {
                           $recoff = ' checked="checked"';
                       }
                       $r->print('<td><table><tr><td><label><input type="radio" name="rec_'.$thiskey.'" value="1"'.$recon.$disabled.' />'.&mt('Yes').'</label>'.
                                 '</td><td><label><input type="radio" name="rec_'.$thiskey.'" value="0"'.$recoff.$disabled.' />'.&mt('No').'</label></td></tr></table></td>');
                   }
               }
               $r->print(&Apache::loncommon::end_data_table_row());
         }          }
     }      }
     return $foundkeys;      return $foundkeys;
Line 4139  sub string_ip_selector { Line 4430  sub string_ip_selector {
         @{$access{'deny'}} = ('');          @{$access{'deny'}} = ('');
     }      }
     my ($disabled,$addmore);      my ($disabled,$addmore);
     if ($disabled) {      if ($readonly) {
         $disabled=' disabled="disabled"';          $disabled=' disabled="disabled"';
     } else {      } else {
         $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';          $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';
Line 4560  sub date_interval_selector { Line 4851  sub date_interval_selector {
                 $currprocdisplay = 'text';                  $currprocdisplay = 'text';
             }              }
             my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';              my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
               my $disabled;
               if ($readonly) {
                   $disabled = ' disabled="disabled"';
               }
             $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').              $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').
                        '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.' />'.                         '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.$disabled.' />'.
                        &mt('No').'</label>'.('&nbsp;'x2).                         &mt('No').'</label>'.('&nbsp;'x2).
                        '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.' />'.                         '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.$disabled.' />'.
                        &mt('Yes').'</label>'.('&nbsp;'x2).                         &mt('Yes').'</label>'.('&nbsp;'x2).
                        '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.' />'.                         '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.$disabled.' />'.
                        &mt('Yes, with proctor key').'</label>'.                         &mt('Yes, with proctor key').'</label>'.
                        '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.                         '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
                        'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'" /></span><br />'.                         'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.
                        '<span class="LC_nobreak">'.&mt('Button text').': '.                         '<span class="LC_nobreak">'.&mt('Button text').': '.
                        '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'" /></span>';                         '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';
         }          }
     }      }
     unless ($readonly) {      unless ($readonly) {
Line 4704  sub dateshift { Line 4999  sub dateshift {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 sub newoverview {  sub newoverview {
     my ($r) = @_;      my ($r,$parm_permission) = @_;
   
     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'};      my $crstype =  $env{'course.'.$env{'request.course.id'}.'.type'};
       my $readonly = 1;
       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"});
   
Line 4867  ENDOVER Line 5166  ENDOVER
   
 # List data  # List data
   
         &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview');          &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);
     }      }
     $r->print(&tableend().      $r->print(&tableend());
          ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').      unless ($readonly) {
           '</form>');          $r->print( ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'') );
       }
       $r->print('</form>');
     &endSettingsScreen($r);      &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
Line 4881  ENDOVER Line 5182  ENDOVER
 # The non-type value is always 1.  # The non-type value is always 1.
 #  #
 # @param {string} $cat - parameter name  # @param {string} $cat - parameter name
 # @param {string} $pschp - selected map id, or 'all'  # @param {string} $pschp - selected map pc, or 'all'
 # @param {string} $parmlev - selected level value (full|map|general), or ''  # @param {string} $parmlev - selected level value (full|map|general), or ''
 # @param {hash reference} $listdata - the parameter data that will be modified  # @param {hash reference} $listdata - the parameter data that will be modified
 # @param {array reference} $psprt - selected parts  # @param {array reference} $psprt - selected parts
 # @param {array reference} $selections - selected sections  # @param {array reference} $selections - selected sections
 # @param {hash reference} $defkeytype - hash parameter name -> parameter type  # @param {hash reference} $defkeytype - hash parameter name -> parameter type
 # @param {hash reference} $allmaps - hash map id -> map src  # @param {hash reference} $allmaps - hash map pc -> map src
 # @param {array reference} $ids - resource ids  # @param {array reference} $ids - resource and map ids
 # @param {hash reference} $symbp - hash map id or resource id -> map src.'___(all)' for a map or resource symb for a resource  # @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb
 sub secgroup_lister {  sub secgroup_lister {
     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;      my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
     foreach my $item (@{$selections}) {      foreach my $item (@{$selections}) {
Line 4910  sub secgroup_lister { Line 5211  sub secgroup_lister {
                     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 4933  sub secgroup_lister { Line 5231  sub secgroup_lister {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 sub overview {  sub overview {
     my ($r) = @_;      my ($r,$parm_permission) = @_;
     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'};      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
       my $readonly = 1;
       if ($parm_permission->{'edit'}) {
           undef($readonly);
       }
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".               '// <![CDATA['."\n".
              &toggleparmtextbox_js()."\n".               &toggleparmtextbox_js()."\n".
Line 4959  sub overview { Line 5261  sub overview {
   
 # Store modified  # Store modified
   
     &storedata($r,$crs,$dom);      unless ($readonly) {
           &storedata($r,$crs,$dom);
       }
   
 # Read modified data  # Read modified data
   
Line 4970  sub overview { Line 5274  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);      my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly);
     $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());
 }  }
   
 # Unused sub.  # Unused sub.
Line 5142  sub parse_key { Line 5458  sub parse_key {
     my ($key) = @_;      my ($key) = @_;
     my %data;      my %data;
     my ($middle,$part,$name)=      my ($middle,$part,$name)=
     ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);      ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
     $data{'scope_type'} = 'all';      $data{'scope_type'} = 'all';
     if ($middle=~/^\[(.*)\]/) {      if ($middle=~/^\[(.*)\]/) {
         $data{'scope'} = $1;          $data{'scope'} = $1;
Line 5212  ENDMAINFORMHEAD Line 5528  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,              permission => $parm_permission->{'setrestrictmeta'},
             linktitle => "Restrict metadata for this $lc_crstype." ,              linktitle => "Restrict metadata for this $lc_crstype." ,
             icon =>'contact-new.png'   ,              icon =>'contact-new.png'   ,
             },              },
           { linktext => 'Reset Student Access Times',            { linktext => $linktext{'resettimes'},
             url => '/adm/helper/resettimes.helper',              url => $url{'resettimes'},
             permission => $mgr,              permission => ($vgr || $mgr),
             linktitle => "Reset access times for folders/maps, resources or the $lc_crstype."  ,              linktitle => $linktitle{'resettimes'},
             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 => $dcm,              permission => ($vcb || $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,              permission => $parm_permission->{'setdefaults'},
             linktitle =>'Set default actions for parameters.'  ,              linktitle =>'Set default actions for parameters.'  ,
             icon => 'folder-new.png'  ,              icon => 'folder-new.png'  ,
             }]},              }]},
Line 5248  ENDMAINFORMHEAD Line 5602  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,              permission => $parm_permission->{'helper'},
             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 => 'Edit Resource Parameters - Overview Mode',            { linktext => $linktext{'newoverview'},
             url => '/adm/parmset?action=newoverview',              url => '/adm/parmset?action=newoverview',
             permission => $parm_permission,              permission => $parm_permission->{'newoverview'},
             linktitle =>'Set/Modify resource parameters in overview mode.'  ,              linktitle => $linktitle{'newoverview'},
             icon => 'edit-find.png'  ,              icon => 'edit-find.png',
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => 'Edit Resource Parameters - Table Mode',            { linktext => $linktext{'settable'},
             url => '/adm/parmset?action=settable',              url => '/adm/parmset?action=settable',
             permission => $parm_permission,              permission => $parm_permission->{'settable'},
             linktitle =>'Set/Modify resource parameters in table mode.'  ,              linktitle => $linktitle{'settable'},
             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 => 'Modify Resource Parameters - Overview Mode',            { linktext => $linktext{'setoverview'},
             url => '/adm/parmset?action=setoverview',              url => '/adm/parmset?action=setoverview',
             permission => $parm_permission,              permission => $parm_permission->{'setoverview'},
             linktitle =>'Set/Modify existing resource parameters in overview mode.'  ,              linktitle => $linktitle{'setoverview'},
             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,              permission => $parm_permission->{'parameterchangelog'},
             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',
             }]}              }]}
Line 5512  sub addmetafield { Line 5866  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 /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"'); # FIXME: HTML error, input will not be displayed !          $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<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="Add Metadata Field" />');          $r->print('<input type="submit" value="Add Metadata Field" />');
     }      }
Line 5856  sub components { Line 6210  sub components {
     }      }
   
     my ($middle,$part,$name)=      my ($middle,$part,$name)=
         ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);          ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
     my $issection;      my $issection;
   
     my $section=&mt('All Students');      my $section=&mt('All Students');
Line 5916  sub load_parameter_names { Line 6270  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';
 }  }
   
 # Returns a parameter title for standard parameters, the name for others.  # Returns a parameter title for standard parameters, the name for others.
Line 5971  sub standard_parameter_levels { Line 6326  sub standard_parameter_levels {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 sub parm_change_log {  sub parm_change_log {
     my ($r)=@_;      my ($r,$parm_permission)=@_;
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}      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 6003  sub parm_change_log { Line 6358  sub parm_change_log {
               '<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'}) {
           undef($readonly);
       }
     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
     $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><th>'.&mt('Announce').'</th>'.            &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th>');
           &Apache::loncommon::end_data_table_header_row());      unless ($readonly) {
           $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 6039  sub parm_change_log { Line 6401  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 ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})          if ((!$readonly) && 
               (($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 6116  sub parm_change_log { Line 6479  sub parm_change_log {
                     }                      }
                 }                  }
             }              }
             $output .= '</td><td>';              $output .= '</td>';
                   
             if ($stillactive) {              unless ($readonly) { 
                 my $parmitem = &standard_parameter_names($parmname);                  $output .= '<td>';
                 $parmitem = &mt($parmitem);                  if ($stillactive) {
                 my $title=&mt('Changed [_1]',$parmitem);                      my $parmitem = &standard_parameter_names($parmname);
                 my $description=&mt('Changed [_1] for [_2] to [_3]',                      $parmitem = &mt($parmitem);
                     $parmitem,$realmdescription,                      my $title=&mt('Changed [_1]',$parmitem);
                     (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));                      my $description=&mt('Changed [_1] for [_2] to [_3]',
                 if (($uname) && ($udom)) {                          $parmitem,$realmdescription,
                     $output .=                          (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
                     &Apache::loncommon::messagewrapper('Notify User',                      if (($uname) && ($udom)) {
                                     $uname,$udom,$title,                          $output .=
                                     $description);                          &Apache::loncommon::messagewrapper('Notify User',
                 } else {                                                             $uname,$udom,$title,
                     $output .=                                                             $description);
                     &Apache::lonrss::course_blog_link($id,$title,                      } else {
                                     $description);                          $output .=
                               &Apache::lonrss::course_blog_link($id,$title,
                                                                 $description);
                       }
                 }                  }
                   $output .= '</td>';
             }              }
             $output .= '</td>'.&Apache::loncommon::end_data_table_row();              $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 6326  sub parameter_releasecheck { Line 6693  sub parameter_releasecheck {
     return $needsnewer;      return $needsnewer;
 }  }
   
   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)) {
           if ($perm) { $allowed=1; last; }
       }
       return (\%permission,$allowed);
   }
   
 ##################################################  ##################################################
 # HANDLER  # HANDLER
 ##################################################  ##################################################
Line 6374  sub handler { Line 6781  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 =      my ($parm_permission,$allowed) = &get_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'} &&  $parm_permission && $exists) {      if ($env{'request.course.id'} && $allowed && $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 ((($env{'form.command'} eq 'set') && ($env{'form.url'})          if (($parm_permission->{'set'}) && 
                 && (!$env{'form.dis'})) || ($env{'form.symb'})) {              ((($env{'form.command'} eq 'set') && ($env{'form.url'})
             &assessparms($r);                  && (!$env{'form.dis'})) || ($env{'form.symb'}))) {
               &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);              &overview($r,$parm_permission);
         } 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') {
Line 6400  sub handler { Line 6807  sub handler {
         } 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);              &newoverview($r,$parm_permission);
         } 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);              &assessparms($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'parameterchangelog') {          } elsif ($env{'form.action'} eq 'parameterchangelog') {
             &parm_change_log($r);              &parm_change_log($r,$parm_permission);
         } 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') {

Removed from v.1.565  
changed lines
  Added in v.1.578


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