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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.312   ! albertel    4: # $Id: lonparmset.pm,v 1.311 2006/06/02 22:12:50 albertel 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.312   ! albertel 1576: 	my $title = &Apache::lonnet::gettitle($pssymb);
        !          1577:         $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
        !          1578:                   '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.238     www      1579: 		  '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
                   1580: 		  ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
1.57      albertel 1581:     }
1.275     raeburn  1582:     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);    
1.57      albertel 1583: 
1.210     www      1584:     $r->print('<p>'.$message.'</p>');
                   1585: 
1.209     www      1586:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1587: 
                   1588:     my @temp_pscat;
                   1589:     map {
                   1590:         my $cat = $_;
                   1591:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1592:     } @pscat;
                   1593: 
                   1594:     @pscat = @temp_pscat;
                   1595: 
1.209     www      1596:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1597: # ----------------------------------------------------------------- Start Table
1.57      albertel 1598:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1599:         my $csuname=$env{'user.name'};
                   1600:         my $csudom=$env{'user.domain'};
1.57      albertel 1601: 
1.203     www      1602:         if ($parmlev eq 'full') {
1.57      albertel 1603:            my $coursespan=$csec?8:5;
1.275     raeburn  1604:            my $userspan=3;
1.269     raeburn  1605:            if ($cgroup ne '') {
                   1606:               $coursespan += 3;
                   1607:            } 
                   1608:       
1.57      albertel 1609:            $r->print('<p><table border=2>');
                   1610:            $r->print('<tr><td colspan=5></td>');
1.130     www      1611:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1612:            if ($uname) {
1.275     raeburn  1613:                if (@usersgroups > 1) {
                   1614:                    $userspan ++;
                   1615:                }
                   1616:                $r->print('<th colspan="'.$userspan.'" rowspan="2">');
1.130     www      1617:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1618:            }
1.133     www      1619: 	   my %lt=&Apache::lonlocal::texthash(
                   1620: 				  'pie'    => "Parameter in Effect",
                   1621: 				  'csv'    => "Current Session Value",
                   1622:                                   'at'     => 'at',
                   1623:                                   'rl'     => "Resource Level",
                   1624: 				  'ic'     => 'in Course',
                   1625: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1626: 				  'type'   => 'Type',
1.133     www      1627: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1628: 				  'part'   => 'Part',
1.133     www      1629:                                   'pn'     => 'Parameter Name',
                   1630: 				  'def'    => 'default',
                   1631: 				  'femof'  => 'from Enclosing Map or Folder',
                   1632: 				  'gen'    => 'general',
                   1633: 				  'foremf' => 'for Enclosing Map or Folder',
                   1634: 				  'fr'     => 'for Resource'
                   1635: 					      );
1.57      albertel 1636:            $r->print(<<ENDTABLETWO);
1.133     www      1637: <th rowspan=3>$lt{'pie'}</th>
                   1638: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1639: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1640: <th colspan=1>$lt{'ic'}</th>
                   1641: 
1.10      www      1642: ENDTABLETWO
1.57      albertel 1643:            if ($csec) {
1.133     www      1644:                 $r->print("<th colspan=3>".
1.269     raeburn  1645: 			  &mt("in Section")." $csec</th>");
                   1646:            }
                   1647:            if ($cgroup) {
                   1648:                 $r->print("<th colspan=3>".
                   1649:                           &mt("in Group")." $cgroup</th>");
1.57      albertel 1650:            }
                   1651:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1652: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1653: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1654: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1655: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1656: ENDTABLEHEADFOUR
1.57      albertel 1657: 
                   1658:            if ($csec) {
1.130     www      1659:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1660:            }
                   1661: 
1.269     raeburn  1662:            if ($cgroup) {
                   1663:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
                   1664:            }
                   1665: 
1.57      albertel 1666:            if ($uname) {
1.275     raeburn  1667:                if (@usersgroups > 1) {
                   1668:                    $r->print('<th>'.&mt('Control by other group?').'</th>');
                   1669:                }
1.130     www      1670:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1671:            }
                   1672: 
                   1673:            $r->print('</tr>');
                   1674: 
                   1675:            my $defbgone='';
                   1676:            my $defbgtwo='';
1.269     raeburn  1677:            my $defbgthree = '';
1.57      albertel 1678: 
                   1679:            foreach (@ids) {
                   1680: 
                   1681:                 my $rid=$_;
                   1682:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1683: 
1.152     albertel 1684:                 if ((!$pssymb && 
                   1685: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1686: 		    ||
                   1687: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1688: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1689:                     if ($defbgone eq '"#E0E099"') {
                   1690:                         $defbgone='"#E0E0DD"';
1.57      albertel 1691:                     } else {
1.184     albertel 1692:                         $defbgone='"#E0E099"';
1.57      albertel 1693:                     }
1.184     albertel 1694:                     if ($defbgtwo eq '"#FFFF99"') {
                   1695:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1696:                     } else {
1.184     albertel 1697:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1698:                     }
1.269     raeburn  1699:                     if ($defbgthree eq '"#FFBB99"') {
                   1700:                         $defbgthree='"#FFBBDD"';
                   1701:                     } else {
                   1702:                         $defbgthree='"#FFBB99"';
                   1703:                     }
                   1704: 
1.57      albertel 1705:                     my $thistitle='';
                   1706:                     my %name=   ();
                   1707:                     undef %name;
                   1708:                     my %part=   ();
                   1709:                     my %display=();
                   1710:                     my %type=   ();
                   1711:                     my %default=();
1.196     www      1712:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1713: 
1.210     www      1714:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1715:                         my $tempkeyp = $_;
                   1716:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1717:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1718:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1719:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1720:                           unless ($display{$_}) { $display{$_}=''; }
                   1721:                           $display{$_}.=' ('.$name{$_}.')';
                   1722:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1723:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1724:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1725:                         }
                   1726:                     }
                   1727:                     my $totalparms=scalar keys %name;
                   1728:                     if ($totalparms>0) {
                   1729:                         my $firstrow=1;
1.274     albertel 1730: 			my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.57      albertel 1731:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1732:                              ' rowspan='.$totalparms.
                   1733:                              '><tt><font size=-1>'.
                   1734:                              join(' / ',split(/\//,$uri)).
                   1735:                              '</font></tt><p><b>'.
1.154     albertel 1736:                              "<a href=\"javascript:openWindow('".
1.274     albertel 1737: 				  &Apache::lonnet::clutter($uri).'?symb='.
1.308     www      1738: 				  &escape($symbp{$rid}).
1.57      albertel 1739:                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127     albertel 1740:                              " TARGET=_self>$title");
1.57      albertel 1741: 
                   1742:                         if ($thistitle) {
                   1743:                             $r->print(' ('.$thistitle.')');
                   1744:                         }
                   1745:                         $r->print('</a></b></td>');
                   1746:                         $r->print('<td bgcolor='.$defbgtwo.
                   1747:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1748:                                       '</td>');
                   1749: 
                   1750:                         $r->print('<td bgcolor='.$defbgone.
                   1751:                                       ' rowspan='.$totalparms.
1.238     www      1752:                                       '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57      albertel 1753: 
1.236     albertel 1754:                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57      albertel 1755:                             unless ($firstrow) {
                   1756:                                 $r->print('<tr>');
                   1757:                             } else {
                   1758:                                 undef $firstrow;
                   1759:                             }
1.201     www      1760:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1761:                                        \%type,\%display,$defbgone,$defbgtwo,
1.269     raeburn  1762:                                        $defbgthree,$parmlev,$uname,$udom,$csec,
1.275     raeburn  1763:                                                             $cgroup,\@usersgroups);
1.57      albertel 1764:                         }
                   1765:                     }
                   1766:                 }
                   1767:             } # end foreach ids
1.43      albertel 1768: # -------------------------------------------------- End entry for one resource
1.57      albertel 1769:             $r->print('</table>');
1.203     www      1770:         } # end of  full
1.57      albertel 1771: #--------------------------------------------------- Entry for parm level map
                   1772:         if ($parmlev eq 'map') {
                   1773:             my $defbgone = '"E0E099"';
                   1774:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1775:             my $defbgthree = '"FFBB99"';
1.57      albertel 1776: 
                   1777:             my %maplist;
                   1778: 
                   1779:             if ($pschp eq 'all') {
                   1780:                 %maplist = %allmaps; 
                   1781:             } else {
                   1782:                 %maplist = ($pschp => $mapp{$pschp});
                   1783:             }
                   1784: 
                   1785: #-------------------------------------------- for each map, gather information
                   1786:             my $mapid;
1.60      albertel 1787: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1788:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1789: 
                   1790: #-----------------------  loop through ids and get all parameter types for map
                   1791: #-----------------------------------------          and associated information
                   1792:                 my %name = ();
                   1793:                 my %part = ();
                   1794:                 my %display = ();
                   1795:                 my %type = ();
                   1796:                 my %default = ();
                   1797:                 my $map = 0;
                   1798: 
                   1799: #		$r->print("Catmarker: @catmarker<br />\n");
                   1800:                
                   1801:                 foreach (@ids) {
                   1802:                   ($map)=(/([\d]*?)\./);
                   1803:                   my $rid = $_;
                   1804:         
                   1805: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1806: 
                   1807:                   if ($map eq $mapid) {
1.196     www      1808:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1809: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1810: 
                   1811: #--------------------------------------------------------------------
                   1812: # @catmarker contains list of all possible parameters including part #s
                   1813: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1814: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1815: # When storing information, store as part 0
                   1816: # When requesting information, request from full part
                   1817: #-------------------------------------------------------------------
1.210     www      1818:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1819:                       my $tempkeyp = $_;
                   1820:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1821:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1822:                       
                   1823:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1824:                         $part{$tempkeyp}="0";
                   1825:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1826:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1827:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1828:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1829:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1830:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1831:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1832:                       }
                   1833:                     } # end loop through keys
                   1834:                   }
                   1835:                 } # end loop through ids
                   1836:                                  
                   1837: #---------------------------------------------------- print header information
1.133     www      1838:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1839:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57      albertel 1840:                 $r->print(<<ENDMAPONE);
                   1841: <center><h4>
1.135     albertel 1842: Set Defaults for All Resources in $foldermap<br />
                   1843: <font color="red"><i>$showtitle</i></font><br />
1.57      albertel 1844: Specifically for
                   1845: ENDMAPONE
                   1846:                 if ($uname) {
1.267     albertel 1847: 		    my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 1848:                     $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130     www      1849:                         &mt('in')." \n");
1.57      albertel 1850:                 } else {
1.135     albertel 1851:                     $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57      albertel 1852:                 }
1.269     raeburn  1853:                 if ($cgroup) {
                   1854:                     $r->print(&mt("Group")." <font color=\"red\"><i>$cgroup".
                   1855:                               "</i></font> ".&mt('of')." \n");
                   1856:                     $csec = '';
                   1857:                 } elsif ($csec) {
                   1858:                     $r->print(&mt("Section")." <font color=\"red\"><i>$csec".
                   1859:                               "</i></font> ".&mt('of')." \n");
                   1860:                 }
1.135     albertel 1861:                 $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
                   1862:                 $r->print("</h4>\n");
1.57      albertel 1863: #---------------------------------------------------------------- print table
                   1864:                 $r->print('<p><table border="2">');
1.130     www      1865:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1866:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1867:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1868: 
1.210     www      1869: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1870:                     $r->print('<tr>');
1.201     www      1871:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1872:                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1873:                            $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1874:                 }
                   1875:                 $r->print("</table></center>");
                   1876:             } # end each map
                   1877:         } # end of $parmlev eq map
                   1878: #--------------------------------- Entry for parm level general (Course level)
                   1879:         if ($parmlev eq 'general') {
                   1880:             my $defbgone = '"E0E099"';
                   1881:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1882:             my $defbgthree = '"FFBB99"';
1.57      albertel 1883: 
                   1884: #-------------------------------------------- for each map, gather information
                   1885:             my $mapid="0.0";
                   1886: #-----------------------  loop through ids and get all parameter types for map
                   1887: #-----------------------------------------          and associated information
                   1888:             my %name = ();
                   1889:             my %part = ();
                   1890:             my %display = ();
                   1891:             my %type = ();
                   1892:             my %default = ();
                   1893:                
                   1894:             foreach (@ids) {
                   1895:                 my $rid = $_;
                   1896:         
1.196     www      1897:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1898: 
                   1899: #--------------------------------------------------------------------
                   1900: # @catmarker contains list of all possible parameters including part #s
                   1901: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1902: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1903: # When storing information, store as part 0
                   1904: # When requesting information, request from full part
                   1905: #-------------------------------------------------------------------
1.210     www      1906:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1907:                   my $tempkeyp = $_;
                   1908:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1909:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1910:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1911:                     $part{$tempkeyp}="0";
                   1912:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1913:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1914:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1915:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1916:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1917:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1918:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1919:                   }
                   1920:                 } # end loop through keys
                   1921:             } # end loop through ids
                   1922:                                  
                   1923: #---------------------------------------------------- print header information
1.133     www      1924: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1925:             $r->print(<<ENDMAPONE);
1.133     www      1926: <center><h4>$setdef
1.135     albertel 1927: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1928: ENDMAPONE
                   1929:             if ($uname) {
1.267     albertel 1930: 		my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 1931:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 1932:             } else {
1.135     albertel 1933:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 1934:             }
                   1935:             
1.135     albertel 1936:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306     albertel 1937:             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135     albertel 1938:             $r->print("</h4>\n");
1.57      albertel 1939: #---------------------------------------------------------------- print table
                   1940:             $r->print('<p><table border="2">');
1.130     www      1941:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1942:             $r->print('<th>'.&mt('Default Value').'</th>');
                   1943:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1944: 
1.210     www      1945: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1946:                 $r->print('<tr>');
1.201     www      1947:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1948:                        \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1949:                                    $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1950:             }
                   1951:             $r->print("</table></center>");
                   1952:         } # end of $parmlev eq general
1.43      albertel 1953:     }
1.280     albertel 1954:     $r->print('</form>'.&Apache::loncommon::end_page());
1.57      albertel 1955: } # end sub assessparms
1.30      www      1956: 
1.59      matthew  1957: 
                   1958: ##################################################
                   1959: ##################################################
                   1960: 
                   1961: =pod
                   1962: 
                   1963: =item crsenv
                   1964: 
1.105     matthew  1965: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  1966: be simplified and shortened... someday.
                   1967: 
                   1968: Inputs: $r
                   1969: 
                   1970: Returns: nothing
                   1971: 
                   1972: =cut
                   1973: 
                   1974: ##################################################
                   1975: ##################################################
1.30      www      1976: sub crsenv {
                   1977:     my $r=shift;
                   1978:     my $setoutput='';
1.280     albertel 1979: 
1.298     albertel 1980:     my $breadcrumbs = 
                   1981: 	&Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
1.190     albertel 1982:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1983:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  1984: 
                   1985:     #
                   1986:     # Go through list of changes
1.190     albertel 1987:     foreach (keys %env) {
1.105     matthew  1988:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   1989:         my $name  = $1;
1.190     albertel 1990:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  1991:         if ($name eq 'newp') {
1.190     albertel 1992:             $name = $env{'form.newp_name'};
1.105     matthew  1993:         }
                   1994:         if ($name eq 'url') {
                   1995:             $value=~s/^\/res\///;
                   1996:             my $bkuptime=time;
                   1997:             my @tmp = &Apache::lonnet::get
                   1998:                 ('environment',['url'],$dom,$crs);
1.130     www      1999:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  2000:                 &Apache::lonnet::put
                   2001:                 ('environment',
                   2002:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   2003:                  $dom,$crs).
                   2004:                      '<br>';
                   2005:         }
                   2006:         #
                   2007:         # Deal with modified default spreadsheets
                   2008:         if ($name =~ /^spreadsheet_default_(classcalc|
                   2009:                                             studentcalc|
                   2010:                                             assesscalc)$/x) {
                   2011:             my $sheettype = $1; 
                   2012:             if ($sheettype eq 'classcalc') {
                   2013:                 # no need to do anything since viewing the sheet will
                   2014:                 # cause it to be updated. 
                   2015:             } elsif ($sheettype eq 'studentcalc') {
                   2016:                 # expire all the student spreadsheets
                   2017:                 &Apache::lonnet::expirespread('','','studentcalc');
                   2018:             } else {
                   2019:                 # expire all the assessment spreadsheets 
                   2020:                 #    this includes non-default spreadsheets, but better to
                   2021:                 #    be safe than sorry.
                   2022:                 &Apache::lonnet::expirespread('','','assesscalc');
                   2023:                 # expire all the student spreadsheets
                   2024:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      2025:             }
1.105     matthew  2026:         }
                   2027:         #
1.107     matthew  2028:         # Deal with the enrollment dates
                   2029:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2030:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   2031:         }
1.178     raeburn  2032:         # Get existing cloners
                   2033:         my @oldcloner = ();
                   2034:         if ($name eq 'cloners') {
                   2035:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   2036:             if ($clonenames{'cloners'} =~ /,/) {
                   2037:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   2038:             } else {
                   2039:                 $oldcloner[0] = $clonenames{'cloners'};
                   2040:             }
                   2041:         }
1.107     matthew  2042:         #
1.105     matthew  2043:         # Let the user know we made the changes
1.153     albertel 2044:         if ($name && defined($value)) {
1.239     raeburn  2045:             my $failed_cloners;
1.178     raeburn  2046:             if ($name eq 'cloners') {
1.239     raeburn  2047:                 $value =~ s/\s//g;
1.178     raeburn  2048:                 $value =~ s/^,//;
                   2049:                 $value =~ s/,$//;
1.239     raeburn  2050:                 # check requested clones are valid users.
                   2051:                 $failed_cloners = &check_cloners(\$value,\@oldcloner);
1.178     raeburn  2052:             }
1.105     matthew  2053:             my $put_result = &Apache::lonnet::put('environment',
                   2054:                                                   {$name=>$value},$dom,$crs);
                   2055:             if ($put_result eq 'ok') {
1.130     www      2056:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178     raeburn  2057:                 if ($name eq 'cloners') {
                   2058:                     &change_clone($value,\@oldcloner);
                   2059:                 }
1.179     raeburn  2060:                 # Flush the course logs so course description is immediately updated
                   2061:                 if ($name eq 'description' && defined($value)) {
                   2062:                     &Apache::lonnet::flushcourselogs();
                   2063:                 }
1.105     matthew  2064:             } else {
1.130     www      2065:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   2066: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      2067:             }
1.239     raeburn  2068:             if (($name eq 'cloners') && ($failed_cloners)) {
                   2069:                 $setoutput.= &mt('Unable to include').' - <b>'.$failed_cloners.'</b>, '.
                   2070:                  &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').
                   2071:                  '.<br />'.&mt('Please ').
                   2072:                  ' <a href="/adm/createuser">'.
                   2073:                  &mt('add the user(s)').'</a>, '.
                   2074:                  &mt('and then return to the ').
                   2075:                  '<a href="/admparmset?action=crsenv">'.
                   2076:                  &mt('Course Parameters page').'</a> '.
                   2077:                  &mt('to add the new user(s) to the list of possible cloners').
                   2078:                  '.<br />';
                   2079:             }
1.30      www      2080:         }
1.38      harris41 2081:     }
1.108     www      2082: # ------------------------- Re-init course environment entries for this session
                   2083: 
1.302     albertel 2084:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296     albertel 2085: 				       {'freshen_cache' => 1});
1.105     matthew  2086: 
1.30      www      2087: # -------------------------------------------------------- Get parameters again
1.45      matthew  2088: 
                   2089:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 2090:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 2091:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      2092:     my $output='';
1.45      matthew  2093:     if (! exists($values{'con_lost'})) {
1.30      www      2094:         my %descriptions=
1.140     sakharuk 2095: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  2096:                                  '<a href="javascript:openbrowser'.
1.47      matthew  2097:                                  "('envform','url','sequence')\">".
1.140     sakharuk 2098:                                  &mt('Select Map').'</a><br /><font color=red> '.
                   2099:                                  &mt('Modification may make assessment data inaccessible').
                   2100:                                  '</font>',
                   2101:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 2102:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 2103:                                  '</b><br />'.
                   2104:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  2105:              '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      2106:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   2107:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 2108:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      2109:                     '<a href="javascript:openbrowser'.
                   2110:                     "('envform','default_xml_style'".
1.140     sakharuk 2111:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 2112:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   2113:                                  '</b><br />(<tt>user:domain,'.
1.74      www      2114:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2115:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      2116:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2117:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 2118:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2119:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 2120:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 2121:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 2122:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 2123:                                  &mt('changes will not show until next login').')',
1.169     matthew  2124:              '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  2125: 
1.141     sakharuk 2126:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   2127:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 2128:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  2129:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 2130:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  2131: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   2132:              'plc.users.denied' => 
1.141     sakharuk 2133:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  2134:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   2135: 
1.141     sakharuk 2136:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   2137:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 2138:                                   'student, "<tt>ta</tt>": '.
                   2139:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 2140:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 2141: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      2142:              'pch.users.denied' => 
1.141     sakharuk 2143:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      2144:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  2145:              'spreadsheet_default_classcalc' 
1.141     sakharuk 2146:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  2147:                     '<a href="javascript:openbrowser'.
                   2148:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 2149:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2150:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 2151:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  2152:                     '<a href="javascript:openbrowser'.
                   2153:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 2154:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2155:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 2156:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  2157:                     '<a href="javascript:openbrowser'.
                   2158:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 2159:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 2160: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 2161: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 2162: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  2163:              'allow_discussion_post_editing'
1.276     raeburn  2164:                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />"<tt>st</tt>": '.
                   2165:                                   &mt('student').', "<tt>ta</tt>": '.
                   2166:                                   'TA, "<tt>in</tt>": '.
                   2167:                                   &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 />'.
                   2168:                     '('.&mt('or set value to "[_1]" to allow all roles',"<tt>yes</tt>").')',
1.89      albertel 2169: 	     'rndseed'
1.140     sakharuk 2170: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
                   2171:                     '<font color="red">'.&mt('Modifying this will make problems').' '.
                   2172:                     &mt('have different numbers and answers').'</font>',
1.151     albertel 2173: 	     'receiptalg'
                   2174: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   2175:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 2176:              'suppress_tries'
1.272     albertel 2177:                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.273     www      2178:                     ' ('.&mt('"[_1]" to suppress, anything else to not suppress','<tt>yes</tt>').')',
1.113     sakharuk 2179:              'problem_stream_switch'
1.141     sakharuk 2180:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 2181:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 2182:              'default_paper_size' 
                   2183:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   2184:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   2185:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   2186:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 2187:              'anonymous_quiz'
1.150     www      2188:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 2189:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1.217     albertel 2190:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
                   2191:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
1.150     www      2192:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   2193:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 2194:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      2195:              'disable_receipt_display'
1.141     sakharuk 2196:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 2197:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163     albertel 2198: 	     'disablesigfigs'
                   2199: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   2200:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251     albertel 2201: 	     'disableexampointprint'
                   2202: 	         => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                   2203:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278     www      2204:              'externalsyllabus'
1.279     www      2205:                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149     albertel 2206: 	     'tthoptions'
                   2207: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  2208:              ); 
1.177     raeburn  2209:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.278     www      2210:                              'externalsyllabus',
1.107     matthew  2211:                              'default_xml_style','pageseparators',
                   2212:                              'question.email','comment.email','policy.email',
1.169     matthew  2213:                              'student_classlist_view',
1.118     matthew  2214:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  2215:                              'pch.roles.denied','pch.users.denied',
                   2216:                              'allow_limited_html_in_feedback',
1.170     raeburn  2217:                              'allow_discussion_post_editing',
1.108     www      2218:                              'languages',
1.150     www      2219: 			     'nothideprivileged',
1.107     matthew  2220:                              'rndseed',
1.151     albertel 2221:                              'receiptalg',
1.107     matthew  2222:                              'problem_stream_switch',
1.164     sakharuk 2223: 			     'suppress_tries',
1.161     sakharuk 2224:                              'default_paper_size',
1.115     www      2225:                              'disable_receipt_display',
1.107     matthew  2226:                              'spreadsheet_default_classcalc',
                   2227:                              'spreadsheet_default_studentcalc',
                   2228:                              'spreadsheet_default_assesscalc', 
                   2229:                              'hideemptyrows',
                   2230:                              'default_enrollment_start_date',
                   2231:                              'default_enrollment_end_date',
1.163     albertel 2232: 			     'tthoptions',
1.251     albertel 2233: 			     'disablesigfigs',
                   2234: 			     'disableexampointprint'
1.107     matthew  2235:                              );
                   2236: 	foreach my $parameter (sort(keys(%values))) {
1.244     banghart 2237:             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
1.142     raeburn  2238:                 if (! $descriptions{$parameter}) {
                   2239:                     $descriptions{$parameter}=$parameter;
                   2240:                     push(@Display_Order,$parameter);
                   2241:                 }
                   2242:             }
1.43      albertel 2243: 	}
1.107     matthew  2244:         foreach my $parameter (@Display_Order) {
                   2245:             my $description = $descriptions{$parameter};
1.51      matthew  2246:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      2247:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  2248:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  2249:                 '.checked=true;"';
1.107     matthew  2250:             $output .= '<tr><td>'.$description.'</td>';
                   2251:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   2252:                 $output .= '<td>'.
                   2253:                     &Apache::lonhtmlcommon::date_setter('envform',
                   2254:                                                         $parameter.'_value',
                   2255:                                                         $values{$parameter},
                   2256:                                                         $onchange).
                   2257:                                                         '</td>';
                   2258:             } else {
                   2259:                 $output .= '<td>'.
                   2260:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   2261:                                                     $values{$parameter},
                   2262:                                                     40,$onchange).'</td>';
                   2263:             }
                   2264:             $output .= '<td>'.
                   2265:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   2266:                 '</td>';
                   2267:             $output .= "</tr>\n";
1.51      matthew  2268: 	}
1.69      www      2269:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  2270:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   2271:             '.checked=true;"';
1.130     www      2272: 	$output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  2273: 	    '<input type="text" size=40 name="newp_name" '.
                   2274:                 $onchange.' /></td><td>'.
                   2275:             '<input type="text" size=40 name="newp_value" '.
                   2276:                 $onchange.' /></td><td>'.
                   2277: 	    '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43      albertel 2278:     }
1.157     sakharuk 2279:     my %lt=&Apache::lonlocal::texthash(
                   2280: 		    'par'   => 'Parameter',
                   2281: 		    'val'   => 'Value',
                   2282: 		    'set'   => 'Set',
                   2283: 		    'sce'   => 'Set Course Environment'
                   2284: 				       );
                   2285: 
1.140     sakharuk 2286:     my $Parameter=&mt('Parameter');
                   2287:     my $Value=&mt('Value');
1.141     sakharuk 2288:     my $Set=&mt('Set');
1.280     albertel 2289:     my $browse_js=
                   2290: 	'<script type="text/javascript" language="Javascript">'.
                   2291: 	&Apache::loncommon::browser_and_searcher_javascript('parmset').
                   2292: 	'</script>';
                   2293:     
                   2294:     my $start_page = 
                   2295: 	&Apache::loncommon::start_page('Set Course Environment Parameters',
                   2296: 				       $browse_js);
                   2297:     my $end_page = 
                   2298: 	&Apache::loncommon::end_page();
                   2299:     $r->print(<<ENDENV);
                   2300: $start_page
1.193     albertel 2301: $breadcrumbs
                   2302: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      2303: $setoutput
                   2304: <p>
                   2305: <table border=2>
1.157     sakharuk 2306: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30      www      2307: $output
                   2308: </table>
1.157     sakharuk 2309: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      2310: </form>
1.280     albertel 2311: $end_page
                   2312: ENDENV
1.30      www      2313: }
1.120     www      2314: ##################################################
1.207     www      2315: # Overview mode
                   2316: ##################################################
1.124     www      2317: my $tableopen;
                   2318: 
                   2319: sub tablestart {
                   2320:     if ($tableopen) {
                   2321: 	return '';
                   2322:     } else {
                   2323: 	$tableopen=1;
1.295     albertel 2324: 	return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130     www      2325: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      2326:     }
                   2327: }
                   2328: 
                   2329: sub tableend {
                   2330:     if ($tableopen) {
                   2331: 	$tableopen=0;
1.295     albertel 2332: 	return &Apache::loncommon::end_data_table();
1.124     www      2333:     } else {
                   2334: 	return'';
                   2335:     }
                   2336: }
                   2337: 
1.207     www      2338: sub readdata {
                   2339:     my ($crs,$dom)=@_;
                   2340: # Read coursedata
                   2341:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   2342: # Read userdata
                   2343: 
                   2344:     my $classlist=&Apache::loncoursedata::get_classlist();
                   2345:     foreach (keys %$classlist) {
                   2346:         # the following undefs are for 'domain', and 'username' respectively.
                   2347:         if ($_=~/^(\w+)\:(\w+)$/) {
                   2348: 	    my ($tuname,$tudom)=($1,$2);
                   2349: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   2350:             foreach my $userkey (keys %{$useropt}) {
                   2351: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   2352:                     my $newkey=$userkey;
                   2353: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   2354: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   2355: 		}
                   2356: 	    }
                   2357: 	}
                   2358:     }
                   2359:     return $resourcedata;
                   2360: }
                   2361: 
                   2362: 
1.124     www      2363: # Setting
1.208     www      2364: 
                   2365: sub storedata {
                   2366:     my ($r,$crs,$dom)=@_;
1.207     www      2367: # Set userlevel immediately
                   2368: # Do an intermediate store of course level
                   2369:     my $olddata=&readdata($crs,$dom);
1.124     www      2370:     my %newdata=();
                   2371:     undef %newdata;
                   2372:     my @deldata=();
                   2373:     undef @deldata;
1.190     albertel 2374:     foreach (keys %env) {
1.124     www      2375: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   2376: 	    my $cmd=$1;
                   2377: 	    my $thiskey=$2;
1.207     www      2378: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   2379: 	    my $tkey=$thiskey;
                   2380:             if ($tuname) {
                   2381: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   2382: 	    }
1.124     www      2383: 	    if ($cmd eq 'set') {
1.190     albertel 2384: 		my $data=$env{$_};
1.212     www      2385:                 my $typeof=$env{'form.typeof_'.$thiskey};
                   2386:  		if ($$olddata{$thiskey} ne $data) { 
1.207     www      2387: 		    if ($tuname) {
1.212     www      2388: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2389: 								 $tkey.'.type' => $typeof},
                   2390: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2391: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2392: 			    $r->print('<br />'.&mt('Stored modified parameter for').' '.
                   2393: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   2394: 			} else {
                   2395: 			    $r->print('<h2><font color="red">'.
                   2396: 				      &mt('Error storing parameters').'</font></h2>');
                   2397: 			}
                   2398: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2399: 		    } else {
                   2400: 			$newdata{$thiskey}=$data;
1.212     www      2401:  			$newdata{$thiskey.'.type'}=$typeof; 
                   2402:                    } 
1.207     www      2403: 		}
1.124     www      2404: 	    } elsif ($cmd eq 'del') {
1.207     www      2405: 		if ($tuname) {
                   2406: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290     www      2407: 			    &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207     www      2408: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2409: 		    } else {
                   2410: 			$r->print('<h2><font color="red">'.
                   2411: 				  &mt('Error deleting parameters').'</font></h2>');
                   2412: 		    }
                   2413: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2414: 		} else {
                   2415: 		    push (@deldata,$thiskey);
                   2416: 		}
1.124     www      2417: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 2418: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212     www      2419:                 my $typeof=$env{'form.typeof_'.$thiskey};
1.207     www      2420: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
                   2421: 		    if ($tuname) {
1.212     www      2422: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2423: 								 $tkey.'.type' => $typeof},
                   2424: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2425: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2426: 			    $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2427: 			} else {
                   2428: 			    $r->print('<h2><font color="red">'.
                   2429: 				      &mt('Error storing parameters').'</font></h2>');
                   2430: 			}
                   2431: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2432: 		    } else {
1.212     www      2433: 			$newdata{$thiskey}=$data;
                   2434: 			$newdata{$thiskey.'.type'}=$typeof; 
1.207     www      2435: 		    }
                   2436: 		}
1.124     www      2437: 	    }
                   2438: 	}
                   2439:     }
1.207     www      2440: # Store all course level
1.144     www      2441:     my $delentries=$#deldata+1;
                   2442:     my @newdatakeys=keys %newdata;
                   2443:     my $putentries=$#newdatakeys+1;
                   2444:     if ($delentries) {
                   2445: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290     www      2446: 	    my %loghash=map { $_ => '' } @deldata;
                   2447: 	    &log_parmset(\%loghash,1);
1.144     www      2448: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2449: 	} else {
                   2450: 	    $r->print('<h2><font color="red">'.
                   2451: 		      &mt('Error deleting parameters').'</font></h2>');
                   2452: 	}
1.205     www      2453: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2454:     }
                   2455:     if ($putentries) {
                   2456: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290     www      2457: 			    &log_parmset(\%newdata,0);
1.212     www      2458: 	    $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2459: 	} else {
                   2460: 	    $r->print('<h2><font color="red">'.
                   2461: 		      &mt('Error storing parameters').'</font></h2>');
                   2462: 	}
1.205     www      2463: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2464:     }
1.208     www      2465: }
1.207     www      2466: 
1.208     www      2467: sub extractuser {
                   2468:     my $key=shift;
                   2469:     return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
                   2470: }
1.206     www      2471: 
1.208     www      2472: sub listdata {
1.214     www      2473:     my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207     www      2474: # Start list output
1.206     www      2475: 
1.122     www      2476:     my $oldsection='';
                   2477:     my $oldrealm='';
                   2478:     my $oldpart='';
1.123     www      2479:     my $pointer=0;
1.124     www      2480:     $tableopen=0;
1.145     www      2481:     my $foundkeys=0;
1.248     albertel 2482:     my %keyorder=&standardkeyorder();
1.214     www      2483:     foreach my $thiskey (sort {
                   2484: 	if ($sortorder eq 'realmstudent') {
1.247     albertel 2485: 	    my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2486: 	    my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2487: 	    if (!defined($astudent)) {
                   2488: 		($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.237     albertel 2489: 	    }
1.247     albertel 2490: 	    if (!defined($bstudent)) {
                   2491: 		($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
                   2492: 	    }
1.248     albertel 2493: 	    $arealm=~s/\.type//;
                   2494: 	    my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/);
                   2495: 	    $aparm=$keyorder{'parameter_0_'.$aparm};
                   2496: 	    $brealm=~s/\.type//;
                   2497: 	    my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/);
                   2498: 	    $bparm=$keyorder{'parameter_0_'.$bparm};	   
                   2499: 	    if ($ares eq $bres) {
                   2500: 		if (defined($aparm) && defined($bparm)) {
                   2501: 		    ($aparm <=> $bparm);
                   2502: 		} elsif (defined($aparm)) {
                   2503: 		    -1;
                   2504: 		} elsif (defined($bparm)) {
                   2505: 		    1;
                   2506: 		} else {
                   2507: 		    ($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2508: 		}
                   2509: 	    } else {
                   2510: 		($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2511: 	    }
1.214     www      2512: 	} else {
                   2513: 	    $a cmp $b;
                   2514: 	}
                   2515:     } keys %{$listdata}) {
1.247     albertel 2516: 	 
1.211     www      2517: 	if ($$listdata{$thiskey.'.type'}) {
                   2518:             my $thistype=$$listdata{$thiskey.'.type'};
                   2519:             if ($$resourcedata{$thiskey.'.type'}) {
                   2520: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2521: 	    }
1.207     www      2522: 	    my ($middle,$part,$name)=
                   2523: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2524: 	    my $section=&mt('All Students');
1.207     www      2525: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2526: 		my $issection=$1;
                   2527: 		if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
                   2528: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2529: 		} else {
                   2530: 		    $section=&mt('Group/Section').': '.$issection;
                   2531: 		}
1.207     www      2532: 		$middle=~s/^\[(.*)\]//;
1.122     www      2533: 	    }
1.207     www      2534: 	    $middle=~s/\.+$//;
                   2535: 	    $middle=~s/^\.+//;
1.130     www      2536: 	    my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122     www      2537: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174     albertel 2538: 		$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122     www      2539: 	    } elsif ($middle) {
1.174     albertel 2540: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   2541: 		$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      2542: 	    }
1.214     www      2543: 	    if ($sortorder eq 'realmstudent') {
                   2544: 		if ($realm ne $oldrealm) {
                   2545: 		    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                   2546: 		    $oldrealm=$realm;
                   2547: 		    $oldsection='';
                   2548: 		}
                   2549: 		if ($section ne $oldsection) {
                   2550: 		    $r->print(&tableend()."\n<h2>$section</h2>");
                   2551: 		    $oldsection=$section;
                   2552: 		    $oldpart='';
                   2553: 		}
                   2554: 	    } else {
                   2555: 		if ($section ne $oldsection) {
                   2556: 		    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                   2557: 		    $oldsection=$section;
                   2558: 		    $oldrealm='';
                   2559: 		}
                   2560: 		if ($realm ne $oldrealm) {
                   2561: 		    $r->print(&tableend()."\n<h2>$realm</h2>");
                   2562: 		    $oldrealm=$realm;
                   2563: 		    $oldpart='';
                   2564: 		}
1.122     www      2565: 	    }
                   2566: 	    if ($part ne $oldpart) {
1.124     www      2567: 		$r->print(&tableend().
1.214     www      2568: 			  "\n<font color='blue'>".&mt('Part').": $part</font>");
1.122     www      2569: 		$oldpart=$part;
                   2570: 	    }
1.123     www      2571: #
1.230     www      2572: # Preset defaults?
                   2573: #
                   2574:             my ($hour,$min,$sec,$val)=('','','','');
                   2575: 	    unless ($$resourcedata{$thiskey}) {
                   2576: 		my ($parmname)=($thiskey=~/\.(\w+)$/);
                   2577: 		($hour,$min,$sec,$val)=&preset_defaults($parmname);
                   2578: 	    }
                   2579: 
                   2580: #
1.123     www      2581: # Ready to print
                   2582: #
1.295     albertel 2583: 	    $r->print(&tablestart().
                   2584: 		      &Apache::loncommon::start_data_table_row().
                   2585: 		      '<td><b>'.&standard_parameter_names($name).
1.293     www      2586: 		      '</b></td><td><input type="checkbox" name="del_'.
1.124     www      2587: 		      $thiskey.'" /></td><td>');
1.145     www      2588: 	    $foundkeys++;
1.213     www      2589: 	    if (&isdateparm($thistype)) {
1.123     www      2590: 		my $jskey='key_'.$pointer;
                   2591: 		$pointer++;
                   2592: 		$r->print(
1.232     albertel 2593: 			  &Apache::lonhtmlcommon::date_setter('parmform',
1.123     www      2594: 							      $jskey,
1.219     www      2595: 						      $$resourcedata{$thiskey},
1.230     www      2596: 							      '',1,'','',$hour,$min,$sec).
1.277     www      2597: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
                   2598: &date_sanity_info($$resourcedata{$thiskey})
1.123     www      2599: 			  );
1.219     www      2600: 	    } elsif ($thistype eq 'string_yesno') {
1.230     www      2601: 		my $showval;
                   2602: 		if (defined($$resourcedata{$thiskey})) {
                   2603: 		    $showval=$$resourcedata{$thiskey};
                   2604: 		} else {
                   2605: 		    $showval=$val;
                   2606: 		}
1.219     www      2607: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2608: 			  '" value="yes"');
1.230     www      2609: 		if ($showval eq 'yes') {
1.219     www      2610: 		    $r->print(' checked="checked"');
                   2611: 		}
                   2612:                 $r->print(' />'.&mt('Yes').'</label> ');
                   2613: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2614: 			  '" value="no"');
1.230     www      2615: 		if ($showval eq 'no') {
1.219     www      2616: 		    $r->print(' checked="checked"');
                   2617: 		}
                   2618:                 $r->print(' />'.&mt('No').'</label>');
1.123     www      2619: 	    } else {
1.230     www      2620: 		my $showval;
                   2621: 		if (defined($$resourcedata{$thiskey})) {
                   2622: 		    $showval=$$resourcedata{$thiskey};
                   2623: 		} else {
                   2624: 		    $showval=$val;
                   2625: 		}
1.211     www      2626: 		$r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.230     www      2627: 			  $showval.'">');
1.123     www      2628: 	    }
1.211     www      2629: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2630: 		      $thistype.'">');
1.295     albertel 2631: 	    $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122     www      2632: 	}
1.121     www      2633:     }
1.208     www      2634:     return $foundkeys;
                   2635: }
                   2636: 
                   2637: sub newoverview {
1.280     albertel 2638:     my ($r) = @_;
                   2639: 
1.208     www      2640:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2641:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2642:     my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298     albertel 2643:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2644:     $r->print(<<ENDOVER);
1.280     albertel 2645: $start_page
1.208     www      2646: $breadcrumbs
1.232     albertel 2647: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      2648: ENDOVER
1.211     www      2649:     my @ids=();
                   2650:     my %typep=();
                   2651:     my %keyp=();
                   2652:     my %allparms=();
                   2653:     my %allparts=();
                   2654:     my %allmaps=();
                   2655:     my %mapp=();
                   2656:     my %symbp=();
                   2657:     my %maptitles=();
                   2658:     my %uris=();
                   2659:     my %keyorder=&standardkeyorder();
                   2660:     my %defkeytype=();
                   2661: 
                   2662:     my %alllevs=();
                   2663:     $alllevs{'Resource Level'}='full';
1.215     www      2664:     $alllevs{'Map/Folder Level'}='map';
1.211     www      2665:     $alllevs{'Course Level'}='general';
                   2666: 
                   2667:     my $csec=$env{'form.csec'};
1.269     raeburn  2668:     my $cgroup=$env{'form.cgroup'};
1.211     www      2669: 
                   2670:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   2671:     my $pschp=$env{'form.pschp'};
                   2672:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   2673:     if (!@psprt) { $psprt[0]='0'; }
                   2674: 
                   2675:     my @selected_sections = 
                   2676: 	&Apache::loncommon::get_env_multiple('form.Section');
                   2677:     @selected_sections = ('all') if (! @selected_sections);
                   2678:     foreach (@selected_sections) {
                   2679:         if ($_ eq 'all') {
                   2680:             @selected_sections = ('all');
                   2681:         }
                   2682:     }
1.269     raeburn  2683:     my @selected_groups =
                   2684:         &Apache::loncommon::get_env_multiple('form.Group');
1.211     www      2685: 
                   2686:     my $pssymb='';
                   2687:     my $parmlev='';
                   2688:  
                   2689:     unless ($env{'form.parmlev'}) {
                   2690:         $parmlev = 'map';
                   2691:     } else {
                   2692:         $parmlev = $env{'form.parmlev'};
                   2693:     }
                   2694: 
                   2695:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   2696: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   2697: 				\%keyorder,\%defkeytype);
                   2698: 
                   2699: # Menu to select levels, etc
                   2700: 
                   2701:     $r->print('<table border="1"><tr><td>');
                   2702:     &levelmenu($r,\%alllevs,$parmlev);
                   2703:     if ($parmlev ne 'general') {
                   2704: 	$r->print('<td>');
                   2705: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   2706: 	$r->print('</td>');
                   2707:     }
                   2708:     $r->print('</td></tr></table>');
                   2709: 
                   2710:     $r->print('<table border="1"><tr><td>');  
                   2711:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.269     raeburn  2712:     $r->print('</td><td><table border="0" cellspacing="0" cellpadding="0">'.
                   2713:               '<tr><td>'.&mt('Parts').'</td><td></td><td>'.&mt('Section(s)').
                   2714:               '</td><td></td><td>'.&mt('Group(s)').'</td></tr><tr><td>');
1.211     www      2715:     &partmenu($r,\%allparts,\@psprt);
1.269     raeburn  2716:     $r->print('</td><td>&nbsp;</td><td>');
1.211     www      2717:     &sectionmenu($r,\@selected_sections);
1.269     raeburn  2718:     $r->print('</td><td>&nbsp;</td><td>');
                   2719:     &groupmenu($r,\@selected_groups);
                   2720:     $r->print('</td></tr></table>');
1.214     www      2721:     $r->print('</td></tr></table>');
                   2722:  
                   2723:     my $sortorder=$env{'form.sortorder'};
                   2724:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2725:     &sortmenu($r,$sortorder);
                   2726: 
                   2727:     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      2728: 
                   2729: # Build the list data hash from the specified parms
                   2730: 
                   2731:     my $listdata;
                   2732:     %{$listdata}=();
                   2733: 
                   2734:     foreach my $cat (@pscat) {
1.269     raeburn  2735:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
                   2736:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211     www      2737:     }
                   2738: 
1.212     www      2739:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      2740: 
1.212     www      2741: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      2742: 
                   2743: # Read modified data
                   2744: 
                   2745: 	my $resourcedata=&readdata($crs,$dom);
                   2746: 
                   2747: # List data
                   2748: 
1.214     www      2749: 	&listdata($r,$resourcedata,$listdata,$sortorder);
1.211     www      2750:     }
                   2751:     $r->print(&tableend().
1.212     www      2752: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
1.280     albertel 2753: 	      '</form>'.&Apache::loncommon::end_page());
1.208     www      2754: }
                   2755: 
1.269     raeburn  2756: sub secgroup_lister {
                   2757:     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
                   2758:     foreach my $item (@{$selections}) {
                   2759:         foreach my $part (@{$psprt}) {
                   2760:             my $rootparmkey=$env{'request.course.id'};
                   2761:             if (($item ne 'all') && ($item ne 'none') && ($item)) {
                   2762:                 $rootparmkey.='.['.$item.']';
                   2763:             }
                   2764:             if ($parmlev eq 'general') {
                   2765: # course-level parameter
                   2766:                 my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   2767:                 $$listdata{$newparmkey}=1;
                   2768:                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2769:             } elsif ($parmlev eq 'map') {
                   2770: # map-level parameter
                   2771:                 foreach my $mapid (keys %{$allmaps}) {
                   2772:                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   2773:                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                   2774:                     $$listdata{$newparmkey}=1;
                   2775:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2776:                 }
                   2777:             } else {
                   2778: # resource-level parameter
                   2779:                 foreach my $rid (@{$ids}) {
                   2780:                     my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
                   2781:                     if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
                   2782:                     my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
                   2783:                     $$listdata{$newparmkey}=1;
                   2784:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2785:                 }
                   2786:             }
                   2787:         }
                   2788:     }
                   2789: }
                   2790: 
1.208     www      2791: sub overview {
1.280     albertel 2792:     my ($r) = @_;
1.208     www      2793:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2794:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2795: 
                   2796:     my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298     albertel 2797:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2798:     $r->print(<<ENDOVER);
1.280     albertel 2799: $start_page
1.208     www      2800: $breadcrumbs
1.232     albertel 2801: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208     www      2802: ENDOVER
                   2803: # Store modified
                   2804: 
                   2805:     &storedata($r,$crs,$dom);
                   2806: 
                   2807: # Read modified data
                   2808: 
                   2809:     my $resourcedata=&readdata($crs,$dom);
                   2810: 
1.214     www      2811: 
                   2812:     my $sortorder=$env{'form.sortorder'};
                   2813:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2814:     &sortmenu($r,$sortorder);
                   2815: 
1.208     www      2816: # List data
                   2817: 
1.214     www      2818:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208     www      2819: 
1.145     www      2820:     $r->print(&tableend().'<p>'.
1.280     albertel 2821: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
                   2822: 	      &Apache::loncommon::end_page());
1.120     www      2823: }
1.121     www      2824: 
1.59      matthew  2825: ##################################################
                   2826: ##################################################
1.178     raeburn  2827:                                                                                             
                   2828: =pod
1.239     raeburn  2829: 
                   2830: =item check_cloners
                   2831: 
                   2832: Checks if new users included in list of allowed cloners
                   2833: are valid users.  Replaces supplied list with 
                   2834: cleaned list containing only users with valid usernames
                   2835: and domains.
                   2836: 
                   2837: Inputs: $clonelist, $oldcloner 
                   2838: where $clonelist is ref to array of requested cloners,
                   2839: and $oldcloner is ref to array of currently allowed
                   2840: cloners.
                   2841: 
                   2842: Returns: string - comma separated list of requested
                   2843: cloners (username:domain) who do not exist in system.
                   2844: 
                   2845: =item change_clone
                   2846: 
1.178     raeburn  2847: Modifies the list of courses a user can clone (stored
1.239     raeburn  2848: in the user's environment.db file), called when a
1.178     raeburn  2849: change is made to the list of users allowed to clone
                   2850: a course.
1.239     raeburn  2851: 
1.178     raeburn  2852: Inputs: $action,$cloner
                   2853: where $action is add or drop, and $cloner is identity of 
                   2854: user for whom cloning ability is to be changed in course. 
                   2855: 
                   2856: =cut
                   2857:                                                                                             
                   2858: ##################################################
                   2859: ##################################################
                   2860: 
1.239     raeburn  2861: sub extract_cloners {
                   2862:     my ($clonelist,$allowclone) = @_;
                   2863:     if ($clonelist =~ /,/) {
                   2864:         @{$allowclone} = split/,/,$clonelist;
                   2865:     } else {
                   2866:         $$allowclone[0] = $clonelist;
                   2867:     }
                   2868: }
                   2869: 
                   2870: 
                   2871: sub check_cloners {
                   2872:     my ($clonelist,$oldcloner) = @_;
                   2873:     my ($clean_clonelist,$disallowed);
                   2874:     my @allowclone = ();
                   2875:     &extract_cloners($$clonelist,\@allowclone);
                   2876:     foreach my $currclone (@allowclone) {
                   2877:         if (!grep/^$currclone$/,@$oldcloner) {
                   2878:             my ($uname,$udom) = split/:/,$currclone;
                   2879:             if ($uname && $udom) {
                   2880:                 if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2881:                     $disallowed .= $currclone.',';   
                   2882:                 } else {
                   2883:                     $clean_clonelist .= $currclone.',';
                   2884:                 }
                   2885:             }
                   2886:         } else {
                   2887:             $clean_clonelist .= $currclone.',';
                   2888:         }
                   2889:     }
                   2890:     if ($disallowed) {
                   2891:         $disallowed =~ s/,$//;
                   2892:     }
                   2893:     if ($clean_clonelist) {
                   2894:         $clean_clonelist =~ s/,$//;
                   2895:     }
                   2896:     $$clonelist = $clean_clonelist;
                   2897:     return $disallowed;
                   2898: }  
1.178     raeburn  2899: 
                   2900: sub change_clone {
                   2901:     my ($clonelist,$oldcloner) = @_;
                   2902:     my ($uname,$udom);
1.190     albertel 2903:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2904:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  2905:     my $clone_crs = $cnum.':'.$cdom;
                   2906:     
                   2907:     if ($cnum && $cdom) {
1.239     raeburn  2908:         my @allowclone;
                   2909:         &extract_cloners($clonelist,\@allowclone);
1.178     raeburn  2910:         foreach my $currclone (@allowclone) {
                   2911:             if (!grep/^$currclone$/,@$oldcloner) {
                   2912:                 ($uname,$udom) = split/:/,$currclone;
                   2913:                 if ($uname && $udom) {
                   2914:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2915:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2916:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2917:                             if ($currclonecrs{'cloneable'} eq '') {
                   2918:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2919:                             } else {
                   2920:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2921:                             }
                   2922:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2923:                         }
                   2924:                     }
                   2925:                 }
                   2926:             }
                   2927:         }
                   2928:         foreach my $oldclone (@$oldcloner) {
                   2929:             if (!grep/^$oldclone$/,@allowclone) {
                   2930:                 ($uname,$udom) = split/:/,$oldclone;
                   2931:                 if ($uname && $udom) {
                   2932:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2933:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2934:                         my %newclonecrs = ();
                   2935:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2936:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2937:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2938:                                 foreach (@currclonecrs) {
                   2939:                                     unless ($_ eq $clone_crs) {
                   2940:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2941:                                     }
                   2942:                                 }
                   2943:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2944:                             } else {
                   2945:                                 $newclonecrs{'cloneable'} = '';
                   2946:                             }
                   2947:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2948:                         }
                   2949:                     }
                   2950:                 }
                   2951:             }
                   2952:         }
                   2953:     }
                   2954: }
                   2955: 
1.193     albertel 2956: 
                   2957: ##################################################
                   2958: ##################################################
                   2959: 
                   2960: =pod
                   2961: 
                   2962: =item * header
                   2963: 
                   2964: Output html header for page
                   2965: 
                   2966: =cut
                   2967: 
                   2968: ##################################################
                   2969: ##################################################
                   2970: sub header {
1.280     albertel 2971:     return &Apache::loncommon::start_page('Parameter Manager');
1.193     albertel 2972: }
                   2973: ##################################################
                   2974: ##################################################
                   2975: sub print_main_menu {
                   2976:     my ($r,$parm_permission)=@_;
                   2977:     #
                   2978:     $r->print(<<ENDMAINFORMHEAD);
                   2979: <form method="post" enctype="multipart/form-data"
                   2980:       action="/adm/parmset" name="studentform">
                   2981: ENDMAINFORMHEAD
                   2982: #
1.195     albertel 2983:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2984:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268     albertel 2985:     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
                   2986: 
1.193     albertel 2987:     my @menu =
                   2988:         (
                   2989:           { text => 'Set Course Environment Parameters',
1.204     www      2990: 	    action => 'crsenv',
1.193     albertel 2991:             permission => $parm_permission,
                   2992:             },
1.255     banghart 2993:           { text => 'Set Portfolio Metadata',
1.259     banghart 2994: 	    action => 'setrestrictmeta',
1.240     banghart 2995:             permission => $parm_permission,
                   2996:             },
1.271     www      2997: 	  { text => 'Manage Course Slots',
1.268     albertel 2998: 	    url => '/adm/slotrequest?command=showslots',
                   2999: 	    permission => $vgr,
                   3000:             },
                   3001: 	  { divider => 1,
                   3002: 	    },
1.216     www      3003:           { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193     albertel 3004:             url => '/adm/helper/parameter.helper',
                   3005:             permission => $parm_permission,
                   3006:             },
1.216     www      3007:           { text => 'Modify Resource Parameters - Overview Mode',
1.193     albertel 3008:             action => 'setoverview',
                   3009:             permission => $parm_permission,
1.208     www      3010:             },          
1.216     www      3011: 	  { text => 'Set Resource Parameters - Overview Mode',
1.208     www      3012:             action => 'newoverview',
                   3013:             permission => $parm_permission,
1.193     albertel 3014:             },
1.216     www      3015:           { text => 'Set/Modify Resource Parameters - Table Mode',
1.193     albertel 3016:             action => 'settable',
                   3017:             permission => $parm_permission,
1.204     www      3018:             help => 'Cascading_Parameters',
1.193     albertel 3019:             },
1.220     www      3020:           { text => 'Set Parameter Setting Default Actions',
                   3021:             action => 'setdefaults',
                   3022:             permission => $parm_permission,
1.284     www      3023:             },          
1.292     www      3024: 	  { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284     www      3025:             action => 'parameterchangelog',
                   3026:             permission => $parm_permission,
1.220     www      3027:             },
1.193     albertel 3028:           );
                   3029:     my $menu_html = '';
                   3030:     foreach my $menu_item (@menu) {
1.268     albertel 3031: 	if ($menu_item->{'divider'}) {
                   3032: 	    $menu_html .= '<hr />';
                   3033: 	    next;
                   3034: 	}
1.193     albertel 3035:         next if (! $menu_item->{'permission'});
                   3036:         $menu_html.='<p>';
                   3037:         $menu_html.='<font size="+1">';
                   3038:         if (exists($menu_item->{'url'})) {
                   3039:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   3040:         } else {
                   3041:             $menu_html.=
                   3042:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   3043:         }
                   3044:         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
                   3045:         if (exists($menu_item->{'help'})) {
                   3046:             $menu_html.=
                   3047:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   3048:         }
                   3049:         $menu_html.='</p>'.$/;
                   3050:     }
                   3051:     $r->print($menu_html);
                   3052:     return;
                   3053: }
1.255     banghart 3054: ### Set portfolio metadata
1.252     banghart 3055: sub output_row {
1.255     banghart 3056:     my ($r, $field_name, $field_text) = @_;
1.252     banghart 3057:     my $output;
1.263     banghart 3058:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3059:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.254     banghart 3060:     unless (defined($options)) {
                   3061:         $options = 'active,stuadd';
1.261     banghart 3062:         $values = '';
1.252     banghart 3063:     }
1.260     banghart 3064:     $output.='<strong>'.$field_text.':</strong>';
1.264     albertel 3065:     $output.='<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /><br />';
                   3066: 
                   3067:     my @options= ( ['active', 'Show to student'],
                   3068: 		   ['onlyone','Student may select only one choice'],
                   3069: 		   ['stuadd', 'Student may type choices']);
                   3070:     foreach my $opt (@options) {
                   3071: 	my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
                   3072: 	$output.=('&nbsp;'x5).'<label><input type="checkbox" name="'.
                   3073: 	    $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3074: 	    &mt($opt->[1]).'</label> <br />';
1.252     banghart 3075:     }
                   3076:     return ($output);
                   3077: }
1.259     banghart 3078: 
                   3079: sub setrestrictmeta {
1.240     banghart 3080:     my ($r)=@_;
1.242     banghart 3081:     my $next_meta;
1.244     banghart 3082:     my $output;
1.245     banghart 3083:     my $item_num;
1.246     banghart 3084:     my $put_result;
1.280     albertel 3085:     
                   3086:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 3087:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 3088:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3089:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259     banghart 3090:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 3091:     my $save_field = '';
1.259     banghart 3092:     if ($env{'form.restrictmeta'}) {
1.254     banghart 3093:         foreach my $field (sort(keys(%env))) {
1.252     banghart 3094:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 3095:                 my $options;
1.252     banghart 3096:                 my $meta_field = $1;
                   3097:                 my $meta_key = $2;
1.253     banghart 3098:                 if ($save_field ne $meta_field) {
1.252     banghart 3099:                     $save_field = $meta_field;
1.253     banghart 3100:             	    if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254     banghart 3101:             	        $options.='stuadd,';
                   3102:             	    } 
1.253     banghart 3103:             	    if ($env{'form.'.$meta_field.'_onlyone'}) {
1.254     banghart 3104:             	        $options.='onlyone,';
                   3105:             	    } 
                   3106:             	    if ($env{'form.'.$meta_field.'_active'}) {
                   3107:             	        $options.='active,';
1.253     banghart 3108:             	    }
1.259     banghart 3109:                     my $name = $save_field;
1.253     banghart 3110:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 3111:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   3112:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 3113:                                                    },$dom,$crs);
1.252     banghart 3114:                 }
                   3115:             }
                   3116:         }
                   3117:     }
1.296     albertel 3118:     &Apache::lonnet::coursedescription($env{'request.course.id'},
                   3119: 				       {'freshen_cache' => 1});
1.258     albertel 3120:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
                   3121:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 3122:         &Apache::lonnet::logthis ($field);
                   3123:         if ($field ne 'courserestricted') {
                   3124: 	    $output.= &output_row($r, $field, $metadata_fields{$field});
                   3125: 	}
1.255     banghart 3126:     }
1.244     banghart 3127:     $r->print(<<ENDenv);       
1.259     banghart 3128:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 3129:         <p>
                   3130:         $output
1.259     banghart 3131:         <input type="submit" name="restrictmeta" value="Update Metadata Restrictions">
1.244     banghart 3132:         </form>
                   3133: ENDenv
1.280     albertel 3134:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 3135:     return 'ok';
                   3136: }
1.220     www      3137: ##################################################
1.193     albertel 3138: 
1.220     www      3139: sub defaultsetter {
1.280     albertel 3140:     my ($r) = @_;
                   3141: 
                   3142:     my $start_page = 
                   3143: 	&Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 3144:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220     www      3145:     $r->print(<<ENDDEFHEAD);
1.280     albertel 3146: $start_page
1.220     www      3147: $breadcrumbs
                   3148: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
                   3149: ENDDEFHEAD
1.280     albertel 3150: 
                   3151:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3152:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221     www      3153:     my @ids=();
                   3154:     my %typep=();
                   3155:     my %keyp=();
                   3156:     my %allparms=();
                   3157:     my %allparts=();
                   3158:     my %allmaps=();
                   3159:     my %mapp=();
                   3160:     my %symbp=();
                   3161:     my %maptitles=();
                   3162:     my %uris=();
                   3163:     my %keyorder=&standardkeyorder();
                   3164:     my %defkeytype=();
                   3165: 
                   3166:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   3167: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   3168: 				\%keyorder,\%defkeytype);
1.224     www      3169:     if ($env{'form.storerules'}) {
                   3170: 	my %newrules=();
                   3171: 	my @delrules=();
1.226     www      3172: 	my %triggers=();
1.225     albertel 3173: 	foreach my $key (keys(%env)) {
                   3174:             if ($key=~/^form\.(\w+)\_action$/) {
1.224     www      3175: 		my $tempkey=$1;
1.226     www      3176: 		my $action=$env{$key};
                   3177:                 if ($action) {
                   3178: 		    $newrules{$tempkey.'_action'}=$action;
                   3179: 		    if ($action ne 'default') {
                   3180: 			my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   3181: 			$triggers{$whichparm}.=$tempkey.':';
                   3182: 		    }
                   3183: 		    $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224     www      3184: 		    if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3185: 			$newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224     www      3186: 			$newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   3187: 			$newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   3188: 			$newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   3189: 		    } else {
                   3190: 			$newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227     www      3191: 			$newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224     www      3192: 		    }
                   3193: 		} else {
1.225     albertel 3194: 		    push(@delrules,$tempkey.'_action');
1.226     www      3195: 		    push(@delrules,$tempkey.'_type');
1.225     albertel 3196: 		    push(@delrules,$tempkey.'_hours');
                   3197: 		    push(@delrules,$tempkey.'_min');
                   3198: 		    push(@delrules,$tempkey.'_sec');
                   3199: 		    push(@delrules,$tempkey.'_value');
1.224     www      3200: 		}
                   3201: 	    }
                   3202: 	}
1.226     www      3203: 	foreach my $key (keys %allparms) {
                   3204: 	    $newrules{$key.'_triggers'}=$triggers{$key};
                   3205: 	}
1.224     www      3206: 	&Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
                   3207: 	&Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
                   3208: 	&resetrulescache();
                   3209:     }
1.227     www      3210:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                   3211: 				       'hours' => 'Hours',
1.221     www      3212: 				       'min' => 'Minutes',
                   3213: 				       'sec' => 'Seconds',
                   3214: 				       'yes' => 'Yes',
                   3215: 				       'no' => 'No');
1.222     www      3216:     my @standardoptions=('','default');
                   3217:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   3218:     my @dateoptions=('','default');
                   3219:     my @datedisplay=('',&mt('Default value when manually setting'));
                   3220:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
                   3221: 	unless ($tempkey) { next; }
                   3222: 	push @standardoptions,'when_setting_'.$tempkey;
                   3223: 	push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   3224: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3225: 	    push @dateoptions,'later_than_'.$tempkey;
                   3226: 	    push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   3227: 	    push @dateoptions,'earlier_than_'.$tempkey;
                   3228: 	    push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   3229: 	} 
                   3230:     }
1.231     www      3231: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
                   3232: 	  &mt('Automatic setting rules apply to table mode interfaces only.'));
1.221     www      3233:     $r->print("\n<table border='1'><tr><th>".&mt('Rule for parameter').'</th><th>'.
1.222     www      3234: 	      &mt('Action').'</th><th>'.&mt('Value').'</th></tr>');
1.221     www      3235:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222     www      3236: 	unless ($tempkey) { next; }
1.221     www      3237: 	$r->print("\n<tr><td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222     www      3238: 	my $action=&rulescache($tempkey.'_action');
                   3239: 	$r->print('<select name="'.$tempkey.'_action">');
                   3240: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3241: 	    for (my $i=0;$i<=$#dateoptions;$i++) {
                   3242: 		if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   3243: 		$r->print("\n<option value='$dateoptions[$i]'".
                   3244: 			  ($dateoptions[$i] eq $action?' selected="selected"':'').
                   3245: 			  ">$datedisplay[$i]</option>");
                   3246: 	    }
                   3247: 	} else {
                   3248: 	    for (my $i=0;$i<=$#standardoptions;$i++) {
                   3249: 		if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   3250: 		$r->print("\n<option value='$standardoptions[$i]'".
                   3251: 			  ($standardoptions[$i] eq $action?' selected="selected"':'').
                   3252: 			  ">$standarddisplay[$i]</option>");
                   3253: 	    }
                   3254: 	}
                   3255: 	$r->print('</select>');
1.227     www      3256: 	unless (&isdateparm($defkeytype{$tempkey})) {
                   3257: 	    $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   3258: 		      '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   3259: 	}
1.222     www      3260: 	$r->print("\n</td><td>\n");
                   3261: 
1.221     www      3262:         if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3263: 	    my $days=&rulescache($tempkey.'_days');
1.222     www      3264: 	    my $hours=&rulescache($tempkey.'_hours');
                   3265: 	    my $min=&rulescache($tempkey.'_min');
                   3266: 	    my $sec=&rulescache($tempkey.'_sec');
1.221     www      3267: 	    $r->print(<<ENDINPUTDATE);
1.227     www      3268: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      3269: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   3270: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   3271: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      3272: ENDINPUTDATE
                   3273: 	} elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      3274:             my $yeschecked='';
                   3275:             my $nochecked='';
                   3276:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
                   3277:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
                   3278: 
1.221     www      3279: 	    $r->print(<<ENDYESNO);
1.224     www      3280: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
                   3281: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221     www      3282: ENDYESNO
                   3283:         } else {
1.224     www      3284: 	    $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221     www      3285: 	}
                   3286:         $r->print('</td></tr>');
                   3287:     }
1.224     www      3288:     $r->print("</table>\n<input type='submit' name='storerules' value='".
1.280     albertel 3289: 	      &mt('Store Rules')."' /></form>\n".
                   3290: 	      &Apache::loncommon::end_page());
1.220     www      3291:     return;
                   3292: }
1.193     albertel 3293: 
1.290     www      3294: sub components {
1.291     www      3295:     my ($key,$uname,$udom,$exeuser,$exedomain)=@_;
1.290     www      3296:     my $typeflag=0;
                   3297:     if ($key=~/\.type$/) {
                   3298: 	$key=~s/\.type$//;
                   3299:         $typeflag=1;
                   3300:     }
1.291     www      3301:     my $issection;
1.290     www      3302:     my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
                   3303:     my $section=&mt('All Students');
                   3304:     if ($middle=~/^\[(.*)\]/) {
1.291     www      3305: 	$issection=$1;
                   3306: 	$section=&mt('Group/Section').': '.$issection;
1.290     www      3307: 	$middle=~s/^\[(.*)\]//;
                   3308:     }
                   3309:     $middle=~s/\.+$//;
                   3310:     $middle=~s/^\.+//;
1.291     www      3311:     if ($uname) {
                   3312: 	$section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   3313: 	$issection='';
                   3314:     }
1.290     www      3315:     my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.304     www      3316:     my $realmdescription=&mt('all resources'); 
1.290     www      3317:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
                   3318: 	$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.304     www      3319:  	$realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
                   3320:    } elsif ($middle) {
1.290     www      3321: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   3322: 	$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      3323: 	$realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      3324:     }
1.291     www      3325:     my $what=$part.'.'.$name;
                   3326:     return ($realm,$section,$name,$part,$typeflag,
1.304     www      3327: 	    $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      3328: }
1.293     www      3329: 
1.292     www      3330: sub standard_parameter_names {
                   3331:     my ($name)=@_;
                   3332:     my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date',
                   3333: 						   'answerdate' => 'Answer Date',
                   3334: 						   'opendate' => 'Open Date',
                   3335: 						   'maxtries' => 'Max. Number of Tries',
                   3336: 						   'weight' => 'Weight',
                   3337: 						   'date_start' => 'Starting Date',
1.293     www      3338: 						   'date_end' => 'Ending Date',
1.309     www      3339:                                                    'interval' => 'Time Interval Length',
                   3340:                                                    'tol' => 'Numerical Tolerance',
                   3341:                                                    'sig' => 'Significant Digits',
                   3342:                                                    'contentopen' => 'Content Opening Date',
                   3343:                                                    'contentclose' => 'Content Closing Date',
                   3344:                                                    'discussend' => 'End of Discussion Time',
                   3345:                                                    'discusshide' => 'Discussion Hidden',
                   3346:                                                    'problemstatus' => 'Problem Status Visible',
1.293     www      3347: 						   'int_pos' => 'Positive Integer',
                   3348: 						   'int_zero_pos' => 'Positive Integer or Zero',
1.310     www      3349: 						   'hinttries' => 'Number of Tries till Hints appear',
                   3350:                                                    'numbubbles' => 'Number of Bubbles in Exam Mode');
1.292     www      3351:     if ($standard_parms{$name}) {
                   3352: 	return $standard_parms{$name}; 
                   3353:     } else { 
                   3354: 	return $name; 
                   3355:     }
                   3356: }
1.290     www      3357: 
1.309     www      3358: #
                   3359: # Parameter Change Log
                   3360: #
                   3361: 
                   3362: 
1.285     albertel 3363: sub parm_change_log {
1.284     www      3364:     my ($r)=@_;
                   3365:     &startpage($r);
1.286     www      3366:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   3367: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   3368: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.311     albertel 3369: 
1.301     www      3370:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311     albertel 3371: 
                   3372:     $r->print('<form action="/adm/parmset?action=settable"
                   3373:                      method="post" name"parameterlog">
                   3374:                <input type="hidden" name="action"
                   3375:                       value="parameterchangelog" />');
                   3376:     
                   3377:     my %saveable_parameters = ('show' => 'scalar',);
                   3378:     &Apache::loncommon::store_course_settings('parameter_log',
                   3379:                                               \%saveable_parameters);
                   3380:     &Apache::loncommon::restore_course_settings('parameter_log',
                   3381:                                                 \%saveable_parameters);
                   3382:     if (!$env{'form.show'}) { $env{'form.show'}=10; }
                   3383: 
                   3384:     my $countselect =
                   3385: 	&Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
                   3386: 				    (&mt('all'),10,20,50,100,1000,10000));
                   3387: 
1.309     www      3388:     $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
                   3389: 	      '<input type="submit" value="'.&mt('Display').'" />');
1.301     www      3390: 
1.291     www      3391:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   3392: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301     www      3393:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
                   3394: 	      '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   3395: 	      &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   3396: 	      &Apache::loncommon::end_data_table_header_row());
1.309     www      3397:     my $shown=0;
1.294     www      3398:     foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
                   3399:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.290     www      3400: 	my $count=$#changes+1;
1.288     albertel 3401: 	my $time =
1.294     www      3402: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      3403: 	my $plainname = 
1.294     www      3404: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   3405: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 3406: 	my $about_me_link = 
1.289     www      3407: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      3408: 					       $parmlog{$id}{'exe_uname'},
                   3409: 					       $parmlog{$id}{'exe_udom'});
1.293     www      3410: 	my $send_msg_link='';
1.294     www      3411: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   3412: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      3413: 	    $send_msg_link ='<br />'.
1.288     albertel 3414: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      3415: 						   $parmlog{$id}{'exe_uname'},
                   3416: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 3417: 	}
1.301     www      3418: 	my $row_start=&Apache::loncommon::start_data_table_row();
                   3419: 	$r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.290     www      3420:                        <td rowspan="'.$count.'">'.$about_me_link.
1.294     www      3421: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   3422: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
1.290     www      3423: 		  $send_msg_link.'</td>');
                   3424: 	my $makenewrow=0;
                   3425: 	my %istype=();
1.293     www      3426: 	foreach my $changed (reverse(sort(@changes))) {
1.294     www      3427:             my $value=$parmlog{$id}{'logentry'}->{$changed};
1.304     www      3428:             my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.294     www      3429: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
1.290     www      3430: 	    if ($typeflag) { $istype{$parmname}=$value; }
1.301     www      3431: 	    if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; }
1.290     www      3432: 	    $r->print('<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292     www      3433: 		      &standard_parameter_names($parmname).'</td><td>'.
                   3434: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>');
1.291     www      3435: 	    my $stillactive=0;
1.294     www      3436: 	    if ($parmlog{$id}{'deleteflag'}) {
1.290     www      3437: 		$r->print(&mt('Deleted'));
1.288     albertel 3438: 	    } else {
1.290     www      3439: 		if ($typeflag) {
1.292     www      3440: 		    $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
1.290     www      3441: 		} else {
1.291     www      3442: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   3443: 						      $uname,$udom,$issection,$issection,$courseopt);
                   3444: 		    if (&isdateparm($istype{$parmname})) {
                   3445: 			$r->print(&Apache::lonlocal::locallocaltime($value));
                   3446: 		    } else {
                   3447: 			$r->print($value);
                   3448: 		    }
                   3449: 		    if ($value ne $all[$level]) {
                   3450: 			$r->print('<br /><font color="red">'.&mt('Not active anymore').'</font>');
                   3451: 		    } else {
                   3452: 			$stillactive=1;
                   3453: 		    }
1.290     www      3454: 		}
1.288     albertel 3455: 	    }
1.291     www      3456: 	    $r->print('</td>');
                   3457: 	    if ($stillactive) {
1.304     www      3458: 		my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
                   3459:                 my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
                   3460: 				    (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292     www      3461: 		if (($uname) && ($udom)) {
1.304     www      3462: 		    $r->print('<td>'.
                   3463: 			      &Apache::loncommon::messagewrapper('Notify User',$uname,$udom,$title,$description).
                   3464: 			      '</td>');
1.292     www      3465: 		} else {
1.303     www      3466: 		    $r->print('<td>'.
1.304     www      3467: 			      &Apache::lonrss::course_blog_link($id,$title,$description).
                   3468: 			      '</td>');
1.292     www      3469: 		}
1.291     www      3470: 	    } else {
                   3471: 		$r->print('<td>&nbsp;</td>');
                   3472: 	    }
1.301     www      3473: 	    $r->print(&Apache::loncommon::end_data_table_row());
1.288     albertel 3474: 	}
1.309     www      3475: 	$shown++;
1.311     albertel 3476: 	if (!($env{'form.show'} eq &mt('all') 
                   3477: 	      || $shown<=$env{'form.show'})) { last; }
1.286     www      3478:     }
1.301     www      3479:     $r->print(&Apache::loncommon::end_data_table());
1.309     www      3480:     $r->print('</form>');
1.284     www      3481:     $r->print(&Apache::loncommon::end_page());
                   3482: }
                   3483: 
1.178     raeburn  3484: ##################################################
                   3485: ##################################################
1.30      www      3486: 
1.59      matthew  3487: =pod
                   3488: 
1.83      bowersj2 3489: =item * handler
1.59      matthew  3490: 
                   3491: Main handler.  Calls &assessparms and &crsenv subroutines.
                   3492: 
                   3493: =cut
                   3494: ##################################################
                   3495: ##################################################
1.220     www      3496: #    use Data::Dumper;
                   3497: 
1.259     banghart 3498: 
1.30      www      3499: sub handler {
1.43      albertel 3500:     my $r=shift;
1.30      www      3501: 
1.43      albertel 3502:     if ($r->header_only) {
1.126     www      3503: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 3504: 	$r->send_http_header;
                   3505: 	return OK;
                   3506:     }
1.193     albertel 3507:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      3508: 					    ['action','state',
                   3509:                                              'pres_marker',
                   3510:                                              'pres_value',
1.206     www      3511:                                              'pres_type',
1.243     banghart 3512:                                              'udom','uname','symb','serial']);
1.131     www      3513: 
1.83      bowersj2 3514: 
1.193     albertel 3515:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 3516:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   3517: 					    text=>"Parameter Manager",
1.204     www      3518: 					    faq=>10,
1.194     albertel 3519: 					    bug=>'Instructor Interface'});
1.203     www      3520: 
1.30      www      3521: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 3522:     my $parm_permission =
                   3523: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 3524: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 3525: 				  $env{'request.course.sec'}));
1.194     albertel 3526:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 3527: 
                   3528:         # Start Page
1.126     www      3529:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      3530:         $r->send_http_header;
1.30      www      3531: 
1.203     www      3532: 
                   3533:         # id numbers can change on re-ordering of folders
                   3534: 
                   3535:         &resetsymbcache();
                   3536: 
1.193     albertel 3537:         #
                   3538:         # Main switch on form.action and form.state, as appropriate
                   3539:         #
                   3540:         # Check first if coming from someone else headed directly for
                   3541:         #  the table mode
                   3542:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   3543: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   3544: 	    &assessparms($r);
                   3545: 
                   3546:         } elsif (! exists($env{'form.action'})) {
                   3547:             $r->print(&header());
1.298     albertel 3548:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 3549:             &print_main_menu($r,$parm_permission);
                   3550:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 3551:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   3552: 						    text=>"Course Environment"});
1.193     albertel 3553:             &crsenv($r); 
                   3554:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 3555:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3556: 						    text=>"Overview Mode"});
1.121     www      3557: 	    &overview($r);
1.259     banghart 3558:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   3559:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   3560: 						    text=>"Restrict Metadata"});
                   3561: 	    &setrestrictmeta($r);
1.208     www      3562:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   3563:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3564: 						    text=>"Overview Mode"});
                   3565: 	    &newoverview($r);
1.220     www      3566:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   3567:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   3568: 						    text=>"Set Defaults"});
                   3569: 	    &defaultsetter($r);
                   3570: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 3571:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      3572: 						    text=>"Table Mode",
                   3573: 						    help => 'Course_Setting_Parameters'});
1.121     www      3574: 	    &assessparms($r);
1.284     www      3575:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   3576:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      3577: 						    text=>"Parameter Change Log"});
1.285     albertel 3578: 	    &parm_change_log($r);
1.284     www      3579: 	}       
1.43      albertel 3580:     } else {
1.1       www      3581: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 3582: 	$env{'user.error.msg'}=
1.43      albertel 3583: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   3584: 	return HTTP_NOT_ACCEPTABLE;
                   3585:     }
                   3586:     return OK;
1.1       www      3587: }
                   3588: 
                   3589: 1;
                   3590: __END__
                   3591: 
1.59      matthew  3592: =pod
1.38      harris41 3593: 
                   3594: =back
                   3595: 
                   3596: =cut
1.1       www      3597: 
                   3598: 
                   3599: 

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