Annotation of loncom/interface/lonparmset.pm, revision 1.310

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.310   ! www         4: # $Id: lonparmset.pm,v 1.309 2006/06/02 06:48:54 www Exp $
1.40      albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.59      matthew    28: ###################################################################
                     29: ###################################################################
                     30: 
                     31: =pod
                     32: 
                     33: =head1 NAME
                     34: 
                     35: lonparmset - Handler to set parameters for assessments and course
                     36: 
                     37: =head1 SYNOPSIS
                     38: 
                     39: lonparmset provides an interface to setting course parameters. 
                     40: 
                     41: =head1 DESCRIPTION
                     42: 
                     43: This module sets coursewide and assessment parameters.
                     44: 
                     45: =head1 INTERNAL SUBROUTINES
                     46: 
                     47: =over 4
                     48: 
                     49: =cut
                     50: 
                     51: ###################################################################
                     52: ###################################################################
1.1       www        53: 
                     54: package Apache::lonparmset;
                     55: 
                     56: use strict;
                     57: use Apache::lonnet;
                     58: use Apache::Constants qw(:common :http REDIRECT);
1.88      matthew    59: use Apache::lonhtmlcommon();
1.36      albertel   60: use Apache::loncommon;
1.1       www        61: use GDBM_File;
1.57      albertel   62: use Apache::lonhomework;
                     63: use Apache::lonxml;
1.130     www        64: use Apache::lonlocal;
1.197     www        65: use Apache::lonnavmaps;
1.307     raeburn    66: use Apache::longroup;
1.303     www        67: use Apache::lonrss;
1.308     www        68: use lib '/home/httpd/lib/perl/';
                     69: use LONCAPA;
1.1       www        70: 
1.198     www        71: # --- Caches local to lonparmset
1.2       www        72: 
1.199     www        73: my $parmhashid;
                     74: my %parmhash;
1.201     www        75: my $symbsid;
                     76: my %symbs;
1.221     www        77: my $rulesid;
                     78: my %rules;
1.198     www        79: 
                     80: # --- end local caches
                     81: 
1.59      matthew    82: ##################################################
                     83: ##################################################
                     84: 
                     85: =pod
                     86: 
                     87: =item parmval
                     88: 
                     89: Figure out a cascading parameter.
                     90: 
1.71      albertel   91: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   92:          $id   - a bighash Id number
1.71      albertel   93:          $def  - the resource's default value   'stupid emacs
                     94: 
1.269     raeburn    95: Returns:  A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels
1.71      albertel   96: 
1.306     albertel   97: 14- General Course
                     98: 13- Map or Folder level in course
1.269     raeburn    99: 12- resource default
                    100: 11- map default
1.306     albertel  101: 10- resource level in course
1.269     raeburn   102: 9 - General for section
                    103: 8 - Map or Folder level for section
                    104: 7 - resource level in section
                    105: 6 - General for group
                    106: 5 - Map or Folder level for group
                    107: 4 - resource level in group
1.71      albertel  108: 3 - General for specific student
1.82      www       109: 2 - Map or Folder level for specific student
1.71      albertel  110: 1 - resource level for specific student
1.2       www       111: 
1.59      matthew   112: =cut
                    113: 
                    114: ##################################################
1.2       www       115: sub parmval {
1.275     raeburn   116:     my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
                    117:     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
                    118:                                                            $cgroup,$courseopt);
1.201     www       119: }
                    120: 
                    121: sub parmval_by_symb {
1.275     raeburn   122:     my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
1.198     www       123: # load caches
                    124:     &cacheparmhash();
1.200     www       125: 
                    126:     my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
                    127: 
1.8       www       128:     my $result='';
1.44      albertel  129:     my @outpar=();
1.2       www       130: # ----------------------------------------------------- Cascading lookup scheme
1.201     www       131:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.305     albertel  132:     $map = &Apache::lonnet::deversion($map);
1.10      www       133: 
1.201     www       134:     my $symbparm=$symb.'.'.$what;
                    135:     my $mapparm=$map.'___(all).'.$what;
1.10      www       136: 
1.269     raeburn   137:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
                    138:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    139:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    140: 
1.190     albertel  141:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
                    142:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    143:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
                    144: 
                    145:     my $courselevel=$env{'request.course.id'}.'.'.$what;
                    146:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    147:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2       www       148: 
1.11      www       149: 
1.182     albertel  150: # --------------------------------------------------------- first, check course
1.11      www       151: 
1.200     www       152:     if (defined($$courseopt{$courselevel})) {
1.269     raeburn   153: 	$outpar[14]=$$courseopt{$courselevel};
                    154: 	$result=14;
1.43      albertel  155:     }
1.11      www       156: 
1.200     www       157:     if (defined($$courseopt{$courselevelm})) {
1.269     raeburn   158: 	$outpar[13]=$$courseopt{$courselevelm};
                    159: 	$result=13;
1.43      albertel  160:     }
1.11      www       161: 
1.182     albertel  162: # ------------------------------------------------------- second, check default
                    163: 
1.269     raeburn   164:     if (defined($def)) { $outpar[12]=$def; $result=12; }
1.182     albertel  165: 
                    166: # ------------------------------------------------------ third, check map parms
                    167: 
                    168:     my $thisparm=$parmhash{$symbparm};
1.269     raeburn   169:     if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
1.182     albertel  170: 
1.200     www       171:     if (defined($$courseopt{$courselevelr})) {
1.269     raeburn   172: 	$outpar[10]=$$courseopt{$courselevelr};
                    173: 	$result=10;
1.43      albertel  174:     }
1.11      www       175: 
1.182     albertel  176: # ------------------------------------------------------ fourth, back to course
1.71      albertel  177:     if (defined($csec)) {
1.200     www       178:         if (defined($$courseopt{$seclevel})) {
1.269     raeburn   179: 	    $outpar[9]=$$courseopt{$seclevel};
                    180: 	    $result=9;
1.43      albertel  181: 	}
1.200     www       182:         if (defined($$courseopt{$seclevelm})) {
1.269     raeburn   183: 	    $outpar[8]=$$courseopt{$seclevelm};
                    184: 	    $result=8;
1.43      albertel  185: 	}
                    186: 
1.200     www       187:         if (defined($$courseopt{$seclevelr})) {
1.269     raeburn   188: 	    $outpar[7]=$$courseopt{$seclevelr};
                    189: 	    $result=7;
1.43      albertel  190: 	}
                    191:     }
1.275     raeburn   192: # ------------------------------------------------------ fifth, check course group
1.269     raeburn   193:     if (defined($cgroup)) {
                    194:         if (defined($$courseopt{$grplevel})) {
                    195:             $outpar[6]=$$courseopt{$grplevel};
                    196:             $result=6;
                    197:         }
                    198:         if (defined($$courseopt{$grplevelm})) {
                    199:             $outpar[5]=$$courseopt{$grplevelm};
                    200:             $result=5;
                    201:         }
                    202:         if (defined($$courseopt{$grplevelr})) {
                    203:             $outpar[4]=$$courseopt{$grplevelr};
                    204:             $result=4;
                    205:         }
                    206:     }
1.11      www       207: 
1.182     albertel  208: # ---------------------------------------------------------- fifth, check user
1.11      www       209: 
1.71      albertel  210:     if (defined($uname)) {
1.200     www       211: 	if (defined($$useropt{$courselevel})) {
                    212: 	    $outpar[3]=$$useropt{$courselevel};
1.43      albertel  213: 	    $result=3;
                    214: 	}
1.10      www       215: 
1.200     www       216: 	if (defined($$useropt{$courselevelm})) {
                    217: 	    $outpar[2]=$$useropt{$courselevelm};
1.43      albertel  218: 	    $result=2;
                    219: 	}
1.2       www       220: 
1.200     www       221: 	if (defined($$useropt{$courselevelr})) {
                    222: 	    $outpar[1]=$$useropt{$courselevelr};
1.43      albertel  223: 	    $result=1;
                    224: 	}
                    225:     }
1.44      albertel  226:     return ($result,@outpar);
1.2       www       227: }
                    228: 
1.198     www       229: sub resetparmhash {
                    230:     $parmhashid='';
                    231: }
                    232: 
                    233: sub cacheparmhash {
                    234:     if ($parmhashid eq  $env{'request.course.fn'}) { return; }
                    235:     my %parmhashfile;
                    236:     if (tie(%parmhashfile,'GDBM_File',
                    237: 	      $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
                    238: 	%parmhash=%parmhashfile;
                    239: 	untie %parmhashfile;
                    240: 	$parmhashid=$env{'request.course.fn'};
                    241:     }
                    242: }
                    243: 
1.203     www       244: sub resetsymbcache {
                    245:     $symbsid='';
                    246: }
                    247: 
1.201     www       248: sub symbcache {
                    249:     my $id=shift;
                    250:     if ($symbsid ne $env{'request.course.id'}) {
                    251: 	%symbs=();
                    252:     }
                    253:     unless ($symbs{$id}) {
                    254: 	my $navmap = Apache::lonnavmaps::navmap->new();
                    255: 	if ($id=~/\./) {
                    256: 	    my $resource=$navmap->getById($id);
                    257: 	    $symbs{$id}=$resource->symb();
                    258: 	} else {
                    259: 	    my $resource=$navmap->getByMapPc($id);
                    260: 	    $symbs{$id}=&Apache::lonnet::declutter($resource->src());
                    261: 	}
                    262: 	$symbsid=$env{'request.course.id'};
                    263:     }
                    264:     return $symbs{$id};
                    265: }
                    266: 
1.221     www       267: sub resetrulescache {
                    268:     $rulesid='';
                    269: }
                    270: 
                    271: sub rulescache {
                    272:     my $id=shift;
                    273:     if ($rulesid ne $env{'request.course.id'}) {
                    274: 	%rules=();
                    275:     }
1.224     www       276:     unless (defined($rules{$id})) {
1.221     www       277: 	my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    278: 	my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.224     www       279: 	%rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
1.221     www       280: 	$rulesid=$env{'request.course.id'};
                    281:     }
                    282:     return $rules{$id};
                    283: }
                    284: 
1.229     www       285: sub preset_defaults {
                    286:     my $type=shift;
                    287:     if (&rulescache($type.'_action') eq 'default') {
                    288: # yes, there is something
                    289: 	return (&rulescache($type.'_hours'),
                    290: 		&rulescache($type.'_min'),
                    291: 		&rulescache($type.'_sec'),
                    292: 		&rulescache($type.'_value'));
                    293:     } else {
                    294: # nothing there or something else
                    295: 	return ('','','','','');
                    296:     }
                    297: }
                    298: 
1.186     www       299: ##################################################
1.277     www       300: 
                    301: sub date_sanity_info {
                    302:    my $checkdate=shift;
                    303:    unless ($checkdate) { return ''; }
                    304:    my $result='';
                    305:    my $crsprefix='course.'.$env{'request.course.id'}.'.';
                    306:    if ($env{$crsprefix.'default_enrollment_end_date'}) {
                    307:       if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
                    308:          $result.='<br />'.&mt('After course enrollment end!');
                    309:       }
                    310:    }
                    311:    if ($env{$crsprefix.'default_enrollment_start_date'}) {
                    312:       if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
                    313:          $result.='<br />'.&mt('Before course enrollment start!');
                    314:       }
                    315:    }
                    316:    return $result;
                    317: }
                    318: ##################################################
1.186     www       319: ##################################################
                    320: #
1.197     www       321: # Store a parameter by ID
1.186     www       322: #
                    323: # Takes
                    324: # - resource id
                    325: # - name of parameter
                    326: # - level
                    327: # - new value
                    328: # - new type
1.187     www       329: # - username
                    330: # - userdomain
                    331: 
1.186     www       332: sub storeparm {
1.269     raeburn   333:     my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.275     raeburn   334:     &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup);
1.197     www       335: }
                    336: 
                    337: #
                    338: # Store a parameter by symb
                    339: #
                    340: # Takes
                    341: # - symb
                    342: # - name of parameter
                    343: # - level
                    344: # - new value
                    345: # - new type
                    346: # - username
                    347: # - userdomain
                    348: 
1.226     www       349: my %recstack;
1.197     www       350: sub storeparm_by_symb {
1.275     raeburn   351:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
1.226     www       352:     unless ($recflag) {
                    353: # first time call
                    354: 	%recstack=();
                    355: 	$recflag=1;
                    356:     }
                    357: # store parameter
                    358:     &storeparm_by_symb_inner
1.269     raeburn   359: 	($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
1.266     www       360: # don't do anything if parameter was reset
                    361:     unless ($nval) { return; }
1.226     www       362:     my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
                    363: # remember that this was set
                    364:     $recstack{$parm}=1;
                    365: # what does this trigger?
                    366:     foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
                    367: # don't backfire
                    368:        unless ((!$triggered) || ($recstack{$triggered})) {
                    369: 	   my $action=&rulescache($triggered.'_action');
                    370: 	   my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                    371: # set triggered parameter on same level
                    372: 	   my $newspnam=$prefix.$triggered;
1.227     www       373: 	   my $newvalue='';
1.228     www       374: 	   my $active=1;
                    375: 	   if ($action=~/^when\_setting/) {
                    376: # are there restrictions?
                    377: 	       if (&rulescache($triggered.'_triggervalue')=~/\w/) {
                    378: 		   $active=0;
                    379: 		   foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
                    380: 		       if (lc($possiblevalue) eq lc($nval)) { $active=1; }
                    381: 		   }
                    382: 	       }
                    383: 	       $newvalue=&rulescache($triggered.'_value');
1.227     www       384: 	   } else {
                    385: 	       my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
1.228     www       386: 	       if ($action=~/^later\_than/) {
                    387: 		   $newvalue=$nval+$totalsecs;
                    388: 	       } else {
                    389: 		   $newvalue=$nval-$totalsecs;
                    390: 	       }
                    391: 	   }
                    392: 	   if ($active) {
                    393: 	       &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
1.275     raeburn   394: 				   $uname,$udom,$csec,$recflag,$cgroup);
1.227     www       395: 	   }
1.226     www       396:        }
                    397:     }
                    398:     return '';
                    399: }
                    400: 
1.293     www       401: sub log_parmset {
                    402:     return &Apache::lonnet::instructor_log('parameterlog',@_);
1.284     www       403: }
                    404: 
1.226     www       405: sub storeparm_by_symb_inner {
1.197     www       406: # ---------------------------------------------------------- Get symb, map, etc
1.269     raeburn   407:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.197     www       408: # ---------------------------------------------------------- Construct prefixes
1.186     www       409:     $spnam=~s/\_([^\_]+)$/\.$1/;
1.197     www       410:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.305     albertel  411:     $map = &Apache::lonnet::deversion($map);
                    412: 
1.197     www       413:     my $symbparm=$symb.'.'.$spnam;
                    414:     my $mapparm=$map.'___(all).'.$spnam;
                    415: 
1.269     raeburn   416:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
                    417:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    418:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    419: 
1.190     albertel  420:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
                    421:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    422:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186     www       423:     
1.190     albertel  424:     my $courselevel=$env{'request.course.id'}.'.'.$spnam;
                    425:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    426:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186     www       427:     
                    428:     my $storeunder='';
1.269     raeburn   429:     if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
                    430:     if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
                    431:     if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; }
                    432:     if ($snum==9) { $storeunder=$seclevel; }
                    433:     if ($snum==8) { $storeunder=$seclevelm; }
                    434:     if ($snum==7) { $storeunder=$seclevelr; }
                    435:     if ($snum==6) { $storeunder=$grplevel; }
                    436:     if ($snum==5) { $storeunder=$grplevelm; }
                    437:     if ($snum==4) { $storeunder=$grplevelr; }
                    438: 
1.186     www       439:     
                    440:     my $delete;
                    441:     if ($nval eq '') { $delete=1;}
                    442:     my %storecontent = ($storeunder         => $nval,
                    443: 			$storeunder.'.type' => $ntype);
                    444:     my $reply='';
                    445:     if ($snum>3) {
                    446: # ---------------------------------------------------------------- Store Course
                    447: #
1.200     www       448: 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    449: 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.186     www       450: # Expire sheets
                    451: 	&Apache::lonnet::expirespread('','','studentcalc');
1.269     raeburn   452: 	if (($snum==10) || ($snum==7) || ($snum==4)) {
1.197     www       453: 	    &Apache::lonnet::expirespread('','','assesscalc',$symb);
1.269     raeburn   454: 	} elsif (($snum==11) || ($snum==8) || ($snum==5)) {
1.197     www       455: 	    &Apache::lonnet::expirespread('','','assesscalc',$map);
1.186     www       456: 	} else {
                    457: 	    &Apache::lonnet::expirespread('','','assesscalc');
                    458: 	}
                    459: # Store parameter
                    460: 	if ($delete) {
                    461: 	    $reply=&Apache::lonnet::del
1.200     www       462: 		('resourcedata',[keys(%storecontent)],$cdom,$cnum);
1.290     www       463:             &log_parmset(\%storecontent,1);
1.186     www       464: 	} else {
                    465: 	    $reply=&Apache::lonnet::cput
1.200     www       466: 		('resourcedata',\%storecontent,$cdom,$cnum);
1.290     www       467: 	    &log_parmset(\%storecontent);
1.186     www       468: 	}
1.200     www       469: 	&Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
1.186     www       470:     } else {
                    471: # ------------------------------------------------------------------ Store User
                    472: #
                    473: # Expire sheets
                    474: 	&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
                    475: 	if ($snum==1) {
                    476: 	    &Apache::lonnet::expirespread
1.197     www       477: 		($uname,$udom,'assesscalc',$symb);
1.186     www       478: 	} elsif ($snum==2) {
                    479: 	    &Apache::lonnet::expirespread
1.197     www       480: 		($uname,$udom,'assesscalc',$map);
1.186     www       481: 	} else {
                    482: 	    &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
                    483: 	}
                    484: # Store parameter
                    485: 	if ($delete) {
                    486: 	    $reply=&Apache::lonnet::del
                    487: 		('resourcedata',[keys(%storecontent)],$udom,$uname);
1.290     www       488: 	    &log_parmset(\%storecontent,1,$uname,$udom);
1.186     www       489: 	} else {
                    490: 	    $reply=&Apache::lonnet::cput
                    491: 		('resourcedata',\%storecontent,$udom,$uname);
1.290     www       492: 	    &log_parmset(\%storecontent,0,$uname,$udom);
1.186     www       493: 	}
1.191     albertel  494: 	&Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186     www       495:     }
                    496:     
                    497:     if ($reply=~/^error\:(.*)/) {
                    498: 	return "<font color=red>Write Error: $1</font>";
                    499:     }
                    500:     return '';
                    501: }
                    502: 
1.59      matthew   503: ##################################################
                    504: ##################################################
                    505: 
                    506: =pod
                    507: 
                    508: =item valout
                    509: 
                    510: Format a value for output.
                    511: 
                    512: Inputs:  $value, $type
                    513: 
                    514: Returns: $value, formatted for output.  If $type indicates it is a date,
                    515: localtime($value) is returned.
1.9       www       516: 
1.59      matthew   517: =cut
                    518: 
                    519: ##################################################
                    520: ##################################################
1.9       www       521: sub valout {
                    522:     my ($value,$type)=@_;
1.59      matthew   523:     my $result = '';
                    524:     # Values of zero are valid.
                    525:     if (! $value && $value ne '0') {
1.71      albertel  526: 	$result = '&nbsp;&nbsp;';
1.59      matthew   527:     } else {
1.66      www       528:         if ($type eq 'date_interval') {
                    529:             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
                    530:             $year=$year-70;
                    531:             $mday--;
                    532:             if ($year) {
                    533: 		$result.=$year.' yrs ';
                    534:             }
                    535:             if ($mon) {
                    536: 		$result.=$mon.' mths ';
                    537:             }
                    538:             if ($mday) {
                    539: 		$result.=$mday.' days ';
                    540:             }
                    541:             if ($hour) {
                    542: 		$result.=$hour.' hrs ';
                    543:             }
                    544:             if ($min) {
                    545: 		$result.=$min.' mins ';
                    546:             }
                    547:             if ($sec) {
                    548: 		$result.=$sec.' secs ';
                    549:             }
                    550:             $result=~s/\s+$//;
1.213     www       551:         } elsif (&isdateparm($type)) {
1.277     www       552:             $result = localtime($value).&date_sanity_info($value);
1.59      matthew   553:         } else {
                    554:             $result = $value;
                    555:         }
                    556:     }
                    557:     return $result;
1.9       www       558: }
                    559: 
1.59      matthew   560: ##################################################
                    561: ##################################################
                    562: 
                    563: =pod
1.5       www       564: 
1.59      matthew   565: =item plink
                    566: 
                    567: Produces a link anchor.
                    568: 
                    569: Inputs: $type,$dis,$value,$marker,$return,$call
                    570: 
                    571: Returns: scalar with html code for a link which will envoke the 
                    572: javascript function 'pjump'.
                    573: 
                    574: =cut
                    575: 
                    576: ##################################################
                    577: ##################################################
1.5       www       578: sub plink {
                    579:     my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23      www       580:     my $winvalue=$value;
                    581:     unless ($winvalue) {
1.213     www       582: 	if (&isdateparm($type)) {
1.190     albertel  583:             $winvalue=$env{'form.recent_'.$type};
1.23      www       584:         } else {
1.190     albertel  585:             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23      www       586:         }
                    587:     }
1.229     www       588:     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
                    589:     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
                    590:     unless (defined($winvalue)) { $winvalue=$val; }
1.270     www       591:     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$marker.'" /></td></tr><tr><td align="center">'.
1.43      albertel  592: 	'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
1.229     www       593: 	    .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
1.270     www       594: 		&valout($value,$type).'</a></td></tr></table>';
1.5       www       595: }
                    596: 
1.280     albertel  597: sub page_js {
                    598: 
1.81      www       599:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88      matthew   600:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.280     albertel  601: 
                    602:     return(<<ENDJS);
                    603: <script type="text/javascript">
1.44      albertel  604: 
                    605:     function pclose() {
                    606:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    607:                  "height=350,width=350,scrollbars=no,menubar=no");
                    608:         parmwin.close();
                    609:     }
                    610: 
1.88      matthew   611:     $pjump_def
1.44      albertel  612: 
                    613:     function psub() {
                    614:         pclose();
                    615:         if (document.parmform.pres_marker.value!='') {
                    616:             document.parmform.action+='#'+document.parmform.pres_marker.value;
                    617:             var typedef=new Array();
                    618:             typedef=document.parmform.pres_type.value.split('_');
                    619:            if (document.parmform.pres_type.value!='') {
                    620:             if (typedef[0]=='date') {
                    621:                 eval('document.parmform.recent_'+
                    622:                      document.parmform.pres_type.value+
                    623: 		     '.value=document.parmform.pres_value.value;');
                    624:             } else {
                    625:                 eval('document.parmform.recent_'+typedef[0]+
                    626: 		     '.value=document.parmform.pres_value.value;');
                    627:             }
                    628: 	   }
                    629:             document.parmform.submit();
                    630:         } else {
                    631:             document.parmform.pres_value.value='';
                    632:             document.parmform.pres_marker.value='';
                    633:         }
                    634:     }
                    635: 
1.57      albertel  636:     function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                    637:         var options = "width=" + w + ",height=" + h + ",";
                    638:         options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                    639:         options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                    640:         var newWin = window.open(url, wdwName, options);
                    641:         newWin.focus();
                    642:     }
1.44      albertel  643: </script>
1.81      www       644: $selscript
1.280     albertel  645: ENDJS
                    646: 
                    647: }
                    648: sub startpage {
                    649:     my ($r) = @_;
1.281     albertel  650: 
1.282     albertel  651:     my %loaditems = ('onunload' => "pclose()",
1.283     albertel  652: 		     'onload'   => "group_or_section('cgroup')",);
1.280     albertel  653: 
1.281     albertel  654:     my $start_page = 
                    655: 	&Apache::loncommon::start_page('Set/Modify Course Parameters',
                    656: 				       &page_js(),
1.282     albertel  657: 				       {'add_entries' => \%loaditems,});
1.280     albertel  658:     my $breadcrumbs = 
1.298     albertel  659: 	&Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting');
1.280     albertel  660:     $r->print(<<ENDHEAD);
1.281     albertel  661: $start_page
1.193     albertel  662: $breadcrumbs
                    663: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.280     albertel  664: <input type="hidden" value='' name="pres_value" />
                    665: <input type="hidden" value='' name="pres_type" />
                    666: <input type="hidden" value='' name="pres_marker" />
                    667: <input type="hidden" value='1' name="prevvisit" />
1.44      albertel  668: ENDHEAD
                    669: }
                    670: 
1.209     www       671: 
1.44      albertel  672: sub print_row {
1.201     www       673:     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
1.275     raeburn   674: 	$defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_;
                    675:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    676:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    677:     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.66      www       678: # get the values for the parameter in cascading order
                    679: # empty levels will remain empty
1.44      albertel  680:     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.275     raeburn   681: 	  $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       682: # get the type for the parameters
                    683: # problem: these may not be set for all levels
                    684:     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
1.275     raeburn   685:                                           $$name{$which}.'.type',$rid,
                    686: 		 $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       687: # cascade down manually
1.182     albertel  688:     my $cascadetype=$$defaulttype{$which};
1.269     raeburn   689:     for (my $i=14;$i>0;$i--) {
1.66      www       690: 	 if ($typeoutpar[$i]) { 
                    691:             $cascadetype=$typeoutpar[$i];
                    692: 	} else {
                    693:             $typeoutpar[$i]=$cascadetype;
                    694:         }
                    695:     }
1.57      albertel  696:     my $parm=$$display{$which};
                    697: 
1.203     www       698:     if ($parmlev eq 'full') {
1.57      albertel  699:         $r->print('<td bgcolor='.$defbgtwo.' align="center">'
                    700:                   .$$part{$which}.'</td>');
                    701:     } else {    
                    702:         $parm=~s|\[.*\]\s||g;
                    703:     }
1.231     www       704:     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
                    705:     if ($automatic) {
                    706: 	$parm.='<font color="red"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</font>';
                    707:     }
1.159     albertel  708:     $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57      albertel  709:    
1.44      albertel  710:     my $thismarker=$which;
                    711:     $thismarker=~s/^parameter\_//;
                    712:     my $mprefix=$rid.'&'.$thismarker.'&';
1.275     raeburn   713:     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);
                    714:     my ($othergrp,$grp_parm,$controlgrp);
1.44      albertel  715: 
1.57      albertel  716:     if ($parmlev eq 'general') {
                    717: 
                    718:         if ($uname) {
1.66      www       719:             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   720:         } elsif ($cgroup) {
                    721:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  722:         } elsif ($csec) {
1.269     raeburn   723:             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  724:         } else {
1.269     raeburn   725:             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  726:         }
                    727:     } elsif ($parmlev eq 'map') {
                    728: 
                    729:         if ($uname) {
1.66      www       730:             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   731:         } elsif ($cgroup) {
                    732:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  733:         } elsif ($csec) {
1.269     raeburn   734:             &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  735:         } else {
1.269     raeburn   736:             &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  737:         }
                    738:     } else {
1.275     raeburn   739:         if ($uname) {
                    740:             if (@{$usersgroups} > 1) {
                    741:                 my ($coursereply,$grp_parm,$controlgrp);
                    742:                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                    743:                     &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
                    744:                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                    745:                 if ($coursereply && $result > 3) {
                    746:                     if (defined($controlgrp)) {
                    747:                         if ($cgroup ne $controlgrp) {
                    748:                             $effective_parm = $grp_parm;
                    749:                             $result = 0;
                    750:                         }
                    751:                     }
                    752:                 }
                    753:             }
                    754:         }
1.57      albertel  755: 
1.269     raeburn   756:         &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  757: 
1.269     raeburn   758: 	&print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    759: 	&print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    760: 	&print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       761: 	&print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    762: 	
                    763: 	if ($csec) {
1.269     raeburn   764: 	    &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    765: 	    &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    766: 	    &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       767: 	}
1.269     raeburn   768: 
                    769:         if ($cgroup) {
                    770:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    771:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    772:             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    773:         }
1.275     raeburn   774:      
1.203     www       775: 	if ($uname) {
1.275     raeburn   776:             if ($othergrp) {
                    777:                 $r->print($othergrp);
                    778:             }
1.203     www       779: 	    &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    780: 	    &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    781: 	    &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    782: 	}
1.57      albertel  783: 
                    784:     } # end of $parmlev if/else
1.275     raeburn   785:     $r->print('<td bgcolor="#CCCCFF" align="center">'.$effective_parm.'</td>');
1.136     albertel  786: 
1.203     www       787:     if ($parmlev eq 'full') {
1.136     albertel  788:         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.201     www       789:                                         '.'.$$name{$which},$$symbp{$rid});
1.136     albertel  790:         my $sessionvaltype=$typeoutpar[$result];
                    791:         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
1.275     raeburn   792:         $r->print('<td bgcolor="#999999" align="center"><font color="#FFFFFF">'.
1.66      www       793:                   &valout($sessionval,$sessionvaltype).'&nbsp;'.
1.57      albertel  794:                   '</font></td>');
1.136     albertel  795:     }
1.44      albertel  796:     $r->print('</tr>');
1.57      albertel  797:     $r->print("\n");
1.44      albertel  798: }
1.59      matthew   799: 
1.44      albertel  800: sub print_td {
1.66      www       801:     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57      albertel  802:     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114     www       803:               ' align="center">');
1.269     raeburn   804:     if ($which<11 || $which > 12) {
1.114     www       805: 	$r->print(&plink($$typeoutpar[$which],
                    806: 			 $$display{$value},$$outpar[$which],
                    807: 			 $mprefix."$which",'parmform.pres','psub'));
                    808:     } else {
                    809: 	$r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
                    810:     }
                    811:     $r->print('</td>'."\n");
1.57      albertel  812: }
                    813: 
1.275     raeburn   814: sub print_usergroups {
                    815:     my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
                    816:     my $courseid = $env{'request.course.id'};
                    817:     my $output;
                    818:     my $symb = &symbcache($rid);
                    819:     my $symbparm=$symb.'.'.$what;
                    820:     my $map=(&Apache::lonnet::decode_symb($symb))[0];
                    821:     my $mapparm=$map.'___(all).'.$what;
                    822:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =
                    823:           &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what,
                    824:                                                                    $courseopt);
                    825:     my $bgcolor = $defbg;
                    826:     my $grp_parm;
                    827:     if (($coursereply) && ($cgroup ne $resultgroup)) { 
                    828:         if ($result > 3) {
                    829:             $bgcolor = '"#AAFFAA"';
                    830:             $grp_parm = &valout($coursereply,$resulttype);
                    831:         }
                    832:         $grp_parm = &valout($coursereply,$resulttype);
                    833:         $output = '<td bgcolor='.$bgcolor.' align="center">';
                    834:         if ($resultgroup && $resultlevel) {
                    835:             $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;
                    836:         } else {
                    837:             $output .= '&nbsp;';
                    838:         }
                    839:         $output .= '</td>';
                    840:     } else {
                    841:         $output .= '<td bgcolor='.$bgcolor.'>&nbsp;</td>';
                    842:     }
                    843:     return ($coursereply,$output,$grp_parm,$resultgroup);
                    844: }
                    845: 
                    846: sub parm_control_group {
                    847:     my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_;
                    848:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    849:     my $grpfound = 0;
                    850:     my @levels = ($symbparm,$mapparm,$what);
                    851:     my @levelnames = ('resource','map/folder','general');
                    852:     foreach my $group (@{$usersgroups}) {
                    853:         if ($grpfound) { last; }
                    854:         for (my $i=0; $i<@levels; $i++) {
                    855:             my $item = $courseid.'.['.$group.'].'.$levels[$i];
                    856:             if (defined($$courseopt{$item})) {
                    857:                 $coursereply = $$courseopt{$item};
                    858:                 $resultitem = $item;
                    859:                 $resultgroup = $group;
                    860:                 $resultlevel = $levelnames[$i];
                    861:                 $resulttype = $$courseopt{$item.'.type'};
                    862:                 $grpfound = 1;
                    863:                 last;
                    864:             }
                    865:         }
                    866:     }
                    867:     return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    868: }
1.201     www       869: 
1.63      bowersj2  870: =pod
                    871: 
                    872: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
                    873: 
                    874: Input: See list below:
                    875: 
                    876: =over 4
                    877: 
                    878: =item B<ids>: An array that will contain all of the ids in the course.
                    879: 
                    880: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
                    881: 
1.171     www       882: =item B<keyp>: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
1.63      bowersj2  883: 
                    884: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
                    885: 
                    886: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
                    887: 
                    888: =item B<allkeys>: hash, full key to part->display value (what's display value?)
                    889: 
                    890: =item B<allmaps>: hash, ???
                    891: 
                    892: =item B<fcat>: ???
                    893: 
                    894: =item B<defp>: hash, ???
                    895: 
                    896: =item B<mapp>: ??
                    897: 
                    898: =item B<symbp>: hash, id->full sym?
                    899: 
                    900: =back
                    901: 
                    902: =cut
                    903: 
                    904: sub extractResourceInformation {
                    905:     my $ids = shift;
                    906:     my $typep = shift;
                    907:     my $keyp = shift;
                    908:     my $allparms = shift;
                    909:     my $allparts = shift;
                    910:     my $allmaps = shift;
                    911:     my $mapp = shift;
                    912:     my $symbp = shift;
1.82      www       913:     my $maptitles=shift;
1.196     www       914:     my $uris=shift;
1.210     www       915:     my $keyorder=shift;
1.211     www       916:     my $defkeytype=shift;
1.196     www       917: 
1.210     www       918:     my $keyordercnt=100;
1.63      bowersj2  919: 
1.196     www       920:     my $navmap = Apache::lonnavmaps::navmap->new();
                    921:     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
                    922:     foreach my $resource (@allres) {
                    923: 	my $id=$resource->id();
                    924:         my ($mapid,$resid)=split(/\./,$id);
                    925: 	if ($mapid eq '0') { next; }
                    926: 	$$ids[$#$ids+1]=$id;
                    927: 	my $srcf=$resource->src();
                    928: 	$srcf=~/\.(\w+)$/;
                    929: 	$$typep{$id}=$1;
                    930: 	$$keyp{$id}='';
                    931:         $$uris{$id}=$srcf;
                    932: 	foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
                    933: 	    if ($_=~/^parameter\_(.*)/) {
                    934: 		my $key=$_;
1.209     www       935: # Hidden parameters
                    936: 		if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {
                    937: 		    next;
1.63      bowersj2  938: 		}
1.196     www       939: 		my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
                    940: 		my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
                    941: 		my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
1.209     www       942: #
                    943: # allparms is a hash of parameter names
                    944: #
1.196     www       945: 		my $parmdis = $display;
1.209     www       946: 		$parmdis =~ s/\[Part.*$//g;
                    947:                 $$allparms{$name}=$parmdis;
1.211     www       948: 		$$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');
1.209     www       949: #
                    950: # allparts is a hash of all parts
                    951: #
                    952: 		$$allparts{$part} = "Part: $part";
                    953: #
                    954: # Remember all keys going with this resource
                    955: #
1.196     www       956: 		if ($$keyp{$id}) {
                    957: 		    $$keyp{$id}.=','.$key;
1.175     albertel  958: 		} else {
1.196     www       959: 		    $$keyp{$id}=$key;
1.175     albertel  960: 		}
1.210     www       961: #
                    962: # Put in order
                    963: # 
                    964:                 unless ($$keyorder{$key}) {
                    965:                     $$keyorder{$key}=$keyordercnt;
                    966:                     $keyordercnt++;
                    967: 		}
                    968: 
1.63      bowersj2  969: 	    }
                    970: 	}
1.196     www       971: 	$$mapp{$id}=
                    972: 	    &Apache::lonnet::declutter($resource->enclosing_map_src());
                    973: 	$$mapp{$mapid}=$$mapp{$id};
                    974: 	$$allmaps{$mapid}=$$mapp{$id};
                    975: 	if ($mapid eq '1') {
                    976: 	    $$maptitles{$mapid}='Main Course Documents';
                    977: 	} else {
                    978: 	    $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
                    979: 	}
                    980: 	$$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
                    981: 	$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
                    982: 	$$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63      bowersj2  983:     }
                    984: }
                    985: 
1.208     www       986: 
                    987: ##################################################
                    988: ##################################################
                    989: 
1.213     www       990: sub isdateparm {
                    991:     my $type=shift;
                    992:     return (($type=~/^date/) && (!($type eq 'date_interval')));
                    993: }
                    994: 
1.208     www       995: sub parmmenu {
1.211     www       996:     my ($r,$allparms,$pscat,$keyorder)=@_;
1.208     www       997:     my $tempkey;
                    998:     $r->print(<<ENDSCRIPT);
                    999: <script type="text/javascript">
                   1000:     function checkall(value, checkName) {
                   1001: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1002:             ele = document.forms.parmform.elements[i];
                   1003:             if (ele.name == checkName) {
                   1004:                 document.forms.parmform.elements[i].checked=value;
                   1005:             }
                   1006:         }
                   1007:     }
1.210     www      1008: 
                   1009:     function checkthis(thisvalue, checkName) {
                   1010: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1011:             ele = document.forms.parmform.elements[i];
                   1012:             if (ele.name == checkName) {
                   1013: 		if (ele.value == thisvalue) {
                   1014: 		    document.forms.parmform.elements[i].checked=true;
                   1015: 		}
                   1016:             }
                   1017:         }
                   1018:     }
                   1019: 
                   1020:     function checkdates() {
                   1021: 	checkthis('duedate','pscat');
                   1022:  	checkthis('opendate','pscat');
                   1023: 	checkthis('answerdate','pscat');
1.218     www      1024:     }
                   1025: 
                   1026:     function checkdisset() {
                   1027: 	checkthis('discussend','pscat');
                   1028:  	checkthis('discusshide','pscat');
                   1029:     }
                   1030: 
                   1031:     function checkcontdates() {
                   1032: 	checkthis('contentopen','pscat');
                   1033:  	checkthis('contentclose','pscat');
                   1034:     }
                   1035:  
1.210     www      1036: 
                   1037:     function checkvisi() {
                   1038: 	checkthis('hiddenresource','pscat');
                   1039:  	checkthis('encrypturl','pscat');
                   1040: 	checkthis('problemstatus','pscat');
                   1041: 	checkthis('contentopen','pscat');
                   1042: 	checkthis('opendate','pscat');
                   1043:     }
                   1044: 
                   1045:     function checkparts() {
                   1046: 	checkthis('hiddenparts','pscat');
                   1047: 	checkthis('display','pscat');
                   1048: 	checkthis('ordered','pscat');
                   1049:     }
                   1050: 
                   1051:     function checkstandard() {
                   1052:         checkall(false,'pscat');
                   1053: 	checkdates();
                   1054: 	checkthis('weight','pscat');
                   1055: 	checkthis('maxtries','pscat');
                   1056:     }
                   1057: 
1.208     www      1058: </script>
                   1059: ENDSCRIPT
1.209     www      1060:     $r->print();
1.208     www      1061:     $r->print("\n<table><tr>");
                   1062:     my $cnt=0;
1.211     www      1063:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.235     albertel 1064: 	$r->print("\n<td><font size='-1'><label><input type='checkbox' name='pscat' ");
1.208     www      1065: 	$r->print('value="'.$tempkey.'"');
                   1066: 	if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                   1067: 	    $r->print(' checked');
                   1068: 	}
1.235     albertel 1069: 	$r->print('>'.$$allparms{$tempkey}.'</label></font></td>');
1.209     www      1070:  	$cnt++;
                   1071:         if ($cnt==3) {
                   1072: 	    $r->print("</tr>\n<tr>");
                   1073: 	    $cnt=0;
                   1074: 	}
1.208     www      1075:     }
                   1076:     $r->print('
                   1077: </tr><tr><td>
1.233     albertel 1078: <a href="javascript:checkall(true, \'pscat\')">Select&nbsp;All</a><br />
                   1079: <a href="javascript:checkstandard()">Select&nbsp;Common&nbsp;Only</a>
1.210     www      1080: </td><td>
1.233     albertel 1081: <a href="javascript:checkdates()">Add&nbsp;Problem&nbsp;Dates</a>
                   1082: <a href="javascript:checkcontdates()">Add&nbsp;Content&nbsp;Dates</a><br />
                   1083: <a href="javascript:checkdisset()">Add&nbsp;Discussion&nbsp;Settings</a>
                   1084: <a href="javascript:checkvisi()">Add&nbsp;Visibilities</a><br />
                   1085: <a href="javascript:checkparts()">Add&nbsp;Part&nbsp;Parameters</a>
1.210     www      1086: </td><td>
1.233     albertel 1087: <a href="javascript:checkall(false, \'pscat\')">Unselect&nbsp;All</a>
1.208     www      1088: </td>
                   1089: ');
                   1090:     $r->print('</tr></table>');
                   1091: }
                   1092: 
1.209     www      1093: sub partmenu {
                   1094:     my ($r,$allparts,$psprt)=@_;
1.211     www      1095:     $r->print('<select multiple name="psprt" size="8">');
1.208     www      1096:     $r->print('<option value="all"');
                   1097:     $r->print(' selected') unless (@{$psprt});
                   1098:     $r->print('>'.&mt('All Parts').'</option>');
                   1099:     my %temphash=();
                   1100:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.234     albertel 1101:     foreach my $tempkey (sort {
                   1102: 	if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
                   1103:     } keys(%{$allparts})) {
1.208     www      1104: 	unless ($tempkey =~ /\./) {
                   1105: 	    $r->print('<option value="'.$tempkey.'"');
                   1106: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
                   1107: 		$r->print(' selected');
                   1108: 	    }
                   1109: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                   1110: 	}
                   1111:     }
1.209     www      1112:     $r->print('</select>');
                   1113: }
                   1114: 
                   1115: sub usermenu {
1.275     raeburn  1116:     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
1.209     www      1117:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                   1118:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                   1119:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
                   1120:     my %lt=&Apache::lonlocal::texthash(
1.269     raeburn  1121: 		    'se'    => "Section",
                   1122:                     'gr'    => "Group",
1.209     www      1123: 		    'fu'    => "For User",
                   1124: 		    'oi'    => "or ID",
                   1125: 		    'ad'    => "at Domain"
                   1126: 				       );
                   1127:     my $sections='';
1.300     albertel 1128:     my %sectionhash = &Apache::loncommon::get_sections();
                   1129: 
1.269     raeburn  1130:     my $groups;
1.307     raeburn  1131:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1132: 
1.300     albertel 1133:     if (%sectionhash) {
1.269     raeburn  1134:         $sections=$lt{'se'}.': <select name="csec"';
1.299     albertel 1135:         if (%grouphash && $parmlev ne 'full') {
1.269     raeburn  1136:             $sections .= qq| onchange="group_or_section('csec')" |;
                   1137:         }
                   1138:         $sections .= '>';
1.275     raeburn  1139: 	foreach my $section ('',sort keys %sectionhash) {
                   1140: 	    $sections.='<option value="'.$section.'" '.
                   1141: 		($section eq $csec?'selected="selected"':'').'>'.$section.
                   1142:                                                               '</option>';
1.209     www      1143:         }
                   1144:         $sections.='</select>';
1.269     raeburn  1145:     }
1.300     albertel 1146:     if (%sectionhash && %grouphash && $parmlev ne 'full') {
1.269     raeburn  1147:         $sections .= '&nbsp;or&nbsp;';
                   1148:         $sections .= qq|
                   1149: <script type="text/javascript">
                   1150: function group_or_section(caller) {
                   1151:    if (caller == "cgroup") {
                   1152:        if (document.parmform.cgroup.selectedIndex != 0) {
                   1153:            document.parmform.csec.selectedIndex = 0;
                   1154:        }
                   1155:    } else {
                   1156:        if (document.parmform.csec.selectedIndex != 0) {
                   1157:            document.parmform.cgroup.selectedIndex = 0;
                   1158:        }
                   1159:    }
                   1160: }
                   1161: </script>
                   1162: |;
                   1163:     } else {
                   1164:         $sections .= qq|
                   1165: <script type="text/javascript">
                   1166: function group_or_section(caller) {
                   1167:     return;
                   1168: }
                   1169: </script>
                   1170: |;
                   1171:     } 
1.299     albertel 1172: 
                   1173:     if (%grouphash) {
1.269     raeburn  1174:         $groups=$lt{'gr'}.': <select name="cgroup"';
1.300     albertel 1175:         if (%sectionhash && $env{'form.action'} eq 'settable') {
1.269     raeburn  1176:             $groups .= qq| onchange="group_or_section('cgroup')" |;
                   1177:         }
                   1178:         $groups .= '>';
1.275     raeburn  1179:         foreach my $grp ('',sort keys %grouphash) {
                   1180:             $groups.='<option value="'.$grp.'" ';
                   1181:             if ($grp eq $cgroup) {
                   1182:                 unless ((defined($uname)) && ($grp eq '')) {
                   1183:                     $groups .=  'selected="selected" ';
                   1184:                 }
                   1185:             } elsif (!defined($cgroup)) {
                   1186:                 if (@{$usersgroups} == 1) {
                   1187:                     if ($grp eq $$usersgroups[0]) {
                   1188:                         $groups .=  'selected="selected" ';
                   1189:                     }
                   1190:                 }
                   1191:             }
                   1192:             $groups .= '>'.$grp.'</option>';
1.269     raeburn  1193:         }
                   1194:         $groups.='</select>';
                   1195:     }
                   1196:     $r->print(<<ENDMENU);
1.209     www      1197: <b>
                   1198: $sections
1.269     raeburn  1199: $groups
1.209     www      1200: <br />
                   1201: $lt{'fu'} 
                   1202: <input type="text" value="$uname" size="12" name="uname" />
                   1203: $lt{'oi'}
                   1204: <input type="text" value="$id" size="12" name="id" /> 
                   1205: $lt{'ad'}
                   1206: $chooseopt
                   1207: </b>
                   1208: ENDMENU
                   1209: }
                   1210: 
                   1211: sub displaymenu {
1.211     www      1212:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www      1213:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                   1214: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www      1215:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.209     www      1216:     $r->print('</td><td>');
                   1217:     &partmenu($r,$allparts,$psprt);
                   1218:     $r->print('</td></tr></table>');
                   1219: }
                   1220: 
                   1221: sub mapmenu {
                   1222:     my ($r,$allmaps,$pschp,$maptitles)=@_;
1.231     www      1223:     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');
1.209     www      1224:     $r->print('<select name="pschp">');
                   1225:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                   1226:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www      1227: 	$r->print('<option value="'.$_.'"');
1.209     www      1228: 	if (($pschp eq $_)) { $r->print(' selected'); }
                   1229: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                   1230:     }
                   1231:     $r->print("</select>");
                   1232: }
                   1233: 
                   1234: sub levelmenu {
                   1235:     my ($r,$alllevs,$parmlev)=@_;
1.231     www      1236:     $r->print('<b>'.&mt('Select Parameter Level').
                   1237: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');
1.209     www      1238:     $r->print('<select name="parmlev">');
                   1239:     foreach (reverse sort keys %{$alllevs}) {
                   1240: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                   1241: 	if ($parmlev eq $$alllevs{$_}) {
                   1242: 	    $r->print(' selected'); 
                   1243: 	}
                   1244: 	$r->print('>'.$_.'</option>');
1.208     www      1245:     }
1.209     www      1246:     $r->print("</select>");
1.208     www      1247: }
                   1248: 
1.211     www      1249: 
                   1250: sub sectionmenu {
                   1251:     my ($r,$selectedsections)=@_;
1.300     albertel 1252:     my %sectionhash = &Apache::loncommon::get_sections();
                   1253:     return if (!%sectionhash);
                   1254: 
                   1255:     $r->print('<select name="Section" multiple="true" size="8" >');
                   1256:     foreach my $s ('all',sort keys %sectionhash) {
                   1257: 	$r->print('    <option value="'.$s.'"');
                   1258: 	foreach (@{$selectedsections}) {
                   1259: 	    if ($s eq $_) {
                   1260: 		$r->print(' selected');
                   1261: 		last;
1.212     www      1262: 	    }
                   1263: 	}
1.300     albertel 1264: 	$r->print('>'.$s."</option>\n");
                   1265:     }
                   1266:     $r->print("</select>\n");
1.269     raeburn  1267: }
                   1268: 
                   1269: sub groupmenu {
                   1270:     my ($r,$selectedgroups)=@_;
1.307     raeburn  1271:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1272:     return if (!%grouphash);
                   1273: 
                   1274:     $r->print('<select name="Group" multiple="true" size="8" >');
                   1275:     foreach my $group (sort(keys(%grouphash))) {
                   1276: 	$r->print('    <option value="'.$group.'"');
                   1277: 	foreach (@{$selectedgroups}) {
                   1278: 	    if ($group eq $_) {
                   1279: 		$r->print(' selected');
                   1280: 		last;
                   1281: 	    }
                   1282: 	}
                   1283: 	$r->print('>'.$group."</option>\n");
1.211     www      1284:     }
1.299     albertel 1285:     $r->print("</select>\n");
1.211     www      1286: }
                   1287: 
1.269     raeburn  1288: 
1.210     www      1289: sub keysplit {
                   1290:     my $keyp=shift;
                   1291:     return (split(/\,/,$keyp));
                   1292: }
                   1293: 
                   1294: sub keysinorder {
                   1295:     my ($name,$keyorder)=@_;
                   1296:     return sort {
                   1297: 	$$keyorder{$a} <=> $$keyorder{$b};
                   1298:     } (keys %{$name});
                   1299: }
                   1300: 
1.236     albertel 1301: sub keysinorder_bytype {
                   1302:     my ($name,$keyorder)=@_;
                   1303:     return sort {
                   1304: 	my $ta=(split('_',$a))[-1];
                   1305: 	my $tb=(split('_',$b))[-1];
                   1306: 	if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
                   1307: 	    return ($a cmp $b);
                   1308: 	}
                   1309: 	$$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
                   1310:     } (keys %{$name});
                   1311: }
                   1312: 
1.211     www      1313: sub keysindisplayorder {
                   1314:     my ($name,$keyorder)=@_;
                   1315:     return sort {
                   1316: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                   1317:     } (keys %{$name});
                   1318: }
                   1319: 
1.214     www      1320: sub sortmenu {
                   1321:     my ($r,$sortorder)=@_;
1.236     albertel 1322:     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214     www      1323:     if ($sortorder eq 'realmstudent') {
                   1324:        $r->print(' checked="on"');
                   1325:     }
                   1326:     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236     albertel 1327:     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214     www      1328:     if ($sortorder eq 'studentrealm') {
                   1329:        $r->print(' checked="on"');
                   1330:     }
1.236     albertel 1331:     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
                   1332: 	      '</label>');
1.214     www      1333: }
                   1334: 
1.211     www      1335: sub standardkeyorder {
                   1336:     return ('parameter_0_opendate' => 1,
                   1337: 	    'parameter_0_duedate' => 2,
                   1338: 	    'parameter_0_answerdate' => 3,
                   1339: 	    'parameter_0_interval' => 4,
                   1340: 	    'parameter_0_weight' => 5,
                   1341: 	    'parameter_0_maxtries' => 6,
                   1342: 	    'parameter_0_hinttries' => 7,
                   1343: 	    'parameter_0_contentopen' => 8,
                   1344: 	    'parameter_0_contentclose' => 9,
                   1345: 	    'parameter_0_type' => 10,
                   1346: 	    'parameter_0_problemstatus' => 11,
                   1347: 	    'parameter_0_hiddenresource' => 12,
                   1348: 	    'parameter_0_hiddenparts' => 13,
                   1349: 	    'parameter_0_display' => 14,
                   1350: 	    'parameter_0_ordered' => 15,
                   1351: 	    'parameter_0_tol' => 16,
                   1352: 	    'parameter_0_sig' => 17,
1.218     www      1353: 	    'parameter_0_turnoffunit' => 18,
                   1354:             'parameter_0_discussend' => 19,
                   1355:             'parameter_0_discusshide' => 20);
1.211     www      1356: }
                   1357: 
1.59      matthew  1358: ##################################################
                   1359: ##################################################
                   1360: 
                   1361: =pod
                   1362: 
                   1363: =item assessparms
                   1364: 
                   1365: Show assessment data and parameters.  This is a large routine that should
                   1366: be simplified and shortened... someday.
                   1367: 
                   1368: Inputs: $r
                   1369: 
                   1370: Returns: nothing
                   1371: 
1.63      bowersj2 1372: Variables used (guessed by Jeremy):
                   1373: 
                   1374: =over 4
                   1375: 
                   1376: =item B<pscat>: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type.
                   1377: 
                   1378: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1379: 
                   1380: =item B<allmaps>:
                   1381: 
                   1382: =back
                   1383: 
1.59      matthew  1384: =cut
                   1385: 
                   1386: ##################################################
                   1387: ##################################################
1.30      www      1388: sub assessparms {
1.1       www      1389: 
1.43      albertel 1390:     my $r=shift;
1.201     www      1391: 
                   1392:     my @ids=();
                   1393:     my %symbp=();
                   1394:     my %mapp=();
                   1395:     my %typep=();
                   1396:     my %keyp=();
                   1397:     my %uris=();
                   1398:     my %maptitles=();
                   1399: 
1.2       www      1400: # -------------------------------------------------------- Variable declaration
1.209     www      1401: 
1.129     www      1402:     my %allmaps=();
                   1403:     my %alllevs=();
1.57      albertel 1404: 
1.187     www      1405:     my $uname;
                   1406:     my $udom;
                   1407:     my $uhome;
                   1408:     my $csec;
1.269     raeburn  1409:     my $cgroup;
1.275     raeburn  1410:     my @usersgroups = ();
1.187     www      1411:  
1.190     albertel 1412:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1413: 
1.57      albertel 1414:     $alllevs{'Resource Level'}='full';
1.215     www      1415:     $alllevs{'Map/Folder Level'}='map';
1.57      albertel 1416:     $alllevs{'Course Level'}='general';
                   1417: 
                   1418:     my %allparms;
                   1419:     my %allparts;
1.210     www      1420: #
                   1421: # Order in which these parameters will be displayed
                   1422: #
1.211     www      1423:     my %keyorder=&standardkeyorder();
                   1424: 
1.43      albertel 1425:     @ids=();
                   1426:     %symbp=();
                   1427:     %typep=();
                   1428: 
                   1429:     my $message='';
                   1430: 
1.190     albertel 1431:     $csec=$env{'form.csec'};
1.269     raeburn  1432:     $cgroup=$env{'form.cgroup'};
1.188     www      1433: 
1.190     albertel 1434:     if      ($udom=$env{'form.udom'}) {
                   1435:     } elsif ($udom=$env{'request.role.domain'}) {
                   1436:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1437:     } else {
                   1438: 	$udom=$r->dir_config('lonDefDomain');
                   1439:     }
1.43      albertel 1440: 
1.134     albertel 1441:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1442:     my $pschp=$env{'form.pschp'};
1.134     albertel 1443:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1444:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1445: 
1.43      albertel 1446:     my $pssymb='';
1.57      albertel 1447:     my $parmlev='';
                   1448:  
1.190     albertel 1449:     unless ($env{'form.parmlev'}) {
1.57      albertel 1450:         $parmlev = 'map';
                   1451:     } else {
1.190     albertel 1452:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1453:     }
1.26      www      1454: 
1.29      www      1455: # ----------------------------------------------- Was this started from grades?
                   1456: 
1.190     albertel 1457:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1458: 	&& (!$env{'form.dis'})) {
                   1459: 	my $url=$env{'form.url'};
1.194     albertel 1460: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1461: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1462: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1463: 	$pschp='';
1.57      albertel 1464:         $parmlev = 'full';
1.190     albertel 1465:     } elsif ($env{'form.symb'}) {
                   1466: 	$pssymb=$env{'form.symb'};
1.92      albertel 1467: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1468: 	$pschp='';
1.57      albertel 1469:         $parmlev = 'full';
1.43      albertel 1470:     } else {
1.190     albertel 1471: 	$env{'form.url'}='';
1.43      albertel 1472:     }
                   1473: 
1.190     albertel 1474:     my $id=$env{'form.id'};
1.43      albertel 1475:     if (($id) && ($udom)) {
                   1476: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1477: 	if ($uname) {
                   1478: 	    $id='';
                   1479: 	} else {
                   1480: 	    $message=
1.133     www      1481: 		"<font color=red>".&mt("Unknown ID")." '$id' ".
                   1482: 		&mt('at domain')." '$udom'</font>";
1.43      albertel 1483: 	}
                   1484:     } else {
1.190     albertel 1485: 	$uname=$env{'form.uname'};
1.43      albertel 1486:     }
                   1487:     unless ($udom) { $uname=''; }
                   1488:     $uhome='';
                   1489:     if ($uname) {
                   1490: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1491:         if ($uhome eq 'no_host') {
                   1492: 	    $message=
1.133     www      1493: 		"<font color=red>".&mt("Unknown user")." '$uname' ".
                   1494: 		&mt("at domain")." '$udom'</font>";
1.43      albertel 1495: 	    $uname='';
1.12      www      1496:         } else {
1.103     albertel 1497: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1498: 					      $env{'request.course.id'});
1.269     raeburn  1499:             
1.43      albertel 1500: 	    if ($csec eq '-1') {
                   1501: 		$message="<font color=red>".
1.133     www      1502: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
                   1503: 		    &mt("not in this course")."</font>";
1.43      albertel 1504: 		$uname='';
1.190     albertel 1505: 		$csec=$env{'form.csec'};
1.269     raeburn  1506:                 $cgroup=$env{'form.cgroup'};
1.43      albertel 1507: 	    } else {
                   1508: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1509: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1510: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1511: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1512: 			.$name{'lastname'}.' '.$name{'generation'}.
1.133     www      1513: 			    "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1514: 	    }
1.297     raeburn  1515:             @usersgroups = &Apache::lonnet::get_users_groups(
1.275     raeburn  1516:                                        $udom,$uname,$env{'request.course.id'});
1.297     raeburn  1517:             if (@usersgroups > 0) {
1.306     albertel 1518:                 unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275     raeburn  1519:                     $cgroup = $usersgroups[0];
1.297     raeburn  1520:                 }
1.269     raeburn  1521:             }
1.12      www      1522:         }
1.43      albertel 1523:     }
1.2       www      1524: 
1.43      albertel 1525:     unless ($csec) { $csec=''; }
1.269     raeburn  1526:     unless ($cgroup) { $cgroup=''; }
1.12      www      1527: 
1.14      www      1528: # --------------------------------------------------------- Get all assessments
1.210     www      1529:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1530: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1531: 				\%keyorder);
1.63      bowersj2 1532: 
1.57      albertel 1533:     $mapp{'0.0'} = '';
                   1534:     $symbp{'0.0'} = '';
1.99      albertel 1535: 
1.14      www      1536: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1537:     if ($env{'form.pres_marker'}) {
1.205     www      1538:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1539:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1540:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1541: 	for (my $i=0;$i<=$#markers;$i++) {
                   1542: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1543: 				 $values[$i],
                   1544: 				 $types[$i],
1.269     raeburn  1545: 				 $uname,$udom,$csec,$cgroup);
1.205     www      1546: 	}
1.68      www      1547: # ---------------------------------------------------------------- Done storing
1.130     www      1548: 	$message.='<h3>'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'</h3>';
1.68      www      1549:     }
1.57      albertel 1550: #----------------------------------------------- if all selected, fill in array
1.209     www      1551:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1552:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1553:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1554: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1555: 
1.209     www      1556:     &startpage($r);
1.57      albertel 1557: 
1.44      albertel 1558:     foreach ('tolerance','date_default','date_start','date_end',
                   1559: 	     'date_interval','int','float','string') {
                   1560: 	$r->print('<input type="hidden" value="'.
1.190     albertel 1561: 		  $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44      albertel 1562:     }
1.57      albertel 1563:                         
1.44      albertel 1564:     if (!$pssymb) {
1.209     www      1565:         $r->print('<table border="1"><tr><td>');
                   1566:         &levelmenu($r,\%alllevs,$parmlev);
1.128     albertel 1567: 	if ($parmlev ne 'general') {
1.209     www      1568:             $r->print('<td>');
                   1569: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1570: 	    $r->print('</td>');
1.128     albertel 1571: 	}
1.209     www      1572:         $r->print('</td></tr></table>');
1.211     www      1573: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1574:     } else {
1.125     www      1575:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.209     www      1576:         $r->print(&mt('Specific Resource').": ".$resource.
1.238     www      1577:                   '<input type="hidden" value="'.$pssymb.'" name="symb">'.
                   1578: 		  '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
                   1579: 		  ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
1.57      albertel 1580:     }
1.275     raeburn  1581:     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);    
1.57      albertel 1582: 
1.210     www      1583:     $r->print('<p>'.$message.'</p>');
                   1584: 
1.209     www      1585:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1586: 
                   1587:     my @temp_pscat;
                   1588:     map {
                   1589:         my $cat = $_;
                   1590:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1591:     } @pscat;
                   1592: 
                   1593:     @pscat = @temp_pscat;
                   1594: 
1.209     www      1595:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1596: # ----------------------------------------------------------------- Start Table
1.57      albertel 1597:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1598:         my $csuname=$env{'user.name'};
                   1599:         my $csudom=$env{'user.domain'};
1.57      albertel 1600: 
1.203     www      1601:         if ($parmlev eq 'full') {
1.57      albertel 1602:            my $coursespan=$csec?8:5;
1.275     raeburn  1603:            my $userspan=3;
1.269     raeburn  1604:            if ($cgroup ne '') {
                   1605:               $coursespan += 3;
                   1606:            } 
                   1607:       
1.57      albertel 1608:            $r->print('<p><table border=2>');
                   1609:            $r->print('<tr><td colspan=5></td>');
1.130     www      1610:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1611:            if ($uname) {
1.275     raeburn  1612:                if (@usersgroups > 1) {
                   1613:                    $userspan ++;
                   1614:                }
                   1615:                $r->print('<th colspan="'.$userspan.'" rowspan="2">');
1.130     www      1616:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1617:            }
1.133     www      1618: 	   my %lt=&Apache::lonlocal::texthash(
                   1619: 				  'pie'    => "Parameter in Effect",
                   1620: 				  'csv'    => "Current Session Value",
                   1621:                                   'at'     => 'at',
                   1622:                                   'rl'     => "Resource Level",
                   1623: 				  'ic'     => 'in Course',
                   1624: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1625: 				  'type'   => 'Type',
1.133     www      1626: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1627: 				  'part'   => 'Part',
1.133     www      1628:                                   'pn'     => 'Parameter Name',
                   1629: 				  'def'    => 'default',
                   1630: 				  'femof'  => 'from Enclosing Map or Folder',
                   1631: 				  'gen'    => 'general',
                   1632: 				  'foremf' => 'for Enclosing Map or Folder',
                   1633: 				  'fr'     => 'for Resource'
                   1634: 					      );
1.57      albertel 1635:            $r->print(<<ENDTABLETWO);
1.133     www      1636: <th rowspan=3>$lt{'pie'}</th>
                   1637: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1638: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1639: <th colspan=1>$lt{'ic'}</th>
                   1640: 
1.10      www      1641: ENDTABLETWO
1.57      albertel 1642:            if ($csec) {
1.133     www      1643:                 $r->print("<th colspan=3>".
1.269     raeburn  1644: 			  &mt("in Section")." $csec</th>");
                   1645:            }
                   1646:            if ($cgroup) {
                   1647:                 $r->print("<th colspan=3>".
                   1648:                           &mt("in Group")." $cgroup</th>");
1.57      albertel 1649:            }
                   1650:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1651: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1652: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1653: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1654: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1655: ENDTABLEHEADFOUR
1.57      albertel 1656: 
                   1657:            if ($csec) {
1.130     www      1658:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1659:            }
                   1660: 
1.269     raeburn  1661:            if ($cgroup) {
                   1662:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
                   1663:            }
                   1664: 
1.57      albertel 1665:            if ($uname) {
1.275     raeburn  1666:                if (@usersgroups > 1) {
                   1667:                    $r->print('<th>'.&mt('Control by other group?').'</th>');
                   1668:                }
1.130     www      1669:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1670:            }
                   1671: 
                   1672:            $r->print('</tr>');
                   1673: 
                   1674:            my $defbgone='';
                   1675:            my $defbgtwo='';
1.269     raeburn  1676:            my $defbgthree = '';
1.57      albertel 1677: 
                   1678:            foreach (@ids) {
                   1679: 
                   1680:                 my $rid=$_;
                   1681:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1682: 
1.152     albertel 1683:                 if ((!$pssymb && 
                   1684: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1685: 		    ||
                   1686: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1687: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1688:                     if ($defbgone eq '"#E0E099"') {
                   1689:                         $defbgone='"#E0E0DD"';
1.57      albertel 1690:                     } else {
1.184     albertel 1691:                         $defbgone='"#E0E099"';
1.57      albertel 1692:                     }
1.184     albertel 1693:                     if ($defbgtwo eq '"#FFFF99"') {
                   1694:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1695:                     } else {
1.184     albertel 1696:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1697:                     }
1.269     raeburn  1698:                     if ($defbgthree eq '"#FFBB99"') {
                   1699:                         $defbgthree='"#FFBBDD"';
                   1700:                     } else {
                   1701:                         $defbgthree='"#FFBB99"';
                   1702:                     }
                   1703: 
1.57      albertel 1704:                     my $thistitle='';
                   1705:                     my %name=   ();
                   1706:                     undef %name;
                   1707:                     my %part=   ();
                   1708:                     my %display=();
                   1709:                     my %type=   ();
                   1710:                     my %default=();
1.196     www      1711:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1712: 
1.210     www      1713:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1714:                         my $tempkeyp = $_;
                   1715:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1716:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1717:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1718:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1719:                           unless ($display{$_}) { $display{$_}=''; }
                   1720:                           $display{$_}.=' ('.$name{$_}.')';
                   1721:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1722:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1723:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1724:                         }
                   1725:                     }
                   1726:                     my $totalparms=scalar keys %name;
                   1727:                     if ($totalparms>0) {
                   1728:                         my $firstrow=1;
1.274     albertel 1729: 			my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.57      albertel 1730:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1731:                              ' rowspan='.$totalparms.
                   1732:                              '><tt><font size=-1>'.
                   1733:                              join(' / ',split(/\//,$uri)).
                   1734:                              '</font></tt><p><b>'.
1.154     albertel 1735:                              "<a href=\"javascript:openWindow('".
1.274     albertel 1736: 				  &Apache::lonnet::clutter($uri).'?symb='.
1.308     www      1737: 				  &escape($symbp{$rid}).
1.57      albertel 1738:                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127     albertel 1739:                              " TARGET=_self>$title");
1.57      albertel 1740: 
                   1741:                         if ($thistitle) {
                   1742:                             $r->print(' ('.$thistitle.')');
                   1743:                         }
                   1744:                         $r->print('</a></b></td>');
                   1745:                         $r->print('<td bgcolor='.$defbgtwo.
                   1746:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1747:                                       '</td>');
                   1748: 
                   1749:                         $r->print('<td bgcolor='.$defbgone.
                   1750:                                       ' rowspan='.$totalparms.
1.238     www      1751:                                       '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57      albertel 1752: 
1.236     albertel 1753:                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57      albertel 1754:                             unless ($firstrow) {
                   1755:                                 $r->print('<tr>');
                   1756:                             } else {
                   1757:                                 undef $firstrow;
                   1758:                             }
1.201     www      1759:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1760:                                        \%type,\%display,$defbgone,$defbgtwo,
1.269     raeburn  1761:                                        $defbgthree,$parmlev,$uname,$udom,$csec,
1.275     raeburn  1762:                                                             $cgroup,\@usersgroups);
1.57      albertel 1763:                         }
                   1764:                     }
                   1765:                 }
                   1766:             } # end foreach ids
1.43      albertel 1767: # -------------------------------------------------- End entry for one resource
1.57      albertel 1768:             $r->print('</table>');
1.203     www      1769:         } # end of  full
1.57      albertel 1770: #--------------------------------------------------- Entry for parm level map
                   1771:         if ($parmlev eq 'map') {
                   1772:             my $defbgone = '"E0E099"';
                   1773:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1774:             my $defbgthree = '"FFBB99"';
1.57      albertel 1775: 
                   1776:             my %maplist;
                   1777: 
                   1778:             if ($pschp eq 'all') {
                   1779:                 %maplist = %allmaps; 
                   1780:             } else {
                   1781:                 %maplist = ($pschp => $mapp{$pschp});
                   1782:             }
                   1783: 
                   1784: #-------------------------------------------- for each map, gather information
                   1785:             my $mapid;
1.60      albertel 1786: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1787:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1788: 
                   1789: #-----------------------  loop through ids and get all parameter types for map
                   1790: #-----------------------------------------          and associated information
                   1791:                 my %name = ();
                   1792:                 my %part = ();
                   1793:                 my %display = ();
                   1794:                 my %type = ();
                   1795:                 my %default = ();
                   1796:                 my $map = 0;
                   1797: 
                   1798: #		$r->print("Catmarker: @catmarker<br />\n");
                   1799:                
                   1800:                 foreach (@ids) {
                   1801:                   ($map)=(/([\d]*?)\./);
                   1802:                   my $rid = $_;
                   1803:         
                   1804: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1805: 
                   1806:                   if ($map eq $mapid) {
1.196     www      1807:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1808: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1809: 
                   1810: #--------------------------------------------------------------------
                   1811: # @catmarker contains list of all possible parameters including part #s
                   1812: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1813: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1814: # When storing information, store as part 0
                   1815: # When requesting information, request from full part
                   1816: #-------------------------------------------------------------------
1.210     www      1817:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1818:                       my $tempkeyp = $_;
                   1819:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1820:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1821:                       
                   1822:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1823:                         $part{$tempkeyp}="0";
                   1824:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1825:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1826:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1827:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1828:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1829:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1830:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1831:                       }
                   1832:                     } # end loop through keys
                   1833:                   }
                   1834:                 } # end loop through ids
                   1835:                                  
                   1836: #---------------------------------------------------- print header information
1.133     www      1837:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1838:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57      albertel 1839:                 $r->print(<<ENDMAPONE);
                   1840: <center><h4>
1.135     albertel 1841: Set Defaults for All Resources in $foldermap<br />
                   1842: <font color="red"><i>$showtitle</i></font><br />
1.57      albertel 1843: Specifically for
                   1844: ENDMAPONE
                   1845:                 if ($uname) {
1.267     albertel 1846: 		    my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 1847:                     $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130     www      1848:                         &mt('in')." \n");
1.57      albertel 1849:                 } else {
1.135     albertel 1850:                     $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57      albertel 1851:                 }
1.269     raeburn  1852:                 if ($cgroup) {
                   1853:                     $r->print(&mt("Group")." <font color=\"red\"><i>$cgroup".
                   1854:                               "</i></font> ".&mt('of')." \n");
                   1855:                     $csec = '';
                   1856:                 } elsif ($csec) {
                   1857:                     $r->print(&mt("Section")." <font color=\"red\"><i>$csec".
                   1858:                               "</i></font> ".&mt('of')." \n");
                   1859:                 }
1.135     albertel 1860:                 $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
                   1861:                 $r->print("</h4>\n");
1.57      albertel 1862: #---------------------------------------------------------------- print table
                   1863:                 $r->print('<p><table border="2">');
1.130     www      1864:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1865:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1866:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1867: 
1.210     www      1868: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1869:                     $r->print('<tr>');
1.201     www      1870:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1871:                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1872:                            $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1873:                 }
                   1874:                 $r->print("</table></center>");
                   1875:             } # end each map
                   1876:         } # end of $parmlev eq map
                   1877: #--------------------------------- Entry for parm level general (Course level)
                   1878:         if ($parmlev eq 'general') {
                   1879:             my $defbgone = '"E0E099"';
                   1880:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1881:             my $defbgthree = '"FFBB99"';
1.57      albertel 1882: 
                   1883: #-------------------------------------------- for each map, gather information
                   1884:             my $mapid="0.0";
                   1885: #-----------------------  loop through ids and get all parameter types for map
                   1886: #-----------------------------------------          and associated information
                   1887:             my %name = ();
                   1888:             my %part = ();
                   1889:             my %display = ();
                   1890:             my %type = ();
                   1891:             my %default = ();
                   1892:                
                   1893:             foreach (@ids) {
                   1894:                 my $rid = $_;
                   1895:         
1.196     www      1896:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1897: 
                   1898: #--------------------------------------------------------------------
                   1899: # @catmarker contains list of all possible parameters including part #s
                   1900: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1901: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1902: # When storing information, store as part 0
                   1903: # When requesting information, request from full part
                   1904: #-------------------------------------------------------------------
1.210     www      1905:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1906:                   my $tempkeyp = $_;
                   1907:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1908:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1909:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1910:                     $part{$tempkeyp}="0";
                   1911:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1912:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1913:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1914:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1915:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1916:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1917:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1918:                   }
                   1919:                 } # end loop through keys
                   1920:             } # end loop through ids
                   1921:                                  
                   1922: #---------------------------------------------------- print header information
1.133     www      1923: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1924:             $r->print(<<ENDMAPONE);
1.133     www      1925: <center><h4>$setdef
1.135     albertel 1926: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1927: ENDMAPONE
                   1928:             if ($uname) {
1.267     albertel 1929: 		my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 1930:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 1931:             } else {
1.135     albertel 1932:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 1933:             }
                   1934:             
1.135     albertel 1935:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306     albertel 1936:             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135     albertel 1937:             $r->print("</h4>\n");
1.57      albertel 1938: #---------------------------------------------------------------- print table
                   1939:             $r->print('<p><table border="2">');
1.130     www      1940:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1941:             $r->print('<th>'.&mt('Default Value').'</th>');
                   1942:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1943: 
1.210     www      1944: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1945:                 $r->print('<tr>');
1.201     www      1946:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1947:                        \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1948:                                    $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1949:             }
                   1950:             $r->print("</table></center>");
                   1951:         } # end of $parmlev eq general
1.43      albertel 1952:     }
1.280     albertel 1953:     $r->print('</form>'.&Apache::loncommon::end_page());
1.57      albertel 1954: } # end sub assessparms
1.30      www      1955: 
1.59      matthew  1956: 
                   1957: ##################################################
                   1958: ##################################################
                   1959: 
                   1960: =pod
                   1961: 
                   1962: =item crsenv
                   1963: 
1.105     matthew  1964: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  1965: be simplified and shortened... someday.
                   1966: 
                   1967: Inputs: $r
                   1968: 
                   1969: Returns: nothing
                   1970: 
                   1971: =cut
                   1972: 
                   1973: ##################################################
                   1974: ##################################################
1.30      www      1975: sub crsenv {
                   1976:     my $r=shift;
                   1977:     my $setoutput='';
1.280     albertel 1978: 
1.298     albertel 1979:     my $breadcrumbs = 
                   1980: 	&Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
1.190     albertel 1981:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1982:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  1983: 
                   1984:     #
                   1985:     # Go through list of changes
1.190     albertel 1986:     foreach (keys %env) {
1.105     matthew  1987:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   1988:         my $name  = $1;
1.190     albertel 1989:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  1990:         if ($name eq 'newp') {
1.190     albertel 1991:             $name = $env{'form.newp_name'};
1.105     matthew  1992:         }
                   1993:         if ($name eq 'url') {
                   1994:             $value=~s/^\/res\///;
                   1995:             my $bkuptime=time;
                   1996:             my @tmp = &Apache::lonnet::get
                   1997:                 ('environment',['url'],$dom,$crs);
1.130     www      1998:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  1999:                 &Apache::lonnet::put
                   2000:                 ('environment',
                   2001:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   2002:                  $dom,$crs).
                   2003:                      '<br>';
                   2004:         }
                   2005:         #
                   2006:         # Deal with modified default spreadsheets
                   2007:         if ($name =~ /^spreadsheet_default_(classcalc|
                   2008:                                             studentcalc|
                   2009:                                             assesscalc)$/x) {
                   2010:             my $sheettype = $1; 
                   2011:             if ($sheettype eq 'classcalc') {
                   2012:                 # no need to do anything since viewing the sheet will
                   2013:                 # cause it to be updated. 
                   2014:             } elsif ($sheettype eq 'studentcalc') {
                   2015:                 # expire all the student spreadsheets
                   2016:                 &Apache::lonnet::expirespread('','','studentcalc');
                   2017:             } else {
                   2018:                 # expire all the assessment spreadsheets 
                   2019:                 #    this includes non-default spreadsheets, but better to
                   2020:                 #    be safe than sorry.
                   2021:                 &Apache::lonnet::expirespread('','','assesscalc');
                   2022:                 # expire all the student spreadsheets
                   2023:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      2024:             }
1.105     matthew  2025:         }
                   2026:         #
1.107     matthew  2027:         # Deal with the enrollment dates
                   2028:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2029:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   2030:         }
1.178     raeburn  2031:         # Get existing cloners
                   2032:         my @oldcloner = ();
                   2033:         if ($name eq 'cloners') {
                   2034:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   2035:             if ($clonenames{'cloners'} =~ /,/) {
                   2036:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   2037:             } else {
                   2038:                 $oldcloner[0] = $clonenames{'cloners'};
                   2039:             }
                   2040:         }
1.107     matthew  2041:         #
1.105     matthew  2042:         # Let the user know we made the changes
1.153     albertel 2043:         if ($name && defined($value)) {
1.239     raeburn  2044:             my $failed_cloners;
1.178     raeburn  2045:             if ($name eq 'cloners') {
1.239     raeburn  2046:                 $value =~ s/\s//g;
1.178     raeburn  2047:                 $value =~ s/^,//;
                   2048:                 $value =~ s/,$//;
1.239     raeburn  2049:                 # check requested clones are valid users.
                   2050:                 $failed_cloners = &check_cloners(\$value,\@oldcloner);
1.178     raeburn  2051:             }
1.105     matthew  2052:             my $put_result = &Apache::lonnet::put('environment',
                   2053:                                                   {$name=>$value},$dom,$crs);
                   2054:             if ($put_result eq 'ok') {
1.130     www      2055:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178     raeburn  2056:                 if ($name eq 'cloners') {
                   2057:                     &change_clone($value,\@oldcloner);
                   2058:                 }
1.179     raeburn  2059:                 # Flush the course logs so course description is immediately updated
                   2060:                 if ($name eq 'description' && defined($value)) {
                   2061:                     &Apache::lonnet::flushcourselogs();
                   2062:                 }
1.105     matthew  2063:             } else {
1.130     www      2064:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   2065: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      2066:             }
1.239     raeburn  2067:             if (($name eq 'cloners') && ($failed_cloners)) {
                   2068:                 $setoutput.= &mt('Unable to include').' - <b>'.$failed_cloners.'</b>, '.
                   2069:                  &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').
                   2070:                  '.<br />'.&mt('Please ').
                   2071:                  ' <a href="/adm/createuser">'.
                   2072:                  &mt('add the user(s)').'</a>, '.
                   2073:                  &mt('and then return to the ').
                   2074:                  '<a href="/admparmset?action=crsenv">'.
                   2075:                  &mt('Course Parameters page').'</a> '.
                   2076:                  &mt('to add the new user(s) to the list of possible cloners').
                   2077:                  '.<br />';
                   2078:             }
1.30      www      2079:         }
1.38      harris41 2080:     }
1.108     www      2081: # ------------------------- Re-init course environment entries for this session
                   2082: 
1.302     albertel 2083:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296     albertel 2084: 				       {'freshen_cache' => 1});
1.105     matthew  2085: 
1.30      www      2086: # -------------------------------------------------------- Get parameters again
1.45      matthew  2087: 
                   2088:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 2089:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 2090:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      2091:     my $output='';
1.45      matthew  2092:     if (! exists($values{'con_lost'})) {
1.30      www      2093:         my %descriptions=
1.140     sakharuk 2094: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  2095:                                  '<a href="javascript:openbrowser'.
1.47      matthew  2096:                                  "('envform','url','sequence')\">".
1.140     sakharuk 2097:                                  &mt('Select Map').'</a><br /><font color=red> '.
                   2098:                                  &mt('Modification may make assessment data inaccessible').
                   2099:                                  '</font>',
                   2100:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 2101:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 2102:                                  '</b><br />'.
                   2103:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  2104:              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain)</tt><br />'.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),
1.150     www      2105:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   2106:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 2107:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      2108:                     '<a href="javascript:openbrowser'.
                   2109:                     "('envform','default_xml_style'".
1.140     sakharuk 2110:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 2111:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   2112:                                  '</b><br />(<tt>user:domain,'.
1.74      www      2113:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2114:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      2115:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2116:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 2117:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2118:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 2119:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 2120:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 2121:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 2122:                                  &mt('changes will not show until next login').')',
1.169     matthew  2123:              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b>'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),
1.118     matthew  2124: 
1.141     sakharuk 2125:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   2126:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 2127:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  2128:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 2129:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  2130: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   2131:              'plc.users.denied' => 
1.141     sakharuk 2132:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  2133:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   2134: 
1.141     sakharuk 2135:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   2136:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 2137:                                   'student, "<tt>ta</tt>": '.
                   2138:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 2139:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 2140: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      2141:              'pch.users.denied' => 
1.141     sakharuk 2142:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      2143:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  2144:              'spreadsheet_default_classcalc' 
1.141     sakharuk 2145:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  2146:                     '<a href="javascript:openbrowser'.
                   2147:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 2148:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2149:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 2150:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  2151:                     '<a href="javascript:openbrowser'.
                   2152:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 2153:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2154:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 2155:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  2156:                     '<a href="javascript:openbrowser'.
                   2157:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 2158:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 2159: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 2160: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 2161: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  2162:              'allow_discussion_post_editing'
1.276     raeburn  2163:                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />"<tt>st</tt>": '.
                   2164:                                   &mt('student').', "<tt>ta</tt>": '.
                   2165:                                   'TA, "<tt>in</tt>": '.
                   2166:                                   &mt('instructor').';&nbsp;(<tt>'.&mt('role:section,role:section,..., e.g., st:001,st:002,in,cc would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').'</tt>)<br />'.
                   2167:                     '('.&mt('or set value to "[_1]" to allow all roles',"<tt>yes</tt>").')',
1.89      albertel 2168: 	     'rndseed'
1.140     sakharuk 2169: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
                   2170:                     '<font color="red">'.&mt('Modifying this will make problems').' '.
                   2171:                     &mt('have different numbers and answers').'</font>',
1.151     albertel 2172: 	     'receiptalg'
                   2173: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   2174:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 2175:              'suppress_tries'
1.272     albertel 2176:                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.273     www      2177:                     ' ('.&mt('"[_1]" to suppress, anything else to not suppress','<tt>yes</tt>').')',
1.113     sakharuk 2178:              'problem_stream_switch'
1.141     sakharuk 2179:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 2180:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 2181:              'default_paper_size' 
                   2182:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   2183:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   2184:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   2185:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 2186:              'anonymous_quiz'
1.150     www      2187:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 2188:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1.217     albertel 2189:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
                   2190:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
1.150     www      2191:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   2192:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 2193:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      2194:              'disable_receipt_display'
1.141     sakharuk 2195:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 2196:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163     albertel 2197: 	     'disablesigfigs'
                   2198: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   2199:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251     albertel 2200: 	     'disableexampointprint'
                   2201: 	         => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                   2202:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278     www      2203:              'externalsyllabus'
1.279     www      2204:                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149     albertel 2205: 	     'tthoptions'
                   2206: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  2207:              ); 
1.177     raeburn  2208:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.278     www      2209:                              'externalsyllabus',
1.107     matthew  2210:                              'default_xml_style','pageseparators',
                   2211:                              'question.email','comment.email','policy.email',
1.169     matthew  2212:                              'student_classlist_view',
1.118     matthew  2213:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  2214:                              'pch.roles.denied','pch.users.denied',
                   2215:                              'allow_limited_html_in_feedback',
1.170     raeburn  2216:                              'allow_discussion_post_editing',
1.108     www      2217:                              'languages',
1.150     www      2218: 			     'nothideprivileged',
1.107     matthew  2219:                              'rndseed',
1.151     albertel 2220:                              'receiptalg',
1.107     matthew  2221:                              'problem_stream_switch',
1.164     sakharuk 2222: 			     'suppress_tries',
1.161     sakharuk 2223:                              'default_paper_size',
1.115     www      2224:                              'disable_receipt_display',
1.107     matthew  2225:                              'spreadsheet_default_classcalc',
                   2226:                              'spreadsheet_default_studentcalc',
                   2227:                              'spreadsheet_default_assesscalc', 
                   2228:                              'hideemptyrows',
                   2229:                              'default_enrollment_start_date',
                   2230:                              'default_enrollment_end_date',
1.163     albertel 2231: 			     'tthoptions',
1.251     albertel 2232: 			     'disablesigfigs',
                   2233: 			     'disableexampointprint'
1.107     matthew  2234:                              );
                   2235: 	foreach my $parameter (sort(keys(%values))) {
1.244     banghart 2236:             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
1.142     raeburn  2237:                 if (! $descriptions{$parameter}) {
                   2238:                     $descriptions{$parameter}=$parameter;
                   2239:                     push(@Display_Order,$parameter);
                   2240:                 }
                   2241:             }
1.43      albertel 2242: 	}
1.107     matthew  2243:         foreach my $parameter (@Display_Order) {
                   2244:             my $description = $descriptions{$parameter};
1.51      matthew  2245:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      2246:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  2247:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  2248:                 '.checked=true;"';
1.107     matthew  2249:             $output .= '<tr><td>'.$description.'</td>';
                   2250:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   2251:                 $output .= '<td>'.
                   2252:                     &Apache::lonhtmlcommon::date_setter('envform',
                   2253:                                                         $parameter.'_value',
                   2254:                                                         $values{$parameter},
                   2255:                                                         $onchange).
                   2256:                                                         '</td>';
                   2257:             } else {
                   2258:                 $output .= '<td>'.
                   2259:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   2260:                                                     $values{$parameter},
                   2261:                                                     40,$onchange).'</td>';
                   2262:             }
                   2263:             $output .= '<td>'.
                   2264:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   2265:                 '</td>';
                   2266:             $output .= "</tr>\n";
1.51      matthew  2267: 	}
1.69      www      2268:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  2269:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   2270:             '.checked=true;"';
1.130     www      2271: 	$output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  2272: 	    '<input type="text" size=40 name="newp_name" '.
                   2273:                 $onchange.' /></td><td>'.
                   2274:             '<input type="text" size=40 name="newp_value" '.
                   2275:                 $onchange.' /></td><td>'.
                   2276: 	    '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43      albertel 2277:     }
1.157     sakharuk 2278:     my %lt=&Apache::lonlocal::texthash(
                   2279: 		    'par'   => 'Parameter',
                   2280: 		    'val'   => 'Value',
                   2281: 		    'set'   => 'Set',
                   2282: 		    'sce'   => 'Set Course Environment'
                   2283: 				       );
                   2284: 
1.140     sakharuk 2285:     my $Parameter=&mt('Parameter');
                   2286:     my $Value=&mt('Value');
1.141     sakharuk 2287:     my $Set=&mt('Set');
1.280     albertel 2288:     my $browse_js=
                   2289: 	'<script type="text/javascript" language="Javascript">'.
                   2290: 	&Apache::loncommon::browser_and_searcher_javascript('parmset').
                   2291: 	'</script>';
                   2292:     
                   2293:     my $start_page = 
                   2294: 	&Apache::loncommon::start_page('Set Course Environment Parameters',
                   2295: 				       $browse_js);
                   2296:     my $end_page = 
                   2297: 	&Apache::loncommon::end_page();
                   2298:     $r->print(<<ENDENV);
                   2299: $start_page
1.193     albertel 2300: $breadcrumbs
                   2301: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      2302: $setoutput
                   2303: <p>
                   2304: <table border=2>
1.157     sakharuk 2305: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30      www      2306: $output
                   2307: </table>
1.157     sakharuk 2308: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      2309: </form>
1.280     albertel 2310: $end_page
                   2311: ENDENV
1.30      www      2312: }
1.120     www      2313: ##################################################
1.207     www      2314: # Overview mode
                   2315: ##################################################
1.124     www      2316: my $tableopen;
                   2317: 
                   2318: sub tablestart {
                   2319:     if ($tableopen) {
                   2320: 	return '';
                   2321:     } else {
                   2322: 	$tableopen=1;
1.295     albertel 2323: 	return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130     www      2324: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      2325:     }
                   2326: }
                   2327: 
                   2328: sub tableend {
                   2329:     if ($tableopen) {
                   2330: 	$tableopen=0;
1.295     albertel 2331: 	return &Apache::loncommon::end_data_table();
1.124     www      2332:     } else {
                   2333: 	return'';
                   2334:     }
                   2335: }
                   2336: 
1.207     www      2337: sub readdata {
                   2338:     my ($crs,$dom)=@_;
                   2339: # Read coursedata
                   2340:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   2341: # Read userdata
                   2342: 
                   2343:     my $classlist=&Apache::loncoursedata::get_classlist();
                   2344:     foreach (keys %$classlist) {
                   2345:         # the following undefs are for 'domain', and 'username' respectively.
                   2346:         if ($_=~/^(\w+)\:(\w+)$/) {
                   2347: 	    my ($tuname,$tudom)=($1,$2);
                   2348: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   2349:             foreach my $userkey (keys %{$useropt}) {
                   2350: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   2351:                     my $newkey=$userkey;
                   2352: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   2353: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   2354: 		}
                   2355: 	    }
                   2356: 	}
                   2357:     }
                   2358:     return $resourcedata;
                   2359: }
                   2360: 
                   2361: 
1.124     www      2362: # Setting
1.208     www      2363: 
                   2364: sub storedata {
                   2365:     my ($r,$crs,$dom)=@_;
1.207     www      2366: # Set userlevel immediately
                   2367: # Do an intermediate store of course level
                   2368:     my $olddata=&readdata($crs,$dom);
1.124     www      2369:     my %newdata=();
                   2370:     undef %newdata;
                   2371:     my @deldata=();
                   2372:     undef @deldata;
1.190     albertel 2373:     foreach (keys %env) {
1.124     www      2374: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   2375: 	    my $cmd=$1;
                   2376: 	    my $thiskey=$2;
1.207     www      2377: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   2378: 	    my $tkey=$thiskey;
                   2379:             if ($tuname) {
                   2380: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   2381: 	    }
1.124     www      2382: 	    if ($cmd eq 'set') {
1.190     albertel 2383: 		my $data=$env{$_};
1.212     www      2384:                 my $typeof=$env{'form.typeof_'.$thiskey};
                   2385:  		if ($$olddata{$thiskey} ne $data) { 
1.207     www      2386: 		    if ($tuname) {
1.212     www      2387: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2388: 								 $tkey.'.type' => $typeof},
                   2389: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2390: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2391: 			    $r->print('<br />'.&mt('Stored modified parameter for').' '.
                   2392: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   2393: 			} else {
                   2394: 			    $r->print('<h2><font color="red">'.
                   2395: 				      &mt('Error storing parameters').'</font></h2>');
                   2396: 			}
                   2397: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2398: 		    } else {
                   2399: 			$newdata{$thiskey}=$data;
1.212     www      2400:  			$newdata{$thiskey.'.type'}=$typeof; 
                   2401:                    } 
1.207     www      2402: 		}
1.124     www      2403: 	    } elsif ($cmd eq 'del') {
1.207     www      2404: 		if ($tuname) {
                   2405: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290     www      2406: 			    &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207     www      2407: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2408: 		    } else {
                   2409: 			$r->print('<h2><font color="red">'.
                   2410: 				  &mt('Error deleting parameters').'</font></h2>');
                   2411: 		    }
                   2412: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2413: 		} else {
                   2414: 		    push (@deldata,$thiskey);
                   2415: 		}
1.124     www      2416: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 2417: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212     www      2418:                 my $typeof=$env{'form.typeof_'.$thiskey};
1.207     www      2419: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
                   2420: 		    if ($tuname) {
1.212     www      2421: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2422: 								 $tkey.'.type' => $typeof},
                   2423: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2424: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2425: 			    $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2426: 			} else {
                   2427: 			    $r->print('<h2><font color="red">'.
                   2428: 				      &mt('Error storing parameters').'</font></h2>');
                   2429: 			}
                   2430: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2431: 		    } else {
1.212     www      2432: 			$newdata{$thiskey}=$data;
                   2433: 			$newdata{$thiskey.'.type'}=$typeof; 
1.207     www      2434: 		    }
                   2435: 		}
1.124     www      2436: 	    }
                   2437: 	}
                   2438:     }
1.207     www      2439: # Store all course level
1.144     www      2440:     my $delentries=$#deldata+1;
                   2441:     my @newdatakeys=keys %newdata;
                   2442:     my $putentries=$#newdatakeys+1;
                   2443:     if ($delentries) {
                   2444: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290     www      2445: 	    my %loghash=map { $_ => '' } @deldata;
                   2446: 	    &log_parmset(\%loghash,1);
1.144     www      2447: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2448: 	} else {
                   2449: 	    $r->print('<h2><font color="red">'.
                   2450: 		      &mt('Error deleting parameters').'</font></h2>');
                   2451: 	}
1.205     www      2452: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2453:     }
                   2454:     if ($putentries) {
                   2455: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290     www      2456: 			    &log_parmset(\%newdata,0);
1.212     www      2457: 	    $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2458: 	} else {
                   2459: 	    $r->print('<h2><font color="red">'.
                   2460: 		      &mt('Error storing parameters').'</font></h2>');
                   2461: 	}
1.205     www      2462: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2463:     }
1.208     www      2464: }
1.207     www      2465: 
1.208     www      2466: sub extractuser {
                   2467:     my $key=shift;
                   2468:     return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
                   2469: }
1.206     www      2470: 
1.208     www      2471: sub listdata {
1.214     www      2472:     my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207     www      2473: # Start list output
1.206     www      2474: 
1.122     www      2475:     my $oldsection='';
                   2476:     my $oldrealm='';
                   2477:     my $oldpart='';
1.123     www      2478:     my $pointer=0;
1.124     www      2479:     $tableopen=0;
1.145     www      2480:     my $foundkeys=0;
1.248     albertel 2481:     my %keyorder=&standardkeyorder();
1.214     www      2482:     foreach my $thiskey (sort {
                   2483: 	if ($sortorder eq 'realmstudent') {
1.247     albertel 2484: 	    my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2485: 	    my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2486: 	    if (!defined($astudent)) {
                   2487: 		($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.237     albertel 2488: 	    }
1.247     albertel 2489: 	    if (!defined($bstudent)) {
                   2490: 		($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
                   2491: 	    }
1.248     albertel 2492: 	    $arealm=~s/\.type//;
                   2493: 	    my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/);
                   2494: 	    $aparm=$keyorder{'parameter_0_'.$aparm};
                   2495: 	    $brealm=~s/\.type//;
                   2496: 	    my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/);
                   2497: 	    $bparm=$keyorder{'parameter_0_'.$bparm};	   
                   2498: 	    if ($ares eq $bres) {
                   2499: 		if (defined($aparm) && defined($bparm)) {
                   2500: 		    ($aparm <=> $bparm);
                   2501: 		} elsif (defined($aparm)) {
                   2502: 		    -1;
                   2503: 		} elsif (defined($bparm)) {
                   2504: 		    1;
                   2505: 		} else {
                   2506: 		    ($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2507: 		}
                   2508: 	    } else {
                   2509: 		($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2510: 	    }
1.214     www      2511: 	} else {
                   2512: 	    $a cmp $b;
                   2513: 	}
                   2514:     } keys %{$listdata}) {
1.247     albertel 2515: 	 
1.211     www      2516: 	if ($$listdata{$thiskey.'.type'}) {
                   2517:             my $thistype=$$listdata{$thiskey.'.type'};
                   2518:             if ($$resourcedata{$thiskey.'.type'}) {
                   2519: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2520: 	    }
1.207     www      2521: 	    my ($middle,$part,$name)=
                   2522: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2523: 	    my $section=&mt('All Students');
1.207     www      2524: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2525: 		my $issection=$1;
                   2526: 		if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
                   2527: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2528: 		} else {
                   2529: 		    $section=&mt('Group/Section').': '.$issection;
                   2530: 		}
1.207     www      2531: 		$middle=~s/^\[(.*)\]//;
1.122     www      2532: 	    }
1.207     www      2533: 	    $middle=~s/\.+$//;
                   2534: 	    $middle=~s/^\.+//;
1.130     www      2535: 	    my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122     www      2536: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174     albertel 2537: 		$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122     www      2538: 	    } elsif ($middle) {
1.174     albertel 2539: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   2540: 		$realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
1.122     www      2541: 	    }
1.214     www      2542: 	    if ($sortorder eq 'realmstudent') {
                   2543: 		if ($realm ne $oldrealm) {
                   2544: 		    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                   2545: 		    $oldrealm=$realm;
                   2546: 		    $oldsection='';
                   2547: 		}
                   2548: 		if ($section ne $oldsection) {
                   2549: 		    $r->print(&tableend()."\n<h2>$section</h2>");
                   2550: 		    $oldsection=$section;
                   2551: 		    $oldpart='';
                   2552: 		}
                   2553: 	    } else {
                   2554: 		if ($section ne $oldsection) {
                   2555: 		    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                   2556: 		    $oldsection=$section;
                   2557: 		    $oldrealm='';
                   2558: 		}
                   2559: 		if ($realm ne $oldrealm) {
                   2560: 		    $r->print(&tableend()."\n<h2>$realm</h2>");
                   2561: 		    $oldrealm=$realm;
                   2562: 		    $oldpart='';
                   2563: 		}
1.122     www      2564: 	    }
                   2565: 	    if ($part ne $oldpart) {
1.124     www      2566: 		$r->print(&tableend().
1.214     www      2567: 			  "\n<font color='blue'>".&mt('Part').": $part</font>");
1.122     www      2568: 		$oldpart=$part;
                   2569: 	    }
1.123     www      2570: #
1.230     www      2571: # Preset defaults?
                   2572: #
                   2573:             my ($hour,$min,$sec,$val)=('','','','');
                   2574: 	    unless ($$resourcedata{$thiskey}) {
                   2575: 		my ($parmname)=($thiskey=~/\.(\w+)$/);
                   2576: 		($hour,$min,$sec,$val)=&preset_defaults($parmname);
                   2577: 	    }
                   2578: 
                   2579: #
1.123     www      2580: # Ready to print
                   2581: #
1.295     albertel 2582: 	    $r->print(&tablestart().
                   2583: 		      &Apache::loncommon::start_data_table_row().
                   2584: 		      '<td><b>'.&standard_parameter_names($name).
1.293     www      2585: 		      '</b></td><td><input type="checkbox" name="del_'.
1.124     www      2586: 		      $thiskey.'" /></td><td>');
1.145     www      2587: 	    $foundkeys++;
1.213     www      2588: 	    if (&isdateparm($thistype)) {
1.123     www      2589: 		my $jskey='key_'.$pointer;
                   2590: 		$pointer++;
                   2591: 		$r->print(
1.232     albertel 2592: 			  &Apache::lonhtmlcommon::date_setter('parmform',
1.123     www      2593: 							      $jskey,
1.219     www      2594: 						      $$resourcedata{$thiskey},
1.230     www      2595: 							      '',1,'','',$hour,$min,$sec).
1.277     www      2596: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
                   2597: &date_sanity_info($$resourcedata{$thiskey})
1.123     www      2598: 			  );
1.219     www      2599: 	    } elsif ($thistype eq 'string_yesno') {
1.230     www      2600: 		my $showval;
                   2601: 		if (defined($$resourcedata{$thiskey})) {
                   2602: 		    $showval=$$resourcedata{$thiskey};
                   2603: 		} else {
                   2604: 		    $showval=$val;
                   2605: 		}
1.219     www      2606: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2607: 			  '" value="yes"');
1.230     www      2608: 		if ($showval eq 'yes') {
1.219     www      2609: 		    $r->print(' checked="checked"');
                   2610: 		}
                   2611:                 $r->print(' />'.&mt('Yes').'</label> ');
                   2612: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2613: 			  '" value="no"');
1.230     www      2614: 		if ($showval eq 'no') {
1.219     www      2615: 		    $r->print(' checked="checked"');
                   2616: 		}
                   2617:                 $r->print(' />'.&mt('No').'</label>');
1.123     www      2618: 	    } else {
1.230     www      2619: 		my $showval;
                   2620: 		if (defined($$resourcedata{$thiskey})) {
                   2621: 		    $showval=$$resourcedata{$thiskey};
                   2622: 		} else {
                   2623: 		    $showval=$val;
                   2624: 		}
1.211     www      2625: 		$r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.230     www      2626: 			  $showval.'">');
1.123     www      2627: 	    }
1.211     www      2628: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2629: 		      $thistype.'">');
1.295     albertel 2630: 	    $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122     www      2631: 	}
1.121     www      2632:     }
1.208     www      2633:     return $foundkeys;
                   2634: }
                   2635: 
                   2636: sub newoverview {
1.280     albertel 2637:     my ($r) = @_;
                   2638: 
1.208     www      2639:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2640:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2641:     my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298     albertel 2642:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2643:     $r->print(<<ENDOVER);
1.280     albertel 2644: $start_page
1.208     www      2645: $breadcrumbs
1.232     albertel 2646: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      2647: ENDOVER
1.211     www      2648:     my @ids=();
                   2649:     my %typep=();
                   2650:     my %keyp=();
                   2651:     my %allparms=();
                   2652:     my %allparts=();
                   2653:     my %allmaps=();
                   2654:     my %mapp=();
                   2655:     my %symbp=();
                   2656:     my %maptitles=();
                   2657:     my %uris=();
                   2658:     my %keyorder=&standardkeyorder();
                   2659:     my %defkeytype=();
                   2660: 
                   2661:     my %alllevs=();
                   2662:     $alllevs{'Resource Level'}='full';
1.215     www      2663:     $alllevs{'Map/Folder Level'}='map';
1.211     www      2664:     $alllevs{'Course Level'}='general';
                   2665: 
                   2666:     my $csec=$env{'form.csec'};
1.269     raeburn  2667:     my $cgroup=$env{'form.cgroup'};
1.211     www      2668: 
                   2669:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   2670:     my $pschp=$env{'form.pschp'};
                   2671:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   2672:     if (!@psprt) { $psprt[0]='0'; }
                   2673: 
                   2674:     my @selected_sections = 
                   2675: 	&Apache::loncommon::get_env_multiple('form.Section');
                   2676:     @selected_sections = ('all') if (! @selected_sections);
                   2677:     foreach (@selected_sections) {
                   2678:         if ($_ eq 'all') {
                   2679:             @selected_sections = ('all');
                   2680:         }
                   2681:     }
1.269     raeburn  2682:     my @selected_groups =
                   2683:         &Apache::loncommon::get_env_multiple('form.Group');
1.211     www      2684: 
                   2685:     my $pssymb='';
                   2686:     my $parmlev='';
                   2687:  
                   2688:     unless ($env{'form.parmlev'}) {
                   2689:         $parmlev = 'map';
                   2690:     } else {
                   2691:         $parmlev = $env{'form.parmlev'};
                   2692:     }
                   2693: 
                   2694:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   2695: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   2696: 				\%keyorder,\%defkeytype);
                   2697: 
                   2698: # Menu to select levels, etc
                   2699: 
                   2700:     $r->print('<table border="1"><tr><td>');
                   2701:     &levelmenu($r,\%alllevs,$parmlev);
                   2702:     if ($parmlev ne 'general') {
                   2703: 	$r->print('<td>');
                   2704: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   2705: 	$r->print('</td>');
                   2706:     }
                   2707:     $r->print('</td></tr></table>');
                   2708: 
                   2709:     $r->print('<table border="1"><tr><td>');  
                   2710:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.269     raeburn  2711:     $r->print('</td><td><table border="0" cellspacing="0" cellpadding="0">'.
                   2712:               '<tr><td>'.&mt('Parts').'</td><td></td><td>'.&mt('Section(s)').
                   2713:               '</td><td></td><td>'.&mt('Group(s)').'</td></tr><tr><td>');
1.211     www      2714:     &partmenu($r,\%allparts,\@psprt);
1.269     raeburn  2715:     $r->print('</td><td>&nbsp;</td><td>');
1.211     www      2716:     &sectionmenu($r,\@selected_sections);
1.269     raeburn  2717:     $r->print('</td><td>&nbsp;</td><td>');
                   2718:     &groupmenu($r,\@selected_groups);
                   2719:     $r->print('</td></tr></table>');
1.214     www      2720:     $r->print('</td></tr></table>');
                   2721:  
                   2722:     my $sortorder=$env{'form.sortorder'};
                   2723:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2724:     &sortmenu($r,$sortorder);
                   2725: 
                   2726:     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      2727: 
                   2728: # Build the list data hash from the specified parms
                   2729: 
                   2730:     my $listdata;
                   2731:     %{$listdata}=();
                   2732: 
                   2733:     foreach my $cat (@pscat) {
1.269     raeburn  2734:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
                   2735:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211     www      2736:     }
                   2737: 
1.212     www      2738:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      2739: 
1.212     www      2740: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      2741: 
                   2742: # Read modified data
                   2743: 
                   2744: 	my $resourcedata=&readdata($crs,$dom);
                   2745: 
                   2746: # List data
                   2747: 
1.214     www      2748: 	&listdata($r,$resourcedata,$listdata,$sortorder);
1.211     www      2749:     }
                   2750:     $r->print(&tableend().
1.212     www      2751: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
1.280     albertel 2752: 	      '</form>'.&Apache::loncommon::end_page());
1.208     www      2753: }
                   2754: 
1.269     raeburn  2755: sub secgroup_lister {
                   2756:     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
                   2757:     foreach my $item (@{$selections}) {
                   2758:         foreach my $part (@{$psprt}) {
                   2759:             my $rootparmkey=$env{'request.course.id'};
                   2760:             if (($item ne 'all') && ($item ne 'none') && ($item)) {
                   2761:                 $rootparmkey.='.['.$item.']';
                   2762:             }
                   2763:             if ($parmlev eq 'general') {
                   2764: # course-level parameter
                   2765:                 my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   2766:                 $$listdata{$newparmkey}=1;
                   2767:                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2768:             } elsif ($parmlev eq 'map') {
                   2769: # map-level parameter
                   2770:                 foreach my $mapid (keys %{$allmaps}) {
                   2771:                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   2772:                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                   2773:                     $$listdata{$newparmkey}=1;
                   2774:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2775:                 }
                   2776:             } else {
                   2777: # resource-level parameter
                   2778:                 foreach my $rid (@{$ids}) {
                   2779:                     my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
                   2780:                     if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
                   2781:                     my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
                   2782:                     $$listdata{$newparmkey}=1;
                   2783:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2784:                 }
                   2785:             }
                   2786:         }
                   2787:     }
                   2788: }
                   2789: 
1.208     www      2790: sub overview {
1.280     albertel 2791:     my ($r) = @_;
1.208     www      2792:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2793:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2794: 
                   2795:     my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298     albertel 2796:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2797:     $r->print(<<ENDOVER);
1.280     albertel 2798: $start_page
1.208     www      2799: $breadcrumbs
1.232     albertel 2800: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208     www      2801: ENDOVER
                   2802: # Store modified
                   2803: 
                   2804:     &storedata($r,$crs,$dom);
                   2805: 
                   2806: # Read modified data
                   2807: 
                   2808:     my $resourcedata=&readdata($crs,$dom);
                   2809: 
1.214     www      2810: 
                   2811:     my $sortorder=$env{'form.sortorder'};
                   2812:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2813:     &sortmenu($r,$sortorder);
                   2814: 
1.208     www      2815: # List data
                   2816: 
1.214     www      2817:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208     www      2818: 
1.145     www      2819:     $r->print(&tableend().'<p>'.
1.280     albertel 2820: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
                   2821: 	      &Apache::loncommon::end_page());
1.120     www      2822: }
1.121     www      2823: 
1.59      matthew  2824: ##################################################
                   2825: ##################################################
1.178     raeburn  2826:                                                                                             
                   2827: =pod
1.239     raeburn  2828: 
                   2829: =item check_cloners
                   2830: 
                   2831: Checks if new users included in list of allowed cloners
                   2832: are valid users.  Replaces supplied list with 
                   2833: cleaned list containing only users with valid usernames
                   2834: and domains.
                   2835: 
                   2836: Inputs: $clonelist, $oldcloner 
                   2837: where $clonelist is ref to array of requested cloners,
                   2838: and $oldcloner is ref to array of currently allowed
                   2839: cloners.
                   2840: 
                   2841: Returns: string - comma separated list of requested
                   2842: cloners (username:domain) who do not exist in system.
                   2843: 
                   2844: =item change_clone
                   2845: 
1.178     raeburn  2846: Modifies the list of courses a user can clone (stored
1.239     raeburn  2847: in the user's environment.db file), called when a
1.178     raeburn  2848: change is made to the list of users allowed to clone
                   2849: a course.
1.239     raeburn  2850: 
1.178     raeburn  2851: Inputs: $action,$cloner
                   2852: where $action is add or drop, and $cloner is identity of 
                   2853: user for whom cloning ability is to be changed in course. 
                   2854: 
                   2855: =cut
                   2856:                                                                                             
                   2857: ##################################################
                   2858: ##################################################
                   2859: 
1.239     raeburn  2860: sub extract_cloners {
                   2861:     my ($clonelist,$allowclone) = @_;
                   2862:     if ($clonelist =~ /,/) {
                   2863:         @{$allowclone} = split/,/,$clonelist;
                   2864:     } else {
                   2865:         $$allowclone[0] = $clonelist;
                   2866:     }
                   2867: }
                   2868: 
                   2869: 
                   2870: sub check_cloners {
                   2871:     my ($clonelist,$oldcloner) = @_;
                   2872:     my ($clean_clonelist,$disallowed);
                   2873:     my @allowclone = ();
                   2874:     &extract_cloners($$clonelist,\@allowclone);
                   2875:     foreach my $currclone (@allowclone) {
                   2876:         if (!grep/^$currclone$/,@$oldcloner) {
                   2877:             my ($uname,$udom) = split/:/,$currclone;
                   2878:             if ($uname && $udom) {
                   2879:                 if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2880:                     $disallowed .= $currclone.',';   
                   2881:                 } else {
                   2882:                     $clean_clonelist .= $currclone.',';
                   2883:                 }
                   2884:             }
                   2885:         } else {
                   2886:             $clean_clonelist .= $currclone.',';
                   2887:         }
                   2888:     }
                   2889:     if ($disallowed) {
                   2890:         $disallowed =~ s/,$//;
                   2891:     }
                   2892:     if ($clean_clonelist) {
                   2893:         $clean_clonelist =~ s/,$//;
                   2894:     }
                   2895:     $$clonelist = $clean_clonelist;
                   2896:     return $disallowed;
                   2897: }  
1.178     raeburn  2898: 
                   2899: sub change_clone {
                   2900:     my ($clonelist,$oldcloner) = @_;
                   2901:     my ($uname,$udom);
1.190     albertel 2902:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2903:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  2904:     my $clone_crs = $cnum.':'.$cdom;
                   2905:     
                   2906:     if ($cnum && $cdom) {
1.239     raeburn  2907:         my @allowclone;
                   2908:         &extract_cloners($clonelist,\@allowclone);
1.178     raeburn  2909:         foreach my $currclone (@allowclone) {
                   2910:             if (!grep/^$currclone$/,@$oldcloner) {
                   2911:                 ($uname,$udom) = split/:/,$currclone;
                   2912:                 if ($uname && $udom) {
                   2913:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2914:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2915:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2916:                             if ($currclonecrs{'cloneable'} eq '') {
                   2917:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2918:                             } else {
                   2919:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2920:                             }
                   2921:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2922:                         }
                   2923:                     }
                   2924:                 }
                   2925:             }
                   2926:         }
                   2927:         foreach my $oldclone (@$oldcloner) {
                   2928:             if (!grep/^$oldclone$/,@allowclone) {
                   2929:                 ($uname,$udom) = split/:/,$oldclone;
                   2930:                 if ($uname && $udom) {
                   2931:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2932:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2933:                         my %newclonecrs = ();
                   2934:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2935:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2936:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2937:                                 foreach (@currclonecrs) {
                   2938:                                     unless ($_ eq $clone_crs) {
                   2939:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2940:                                     }
                   2941:                                 }
                   2942:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2943:                             } else {
                   2944:                                 $newclonecrs{'cloneable'} = '';
                   2945:                             }
                   2946:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2947:                         }
                   2948:                     }
                   2949:                 }
                   2950:             }
                   2951:         }
                   2952:     }
                   2953: }
                   2954: 
1.193     albertel 2955: 
                   2956: ##################################################
                   2957: ##################################################
                   2958: 
                   2959: =pod
                   2960: 
                   2961: =item * header
                   2962: 
                   2963: Output html header for page
                   2964: 
                   2965: =cut
                   2966: 
                   2967: ##################################################
                   2968: ##################################################
                   2969: sub header {
1.280     albertel 2970:     return &Apache::loncommon::start_page('Parameter Manager');
1.193     albertel 2971: }
                   2972: ##################################################
                   2973: ##################################################
                   2974: sub print_main_menu {
                   2975:     my ($r,$parm_permission)=@_;
                   2976:     #
                   2977:     $r->print(<<ENDMAINFORMHEAD);
                   2978: <form method="post" enctype="multipart/form-data"
                   2979:       action="/adm/parmset" name="studentform">
                   2980: ENDMAINFORMHEAD
                   2981: #
1.195     albertel 2982:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2983:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268     albertel 2984:     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
                   2985: 
1.193     albertel 2986:     my @menu =
                   2987:         (
                   2988:           { text => 'Set Course Environment Parameters',
1.204     www      2989: 	    action => 'crsenv',
1.193     albertel 2990:             permission => $parm_permission,
                   2991:             },
1.255     banghart 2992:           { text => 'Set Portfolio Metadata',
1.259     banghart 2993: 	    action => 'setrestrictmeta',
1.240     banghart 2994:             permission => $parm_permission,
                   2995:             },
1.271     www      2996: 	  { text => 'Manage Course Slots',
1.268     albertel 2997: 	    url => '/adm/slotrequest?command=showslots',
                   2998: 	    permission => $vgr,
                   2999:             },
                   3000: 	  { divider => 1,
                   3001: 	    },
1.216     www      3002:           { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193     albertel 3003:             url => '/adm/helper/parameter.helper',
                   3004:             permission => $parm_permission,
                   3005:             },
1.216     www      3006:           { text => 'Modify Resource Parameters - Overview Mode',
1.193     albertel 3007:             action => 'setoverview',
                   3008:             permission => $parm_permission,
1.208     www      3009:             },          
1.216     www      3010: 	  { text => 'Set Resource Parameters - Overview Mode',
1.208     www      3011:             action => 'newoverview',
                   3012:             permission => $parm_permission,
1.193     albertel 3013:             },
1.216     www      3014:           { text => 'Set/Modify Resource Parameters - Table Mode',
1.193     albertel 3015:             action => 'settable',
                   3016:             permission => $parm_permission,
1.204     www      3017:             help => 'Cascading_Parameters',
1.193     albertel 3018:             },
1.220     www      3019:           { text => 'Set Parameter Setting Default Actions',
                   3020:             action => 'setdefaults',
                   3021:             permission => $parm_permission,
1.284     www      3022:             },          
1.292     www      3023: 	  { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284     www      3024:             action => 'parameterchangelog',
                   3025:             permission => $parm_permission,
1.220     www      3026:             },
1.193     albertel 3027:           );
                   3028:     my $menu_html = '';
                   3029:     foreach my $menu_item (@menu) {
1.268     albertel 3030: 	if ($menu_item->{'divider'}) {
                   3031: 	    $menu_html .= '<hr />';
                   3032: 	    next;
                   3033: 	}
1.193     albertel 3034:         next if (! $menu_item->{'permission'});
                   3035:         $menu_html.='<p>';
                   3036:         $menu_html.='<font size="+1">';
                   3037:         if (exists($menu_item->{'url'})) {
                   3038:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   3039:         } else {
                   3040:             $menu_html.=
                   3041:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   3042:         }
                   3043:         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
                   3044:         if (exists($menu_item->{'help'})) {
                   3045:             $menu_html.=
                   3046:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   3047:         }
                   3048:         $menu_html.='</p>'.$/;
                   3049:     }
                   3050:     $r->print($menu_html);
                   3051:     return;
                   3052: }
1.255     banghart 3053: ### Set portfolio metadata
1.252     banghart 3054: sub output_row {
1.255     banghart 3055:     my ($r, $field_name, $field_text) = @_;
1.252     banghart 3056:     my $output;
1.263     banghart 3057:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3058:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.254     banghart 3059:     unless (defined($options)) {
                   3060:         $options = 'active,stuadd';
1.261     banghart 3061:         $values = '';
1.252     banghart 3062:     }
1.260     banghart 3063:     $output.='<strong>'.$field_text.':</strong>';
1.264     albertel 3064:     $output.='<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /><br />';
                   3065: 
                   3066:     my @options= ( ['active', 'Show to student'],
                   3067: 		   ['onlyone','Student may select only one choice'],
                   3068: 		   ['stuadd', 'Student may type choices']);
                   3069:     foreach my $opt (@options) {
                   3070: 	my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
                   3071: 	$output.=('&nbsp;'x5).'<label><input type="checkbox" name="'.
                   3072: 	    $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3073: 	    &mt($opt->[1]).'</label> <br />';
1.252     banghart 3074:     }
                   3075:     return ($output);
                   3076: }
1.259     banghart 3077: 
                   3078: sub setrestrictmeta {
1.240     banghart 3079:     my ($r)=@_;
1.242     banghart 3080:     my $next_meta;
1.244     banghart 3081:     my $output;
1.245     banghart 3082:     my $item_num;
1.246     banghart 3083:     my $put_result;
1.280     albertel 3084:     
                   3085:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 3086:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 3087:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3088:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259     banghart 3089:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 3090:     my $save_field = '';
1.259     banghart 3091:     if ($env{'form.restrictmeta'}) {
1.254     banghart 3092:         foreach my $field (sort(keys(%env))) {
1.252     banghart 3093:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 3094:                 my $options;
1.252     banghart 3095:                 my $meta_field = $1;
                   3096:                 my $meta_key = $2;
1.253     banghart 3097:                 if ($save_field ne $meta_field) {
1.252     banghart 3098:                     $save_field = $meta_field;
1.253     banghart 3099:             	    if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254     banghart 3100:             	        $options.='stuadd,';
                   3101:             	    } 
1.253     banghart 3102:             	    if ($env{'form.'.$meta_field.'_onlyone'}) {
1.254     banghart 3103:             	        $options.='onlyone,';
                   3104:             	    } 
                   3105:             	    if ($env{'form.'.$meta_field.'_active'}) {
                   3106:             	        $options.='active,';
1.253     banghart 3107:             	    }
1.259     banghart 3108:                     my $name = $save_field;
1.253     banghart 3109:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 3110:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   3111:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 3112:                                                    },$dom,$crs);
1.252     banghart 3113:                 }
                   3114:             }
                   3115:         }
                   3116:     }
1.296     albertel 3117:     &Apache::lonnet::coursedescription($env{'request.course.id'},
                   3118: 				       {'freshen_cache' => 1});
1.258     albertel 3119:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
                   3120:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 3121:         &Apache::lonnet::logthis ($field);
                   3122:         if ($field ne 'courserestricted') {
                   3123: 	    $output.= &output_row($r, $field, $metadata_fields{$field});
                   3124: 	}
1.255     banghart 3125:     }
1.244     banghart 3126:     $r->print(<<ENDenv);       
1.259     banghart 3127:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 3128:         <p>
                   3129:         $output
1.259     banghart 3130:         <input type="submit" name="restrictmeta" value="Update Metadata Restrictions">
1.244     banghart 3131:         </form>
                   3132: ENDenv
1.280     albertel 3133:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 3134:     return 'ok';
                   3135: }
1.220     www      3136: ##################################################
1.193     albertel 3137: 
1.220     www      3138: sub defaultsetter {
1.280     albertel 3139:     my ($r) = @_;
                   3140: 
                   3141:     my $start_page = 
                   3142: 	&Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 3143:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220     www      3144:     $r->print(<<ENDDEFHEAD);
1.280     albertel 3145: $start_page
1.220     www      3146: $breadcrumbs
                   3147: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
                   3148: ENDDEFHEAD
1.280     albertel 3149: 
                   3150:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3151:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221     www      3152:     my @ids=();
                   3153:     my %typep=();
                   3154:     my %keyp=();
                   3155:     my %allparms=();
                   3156:     my %allparts=();
                   3157:     my %allmaps=();
                   3158:     my %mapp=();
                   3159:     my %symbp=();
                   3160:     my %maptitles=();
                   3161:     my %uris=();
                   3162:     my %keyorder=&standardkeyorder();
                   3163:     my %defkeytype=();
                   3164: 
                   3165:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   3166: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   3167: 				\%keyorder,\%defkeytype);
1.224     www      3168:     if ($env{'form.storerules'}) {
                   3169: 	my %newrules=();
                   3170: 	my @delrules=();
1.226     www      3171: 	my %triggers=();
1.225     albertel 3172: 	foreach my $key (keys(%env)) {
                   3173:             if ($key=~/^form\.(\w+)\_action$/) {
1.224     www      3174: 		my $tempkey=$1;
1.226     www      3175: 		my $action=$env{$key};
                   3176:                 if ($action) {
                   3177: 		    $newrules{$tempkey.'_action'}=$action;
                   3178: 		    if ($action ne 'default') {
                   3179: 			my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   3180: 			$triggers{$whichparm}.=$tempkey.':';
                   3181: 		    }
                   3182: 		    $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224     www      3183: 		    if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3184: 			$newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224     www      3185: 			$newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   3186: 			$newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   3187: 			$newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   3188: 		    } else {
                   3189: 			$newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227     www      3190: 			$newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224     www      3191: 		    }
                   3192: 		} else {
1.225     albertel 3193: 		    push(@delrules,$tempkey.'_action');
1.226     www      3194: 		    push(@delrules,$tempkey.'_type');
1.225     albertel 3195: 		    push(@delrules,$tempkey.'_hours');
                   3196: 		    push(@delrules,$tempkey.'_min');
                   3197: 		    push(@delrules,$tempkey.'_sec');
                   3198: 		    push(@delrules,$tempkey.'_value');
1.224     www      3199: 		}
                   3200: 	    }
                   3201: 	}
1.226     www      3202: 	foreach my $key (keys %allparms) {
                   3203: 	    $newrules{$key.'_triggers'}=$triggers{$key};
                   3204: 	}
1.224     www      3205: 	&Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
                   3206: 	&Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
                   3207: 	&resetrulescache();
                   3208:     }
1.227     www      3209:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                   3210: 				       'hours' => 'Hours',
1.221     www      3211: 				       'min' => 'Minutes',
                   3212: 				       'sec' => 'Seconds',
                   3213: 				       'yes' => 'Yes',
                   3214: 				       'no' => 'No');
1.222     www      3215:     my @standardoptions=('','default');
                   3216:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   3217:     my @dateoptions=('','default');
                   3218:     my @datedisplay=('',&mt('Default value when manually setting'));
                   3219:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
                   3220: 	unless ($tempkey) { next; }
                   3221: 	push @standardoptions,'when_setting_'.$tempkey;
                   3222: 	push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   3223: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3224: 	    push @dateoptions,'later_than_'.$tempkey;
                   3225: 	    push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   3226: 	    push @dateoptions,'earlier_than_'.$tempkey;
                   3227: 	    push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   3228: 	} 
                   3229:     }
1.231     www      3230: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
                   3231: 	  &mt('Automatic setting rules apply to table mode interfaces only.'));
1.221     www      3232:     $r->print("\n<table border='1'><tr><th>".&mt('Rule for parameter').'</th><th>'.
1.222     www      3233: 	      &mt('Action').'</th><th>'.&mt('Value').'</th></tr>');
1.221     www      3234:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222     www      3235: 	unless ($tempkey) { next; }
1.221     www      3236: 	$r->print("\n<tr><td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222     www      3237: 	my $action=&rulescache($tempkey.'_action');
                   3238: 	$r->print('<select name="'.$tempkey.'_action">');
                   3239: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3240: 	    for (my $i=0;$i<=$#dateoptions;$i++) {
                   3241: 		if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   3242: 		$r->print("\n<option value='$dateoptions[$i]'".
                   3243: 			  ($dateoptions[$i] eq $action?' selected="selected"':'').
                   3244: 			  ">$datedisplay[$i]</option>");
                   3245: 	    }
                   3246: 	} else {
                   3247: 	    for (my $i=0;$i<=$#standardoptions;$i++) {
                   3248: 		if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   3249: 		$r->print("\n<option value='$standardoptions[$i]'".
                   3250: 			  ($standardoptions[$i] eq $action?' selected="selected"':'').
                   3251: 			  ">$standarddisplay[$i]</option>");
                   3252: 	    }
                   3253: 	}
                   3254: 	$r->print('</select>');
1.227     www      3255: 	unless (&isdateparm($defkeytype{$tempkey})) {
                   3256: 	    $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   3257: 		      '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   3258: 	}
1.222     www      3259: 	$r->print("\n</td><td>\n");
                   3260: 
1.221     www      3261:         if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3262: 	    my $days=&rulescache($tempkey.'_days');
1.222     www      3263: 	    my $hours=&rulescache($tempkey.'_hours');
                   3264: 	    my $min=&rulescache($tempkey.'_min');
                   3265: 	    my $sec=&rulescache($tempkey.'_sec');
1.221     www      3266: 	    $r->print(<<ENDINPUTDATE);
1.227     www      3267: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      3268: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   3269: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   3270: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      3271: ENDINPUTDATE
                   3272: 	} elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      3273:             my $yeschecked='';
                   3274:             my $nochecked='';
                   3275:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
                   3276:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
                   3277: 
1.221     www      3278: 	    $r->print(<<ENDYESNO);
1.224     www      3279: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
                   3280: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221     www      3281: ENDYESNO
                   3282:         } else {
1.224     www      3283: 	    $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221     www      3284: 	}
                   3285:         $r->print('</td></tr>');
                   3286:     }
1.224     www      3287:     $r->print("</table>\n<input type='submit' name='storerules' value='".
1.280     albertel 3288: 	      &mt('Store Rules')."' /></form>\n".
                   3289: 	      &Apache::loncommon::end_page());
1.220     www      3290:     return;
                   3291: }
1.193     albertel 3292: 
1.290     www      3293: sub components {
1.291     www      3294:     my ($key,$uname,$udom,$exeuser,$exedomain)=@_;
1.290     www      3295:     my $typeflag=0;
                   3296:     if ($key=~/\.type$/) {
                   3297: 	$key=~s/\.type$//;
                   3298:         $typeflag=1;
                   3299:     }
1.291     www      3300:     my $issection;
1.290     www      3301:     my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
                   3302:     my $section=&mt('All Students');
                   3303:     if ($middle=~/^\[(.*)\]/) {
1.291     www      3304: 	$issection=$1;
                   3305: 	$section=&mt('Group/Section').': '.$issection;
1.290     www      3306: 	$middle=~s/^\[(.*)\]//;
                   3307:     }
                   3308:     $middle=~s/\.+$//;
                   3309:     $middle=~s/^\.+//;
1.291     www      3310:     if ($uname) {
                   3311: 	$section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   3312: 	$issection='';
                   3313:     }
1.290     www      3314:     my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.304     www      3315:     my $realmdescription=&mt('all resources'); 
1.290     www      3316:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
                   3317: 	$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.304     www      3318:  	$realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
                   3319:    } elsif ($middle) {
1.290     www      3320: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   3321: 	$realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
1.304     www      3322: 	$realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      3323:     }
1.291     www      3324:     my $what=$part.'.'.$name;
                   3325:     return ($realm,$section,$name,$part,$typeflag,
1.304     www      3326: 	    $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      3327: }
1.293     www      3328: 
1.292     www      3329: sub standard_parameter_names {
                   3330:     my ($name)=@_;
                   3331:     my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date',
                   3332: 						   'answerdate' => 'Answer Date',
                   3333: 						   'opendate' => 'Open Date',
                   3334: 						   'maxtries' => 'Max. Number of Tries',
                   3335: 						   'weight' => 'Weight',
                   3336: 						   'date_start' => 'Starting Date',
1.293     www      3337: 						   'date_end' => 'Ending Date',
1.309     www      3338:                                                    'interval' => 'Time Interval Length',
                   3339:                                                    'tol' => 'Numerical Tolerance',
                   3340:                                                    'sig' => 'Significant Digits',
                   3341:                                                    'contentopen' => 'Content Opening Date',
                   3342:                                                    'contentclose' => 'Content Closing Date',
                   3343:                                                    'discussend' => 'End of Discussion Time',
                   3344:                                                    'discusshide' => 'Discussion Hidden',
                   3345:                                                    'problemstatus' => 'Problem Status Visible',
1.293     www      3346: 						   'int_pos' => 'Positive Integer',
                   3347: 						   'int_zero_pos' => 'Positive Integer or Zero',
1.310   ! www      3348: 						   'hinttries' => 'Number of Tries till Hints appear',
        !          3349:                                                    'numbubbles' => 'Number of Bubbles in Exam Mode');
1.292     www      3350:     if ($standard_parms{$name}) {
                   3351: 	return $standard_parms{$name}; 
                   3352:     } else { 
                   3353: 	return $name; 
                   3354:     }
                   3355: }
1.290     www      3356: 
1.309     www      3357: #
                   3358: # Parameter Change Log
                   3359: #
                   3360: 
                   3361: 
1.285     albertel 3362: sub parm_change_log {
1.284     www      3363:     my ($r)=@_;
                   3364:     &startpage($r);
1.286     www      3365:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   3366: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   3367: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.301     www      3368:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.309     www      3369:     $r->print('<form method="post"><input type="hidden" name="action" value="parameterchangelog" />');
                   3370:     unless ($env{'form.show'}) { $env{'form.show'}=10; }
                   3371:     my $countselect = &Apache::lonmeta::selectbox('show',
                   3372:                                                   $env{'form.show'},
                   3373:                                                   undef,
                   3374:                                                   (10,20,50,100,1000,10000,100000));
                   3375:     $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
                   3376: 	      '<input type="submit" value="'.&mt('Display').'" />');
1.301     www      3377: 
1.291     www      3378:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   3379: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301     www      3380:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
                   3381: 	      '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   3382: 	      &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   3383: 	      &Apache::loncommon::end_data_table_header_row());
1.309     www      3384:     my $shown=0;
1.294     www      3385:     foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
                   3386:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.290     www      3387: 	my $count=$#changes+1;
1.288     albertel 3388: 	my $time =
1.294     www      3389: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      3390: 	my $plainname = 
1.294     www      3391: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   3392: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 3393: 	my $about_me_link = 
1.289     www      3394: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      3395: 					       $parmlog{$id}{'exe_uname'},
                   3396: 					       $parmlog{$id}{'exe_udom'});
1.293     www      3397: 	my $send_msg_link='';
1.294     www      3398: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   3399: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      3400: 	    $send_msg_link ='<br />'.
1.288     albertel 3401: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      3402: 						   $parmlog{$id}{'exe_uname'},
                   3403: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 3404: 	}
1.301     www      3405: 	my $row_start=&Apache::loncommon::start_data_table_row();
                   3406: 	$r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.290     www      3407:                        <td rowspan="'.$count.'">'.$about_me_link.
1.294     www      3408: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   3409: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
1.290     www      3410: 		  $send_msg_link.'</td>');
                   3411: 	my $makenewrow=0;
                   3412: 	my %istype=();
1.293     www      3413: 	foreach my $changed (reverse(sort(@changes))) {
1.294     www      3414:             my $value=$parmlog{$id}{'logentry'}->{$changed};
1.304     www      3415:             my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.294     www      3416: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
1.290     www      3417: 	    if ($typeflag) { $istype{$parmname}=$value; }
1.301     www      3418: 	    if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; }
1.290     www      3419: 	    $r->print('<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292     www      3420: 		      &standard_parameter_names($parmname).'</td><td>'.
                   3421: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>');
1.291     www      3422: 	    my $stillactive=0;
1.294     www      3423: 	    if ($parmlog{$id}{'deleteflag'}) {
1.290     www      3424: 		$r->print(&mt('Deleted'));
1.288     albertel 3425: 	    } else {
1.290     www      3426: 		if ($typeflag) {
1.292     www      3427: 		    $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
1.290     www      3428: 		} else {
1.291     www      3429: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   3430: 						      $uname,$udom,$issection,$issection,$courseopt);
                   3431: 		    if (&isdateparm($istype{$parmname})) {
                   3432: 			$r->print(&Apache::lonlocal::locallocaltime($value));
                   3433: 		    } else {
                   3434: 			$r->print($value);
                   3435: 		    }
                   3436: 		    if ($value ne $all[$level]) {
                   3437: 			$r->print('<br /><font color="red">'.&mt('Not active anymore').'</font>');
                   3438: 		    } else {
                   3439: 			$stillactive=1;
                   3440: 		    }
1.290     www      3441: 		}
1.288     albertel 3442: 	    }
1.291     www      3443: 	    $r->print('</td>');
                   3444: 	    if ($stillactive) {
1.304     www      3445: 		my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
                   3446:                 my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
                   3447: 				    (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292     www      3448: 		if (($uname) && ($udom)) {
1.304     www      3449: 		    $r->print('<td>'.
                   3450: 			      &Apache::loncommon::messagewrapper('Notify User',$uname,$udom,$title,$description).
                   3451: 			      '</td>');
1.292     www      3452: 		} else {
1.303     www      3453: 		    $r->print('<td>'.
1.304     www      3454: 			      &Apache::lonrss::course_blog_link($id,$title,$description).
                   3455: 			      '</td>');
1.292     www      3456: 		}
1.291     www      3457: 	    } else {
                   3458: 		$r->print('<td>&nbsp;</td>');
                   3459: 	    }
1.301     www      3460: 	    $r->print(&Apache::loncommon::end_data_table_row());
1.288     albertel 3461: 	}
1.309     www      3462: 	$shown++;
                   3463: 	if ($shown>=$env{'form.show'}) { last; }
1.286     www      3464:     }
1.301     www      3465:     $r->print(&Apache::loncommon::end_data_table());
1.309     www      3466:     $r->print('</form>');
1.284     www      3467:     $r->print(&Apache::loncommon::end_page());
                   3468: }
                   3469: 
1.178     raeburn  3470: ##################################################
                   3471: ##################################################
1.30      www      3472: 
1.59      matthew  3473: =pod
                   3474: 
1.83      bowersj2 3475: =item * handler
1.59      matthew  3476: 
                   3477: Main handler.  Calls &assessparms and &crsenv subroutines.
                   3478: 
                   3479: =cut
                   3480: ##################################################
                   3481: ##################################################
1.220     www      3482: #    use Data::Dumper;
                   3483: 
1.259     banghart 3484: 
1.30      www      3485: sub handler {
1.43      albertel 3486:     my $r=shift;
1.30      www      3487: 
1.43      albertel 3488:     if ($r->header_only) {
1.126     www      3489: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 3490: 	$r->send_http_header;
                   3491: 	return OK;
                   3492:     }
1.193     albertel 3493:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      3494: 					    ['action','state',
                   3495:                                              'pres_marker',
                   3496:                                              'pres_value',
1.206     www      3497:                                              'pres_type',
1.243     banghart 3498:                                              'udom','uname','symb','serial']);
1.131     www      3499: 
1.83      bowersj2 3500: 
1.193     albertel 3501:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 3502:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   3503: 					    text=>"Parameter Manager",
1.204     www      3504: 					    faq=>10,
1.194     albertel 3505: 					    bug=>'Instructor Interface'});
1.203     www      3506: 
1.30      www      3507: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 3508:     my $parm_permission =
                   3509: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 3510: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 3511: 				  $env{'request.course.sec'}));
1.194     albertel 3512:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 3513: 
                   3514:         # Start Page
1.126     www      3515:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      3516:         $r->send_http_header;
1.30      www      3517: 
1.203     www      3518: 
                   3519:         # id numbers can change on re-ordering of folders
                   3520: 
                   3521:         &resetsymbcache();
                   3522: 
1.193     albertel 3523:         #
                   3524:         # Main switch on form.action and form.state, as appropriate
                   3525:         #
                   3526:         # Check first if coming from someone else headed directly for
                   3527:         #  the table mode
                   3528:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   3529: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   3530: 	    &assessparms($r);
                   3531: 
                   3532:         } elsif (! exists($env{'form.action'})) {
                   3533:             $r->print(&header());
1.298     albertel 3534:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 3535:             &print_main_menu($r,$parm_permission);
                   3536:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 3537:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   3538: 						    text=>"Course Environment"});
1.193     albertel 3539:             &crsenv($r); 
                   3540:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 3541:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3542: 						    text=>"Overview Mode"});
1.121     www      3543: 	    &overview($r);
1.259     banghart 3544:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   3545:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   3546: 						    text=>"Restrict Metadata"});
                   3547: 	    &setrestrictmeta($r);
1.208     www      3548:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   3549:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3550: 						    text=>"Overview Mode"});
                   3551: 	    &newoverview($r);
1.220     www      3552:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   3553:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   3554: 						    text=>"Set Defaults"});
                   3555: 	    &defaultsetter($r);
                   3556: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 3557:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      3558: 						    text=>"Table Mode",
                   3559: 						    help => 'Course_Setting_Parameters'});
1.121     www      3560: 	    &assessparms($r);
1.284     www      3561:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   3562:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      3563: 						    text=>"Parameter Change Log"});
1.285     albertel 3564: 	    &parm_change_log($r);
1.284     www      3565: 	}       
1.43      albertel 3566:     } else {
1.1       www      3567: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 3568: 	$env{'user.error.msg'}=
1.43      albertel 3569: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   3570: 	return HTTP_NOT_ACCEPTABLE;
                   3571:     }
                   3572:     return OK;
1.1       www      3573: }
                   3574: 
                   3575: 1;
                   3576: __END__
                   3577: 
1.59      matthew  3578: =pod
1.38      harris41 3579: 
                   3580: =back
                   3581: 
                   3582: =cut
1.1       www      3583: 
                   3584: 
                   3585: 

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