Diff for /loncom/interface/lonparmset.pm between versions 1.556 and 1.560

version 1.556, 2016/03/02 14:14:06 version 1.560, 2016/07/12 20:30:20
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 course parameters.   lonparmset provides an interface to setting course parameters.
   
   It contains all the code for the "Content and Problem Settings" UI, except
   for the helpers parameter.helper and resettimes.helper, and lonhelper.pm,
   and lonblockingmenu.pm.
   
 =head1 DESCRIPTION  =head1 DESCRIPTION
   
Line 327  use HTML::Entities; Line 331  use HTML::Entities;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   
   ##################################################
   # CONTENT AND PROBLEM SETTINGS HTML PAGE HEADER/FOOTER
   ##################################################
   
   # Page header
 sub startSettingsScreen {  sub startSettingsScreen {
     my ($r,$mode,$crstype)=@_;      my ($r,$mode,$crstype)=@_;
   
Line 345  sub startSettingsScreen { Line 354  sub startSettingsScreen {
     $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;">');      $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;">');
 }  }
   
   # Page footer
 sub endSettingsScreen {  sub endSettingsScreen {
    my ($r)=@_;     my ($r)=@_;
    $r->print('</div></div></div>');     $r->print('</div></div></div>');
Line 352  sub endSettingsScreen { Line 362  sub endSettingsScreen {
   
   
   
   ##################################################
   # TABLE MODE
   # (parmval is also used for the log of parameter changes)
   ##################################################
   
 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 504  sub reset_caches { Line 519  sub reset_caches {
     my $parmhashid;      my $parmhashid;
     my %parmhash;      my %parmhash;
     sub resetparmhash {      sub resetparmhash {
     undef($parmhashid);          undef($parmhashid);
     undef(%parmhash);          undef(%parmhash);
     }      }
   
     sub cacheparmhash {      sub cacheparmhash {
     if ($parmhashid eq  $env{'request.course.fn'}) { return; }          if ($parmhashid eq  $env{'request.course.fn'}) { return; }
     my %parmhashfile;          my %parmhashfile;
     if (tie(%parmhashfile,'GDBM_File',          if (tie(%parmhashfile,'GDBM_File',
         $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {              $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
         %parmhash=%parmhashfile;              %parmhash=%parmhashfile;
         untie(%parmhashfile);              untie(%parmhashfile);
         $parmhashid=$env{'request.course.fn'};              $parmhashid=$env{'request.course.fn'};
     }          }
     }      }
   
     sub parmhash {      sub parmhash {
     my ($id) = @_;          my ($id) = @_;
     &cacheparmhash();          &cacheparmhash();
     return $parmhash{$id};          return $parmhash{$id};
     }      }
  }  }
   
 {  {
     my $symbsid;      my $symbsid;
     my %symbs;      my %symbs;
     sub resetsymbcache {      sub resetsymbcache {
     undef($symbsid);          undef($symbsid);
     undef(%symbs);          undef(%symbs);
     }      }
   
     sub symbcache {      sub symbcache {
     my $id=shift;          my $id=shift;
     if ($symbsid ne $env{'request.course.id'}) {          if ($symbsid ne $env{'request.course.id'}) {
         undef(%symbs);              undef(%symbs);
     }          }
     if (!$symbs{$id}) {          if (!$symbs{$id}) {
         my $navmap = Apache::lonnavmaps::navmap->new();              my $navmap = Apache::lonnavmaps::navmap->new();
         if ($id=~/\./) {              if ($id=~/\./) {
         my $resource=$navmap->getById($id);                  my $resource=$navmap->getById($id);
         $symbs{$id}=$resource->symb();                  $symbs{$id}=$resource->symb();
         } else {              } else {
         my $resource=$navmap->getByMapPc($id);                  my $resource=$navmap->getByMapPc($id);
         $symbs{$id}=&Apache::lonnet::declutter($resource->src());                  $symbs{$id}=&Apache::lonnet::declutter($resource->src());
               }
               $symbsid=$env{'request.course.id'};
         }          }
         $symbsid=$env{'request.course.id'};          return $symbs{$id};
     }  
     return $symbs{$id};  
     }      }
  }  }
   
 {  {
     my $rulesid;      my $rulesid;
     my %rules;      my %rules;
     sub resetrulescache {      sub resetrulescache {
     undef($rulesid);          undef($rulesid);
     undef(%rules);          undef(%rules);
     }      }
   
     sub rulescache {      sub rulescache {
     my $id=shift;          my $id=shift;
     if ($rulesid ne $env{'request.course.id'}          if ($rulesid ne $env{'request.course.id'}
         && !defined($rules{$id})) {              && !defined($rules{$id})) {
         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'};
         %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);              %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
         $rulesid=$env{'request.course.id'};              $rulesid=$env{'request.course.id'};
     }          }
     return $rules{$id};          return $rules{$id};
     }      }
 }  }
   
Line 580  sub reset_caches { Line 595  sub reset_caches {
 sub preset_defaults {  sub preset_defaults {
     my $type=shift;      my $type=shift;
     if (&rulescache($type.'_action') eq 'default') {      if (&rulescache($type.'_action') eq 'default') {
 # yes, there is something          # yes, there is something
     return (&rulescache($type.'_hours'),          return (&rulescache($type.'_hours'),
         &rulescache($type.'_min'),              &rulescache($type.'_min'),
         &rulescache($type.'_sec'),              &rulescache($type.'_sec'),
         &rulescache($type.'_value'));              &rulescache($type.'_value'));
     } else {      } else {
 # nothing there or something else          # nothing there or something else
     return ('','','','','');          return ('','','','','');
     }      }
 }  }
   
Line 651  my %recstack; Line 666  my %recstack;
 sub storeparm_by_symb {  sub storeparm_by_symb {
     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;      my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
     unless ($recflag) {      unless ($recflag) {
 # first time call          # first time call
     %recstack=();          %recstack=();
     $recflag=1;          $recflag=1;
     }      }
 # store parameter      # store parameter
     &storeparm_by_symb_inner      &storeparm_by_symb_inner
     ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);      ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
 # don't do anything if parameter was reset      # don't do anything if parameter was reset
     unless ($nval) { return; }      unless ($nval) { return; }
     my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);      my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
 # remember that this was set      # remember that this was set
     $recstack{$parm}=1;      $recstack{$parm}=1;
 # what does this trigger?      # what does this trigger?
     foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {      foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
 # don't backfire          # don't backfire
        unless ((!$triggered) || ($recstack{$triggered})) {          unless ((!$triggered) || ($recstack{$triggered})) {
        my $action=&rulescache($triggered.'_action');              my $action=&rulescache($triggered.'_action');
        my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);              my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
 # set triggered parameter on same level              # set triggered parameter on same level
        my $newspnam=$prefix.$triggered;              my $newspnam=$prefix.$triggered;
        my $newvalue='';              my $newvalue='';
        my $active=1;              my $active=1;
        if ($action=~/^when\_setting/) {              if ($action=~/^when\_setting/) {
 # are there restrictions?              # are there restrictions?
            if (&rulescache($triggered.'_triggervalue')=~/\w/) {                  if (&rulescache($triggered.'_triggervalue')=~/\w/) {
            $active=0;                      $active=0;
            foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {                      foreach my $possiblevalue (split(/\s*\,
                if (lc($possiblevalue) eq lc($nval)) { $active=1; }                              \s*/,&rulescache($triggered.'_triggervalue'))) {
            }                          if (lc($possiblevalue) eq lc($nval)) { $active=1; }
            }                      }
            $newvalue=&rulescache($triggered.'_value');                  }
        } else {                  $newvalue=&rulescache($triggered.'_value');
            my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');              } else {
            if ($action=~/^later\_than/) {                  my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
            $newvalue=$nval+$totalsecs;                  if ($action=~/^later\_than/) {
            } else {                      $newvalue=$nval+$totalsecs;
            $newvalue=$nval-$totalsecs;                  } else {
            }                      $newvalue=$nval-$totalsecs;
        }                  }
        if ($active) {              }
            &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),              if ($active) {
                    $uname,$udom,$csec,$recflag,$cgroup);                  &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
        }                          $uname,$udom,$csec,$recflag,$cgroup);
        }              }
           }
     }      }
     return '';      return '';
 }  }
Line 750  sub storeparm_by_symb_inner { Line 766  sub storeparm_by_symb_inner {
     my %storecontent = ($storeunder         => $nval,      my %storecontent = ($storeunder         => $nval,
             $storeunder.'.type' => $ntype);              $storeunder.'.type' => $ntype);
     my $reply='';      my $reply='';
       
     if ($snum>4) {      if ($snum>4) {
 # ---------------------------------------------------------------- Store Course  # ---------------------------------------------------------------- Store Course
 #  #
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
 # Expire sheets          # Expire sheets
     &Apache::lonnet::expirespread('','','studentcalc');          &Apache::lonnet::expirespread('','','studentcalc');
     if (($snum==13) || ($snum==9) || ($snum==5)) {          if (($snum==13) || ($snum==9) || ($snum==5)) {
         &Apache::lonnet::expirespread('','','assesscalc',$symb);              &Apache::lonnet::expirespread('','','assesscalc',$symb);
 #FIXME          } elsif (($snum==14) || ($snum==10) || ($snum==6)) {
     } elsif (($snum==14) || ($snum==10) || ($snum==6)) {              &Apache::lonnet::expirespread('','','assesscalc',$map);
         &Apache::lonnet::expirespread('','','assesscalc',$map);          } else {
     } else {              &Apache::lonnet::expirespread('','','assesscalc');
         &Apache::lonnet::expirespread('','','assesscalc');          }
     }          # Store parameter
 # Store parameter          if ($delete) {
     if ($delete) {              $reply=&Apache::lonnet::del
         $reply=&Apache::lonnet::del              ('resourcedata',[keys(%storecontent)],$cdom,$cnum);
         ('resourcedata',[keys(%storecontent)],$cdom,$cnum);                  &log_parmset(\%storecontent,1);
             &log_parmset(\%storecontent,1);          } else {
     } else {              $reply=&Apache::lonnet::cput
         $reply=&Apache::lonnet::cput              ('resourcedata',\%storecontent,$cdom,$cnum);
         ('resourcedata',\%storecontent,$cdom,$cnum);              &log_parmset(\%storecontent);
         &log_parmset(\%storecontent);          }
     }          &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
     &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);  
     } else {      } else {
 # ------------------------------------------------------------------ Store User  # ------------------------------------------------------------------ Store User
 #  #
 # Expire sheets          # Expire sheets
     &Apache::lonnet::expirespread($uname,$udom,'studentcalc');          &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
     if ($snum==1) {          if ($snum==1) {
         &Apache::lonnet::expirespread              &Apache::lonnet::expirespread
         ($uname,$udom,'assesscalc',$symb);              ($uname,$udom,'assesscalc',$symb);
     } elsif ($snum==2) {          } elsif ($snum==2) {
         &Apache::lonnet::expirespread              &Apache::lonnet::expirespread
         ($uname,$udom,'assesscalc',$map);              ($uname,$udom,'assesscalc',$map);
     } else {          } else {
         &Apache::lonnet::expirespread($uname,$udom,'assesscalc');              &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
     }          }
 # Store parameter          # Store parameter
     if ($delete) {          if ($delete) {
         $reply=&Apache::lonnet::del              $reply=&Apache::lonnet::del
         ('resourcedata',[keys(%storecontent)],$udom,$uname);              ('resourcedata',[keys(%storecontent)],$udom,$uname);
         &log_parmset(\%storecontent,1,$uname,$udom);              &log_parmset(\%storecontent,1,$uname,$udom);
     } else {          } else {
         $reply=&Apache::lonnet::cput              $reply=&Apache::lonnet::cput
         ('resourcedata',\%storecontent,$udom,$uname);              ('resourcedata',\%storecontent,$udom,$uname);
         &log_parmset(\%storecontent,0,$uname,$udom);              &log_parmset(\%storecontent,0,$uname,$udom);
     }          }
     &Apache::lonnet::devalidateuserresdata($uname,$udom);          &Apache::lonnet::devalidateuserresdata($uname,$udom);
     }      }
   
     if ($reply=~/^error\:(.*)/) {      if ($reply=~/^error\:(.*)/) {
     return "<span class=\"LC_error\">Write Error: $1</span>";          return "<span class=\"LC_error\">Write Error: $1</span>";
     }      }
     return '';      return '';
 }  }
Line 825  sub valout { Line 841  sub valout {
         }          }
     } else {      } else {
         if ($type eq 'date_interval') {          if ($type eq 'date_interval') {
             my ($totalsecs,$donebutton) = split(/_/,$value);              my ($totalsecs,$donesuffix) = split(/_/,$value,2);
               my ($usesdone,$donebuttontext,$proctor,$secretkey);
               if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) {
                   $donebuttontext = $1;
                   (undef,$proctor,$secretkey) = split(/_/,$2);
                   $usesdone = 'done';
               } elsif ($donesuffix =~ /^done(|_.+)$/) {
                   $donebuttontext = &mt('Done');
                   ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix);
               }
             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);              my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);
             my @timer;              my @timer;
             $year=$year-70;              $year=$year-70;
Line 859  sub valout { Line 884  sub valout {
                 push(@timer,&mt('[quant,_1,sec]',0));                  push(@timer,&mt('[quant,_1,sec]',0));
             }              }
             $result.=join(", ",@timer);              $result.=join(", ",@timer);
             if ($donebutton eq 'done') {              if ($usesdone eq 'done') {
                 $result .= ' '.&mt('+ "done"');                  if ($secretkey) {
                       $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey);  
                   } else {
                       $result .= ' + "'.$donebuttontext.'"';
                   }
             }              }
         } elsif (&isdateparm($type)) {          } elsif (&isdateparm($type)) {
             $result = &Apache::lonlocal::locallocaltime($value).              $result = &Apache::lonlocal::locallocaltime($value).
         &date_sanity_info($value);                  &date_sanity_info($value);
         } else {          } else {
             $result = $value;              $result = $value;
             $result=~s/\,/\, /gs;              $result=~s/\,/\, /gs;
         $result = &HTML::Entities::encode($result,'"<>&');              $result = &HTML::Entities::encode($result,'"<>&');
         }          }
     }      }
     return $result;      return $result;
Line 879  sub plink { Line 908  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)) {          if (&isdateparm($type)) {
             $winvalue=$env{'form.recent_'.$type};              $winvalue=$env{'form.recent_'.$type};
         } else {          } else {
             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};              $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
Line 892  sub plink { Line 921  sub plink {
     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) {
     $$item = &HTML::Entities::encode($$item,'"<>&');          $$item = &HTML::Entities::encode($$item,'"<>&');
     $$item =~ s/\'/\\\'/g;          $$item =~ s/\'/\\\'/g;
     }      }
     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.      return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
     '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"      '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
Line 1126  sub ipacc_boxes_js  { Line 1155  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,$crstype) = @_;      my ($r,$psymb,$crstype) = @_;
   
Line 1136  sub startpage { Line 1190  sub startpage {
         $loaditems{'onload'} = "showHide_courseContent(); group_or_section('cgroup'); resize_scrollbox('mapmenuscroll','1','1');";          $loaditems{'onload'} = "showHide_courseContent(); group_or_section('cgroup'); resize_scrollbox('mapmenuscroll','1','1');";
     }      }
   
     if ((($env{'form.command'} eq 'set') && ($env{'form.url'})      if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) &&
          && (!$env{'form.dis'})) || ($env{'form.symb'})) {              (!$env{'form.dis'})) || ($env{'form.symb'})) {
     &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',          &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
         text=>"Problem Parameters"});              text=>"Problem Parameters"});
     } else {      } else {
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',          &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
        text=>"Table Mode",              text=>"Table Mode",
        help => 'Course_Setting_Parameters'});              help => 'Course_Setting_Parameters'});
     }      }
     my $js = &page_js().'      my $js = &page_js().'
 <script type="text/javascript">  <script type="text/javascript">
Line 1181  sub print_row { Line 1235  sub print_row {
     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},
       $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);        $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);
 # get the type for the parameters      # get the type for the parameters
 # problem: these may not be set for all levels      # problem: these may not be set for all levels
     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.      my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
                                           $$name{$which}.'.type',$rid,                                            $$name{$which}.'.type',$rid,
          $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);           $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
 # cascade down manually      # cascade down manually
     my $cascadetype=$$defaulttype{$which};      my $cascadetype=$$defaulttype{$which};
     for (my $i=18;$i>0;$i--) {      for (my $i=18;$i>0;$i--) {
      if ($typeoutpar[$i]) {          if ($typeoutpar[$i]) {
             $cascadetype=$typeoutpar[$i];              $cascadetype=$typeoutpar[$i];
     } else {          } else {
             $typeoutpar[$i]=$cascadetype;              $typeoutpar[$i]=$cascadetype;
         }          }
     }      }
Line 1209  sub print_row { Line 1263  sub print_row {
     }      }
     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');      my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
     if ($automatic) {      if ($automatic) {
     $parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';          $parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';
     }      }
     $r->print('<td>'.$parm.'</td>');      $r->print('<td>'.$parm.'</td>');
   
Line 1299  sub print_row { Line 1353  sub print_row {
         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.          my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
                                         '.'.$$name{$which},$$symbp{$rid});                                          '.'.$$name{$which},$$symbp{$rid});
         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,$$name{$which}).'&nbsp;'.                    &valout($sessionval,$sessionvaltype,$$name{$which}).'&nbsp;'.
                   '</font></td>');                    '</font></td>');
Line 1619  sub lookUpTableParameter { Line 1675  sub lookUpTableParameter {
         'contentopen' => 'time_settings',          'contentopen' => 'time_settings',
         'contentclose' => 'time_settings',          'contentclose' => 'time_settings',
         'discussend' => 'time_settings',          'discussend' => 'time_settings',
  'printstartdate' => 'time_settings',          'printstartdate' => 'time_settings',
  'printenddate' => 'time_settings',          'printenddate' => 'time_settings',
         'weight' => 'grading',          'weight' => 'grading',
         'handgrade' => 'grading',          'handgrade' => 'grading',
         'maxtries' => 'tries',          'maxtries' => 'tries',
Line 1795  sub partmenu { Line 1851  sub partmenu {
     my %temphash=();      my %temphash=();
     foreach (@{$psprt}) { $temphash{$_}=1; }      foreach (@{$psprt}) { $temphash{$_}=1; }
     foreach my $tempkey (sort {      foreach my $tempkey (sort {
     if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }                  if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
     } keys(%{$allparts})) {              } keys(%{$allparts})) {
     unless ($tempkey =~ /\./) {          unless ($tempkey =~ /\./) {
         $r->print('<option value="'.$tempkey.'"');              $r->print('<option value="'.$tempkey.'"');
         if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {              if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
         $r->print(' selected="selected"');                  $r->print(' selected="selected"');
               }
               $r->print('>'.$$allparts{$tempkey}.'</option>');
         }          }
         $r->print('>'.$$allparts{$tempkey}.'</option>');  
     }  
     }      }
     $r->print('</select>');      $r->print('</select>');
 }  }
Line 2162  sub keysplit { Line 2218  sub keysplit {
 sub keysinorder {  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 {
     my ($name,$keyorder)=@_;      my ($name,$keyorder)=@_;
     return sort {      return sort {
     my $ta=(split('_',$a))[-1];          my $ta=(split('_',$a))[-1];
     my $tb=(split('_',$b))[-1];          my $tb=(split('_',$b))[-1];
     if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {          if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
         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}));
 }  }
   
Line 2222  sub standardkeyorder { Line 2278  sub standardkeyorder {
         'parameter_0_discussend' => 19,          'parameter_0_discussend' => 19,
         'parameter_0_discusshide' => 20,          'parameter_0_discusshide' => 20,
         'parameter_0_discussvote' => 21,          'parameter_0_discussvote' => 21,
  'parameter_0_printstartdate'  =>  22,          'parameter_0_printstartdate'  =>  22,
  'parameter_0_printenddate' =>  23);          'parameter_0_printenddate' =>  23);
 }  }
   
   
   # Table mode UI.
 sub assessparms {  sub assessparms {
   
     my $r=shift;      my $r=shift;
   
   
   
 # -------------------------------------------------------- Variable declaration  # -------------------------------------------------------- Variable declaration
     my @ids=();      my @ids=();
     my %symbp=();      my %symbp=();
Line 2316  sub assessparms { Line 2372  sub assessparms {
   
 # ----------------------------------------------- Was this started from grades?  # ----------------------------------------------- Was this started from grades?
   
     if (($env{'form.command'} eq 'set') && ($env{'form.url'})      if (($env{'form.command'} eq 'set') && ($env{'form.url'}) &&
     && (!$env{'form.dis'})) {              (!$env{'form.dis'})) {
         my $url=$env{'form.url'};          my $url=$env{'form.url'};
         $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;          $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
         $pssymb=&Apache::lonnet::symbread($url);          $pssymb=&Apache::lonnet::symbread($url);
Line 2412  sub assessparms { Line 2468  sub assessparms {
         my $totalstored = 0;          my $totalstored = 0;
         my $now = time;          my $now = time;
         for (my $i=0;$i<=$#markers;$i++) {          for (my $i=0;$i<=$#markers;$i++) {
             my ($needsrelease,$needsnewer,$name);              my ($needsrelease,$needsnewer,$name,$namematch);
             if (($env{'request.course.sec'} ne '') && ($markers[$i] =~ /\&(9|10|11|12)$/)) {              if (($env{'request.course.sec'} ne '') && ($markers[$i] =~ /\&(9|10|11|12)$/)) {
                 next if ($csec ne $env{'request.course.sec'});                  next if ($csec ne $env{'request.course.sec'});
             }              }
             if ($markers[$i] =~ /\&(8|7|6|5)$/) {              if ($markers[$i] =~ /\&(8|7|6|5)$/) {
                 next if ($noeditgrp);                  next if ($noeditgrp);
             }               }
               if ($markers[$i] =~ /\&(17|11|7|3)$/) {
                   $namematch = 'maplevelrecurse';
               }
             if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3|4)$/) {              if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3|4)$/) {
                 my (@ok_slots,@fail_slots,@del_slots);                  my (@ok_slots,@fail_slots,@del_slots);
                 my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);                  my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
Line 2505  sub assessparms { Line 2564  sub assessparms {
                     }                      }
                 }                  }
                 $needsrelease =                  $needsrelease =
                     $Apache::lonnet::needsrelease{"parameter:$name:$val:$valmatch"};                      $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,$valmatch,                      $needsnewer = &parameter_releasecheck($name,$val,$valmatch,undef,
                                                           $needsrelease,                                                            $needsrelease,
                                                           $cmajor,$cminor);                                                            $cmajor,$cminor);
                 }                  }
             }              }
             if ($needsnewer) {              if ($needsnewer) {
                 $message .= &oldversion_warning($name,$values[$i],$chostname,$cmajor,                  undef($namematch);
               } else {
                   my $currneeded;
                   if ($needsrelease) {
                       $currneeded = $needsrelease;
                   }
                   if ($namematch) {
                       $needsrelease =
                           $Apache::lonnet::needsrelease{"parameter::::$namematch"};
                       if (($needsrelease) && (($currneeded eq '') || ($needsrelease < $currneeded))) {
                           unless ($got_chostname) {
                               ($chostname,$cmajor,$cminor) = &parameter_release_vars();
                               $got_chostname = 1;
                           }
                           $needsnewer = &parameter_releasecheck(undef,undef,undef,$namematch,
                                                                 $needsrelease,
                                                                 $cmajor,$cminor);
                       } else {
                           undef($namematch);
                       }
                   }
               }
               if ($needsnewer) {
                   $message .= &oldversion_warning($name,$namematch,$values[$i],$chostname,$cmajor,
                                                 $cminor,$needsrelease);                                                  $cminor,$needsrelease);
             } else {              } else {
                 $message.=&storeparm(split(/\&/,$markers[$i]),                  $message.=&storeparm(split(/\&/,$markers[$i]),
Line 2666  ENDPARMSELSCRIPT Line 2748  ENDPARMSELSCRIPT
 #  #
 # This produces the cascading table output of parameters  # This produces the cascading table output of parameters
 #  #
                my $coursespan=$csec?10:6;              my $coursespan=$csec?10:6;
                my $userspan=4;              my $userspan=4;
                if ($cgroup ne '') {              if ($cgroup ne '') {
                   $coursespan += 4;                  $coursespan += 4;
                }              }
   
                $r->print(&Apache::loncommon::start_data_table());              $r->print(&Apache::loncommon::start_data_table());
 #              #
 # This produces the headers              # This produces the headers
 #              #
                $r->print('<tr><td colspan="5"></td>');              $r->print('<tr><td colspan="5"></td>');
                $r->print('<th colspan="'.($coursespan).'">'.&mt('Any User').'</th>');              $r->print('<th colspan="'.($coursespan).'">'.&mt('Any User').'</th>');
                if ($uname) {              if ($uname) {
                 if (@usersgroups > 1) {                  if (@usersgroups > 1) {
                        $userspan ++;                      $userspan ++;
                    }                  }
                    $r->print('<th colspan="'.$userspan.'" rowspan="2">');                  $r->print('<th colspan="'.$userspan.'" rowspan="2">');
                    $r->print(&mt('User [_1] at Domain [_2]',"'".$uname."'","'".$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",
                 'csv'    => "Current Session Value",                  'csv'    => "Current Session Value",
                 'rl'     => "Resource Level",                  'rl'     => "Resource Level",
Line 2702  ENDPARMSELSCRIPT Line 2784  ENDPARMSELSCRIPT
                 'formfr' => 'for Map or Folder (recursive)',                  'formfr' => 'for Map or Folder (recursive)',
                 'fr'     => 'for Resource'                  'fr'     => 'for Resource'
             );              );
                $r->print(<<ENDTABLETWO);              $r->print(<<ENDTABLETWO);
 <th rowspan="3">$lt{'pie'}</th>  <th rowspan="3">$lt{'pie'}</th>
 <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>  <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>
 </tr><tr><td colspan="5"></td><th colspan="3">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>  </tr><tr><td colspan="5"></td><th colspan="3">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>
 <th colspan="1">$lt{'ic'}</th>  <th colspan="1">$lt{'ic'}</th>
   
 ENDTABLETWO  ENDTABLETWO
                if ($csec) {              if ($csec) {
                    $r->print('<th colspan="4">'.                  $r->print('<th colspan="4">'.
                   &mt("in Section")." $csec</th>");                  &mt("in Section")." $csec</th>");
                }              }
                if ($cgroup) {              if ($cgroup) {
                 $r->print('<th colspan="4">'.                  $r->print('<th colspan="4">'.
                 &mt("in Group")." $cgroup</th>");                  &mt("in Group")." $cgroup</th>");
                }              }
                $r->print(<<ENDTABLEHEADFOUR);              $r->print(<<ENDTABLEHEADFOUR);
 </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>  </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
 <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>  <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
 <th>$lt{'gen'}</th><th>$lt{'formfr'}</th><th>$lt{'foremf'}</th>  <th>$lt{'gen'}</th><th>$lt{'formfr'}</th><th>$lt{'foremf'}</th>
 <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>  <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
 ENDTABLEHEADFOUR  ENDTABLEHEADFOUR
   
                if ($csec) {              if ($csec) {
                    $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
                }              }
   
                if ($cgroup) {              if ($cgroup) {
                    $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.&mt('foremf').'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.&mt('foremf').'</th><th>'.$lt{'fr'}.'</th>');
                }              }
   
                if ($uname) {              if ($uname) {
                     if (@usersgroups > 1) {                  if (@usersgroups > 1) {
                         $r->print('<th>'.&mt('Control by other group?').'</th>');                      $r->print('<th>'.&mt('Control by other group?').'</th>');
                    }                  }
                    $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
                }              }
   
                $r->print('</tr>');              $r->print('</tr>');
 #  #
 # Done with the headers  # Done with the headers
 #   # 
                my $defbgone='';              my $defbgone='';
                my $defbgtwo='';              my $defbgtwo='';
                my $defbgthree = '';              my $defbgthree = '';
   
                foreach my $rid (@ids) {              foreach my $rid (@ids) {
   
                 my ($inmapid)=($rid=~/\.(\d+)$/);                  my ($inmapid)=($rid=~/\.(\d+)$/);
   
                 if ((!$pssymb &&                  if ((!$pssymb &&
                  (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))                          (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                 ||                          ||
                 ($pssymb && $pssymb eq $symbp{$rid})) {                          ($pssymb && $pssymb eq $symbp{$rid})) {
 # ------------------------------------------------------ Entry for one resource  # ------------------------------------------------------ Entry for one resource
                     if ($defbgone eq '#E0E099') {                      if ($defbgone eq '#E0E099') {
                         $defbgone='#E0E0DD';                          $defbgone='#E0E0DD';
Line 2784  ENDTABLEHEADFOUR Line 2866  ENDTABLEHEADFOUR
                     my $filter=$env{'form.filter'};                      my $filter=$env{'form.filter'};
                     foreach my $tempkeyp (&keysplit($keyp{$rid})) {                      foreach my $tempkeyp (&keysplit($keyp{$rid})) {
                         if (grep $_ eq $tempkeyp, @catmarker) {                          if (grep $_ eq $tempkeyp, @catmarker) {
                           my $parmname=&Apache::lonnet::metadata($uri,$tempkeyp.'.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{$tempkeyp}=$parmname;                              $name{$tempkeyp}=$parmname;
                           $part{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.part');                              $part{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.part');
   
                           my $parmdis=&Apache::lonnet::metadata($uri,$tempkeyp.'.display');                              my $parmdis=&Apache::lonnet::metadata($uri,$tempkeyp.'.display');
                           if ($allparms{$name{$tempkeyp}} ne '') {                              if ($allparms{$name{$tempkeyp}} ne '') {
                               my $identifier;                                  my $identifier;
                               if ($parmdis =~ /(\s*\[Part.*)$/) {                                  if ($parmdis =~ /(\s*\[Part.*)$/) {
                                   $identifier = $1;                                      $identifier = $1;
                               }                                  }
                               $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;                                  $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
                           } else {                              } else {
                               $display{$tempkeyp} = $parmdis;                                  $display{$tempkeyp} = $parmdis;
                           }                              }
                           unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                              unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                           $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                              $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                           $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp);                              $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp);
                           $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.type');                              $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.type');
                           $thistitle=&Apache::lonnet::metadata($uri,$tempkeyp.'.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});
                         $r->print('<tr><td style="background-color:'.$defbgone.';"'.                          $r->print('<tr><td style="background-color:'.$defbgone.';"'.
                              ' rowspan='.$totalparms.                               ' rowspan='.$totalparms.
Line 2868  ENDTABLEHEADFOUR Line 2950  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 2888  ENDTABLEHEADFOUR Line 2970  ENDTABLEHEADFOUR
   
 #                  $r->print("$mapid:$map:   $rid <br /> \n");  #                  $r->print("$mapid:$map:   $rid <br /> \n");
   
                      if ($map eq $mapid) {                      if ($map eq $mapid) {
                         my $uri=&Apache::lonnet::declutter($uris{$rid});                          my $uri=&Apache::lonnet::declutter($uris{$rid});
 #                    $r->print("Keys: $keyp{$rid} <br />\n");  #                    $r->print("Keys: $keyp{$rid} <br />\n");
   
Line 2923  ENDTABLEHEADFOUR Line 3005  ENDTABLEHEADFOUR
                                 $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');                                  $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                               }                                }
                         } # end loop through keys                          } # end loop through keys
                       }                      }
                 } # end loop through ids                  } # end loop through ids
   
 #---------------------------------------------------- print header information  #---------------------------------------------------- print header information
Line 3023  ENDTABLEHEADFOUR Line 3105  ENDTABLEHEADFOUR
                         $display{$tempkeyp} =~ s/_\w+_/_0_/;                          $display{$tempkeyp} =~ s/_\w+_/_0_/;
                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);                          $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');                          $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                       }                      }
                 } # end loop through keys                  } # end loop through keys
             } # end loop through ids              } # end loop through ids
   
Line 3070  ENDMAPONE Line 3152  ENDMAPONE
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 } # end sub assessparms  } # end sub assessparms
   
   
   
 ##################################################  ##################################################
 # Overview mode  # OVERVIEW MODE
 ##################################################  ##################################################
 my $tableopen;  my $tableopen;
   
Line 3094  sub tablestart { Line 3178  sub tablestart {
   
 sub tableend {  sub tableend {
     if ($tableopen) {      if ($tableopen) {
     $tableopen=0;          $tableopen=0;
     return &Apache::loncommon::end_data_table();          return &Apache::loncommon::end_data_table();
     } else {      } else {
     return'';          return'';
     }      }
 }  }
   
Line 3142  sub storedata { Line 3226  sub storedata {
     undef @deldata;      undef @deldata;
     my ($got_chostname,$chostname,$cmajor,$cminor);      my ($got_chostname,$chostname,$cmajor,$cminor);
     my $now = time;      my $now = time;
     foreach my $key (keys(%env)) {       foreach my $key (keys(%env)) {
     if ($key =~ /^form\.([a-z]+)\_(.+)$/) {          if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
         my $cmd=$1;              my $cmd=$1;
         my $thiskey=$2;              my $thiskey=$2;
         next if ($cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');              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, $valmatch);              my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);
         if ($cmd eq 'set') {              if ($cmd eq 'set') {
             $data=$env{$key};                  $data=$env{$key};
             $valmatch = '';                  $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');
             if ($typeof eq 'string_questiontype') {                  if ($typeof eq 'string_questiontype') {
                 $name = 'type';                      $name = 'type';
             } elsif ($typeof eq 'string_lenient') {                  } elsif ($typeof eq 'string_lenient') {
                 $name = 'lenient';                      $name = 'lenient';
                 my $stringmatch = &standard_string_matches($typeof);                      my $stringmatch = &standard_string_matches($typeof);
                 if (ref($stringmatch) eq 'ARRAY') {                      if (ref($stringmatch) eq 'ARRAY') {
                     foreach my $item (@{$stringmatch}) {                          foreach my $item (@{$stringmatch}) {
                         if (ref($item) eq 'ARRAY') {                              if (ref($item) eq 'ARRAY') {
                             my ($regexpname,$pattern) = @{$item};                                  my ($regexpname,$pattern) = @{$item};
                             if ($pattern ne '') {                                  if ($pattern ne '') {
                                 if ($data =~ /$pattern/) {                                      if ($data =~ /$pattern/) {
                                     $valmatch = $regexpname;                                          $valmatch = $regexpname;
                                     $valchk = '';                                          $valchk = '';
                                     last;                                          last;
                                       }
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                   } elsif ($typeof eq 'string_discussvote') {
                       $name = 'discussvote';
                   } elsif ($typeof eq 'string_examcode') {
                       $name = 'examcode';
                       if (&Apache::lonnet::validCODE($data)) {
                           $valchk = 'valid';
                       }
                   } elsif ($typeof eq 'string_yesno') {
                       if ($thiskey =~ /\.retrypartial$/) {
                           $name = 'retrypartial';
                       }
                 }                  }
             } elsif ($typeof eq 'string_discussvote') {              } elsif ($cmd eq 'datepointer') {
                 $name = 'discussvote';                  $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
             } elsif ($typeof eq 'string_examcode') {                  $typeof=$env{'form.typeof_'.$thiskey};
                 $name = 'examcode';                  $text = &mt('Saved modified date for');
                 if (&Apache::lonnet::validCODE($data)) {                  if ($typeof eq 'date_start') {
                     $valchk = 'valid';                      if ($thiskey =~ /\.printstartdate$/) {
                 }                          $name = 'printstartdate';
             } elsif ($typeof eq 'string_yesno') {                          if (($data) && ($data > $now)) {
                 if ($thiskey =~ /\.retrypartial$/) {                              $valchk = 'future';
                     $name = 'retrypartial';                          }
                 }                      }
             }                  } elsif ($typeof eq 'date_end') {
         } elsif ($cmd eq 'datepointer') {                      if ($thiskey =~ /\.printenddate$/) {
             $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});                          $name = 'printenddate';
             $typeof=$env{'form.typeof_'.$thiskey};                          if (($data) && ($data < $now)) {
             $text = &mt('Saved modified date for');                              $valchk = 'past';
             if ($typeof eq 'date_start') {                          }
                 if ($thiskey =~ /\.printstartdate$/) {  
                     $name = 'printstartdate';  
                     if (($data) && ($data > $now)) {  
                         $valchk = 'future';  
                     }  
                 }  
             } elsif ($typeof eq 'date_end') {  
                 if ($thiskey =~ /\.printenddate$/) {  
                     $name = 'printenddate';  
                     if (($data) && ($data < $now)) {  
                         $valchk = 'past';  
                     }                      }
                 }                  }
             }              } 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$/) {
             if ($thiskey =~ /\.interval$/) {                      $name = 'interval';
                 $name = 'interval';                      my $intervaltype = &get_intervaltype($name);
                 my $intervaltype = &get_intervaltype($name);                      my $intervalmatch = &standard_interval_matches($intervaltype);
                 my $intervalmatch = &standard_interval_matches($intervaltype);                      if (ref($intervalmatch) eq 'ARRAY') {
                 if (ref($intervalmatch) eq 'ARRAY') {                          foreach my $item (@{$intervalmatch}) {
                     foreach my $item (@{$intervalmatch}) {                              if (ref($item) eq 'ARRAY') {
                         if (ref($item) eq 'ARRAY') {                                  my ($regexpname,$pattern) = @{$item};
                             my ($regexpname,$pattern) = @{$item};                                  if ($pattern ne '') {
                             if ($pattern ne '') {                                      if ($data =~ /$pattern/) {
                                 if ($data =~ /$pattern/) {                                          $valmatch = $regexpname;
                                     $valmatch = $regexpname;                                          $valchk = '';
                                     $valchk = '';                                          last;
                                     last;                                      }
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                 }                  }
                   $typeof=$env{'form.typeof_'.$thiskey};
                   $text = &mt('Saved modified date for');
             }              }
             $typeof=$env{'form.typeof_'.$thiskey};              if ($thiskey =~ m{\.(?:sequence|page)___\(rec\)}) {
             $text = &mt('Saved modified date for');                  $namematch = 'maplevelrecurse';
         }              }
         if ($name ne '') {              if (($name ne '') || ($namematch ne '')) {
             my ($needsrelease,$needsnewer);                  my ($needsrelease,$needsnewer);
             $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk:$valmatch"};                  if ($name ne '') {
             if ($needsrelease) {                      $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk:$valmatch:"};
                 unless ($got_chostname) {                      if ($needsrelease) {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                          unless ($got_chostname) {
                     $got_chostname = 1;                              ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                               $got_chostname = 1;
                           }
                           $needsnewer = &parameter_releasecheck($name,$valchk,$valmatch,undef,
                                                               $needsrelease,
                                                               $cmajor,$cminor);
                       }
                   }
                   if ($namematch ne '') {
                       if ($needsnewer) {
                           undef($namematch);
                       } else {
                           my $currneeded;
                           if ($needsrelease) {
                               $currneeded = $needsrelease;
                           }
                           $needsrelease =
                               $Apache::lonnet::needsrelease{"parameter::::$namematch"};
                           if (($needsrelease) && (($currneeded eq '') || ($needsrelease < $currneeded))) {
                               unless ($got_chostname) {
                                   ($chostname,$cmajor,$cminor) = &parameter_release_vars();
                                   $got_chostname = 1;
                               }
                               $needsnewer = &parameter_releasecheck(undef,$valchk,$valmatch,$namematch,
                                                                   $needsrelease,$cmajor,$cminor);
                           } else {
                               undef($namematch);
                           }
                       }
                 }                  }
                 $needsnewer = &parameter_releasecheck($name,$valchk,$valmatch,  
                                                       $needsrelease,  
                                                       $cmajor,$cminor);  
                 if ($needsnewer) {                  if ($needsnewer) {
                     $r->print('<br />'.&oldversion_warning($name,$data,                      $r->print('<br />'.&oldversion_warning($name,$namematch,$data,
                                                            $chostname,$cmajor,                                                          $chostname,$cmajor,
                                                            $cminor,$needsrelease));                                                          $cminor,$needsrelease));
                     next;                      next;
                 }                  }
             }              }
         }              if (defined($data) and $$olddata{$thiskey} ne $data) {
         if (defined($data) and $$olddata{$thiskey} ne $data) {                  if ($tuname) {
             if ($tuname) {                      if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
             if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,                                          $tkey.'.type' => $typeof},
                                  $tkey.'.type' => $typeof},                                  $tudom,$tuname) eq 'ok') {
                          $tudom,$tuname) eq 'ok') {                          &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
                 &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);                          $r->print('<br />'.$text.' '.
                 $r->print('<br />'.$text.' '.                              &Apache::loncommon::plainname($tuname,$tudom));
                       &Apache::loncommon::plainname($tuname,$tudom));                      } else {
             } else {                          $r->print('<div class="LC_error">'.
                 $r->print('<div class="LC_error">'.                              &mt('Error saving parameters').'</div>');
                       &mt('Error saving parameters').'</div>');                      }
                       &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   } else {
                       $newdata{$thiskey}=$data;
                       $newdata{$thiskey.'.type'}=$typeof;
                   }
             }              }
             &Apache::lonnet::devalidateuserresdata($tuname,$tudom);              } elsif ($cmd eq 'del') {
             } else {                  if ($tuname) {
             $newdata{$thiskey}=$data;                      if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
              $newdata{$thiskey.'.type'}=$typeof;                              &log_parmset({$tkey=>''},1,$tuname,$tudom);
                    }                          $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
         }                      } else {
         } elsif ($cmd eq 'del') {                          $r->print('<div class="LC_error">'.
         if ($tuname) {                              &mt('Error deleting parameters').'</div>');
             if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {                      }
                 &log_parmset({$tkey=>''},1,$tuname,$tudom);                      &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
             $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));                  } else {
             } else {                      push (@deldata,$thiskey,$thiskey.'.type');
             $r->print('<div class="LC_error">'.                  }
                   &mt('Error deleting parameters').'</div>');  
             }              }
             &Apache::lonnet::devalidateuserresdata($tuname,$tudom);  
         } else {  
             push (@deldata,$thiskey,$thiskey.'.type');  
         }  
         }          }
     }      }
     }  
 # 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') {
         my %loghash=map { $_ => '' } @deldata;              my %loghash=map { $_ => '' } @deldata;
         &log_parmset(\%loghash,1);              &log_parmset(\%loghash,1);
         $r->print('<h2>'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'</h2>');              $r->print('<h2>'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'</h2>');
     } else {          } else {
         $r->print('<div class="LC_error">'.              $r->print('<div class="LC_error">'.
               &mt('Error deleting parameters').'</div>');                  &mt('Error deleting parameters').'</div>');
     }          }
     &Apache::lonnet::devalidatecourseresdata($crs,$dom);          &Apache::lonnet::devalidatecourseresdata($crs,$dom);
     }      }
     if ($putentries) {      if ($putentries) {
     if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {          if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
                 &log_parmset(\%newdata,0);                      &log_parmset(\%newdata,0);
         $r->print('<h3>'.&mt('Saved [quant,_1,parameter]',$putentries/2).'</h3>');              $r->print('<h3>'.&mt('Saved [quant,_1,parameter]',$putentries/2).'</h3>');
     } else {          } else {
         $r->print('<div class="LC_error">'.              $r->print('<div class="LC_error">'.
               &mt('Error saving parameters').'</div>');                  &mt('Error saving parameters').'</div>');
     }          }
     &Apache::lonnet::devalidatecourseresdata($crs,$dom);          &Apache::lonnet::devalidatecourseresdata($crs,$dom);
     }      }
 }  }
   
Line 3327  sub parse_listdata_key { Line 3438  sub parse_listdata_key {
     ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);      ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
     # if course wide student would be undefined      # if course wide student would be undefined
     if (!defined($student)) {      if (!defined($student)) {
     ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);          ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
     }      }
     # strip off the .type if it's not the Question type parameter      # strip off the .type if it's not the Question type parameter
     if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {      if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
     $realm=~s/\.type//;          $realm=~s/\.type//;
     }      }
     # split into resource+part and parameter name      # split into resource+part and parameter name
     my ($res,    $parm) = ($realm=~/^(.*)\.(.*)$/);      my ($res,    $parm) = ($realm=~/^(.*)\.(.*)$/);
Line 3339  sub parse_listdata_key { Line 3450  sub parse_listdata_key {
     return ($student,$res,$part,$parm);      return ($student,$res,$part,$parm);
 }  }
   
   # Displays forms for the given data in overview mode (newoverview or overview).
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;      my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;
           
Line 3363  sub listdata { Line 3475  sub listdata {
     }      }
   
     foreach my $thiskey (sort {      foreach my $thiskey (sort {
     my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);          my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
     my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);          my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
   
     # get the numerical order for the param          # get the numerical order for the param
     $aparm=$keyorder{'parameter_0_'.$aparm};          $aparm=$keyorder{'parameter_0_'.$aparm};
     $bparm=$keyorder{'parameter_0_'.$bparm};          $bparm=$keyorder{'parameter_0_'.$bparm};
   
     my $result=0;          my $result=0;
   
     if ($sortorder eq 'realmstudent') {          if ($sortorder eq 'realmstudent') {
             if ($ares     ne $bres    ) {              if ($ares     ne $bres    ) {
         $result = ($ares     cmp $bres);                  $result = ($ares     cmp $bres);
             } elsif ($astudent ne $bstudent) {              } elsif ($astudent ne $bstudent) {
         $result = ($astudent cmp $bstudent);                  $result = ($astudent cmp $bstudent);
         } elsif ($apart    ne $bpart   ) {              } elsif ($apart    ne $bpart   ) {
         $result = ($apart    cmp $bpart);                  $result = ($apart    cmp $bpart);
         }              }
     } else {          } else {
         if      ($astudent ne $bstudent) {              if      ($astudent ne $bstudent) {
         $result = ($astudent cmp $bstudent);                  $result = ($astudent cmp $bstudent);
         } elsif ($ares     ne $bres    ) {              } elsif ($ares     ne $bres    ) {
         $result = ($ares     cmp $bres);                  $result = ($ares     cmp $bres);
         } elsif ($apart    ne $bpart   ) {              } elsif ($apart    ne $bpart   ) {
         $result = ($apart    cmp $bpart);                  $result = ($apart    cmp $bpart);
               }
         }          }
     }  
   
     if (!$result) {          if (!$result) {
             if (defined($aparm) && defined($bparm)) {              if (defined($aparm) && defined($bparm)) {
         $result = ($aparm <=> $bparm);                  $result = ($aparm <=> $bparm);
             } elsif (defined($aparm)) {              } elsif (defined($aparm)) {
         $result = -1;                  $result = -1;
             } elsif (defined($bparm)) {              } elsif (defined($bparm)) {
         $result = 1;                  $result = 1;
               }
         }          }
     }  
   
     $result;          $result;
     } keys(%{$listdata})) {          
       } keys(%{$listdata})) { # foreach my $thiskey
   
     my $readonly;          my $readonly;
     if ($$listdata{$thiskey.'.type'}) {          if ($$listdata{$thiskey.'.type'}) {
         my $thistype=$$listdata{$thiskey.'.type'};              my $thistype=$$listdata{$thiskey.'.type'};
         if ($$resourcedata{$thiskey.'.type'}) {              if ($$resourcedata{$thiskey.'.type'}) {
             $thistype=$$resourcedata{$thiskey.'.type'};                  $thistype=$$resourcedata{$thiskey.'.type'};
         }              }
         my ($middle,$part,$name)=              my ($middle,$part,$name)=
         ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);                  ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
         my $section=&mt('All Students');              my $section=&mt('All Students');
         if ($middle=~/^\[(.*)\]/) {              if ($middle=~/^\[(.*)\]/) {
             my $issection=$1;                  my $issection=$1;
             if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {                  if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
                 my ($stuname,$studom) = ($1,$2);                      my ($stuname,$studom) = ($1,$2);
                 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($stuname,$studom);
                 $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})) {                              $section=&mt('Group').': '.$issection;
                         $section=&mt('Group').': '.$issection;                          } elsif ($issection eq $env{'request.course.sec'}) {
                     } elsif ($issection eq $env{'request.course.sec'}) {                              $section = &mt('Section').': '.$issection;
                         $section = &mt('Section').': '.$issection;                          } else {
                               next; 
                           }
                     } else {                      } else {
                         next;                           $section=&mt('Group/Section').': '.$issection;
                     }                      }
                 } else {                  }
                     $section=&mt('Group/Section').': '.$issection;                  $middle=~s/^\[(.*)\]//;
               } elsif (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
                   $readonly = 1;
               }
               $middle=~s/\.+$//;
               $middle=~s/^\.+//;
               my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
               if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {
                   my $mapurl = $1;
                   my $maplevel = $2;
                   my $leveltitle = &mt('Folder/Map');
                   if ($maplevel eq 'rec') {
                       $leveltitle = &mt('Recursive');
                   }
                   $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';
               } elsif ($middle) {
                   my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').
                       ': '.&Apache::lonnet::gettitle($middle).
                       ' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.
                       $id.')</span></span>';
               }
               if ($sortorder eq 'realmstudent') {
                   if ($realm ne $oldrealm) {
                       $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                       $oldrealm=$realm;
                       $oldsection='';
                   }
                   if ($section ne $oldsection) {
                       $r->print(&tableend()."\n<h2>$section</h2>");
                       $oldsection=$section;
                       $oldpart='';
                   }
               } else {
                   if ($section ne $oldsection) {
                       $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                       $oldsection=$section;
                       $oldrealm='';
                   }
                   if ($realm ne $oldrealm) {
                       $r->print(&tableend()."\n<h2>$realm</h2>");
                       $oldrealm=$realm;
                       $oldpart='';
                 }                  }
             }              }
             $middle=~s/^\[(.*)\]//;              if ($part ne $oldpart) {
         } elsif (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {                  $r->print(&tableend().
             $readonly = 1;                      "\n".'<span class="LC_parm_part">'.&mt('Part').": $part</span>");
         }                  $oldpart=$part;
         $middle=~s/\.+$//;  
         $middle=~s/^\.+//;  
         my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';  
         if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {  
             my $mapurl = $1;  
             my $maplevel = $2;  
             my $leveltitle = &mt('Folder/Map');  
             if ($maplevel eq 'rec') {  
                 $leveltitle = &mt('Recursive');  
             }              }
             $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';      #
         } elsif ($middle) {      # Ready to print
         my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);      #
         $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';  
         }  
         if ($sortorder eq 'realmstudent') {  
         if ($realm ne $oldrealm) {  
             $r->print(&tableend()."\n<hr /><h1>$realm</h1>");  
             $oldrealm=$realm;  
             $oldsection='';  
         }  
         if ($section ne $oldsection) {  
             $r->print(&tableend()."\n<h2>$section</h2>");  
             $oldsection=$section;  
             $oldpart='';  
         }  
         } else {  
         if ($section ne $oldsection) {  
             $r->print(&tableend()."\n<hr /><h1>$section</h1>");  
             $oldsection=$section;  
             $oldrealm='';  
         }  
         if ($realm ne $oldrealm) {  
             $r->print(&tableend()."\n<h2>$realm</h2>");  
             $oldrealm=$realm;  
             $oldpart='';  
         }  
         }  
         if ($part ne $oldpart) {  
         $r->print(&tableend().  
               "\n".'<span class="LC_parm_part">'.&mt('Part').": $part</span>");  
         $oldpart=$part;  
         }  
 #  
 # Ready to print  
 #  
             my $parmitem = &standard_parameter_names($name);              my $parmitem = &standard_parameter_names($name);
         $r->print(&tablestart($readonly).              $r->print(&tablestart($readonly).
               &Apache::loncommon::start_data_table_row().                  &Apache::loncommon::start_data_table_row().
               '<td><b>'.&mt($parmitem).                  '<td><b>'.&mt($parmitem).
               '</b></td>');                  '</b></td>');
         unless ($readonly) {              unless ($readonly) {
             $r->print('<td><input type="checkbox" name="del_'.                  $r->print('<td><input type="checkbox" name="del_'.
                       $thiskey.'" /></td>');                          $thiskey.'" /></td>');
         }              }
         $r->print('<td>');              $r->print('<td>');
         $foundkeys++;              $foundkeys++;
         if (&isdateparm($thistype)) {              if (&isdateparm($thistype)) {
             my $jskey='key_'.$pointer;                  my $jskey='key_'.$pointer;
             my $state;                  my $state;
             $pointer++;                  $pointer++;
             if ($readonly) {                  if ($readonly) {
                 $state = 'disabled';                      $state = 'disabled';
             }                  }
             $r->print(  
                 &Apache::lonhtmlcommon::date_setter('parmform',  
                                                     $jskey,  
                                                     $$resourcedata{$thiskey},  
                                                     '',1,$state));  
             unless  ($readonly) {  
                 $r->print(                  $r->print(
 '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.                      &Apache::lonhtmlcommon::date_setter('parmform',
 (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.                                                          $jskey,
 &mt('Shift all dates based on this date').'</a></span>':'').                                                          $$resourcedata{$thiskey},
 &date_sanity_info($$resourcedata{$thiskey})                                                          '',1,$state));
                 );                  unless  ($readonly) {
                       $r->print(
       '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
       (($$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>':'').
       &date_sanity_info($$resourcedata{$thiskey})
                       );
                   }
               } elsif ($thistype eq 'date_interval') {
                   $r->print(&date_interval_selector($thiskey,$name,
                           $$resourcedata{$thiskey},$readonly));
               } elsif ($thistype =~ m/^string/) {
                   $r->print(&string_selector($thistype,$thiskey,
                           $$resourcedata{$thiskey},$name,$readonly));
               } else {
                   $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly));
             }              }
         } elsif ($thistype eq 'date_interval') {              unless ($readonly) {
             $r->print(&date_interval_selector($thiskey,$name,                  $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                       $$resourcedata{$thiskey},$readonly));                          $thistype.'" />');
         } elsif ($thistype =~ m/^string/) {              }
             $r->print(&string_selector($thistype,$thiskey,              $r->print('</td>'.&Apache::loncommon::end_data_table_row());
                       $$resourcedata{$thiskey},$name,$readonly));  
         } else {  
             $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly));  
         }  
         unless ($readonly) {  
             $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.  
                       $thistype.'" />');  
         }          }
         $r->print('</td>'.&Apache::loncommon::end_data_table_row());  
     }  
     }      }
     return $foundkeys;      return $foundkeys;
 }  }
Line 3544  sub get_date_interval_from_form { Line 3660  sub get_date_interval_from_form {
                ['hours', 3600],                 ['hours', 3600],
                ['minutes', 60],                 ['minutes', 60],
                ['seconds',  1]) {                 ['seconds',  1]) {
     my ($name, $factor) = @{ $which };          my ($name, $factor) = @{ $which };
     if (defined($env{'form.'.$name.'_'.$key})) {          if (defined($env{'form.'.$name.'_'.$key})) {
         $seconds += $env{'form.'.$name.'_'.$key} * $factor;              $seconds += $env{'form.'.$name.'_'.$key} * $factor;
     }          }
     }      }
     if (($key =~ /\.interval$/) && ($env{'form.done_'.$key} eq '_done')) {      if (($key =~ /\.interval$/) &&
         $seconds .= $env{'form.done_'.$key};              (($env{'form.done_'.$key} eq '_done') || ($env{'form.done_'.$key} eq '_done_proctor'))) {
           if ($env{'form.done_'.$key.'_buttontext'}) {
               $env{'form.done_'.$key.'_buttontext'} =~ s/\://g;
               $seconds .= '_done:'.$env{'form.done_'.$key.'_buttontext'}.':';
               if ($env{'form.done_'.$key} eq '_done_proctor') {
                   $seconds .= '_proctor';
               }
           } else {
               $seconds .= $env{'form.done_'.$key}; 
           }
           if (($env{'form.done_'.$key} eq '_done_proctor') && 
                   ($env{'form.done_'.$key.'_proctorkey'})) {
               $seconds .= '_'.$env{'form.done_'.$key.'_proctorkey'};
           }
     }      }
     return $seconds;      return $seconds;
 }  }
Line 3625  sub string_ip_selector { Line 3754  sub string_ip_selector {
     return $output;      return $output;
 }  }
   
 {  
   { # block using some constants related to parameter types (overview mode)
   
 my %strings =  my %strings =
     (      (
      'string_yesno'       'string_yesno'
              => [[ 'yes', 'Yes' ],               => [[ 'yes', 'Yes' ],
          [ 'no', 'No' ]],                   [ 'no', 'No' ]],
      'string_problemstatus'       'string_problemstatus'
              => [[ 'yes', 'Yes' ],               => [[ 'yes', 'Yes' ],
          [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],           [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
Line 3709  sub string_selector { Line 3840  sub string_selector {
   
     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') ||              ($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');
Line 3735  sub string_selector { Line 3866  sub string_selector {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                      ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                     $got_chostname = 1;                      $got_chostname = 1;
                 }                  }
                 my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,                  my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,undef,
                                                        $needsrelease,$cmajor,$cminor);                                                         $needsrelease,$cmajor,$cminor);
                 if ($needsnewer) {                  if ($needsnewer) {
                     if ($parmmatch ne '') {                      if ($parmmatch ne '') {
Line 3851  my %intervals = Line 3982  my %intervals =
     (      (
      'date_interval'       'date_interval'
              => [[ 'done', 'Yes' ],               => [[ 'done', 'Yes' ],
                    [ 'done_proctor', 'Yes, with proctor key'],                  
                  [ '', 'No' ]],                   [ '', 'No' ]],
     );      );
   
 my %intervalmatches = (  my %intervalmatches = (
          'date_interval'           'date_interval'
               => [['done','\d+_done$'],],                => [['done','\d+_done(|\:[^\:]+\:)$'],
                     ['done_proctor','\d+_done(|\:[^\:]+\:)_proctor_']],
     );      );
   
 my %intervaltypes = (  my %intervaltypes = (
Line 3914  sub date_interval_selector { Line 4047  sub date_interval_selector {
                     ($chostname,$cmajor,$cminor)=&parameter_release_vars();                      ($chostname,$cmajor,$cminor)=&parameter_release_vars();
                     $got_chostname = 1;                      $got_chostname = 1;
                 }                  }
                 my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,                  my $needsnewer=&parameter_releasecheck($name,$parmval,$parmmatch,undef,
                                                        $needsrelease,$cmajor,$cminor);                                                         $needsrelease,$cmajor,$cminor);
                 if ($needsnewer) {                  if ($needsnewer) {
                     if ($parmmatch ne '') {                      if ($parmmatch ne '') {
Line 3932  sub date_interval_selector { Line 4065  sub date_interval_selector {
                ['hours', 3600, 23],                 ['hours', 3600, 23],
                ['minutes', 60, 59],                 ['minutes', 60, 59],
                ['seconds',  1, 59]) {                 ['seconds',  1, 59]) {
     my ($name, $factor, $max) = @{ $which };          my ($name, $factor, $max) = @{ $which };
     my $amount = int($showval/$factor);          my $amount = int($showval/$factor);
     $showval  %= $factor;          $showval  %= $factor;
     my %select = ((map {$_ => $_} (0..$max)),          my %select = ((map {$_ => $_} (0..$max)),
               'select_form_order' => [0..$max]);                  'select_form_order' => [0..$max]);
     $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,          $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                            \%select,'',$readonly);                              \%select,'',$readonly);
     $result .= ' '.&mt($name);          $result .= ' '.&mt($name);
     }      }
     if ($name eq 'interval') {      if ($name eq 'interval') {
         unless ($skipval{'done'}) {          unless ($skipval{'done'}) {
             my $checkedon = '';              my $checkedon = '';
               my $checkedproc = '';
               my $currproctorkey = '';
               my $currprocdisplay = 'hidden';
               my $currdonetext = &mt('Done');
             my $checkedoff = ' checked="checked"';              my $checkedoff = ' checked="checked"';
             if ($currval =~ /^(\d+)_done$/) {              if ($currval =~ /^(?:\d+)_done$/) {
                   $checkedon = ' checked="checked"';
                   $checkedoff = '';
               } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {
                   $currdonetext = $1;
                 $checkedon = ' checked="checked"';                  $checkedon = ' checked="checked"';
                 $checkedoff = '';                  $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';
             }              }
             $result .= '<span class="LC_nobreak">'.('&nbsp;' x 3).'('.&mt('Include "done" button').              my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
                        '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.' />'.              $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').
                        &mt('Yes').'</label>'.                         '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.' />'.
                        '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.' />'.                         &mt('No').'</label>'.('&nbsp;'x2).
                        &mt('No').'</label>)</span>';                         '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.' />'.
                          &mt('Yes').'</label>'.('&nbsp;'x2).
                          '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.' />'.
                          &mt('Yes, with proctor key').'</label>'.
                          '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
                          'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'" /></span><br />'.
                          '<span class="LC_nobreak">'.&mt('Button text').': '.
                          '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'" /></span>';
         }          }
     }      }
     unless ($readonly) {      unless ($readonly) {
Line 3963  sub date_interval_selector { Line 4122  sub date_interval_selector {
 }  }
   
 sub oldversion_warning {  sub oldversion_warning {
     my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;      my ($name,$namematch,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
       my $standard_name = &standard_parameter_names($name);
       if ($namematch) {
           my $level = &standard_parameter_levels($namematch);
           my $msg = '';
           if ($level) {
               $msg = &mt('[_1] was [_2]not[_3] set at the level of: [_4].',
                          $standard_name,'<b>','</b>','"'.$level.'"');
           } else {
               $msg = &mt('[_1] was [_2]not[_3] set.',
                         $standard_name,'<b>','</b>');
           }
           return '<p class="LC_warning">'.$msg.'<br />'.
                  &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
                      $cmajor.'.'.$cminor,$chostname,
                      $needsrelease).
                      '</p>';
       }
     my $desc;      my $desc;
     my $stringtype = &get_stringtype($name);      my $stringtype = &get_stringtype($name);
     if ($stringtype ne '') {      if ($stringtype ne '') {
Line 4008  sub oldversion_warning { Line 4184  sub oldversion_warning {
             }              }
         }          }
     }      }
     my $standard_name = &standard_parameter_names($name);  
     return '<p class="LC_warning">'.      return '<p class="LC_warning">'.
            &mt('[_1] was [_2]not[_3] set to [_4].',         &mt('[_1] was [_2]not[_3] set to [_4].',
                $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.             $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.
            &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',         &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
            $cmajor.'.'.$cminor,$chostname,         $cmajor.'.'.$cminor,$chostname,
            $needsrelease).         $needsrelease).
            '</p>';         '</p>';
 }  }
   
 }  } # end of block using some constants related to parameter types
   
   
 #  #
 # Shift all start and end dates by $shift  # Shift all start and end dates by $shift
Line 4076  sub newoverview { Line 4252  sub newoverview {
             &toggleparmtextbox_js()."\n".              &toggleparmtextbox_js()."\n".
             &validateparms_js()."\n".              &validateparms_js()."\n".
             &ipacc_boxes_js()."\n".              &ipacc_boxes_js()."\n".
               &done_proctor_js()."\n".
 '// ]]>  '// ]]>
 </script>  </script>
 ';  ';
Line 4265  sub secgroup_lister { Line 4442  sub secgroup_lister {
     }      }
 }  }
   
   # Display all existing parameter settings.
 sub overview {  sub overview {
     my ($r) = @_;      my ($r) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
Line 4275  sub overview { Line 4453  sub overview {
              &toggleparmtextbox_js()."\n".               &toggleparmtextbox_js()."\n".
              &validateparms_js()."\n".               &validateparms_js()."\n".
              &ipacc_boxes_js()."\n".               &ipacc_boxes_js()."\n".
                &done_proctor_js()."\n".
              '// ]]>'."\n".               '// ]]>'."\n".
              '</script>'."\n";               '</script>'."\n";
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
Line 4310  sub overview { Line 4489  sub overview {
           &Apache::loncommon::end_page());            &Apache::loncommon::end_page());
 }  }
   
   # Unused sub.
 sub clean_parameters {  sub clean_parameters {
     my ($r) = @_;      my ($r) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
Line 4345  ENDOVER Line 4525  ENDOVER
           '<th>'.&mt('Parameter').'</th>'.            '<th>'.&mt('Parameter').'</th>'.
           '</tr>');            '</tr>');
     foreach my $thiskey (sort(keys(%{$resourcedata}))) {      foreach my $thiskey (sort(keys(%{$resourcedata}))) {
     next if (!exists($resourcedata->{$thiskey.'.type'})          next if (!exists($resourcedata->{$thiskey.'.type'})
          && $thiskey=~/\.type$/);              && $thiskey=~/\.type$/);
     my %data = &parse_key($thiskey);          my %data = &parse_key($thiskey);
     if (1) { #exists($data{'realm_exists'})          if (1) { #exists($data{'realm_exists'})
         #&& !$data{'realm_exists'}) {              #&& !$data{'realm_exists'}) {
         $r->print(&Apache::loncommon::start_data_table_row().              $r->print(&Apache::loncommon::start_data_table_row().
               '<tr>'.                  '<tr>'.
               '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'              );                  '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'              );
   
         $r->print('<td>');              $r->print('<td>');
         my $display_value = $resourcedata->{$thiskey};              my $display_value = $resourcedata->{$thiskey};
         if (&isdateparm($resourcedata->{$thiskey.'.type'})) {              if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
         $display_value =              $display_value =
             &Apache::lonlocal::locallocaltime($display_value);                  &Apache::lonlocal::locallocaltime($display_value);
         }              }
             my $parmitem = &standard_parameter_names($data{'parameter_name'});              my $parmitem = &standard_parameter_names($data{'parameter_name'});
             $parmitem = &mt($parmitem);              $parmitem = &mt($parmitem);
         $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',              $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
               $parmitem,$resourcedata->{$thiskey}));                  $parmitem,$resourcedata->{$thiskey}));
         $r->print('<br />');              $r->print('<br />');
         if ($data{'scope_type'} eq 'all') {              if ($data{'scope_type'} eq 'all') {
         $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 'section') {              } elsif ($data{'scope_type'} eq 'section') {
         $r->print(&mt('Section: [_1]',$data{'scope'}));                  $r->print(&mt('Section: [_1]',$data{'scope'}));
         } elsif ($data{'scope_type'} eq 'group') {              } elsif ($data{'scope_type'} eq 'group') {
         $r->print(&mt('Group: [_1]',$data{'scope'}));                  $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') {
         $r->print(&mt('All Resources'));                  $r->print(&mt('All Resources'));
         } elsif ($data{'realm_type'} eq 'folder') {              } elsif ($data{'realm_type'} eq 'folder') {
         $r->print(&mt('Folder: [_1]'),$data{'realm'});                  $r->print(&mt('Folder: [_1]'),$data{'realm'});
         } elsif ($data{'realm_type'} eq 'symb') {              } elsif ($data{'realm_type'} eq 'symb') {
         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>');
   
     }          }
     }      }
     $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').'" />'.
Line 4398  ENDOVER Line 4578  ENDOVER
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   # Overview mode, UI to shift all dates.
 sub date_shift_one {  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'};
Line 4426  sub date_shift_one { Line 4607  sub date_shift_one {
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   # Overview mode, UI to shift all dates (second form).
 sub date_shift_two {  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'};
Line 4460  sub parse_key { Line 4642  sub parse_key {
     ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);      ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
     $data{'scope_type'} = 'all';      $data{'scope_type'} = 'all';
     if ($middle=~/^\[(.*)\]/) {      if ($middle=~/^\[(.*)\]/) {
            $data{'scope'} = $1;          $data{'scope'} = $1;
     if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {          if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
         $data{'scope_type'} = 'user';              $data{'scope_type'} = 'user';
         $data{'scope'} = [$1,$2];              $data{'scope'} = [$1,$2];
     } else {          } else {
         #FIXME check for group scope              #FIXME check for group scope
         $data{'scope_type'} = 'section';              $data{'scope_type'} = 'section';
     }          }
     $middle=~s/^\[(.*)\]//;          $middle=~s/^\[(.*)\]//;
     }      }
     $middle=~s/\.+$//;      $middle=~s/\.+$//;
     $middle=~s/^\.+//;      $middle=~s/^\.+//;
     $data{'realm_type'}='all';      $data{'realm_type'}='all';
     if ($middle=~/^(.+)\_\_\_\(all\)$/) {      if ($middle=~/^(.+)\_\_\_\(all\)$/) {
     $data{'realm'} = $1;          $data{'realm'} = $1;
     $data{'realm_type'} = 'folder';          $data{'realm_type'} = 'folder';
     $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});          $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
     ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});          ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
     } elsif ($middle) {      } elsif ($middle) {
     $data{'realm'} = $middle;          $data{'realm'} = $middle;
     $data{'realm_type'} = 'symb';          $data{'realm_type'} = 'symb';
     $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});          $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
     my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});          my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
     $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);          $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
     }      }
   
     $data{'parameter_part'} = $part;      $data{'parameter_part'} = $part;
Line 4499  sub header { Line 4681  sub header {
   
   
   
   ##################################################
   # MAIN MENU
   ##################################################
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$parm_permission)=@_;      my ($r,$parm_permission)=@_;
     #      #
Line 4598  ENDMAINFORMHEAD Line 4784  ENDMAINFORMHEAD
   
   
   
   ##################################################
   # PORTFOLIO METADATA
   ##################################################
   
 sub output_row {  sub output_row {
     my ($r, $field_name, $field_text, $added_flag) = @_;      my ($r, $field_name, $field_text, $added_flag) = @_;
     my $output;      my $output;
Line 4619  sub output_row { Line 4809  sub output_row {
         $output .= '<td><strong>'.$field_text.':</strong></td>';          $output .= '<td><strong>'.$field_text.':</strong></td>';
         $output .= &Apache::loncommon::end_data_table_row();          $output .= &Apache::loncommon::end_data_table_row();
         foreach my $opt (@options) {          foreach my $opt (@options) {
         my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;              my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
         $output .= &Apache::loncommon::continue_data_table_row();              $output .= &Apache::loncommon::continue_data_table_row();
         $output .= '<td>'.('&nbsp;' x 5).'<label>              $output .= '<td>'.('&nbsp;' x 5).'<label>
                    <input type="checkbox" name="'.                      <input type="checkbox" name="'.
                    $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.                      $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                    &mt($opt->[1]).'</label></td>';                      &mt($opt->[1]).'</label></td>';
         $output .= &Apache::loncommon::end_data_table_row();              $output .= &Apache::loncommon::end_data_table_row();
     }          }
         $output .= &Apache::loncommon::continue_data_table_row();          $output .= &Apache::loncommon::continue_data_table_row();
         $output .= '<td>'.('&nbsp;' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';          $output .= '<td>'.('&nbsp;' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';
         $output .= &Apache::loncommon::end_data_table_row();          $output .= &Apache::loncommon::end_data_table_row();
Line 4639  sub output_row { Line 4829  sub output_row {
             $multiple_checked = ' checked="checked"';              $multiple_checked = ' checked="checked"';
             $single_checked = '';              $single_checked = '';
         }          }
     $output .= &Apache::loncommon::continue_data_table_row();          $output .= &Apache::loncommon::continue_data_table_row();
     $output .= '<td>'.('&nbsp;' x 10).'          $output .= '<td>'.('&nbsp;' x 10).'
                 <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />                      <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
                 '.&mt('Student may select multiple choices from list').'</td>';                      '.&mt('Student may select multiple choices from list').'</td>';
     $output .= &Apache::loncommon::end_data_table_row();          $output .= &Apache::loncommon::end_data_table_row();
     $output .= &Apache::loncommon::continue_data_table_row();          $output .= &Apache::loncommon::continue_data_table_row();
     $output .= '<td>'.('&nbsp;' x 10).'          $output .= '<td>'.('&nbsp;' x 10).'
                 <input type="radio" name="'.$field_name.'_onlyone"  value="single"'.$single_checked.' />                      <input type="radio" name="'.$field_name.'_onlyone"  value="single"'.$single_checked.' />
                 '.&mt('Student may select only one choice from list').'</td>';                      '.&mt('Student may select only one choice from list').'</td>';
     $output .= &Apache::loncommon::end_data_table_row();          $output .= &Apache::loncommon::end_data_table_row();
     }      }
     return ($output);      return ($output);
 }  }
   
   
   # UI to order portfolio metadata fields.
 sub order_meta_fields {  sub order_meta_fields {
     my ($r)=@_;      my ($r)=@_;
     my $idx = 1;      my $idx = 1;
Line 4662  sub order_meta_fields { Line 4852  sub order_meta_fields {
     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'};;
     $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"});
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb(
             ({href=>"/adm/parmset?action=setrestrictmeta",          {href=>"/adm/parmset?action=setrestrictmeta",
               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);      &startSettingsScreen($r,'parmset',$crstype);
     if ($env{'form.storeorder'}) {      if ($env{'form.storeorder'}) {
Line 4679  sub order_meta_fields { Line 4870  sub order_meta_fields {
         if ($newpos > $currentpos) {          if ($newpos > $currentpos) {
         # moving stuff up          # moving stuff up
             for ($i=0;$i<$currentpos;$i++) {              for ($i=0;$i<$currentpos;$i++) {
             $neworder[$i]=$oldorder[$i];                  $neworder[$i]=$oldorder[$i];
             }              }
             for ($i=$currentpos;$i<$newpos;$i++) {              for ($i=$currentpos;$i<$newpos;$i++) {
             $neworder[$i]=$oldorder[$i+1];                  $neworder[$i]=$oldorder[$i+1];
             }              }
             $neworder[$newpos]=$oldorder[$currentpos];              $neworder[$newpos]=$oldorder[$currentpos];
             for ($i=$newpos+1;$i<=$#oldorder;$i++) {              for ($i=$newpos+1;$i<=$#oldorder;$i++) {
             $neworder[$i]=$oldorder[$i];                  $neworder[$i]=$oldorder[$i];
             }              }
         } else {          } else {
         # moving stuff down          # moving stuff down
Line 4701  sub order_meta_fields { Line 4892  sub order_meta_fields {
                 $neworder[$i]=$oldorder[$i];                  $neworder[$i]=$oldorder[$i];
             }              }
         }          }
     my $ordered_fields = join ",", @neworder;          my $ordered_fields = join ",", @neworder;
         my $put_result = &Apache::lonnet::put('environment',          my $put_result = &Apache::lonnet::put('environment',
                            {'metadata.addedorder'=>$ordered_fields},$dom,$crs);                          {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});          &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_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;
Line 4807  sub addmetafield { Line 4998  sub addmetafield {
   
   
   
   # Display or save portfolio metadata.
 sub setrestrictmeta {  sub setrestrictmeta {
     my ($r)=@_;      my ($r)=@_;
     my $next_meta;      my $next_meta;
Line 4847  sub setrestrictmeta { Line 5039  sub setrestrictmeta {
                         $options.='deleted,';                          $options.='deleted,';
                     }                      }
                     my $name = $save_field;                      my $name = $save_field;
                      $put_result = &Apache::lonnet::put('environment',                      $put_result = &Apache::lonnet::put('environment',
                                                   {'metadata.'.$meta_field.'.options'=>$options,                          {'metadata.'.$meta_field.'.options'=>$options,
                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},                          'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
                                                    },$dom,$crs);                          },$dom,$crs);
                 }                  }
             }              }
         }          }
Line 4866  sub setrestrictmeta { Line 5058  sub setrestrictmeta {
     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;              $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="Save" />          <input type="submit" name="restrictmeta" value="Save" />
Line 4897  ENDenv Line 5089  ENDenv
 }  }
   
   
   
 sub get_added_meta_fieldnames {  sub get_added_meta_fieldnames {
     my ($cid) = @_;      my ($cid) = @_;
     my %fields;      my %fields;
Line 4912  sub get_added_meta_fieldnames { Line 5103  sub get_added_meta_fieldnames {
 }  }
   
   
   
 sub get_deleted_meta_fieldnames {  sub get_deleted_meta_fieldnames {
     my ($cid) = @_;      my ($cid) = @_;
     my %fields;      my %fields;
Line 4927  sub get_deleted_meta_fieldnames { Line 5117  sub get_deleted_meta_fieldnames {
     }      }
     return \%fields;      return \%fields;
 }  }
   
   
   ##################################################
   # PARAMETER SETTINGS DEFAULT ACTIONS
   ##################################################
   
   # UI to change parameter setting default actions
 sub defaultsetter {  sub defaultsetter {
     my ($r) = @_;      my ($r) = @_;
   
Line 4959  sub defaultsetter { Line 5156  sub defaultsetter {
                 \%mapp, \%symbp,\%maptitles,\%uris,                  \%mapp, \%symbp,\%maptitles,\%uris,
                 \%keyorder,\%defkeytype);                  \%keyorder,\%defkeytype);
     if ($env{'form.storerules'}) {      if ($env{'form.storerules'}) {
     my %newrules=();          my %newrules=();
     my @delrules=();          my @delrules=();
     my %triggers=();          my %triggers=();
     foreach my $key (keys(%env)) {          foreach my $key (keys(%env)) {
             if ($key=~/^form\.(\w+)\_action$/) {              if ($key=~/^form\.(\w+)\_action$/) {
         my $tempkey=$1;                  my $tempkey=$1;
         my $action=$env{$key};                  my $action=$env{$key};
                 if ($action) {                  if ($action) {
             $newrules{$tempkey.'_action'}=$action;                      $newrules{$tempkey.'_action'}=$action;
             if ($action ne 'default') {                      if ($action ne 'default') {
             my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);                          my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
             $triggers{$whichparm}.=$tempkey.':';                          $triggers{$whichparm}.=$tempkey.':';
             }                      }
             $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};                      $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
             if (&isdateparm($defkeytype{$tempkey})) {                      if (&isdateparm($defkeytype{$tempkey})) {
             $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};                          $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
             $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};                          $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
             $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};                          $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
             $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};                          $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
             } else {                      } else {
             $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};                          $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
             $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};                          $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
                       }
                   } else {
                       push(@delrules,$tempkey.'_action');
                       push(@delrules,$tempkey.'_type');
                       push(@delrules,$tempkey.'_hours');
                       push(@delrules,$tempkey.'_min');
                       push(@delrules,$tempkey.'_sec');
                       push(@delrules,$tempkey.'_value');
                   }
             }              }
         } else {  
             push(@delrules,$tempkey.'_action');  
             push(@delrules,$tempkey.'_type');  
             push(@delrules,$tempkey.'_hours');  
             push(@delrules,$tempkey.'_min');  
             push(@delrules,$tempkey.'_sec');  
             push(@delrules,$tempkey.'_value');  
         }          }
           foreach my $key (keys(%allparms)) {
               $newrules{$key.'_triggers'}=$triggers{$key};
         }          }
     }          &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);
     foreach my $key (keys(%allparms)) {          &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);
         $newrules{$key.'_triggers'}=$triggers{$key};          &resetrulescache();
     }  
     &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);  
     &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);  
     &resetrulescache();  
     }      }
     my %lt=&Apache::lonlocal::texthash('days' => 'Days',      my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                        'hours' => 'Hours',                         'hours' => 'Hours',
Line 5010  sub defaultsetter { Line 5207  sub defaultsetter {
     my @dateoptions=('','default');      my @dateoptions=('','default');
     my @datedisplay=('',&mt('Default value when manually setting'));      my @datedisplay=('',&mt('Default value when manually setting'));
     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {      foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
     unless ($tempkey) { next; }          unless ($tempkey) { next; }
     push @standardoptions,'when_setting_'.$tempkey;          push @standardoptions,'when_setting_'.$tempkey;
     push @standarddisplay,&mt('Automatically set when setting ').$tempkey;          push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
     if (&isdateparm($defkeytype{$tempkey})) {          if (&isdateparm($defkeytype{$tempkey})) {
         push @dateoptions,'later_than_'.$tempkey;              push @dateoptions,'later_than_'.$tempkey;
         push @datedisplay,&mt('Automatically set later than ').$tempkey;              push @datedisplay,&mt('Automatically set later than ').$tempkey;
         push @dateoptions,'earlier_than_'.$tempkey;              push @dateoptions,'earlier_than_'.$tempkey;
         push @datedisplay,&mt('Automatically set earlier than ').$tempkey;              push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
     }          }
     }      }
 $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.  $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
       &mt('Automatic setting rules apply to table mode interfaces only.'));        &mt('Automatic setting rules apply to table mode interfaces only.'));
Line 5028  $r->print(&mt('Manual setting rules appl Line 5225  $r->print(&mt('Manual setting rules appl
           &mt('Action').'</th><th>'.&mt('Value').'</th>'.            &mt('Action').'</th><th>'.&mt('Value').'</th>'.
           &Apache::loncommon::end_data_table_header_row());            &Apache::loncommon::end_data_table_header_row());
     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {      foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
     unless ($tempkey) { next; }          unless ($tempkey) { next; }
     $r->print("\n".&Apache::loncommon::start_data_table_row().          $r->print("\n".&Apache::loncommon::start_data_table_row().
           "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');              "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
     my $action=&rulescache($tempkey.'_action');          my $action=&rulescache($tempkey.'_action');
     $r->print('<select name="'.$tempkey.'_action">');          $r->print('<select name="'.$tempkey.'_action">');
     if (&isdateparm($defkeytype{$tempkey})) {          if (&isdateparm($defkeytype{$tempkey})) {
         for (my $i=0;$i<=$#dateoptions;$i++) {              for (my $i=0;$i<=$#dateoptions;$i++) {
         if ($dateoptions[$i]=~/\_$tempkey$/) { next; }              if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
         $r->print("\n<option value='$dateoptions[$i]'".              $r->print("\n<option value='$dateoptions[$i]'".
               ($dateoptions[$i] eq $action?' selected="selected"':'').                  ($dateoptions[$i] eq $action?' selected="selected"':'').
               ">$datedisplay[$i]</option>");                  ">$datedisplay[$i]</option>");
               }
           } else {
               for (my $i=0;$i<=$#standardoptions;$i++) {
               if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
               $r->print("\n<option value='$standardoptions[$i]'".
                   ($standardoptions[$i] eq $action?' selected="selected"':'').
                   ">$standarddisplay[$i]</option>");
               }
         }          }
     } else {          $r->print('</select>');
         for (my $i=0;$i<=$#standardoptions;$i++) {          unless (&isdateparm($defkeytype{$tempkey})) {
         if ($standardoptions[$i]=~/\_$tempkey$/) { next; }              $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
         $r->print("\n<option value='$standardoptions[$i]'".                  '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
               ($standardoptions[$i] eq $action?' selected="selected"':'').  
               ">$standarddisplay[$i]</option>");  
         }          }
     }          $r->print("\n</td><td>\n");
     $r->print('</select>');  
     unless (&isdateparm($defkeytype{$tempkey})) {  
         $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').  
               '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');  
     }  
     $r->print("\n</td><td>\n");  
   
         if (&isdateparm($defkeytype{$tempkey})) {          if (&isdateparm($defkeytype{$tempkey})) {
         my $days=&rulescache($tempkey.'_days');              my $days=&rulescache($tempkey.'_days');
         my $hours=&rulescache($tempkey.'_hours');              my $hours=&rulescache($tempkey.'_hours');
         my $min=&rulescache($tempkey.'_min');              my $min=&rulescache($tempkey.'_min');
         my $sec=&rulescache($tempkey.'_sec');              my $sec=&rulescache($tempkey.'_sec');
         $r->print(<<ENDINPUTDATE);              $r->print(<<ENDINPUTDATE);
 <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />      <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
 <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />      <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
 <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />      <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
 <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}      <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
 ENDINPUTDATE      ENDINPUTDATE
     } elsif ($defkeytype{$tempkey} eq 'string_yesno') {          } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
             my $yeschecked='';                  my $yeschecked='';
             my $nochecked='';                  my $nochecked='';
             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }                  if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }                  if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
   
         $r->print(<<ENDYESNO);              $r->print(<<ENDYESNO);
 <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />      <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
 <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>      <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
 ENDYESNO      ENDYESNO
         } else {          } else {
         $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');              $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
     }          }
         $r->print('</td>'.&Apache::loncommon::end_data_table_row());          $r->print('</td>'.&Apache::loncommon::end_data_table_row());
     }      }
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
Line 5089  ENDYESNO Line 5286  ENDYESNO
     return;      return;
 }  }
   
   ##################################################
   # PARAMETER CHANGES LOG
   ##################################################
   
 sub components {  sub components {
     my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;      my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
   
     if ($typeflag) {      if ($typeflag) {
     $key=~s/\.type$//;          $key=~s/\.type$//;
     }      }
   
     my ($middle,$part,$name)=      my ($middle,$part,$name)=
     ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);          ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
     my $issection;      my $issection;
   
     my $section=&mt('All Students');      my $section=&mt('All Students');
     if ($middle=~/^\[(.*)\]/) {      if ($middle=~/^\[(.*)\]/) {
     $issection=$1;          $issection=$1;
     $section=&mt('Group/Section').': '.$issection;          $section=&mt('Group/Section').': '.$issection;
     $middle=~s/^\[(.*)\]//;          $middle=~s/^\[(.*)\]//;
     }      }
     $middle=~s/\.+$//;      $middle=~s/\.+$//;
     $middle=~s/^\.+//;      $middle=~s/^\.+//;
     if ($uname) {      if ($uname) {
     $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);          $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
     $issection='';          $issection='';
     }      }
     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';      my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
     my $realmdescription=&mt('all resources');      my $realmdescription=&mt('all resources');
Line 5121  sub components { Line 5322  sub components {
         if ($maplevel eq 'rec') {          if ($maplevel eq 'rec') {
             $leveltitle = &mt('Recursive');              $leveltitle = &mt('Recursive');
         }          }
     $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <span class="LC_parm_folder"><br />('.$mapurl.')</span></span>';          $realm='<span class="LC_parm_scope_folder">'.$leveltitle.
      $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($mapurl);              ': '.&Apache::lonnet::gettitle($mapurl).' <span class="LC_parm_folder"><br />('.
    } elsif ($middle) {              $mapurl.')</span></span>';
     my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);          $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($mapurl);
     $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';      } elsif ($middle) {
     $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);          my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
           $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').
               ': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.
               ' in '.$map.' id: '.$id.')</span></span>';
           $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
     }      }
     my $what=$part.'.'.$name;      my $what=$part.'.'.$name;
     return ($realm,$section,$name,$part,      return ($realm,$section,$name,$part,
Line 5139  my %standard_parms_types; Line 5344  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);
     my ($short,$plain)=split(/:/,$configline);          my ($short,$plain)=split(/:/,$configline);
     my (undef,$name,$type)=split(/\&/,$short,3);          my (undef,$name,$type)=split(/\&/,$short,3);
     if ($type eq 'display') {          if ($type eq 'display') {
         $standard_parms{$name} = $plain;              $standard_parms{$name} = $plain;
         } elsif ($type eq 'type') {          } elsif ($type eq 'type') {
             $standard_parms_types{$name} = $plain;                  $standard_parms_types{$name} = $plain;
         }          }
     }      }
     close($config);      close($config);
Line 5157  sub load_parameter_names { Line 5362  sub load_parameter_names {
 sub standard_parameter_names {  sub standard_parameter_names {
     my ($name)=@_;      my ($name)=@_;
     if (!%standard_parms) {      if (!%standard_parms) {
     &load_parameter_names();          &load_parameter_names();
     }      }
     if ($standard_parms{$name}) {      if ($standard_parms{$name}) {
     return $standard_parms{$name};          return $standard_parms{$name};
     } else {      } else {
     return $name;          return $name;
     }      }
 }  }
   
Line 5177  sub standard_parameter_types { Line 5382  sub standard_parameter_types {
     return;      return;
 }  }
   
   sub standard_parameter_levels {
       my ($name)=@_;
       my %levels = (
                       'resourcelevel'   => 'a single resource',
                       'maplevel'        => 'the enclosing map/folder', 
                       'maplevelrecurse' => 'the enclosing map/folder (recursive into sub-folders)',
                       'courselevel'     => 'the general (course) level',
                    );
       if ($levels{$name}) {
           return $levels{$name};
       }
       return;
   }
   
   # Display log for parameter changes, blog postings, user notification changes.
 sub parm_change_log {  sub parm_change_log {
     my ($r)=@_;      my ($r)=@_;
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
Line 5218  sub parm_change_log { Line 5438  sub parm_change_log {
     my $shown=0;      my $shown=0;
     my $folder='';      my $folder='';
     if ($env{'form.displayfilter'} eq 'currentfolder') {      if ($env{'form.displayfilter'} eq 'currentfolder') {
     my $last='';          my $last='';
     if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',          if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
         &GDBM_READER(),0640)) {                  &GDBM_READER(),0640)) {
         $last=$hash{'last_known'};              $last=$hash{'last_known'};
         untie(%hash);              untie(%hash);
     }          }
     if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }          if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
     }      }
     foreach my $id (sort      foreach my $id (sort {
             {                  if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
             if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {                      return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
                 return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}                  }
             }                  my $aid = (split('00000',$a))[-1];
             my $aid = (split('00000',$a))[-1];                  my $bid = (split('00000',$b))[-1];
             my $bid = (split('00000',$b))[-1];                  return $bid<=>$aid;
             return $bid<=>$aid;  
             } (keys(%parmlog))) {              } (keys(%parmlog))) {
         my @changes=keys(%{$parmlog{$id}{'logentry'}});          my @changes=keys(%{$parmlog{$id}{'logentry'}});
     my $count = 0;          my $count = 0;
     my $time =          my $time =
         &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});              &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
     my $plainname =          my $plainname =
         &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},              &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                       $parmlog{$id}{'exe_udom'});                          $parmlog{$id}{'exe_udom'});
     my $about_me_link =          my $about_me_link =
         &Apache::loncommon::aboutmewrapper($plainname,              &Apache::loncommon::aboutmewrapper($plainname,
                            $parmlog{$id}{'exe_uname'},                              $parmlog{$id}{'exe_uname'},
                            $parmlog{$id}{'exe_udom'});                              $parmlog{$id}{'exe_udom'});
     my $send_msg_link='';          my $send_msg_link='';
     if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})          if ((($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'),
                            $parmlog{$id}{'exe_uname'},                              $parmlog{$id}{'exe_uname'},
                            $parmlog{$id}{'exe_udom'});                              $parmlog{$id}{'exe_udom'});
     }          }
     my $row_start=&Apache::loncommon::start_data_table_row();          my $row_start=&Apache::loncommon::start_data_table_row();
     my $makenewrow=0;          my $makenewrow=0;
     my %istype=();          my %istype=();
     my $output;          my $output;
     foreach my $changed (reverse(sort(@changes))) {          foreach my $changed (reverse(sort(@changes))) {
             my $value=$parmlog{$id}{'logentry'}{$changed};                  my $value=$parmlog{$id}{'logentry'}{$changed};
         my $typeflag = ($changed =~/\.type$/ &&              my $typeflag = ($changed =~/\.type$/ &&
                 !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));                      !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
             my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=              my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
         &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);                  &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
         if ($env{'request.course.sec'} ne '') {              if ($env{'request.course.sec'} ne '') {
             next if (($issection ne '') && ($issection 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') {
         if ($folder) {                  if ($folder) {
             if ($middle!~/^\Q$folder\E/) { next; }                      if ($middle!~/^\Q$folder\E/) { next; }
         }                  }
         }              }
         if ($typeflag) {              if ($typeflag) {
         $istype{$parmname}=$value;                  $istype{$parmname}=$value;
         if (!$env{'form.includetypes'}) { next; }                  if (!$env{'form.includetypes'}) { next; }
         }              }
         $count++;              $count++;
         if ($makenewrow) {              if ($makenewrow) {
         $output .= $row_start;                  $output .= $row_start;
         } else {              } else {
         $makenewrow=1;                  $makenewrow=1;
         }              }
             my $parmitem = &standard_parameter_names($parmname);              my $parmitem = &standard_parameter_names($parmname);
         $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.              $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
               &mt($parmitem).'</td><td>'.                  &mt($parmitem).'</td><td>'.
               ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';                  ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
         my $stillactive=0;              my $stillactive=0;
         if ($parmlog{$id}{'delflag'}) {              if ($parmlog{$id}{'delflag'}) {
         $output .= &mt('Deleted');                  $output .= &mt('Deleted');
         } else {              } else {
         if ($typeflag) {                  if ($typeflag) {
                     my $parmitem = &standard_parameter_names($value);                       my $parmitem = &standard_parameter_names($value); 
                     $parmitem = &mt($parmitem);                      $parmitem = &mt($parmitem);
             $output .= &mt('Type: [_1]',$parmitem);                      $output .= &mt('Type: [_1]',$parmitem);
         } else {                  } else {
             my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),                      my ($level,@all)=&parmval_by_symb($what,$middle,
                               $uname,$udom,$issection,$issection,$courseopt);                          &Apache::lonnet::metadata($middle,$what),
                           $uname,$udom,$issection,$issection,$courseopt);
                     my $showvalue = $value;                      my $showvalue = $value;
                     if ($istype{$parmname} eq '') {                      if ($istype{$parmname} eq '') {
                         my $type = &standard_parameter_types($parmname);                          my $type = &standard_parameter_types($parmname);
Line 5311  sub parm_change_log { Line 5531  sub parm_change_log {
                             }                              }
                         }                          }
                     } else {                      } else {
                 if (&isdateparm($istype{$parmname})) {                          if (&isdateparm($istype{$parmname})) {
                 $showvalue =                               $showvalue = &Apache::lonlocal::locallocaltime($value);
                                 &Apache::lonlocal::locallocaltime($value);                          }
                 }  
                     }                      }
                     $output .= $showvalue;                      $output .= $showvalue;
             if ($value ne $all[$level]) {                      if ($value ne $all[$level]) {
             $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';                          $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
             } else {                      } else {
             $stillactive=1;                          $stillactive=1;
                       }
                   }
             }              }
         }              $output .= '</td><td>';
         }                  
         $output .= '</td><td>';              if ($stillactive) {
               
         if ($stillactive) {  
                 my $parmitem = &standard_parameter_names($parmname);                  my $parmitem = &standard_parameter_names($parmname);
                 $parmitem = &mt($parmitem);                  $parmitem = &mt($parmitem);
         my $title=&mt('Changed [_1]',$parmitem);                  my $title=&mt('Changed [_1]',$parmitem);
                 my $description=&mt('Changed [_1] for [_2] to [_3]',                  my $description=&mt('Changed [_1] for [_2] to [_3]',
                                     $parmitem,$realmdescription,                      $parmitem,$realmdescription,
                     (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));                      (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
         if (($uname) && ($udom)) {                  if (($uname) && ($udom)) {
             $output .=                      $output .=
             &Apache::loncommon::messagewrapper('Notify User',                      &Apache::loncommon::messagewrapper('Notify User',
                                $uname,$udom,$title,                                      $uname,$udom,$title,
                                $description);                                      $description);
         } else {                  } else {
             $output .=                      $output .=
             &Apache::lonrss::course_blog_link($id,$title,                      &Apache::lonrss::course_blog_link($id,$title,
                               $description);                                      $description);
         }                  }
               }
               $output .= '</td>'.&Apache::loncommon::end_data_table_row();
         }          }
         $output .= '</td>'.&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.':'.
         $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.              $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
         $output;              $output;
         if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }              if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
     }          }
         if ($count) {          if ($count) {
         $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>              $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
                        <td rowspan="'.$count.'">'.$about_me_link.                          <td rowspan="'.$count.'">'.$about_me_link.
           '<br /><tt>'.$parmlog{$id}{'exe_uname'}.              '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                       ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.                          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
           $send_msg_link.'</td>'.$output);              $send_msg_link.'</td>'.$output);
         $shown++;              $shown++;
     }          }
     if (!($env{'form.show'} eq &mt('all')          if (!($env{'form.show'} eq &mt('all')
           || $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);      &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   ##################################################
   # MISC !
   ##################################################
   
   # Used by table UI
 sub update_slots {  sub update_slots {
     my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;      my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
     my %slot=&Apache::lonnet::get_slot($slot_name);      my %slot=&Apache::lonnet::get_slot($slot_name);
Line 5421  sub update_slots { Line 5645  sub update_slots {
     return $success;      return $success;
 }  }
   
   # Used by table UI
 sub delete_slots {  sub delete_slots {
     my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;      my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
     my $delresult;      my $delresult;
Line 5456  sub delete_slots { Line 5681  sub delete_slots {
     return $delresult;      return $delresult;
 }  }
   
   # Used by handler
 sub check_for_course_info {  sub check_for_course_info {
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     return 1 if ($navmap);      return 1 if ($navmap);
Line 5472  sub parameter_release_vars { Line 5698  sub parameter_release_vars {
 }  }
   
 sub parameter_releasecheck {  sub parameter_releasecheck {
     my ($name,$value,$valmatch,$needsrelease,$cmajor,$cminor) = @_;      my ($name,$value,$valmatch,$namematch,$needsrelease,$cmajor,$cminor) = @_;
     my $needsnewer;      my $needsnewer;
     my ($needsmajor,$needsminor) = split(/\./,$needsrelease);      my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
     if (($cmajor < $needsmajor) ||       if (($cmajor < $needsmajor) || 
         ($cmajor == $needsmajor && $cminor < $needsminor)) {          ($cmajor == $needsmajor && $cminor < $needsminor)) {
         $needsnewer = 1;          $needsnewer = 1;
     } elsif ($valmatch) {      } elsif ($name) {
         &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch});          if ($valmatch) {
     } elsif ($value) {               &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch.':'});
         &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.':'});          } elsif ($value) { 
               &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.'::'});
           }
       } elsif ($namematch) {
           &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter::::'.$namematch});
     }      }
     return $needsnewer;      return $needsnewer;
 }  }
   
   ##################################################
   # HANDLER
   ##################################################
   
   # Main handler for lonparmset.
   # Sub called based on request parameters action and command:
   # no command or action: print_main_menu
   # command 'set': assessparms (direct access to table mode for a resource)
   #                (this can also be accessed simply with the symb parameter)
   # action 'setoverview': overview (display all existing parameter settings)
   # action 'addmetadata': addmetafield (called to add a portfolio metadata field)
   # action 'ordermetadata': order_meta_fields (called to order portfolio metadata fields)
   # action 'setrestrictmeta': setrestrictmeta (display or save portfolio metadata)
   # action 'newoverview': newoverview (overview mode)
   # action 'setdefaults': defaultsetter (UI to change parameter setting default actions)
   # action 'settable': assessparms (table mode)
   # action 'parameterchangelog': parm_change_log (display log for parameter changes,
   #                              blog postings, user notification changes)
   # action 'cleanparameters': clean_parameters (unused)
   # action 'dateshift1': date_shift_one (overview mode, shift all dates)
   # action 'dateshift2': date_shift_two (overview mode, shift all dates)
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
Line 5526  sub handler { Line 5777  sub handler {
         # Check first if coming from someone else headed directly for          # Check first if coming from someone else headed directly for
         #  the table mode          #  the table mode
         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})          if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
          && (!$env{'form.dis'})) || ($env{'form.symb'})) {                  && (!$env{'form.dis'})) || ($env{'form.symb'})) {
         &assessparms($r);              &assessparms($r);
         } elsif (! exists($env{'form.action'})) {          } elsif (! exists($env{'form.action'})) {
             &print_main_menu($r,$parm_permission);              &print_main_menu($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'setoverview') {          } elsif ($env{'form.action'} eq 'setoverview') {
         &overview($r);              &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);              &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);              &assessparms($r);
         } elsif ($env{'form.action'} eq 'parameterchangelog') {          } elsif ($env{'form.action'} eq 'parameterchangelog') {
         &parm_change_log($r);              &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') {
Line 5555  sub handler { Line 5806  sub handler {
         }          }
     } else {      } else {
 # ----------------------------- Not in a course, or not allowed to modify parms  # ----------------------------- Not in a course, or not allowed to modify parms
     if ($exists) {          if ($exists) {
         $env{'user.error.msg'}=              $env{'user.error.msg'}=
         "/adm/parmset:opa:0:0:Cannot modify assessment parameters";              "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
     } else {          } else {
         $env{'user.error.msg'}=              $env{'user.error.msg'}=
         "/adm/parmset::0:1:Course environment gone, reinitialize the course";              "/adm/parmset::0:1:Course environment gone, reinitialize the course";
     }          }
     return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
     &reset_caches();      &reset_caches();
   

Removed from v.1.556  
changed lines
  Added in v.1.560


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