Diff for /loncom/interface/lonparmset.pm between versions 1.522.2.26.2.1 and 1.555

version 1.522.2.26.2.1, 2020/01/15 00:38:38 version 1.555, 2016/01/31 21:25:38
Line 36  lonparmset - Handler to set parameters f Line 36  lonparmset - Handler to set parameters f
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 lonparmset provides an interface to setting content parameters in a   lonparmset provides an interface to setting course parameters. 
 course.  
   
 =head1 DESCRIPTION  =head1 DESCRIPTION
   
Line 130  javascript function 'pjump'. Line 129  javascript function 'pjump'.
   
 =item print_td()  =item print_td()
   
 =item check_other_groups()  =item print_usergroups()
   
 =item parm_control_group()  =item parm_control_group()
   
Line 150  Input: See list below Line 149  Input: See list below
   
 =back  =back
   
 Outputs: See list below  Outputs: See list below:
   
 =over 4  =over 4
   
Line 324  use HTML::Entities; Line 323  use HTML::Entities;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   
   sub startSettingsScreen {
       my ($r,$mode,$crstype)=@_;
   
       my $tabtext = &mt('Course Settings');
       if ($crstype eq 'Community') {
           $tabtext = &mt('Community Settings');
       } 
       $r->print("\n".'<ul class="LC_TabContentBigger" id="main">');
       $r->print("\n".'<li'.($mode eq 'coursepref'?' class="active"':'').'><a href="/adm/courseprefs"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                             $tabtext.
                                             '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
   
       $r->print("\n".'<li'.($mode eq 'parmset'?' class="active"':'').' id="tabbededitor"><a href="/adm/parmset"><b>'.
                                                                    &mt('Content and Problem Settings').'</b></a></li>');
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;" id="parameditor"><div id="maincoursedoc" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">');
   }
   
   sub endSettingsScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
   
   
   
 sub parmval {  sub parmval {
     my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;      my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,      return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
Line 753  sub storeparm_by_symb_inner { Line 777  sub storeparm_by_symb_inner {
   
   
 sub valout {  sub valout {
     my ($value,$type,$editable)=@_;      my ($value,$type,$name,$editable)=@_;
     my $result = '';      my $result = '';
     # Values of zero are valid.      # Values of zero are valid.
     if (! $value && $value ne '0') {      if (! $value && $value ne '0') {
Line 767  sub valout { Line 791  sub valout {
         }          }
     } else {      } else {
         if ($type eq 'date_interval') {          if ($type eq 'date_interval') {
             my ($totalsecs,$donesuffix) = split(/_/,$value,2);              my ($totalsecs,$donebutton) = split(/_/,$value);
             my ($usesdone,$donebuttontext,$proctor,$secretkey);  
             if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) {  
                 $donebuttontext = $1;  
                 (undef,$proctor,$secretkey) = split(/_/,$2);  
                 $usesdone = 'done';  
             } elsif ($donesuffix =~ /^done(|_.+)$/) {  
                 $donebuttontext = &mt('Done');  
                 ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix);  
             }  
             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);              my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);
             my @timer;              my @timer;
             $year=$year-70;              $year=$year-70;
Line 810  sub valout { Line 825  sub valout {
                 push(@timer,&mt('[quant,_1,sec]',0));                  push(@timer,&mt('[quant,_1,sec]',0));
             }              }
             $result.=join(", ",@timer);              $result.=join(", ",@timer);
             if ($usesdone eq 'done') {              if ($donebutton eq 'done') {
                 if ($secretkey) {                  $result .= ' '.&mt('+ "done"');
                     $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey);  
                 } else {  
                     $result .= ' + "'.$donebuttontext.'"';  
                 }  
             }              }
         } elsif (&isdateparm($type)) {          } elsif (&isdateparm($type)) {
             $result = &Apache::lonlocal::locallocaltime($value).              $result = &Apache::lonlocal::locallocaltime($value).
Line 834  sub plink { Line 845  sub plink {
     my ($type,$dis,$value,$marker,$return,$call)=@_;      my ($type,$dis,$value,$marker,$return,$call)=@_;
     my $winvalue=$value;      my $winvalue=$value;
     unless ($winvalue) {      unless ($winvalue) {
         if ((&isdateparm($type)) || (&is_specialstring($type))) {      if (&isdateparm($type)) {
             $winvalue=$env{'form.recent_'.$type};              $winvalue=$env{'form.recent_'.$type};
         } elsif ($type eq 'string_yesno') {  
             if ($env{'form.recent_string'} =~ /^(yes|no)$/i) {  
                 $winvalue=$env{'form.recent_string'};  
             }  
         } else {          } else {
             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};              $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
         }          }
Line 847  sub plink { Line 854  sub plink {
     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);      my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);      my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
     unless (defined($winvalue)) { $winvalue=$val; }      unless (defined($winvalue)) { $winvalue=$val; }
     my $valout = &valout($value,$type,1);      my $valout = &valout($value,$type,$parmname,1);
     my $unencmarker = $marker;      my $unencmarker = $marker;
     foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,      foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
               \$hour, \$min, \$sec) {                \$hour, \$min, \$sec) {
Line 872  sub page_js { Line 879  sub page_js {
     $pjump_def      $pjump_def
   
     function psub() {      function psub() {
         var specstring = /^string_!(yesno|any)/i;  
         if (document.parmform.pres_marker.value!='') {          if (document.parmform.pres_marker.value!='') {
             document.parmform.action+='#'+document.parmform.pres_marker.value;              document.parmform.action+='#'+document.parmform.pres_marker.value;
             var typedef=new Array();              var typedef=new Array();
             typedef=document.parmform.pres_type.value.split('_');              typedef=document.parmform.pres_type.value.split('_');
             if (document.parmform.pres_type.value!='') {             if (document.parmform.pres_type.value!='') {
                 if ((typedef[0]=='date') ||              if (typedef[0]=='date') {
                     (specstring.test(document.parmform.pres_type.value)))  {                  eval('document.parmform.recent_'+
                     eval('document.parmform.recent_'+                       document.parmform.pres_type.value+
                         document.parmform.pres_type.value+               '.value=document.parmform.pres_value.value;');
                         '.value=document.parmform.pres_value.value;');              } else {
                 } else {                  eval('document.parmform.recent_'+typedef[0]+
                     eval('document.parmform.recent_'+typedef[0]+               '.value=document.parmform.pres_value.value;');
                         '.value=document.parmform.pres_value.value;');  
                 }  
             }              }
          }
             document.parmform.submit();              document.parmform.submit();
         } else {          } else {
             document.parmform.pres_value.value='';              document.parmform.pres_value.value='';
Line 902  sub page_js { Line 907  sub page_js {
         var newWin = window.open(url, wdwName, options);          var newWin = window.open(url, wdwName, options);
         newWin.focus();          newWin.focus();
     }      }
   
 // ]]>  // ]]>
   
 </script>  </script>
 $selscript  $selscript
 ENDJS  ENDJS
Line 929  function showHide_courseContent() { Line 936  function showHide_courseContent() {
 COURSECONTENTSCRIPT  COURSECONTENTSCRIPT
 }  }
   
   sub toggleparmtextbox_js {
       return <<"ENDSCRIPT";
   
   if (!document.getElementsByClassName) {
       function getElementsByClassName(node, classname) {
           var a = [];
           var re = new RegExp('(^| )'+classname+'( |$)');
           var els = node.getElementsByTagName("*");
           for(var i=0,j=els.length; i<j; i++)
               if(re.test(els[i].className))a.push(els[i]);
           return a;
       }
   }
   
   function showHideLenient() {
       var lenients;
       var setRegExp = /^set_/;
       if (document.getElementsByClassName) {
           lenients = document.getElementsByClassName('LC_lenient_radio');
       } else {
           lenients = getElementsByClassName(document.body,'LC_lenient_radio');
       }
       if (lenients != 'undefined') {
           for (var i=0; i<lenients.length; i++) {
               if (lenients[i].checked) {
                   if (lenients[i].value == 'weighted') {
                       if (setRegExp.test(lenients[i].name)) {
                           var identifier = lenients[i].name.replace(setRegExp,'');
                           toggleParmTextbox(document.parmform,identifier);
                       }
                   }
               }
           }
       }
       return;
   }
   
   function toggleParmTextbox(form,key) {
       var divfortext = document.getElementById('LC_parmtext_'+key);
       if (divfortext) {
           var caller = form.elements['set_'+key];
           if (caller.length) {
               for (i=0; i<caller.length; i++) {
                   if (caller[i].checked) {
                       if (caller[i].value == 'weighted') {
                           divfortext.style.display = 'inline';
                       } else {
                           divfortext.style.display = 'none';
                       }
                   }
               }
           }
       }
       return;
   }
   
   ENDSCRIPT
   }
   
 sub validateparms_js {  sub validateparms_js {
     return <<'ENDSCRIPT';      return <<'ENDSCRIPT';
   
 function validateParms() {  function validateParms() {
       var textRegExp = /^settext_/;
       var tailLenient = /\.lenient$/;
       var patternRelWeight = /^\-?[\d.]+$/;
       var patternLenientStd = /^(yes|no|default)$/;
     var ipallowRegExp = /^setipallow_/;      var ipallowRegExp = /^setipallow_/;
     var ipdenyRegExp = /^setipdeny_/;      var ipdenyRegExp = /^setipdeny_/; 
     var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;      var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;
     if ((document.parmform.elements.length != 'undefined')  && (document.parmform.elements.length) != 'null') {      if ((document.parmform.elements.length != 'undefined')  && (document.parmform.elements.length) != 'null') {
         if (document.parmform.elements.length) {          if (document.parmform.elements.length) {
             for (i=0; i<document.parmform.elements.length; i++) {              for (i=0; i<document.parmform.elements.length; i++) {
                 var name=document.parmform.elements[i].name;                  var name=document.parmform.elements[i].name;
                 if (ipallowRegExp.test(name)) {                  if (textRegExp.test(name)) { 
                     var identifier = name.replace(ipallowRegExp,'');                      var identifier = name.replace(textRegExp,'');
                     var possallow = document.parmform.elements[i].value;                      if (tailLenient.test(identifier)) {
                     possallow = possallow.replace(/^\s+|\s+$/g,'');                          if (document.parmform.elements['set_'+identifier].length) {
                     if (patternIP.test(possallow)) {                              for (var j=0; j<document.parmform.elements['set_'+identifier].length; j++) {
                         if (document.parmform.elements['set_'+identifier].value) {                                  if (document.parmform.elements['set_'+identifier][j].checked) {
                             possallow = ','+possallow;                                      if (!(patternLenientStd.test(document.parmform.elements['set_'+identifier][j].value))) {
                                           var relweight = document.parmform.elements[i].value;
                                           relweight = relweight.replace(/^\s+|\s+$/g,'');
                                           if (!patternRelWeight.test(relweight)) {
                                               relweight = '0.0';
                                           }
                                           if (document.parmform.elements['set_'+identifier][j].value == 'weighted') {
                                               document.parmform.elements['set_'+identifier][j].value = relweight;
                                           } else {
                                               document.parmform.elements['set_'+identifier][j].value += ','+relweight;
                                           }
                                       }
                                       break;
                                   }
                               }
                         }                          }
                         document.parmform.elements['set_'+identifier].value += possallow;  
                     }                      }
                 } else if (ipdenyRegExp.test(name)) {                  } else {
                     var identifier = name.replace(ipdenyRegExp,'');                      if (ipallowRegExp.test(name)) {
                     var possdeny = document.parmform.elements[i].value;                          var identifier = name.replace(ipallowRegExp,'');
                     possdeny = possdeny.replace(/^\s+|\s+$/g,'');                          var possallow = document.parmform.elements[i].value;
                     if (patternIP.test(possdeny)) {                          possallow = possallow.replace(/^\s+|\s+$/g,'');
                         possdeny = '!'+possdeny;                          if (patternIP.test(possallow)) {
                         if (document.parmform.elements['set_'+identifier].value) {                              if (document.parmform.elements['set_'+identifier].value) {
                             possdeny = ','+possdeny;                                  possallow = ','+possallow;
                               }
                               document.parmform.elements['set_'+identifier].value += possallow; 
                           }
                       } else {
                           if (ipdenyRegExp.test(name)) {
                               var identifier = name.replace(ipdenyRegExp,'');
                               var possdeny = document.parmform.elements[i].value;
                               possdeny = possdeny.replace(/^\s+|\s+$/g,'');
                               if (patternIP.test(possdeny)) {
                                   possdeny = '!'+possdeny;
                                   if (document.parmform.elements['set_'+identifier].value) {
                                       possdeny = ','+possdeny;
                                   }
                                   document.parmform.elements['set_'+identifier].value += possdeny;
                               }
                         }                          }
                     }                      }
                 }                  }
Line 970  function validateParms() { Line 1068  function validateParms() {
 ENDSCRIPT  ENDSCRIPT
 }  }
   
 # Javascript initialization, for overview mode  
 sub ipacc_boxes_js  {  sub ipacc_boxes_js  {
     my $remove = &mt('Remove');      my $remove = &mt('Remove');
     return <<"END";      return <<"END";
Line 995  sub ipacc_boxes_js  { Line 1092  sub ipacc_boxes_js  {
 END  END
 }  }
   
 sub done_proctor_js {  
     return <<"END";  
 function toggleSecret(form,radio,key) {  
     var radios = form[radio+key];  
     if (radios.length) {  
         for (var i=0; i<radios.length; i++) {  
             if (radios[i].checked) {  
                 if (radios[i].value == '_done_proctor') {  
                     if (document.getElementById('done_'+key+'_proctorkey')) {  
                         document.getElementById('done_'+key+'_proctorkey').type='text';  
                     }  
                 } else {  
                     if (document.getElementById('done_'+key+'_proctorkey')) {  
                         document.getElementById('done_'+key+'_proctorkey').type='hidden';  
                         document.getElementById('done_'+key+'_proctorkey').value='';  
                     }  
                 }  
             }  
         }  
     }  
 }  
 END  
   
 }  
   
 sub startpage {  sub startpage {
     my ($r,$psymb) = @_;      my ($r,$psymb,$crstype) = @_;
   
     my %loaditems = (      my %loaditems = (
                       'onload'   => "group_or_section('cgroup')",                        'onload'   => "group_or_section('cgroup')",
Line 1048  sub startpage { Line 1120  sub startpage {
 </script>  </script>
 ';  ';
     my $start_page =      my $start_page =
     &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,          &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
                        {'add_entries' => \%loaditems,});                                         {'add_entries' => \%loaditems,});
     my $breadcrumbs =      my $breadcrumbs =
     &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');      &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
     my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});      my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});
     my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});      my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDHEAD);      $r->print(<<ENDHEAD);
 <form method="post" action="/adm/parmset?action=settable" name="parmform">  <form method="post" action="/adm/parmset?action=settable" name="parmform">
 <input type="hidden" value="" name="pres_value" />  <input type="hidden" value="" name="pres_value" />
Line 1069  ENDHEAD Line 1142  ENDHEAD
   
 sub print_row {  sub print_row {
     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,      my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
     $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,      $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_;
     $readonly)=@_;  
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
   
 # get the values for the parameter in cascading order  # get the values for the parameter in cascading order
 # empty levels will remain empty  # empty levels will remain empty
     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},      my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
Line 1109  sub print_row { Line 1182  sub print_row {
     my $thismarker=$which;      my $thismarker=$which;
     $thismarker=~s/^parameter\_//;      $thismarker=~s/^parameter\_//;
     my $mprefix=$rid.'&'.$thismarker.'&';      my $mprefix=$rid.'&'.$thismarker.'&';
     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);      my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);
     my ($othergrp,$grp_parm,$controlgrp);      my ($othergrp,$grp_parm,$controlgrp);
   
     if ($parmlev eq 'general') {      if ($parmlev eq 'general') {
   
         if ($uname) {          if ($uname) {
             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } else {          } else {
             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         }          }
     } elsif ($parmlev eq 'map') {      } elsif ($parmlev eq 'map') {
   
         if ($uname) {          if ($uname) {
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } elsif ($cgroup) {          } elsif ($cgroup) {
             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         } else {          } else {
             &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         }          }
     } else {      } else {
         if ($uname) {          if ($uname) {
             if (@{$usersgroups} > 1) {              if (@{$usersgroups} > 1) {
                 my ($coursereply,$grp_parm,$controlgrp);                  my ($coursereply,$grp_parm,$controlgrp);
                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =                  ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                     &check_other_groups($$part{$which}.'.'.$$name{$which},                      &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);                         $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                 if ($coursereply && $result > 3) {                  if ($coursereply && $result > 3) {
                     if (defined($controlgrp)) {                      if (defined($controlgrp)) {
Line 1152  sub print_row { Line 1224  sub print_row {
             }              }
         }          }
   
         &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
           &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
     &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);  
           if ($csec) {
     if ($csec) {              &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);          }
     }  
   
         if ($cgroup) {          if ($cgroup) {
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);              &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
         }          }
   
     if ($uname) {          if ($uname) {
             if ($othergrp) {              if ($othergrp) {
                 $r->print($othergrp);                  $r->print($othergrp);
             }              }
         &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
         &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@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.'</td>');
Line 1189  sub print_row { Line 1260  sub print_row {
         my $sessionvaltype=$typeoutpar[$result];          my $sessionvaltype=$typeoutpar[$result];
         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }          if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
         $r->print('<td style="background-color:#999999;" align="center"><font color="#FFFFFF">'.          $r->print('<td style="background-color:#999999;" align="center"><font color="#FFFFFF">'.
                   &valout($sessionval,$sessionvaltype).'&nbsp;'.                    &valout($sessionval,$sessionvaltype,$$name{$which}).'&nbsp;'.
                   '</font></td>');                    '</font></td>');
     }      }
     $r->print('</tr>');      $r->print('</tr>');
Line 1197  sub print_row { Line 1268  sub print_row {
 }  }
   
 sub print_td {  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;
     $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).      $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).
               ';" align="center">');                ';" align="center">');
     my $nolink = 0;      my $nolink = 0;
     if ($readonly) {      if ($which == 11 || $which == 12) {
         $nolink = 1;          $nolink = 1;
     } else {      } elsif (($env{'request.course.sec'} ne '') && ($which > 9)) {
         if ($which == 11 || $which == 12) {          $nolink = 1;
       } elsif ($which == 4 || $which ==  5 || $which == 6) {
           if ($noeditgrp) {
             $nolink = 1;              $nolink = 1;
         } elsif (($env{'request.course.sec'} ne '') && ($which > 9)) {          }
       } elsif ($mprefix =~ /availablestudent\&$/) {
           if ($which > 3) {
               $nolink = 1;
           }
       } elsif ($mprefix =~ /examcode\&$/) {
           unless ($which == 2) {
             $nolink = 1;              $nolink = 1;
         } elsif ($which == 4 || $which ==  5 || $which == 6) {  
             if ($noeditgrp) {  
                 $nolink = 1;  
             }  
         } elsif ($mprefix =~ /availablestudent\&$/) {  
             if ($which > 3) {  
                 $nolink = 1;  
             }  
         } elsif ($mprefix =~ /examcode\&$/) {  
             unless ($which == 2) {  
                 $nolink = 1;  
             }  
         }          }
     }      }
     if ($nolink) {      if ($nolink) {
         $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));          $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix));
     } else {      } else {
         $r->print(&plink($$typeoutpar[$which],          $r->print(&plink($$typeoutpar[$which],
                          $$display{$value},$$outpar[$which],                           $$display{$value},$$outpar[$which],
Line 1232  sub print_td { Line 1299  sub print_td {
     $r->print('</td>'."\n");      $r->print('</td>'."\n");
 }  }
   
 sub check_other_groups {  sub print_usergroups {
     my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;      my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
     my $courseid = $env{'request.course.id'};      my $courseid = $env{'request.course.id'};
     my $output;      my $output;
     my $symb = &symbcache($rid);      my $symb = &symbcache($rid);
Line 1248  sub check_other_groups { Line 1315  sub check_other_groups {
     if (($coursereply) && ($cgroup ne $resultgroup)) {      if (($coursereply) && ($cgroup ne $resultgroup)) {
         if ($result > 3) {          if ($result > 3) {
             $bgcolor = '#AAFFAA';              $bgcolor = '#AAFFAA';
               $grp_parm = &valout($coursereply,$resulttype,$what);
         }          }
         $grp_parm = &valout($coursereply,$resulttype);          $grp_parm = &valout($coursereply,$resulttype,$what);
         $output = '<td style="background-color:'.$bgcolor.';" align="center">';          $output = '<td style="background-color:'.$bgcolor.';" align="center">';
         if ($resultgroup && $resultlevel) {          if ($resultgroup && $resultlevel) {
             $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;              $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;
Line 1393  sub isdateparm { Line 1461  sub isdateparm {
     return (($type=~/^date/) && (!($type eq 'date_interval')));      return (($type=~/^date/) && (!($type eq 'date_interval')));
 }  }
   
 # Determine if parameter type is specialized string type (i.e.,  
 # not just string or string_yesno.  
   
 sub is_specialstring {  
     my $type=shift;  
     return (($type=~/^string_/) && (($type ne 'string_yesno')));  
 }  
   
 #  #
 # parmmenu displays a list of the selected parameters.  # parmmenu displays a list of the selected parameters.
 # It also offers a link to show/hide the complete parameter list  # It also offers a link to show/hide the complete parameter list
 # from which you can select all desired parameters.  # from which you can select all desired parameters.
 #  #
 sub parmmenu {  sub parmmenu {
     my ($r)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
       my $tempkey;
     $r->print(<<ENDSCRIPT);      $r->print(<<ENDSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 1486  sub parmmenu { Line 1547  sub parmmenu {
 ENDSCRIPT  ENDSCRIPT
   
     $r->print('<hr />');      $r->print('<hr />');
     &shortCuts($r);      &shortCuts($r,$allparms,$pscat,$keyorder);
     $r->print('<hr />');      $r->print('<hr />');
 }  }
 # return a hash  # return a hash
Line 1550  sub lookUpTableParameter { Line 1611  sub lookUpTableParameter {
         'lenient' => 'grading',          'lenient' => 'grading',
         'retrypartial' => 'tries',          'retrypartial' => 'tries',
         'discussvote'  => 'misc',          'discussvote'  => 'misc',
         'examcode' => 'high_level_randomization',          'examcode' => 'high_level_randomization', 
     );      );    
 }  }
   
 sub whatIsMyCategory {  sub whatIsMyCategory {
Line 1602  sub category_order { Line 1663  sub category_order {
   
 sub parmboxes {  sub parmboxes {
     my ($r,$allparms,$pscat,$keyorder)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
     my $tempkey;      my %categories = &categories();
     my $tempparameter;  
     my %categories = &categories;  
     my %category_order = &category_order();      my %category_order = &category_order();
     my %categoryList = (      my %categoryList = (
         'time_settings' => [],          'time_settings' => [],
Line 1619  sub parmboxes { Line 1678  sub parmboxes {
         'misc' => [],          'misc' => [],
     );      );
   
     foreach $tempparameter (keys %$allparms) {      foreach my $tempparameter (keys(%$allparms)) {
         &whatIsMyCategory($tempparameter, \%categoryList);          &whatIsMyCategory($tempparameter, \%categoryList);
     }      }
     #part to print the parm-list      #part to print the parm-list
     $r->print('<div class="LC_columnSection">'."\n");      foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {
           next if (@{$categoryList{$key}} == 0);
     #Print parameters          next if ($key eq '');
     for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) {  
         next if(@{$categoryList{$key}} == 0);  
         $r->print('<div class="LC_Box LC_400Box">'          $r->print('<div class="LC_Box LC_400Box">'
                   .'<h4 class="LC_hcell">'                   .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");
                   .&mt($categories{$key})          foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
                   .'</h4>'."\n");  
         foreach $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {  
             next if ($tempkey eq '');  
             $r->print('<span class="LC_nobreak">'              $r->print('<span class="LC_nobreak">'
                      .'<label><input type="checkbox" name="pscat" '                       .'<label><input type="checkbox" name="pscat" '
                      .'value="'.$tempkey.'" ');                       .'value="'.$tempkey.'" ');
             if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {              if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                 $r->print(' checked="checked"');                  $r->print( ' checked="checked"');
             }              }
             $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}              $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
                                                       : $tempkey)                                                        : $tempkey)
                      .'</label></span><br />'."\n");                       .'</label></span><br />'."\n");
         }          }
         $r->print("</div>\n");          $r->print('</div>');
     }      }
       $r->print("\n");
     $r->print("</div>\n");  
 }  }
 #  #
 # This function offers some links on the parameter section to get with one click a group a parameters  # This function offers some links on the parameter section to get with one click a group a parameters
 #  #
 sub shortCuts {  sub shortCuts {
     my ($r)=@_;      my ($r,$allparms,$pscat,$keyorder)=@_;
   
     # Parameter Selection      # Parameter Selection
     $r->print(      $r->print(
Line 1725  sub usermenu { Line 1778  sub usermenu {
     if (($pssymb) || &Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {      if (($pssymb) || &Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
         %grouphash = &Apache::longroup::coursegroups();          %grouphash = &Apache::longroup::coursegroups();
     } elsif ($env{'request.course.groups'} ne '') {      } elsif ($env{'request.course.groups'} ne '') {
         map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});          map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
     }      }
   
     my $g_s_header='';      my $g_s_header='';
Line 1743  sub usermenu { Line 1796  sub usermenu {
             $sections .= qq| onchange="group_or_section('csec')" |;              $sections .= qq| onchange="group_or_section('csec')" |;
         }          }
         $sections .= '>';          $sections .= '>';
     foreach my $section ('',sort keys %sectionhash) {      foreach my $section ('',sort(keys(%sectionhash))) {
         $sections.='<option value="'.$section.'" '.          $sections.='<option value="'.$section.'" '.
         ($section eq $csec?'selected="selected"':'').'>'.$section.          ($section eq $csec?'selected="selected"':'').'>'.$section.
                                                               '</option>';                                                                '</option>';
Line 1770  function group_or_section(caller) { Line 1823  function group_or_section(caller) {
 // ]]>  // ]]>
 </script>  </script>
 |;  |;
     } elsif ($currsec eq '') {      } else {
         $sections .= qq|          $sections .= qq|
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 1788  function group_or_section(caller) { Line 1841  function group_or_section(caller) {
             $groups .= qq| onchange="group_or_section('cgroup')" |;              $groups .= qq| onchange="group_or_section('cgroup')" |;
         }          }
         $groups .= '>';          $groups .= '>';
         foreach my $grp ('',sort keys %grouphash) {          foreach my $grp ('',sort(keys(%grouphash))) {
             $groups.='<option value="'.$grp.'" ';              $groups.='<option value="'.$grp.'" ';
             if ($grp eq $cgroup) {              if ($grp eq $cgroup) {
                 unless ((defined($uname)) && ($grp eq '')) {                  unless ((defined($uname)) && ($grp eq '')) {
Line 1810  function group_or_section(caller) { Line 1863  function group_or_section(caller) {
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));
         $r->print($sections.$groups);          $r->print($sections.$groups);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
       } else {
           $r->print($sections); 
     }      }
   
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));      $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));
Line 1823  function group_or_section(caller) { Line 1878  function group_or_section(caller) {
 # This function shows on table Mode the available Parameters for the selected Resources  # This function shows on table Mode the available Parameters for the selected Resources
 #  #
 sub displaymenu {  sub displaymenu {
     my ($r,$allparms,$pscat,$keyorder,$divid)=@_;      my ($r,$allparms,$pscat,$psprt,$keyorder,$divid)=@_;
   
     $r->print(&Apache::lonhtmlcommon::start_pick_box());      $r->print(&Apache::lonhtmlcommon::start_pick_box());
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
   
     &parmmenu($r);      &parmmenu($r,$allparms,$pscat,$keyorder);
     $r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid));      $r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid));
     &parmboxes($r,$allparms,$pscat,$keyorder);      &parmboxes($r,$allparms,$pscat,$keyorder);
     $r->print(&Apache::loncommon::end_scrollbox());      $r->print(&Apache::loncommon::end_scrollbox());
Line 1994  sub mapmenu { Line 2049  sub mapmenu {
 sub levelmenu {  sub levelmenu {
     my ($r,$alllevs,$parmlev)=@_;      my ($r,$alllevs,$parmlev)=@_;
   
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').
                                                   &Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
     $r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');      $r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');
     foreach (reverse sort keys %{$alllevs}) {      foreach my $lev (reverse(sort(keys(%{$alllevs})))) {
     $r->print('<option value="'.$$alllevs{$_}.'"');          $r->print('<option value="'.$$alllevs{$lev}.'"');
     if ($parmlev eq $$alllevs{$_}) {          if ($parmlev eq $$alllevs{$lev}) {
         $r->print(' selected="selected"');              $r->print(' selected="selected"');
     }          }
     $r->print('>'.&mt($_).'</option>');          $r->print('>'.&mt($lev).'</option>');
     }      }
     $r->print("</select>");      $r->print("</select>");
 }  }
Line 2023  sub sectionmenu { Line 2079  sub sectionmenu {
     my $output = '<select name="Section" multiple="multiple" size="8"'.$disabled.'>';      my $output = '<select name="Section" multiple="multiple" size="8"'.$disabled.'>';
     foreach my $s (@possibles) {      foreach my $s (@possibles) {
         $output .= '    <option value="'.$s.'"';          $output .= '    <option value="'.$s.'"';
         if ((@{$selectedsections}) && (grep(/^\Q$s\E$/,@{$selectedsections}))) {          if ((@{$selectedsections}) && (grep(/^\Q$s\E$/,@{$selectedsections}))) {  
             $output .= ' selected="selected"';              $output .= ' selected="selected"';
         }          }
         $output .= '>'."$s</option>\n";          $output .= '>'."$s</option>\n";
Line 2038  sub groupmenu { Line 2094  sub groupmenu {
     if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {      if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
         %grouphash = &Apache::longroup::coursegroups();          %grouphash = &Apache::longroup::coursegroups();
     } elsif ($env{'request.course.groups'} ne '') {      } elsif ($env{'request.course.groups'} ne '') {
         map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});           map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
     }      }
     return '' if (!%grouphash);      return '' if (!%grouphash);
   
Line 2046  sub groupmenu { Line 2102  sub groupmenu {
     foreach my $group (sort(keys(%grouphash))) {      foreach my $group (sort(keys(%grouphash))) {
         $output .= '    <option value="'.$group.'"';          $output .= '    <option value="'.$group.'"';
         if ((@{$selectedgroups}) && (grep(/^\Q$group\E$/,\@{$selectedgroups}))) {          if ((@{$selectedgroups}) && (grep(/^\Q$group\E$/,\@{$selectedgroups}))) {
             $output .= ' selected="selected"';              $output .=  ' selected="selected"';
         }          }
         $output .= '>'.$group."</option>\n";          $output .= '>'."$group</option>\n";
     }      }
     $output .= "</select>\n";      $output .= "</select>\n";
     return $output;      return $output;
Line 2063  sub keysinorder { Line 2119  sub keysinorder {
     my ($name,$keyorder)=@_;      my ($name,$keyorder)=@_;
     return sort {      return sort {
     $$keyorder{$a} <=> $$keyorder{$b};      $$keyorder{$a} <=> $$keyorder{$b};
     } (keys %{$name});      } (keys(%{$name}));
 }  }
   
 sub keysinorder_bytype {  sub keysinorder_bytype {
Line 2075  sub keysinorder_bytype { Line 2131  sub keysinorder_bytype {
         return ($a cmp $b);          return ($a cmp $b);
     }      }
     $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};      $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
     } (keys %{$name});      } (keys(%{$name}));
 }  }
   
 sub keysindisplayorder {  sub keysindisplayorder {
     my ($name,$keyorder)=@_;      my ($name,$keyorder)=@_;
     return sort {      return sort {
     $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};      $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
     } (keys %{$name});      } (keys(%{$name}));
 }  }
   
 sub sortmenu {  sub sortmenu {
Line 2129  sub standardkeyorder { Line 2185  sub standardkeyorder {
   
 sub assessparms {  sub assessparms {
   
     my ($r,$parm_permission) = @_;      my $r=shift;
   
   
   
 # -------------------------------------------------------- Variable declaration  # -------------------------------------------------------- Variable declaration
Line 2178  sub assessparms { Line 2235  sub assessparms {
   
 # Check group privs.  # Check group privs.
     $cgroup=$env{'form.cgroup'};      $cgroup=$env{'form.cgroup'};
     my $noeditgrp;      my $noeditgrp; 
     if ($cgroup ne '') {      if ($cgroup ne '') {
         unless (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {          unless (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
             if (($env{'request.course.groups'} eq '') ||              if (($env{'request.course.groups'} eq '') || 
                 (!grep(/^\Q$cgroup\E$/,split(/:/,$env{'request.course.groups'})))) {                  (!grep(/^\Q$cgroup\E$/,split(/,/,$env{'request.course.groups'})))) {
                 $noeditgrp = 1;                  $noeditgrp = 1;
             }              }
         }          }
Line 2201  sub assessparms { Line 2258  sub assessparms {
   
   
     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');      my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
     if (!@psprt) { $psprt[0]='0'; }      if (!@psprt) { $psprt[0]='all'; }
     if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; }      if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; }
   
     my $pssymb='';      my $pssymb='';
Line 2234  sub assessparms { Line 2291  sub assessparms {
   
     my $id=$env{'form.id'};      my $id=$env{'form.id'};
     if (($id) && ($udom)) {      if (($id) && ($udom)) {
         $uname=(&Apache::lonnet::idget($udom,$id))[1];          $uname=(&Apache::lonnet::idget($udom,[$id],'ids'))[1];
         if ($uname) {          if ($uname) {
             $id='';              $id='';
         } else {          } else {
             $message=              $message=
             '<span class="LC_error">'.&mt("Unknown ID")." '$id' ".                  '<p class="LC_warning">'.
             &mt('at domain')." '$udom'</span>";                  &mt('Unknown ID [_1] at domain [_2]',
                       "'".$id."'","'".$udom."'").
                   '</p>';
         }          }
     } else {      } else {
         $uname=$env{'form.uname'};          $uname=$env{'form.uname'};
Line 2251  sub assessparms { Line 2310  sub assessparms {
         $uhome=&Apache::lonnet::homeserver($uname,$udom);          $uhome=&Apache::lonnet::homeserver($uname,$udom);
         if ($uhome eq 'no_host') {          if ($uhome eq 'no_host') {
             $message=              $message=
             '<span class="LC_error">'.&mt("Unknown user")." '$uname' ".                  '<p class="LC_warning">'.
             &mt("at domain")." '$udom'</span>";                  &mt('Unknown user [_1] at domain [_2]',
                       "'".$uname."'","'".$udom."'").
                   '</p>';
             $uname='';              $uname='';
         } else {          } else {
             $csec=&Apache::lonnet::getsection($udom,$uname,              $csec=&Apache::lonnet::getsection($udom,$uname,
                           $env{'request.course.id'});                            $env{'request.course.id'});
             if ($csec eq '-1') {              if ($csec eq '-1') {
                 $message='<span class="LC_error">'.                  $message=
                 &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".                      '<p class="LC_warning">'.
                 &mt("not in this course")."</span>";                      &mt('User [_1] at domain [_2] not in this course',
                           "'".$uname."'","'".$udom."'").
                       '</p>';
                 $uname='';                  $uname='';
                 $csec=$env{'form.csec'};                  $csec=$env{'form.csec'};
                 $cgroup=$env{'form.cgroup'};                  $cgroup=$env{'form.cgroup'};
Line 2294  sub assessparms { Line 2357  sub assessparms {
     $symbp{'0.0'} = '';      $symbp{'0.0'} = '';
   
 # ---------------------------------------------------------- Anything to store?  # ---------------------------------------------------------- Anything to store?
     if ($env{'form.pres_marker'} && $parm_permission->{'edit'}) {      if ($env{'form.pres_marker'}) {
         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});          my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
         my @values=split(/\&\&\&/,$env{'form.pres_value'});          my @values=split(/\&\&\&/,$env{'form.pres_value'});
         my @types=split(/\&\&\&/,$env{'form.pres_type'});          my @types=split(/\&\&\&/,$env{'form.pres_type'});
Line 2311  sub assessparms { Line 2374  sub assessparms {
             }              }
             if ($markers[$i] =~ /\&(6|5|4)$/) {              if ($markers[$i] =~ /\&(6|5|4)$/) {
                 next if ($noeditgrp);                  next if ($noeditgrp);
             }              } 
             if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {              if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
                 my (@ok_slots,@fail_slots,@del_slots);                  my (@ok_slots,@fail_slots,@del_slots);
                 my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);                  my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
Line 2342  sub assessparms { Line 2405  sub assessparms {
                         }                          }
                     }                      }
                 }                  }
             } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode|printstartdate|printenddate)\&\d+$/) {              } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode|printstartdate|printenddate|acc|interval)\&\d+$/) {
                 $name = $1;                  $name = $1;
                 my $val = $values[$i];                  my $val = $values[$i];
                   my $valmatch = '';
                 if ($name eq 'examcode') {                  if ($name eq 'examcode') {
                     if (&Apache::lonnet::validCODE($values[$i])) {                      if (&Apache::lonnet::validCODE($values[$i])) {
                         $val = 'valid';                          $val = 'valid';
Line 2354  sub assessparms { Line 2418  sub assessparms {
                         if ($val > $now) {                          if ($val > $now) {
                             $val = 'future';                              $val = 'future';
                         }                          }
                     }                      } 
                 } elsif ($name eq 'printenddate') {                  } elsif ($name eq 'printenddate') {
                     if ($val =~ /^\d+$/) {                      if ($val =~ /^\d+$/) {
                         if ($val < $now) {                          if ($val < $now) {
                             $val = 'past';                              $val = 'past';
                         }                          }
                     }                      }
                   } elsif (($name eq 'lenient') || ($name eq 'acc')) {
                       my $stringtype = &get_stringtype($name);
                       my $stringmatch = &standard_string_matches($stringtype);
                       if (ref($stringmatch) eq 'ARRAY') {
                           foreach my $item (@{$stringmatch}) {
                               if (ref($item) eq 'ARRAY') {
                                   my ($regexpname,$pattern) = @{$item};
                                   if ($pattern ne '') {
                                       if ($val =~ /$pattern/) {
                                           $valmatch = $regexpname;
                                           $val = '';
                                           last;
                                       }
                                   }
                               }
                           }
                       }
                   } elsif ($name eq 'interval') {
                       my $intervaltype = &get_intervaltype($name);
                       my $intervalmatch = &standard_interval_matches($intervaltype);
                       if (ref($intervalmatch) eq 'ARRAY') {
                           foreach my $item (@{$intervalmatch}) {
                               if (ref($item) eq 'ARRAY') {
                                   my ($regexpname,$pattern) = @{$item};
                                   if ($pattern ne '') {
                                       if ($val =~ /$pattern/) {
                                           $valmatch = $regexpname;
                                           $val = '';
                                           last;
                                       }
                                   }
                               }
                           }
                       }
                 }                  }
                 $needsrelease =                  $needsrelease =
                     $Apache::lonnet::needsrelease{"parameter:$name:$val"};                      $Apache::lonnet::needsrelease{"parameter:$name:$val:$valmatch"};
                 if ($needsrelease) {                  if ($needsrelease) {
                     unless ($got_chostname) {                      unless ($got_chostname) {
                         ($chostname,$cmajor,$cminor) = &parameter_release_vars();                          ($chostname,$cmajor,$cminor) = &parameter_release_vars();
                         $got_chostname = 1;                          $got_chostname = 1;
                     }                      } 
                     $needsnewer = &parameter_releasecheck($name,$val,                      $needsnewer = &parameter_releasecheck($name,$val,$valmatch,
                                                           $needsrelease,                                                            $needsrelease,
                                                           $cmajor,$cminor);                                                            $cmajor,$cminor);
                 }                  }
Line 2394  sub assessparms { Line 2492  sub assessparms {
         }          }
     }      }
 #----------------------------------------------- if all selected, fill in array  #----------------------------------------------- if all selected, fill in array
     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}      if ($pscat[0] eq "all") {@pscat = (keys(%allparms));}
     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };      if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };
     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}      if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys(%allparts));}
 # ------------------------------------------------------------------ Start page  # ------------------------------------------------------------------ Start page
   
     &startpage($r,$pssymb);      my $crstype = &Apache::loncommon::course_type();
       &startpage($r,$pssymb,$crstype);
   
     foreach my $item ('tolerance','date_default','date_start','date_end',      foreach my $item ('tolerance','date_default','date_start','date_end',
                       'date_interval','int','float','string','string_lenient',          'date_interval','int','float','string') {
                       'string_examcode','string_deeplink','string_discussvote',  
                       'string_useslots','string_problemstatus','string_ip',  
                       'string_questiontype') {  
         $r->print('<input type="hidden" value="'.          $r->print('<input type="hidden" value="'.
           &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').            &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').
           '" name="recent_'.$item.'" />');            '" name="recent_'.$item.'" />');
Line 2454  ENDPARMSELSCRIPT Line 2550  ENDPARMSELSCRIPT
   
         # Step 2          # Step 2
         $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));          $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
         &displaymenu($r,\%allparms,\@pscat,\%keyorder,'parmmenuscroll');          &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder,'parmmenuscroll');
   
         # Step 3          # Step 3
         $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));          $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
Line 2482  ENDPARMSELSCRIPT Line 2578  ENDPARMSELSCRIPT
              .'</a>'               .'</a>'
              .'</p>');               .'</p>');
     } else {      } else {
         $r->print();  
         # parameter screen for a single resource.           # parameter screen for a single resource. 
         my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);          my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);
         my $title = &Apache::lonnet::gettitle($pssymb);          my $title = &Apache::lonnet::gettitle($pssymb);
Line 2492  ENDPARMSELSCRIPT Line 2587  ENDPARMSELSCRIPT
                   '<br />');                    '<br />');
         $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));          $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
         $r->print(&Apache::lonhtmlcommon::start_pick_box());          $r->print(&Apache::lonhtmlcommon::start_pick_box());
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')).  
                   '<label>'.  
                   '<input type="checkbox" name="psprt" value="all"'.  
                   ($env{'form.psprt'}?' checked="checked"':'').' />'.  
                   &mt('Show all parts').  
                   '</label></td></tr>');  
         &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);          &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
         $r->print(&Apache::lonhtmlcommon::row_closure(1));          $r->print(&Apache::lonhtmlcommon::row_closure(1));
         $r->print(&Apache::lonhtmlcommon::end_pick_box());          $r->print(&Apache::lonhtmlcommon::end_pick_box());
Line 2522  ENDPARMSELSCRIPT Line 2611  ENDPARMSELSCRIPT
   
     @pscat = @temp_pscat;      @pscat = @temp_pscat;
   
   
     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {      if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
 # ----------------------------------------------------------------- Start Table  # ----------------------------------------------------------------- Start Table
         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;          my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
         my $csuname=$env{'user.name'};          my $csuname=$env{'user.name'};
         my $csudom=$env{'user.domain'};          my $csudom=$env{'user.domain'};
         my $readonly = 1;  
         if ($parm_permission->{'edit'}) {  
             undef($readonly);  
         }  
   
         if ($parmlev eq 'full') {          if ($parmlev eq 'full') {
 #  #
Line 2553  ENDPARMSELSCRIPT Line 2639  ENDPARMSELSCRIPT
                        $userspan ++;                         $userspan ++;
                    }                     }
                    $r->print('<th colspan="'.$userspan.'" rowspan="2">');                     $r->print('<th colspan="'.$userspan.'" rowspan="2">');
                    $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");                     $r->print(&mt('User [_1] at Domain [_2]',"'".$uname."'","'".$udom."'").'</th>');
                }                 }
                my %lt=&Apache::lonlocal::texthash(                 my %lt=&Apache::lonlocal::texthash(
                 'pie'    => "Parameter in Effect",                  'pie'    => "Parameter in Effect",
Line 2616  ENDTABLEHEADFOUR Line 2702  ENDTABLEHEADFOUR
                my $defbgtwo='';                 my $defbgtwo='';
                my $defbgthree = '';                 my $defbgthree = '';
   
                foreach (@ids) {                 foreach my $rid (@ids) {
   
                 my $rid=$_;  
                 my ($inmapid)=($rid=~/\.(\d+)$/);                  my ($inmapid)=($rid=~/\.(\d+)$/);
   
                 if ((!$pssymb &&                  if ((!$pssymb &&
Line 2652  ENDTABLEHEADFOUR Line 2737  ENDTABLEHEADFOUR
                     my $uri=&Apache::lonnet::declutter($uris{$rid});                      my $uri=&Apache::lonnet::declutter($uris{$rid});
   
                     my $filter=$env{'form.filter'};                      my $filter=$env{'form.filter'};
                     foreach (&keysplit($keyp{$rid})) {                      foreach my $tempkeyp (&keysplit($keyp{$rid})) {
                         my $tempkeyp = $_;  
                         if (grep $_ eq $tempkeyp, @catmarker) {                          if (grep $_ eq $tempkeyp, @catmarker) {
                           my $parmname=&Apache::lonnet::metadata($uri,$_.'.name');                            my $parmname=&Apache::lonnet::metadata($uri,$tempkeyp.'.name');
 # We may only want certain parameters listed  # We may only want certain parameters listed
                           if ($filter) {                            if ($filter) {
                              unless ($filter=~/\Q$parmname\E/) { next; }                               unless ($filter=~/\Q$parmname\E/) { next; }
                           }                            }
                           $name{$_}=$parmname;                            $name{$tempkeyp}=$parmname;
                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');                            $part{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.part');
   
                           my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');                            my $parmdis=&Apache::lonnet::metadata($uri,$tempkeyp.'.display');
                           if ($allparms{$name{$_}} ne '') {                            if ($allparms{$name{$tempkeyp}} ne '') {
                               my $identifier;                                my $identifier;
                               if ($parmdis =~ /(\s*\[Part.*)$/) {                                if ($parmdis =~ /(\s*\[Part.*)$/) {
                                   $identifier = $1;                                    $identifier = $1;
                               }                                }
                               $display{$_} = $allparms{$name{$_}}.$identifier;                                $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                           } else {                            } else {
                               $display{$_} = $parmdis;                                $display{$tempkeyp} = $parmdis;
                           }                            }
                           unless ($display{$_}) { $display{$_}=''; }                            unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                           $display{$_}.=' ('.$name{$_}.')';                            $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                           $default{$_}=&Apache::lonnet::metadata($uri,$_);                            $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp);
                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');                            $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.type');
                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');                            $thistitle=&Apache::lonnet::metadata($uri,$tempkeyp.'.title');
                         }                          }
                     }                      }
                     my $totalparms=scalar keys %name;                      my $totalparms=scalar(keys(%name));
                     if ($totalparms>0) {                      if ($totalparms>0) {
                            my $firstrow=1;                             my $firstrow=1;
                         my $title=&Apache::lonnet::gettitle($symbp{$rid});                          my $title=&Apache::lonnet::gettitle($symbp{$rid});
Line 2706  ENDTABLEHEADFOUR Line 2790  ENDTABLEHEADFOUR
                         $r->print('<td style="background-color:'.$defbgone.';"'.                          $r->print('<td style="background-color:'.$defbgone.';"'.
                                       ' rowspan='.$totalparms.                                        ' rowspan='.$totalparms.
                                       '>'.$maptitles{$mapp{$rid}}.'</td>');                                        '>'.$maptitles{$mapp{$rid}}.'</td>');
                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {                          foreach my $item (&keysinorder_bytype(\%name,\%keyorder)) {
   
                             unless ($firstrow) {                              unless ($firstrow) {
                                 $r->print('<tr>');                                  $r->print('<tr>');
                             } else {                              } else {
                                 undef $firstrow;                                  undef $firstrow;
                             }                              }
                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,                              &print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default,
                                        \%type,\%display,$defbgone,$defbgtwo,                                         \%type,\%display,$defbgone,$defbgtwo,
                                        $defbgthree,$parmlev,$uname,$udom,$csec,                                         $defbgthree,$parmlev,$uname,$udom,$csec,
                                        $cgroup,\@usersgroups,$noeditgrp,$readonly);                                         $cgroup,\@usersgroups,$noeditgrp);
                         }                          }
                     }                      }
                 }                  }
Line 2740  ENDTABLEHEADFOUR Line 2823  ENDTABLEHEADFOUR
   
 #-------------------------------------------- for each map, gather information  #-------------------------------------------- for each map, gather information
             my $mapid;              my $mapid;
                foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {                 foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys(%maplist)) {
                 my $maptitle = $maplist{$mapid};                  my $maptitle = $maplist{$mapid};
   
 #-----------------------  loop through ids and get all parameter types for map  #-----------------------  loop through ids and get all parameter types for map
Line 2754  ENDTABLEHEADFOUR Line 2837  ENDTABLEHEADFOUR
   
 #        $r->print("Catmarker: @catmarker<br />\n");  #        $r->print("Catmarker: @catmarker<br />\n");
   
                 foreach (@ids) {                  foreach my $id (@ids) {
                     ($map)=(/([\d]*?)\./);                      ($map)=($id =~ /([\d]*?)\./);
                       my $rid = $_;                      my $rid = $id;
   
 #                  $r->print("$mapid:$map:   $rid <br /> \n");  #                  $r->print("$mapid:$map:   $rid <br /> \n");
   
Line 2771  ENDTABLEHEADFOUR Line 2854  ENDTABLEHEADFOUR
 # When storing information, store as part 0  # When storing information, store as part 0
 # When requesting information, request from full part  # When requesting information, request from full part
 #-------------------------------------------------------------------  #-------------------------------------------------------------------
                         foreach (&keysplit($keyp{$rid})) {                          foreach my $fullkeyp (&keysplit($keyp{$rid})) {
                              my $tempkeyp = $_;                              my $tempkeyp = $fullkeyp;
                               my $fullkeyp = $tempkeyp;                              $tempkeyp =~ s/_\w+_/_0_/;
                               $tempkeyp =~ s/_\w+_/_0_/;  
   
                               if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                              if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                                 $part{$tempkeyp}="0";                                  $part{$tempkeyp}="0";
                                 $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                                  $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                                 my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                                  my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
Line 2835  ENDTABLEHEADFOUR Line 2917  ENDTABLEHEADFOUR
                          .&Apache::loncommon::end_data_table_header_row()                           .&Apache::loncommon::end_data_table_header_row()
                 );                  );
   
                 foreach (&keysinorder(\%name,\%keyorder)) {                  foreach my $item (&keysinorder(\%name,\%keyorder)) {
                     $r->print(&Apache::loncommon::start_data_table_row());                      $r->print(&Apache::loncommon::start_data_table_row());
                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,                      &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                             \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                            $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,                             $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);
                            $readonly);  
                 }                  }
                 $r->print(&Apache::loncommon::end_data_table().'</p>'                  $r->print(&Apache::loncommon::end_data_table().'</p>'
                          .'</div>'                           .'</div>'
Line 2863  ENDTABLEHEADFOUR Line 2944  ENDTABLEHEADFOUR
             my %type = ();              my %type = ();
             my %default = ();              my %default = ();
   
             foreach (@ids) {              foreach $id (@ids) {
                 my $rid = $_;                  my $rid = $id;
   
                 my $uri=&Apache::lonnet::declutter($uris{$rid});                  my $uri=&Apache::lonnet::declutter($uris{$rid});
   
Line 2875  ENDTABLEHEADFOUR Line 2956  ENDTABLEHEADFOUR
 # When storing information, store as part 0  # When storing information, store as part 0
 # When requesting information, request from full part  # When requesting information, request from full part
 #-------------------------------------------------------------------  #-------------------------------------------------------------------
                 foreach (&keysplit($keyp{$rid})) {                  foreach my $fullkeyp (&keysplit($keyp{$rid})) {
                     my $tempkeyp = $_;                      my $tempkeyp = $fullkeyp;
                       my $fullkeyp = $tempkeyp;                      $tempkeyp =~ s/_\w+_/_0_/;
                       $tempkeyp =~ s/_\w+_/_0_/;                      if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {  
                         $part{$tempkeyp}="0";                          $part{$tempkeyp}="0";
                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                          $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                         my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                          my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
Line 2927  ENDMAPONE Line 3007  ENDMAPONE
                      .&Apache::loncommon::end_data_table_header_row()                       .&Apache::loncommon::end_data_table_header_row()
             );              );
   
             foreach (&keysinorder(\%name,\%keyorder)) {              foreach my $item (&keysinorder(\%name,\%keyorder)) {
                 $r->print(&Apache::loncommon::start_data_table_row());                  $r->print(&Apache::loncommon::start_data_table_row());
                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,                  &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                         \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                            $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,                                     $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);
                            $readonly);  
             }              }
             $r->print(&Apache::loncommon::end_data_table()              $r->print(&Apache::loncommon::end_data_table()
                      .'</p>'                       .'</p>'
Line 2941  ENDMAPONE Line 3020  ENDMAPONE
         } # end of $parmlev eq general          } # end of $parmlev eq general
     }      }
     $r->print('</form>');      $r->print('</form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 } # end sub assessparms  } # end sub assessparms
   
Line 2982  sub readdata { Line 3062  sub readdata {
 # Read userdata  # Read userdata
   
     my $classlist=&Apache::loncoursedata::get_classlist();      my $classlist=&Apache::loncoursedata::get_classlist();
     foreach (keys %$classlist) {      foreach my $user (keys(%$classlist)) {
         if ($_=~/^($match_username)\:($match_domain)$/) {          if ($user=~/^($match_username)\:($match_domain)$/) {
         my ($tuname,$tudom)=($1,$2);              my ($tuname,$tudom)=($1,$2);
         my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);              my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
             foreach my $userkey (keys %{$useropt}) {              foreach my $userkey (keys(%{$useropt})) {
         if ($userkey=~/^$env{'request.course.id'}/) {                  if ($userkey=~/^\Q$env{'request.course.id'}\E/) {
                     my $newkey=$userkey;                      my $newkey=$userkey;
             $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;                      $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
             $$resourcedata{$newkey}=$$useropt{$userkey};                      $$resourcedata{$newkey}=$$useropt{$userkey};
         }                  }
               }
         }          }
     }      }
     }  
     if (wantarray) {      if (wantarray) {
         return ($resourcedata,$classlist);          return ($resourcedata,$classlist);
     } else {      } else {
Line 3020  sub storedata { Line 3100  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 'setipallow' || $cmd eq 'setipdeny');          next if ($cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');
         my ($tuname,$tudom)=&extractuser($thiskey);          my ($tuname,$tudom)=&extractuser($thiskey);
         my $tkey=$thiskey;          my $tkey=$thiskey;
             if ($tuname) {              if ($tuname) {
         $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;          $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
         }          }
         if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {          if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
         my ($data, $typeof, $text, $name, $valchk);          my ($data, $typeof, $text, $name, $valchk, $valmatch);
         if ($cmd eq 'set') {          if ($cmd eq 'set') {
             $data=$env{$key};              $data=$env{$key};
               $valmatch = '';
             $valchk = $data;              $valchk = $data;
             $typeof=$env{'form.typeof_'.$thiskey};              $typeof=$env{'form.typeof_'.$thiskey};
             $text = &mt('Saved modified parameter for');              $text = &mt('Saved modified parameter for');
Line 3037  sub storedata { Line 3118  sub storedata {
                 $name = 'type';                  $name = 'type';
             } elsif ($typeof eq 'string_lenient') {              } elsif ($typeof eq 'string_lenient') {
                 $name = 'lenient';                  $name = 'lenient';
                   my $stringmatch = &standard_string_matches($typeof);
                   if (ref($stringmatch) eq 'ARRAY') {
                       foreach my $item (@{$stringmatch}) {
                           if (ref($item) eq 'ARRAY') {
                               my ($regexpname,$pattern) = @{$item};
                               if ($pattern ne '') {
                                   if ($data =~ /$pattern/) {
                                       $valmatch = $regexpname;
                                       $valchk = '';
                                       last;
                                   }
                               }
                           }
                       }
                   }
             } elsif ($typeof eq 'string_discussvote') {              } elsif ($typeof eq 'string_discussvote') {
                 $name = 'discussvote';                  $name = 'discussvote';
             } elsif ($typeof eq 'string_examcode') {              } elsif ($typeof eq 'string_examcode') {
Line 3070  sub storedata { Line 3166  sub storedata {
             }              }
         } elsif ($cmd eq 'dateinterval') {          } elsif ($cmd eq 'dateinterval') {
             $data=&get_date_interval_from_form($thiskey);              $data=&get_date_interval_from_form($thiskey);
               if ($thiskey =~ /\.interval$/) {
                   $name = 'interval';
                   my $intervaltype = &get_intervaltype($name);
                   my $intervalmatch = &standard_interval_matches($intervaltype);
                   if (ref($intervalmatch) eq 'ARRAY') {
                       foreach my $item (@{$intervalmatch}) {
                           if (ref($item) eq 'ARRAY') {
                               my ($regexpname,$pattern) = @{$item};
                               if ($pattern ne '') {
                                   if ($data =~ /$pattern/) {
                                       $valmatch = $regexpname;
                                       $valchk = '';
                                       last;
                                   }
                               }
                           }
                       }
                   }
               }
             $typeof=$env{'form.typeof_'.$thiskey};              $typeof=$env{'form.typeof_'.$thiskey};
             $text = &mt('Saved modified date for');              $text = &mt('Saved modified date for');
         }          }
         if ($name ne '') {          if ($name ne '') {
             my ($needsrelease,$needsnewer);              my ($needsrelease,$needsnewer);
             $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk"};              $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk:$valmatch"};
             if ($needsrelease) {              if ($needsrelease) {
                 unless ($got_chostname) {                  unless ($got_chostname) {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                      ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                     $got_chostname = 1;                      $got_chostname = 1;
                 }                  }
                 $needsnewer = &parameter_releasecheck($name,$valchk,                  $needsnewer = &parameter_releasecheck($name,$valchk,$valmatch,
                                                       $needsrelease,                                                        $needsrelease,
                                                       $cmajor,$cminor);                                                        $cmajor,$cminor);
                 if ($needsnewer) {                  if ($needsnewer) {
Line 3128  sub storedata { Line 3243  sub storedata {
     }      }
 # Store all course level  # Store all course level
     my $delentries=$#deldata+1;      my $delentries=$#deldata+1;
     my @newdatakeys=keys %newdata;      my @newdatakeys=keys(%newdata);
     my $putentries=$#newdatakeys+1;      my $putentries=$#newdatakeys+1;
     if ($delentries) {      if ($delentries) {
     if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {      if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
Line 3179  sub parse_listdata_key { Line 3294  sub parse_listdata_key {
 }  }
   
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;      my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;
       
 # Start list output  # Start list output
   
     my $oldsection='';      my $oldsection='';
Line 3196  sub listdata { Line 3312  sub listdata {
         if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {          if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
             %grouphash = &Apache::longroup::coursegroups();              %grouphash = &Apache::longroup::coursegroups();
         } elsif ($env{'request.course.groups'} ne '') {          } elsif ($env{'request.course.groups'} ne '') {
             map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});              map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
         }          }
     }      }
   
Line 3239  sub listdata { Line 3355  sub listdata {
     }      }
   
     $result;      $result;
     } keys %{$listdata}) {      } keys(%{$listdata})) {
   
       my $readonly;
     if ($$listdata{$thiskey.'.type'}) {      if ($$listdata{$thiskey.'.type'}) {
         my $thistype=$$listdata{$thiskey.'.type'};          my $thistype=$$listdata{$thiskey.'.type'};
         if ($$resourcedata{$thiskey.'.type'}) {          if ($$resourcedata{$thiskey.'.type'}) {
Line 3256  sub listdata { Line 3373  sub listdata {
                 if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {                  if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
                     if (ref($classlist) eq 'HASH') {                      if (ref($classlist) eq 'HASH') {
                         if (ref($classlist->{$stuname.':'.$studom}) eq 'ARRAY') {                          if (ref($classlist->{$stuname.':'.$studom}) eq 'ARRAY') {
                             next unless ($classlist->{$stuname.':'.$studom}->[$secidx] eq $env{'request.course.sec'});                              next unless ($classlist->{$stuname.':'.$studom}->[$secidx] eq $env{'request.course.sec'}); 
                         }                          }
                     }                      }
                 }                  }
                 $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);                  $section=&mt('User').": ".&Apache::loncommon::plainname($stuname,$studom);
             } else {              } else {
                 if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {                  if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
                     if (exists($grouphash{$issection})) {                      if (exists($grouphash{$issection})) {
Line 3268  sub listdata { Line 3385  sub listdata {
                     } elsif ($issection eq $env{'request.course.sec'}) {                      } elsif ($issection eq $env{'request.course.sec'}) {
                         $section = &mt('Section').': '.$issection;                          $section = &mt('Section').': '.$issection;
                     } else {                      } else {
                         next;                          next; 
                     }                      }
                 } else {                  } else {
                     $section=&mt('Group/Section').': '.$issection;                      $section=&mt('Group/Section').': '.$issection;
Line 3281  sub listdata { Line 3398  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\)$/) {          if ($middle=~/^(.+)\_\_\_\(all\)$/) {
         $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';          $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';
         } elsif ($middle) {          } elsif ($middle) {
Line 3342  sub listdata { Line 3458  sub listdata {
                                                     $jskey,                                                      $jskey,
                                                     $$resourcedata{$thiskey},                                                      $$resourcedata{$thiskey},
                                                     '',1,$state));                                                      '',1,$state));
             unless ($readonly) {              unless  ($readonly) {
                 $r->print(                  $r->print(
 '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.  '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
 (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.  (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
 &mt('Shift all dates based on this date').'</a></span>':'').  &mt('Shift all dates based on this date').'</a></span>':'').
 &date_sanity_info($$resourcedata{$thiskey})  &date_sanity_info($$resourcedata{$thiskey})
               );                  );
             }              }
         } elsif ($thistype eq 'date_interval') {          } elsif ($thistype eq 'date_interval') {
             $r->print(&date_interval_selector($thiskey,$name,              $r->print(&date_interval_selector($thiskey,$name,
Line 3369  sub listdata { Line 3485  sub listdata {
     return $foundkeys;      return $foundkeys;
 }  }
   
   
 sub date_interval_selector {  
     my ($thiskey, $pname, $showval, $readonly) = @_;  
     my ($result,%skipval);  
     my $currval = $showval;  
     foreach my $which (['days', 86400, 31],  
                ['hours', 3600, 23],  
                ['minutes', 60, 59],  
                ['seconds',  1, 59]) {  
     my ($name, $factor, $max) = @{ $which };  
     my $amount = int($showval/$factor);  
     $showval  %= $factor;  
     my %select = ((map {$_ => $_} (0..$max)),  
               'select_form_order' => [0..$max]);  
     $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,  
                            \%select,'',$readonly);  
     $result .= ' '.&mt($name);  
     }  
     if ($pname eq 'interval') {  
         unless ($skipval{'done'}) {  
             my $checkedon = '';  
             my $checkedproc = '';  
             my $currproctorkey = '';  
             my $currprocdisplay = 'hidden';  
             my $currdonetext = &mt('Done');  
             my $checkedoff = ' checked="checked"';  
             if ($currval =~ /^(?:\d+)_done$/) {  
                 $checkedon = ' checked="checked"';  
                 $checkedoff = '';  
             } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {  
                 $currdonetext = $1;  
                 $checkedon = ' checked="checked"';  
                 $checkedoff = '';  
             } elsif ($currval =~ /^(?:\d+)_done_proctor_(.+)$/) {  
                 $currproctorkey = $1;  
                 $checkedproc = ' checked="checked"';  
                 $checkedoff = '';  
                 $currprocdisplay = 'text';  
             } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:_proctor_(.+)$/) {  
                 $currdonetext = $1;  
                 $currproctorkey = $2;  
                 $checkedproc = ' checked="checked"';  
                 $checkedoff = '';  
                 $currprocdisplay = 'text';  
             }  
             my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';  
             my $disabled;  
             if ($readonly) {  
                 $disabled = ' disabled="disabled"';  
             }  
             $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').  
                        '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.$disabled.' />'.  
                        &mt('No').'</label>'.('&nbsp;'x2).  
                        '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.$disabled.' />'.  
                        &mt('Yes').'</label>'.('&nbsp;'x2).  
                        '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.$disabled.' />'.  
                        &mt('Yes, with proctor key').'</label>'.  
                        '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.  
                        'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.  
                        '<span class="LC_nobreak">'.&mt('Button text').': '.  
                        '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';  
         }  
     }  
     unless ($readonly) {  
         $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';  
     }  
     return $result;  
   
 }  
   
 sub get_date_interval_from_form {  sub get_date_interval_from_form {
     my ($key) = @_;      my ($key) = @_;
     my $seconds = 0;      my $seconds = 0;
Line 3451  sub get_date_interval_from_form { Line 3497  sub get_date_interval_from_form {
         $seconds += $env{'form.'.$name.'_'.$key} * $factor;          $seconds += $env{'form.'.$name.'_'.$key} * $factor;
     }      }
     }      }
       if (($key =~ /\.interval$/) && ($env{'form.done_'.$key} eq '_done')) {
           $seconds .= $env{'form.done_'.$key};
       }
     return $seconds;      return $seconds;
 }  }
   
Line 3492  sub string_ip_selector { Line 3541  sub string_ip_selector {
         @{$access{'deny'}} = ('');          @{$access{'deny'}} = ('');
     }      }
     my ($disabled,$addmore);      my ($disabled,$addmore);
     if ($readonly) {      if ($disabled) {
         $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 3508  sub string_ip_selector { Line 3557  sub string_ip_selector {
         foreach my $curr (@{$access{$acctype}}) {          foreach my $curr (@{$access{$acctype}}) {
             $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' />';              $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' />';
             if ($num > 0) {              if ($num > 0) {
                 $output .= '<a href="#" class="LC_remove_ipacc">'.&mt('Remove').'</a>';                  $output .= '<a href="#" class="LC_remove_ipacc">'.&mt('Remove').'</a>'; 
             }              }
             $output .= '</div>'."\n";              $output .= '</div>'."\n";
             $num ++;              $num ++;
Line 3525  sub string_ip_selector { Line 3574  sub string_ip_selector {
 }  }
   
 {  {
   
 my %strings =  my %strings =
     (      (
      'string_yesno'       'string_yesno'
Line 3540  my %strings = Line 3588  my %strings =
              => [[ 'problem', 'Standard Problem'],               => [[ 'problem', 'Standard Problem'],
                  [ 'survey', 'Survey'],                   [ 'survey', 'Survey'],
                  [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],                   [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],
                  [ 'exam', 'Exam'],                   [ 'exam', 'Bubblesheet Exam'],
                  [ 'anonsurvey', 'Anonymous Survey'],                   [ 'anonsurvey', 'Anonymous Survey'],
                  [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],                   [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],
                  [ 'practice', 'Practice'],                   [ 'practice', 'Practice'],
Line 3548  my %strings = Line 3596  my %strings =
      'string_lenient'       'string_lenient'
              => [['yes', 'Yes' ],               => [['yes', 'Yes' ],
                  [ 'no', 'No' ],                   [ 'no', 'No' ],
                  [ 'default', 'Default - only bubblesheet grading is lenient' ]],                   [ 'default', 'Default - only bubblesheet grading is lenient' ],
                    [ 'weighted', 'Yes, weighted (optionresponse in checkbox mode)' ]],
      'string_discussvote'       'string_discussvote'
              => [['yes','Yes'],               => [['yes','Yes'],
                  ['notended','Yes, unless discussion ended'],                   ['notended','Yes, unless discussion ended'],
                  ['no','No']],                   ['no','No']],
      'string_ip'       'string_ip'
              => [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],               => [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],
                  ['_denyfrom_','Hostname(s) or IP(s) from which access is disallowed']],                   ['_denyfrom_',], 'Hostname(s) or IP(s) from which access is disallowed'], 
      );       );
   
   my %stringmatches = (
            'string_lenient'
                 => [['weighted','^\-?[.\d]+,\-?[.\d]+,\-?[.\d]+,\-?[.\d]+$'],],
            'string_ip'
                 => [['_allowfrom_','[^\!]+'],
                     ['_denyfrom_','\!']],
       );
   
   my %stringtypes = (
                       type         => 'string_questiontype',
                       lenient      => 'string_lenient',
                       retrypartial => 'string_yesno',
                       discussvote  => 'string_discussvote',
                       examcode     => 'string_examcode',
                       acc          => 'string_ip',
                     );
   
 sub standard_string_options {  sub standard_string_options {
     my ($string_type) = @_;      my ($string_type) = @_;
     if (ref($strings{$string_type}) eq 'ARRAY') {      if (ref($strings{$string_type}) eq 'ARRAY') {
Line 3566  sub standard_string_options { Line 3632  sub standard_string_options {
     return;      return;
 }  }
   
   sub standard_string_matches {
       my ($string_type) = @_;
       if (ref($stringmatches{$string_type}) eq 'ARRAY') {
           return $stringmatches{$string_type};
       }
       return;
   }
   
   sub get_stringtype {
       my ($name) = @_;
       if (exists($stringtypes{$name})) {
           return $stringtypes{$name};
       }
       return;
   }
   
 sub string_selector {  sub string_selector {
     my ($thistype, $thiskey, $showval, $name, $readonly) = @_;      my ($thistype, $thiskey, $showval, $name, $readonly) = @_;
   
     if (!exists($strings{$thistype})) {      if (!exists($strings{$thistype})) {
     return &default_selector($thiskey,$showval,$readonly);          return &default_selector($thiskey,$showval,$readonly);
     }      }
   
     my %skiptype;      my %skiptype;
     if (($thistype eq 'string_questiontype') ||       if (($thistype eq 'string_questiontype') || 
         ($thistype eq 'string_lenient') ||          ($thistype eq 'string_lenient') ||
         ($thistype eq 'string_discussvote') ||          ($thistype eq 'string_discussvote') ||
           ($thistype eq 'string_ip') ||
         ($name eq 'retrypartial')) {          ($name eq 'retrypartial')) {
         my ($got_chostname,$chostname,$cmajor,$cminor);           my ($got_chostname,$chostname,$cmajor,$cminor); 
         foreach my $possibilities (@{ $strings{$thistype} }) {          foreach my $possibilities (@{ $strings{$thistype} }) {
             next unless (ref($possibilities) eq 'ARRAY');              next unless (ref($possibilities) eq 'ARRAY');
             my ($parmval, $description) = @{ $possibilities };              my ($parmval, $description) = @{ $possibilities };
             my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval"};              my $parmmatch;
               if (ref($stringmatches{$thistype}) eq 'ARRAY') {
                   foreach my $item (@{$stringmatches{$thistype}}) {
                       if (ref($item) eq 'ARRAY') {
                           if ($parmval eq $item->[0]) {
                               $parmmatch = $parmval;
                               $parmval = '';
                               last;
                           }
                       }
                   }
               }
               my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval:$parmmatch"}; 
             if ($needsrelease) {              if ($needsrelease) {
                 unless ($got_chostname) {                  unless ($got_chostname) {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                      ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                     $got_chostname = 1;                      $got_chostname = 1;
                 }                  }
                 my $needsnewer=&parameter_releasecheck($name,$parmval,$needsrelease,                  my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,
                                                        $cmajor,$cminor);                                                         $needsrelease,$cmajor,$cminor);
                 if ($needsnewer) {                  if ($needsnewer) {
                     $skiptype{$parmval} = 1;                      if ($parmmatch ne '') {
                           $skiptype{$parmmatch} = 1;
                       } elsif ($parmval ne '') {
                           $skiptype{$parmval} = 1;
                       }
                 }                  }
             }              }
         }          }
     }      }
   
     if ($thistype eq 'string_ip') {      if ($thistype eq 'string_ip') {
         return &string_ip_selector($thiskey,$showval,$readonly);          return &string_ip_selector($thiskey,$showval,$readonly); 
     }      }
    
     my ($result,$disabled);      my ($result,$disabled);
   
     if ($readonly) {      if ($readonly) {
Line 3620  sub string_selector { Line 3719  sub string_selector {
         foreach my $possibilities (@{ $strings{$thistype} }) {          foreach my $possibilities (@{ $strings{$thistype} }) {
             next unless (ref($possibilities) eq 'ARRAY');              next unless (ref($possibilities) eq 'ARRAY');
             my ($name, $description) = @{ $possibilities };              my ($name, $description) = @{ $possibilities };
             next if ($skiptype{$name});               next if ($skiptype{$name});
             $rem = $i%($numinrow);              $rem = $i%($numinrow);
             if ($rem == 0) {              if ($rem == 0) {
                 if ($i > 0) {                  if ($i > 0) {
Line 3628  sub string_selector { Line 3727  sub string_selector {
                 }                  }
                 $result .= '<tr>';                  $result .= '<tr>';
             }              }
             $result .= '<td class="LC_left_item">'.              my $colspan;
               if ($i == @{ $strings{$thistype} }-1) {
                   $rem = @{ $strings{$thistype} }%($numinrow);
                   if ($rem) {
                       my $colsleft = $numinrow - $rem;
                       if ($colsleft) {
                           $colspan = $colsleft+1;
                           $colspan = ' colspan="'.$colspan.'"';
                       }
                   }
               }
               my ($add,$onchange,$css_class);
               if ($thistype eq 'string_lenient') {
                   if ($name eq 'weighted') {
                       my $display;
                       my %relatives = &Apache::lonlocal::texthash(
                                           corrchkd     => 'Correct (checked)',
                                           corrunchkd   => 'Correct (unchecked)',
                                           incorrchkd   => 'Incorrect (checked)',
                                           incorrunchkd => 'Incorrect (unchecked)',
                       );
                       my %textval = (
                                       corrchkd     => '1.0',
                                       corrunchkd   => '1.0',
                                       incorrchkd   => '0.0',
                                       incorrunchkd => '0.0',
                       );
                       if ($showval =~ /^([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)$/) {
                           $textval{'corrchkd'} = $1;
                           $textval{'corrunchkd'} = $2;
                           $textval{'incorrchkd'} = $3;
                           $textval{'incorrunchkd'} = $4;
                           $display = 'inline';
                           $showval = $name;
                       } else {
                           $display = 'none';
                       }
                       $add = ' <div id="LC_parmtext_'.$thiskey.'" style="display:'.$display.'"><table>'.
                              '<tr><th colspan="2">'.&mt("Foil's submission status").'</th><th>'.&mt('Points').'</th></tr>';  
                       foreach my $reltype ('corrchkd','corrunchkd','incorrchkd','incorrunchkd') {
                           $add .= '<tr><td>&nbsp;</td><td>'.$relatives{$reltype}.'</td>'."\n".
                                   '<td><input type="text" name="settext_'.$thiskey.'"'.
                                   ' value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'.
                                   '</td></tr>';
                       }
                       $add .= '</table></div>'."\n";
                   }
                   $onchange = ' onclick="javascript:toggleParmTextbox(this.form,'."'$thiskey'".');"';
                   $css_class = ' class="LC_lenient_radio"';
               }
               $result .= '<td class="LC_left_item"'.$colspan.'>'.
                        '<span class="LC_nobreak"><label>'.                         '<span class="LC_nobreak"><label>'.
                        '<input type="radio" name="set_'.$thiskey.                         '<input type="radio" name="set_'.$thiskey.
                        '" value="'.$name.'"'.$disabled;                         '" value="'.$name.'"'.$onchange.$css_class.$disabled;
             if ($showval eq $name) {              if ($showval eq $name) {
                 $result .= ' checked="checked"';                  $result .= ' checked="checked"';
             }              }
             $result .= ' />'.&mt($description).'</label></span></td>';              $result .= ' />'.&mt($description).'</label>'.$add.'</span></td>';
             $i++;              $i++;
         }          }
         $rem = @{ $strings{$thistype} }%($numinrow);  
         my $colsleft = $numinrow - $rem;  
         if ($colsleft > 1 ) {  
             $result .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.  
                        '&nbsp;</td>';  
         } elsif ($colsleft == 1) {  
             $result .= '<td class="LC_left_item">&nbsp;</td>';  
         }  
         $result .= '</tr>';          $result .= '</tr>';
     }      }
     if ($result) {      if ($result) {
Line 3654  sub string_selector { Line 3795  sub string_selector {
     return $result;      return $result;
 }  }
   
   my %intervals =
       (
        'date_interval'
                => [[ 'done', 'Yes' ],
                    [ '', 'No' ]],
       );
   
   my %intervalmatches = (
            'date_interval'
                 => [['done','\d+_done$'],],
       );
   
   my %intervaltypes = (
                         interval => 'date_interval',
       );
   
   sub standard_interval_matches {
       my ($interval_type) = @_;
       if (ref($intervalmatches{$interval_type}) eq 'ARRAY') {
           return $intervalmatches{$interval_type};
       }
       return;
   }
   
   sub get_intervaltype {
       my ($name) = @_;
       if (exists($intervaltypes{$name})) {
           return $intervaltypes{$name};
       }
       return;
   }
   
   sub standard_interval_options {
       my ($interval_type) = @_;
       if (ref($intervals{$interval_type}) eq 'ARRAY') {
           return $intervals{$interval_type};
       }
       return;
   }
   
   sub date_interval_selector {
       my ($thiskey, $name, $showval, $readonly) = @_;
       my ($result,%skipval);
       if ($name eq 'interval') {
           my $intervaltype = &get_intervaltype($name);
           my ($got_chostname,$chostname,$cmajor,$cminor);
           foreach my $possibilities (@{ $intervals{$intervaltype} }) {
               next unless (ref($possibilities) eq 'ARRAY');
               my ($parmval, $description) = @{ $possibilities };
               my $parmmatch;
               if (ref($intervalmatches{$intervaltype}) eq 'ARRAY') {
                   foreach my $item (@{$intervalmatches{$intervaltype}}) {
                       if (ref($item) eq 'ARRAY') {
                           if ($parmval eq $item->[0]) {
                               $parmmatch = $parmval;
                               $parmval = '';
                               last;
                           }
                       }
                   }
               }
               my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval:$parmmatch"};
               if ($needsrelease) {
                   unless ($got_chostname) {
                       ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                       $got_chostname = 1;
                   }
                   my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,
                                                          $needsrelease,$cmajor,$cminor);
                   if ($needsnewer) {
                       if ($parmmatch ne '') {
                           $skipval{$parmmatch} = 1;
                       } elsif ($parmval ne '') {
                           $skipval{$parmval} = 1;
                       }
                   }
               }
           }
       }
   
       my $currval = $showval;
       foreach my $which (['days', 86400, 31],
                  ['hours', 3600, 23],
                  ['minutes', 60, 59],
                  ['seconds',  1, 59]) {
       my ($name, $factor, $max) = @{ $which };
       my $amount = int($showval/$factor);
       $showval  %= $factor;
       my %select = ((map {$_ => $_} (0..$max)),
                 'select_form_order' => [0..$max]);
       $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                              \%select,'',$readonly);
       $result .= ' '.&mt($name);
       }
       if ($name eq 'interval') {
           unless ($skipval{'done'}) {
               my $checkedon = '';
               my $checkedoff = ' checked="checked"';
               if ($currval =~ /^(\d+)_done$/) {
                   $checkedon = ' checked="checked"';
                   $checkedoff = '';
               }
               $result .= '<span class="LC_nobreak">'.('&nbsp;' x 3).'('.&mt('Include "done" button').
                          '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.' />'.
                          &mt('Yes').'</label>'.
                          '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.' />'.
                          &mt('No').'</label>)</span>';
           }
       }
       unless ($readonly) {
           $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
       }
       return $result;
   }
   
 sub oldversion_warning {  sub oldversion_warning {
     my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;      my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
     my $desc;      my $desc;
     my %stringtypes = (      my $stringtype = &get_stringtype($name);
                         type         => 'string_questiontype',      if ($stringtype ne '') {
                         lenient      => 'string_lenient',  
                         retrypartial => 'string_yesno',  
                         discussvote  => 'string_discussvote',  
                         examcode     => 'string_examcode',  
                       );  
     if (exists($stringtypes{$name})) {  
         if ($name eq 'examcode') {          if ($name eq 'examcode') {
             $desc = $value;              $desc = $value;
         } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {          } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
             foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {              foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
                 next unless (ref($possibilities) eq 'ARRAY');                  next unless (ref($possibilities) eq 'ARRAY');
                 my ($parmval, $description) = @{ $possibilities };                  my ($parmval, $description) = @{ $possibilities };
                 if ($parmval eq $value) {                  my $parmmatch;
                   if (ref($stringmatches{$stringtypes{$name}}) eq 'ARRAY') {
                       foreach my $item (@{$stringmatches{$stringtypes{$name}}}) {
                           if (ref($item) eq 'ARRAY') {
                               my ($regexpname,$pattern) = @{$item};
                               if ($parmval eq $regexpname) {
                                   if ($value =~ /$pattern/) {
                                       $desc = $description; 
                                       $parmmatch = 1;
                                       last;
                                   }
                               }
                           }
                       }
                       last if ($parmmatch);
                   } elsif ($parmval eq $value) {
                     $desc = $description;                      $desc = $description;
                     last;                      last;
                 }                  }
Line 3713  sub dateshift { Line 3978  sub dateshift {
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);      my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
 # ugly retro fix for broken version of types  # ugly retro fix for broken version of types
     foreach my $key (keys %data) {      foreach my $key (keys(%data)) {
         if ($key=~/\wtype$/) {          if ($key=~/\wtype$/) {
             my $newkey=$key;              my $newkey=$key;
             $newkey=~s/type$/\.type/;              $newkey=~s/type$/\.type/;
Line 3723  sub dateshift { Line 3988  sub dateshift {
     }      }
     my %storecontent=();      my %storecontent=();
 # go through all parameters and look for dates  # go through all parameters and look for dates
     foreach my $key (keys %data) {      foreach my $key (keys(%data)) {
        if ($data{$key.'.type'}=~/^date_(start|end)$/) {         if ($data{$key.'.type'}=~/^date_(start|end)$/) {
           my $newdate=$data{$key}+$shift;            my $newdate=$data{$key}+$shift;
           $storecontent{$key}=$newdate;            $storecontent{$key}=$newdate;
Line 3739  sub dateshift { Line 4004  sub dateshift {
 }  }
   
 sub newoverview {  sub newoverview {
     my ($r,$parm_permission) = @_;      my ($r) = @_;
   
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $readonly = 1;      my $crstype =  $env{'course.'.$env{'request.course.id'}.'.type'};
     if ($parm_permission->{'edit'}) {  
         undef($readonly);  
     }  
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
         text=>"Overview Mode"});          text=>"Overview Mode"});
   
     my %loaditems = (      my %loaditems = (
                       'onload'   => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1');",                        'onload'   => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1'); showHideLenient();",
                     );                      );
     my $js = '      my $js = '
 <script type="text/javascript">  <script type="text/javascript">
Line 3759  sub newoverview { Line 4021  sub newoverview {
 '.  '.
             &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".              &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".
             &showhide_js()."\n".              &showhide_js()."\n".
             &done_proctor_js()."\n".              &toggleparmtextbox_js()."\n".
               &validateparms_js()."\n".
               &ipacc_boxes_js()."\n".
 '// ]]>  '// ]]>
 </script>  </script>
 ';  ';
   
     my $start_page = &Apache::loncommon::start_page('Set Parameters',$js,      my $start_page = &Apache::loncommon::start_page('Set Parameters',$js,
                                                     {'add_entries' => \%loaditems,});                                                      {'add_entries' => \%loaditems,});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDOVER);      $r->print(<<ENDOVER);
 <form method="post" action="/adm/parmset?action=newoverview" name="parmform">  <form method="post" action="/adm/parmset?action=newoverview" name="parmform" onsubmit="return validateParms();">
 ENDOVER  ENDOVER
     my @ids=();      my @ids=();
     my %typep=();      my %typep=();
Line 3795  ENDOVER Line 4061  ENDOVER
     my $pschp=$env{'form.pschp'};      my $pschp=$env{'form.pschp'};
   
     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');      my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
     if (!@psprt) { $psprt[0]='0'; }      if (!@psprt) { $psprt[0]='all'; }
   
     my @selected_sections =      my @selected_sections =
     &Apache::loncommon::get_env_multiple('form.Section');      &Apache::loncommon::get_env_multiple('form.Section');
Line 3860  ENDOVER Line 4126  ENDOVER
     $r->print('</tr><tr><td>');      $r->print('</tr><tr><td>');
     &partmenu($r,\%allparts,\@psprt);      &partmenu($r,\%allparts,\@psprt);
     $r->print('</td>');      $r->print('</td>');
     if ($sectionselector) {      if ($sectionselector) { 
         $r->print('<td>'.$sectionselector.'</td>');          $r->print('<td>'.$sectionselector.'</td>');
     }      }
     if ($groupselector) {      if ($groupselector) {
Line 3900  ENDOVER Line 4166  ENDOVER
   
 # List data  # List data
   
         &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);          &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview');
     }  
     $r->print(&tableend());  
     unless ($readonly) {  
         $r->print(((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':''));  
     }      }
     $r->print('</form>');      $r->print(&tableend().
            ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
             '</form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 3925  sub secgroup_lister { Line 4190  sub secgroup_lister {
                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};                  $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
             } elsif ($parmlev eq 'map') {              } elsif ($parmlev eq 'map') {
 # map-level parameter  # map-level parameter
                 foreach my $mapid (keys %{$allmaps}) {                  foreach my $mapid (keys(%{$allmaps})) {
                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }                      if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;                      my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                     $$listdata{$newparmkey}=1;                      $$listdata{$newparmkey}=1;
Line 3946  sub secgroup_lister { Line 4211  sub secgroup_lister {
 }  }
   
 sub overview {  sub overview {
     my ($r,$parm_permission) = @_;      my ($r) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".               '// <![CDATA['."\n".
              &done_proctor_js()."\n".               &toggleparmtextbox_js()."\n".
                &validateparms_js()."\n".
                &ipacc_boxes_js()."\n".
              '// ]]>'."\n".               '// ]]>'."\n".
              '</script>'."\n";               '</script>'."\n";
     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"});
     my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js);      my %loaditems = (
                         'onload'   => "showHideLenient();",
                       );
   
       my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js,{'add_entries' => \%loaditems,});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
     $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform">');      &startSettingsScreen($r,'parmset',$crstype);
       $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform" onsubmit="return validateParms();">');
   
 # Store modified  # Store modified
     unless ($readonly) {  
         &storedata($r,$crs,$dom);      &storedata($r,$crs,$dom);
     }  
   
 # Read modified data  # Read modified data
   
Line 3980  sub overview { Line 4247  sub overview {
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder);
   
     my $submitbutton = '<input type="submit" value="'.&mt('Save').'" />';  
   
     if ($readonly) {  
         $r->print('<p>'.$submitbutton.'</p>');  
     }  
   
   
 # List data  # List data
   
     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly);      my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist);
       $r->print(&tableend().'<p>'.
     $r->print(&tableend().'<p>');      ($foundkeys?'<input type="submit" value="'.&mt('Save').'" />':'<span class="LC_info">'.&mt('There are no parameters.').'</span>').'</p></form>'.
     if ($foundkeys) {            &Apache::loncommon::end_page());
         unless ($readonly) {  
             $r->print('<p>'.$submitbutton.'</p>');  
         }  
     } else {  
         $r->print('<p class="LC_info">'.&mt('There are no parameters.').'</p>');  
     }  
     $r->print('</form>'.&Apache::loncommon::end_page());  
 }  }
   
 sub clean_parameters {  sub clean_parameters {
Line 4061  ENDOVER Line 4314  ENDOVER
         $r->print(&mt('All users'));          $r->print(&mt('All users'));
         } elsif ($data{'scope_type'} eq 'user') {          } elsif ($data{'scope_type'} eq 'user') {
         $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));          $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
         } elsif ($data{'scope_type'} eq 'secgroup') {          } elsif ($data{'scope_type'} eq 'section') {
         $r->print(&mt('Group/Section: [_1]',$data{'scope'}));          $r->print(&mt('Section: [_1]',$data{'scope'}));
           } elsif ($data{'scope_type'} eq 'group') {
           $r->print(&mt('Group: [_1]',$data{'scope'}));
         }          }
         $r->print('<br />');          $r->print('<br />');
         if ($data{'realm_type'} eq 'all') {          if ($data{'realm_type'} eq 'all') {
Line 4073  ENDOVER Line 4328  ENDOVER
         my ($map,$resid,$url) =          my ($map,$resid,$url) =
             &Apache::lonnet::decode_symb($data{'realm'});              &Apache::lonnet::decode_symb($data{'realm'});
         $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]',          $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]',
                   $url.' <br />&nbsp;&nbsp;&nbsp;',                        $url.' <br />&nbsp;&nbsp;&nbsp;',
                   $resid.' <br />&nbsp;&nbsp;&nbsp;',$map));                        $resid.' <br />&nbsp;&nbsp;&nbsp;',$map));
         }          }
         $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));          $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));
         $r->print('</td></tr>');          $r->print('</td></tr>');
Line 4084  ENDOVER Line 4339  ENDOVER
     $r->print(&Apache::loncommon::end_data_table().'<p>'.      $r->print(&Apache::loncommon::end_data_table().'<p>'.
           '<input type="submit" value="'.&mt('Delete Selected').'" />'.            '<input type="submit" value="'.&mt('Delete Selected').'" />'.
           '</p></form>');            '</p></form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 4091  sub date_shift_one { Line 4347  sub date_shift_one {
     my ($r) = @_;      my ($r) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
   
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
         text=>"Shifting Dates"});          text=>"Shifting Dates"});
     my $start_page=&Apache::loncommon::start_page('Shift Dates');      my $start_page=&Apache::loncommon::start_page('Shift Dates');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print('<form name="shiftform" method="post" action="">'.      $r->print('<form name="shiftform" method="post" action="">'.
               '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.                '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
               &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.                &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
Line 4109  sub date_shift_one { Line 4367  sub date_shift_one {
               '<input type="hidden" name="action" value="dateshift2" />'.                '<input type="hidden" name="action" value="dateshift2" />'.
               '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.                '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
               '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');                '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 4116  sub date_shift_two { Line 4375  sub date_shift_two {
     my ($r) = @_;      my ($r) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
         text=>"Shifting Dates"});          text=>"Shifting Dates"});
     my $start_page=&Apache::loncommon::start_page('Shift Dates');      my $start_page=&Apache::loncommon::start_page('Shift Dates');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');      my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
     $r->print('<h2>'.&mt('Shift Dates').'</h2>'.      $r->print('<h2>'.&mt('Shift Dates').'</h2>'.
               '<p>'.&mt('Shifting all dates such that [_1] becomes [_2]',                '<p>'.&mt('Shifting all dates such that [_1] becomes [_2]',
Line 4133  sub date_shift_two { Line 4394  sub date_shift_two {
         '<br /><br />'.          '<br /><br />'.
         &Apache::lonhtmlcommon::actionbox(          &Apache::lonhtmlcommon::actionbox(
             ['<a href="/adm/parmset">'.&mt('Content and Problem Settings').'</a>']));              ['<a href="/adm/parmset">'.&mt('Content and Problem Settings').'</a>']));
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 4148  sub parse_key { Line 4410  sub parse_key {
         $data{'scope_type'} = 'user';          $data{'scope_type'} = 'user';
         $data{'scope'} = [$1,$2];          $data{'scope'} = [$1,$2];
     } else {      } else {
         $data{'scope_type'} = 'secgroup';          #FIXME check for group scope
           $data{'scope_type'} = 'section';
     }      }
     $middle=~s/^\[(.*)\]//;      $middle=~s/^\[(.*)\]//;
     }      }
Line 4176  sub parse_key { Line 4439  sub parse_key {
   
   
 sub header {  sub header {
     return &Apache::loncommon::start_page('Content and Problem Settings');      return &Apache::loncommon::start_page('Settings');
 }  }
   
   
Line 4189  sub print_main_menu { Line 4452  sub print_main_menu {
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
   
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDMAINFORMHEAD);      $r->print(<<ENDMAINFORMHEAD);
 <form method="post" enctype="multipart/form-data"  <form method="post" enctype="multipart/form-data"
       action="/adm/parmset" name="studentform">        action="/adm/parmset" name="studentform">
Line 4199  ENDMAINFORMHEAD Line 4463  ENDMAINFORMHEAD
     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});      my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
     my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});      my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});
     my $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'});  
     my $vpa = &Apache::lonnet::allowed('vpa',$env{'request.course.id'});  
     if ((!$dcm) && ($env{'request.course.sec'} ne '')) {      if ((!$dcm) && ($env{'request.course.sec'} ne '')) {
         $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.          $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
                                         '/'.$env{'request.course.sec'});                                          '/'.$env{'request.course.sec'});
     }      }
     if ((!$vcb) && ($env{'request.course.sec'} ne '')) {  
         $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}.  
                                         '/'.$env{'request.course.sec'});  
     }  
     my (%linktext,%linktitle,%url);  
     if ($parm_permission->{'edit'}) {  
         %linktext = (  
                      newoverview     => 'Edit Resource Parameters - Overview Mode',  
                      settable        => 'Edit Resource Parameters - Table Mode',  
                      setoverview     => 'Modify Resource Parameters - Overview Mode',  
                     );  
         %linktitle = (  
                      newoverview     => 'Set/Modify resource parameters in overview mode.',  
                      settable        => 'Set/Modify resource parameters in table mode.',  
                      setoverview     => 'Set/Modify existing resource parameters in overview mode.',  
                      );  
     } else {  
         %linktext = (  
                      newoverview     => 'View Resource Parameters - Overview Mode',  
                      settable        => 'View Resource Parameters - Table Mode',  
                      setoverview     => 'View Resource Parameters - Overview Mode',  
                    );  
         %linktitle = (  
                      newoverview     => 'Display resource parameters in overview mode.',  
                      settable        => 'Display resource parameters in table mode.',  
                      setoverview     => 'Display existing resource parameters in overview mode.',  
                      );  
     }  
     if ($mgr) {  
         $linktext{'resettimes'} = 'Reset Student Access Times';  
         $linktitle{'resettimes'} = "Reset access times for folders/maps, resources or the $lc_crstype.";  
         $url{'resettimes'} = '/adm/helper/resettimes.helper';  
     } elsif ($vgr) {  
         $linktext{'resettimes'} = 'Display Student Access Times',  
         $linktitle{'resettimes'} = "Display access times for folders/maps, resources or the $lc_crstype.",  
         $url{'resettimes'} = '/adm/accesstimes';  
     }  
     my @menu =      my @menu =
         ( { categorytitle=>"Content Settings for this $crstype",          ( { categorytitle=>"Content Settings for this $crstype",
         items => [          items => [
           { linktext => 'Portfolio Metadata',            { linktext => 'Portfolio Metadata',
             url => '/adm/parmset?action=setrestrictmeta',              url => '/adm/parmset?action=setrestrictmeta',
             permission => $parm_permission->{'setrestrictmeta'},              permission => $parm_permission,
             linktitle => "Restrict metadata for this $lc_crstype." ,              linktitle => "Restrict metadata for this $lc_crstype." ,
             icon =>'contact-new.png'   ,              icon =>'contact-new.png'   ,
             },              },
           { linktext => $linktext{'resettimes'},            { linktext => 'Reset Student Access Times',
             url => $url{'resettimes'},              url => '/adm/helper/resettimes.helper',
             permission => ($vgr || $mgr),              permission => $mgr,
             linktitle => $linktitle{'resettimes'},              linktitle => "Reset access times for folders/maps, resources or the $lc_crstype."  ,
             icon => 'start-here.png',              icon => 'start-here.png'  ,
             },              },
           { linktext => 'Blocking Communication/Resource Access',            { linktext => 'Blocking Communication/Resource Access',
             url => '/adm/setblock',              url => '/adm/setblock',
             permission => ($vcb || $dcm),              permission => $dcm,
             linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',              linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',
             icon => 'comblock.png',              icon => 'comblock.png',
             },              },
           { linktext => 'Set Parameter Setting Default Actions',            { linktext => 'Set Parameter Setting Default Actions',
             url => '/adm/parmset?action=setdefaults',              url => '/adm/parmset?action=setdefaults',
             permission => $parm_permission->{'setdefaults'},              permission => $parm_permission,
             linktitle =>'Set default actions for parameters.'  ,              linktitle =>'Set default actions for parameters.'  ,
             icon => 'folder-new.png'  ,              icon => 'folder-new.png'  ,
             }]},              }]},
Line 4273  ENDMAINFORMHEAD Line 4499  ENDMAINFORMHEAD
         items => [          items => [
           { linktext => 'Edit Resource Parameters - Helper Mode',            { linktext => 'Edit Resource Parameters - Helper Mode',
             url => '/adm/helper/parameter.helper',              url => '/adm/helper/parameter.helper',
             permission => $parm_permission->{'helper'},              permission => $parm_permission,
             linktitle =>'Set/Modify resource parameters in helper mode.'  ,              linktitle =>'Set/Modify resource parameters in helper mode.'  ,
             icon => 'dialog-information.png'  ,              icon => 'dialog-information.png'  ,
             #help => 'Parameter_Helper',              #help => 'Parameter_Helper',
             },              },
           { linktext => $linktext{'newoverview'},            { linktext => 'Edit Resource Parameters - Overview Mode',
             url => '/adm/parmset?action=newoverview',              url => '/adm/parmset?action=newoverview',
             permission => $parm_permission->{'newoverview'},              permission => $parm_permission,
             linktitle => $linktitle{'newoverview'},              linktitle =>'Set/Modify resource parameters in overview mode.'  ,
             icon => 'edit-find.png',              icon => 'edit-find.png'  ,
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => $linktext{'settable'},            { linktext => 'Edit Resource Parameters - Table Mode',
             url => '/adm/parmset?action=settable',              url => '/adm/parmset?action=settable',
             permission => $parm_permission->{'settable'},              permission => $parm_permission,
             linktitle => $linktitle{'settable'},              linktitle =>'Set/Modify resource parameters in table mode.'  ,
             icon => 'edit-copy.png',              icon => 'edit-copy.png'  ,
             #help => 'Table_Mode',              #help => 'Table_Mode',
             }]},              }]},
            { categorytitle => 'Existing Parameter Settings for Resources',             { categorytitle => 'Existing Parameter Settings for Resources',
          items => [           items => [
           { linktext => $linktext{'setoverview'},            { linktext => 'Modify Resource Parameters - Overview Mode',
             url => '/adm/parmset?action=setoverview',              url => '/adm/parmset?action=setoverview',
             permission => $parm_permission->{'setoverview'},              permission => $parm_permission,
             linktitle => $linktitle{'setoverview'},              linktitle =>'Set/Modify existing resource parameters in overview mode.'  ,
             icon => 'preferences-desktop-wallpaper.png',              icon => 'preferences-desktop-wallpaper.png'  ,
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => 'Change Log',            { linktext => 'Change Log',
             url => '/adm/parmset?action=parameterchangelog',              url => '/adm/parmset?action=parameterchangelog',
             permission => $parm_permission->{'parameterchangelog'},              permission => $parm_permission,
             linktitle =>"View parameter and $lc_crstype blog posting/user notification change log."  ,              linktitle =>"View parameter and $lc_crstype blog posting/user notification change log."  ,
             icon => 'document-properties.png',              icon => 'document-properties.png',
             }]}              }]}
           );            );
     $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));      $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
     $r->print('</form>'.&Apache::loncommon::end_page());      $r->print('</form>');
       &endSettingsScreen($r);
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 4377  sub order_meta_fields { Line 4605  sub order_meta_fields {
     my $idx = 1;      my $idx = 1;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};;
     $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));      $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
         text=>"Add Metadata Field"});          text=>"Add Metadata Field"});
Line 4385  sub order_meta_fields { Line 4614  sub order_meta_fields {
               text=>"Restrict Metadata"},                text=>"Restrict Metadata"},
              {text=>"Order Metadata"});               {text=>"Order Metadata"});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
       &startSettingsScreen($r,'parmset',$crstype);
     if ($env{'form.storeorder'}) {      if ($env{'form.storeorder'}) {
         my $newpos = $env{'form.newpos'} - 1;          my $newpos = $env{'form.newpos'} - 1;
         my $currentpos = $env{'form.currentpos'} - 1;          my $currentpos = $env{'form.currentpos'} - 1;
         my @neworder = ();          my @neworder = ();
         my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};          my @oldorder = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'});
         my $i;          my $i;
         if ($newpos > $currentpos) {          if ($newpos > $currentpos) {
         # moving stuff up          # moving stuff up
Line 4423  sub order_meta_fields { Line 4653  sub order_meta_fields {
     }      }
     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});      my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
     my $ordered_fields;      my $ordered_fields;
     my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};      my @fields_in_order = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'});
     if (!@fields_in_order) {      if (!@fields_in_order) {
         # no order found, pick sorted order then create metadata.addedorder key.          # no order found, pick sorted order then create metadata.addedorder key.
         foreach my $key (sort keys %$fields) {          foreach my $key (sort(keys(%$fields))) {
             push @fields_in_order, $key;              push @fields_in_order, $key;
             $ordered_fields = join ",", @fields_in_order;              $ordered_fields = join ",", @fields_in_order;
         }          }
Line 4454  sub order_meta_fields { Line 4684  sub order_meta_fields {
         $idx ++;          $idx ++;
     }      }
     $r->print('</table>');      $r->print('</table>');
       &endSettingsScreen($r);
     return 'ok';      return 'ok';
 }  }
   
Line 4462  sub continue { Line 4693  sub continue {
     my $output;      my $output;
     $output .= '<form action="" method="post">';      $output .= '<form action="" method="post">';
     $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';      $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
     $output .= '<input type="submit" value="'.&mt('Continue').'" />';      $output .= '<input type="submit" value="Continue" />';
     return ($output);      return ($output);
 }  }
   
Line 4475  sub addmetafield { Line 4706  sub addmetafield {
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
       &startSettingsScreen($r,'parmset',$crstype);
     if (exists($env{'form.undelete'})) {      if (exists($env{'form.undelete'})) {
         my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');          my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
         foreach my $meta_field(@meta_fields) {          foreach my $meta_field(@meta_fields) {
Line 4484  sub addmetafield { Line 4717  sub addmetafield {
             my $put_result = &Apache::lonnet::put('environment',              my $put_result = &Apache::lonnet::put('environment',
                                         {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);                                          {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
   
             $r->print(&mt('Undeleted Metadata Field [_1] with result [_2]',              $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
                           '<strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}.  
                           '</strong>',$put_result).  
                       '<br />');  
         }          }
         $r->print(&continue());          $r->print(&continue());
     } elsif (exists($env{'form.fieldname'})) {      } elsif (exists($env{'form.fieldname'})) {
Line 4499  sub addmetafield { Line 4729  sub addmetafield {
                             {'metadata.'.$meta_field.'.values'=>"",                              {'metadata.'.$meta_field.'.values'=>"",
                              'metadata.'.$meta_field.'.added'=>"$display_field",                               'metadata.'.$meta_field.'.added'=>"$display_field",
                              'metadata.'.$meta_field.'.options'=>""},$dom,$crs);                               'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
         $r->print(&mt('Added new Metadata Field [_1] with result [_2]',          $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
                       '<strong>'.$env{'form.fieldname'}.'</strong>',$put_result).  
                   '<br />');  
         $r->print(&continue());          $r->print(&continue());
     } else {      } else {
         my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});          my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
         if ($fields) {          if ($fields) {
             $r->print(&mt('You may undelete previously deleted fields.').              $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
                       '<br />'.  
                       &mt('Check those you wish to undelete and click Undelete.').  
                       '<br />');  
             $r->print('<form method="post" action="">');              $r->print('<form method="post" action="">');
             foreach my $key(keys(%$fields)) {              foreach my $key(keys(%$fields)) {
                 $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');                  $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
Line 4517  sub addmetafield { Line 4742  sub addmetafield {
             $r->print('<input type="submit" name="undelete" value="Undelete" />');              $r->print('<input type="submit" name="undelete" value="Undelete" />');
             $r->print('</form>');              $r->print('</form>');
         }          }
         $r->print('<hr />'.          $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"');
                   &mt('[_1]Or[_2] you may enter a new metadata field name.',  
                       '<strong>','</strong>').  
                  '<form method="post" action="/adm/parmset?action=addmetadata">');  
         $r->print('<input type="text" name="fieldname" /><br />');          $r->print('<input type="text" name="fieldname" /><br />');
         $r->print('<input type="submit" value="'.&mt('Add Metadata Field').'" />');          $r->print('<input type="submit" value="Add Metadata Field" />');
     }      }
     $r->print('</form>');      $r->print('</form>');
       &endSettingsScreen($r);
 }  }
   
   
Line 4541  sub setrestrictmeta { Line 4764  sub setrestrictmeta {
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
       &startSettingsScreen($r,'parmset',$crstype);
     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};      my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
     my $save_field = '';      my $save_field = '';
     my %lt = &Apache::lonlocal::texthash(  
                                            addm => 'Add Metadata Field',  
                                            ordm => 'Order Metadata Fields',  
                                            save => 'Save',  
                                         );  
     if ($env{'form.restrictmeta'}) {      if ($env{'form.restrictmeta'}) {
         foreach my $field (sort(keys(%env))) {          foreach my $field (sort(keys(%env))) {
             if ($field=~m/^form.(.+)_(.+)$/) {              if ($field=~m/^form.(.+)_(.+)$/) {
Line 4586  sub setrestrictmeta { Line 4806  sub setrestrictmeta {
     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');      my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
     # Now get possible added metadata fields      # Now get possible added metadata fields
     my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});      my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
       my $row_alt = 1;
     $output .= &Apache::loncommon::start_data_table();      $output .= &Apache::loncommon::start_data_table();
     foreach my $field (sort(keys(%metadata_fields))) {      foreach my $field (sort(keys(%metadata_fields))) {
         if ($field ne 'courserestricted') {          if ($field ne 'courserestricted') {
               $row_alt = $row_alt ? 0 : 1;
         $output.= &output_row($r, $field, $metadata_fields{$field});          $output.= &output_row($r, $field, $metadata_fields{$field});
     }      }
     }      }
     my $buttons = (<<ENDButtons);      my $buttons = (<<ENDButtons);
         <input type="submit" name="restrictmeta" value="$lt{'save'}" />          <input type="submit" name="restrictmeta" value="Save" />
         </form><br />          </form><br />
         <form method="post" action="/adm/parmset?action=addmetadata" name="form1">          <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
         <input type="submit" name="restrictmeta" value="$lt{'addm'}" />          <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
         </form>          </form>
         <br />          <br />
         <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">          <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
         <input type="submit" name="restrictmeta" value="$lt{'ordm'}" />          <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
 ENDButtons  ENDButtons
     my $added_flag = 1;      my $added_flag = 1;
     foreach my $field (sort(keys(%$added_metadata_fields))) {      foreach my $field (sort(keys(%$added_metadata_fields))) {
         $output.= &output_row($r,$field,$$added_metadata_fields{$field},$added_flag);          $row_alt = $row_alt ? 0 : 1;
           $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
     }      }
     $output .= &Apache::loncommon::end_data_table();      $output .= &Apache::loncommon::end_data_table();
     $r->print(<<ENDenv);      $r->print(<<ENDenv);
Line 4613  ENDButtons Line 4836  ENDButtons
         $buttons          $buttons
         </form>          </form>
 ENDenv  ENDenv
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return 'ok';      return 'ok';
 }  }
Line 4653  sub defaultsetter { Line 4877  sub defaultsetter {
   
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
         text=>"Set Defaults"});          text=>"Set Defaults"});
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     my $start_page =      my $start_page =
     &Apache::loncommon::start_page('Parameter Setting Default Actions');          &Apache::loncommon::start_page('Parameter Setting Default Actions');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
       &startSettingsScreen($r,'parmset',$crstype);
     $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');      $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');
   
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};  
     my @ids=();      my @ids=();
     my %typep=();      my %typep=();
     my %keyp=();      my %keyp=();
Line 4711  sub defaultsetter { Line 4937  sub defaultsetter {
         }          }
         }          }
     }      }
     foreach my $key (keys %allparms) {      foreach my $key (keys(%allparms)) {
         $newrules{$key.'_triggers'}=$triggers{$key};          $newrules{$key.'_triggers'}=$triggers{$key};
     }      }
     &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);      &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);
     &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);      &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);
     &resetrulescache();      &resetrulescache();
     }      }
     my %lt=&Apache::lonlocal::texthash('days' => 'Days',      my %lt=&Apache::lonlocal::texthash('days' => 'Days',
Line 4803  ENDYESNO Line 5029  ENDYESNO
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
           "\n".'<input type="submit" name="storerules" value="'.            "\n".'<input type="submit" name="storerules" value="'.
           &mt('Save').'" /></form>'."\n");            &mt('Save').'" /></form>'."\n");
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
Line 4849  my %standard_parms; Line 5076  my %standard_parms;
 my %standard_parms_types;  my %standard_parms_types;
   
 sub load_parameter_names {  sub load_parameter_names {
     open(my $config,"<","$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");      open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
     while (my $configline=<$config>) {      while (my $configline=<$config>) {
     if ($configline !~ /\S/ || $configline=~/^\#/) { next; }      if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
     chomp($configline);      chomp($configline);
Line 4864  sub load_parameter_names { Line 5091  sub load_parameter_names {
     close($config);      close($config);
     $standard_parms{'int_pos'}      = 'Positive Integer';      $standard_parms{'int_pos'}      = 'Positive Integer';
     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';      $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
     $standard_parms{'scoreformat'}  = 'Format for display of score';  
 }  }
   
 sub standard_parameter_names {  sub standard_parameter_names {
Line 4891  sub standard_parameter_types { Line 5117  sub standard_parameter_types {
 }  }
   
 sub parm_change_log {  sub parm_change_log {
     my ($r,$parm_permission)=@_;      my ($r)=@_;
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
     text=>"Parameter Change Log"});      text=>"Parameter Change Log"});
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
Line 4901  sub parm_change_log { Line 5130  sub parm_change_log {
              '</script>'."\n";               '</script>'."\n";
     $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));      $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',      &startSettingsScreen($r,'parmset',$crstype);
                       $env{'course.'.$env{'request.course.id'}.'.domain'},      my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum);
                       $env{'course.'.$env{'request.course.id'}.'.num'});  
   
     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }      if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
   
Line 4920  sub parm_change_log { Line 5148  sub parm_change_log {
     $r->print(&Apache::loncommon::display_filter('parmslog').'&nbsp;'."\n".      $r->print(&Apache::loncommon::display_filter('parmslog').'&nbsp;'."\n".
               '<input type="submit" value="'.&mt('Display').'" />'.                '<input type="submit" value="'.&mt('Display').'" />'.
               '</form></fieldset></div><br clear="all" />');                '</form></fieldset></div><br clear="all" />');
     my $readonly = 1;  
     if ($parm_permission->{'edit'}) {      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
         undef($readonly);  
     }  
     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},  
                              $env{'course.'.$env{'request.course.id'}.'.domain'});  
     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().      $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
           '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.            '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
           &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th>');            &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
     unless ($readonly) {            &Apache::loncommon::end_data_table_header_row());
         $r->print('<th>'.&mt('Announce').'</th>');  
     }  
     $r->print(&Apache::loncommon::end_data_table_header_row());  
     my $shown=0;      my $shown=0;
     my $folder='';      my $folder='';
     if ($env{'form.displayfilter'} eq 'currentfolder') {      if ($env{'form.displayfilter'} eq 'currentfolder') {
Line 4965  sub parm_change_log { Line 5186  sub parm_change_log {
                            $parmlog{$id}{'exe_uname'},                             $parmlog{$id}{'exe_uname'},
                            $parmlog{$id}{'exe_udom'});                             $parmlog{$id}{'exe_udom'});
     my $send_msg_link='';      my $send_msg_link='';
     if ((!$readonly) &&       if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
         (($parmlog{$id}{'exe_uname'} ne $env{'user.name'})  
          || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {           || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
         $send_msg_link ='<br />'.          $send_msg_link ='<br />'.
         &Apache::loncommon::messagewrapper(&mt('Send message'),          &Apache::loncommon::messagewrapper(&mt('Send message'),
Line 4987  sub parm_change_log { Line 5207  sub parm_change_log {
             next if (($issection ne '') && ($issection ne $env{'request.course.sec'}));              next if (($issection ne '') && ($issection ne $env{'request.course.sec'}));
             if ($uname ne '') {              if ($uname ne '') {
                 my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'});                  my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'});
                 next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'}));                  next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'})); 
             }              }
         }          }
         if ($env{'form.displayfilter'} eq 'currentfolder') {          if ($env{'form.displayfilter'} eq 'currentfolder') {
Line 5043  sub parm_change_log { Line 5263  sub parm_change_log {
             }              }
         }          }
         }          }
         $output .= '</td>';          $output .= '</td><td>';
               
             unless ($readonly) {          if ($stillactive) {
                 $output .= '<td>';                  my $parmitem = &standard_parameter_names($parmname);
                 if ($stillactive) {                  $parmitem = &mt($parmitem);
                     my $parmitem = &standard_parameter_names($parmname);          my $title=&mt('Changed [_1]',$parmitem);
                     $parmitem = &mt($parmitem);                  my $description=&mt('Changed [_1] for [_2] to [_3]',
                     my $title=&mt('Changed [_1]',$parmitem);                                      $parmitem,$realmdescription,
                     my $description=&mt('Changed [_1] for [_2] to [_3]',                      (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
                         $parmitem,$realmdescription,          if (($uname) && ($udom)) {
                         (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));              $output .=
                     if (($uname) && ($udom)) {              &Apache::loncommon::messagewrapper('Notify User',
                         $output .=                                 $uname,$udom,$title,
                             &Apache::loncommon::messagewrapper('Notify User',                                 $description);
                                                                $uname,$udom,$title,          } else {
                                                                $description);              $output .=
                     } else {              &Apache::lonrss::course_blog_link($id,$title,
                         $output .=                                $description);
                             &Apache::lonrss::course_blog_link($id,$title,          }
                                                               $description);          }
                     }          $output .= '</td>'.&Apache::loncommon::end_data_table_row();
                 }  
                 $output .= '</td>';  
             }  
         $output .= &Apache::loncommon::end_data_table_row();  
     }      }
         if ($env{'form.displayfilter'} eq 'containing') {          if ($env{'form.displayfilter'} eq 'containing') {
         my $wholeentry=$about_me_link.':'.          my $wholeentry=$about_me_link.':'.
Line 5087  sub parm_change_log { Line 5303  sub parm_change_log {
           || $shown<=$env{'form.show'})) { last; }            || $shown<=$env{'form.show'})) { last; }
     }      }
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
       &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
Line 5135  sub update_slots { Line 5352  sub update_slots {
                           context => 'parameter',                            context => 'parameter',
                         );                          );
         &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,          &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
                                         '',$uname,$udom,$cnum,$cdom);                                     '',$uname,$udom,$cnum,$cdom);
   
         &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,          &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
                                         '',$uname,$udom,$uname,$udom);                                     '',$uname,$udom,$uname,$udom);
     }      }
     return $success;      return $success;
 }  }
Line 5169  sub delete_slots { Line 5386  sub delete_slots {
                                   context => 'parameter',                                    context => 'parameter',
                                 );                                  );
                 &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,                  &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
                                                 1,$uname,$udom,$cnum,$cdom);                                             1,$uname,$udom,$cnum,$cdom);
                 &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,                  &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
                                                 1,$uname,$udom,$uname,$udom);                                             1,$uname,$udom,$uname,$udom);
             }              }
         }          }
     }      }
Line 5194  sub parameter_release_vars { Line 5411  sub parameter_release_vars {
 }  }
   
 sub parameter_releasecheck {  sub parameter_releasecheck {
     my ($name,$value,$needsrelease,$cmajor,$cminor) = @_;      my ($name,$value,$valmatch,$needsrelease,$cmajor,$cminor) = @_;
     my $needsnewer;      my $needsnewer;
     my ($needsmajor,$needsminor) = split(/\./,$needsrelease);      my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
     if (($cmajor < $needsmajor) ||       if (($cmajor < $needsmajor) || 
         ($cmajor == $needsmajor && $cminor < $needsminor)) {          ($cmajor == $needsmajor && $cminor < $needsminor)) {
         $needsnewer = 1;          $needsnewer = 1;
     } else {      } elsif ($valmatch) {
         &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});          &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch});
       } elsif ($value) { 
           &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.':'});
     }      }
     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);  
 }  
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
Line 5273  sub handler { Line 5452  sub handler {
                                             'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});                                              'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
   
 # ----------------------------------------------------- Needs to be in a course  # ----------------------------------------------------- Needs to be in a course
     my ($parm_permission,$allowed) = &get_permission();      my $parm_permission =
       (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
        &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
                     $env{'request.course.sec'}));
     my $exists = &check_for_course_info();      my $exists = &check_for_course_info();
   
     if ($env{'request.course.id'} && $allowed && $exists) {      if ($env{'request.course.id'} &&  $parm_permission && $exists) {
         #          #
         # Main switch on form.action and form.state, as appropriate          # Main switch on form.action and form.state, as appropriate
         #          #
         # Check first if coming from someone else headed directly for          # Check first if coming from someone else headed directly for
         #  the table mode          #  the table mode
         if (($parm_permission->{'set'}) &&          if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
             ((($env{'form.command'} eq 'set') && ($env{'form.url'})           && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                && (!$env{'form.dis'})) || ($env{'form.symb'}))) {          &assessparms($r);
             &assessparms($r,$parm_permission);  
         } elsif (! exists($env{'form.action'})) {          } elsif (! exists($env{'form.action'})) {
             &print_main_menu($r,$parm_permission);              &print_main_menu($r,$parm_permission);
         } elsif (!$parm_permission->{$env{'form.action'}}) {  
             &print_main_menu($r,$parm_permission);  
         } elsif ($env{'form.action'} eq 'setoverview') {          } elsif ($env{'form.action'} eq 'setoverview') {
             &overview($r,$parm_permission);          &overview($r);
         } elsif ($env{'form.action'} eq 'addmetadata') {      } elsif ($env{'form.action'} eq 'addmetadata') {
             &addmetafield($r);          &addmetafield($r);
         } elsif ($env{'form.action'} eq 'ordermetadata') {      } elsif ($env{'form.action'} eq 'ordermetadata') {
             &order_meta_fields($r);          &order_meta_fields($r);
         } elsif ($env{'form.action'} eq 'setrestrictmeta') {          } elsif ($env{'form.action'} eq 'setrestrictmeta') {
             &setrestrictmeta($r);          &setrestrictmeta($r);
         } elsif ($env{'form.action'} eq 'newoverview') {          } elsif ($env{'form.action'} eq 'newoverview') {
             &newoverview($r,$parm_permission);          &newoverview($r);
         } elsif ($env{'form.action'} eq 'setdefaults') {          } elsif ($env{'form.action'} eq 'setdefaults') {
             &defaultsetter($r);          &defaultsetter($r);
         } elsif ($env{'form.action'} eq 'settable') {      } elsif ($env{'form.action'} eq 'settable') {
             &assessparms($r,$parm_permission);          &assessparms($r);
         } elsif ($env{'form.action'} eq 'parameterchangelog') {          } elsif ($env{'form.action'} eq 'parameterchangelog') {
             &parm_change_log($r,$parm_permission);          &parm_change_log($r);
         } elsif ($env{'form.action'} eq 'cleanparameters') {          } elsif ($env{'form.action'} eq 'cleanparameters') {
             &clean_parameters($r);          &clean_parameters($r);
         } elsif ($env{'form.action'} eq 'dateshift1') {          } elsif ($env{'form.action'} eq 'dateshift1') {
             &date_shift_one($r);              &date_shift_one($r);
         } elsif ($env{'form.action'} eq 'dateshift2') {          } elsif ($env{'form.action'} eq 'dateshift2') {

Removed from v.1.522.2.26.2.1  
changed lines
  Added in v.1.555


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