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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.299   ! albertel    4: # $Id: lonparmset.pm,v 1.298 2006/05/01 19:37:33 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.1       www        66: 
1.198     www        67: # --- Caches local to lonparmset
1.2       www        68: 
1.199     www        69: my $parmhashid;
                     70: my %parmhash;
1.201     www        71: my $symbsid;
                     72: my %symbs;
1.221     www        73: my $rulesid;
                     74: my %rules;
1.198     www        75: 
                     76: # --- end local caches
                     77: 
1.59      matthew    78: ##################################################
                     79: ##################################################
                     80: 
                     81: =pod
                     82: 
                     83: =item parmval
                     84: 
                     85: Figure out a cascading parameter.
                     86: 
1.71      albertel   87: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   88:          $id   - a bighash Id number
1.71      albertel   89:          $def  - the resource's default value   'stupid emacs
                     90: 
1.269     raeburn    91: 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   92: 
1.269     raeburn    93: 14 - General Course
                     94: 13 - Map or Folder level in course
                     95: 12- resource default
                     96: 11- map default
                     97: 10 - resource level in course
                     98: 9 - General for section
                     99: 8 - Map or Folder level for section
                    100: 7 - resource level in section
                    101: 6 - General for group
                    102: 5 - Map or Folder level for group
                    103: 4 - resource level in group
1.71      albertel  104: 3 - General for specific student
1.82      www       105: 2 - Map or Folder level for specific student
1.71      albertel  106: 1 - resource level for specific student
1.2       www       107: 
1.59      matthew   108: =cut
                    109: 
                    110: ##################################################
1.2       www       111: sub parmval {
1.275     raeburn   112:     my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
                    113:     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
                    114:                                                            $cgroup,$courseopt);
1.201     www       115: }
                    116: 
                    117: sub parmval_by_symb {
1.275     raeburn   118:     my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
1.198     www       119: # load caches
                    120:     &cacheparmhash();
1.200     www       121: 
                    122:     my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
                    123: 
1.8       www       124:     my $result='';
1.44      albertel  125:     my @outpar=();
1.2       www       126: # ----------------------------------------------------- Cascading lookup scheme
1.201     www       127:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.10      www       128: 
1.201     www       129:     my $symbparm=$symb.'.'.$what;
                    130:     my $mapparm=$map.'___(all).'.$what;
1.10      www       131: 
1.269     raeburn   132:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
                    133:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    134:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    135: 
1.190     albertel  136:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
                    137:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    138:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
                    139: 
                    140:     my $courselevel=$env{'request.course.id'}.'.'.$what;
                    141:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    142:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2       www       143: 
1.11      www       144: 
1.182     albertel  145: # --------------------------------------------------------- first, check course
1.11      www       146: 
1.200     www       147:     if (defined($$courseopt{$courselevel})) {
1.269     raeburn   148: 	$outpar[14]=$$courseopt{$courselevel};
                    149: 	$result=14;
1.43      albertel  150:     }
1.11      www       151: 
1.200     www       152:     if (defined($$courseopt{$courselevelm})) {
1.269     raeburn   153: 	$outpar[13]=$$courseopt{$courselevelm};
                    154: 	$result=13;
1.43      albertel  155:     }
1.11      www       156: 
1.182     albertel  157: # ------------------------------------------------------- second, check default
                    158: 
1.269     raeburn   159:     if (defined($def)) { $outpar[12]=$def; $result=12; }
1.182     albertel  160: 
                    161: # ------------------------------------------------------ third, check map parms
                    162: 
                    163:     my $thisparm=$parmhash{$symbparm};
1.269     raeburn   164:     if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
1.182     albertel  165: 
1.200     www       166:     if (defined($$courseopt{$courselevelr})) {
1.269     raeburn   167: 	$outpar[10]=$$courseopt{$courselevelr};
                    168: 	$result=10;
1.43      albertel  169:     }
1.11      www       170: 
1.182     albertel  171: # ------------------------------------------------------ fourth, back to course
1.71      albertel  172:     if (defined($csec)) {
1.200     www       173:         if (defined($$courseopt{$seclevel})) {
1.269     raeburn   174: 	    $outpar[9]=$$courseopt{$seclevel};
                    175: 	    $result=9;
1.43      albertel  176: 	}
1.200     www       177:         if (defined($$courseopt{$seclevelm})) {
1.269     raeburn   178: 	    $outpar[8]=$$courseopt{$seclevelm};
                    179: 	    $result=8;
1.43      albertel  180: 	}
                    181: 
1.200     www       182:         if (defined($$courseopt{$seclevelr})) {
1.269     raeburn   183: 	    $outpar[7]=$$courseopt{$seclevelr};
                    184: 	    $result=7;
1.43      albertel  185: 	}
                    186:     }
1.275     raeburn   187: # ------------------------------------------------------ fifth, check course group
1.269     raeburn   188:     if (defined($cgroup)) {
                    189:         if (defined($$courseopt{$grplevel})) {
                    190:             $outpar[6]=$$courseopt{$grplevel};
                    191:             $result=6;
                    192:         }
                    193:         if (defined($$courseopt{$grplevelm})) {
                    194:             $outpar[5]=$$courseopt{$grplevelm};
                    195:             $result=5;
                    196:         }
                    197:         if (defined($$courseopt{$grplevelr})) {
                    198:             $outpar[4]=$$courseopt{$grplevelr};
                    199:             $result=4;
                    200:         }
                    201:     }
1.11      www       202: 
1.182     albertel  203: # ---------------------------------------------------------- fifth, check user
1.11      www       204: 
1.71      albertel  205:     if (defined($uname)) {
1.200     www       206: 	if (defined($$useropt{$courselevel})) {
                    207: 	    $outpar[3]=$$useropt{$courselevel};
1.43      albertel  208: 	    $result=3;
                    209: 	}
1.10      www       210: 
1.200     www       211: 	if (defined($$useropt{$courselevelm})) {
                    212: 	    $outpar[2]=$$useropt{$courselevelm};
1.43      albertel  213: 	    $result=2;
                    214: 	}
1.2       www       215: 
1.200     www       216: 	if (defined($$useropt{$courselevelr})) {
                    217: 	    $outpar[1]=$$useropt{$courselevelr};
1.43      albertel  218: 	    $result=1;
                    219: 	}
                    220:     }
1.44      albertel  221:     return ($result,@outpar);
1.2       www       222: }
                    223: 
1.198     www       224: sub resetparmhash {
                    225:     $parmhashid='';
                    226: }
                    227: 
                    228: sub cacheparmhash {
                    229:     if ($parmhashid eq  $env{'request.course.fn'}) { return; }
                    230:     my %parmhashfile;
                    231:     if (tie(%parmhashfile,'GDBM_File',
                    232: 	      $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
                    233: 	%parmhash=%parmhashfile;
                    234: 	untie %parmhashfile;
                    235: 	$parmhashid=$env{'request.course.fn'};
                    236:     }
                    237: }
                    238: 
1.203     www       239: sub resetsymbcache {
                    240:     $symbsid='';
                    241: }
                    242: 
1.201     www       243: sub symbcache {
                    244:     my $id=shift;
                    245:     if ($symbsid ne $env{'request.course.id'}) {
                    246: 	%symbs=();
                    247:     }
                    248:     unless ($symbs{$id}) {
                    249: 	my $navmap = Apache::lonnavmaps::navmap->new();
                    250: 	if ($id=~/\./) {
                    251: 	    my $resource=$navmap->getById($id);
                    252: 	    $symbs{$id}=$resource->symb();
                    253: 	} else {
                    254: 	    my $resource=$navmap->getByMapPc($id);
                    255: 	    $symbs{$id}=&Apache::lonnet::declutter($resource->src());
                    256: 	}
                    257: 	$symbsid=$env{'request.course.id'};
                    258:     }
                    259:     return $symbs{$id};
                    260: }
                    261: 
1.221     www       262: sub resetrulescache {
                    263:     $rulesid='';
                    264: }
                    265: 
                    266: sub rulescache {
                    267:     my $id=shift;
                    268:     if ($rulesid ne $env{'request.course.id'}) {
                    269: 	%rules=();
                    270:     }
1.224     www       271:     unless (defined($rules{$id})) {
1.221     www       272: 	my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    273: 	my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.224     www       274: 	%rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
1.221     www       275: 	$rulesid=$env{'request.course.id'};
                    276:     }
                    277:     return $rules{$id};
                    278: }
                    279: 
1.229     www       280: sub preset_defaults {
                    281:     my $type=shift;
                    282:     if (&rulescache($type.'_action') eq 'default') {
                    283: # yes, there is something
                    284: 	return (&rulescache($type.'_hours'),
                    285: 		&rulescache($type.'_min'),
                    286: 		&rulescache($type.'_sec'),
                    287: 		&rulescache($type.'_value'));
                    288:     } else {
                    289: # nothing there or something else
                    290: 	return ('','','','','');
                    291:     }
                    292: }
                    293: 
1.186     www       294: ##################################################
1.277     www       295: 
                    296: sub date_sanity_info {
                    297:    my $checkdate=shift;
                    298:    unless ($checkdate) { return ''; }
                    299:    my $result='';
                    300:    my $crsprefix='course.'.$env{'request.course.id'}.'.';
                    301:    if ($env{$crsprefix.'default_enrollment_end_date'}) {
                    302:       if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
                    303:          $result.='<br />'.&mt('After course enrollment end!');
                    304:       }
                    305:    }
                    306:    if ($env{$crsprefix.'default_enrollment_start_date'}) {
                    307:       if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
                    308:          $result.='<br />'.&mt('Before course enrollment start!');
                    309:       }
                    310:    }
                    311:    return $result;
                    312: }
                    313: ##################################################
1.186     www       314: ##################################################
                    315: #
1.197     www       316: # Store a parameter by ID
1.186     www       317: #
                    318: # Takes
                    319: # - resource id
                    320: # - name of parameter
                    321: # - level
                    322: # - new value
                    323: # - new type
1.187     www       324: # - username
                    325: # - userdomain
                    326: 
1.186     www       327: sub storeparm {
1.269     raeburn   328:     my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.275     raeburn   329:     &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup);
1.197     www       330: }
                    331: 
                    332: #
                    333: # Store a parameter by symb
                    334: #
                    335: # Takes
                    336: # - symb
                    337: # - name of parameter
                    338: # - level
                    339: # - new value
                    340: # - new type
                    341: # - username
                    342: # - userdomain
                    343: 
1.226     www       344: my %recstack;
1.197     www       345: sub storeparm_by_symb {
1.275     raeburn   346:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
1.226     www       347:     unless ($recflag) {
                    348: # first time call
                    349: 	%recstack=();
                    350: 	$recflag=1;
                    351:     }
                    352: # store parameter
                    353:     &storeparm_by_symb_inner
1.269     raeburn   354: 	($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
1.266     www       355: # don't do anything if parameter was reset
                    356:     unless ($nval) { return; }
1.226     www       357:     my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
                    358: # remember that this was set
                    359:     $recstack{$parm}=1;
                    360: # what does this trigger?
                    361:     foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
                    362: # don't backfire
                    363:        unless ((!$triggered) || ($recstack{$triggered})) {
                    364: 	   my $action=&rulescache($triggered.'_action');
                    365: 	   my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                    366: # set triggered parameter on same level
                    367: 	   my $newspnam=$prefix.$triggered;
1.227     www       368: 	   my $newvalue='';
1.228     www       369: 	   my $active=1;
                    370: 	   if ($action=~/^when\_setting/) {
                    371: # are there restrictions?
                    372: 	       if (&rulescache($triggered.'_triggervalue')=~/\w/) {
                    373: 		   $active=0;
                    374: 		   foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
                    375: 		       if (lc($possiblevalue) eq lc($nval)) { $active=1; }
                    376: 		   }
                    377: 	       }
                    378: 	       $newvalue=&rulescache($triggered.'_value');
1.227     www       379: 	   } else {
                    380: 	       my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
1.228     www       381: 	       if ($action=~/^later\_than/) {
                    382: 		   $newvalue=$nval+$totalsecs;
                    383: 	       } else {
                    384: 		   $newvalue=$nval-$totalsecs;
                    385: 	       }
                    386: 	   }
                    387: 	   if ($active) {
                    388: 	       &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
1.275     raeburn   389: 				   $uname,$udom,$csec,$recflag,$cgroup);
1.227     www       390: 	   }
1.226     www       391:        }
                    392:     }
                    393:     return '';
                    394: }
                    395: 
1.293     www       396: sub log_parmset {
                    397:     return &Apache::lonnet::instructor_log('parameterlog',@_);
1.284     www       398: }
                    399: 
1.226     www       400: sub storeparm_by_symb_inner {
1.197     www       401: # ---------------------------------------------------------- Get symb, map, etc
1.269     raeburn   402:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.197     www       403: # ---------------------------------------------------------- Construct prefixes
1.186     www       404:     $spnam=~s/\_([^\_]+)$/\.$1/;
1.197     www       405:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
                    406:     my $symbparm=$symb.'.'.$spnam;
                    407:     my $mapparm=$map.'___(all).'.$spnam;
                    408: 
1.269     raeburn   409:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
                    410:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    411:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    412: 
1.190     albertel  413:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
                    414:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    415:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186     www       416:     
1.190     albertel  417:     my $courselevel=$env{'request.course.id'}.'.'.$spnam;
                    418:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    419:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186     www       420:     
                    421:     my $storeunder='';
1.269     raeburn   422:     if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
                    423:     if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
                    424:     if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; }
                    425:     if ($snum==9) { $storeunder=$seclevel; }
                    426:     if ($snum==8) { $storeunder=$seclevelm; }
                    427:     if ($snum==7) { $storeunder=$seclevelr; }
                    428:     if ($snum==6) { $storeunder=$grplevel; }
                    429:     if ($snum==5) { $storeunder=$grplevelm; }
                    430:     if ($snum==4) { $storeunder=$grplevelr; }
                    431: 
1.186     www       432:     
                    433:     my $delete;
                    434:     if ($nval eq '') { $delete=1;}
                    435:     my %storecontent = ($storeunder         => $nval,
                    436: 			$storeunder.'.type' => $ntype);
                    437:     my $reply='';
                    438:     if ($snum>3) {
                    439: # ---------------------------------------------------------------- Store Course
                    440: #
1.200     www       441: 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    442: 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.186     www       443: # Expire sheets
                    444: 	&Apache::lonnet::expirespread('','','studentcalc');
1.269     raeburn   445: 	if (($snum==10) || ($snum==7) || ($snum==4)) {
1.197     www       446: 	    &Apache::lonnet::expirespread('','','assesscalc',$symb);
1.269     raeburn   447: 	} elsif (($snum==11) || ($snum==8) || ($snum==5)) {
1.197     www       448: 	    &Apache::lonnet::expirespread('','','assesscalc',$map);
1.186     www       449: 	} else {
                    450: 	    &Apache::lonnet::expirespread('','','assesscalc');
                    451: 	}
                    452: # Store parameter
                    453: 	if ($delete) {
                    454: 	    $reply=&Apache::lonnet::del
1.200     www       455: 		('resourcedata',[keys(%storecontent)],$cdom,$cnum);
1.290     www       456:             &log_parmset(\%storecontent,1);
1.186     www       457: 	} else {
                    458: 	    $reply=&Apache::lonnet::cput
1.200     www       459: 		('resourcedata',\%storecontent,$cdom,$cnum);
1.290     www       460: 	    &log_parmset(\%storecontent);
1.186     www       461: 	}
1.200     www       462: 	&Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
1.186     www       463:     } else {
                    464: # ------------------------------------------------------------------ Store User
                    465: #
                    466: # Expire sheets
                    467: 	&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
                    468: 	if ($snum==1) {
                    469: 	    &Apache::lonnet::expirespread
1.197     www       470: 		($uname,$udom,'assesscalc',$symb);
1.186     www       471: 	} elsif ($snum==2) {
                    472: 	    &Apache::lonnet::expirespread
1.197     www       473: 		($uname,$udom,'assesscalc',$map);
1.186     www       474: 	} else {
                    475: 	    &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
                    476: 	}
                    477: # Store parameter
                    478: 	if ($delete) {
                    479: 	    $reply=&Apache::lonnet::del
                    480: 		('resourcedata',[keys(%storecontent)],$udom,$uname);
1.290     www       481: 	    &log_parmset(\%storecontent,1,$uname,$udom);
1.186     www       482: 	} else {
                    483: 	    $reply=&Apache::lonnet::cput
                    484: 		('resourcedata',\%storecontent,$udom,$uname);
1.290     www       485: 	    &log_parmset(\%storecontent,0,$uname,$udom);
1.186     www       486: 	}
1.191     albertel  487: 	&Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186     www       488:     }
                    489:     
                    490:     if ($reply=~/^error\:(.*)/) {
                    491: 	return "<font color=red>Write Error: $1</font>";
                    492:     }
                    493:     return '';
                    494: }
                    495: 
1.59      matthew   496: ##################################################
                    497: ##################################################
                    498: 
                    499: =pod
                    500: 
                    501: =item valout
                    502: 
                    503: Format a value for output.
                    504: 
                    505: Inputs:  $value, $type
                    506: 
                    507: Returns: $value, formatted for output.  If $type indicates it is a date,
                    508: localtime($value) is returned.
1.9       www       509: 
1.59      matthew   510: =cut
                    511: 
                    512: ##################################################
                    513: ##################################################
1.9       www       514: sub valout {
                    515:     my ($value,$type)=@_;
1.59      matthew   516:     my $result = '';
                    517:     # Values of zero are valid.
                    518:     if (! $value && $value ne '0') {
1.71      albertel  519: 	$result = '&nbsp;&nbsp;';
1.59      matthew   520:     } else {
1.66      www       521:         if ($type eq 'date_interval') {
                    522:             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
                    523:             $year=$year-70;
                    524:             $mday--;
                    525:             if ($year) {
                    526: 		$result.=$year.' yrs ';
                    527:             }
                    528:             if ($mon) {
                    529: 		$result.=$mon.' mths ';
                    530:             }
                    531:             if ($mday) {
                    532: 		$result.=$mday.' days ';
                    533:             }
                    534:             if ($hour) {
                    535: 		$result.=$hour.' hrs ';
                    536:             }
                    537:             if ($min) {
                    538: 		$result.=$min.' mins ';
                    539:             }
                    540:             if ($sec) {
                    541: 		$result.=$sec.' secs ';
                    542:             }
                    543:             $result=~s/\s+$//;
1.213     www       544:         } elsif (&isdateparm($type)) {
1.277     www       545:             $result = localtime($value).&date_sanity_info($value);
1.59      matthew   546:         } else {
                    547:             $result = $value;
                    548:         }
                    549:     }
                    550:     return $result;
1.9       www       551: }
                    552: 
1.59      matthew   553: ##################################################
                    554: ##################################################
                    555: 
                    556: =pod
1.5       www       557: 
1.59      matthew   558: =item plink
                    559: 
                    560: Produces a link anchor.
                    561: 
                    562: Inputs: $type,$dis,$value,$marker,$return,$call
                    563: 
                    564: Returns: scalar with html code for a link which will envoke the 
                    565: javascript function 'pjump'.
                    566: 
                    567: =cut
                    568: 
                    569: ##################################################
                    570: ##################################################
1.5       www       571: sub plink {
                    572:     my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23      www       573:     my $winvalue=$value;
                    574:     unless ($winvalue) {
1.213     www       575: 	if (&isdateparm($type)) {
1.190     albertel  576:             $winvalue=$env{'form.recent_'.$type};
1.23      www       577:         } else {
1.190     albertel  578:             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23      www       579:         }
                    580:     }
1.229     www       581:     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
                    582:     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
                    583:     unless (defined($winvalue)) { $winvalue=$val; }
1.270     www       584:     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$marker.'" /></td></tr><tr><td align="center">'.
1.43      albertel  585: 	'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
1.229     www       586: 	    .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
1.270     www       587: 		&valout($value,$type).'</a></td></tr></table>';
1.5       www       588: }
                    589: 
1.280     albertel  590: sub page_js {
                    591: 
1.81      www       592:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88      matthew   593:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.280     albertel  594: 
                    595:     return(<<ENDJS);
                    596: <script type="text/javascript">
1.44      albertel  597: 
                    598:     function pclose() {
                    599:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    600:                  "height=350,width=350,scrollbars=no,menubar=no");
                    601:         parmwin.close();
                    602:     }
                    603: 
1.88      matthew   604:     $pjump_def
1.44      albertel  605: 
                    606:     function psub() {
                    607:         pclose();
                    608:         if (document.parmform.pres_marker.value!='') {
                    609:             document.parmform.action+='#'+document.parmform.pres_marker.value;
                    610:             var typedef=new Array();
                    611:             typedef=document.parmform.pres_type.value.split('_');
                    612:            if (document.parmform.pres_type.value!='') {
                    613:             if (typedef[0]=='date') {
                    614:                 eval('document.parmform.recent_'+
                    615:                      document.parmform.pres_type.value+
                    616: 		     '.value=document.parmform.pres_value.value;');
                    617:             } else {
                    618:                 eval('document.parmform.recent_'+typedef[0]+
                    619: 		     '.value=document.parmform.pres_value.value;');
                    620:             }
                    621: 	   }
                    622:             document.parmform.submit();
                    623:         } else {
                    624:             document.parmform.pres_value.value='';
                    625:             document.parmform.pres_marker.value='';
                    626:         }
                    627:     }
                    628: 
1.57      albertel  629:     function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                    630:         var options = "width=" + w + ",height=" + h + ",";
                    631:         options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                    632:         options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                    633:         var newWin = window.open(url, wdwName, options);
                    634:         newWin.focus();
                    635:     }
1.44      albertel  636: </script>
1.81      www       637: $selscript
1.280     albertel  638: ENDJS
                    639: 
                    640: }
                    641: sub startpage {
                    642:     my ($r) = @_;
1.281     albertel  643: 
1.282     albertel  644:     my %loaditems = ('onunload' => "pclose()",
1.283     albertel  645: 		     'onload'   => "group_or_section('cgroup')",);
1.280     albertel  646: 
1.281     albertel  647:     my $start_page = 
                    648: 	&Apache::loncommon::start_page('Set/Modify Course Parameters',
                    649: 				       &page_js(),
1.282     albertel  650: 				       {'add_entries' => \%loaditems,});
1.280     albertel  651:     my $breadcrumbs = 
1.298     albertel  652: 	&Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting');
1.280     albertel  653:     $r->print(<<ENDHEAD);
1.281     albertel  654: $start_page
1.193     albertel  655: $breadcrumbs
                    656: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.280     albertel  657: <input type="hidden" value='' name="pres_value" />
                    658: <input type="hidden" value='' name="pres_type" />
                    659: <input type="hidden" value='' name="pres_marker" />
                    660: <input type="hidden" value='1' name="prevvisit" />
1.44      albertel  661: ENDHEAD
                    662: }
                    663: 
1.209     www       664: 
1.44      albertel  665: sub print_row {
1.201     www       666:     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
1.275     raeburn   667: 	$defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_;
                    668:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    669:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    670:     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.66      www       671: # get the values for the parameter in cascading order
                    672: # empty levels will remain empty
1.44      albertel  673:     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.275     raeburn   674: 	  $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       675: # get the type for the parameters
                    676: # problem: these may not be set for all levels
                    677:     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
1.275     raeburn   678:                                           $$name{$which}.'.type',$rid,
                    679: 		 $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       680: # cascade down manually
1.182     albertel  681:     my $cascadetype=$$defaulttype{$which};
1.269     raeburn   682:     for (my $i=14;$i>0;$i--) {
1.66      www       683: 	 if ($typeoutpar[$i]) { 
                    684:             $cascadetype=$typeoutpar[$i];
                    685: 	} else {
                    686:             $typeoutpar[$i]=$cascadetype;
                    687:         }
                    688:     }
1.57      albertel  689:     my $parm=$$display{$which};
                    690: 
1.203     www       691:     if ($parmlev eq 'full') {
1.57      albertel  692:         $r->print('<td bgcolor='.$defbgtwo.' align="center">'
                    693:                   .$$part{$which}.'</td>');
                    694:     } else {    
                    695:         $parm=~s|\[.*\]\s||g;
                    696:     }
1.231     www       697:     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
                    698:     if ($automatic) {
                    699: 	$parm.='<font color="red"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</font>';
                    700:     }
1.159     albertel  701:     $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57      albertel  702:    
1.44      albertel  703:     my $thismarker=$which;
                    704:     $thismarker=~s/^parameter\_//;
                    705:     my $mprefix=$rid.'&'.$thismarker.'&';
1.275     raeburn   706:     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);
                    707:     my ($othergrp,$grp_parm,$controlgrp);
1.44      albertel  708: 
1.57      albertel  709:     if ($parmlev eq 'general') {
                    710: 
                    711:         if ($uname) {
1.66      www       712:             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   713:         } elsif ($cgroup) {
                    714:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  715:         } elsif ($csec) {
1.269     raeburn   716:             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  717:         } else {
1.269     raeburn   718:             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  719:         }
                    720:     } elsif ($parmlev eq 'map') {
                    721: 
                    722:         if ($uname) {
1.66      www       723:             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   724:         } elsif ($cgroup) {
                    725:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  726:         } elsif ($csec) {
1.269     raeburn   727:             &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  728:         } else {
1.269     raeburn   729:             &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  730:         }
                    731:     } else {
1.275     raeburn   732:         if ($uname) {
                    733:             if (@{$usersgroups} > 1) {
                    734:                 my ($coursereply,$grp_parm,$controlgrp);
                    735:                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                    736:                     &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
                    737:                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                    738:                 if ($coursereply && $result > 3) {
                    739:                     if (defined($controlgrp)) {
                    740:                         if ($cgroup ne $controlgrp) {
                    741:                             $effective_parm = $grp_parm;
                    742:                             $result = 0;
                    743:                         }
                    744:                     }
                    745:                 }
                    746:             }
                    747:         }
1.57      albertel  748: 
1.269     raeburn   749:         &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  750: 
1.269     raeburn   751: 	&print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    752: 	&print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    753: 	&print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       754: 	&print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    755: 	
                    756: 	if ($csec) {
1.269     raeburn   757: 	    &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    758: 	    &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    759: 	    &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       760: 	}
1.269     raeburn   761: 
                    762:         if ($cgroup) {
                    763:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    764:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    765:             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    766:         }
1.275     raeburn   767:      
1.203     www       768: 	if ($uname) {
1.275     raeburn   769:             if ($othergrp) {
                    770:                 $r->print($othergrp);
                    771:             }
1.203     www       772: 	    &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    773: 	    &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    774: 	    &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    775: 	}
1.57      albertel  776: 
                    777:     } # end of $parmlev if/else
1.275     raeburn   778:     $r->print('<td bgcolor="#CCCCFF" align="center">'.$effective_parm.'</td>');
1.136     albertel  779: 
1.203     www       780:     if ($parmlev eq 'full') {
1.136     albertel  781:         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.201     www       782:                                         '.'.$$name{$which},$$symbp{$rid});
1.136     albertel  783:         my $sessionvaltype=$typeoutpar[$result];
                    784:         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
1.275     raeburn   785:         $r->print('<td bgcolor="#999999" align="center"><font color="#FFFFFF">'.
1.66      www       786:                   &valout($sessionval,$sessionvaltype).'&nbsp;'.
1.57      albertel  787:                   '</font></td>');
1.136     albertel  788:     }
1.44      albertel  789:     $r->print('</tr>');
1.57      albertel  790:     $r->print("\n");
1.44      albertel  791: }
1.59      matthew   792: 
1.44      albertel  793: sub print_td {
1.66      www       794:     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57      albertel  795:     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114     www       796:               ' align="center">');
1.269     raeburn   797:     if ($which<11 || $which > 12) {
1.114     www       798: 	$r->print(&plink($$typeoutpar[$which],
                    799: 			 $$display{$value},$$outpar[$which],
                    800: 			 $mprefix."$which",'parmform.pres','psub'));
                    801:     } else {
                    802: 	$r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
                    803:     }
                    804:     $r->print('</td>'."\n");
1.57      albertel  805: }
                    806: 
1.275     raeburn   807: sub print_usergroups {
                    808:     my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
                    809:     my $courseid = $env{'request.course.id'};
                    810:     my $output;
                    811:     my $symb = &symbcache($rid);
                    812:     my $symbparm=$symb.'.'.$what;
                    813:     my $map=(&Apache::lonnet::decode_symb($symb))[0];
                    814:     my $mapparm=$map.'___(all).'.$what;
                    815:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =
                    816:           &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what,
                    817:                                                                    $courseopt);
                    818:     my $bgcolor = $defbg;
                    819:     my $grp_parm;
                    820:     if (($coursereply) && ($cgroup ne $resultgroup)) { 
                    821:         if ($result > 3) {
                    822:             $bgcolor = '"#AAFFAA"';
                    823:             $grp_parm = &valout($coursereply,$resulttype);
                    824:         }
                    825:         $grp_parm = &valout($coursereply,$resulttype);
                    826:         $output = '<td bgcolor='.$bgcolor.' align="center">';
                    827:         if ($resultgroup && $resultlevel) {
                    828:             $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;
                    829:         } else {
                    830:             $output .= '&nbsp;';
                    831:         }
                    832:         $output .= '</td>';
                    833:     } else {
                    834:         $output .= '<td bgcolor='.$bgcolor.'>&nbsp;</td>';
                    835:     }
                    836:     return ($coursereply,$output,$grp_parm,$resultgroup);
                    837: }
                    838: 
                    839: sub parm_control_group {
                    840:     my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_;
                    841:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    842:     my $grpfound = 0;
                    843:     my @levels = ($symbparm,$mapparm,$what);
                    844:     my @levelnames = ('resource','map/folder','general');
                    845:     foreach my $group (@{$usersgroups}) {
                    846:         if ($grpfound) { last; }
                    847:         for (my $i=0; $i<@levels; $i++) {
                    848:             my $item = $courseid.'.['.$group.'].'.$levels[$i];
                    849:             if (defined($$courseopt{$item})) {
                    850:                 $coursereply = $$courseopt{$item};
                    851:                 $resultitem = $item;
                    852:                 $resultgroup = $group;
                    853:                 $resultlevel = $levelnames[$i];
                    854:                 $resulttype = $$courseopt{$item.'.type'};
                    855:                 $grpfound = 1;
                    856:                 last;
                    857:             }
                    858:         }
                    859:     }
                    860:     return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    861: }
1.201     www       862: 
1.63      bowersj2  863: =pod
                    864: 
                    865: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
                    866: 
                    867: Input: See list below:
                    868: 
                    869: =over 4
                    870: 
                    871: =item B<ids>: An array that will contain all of the ids in the course.
                    872: 
                    873: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
                    874: 
1.171     www       875: =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  876: 
                    877: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
                    878: 
                    879: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
                    880: 
                    881: =item B<allkeys>: hash, full key to part->display value (what's display value?)
                    882: 
                    883: =item B<allmaps>: hash, ???
                    884: 
                    885: =item B<fcat>: ???
                    886: 
                    887: =item B<defp>: hash, ???
                    888: 
                    889: =item B<mapp>: ??
                    890: 
                    891: =item B<symbp>: hash, id->full sym?
                    892: 
                    893: =back
                    894: 
                    895: =cut
                    896: 
                    897: sub extractResourceInformation {
                    898:     my $ids = shift;
                    899:     my $typep = shift;
                    900:     my $keyp = shift;
                    901:     my $allparms = shift;
                    902:     my $allparts = shift;
                    903:     my $allmaps = shift;
                    904:     my $mapp = shift;
                    905:     my $symbp = shift;
1.82      www       906:     my $maptitles=shift;
1.196     www       907:     my $uris=shift;
1.210     www       908:     my $keyorder=shift;
1.211     www       909:     my $defkeytype=shift;
1.196     www       910: 
1.210     www       911:     my $keyordercnt=100;
1.63      bowersj2  912: 
1.196     www       913:     my $navmap = Apache::lonnavmaps::navmap->new();
                    914:     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
                    915:     foreach my $resource (@allres) {
                    916: 	my $id=$resource->id();
                    917:         my ($mapid,$resid)=split(/\./,$id);
                    918: 	if ($mapid eq '0') { next; }
                    919: 	$$ids[$#$ids+1]=$id;
                    920: 	my $srcf=$resource->src();
                    921: 	$srcf=~/\.(\w+)$/;
                    922: 	$$typep{$id}=$1;
                    923: 	$$keyp{$id}='';
                    924:         $$uris{$id}=$srcf;
                    925: 	foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
                    926: 	    if ($_=~/^parameter\_(.*)/) {
                    927: 		my $key=$_;
1.209     www       928: # Hidden parameters
                    929: 		if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {
                    930: 		    next;
1.63      bowersj2  931: 		}
1.196     www       932: 		my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
                    933: 		my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
                    934: 		my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
1.209     www       935: #
                    936: # allparms is a hash of parameter names
                    937: #
1.196     www       938: 		my $parmdis = $display;
1.209     www       939: 		$parmdis =~ s/\[Part.*$//g;
                    940:                 $$allparms{$name}=$parmdis;
1.211     www       941: 		$$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');
1.209     www       942: #
                    943: # allparts is a hash of all parts
                    944: #
                    945: 		$$allparts{$part} = "Part: $part";
                    946: #
                    947: # Remember all keys going with this resource
                    948: #
1.196     www       949: 		if ($$keyp{$id}) {
                    950: 		    $$keyp{$id}.=','.$key;
1.175     albertel  951: 		} else {
1.196     www       952: 		    $$keyp{$id}=$key;
1.175     albertel  953: 		}
1.210     www       954: #
                    955: # Put in order
                    956: # 
                    957:                 unless ($$keyorder{$key}) {
                    958:                     $$keyorder{$key}=$keyordercnt;
                    959:                     $keyordercnt++;
                    960: 		}
                    961: 
1.63      bowersj2  962: 	    }
                    963: 	}
1.196     www       964: 	$$mapp{$id}=
                    965: 	    &Apache::lonnet::declutter($resource->enclosing_map_src());
                    966: 	$$mapp{$mapid}=$$mapp{$id};
                    967: 	$$allmaps{$mapid}=$$mapp{$id};
                    968: 	if ($mapid eq '1') {
                    969: 	    $$maptitles{$mapid}='Main Course Documents';
                    970: 	} else {
                    971: 	    $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
                    972: 	}
                    973: 	$$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
                    974: 	$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
                    975: 	$$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63      bowersj2  976:     }
                    977: }
                    978: 
1.208     www       979: 
                    980: ##################################################
                    981: ##################################################
                    982: 
1.213     www       983: sub isdateparm {
                    984:     my $type=shift;
                    985:     return (($type=~/^date/) && (!($type eq 'date_interval')));
                    986: }
                    987: 
1.208     www       988: sub parmmenu {
1.211     www       989:     my ($r,$allparms,$pscat,$keyorder)=@_;
1.208     www       990:     my $tempkey;
                    991:     $r->print(<<ENDSCRIPT);
                    992: <script type="text/javascript">
                    993:     function checkall(value, checkName) {
                    994: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                    995:             ele = document.forms.parmform.elements[i];
                    996:             if (ele.name == checkName) {
                    997:                 document.forms.parmform.elements[i].checked=value;
                    998:             }
                    999:         }
                   1000:     }
1.210     www      1001: 
                   1002:     function checkthis(thisvalue, checkName) {
                   1003: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1004:             ele = document.forms.parmform.elements[i];
                   1005:             if (ele.name == checkName) {
                   1006: 		if (ele.value == thisvalue) {
                   1007: 		    document.forms.parmform.elements[i].checked=true;
                   1008: 		}
                   1009:             }
                   1010:         }
                   1011:     }
                   1012: 
                   1013:     function checkdates() {
                   1014: 	checkthis('duedate','pscat');
                   1015:  	checkthis('opendate','pscat');
                   1016: 	checkthis('answerdate','pscat');
1.218     www      1017:     }
                   1018: 
                   1019:     function checkdisset() {
                   1020: 	checkthis('discussend','pscat');
                   1021:  	checkthis('discusshide','pscat');
                   1022:     }
                   1023: 
                   1024:     function checkcontdates() {
                   1025: 	checkthis('contentopen','pscat');
                   1026:  	checkthis('contentclose','pscat');
                   1027:     }
                   1028:  
1.210     www      1029: 
                   1030:     function checkvisi() {
                   1031: 	checkthis('hiddenresource','pscat');
                   1032:  	checkthis('encrypturl','pscat');
                   1033: 	checkthis('problemstatus','pscat');
                   1034: 	checkthis('contentopen','pscat');
                   1035: 	checkthis('opendate','pscat');
                   1036:     }
                   1037: 
                   1038:     function checkparts() {
                   1039: 	checkthis('hiddenparts','pscat');
                   1040: 	checkthis('display','pscat');
                   1041: 	checkthis('ordered','pscat');
                   1042:     }
                   1043: 
                   1044:     function checkstandard() {
                   1045:         checkall(false,'pscat');
                   1046: 	checkdates();
                   1047: 	checkthis('weight','pscat');
                   1048: 	checkthis('maxtries','pscat');
                   1049:     }
                   1050: 
1.208     www      1051: </script>
                   1052: ENDSCRIPT
1.209     www      1053:     $r->print();
1.208     www      1054:     $r->print("\n<table><tr>");
                   1055:     my $cnt=0;
1.211     www      1056:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.235     albertel 1057: 	$r->print("\n<td><font size='-1'><label><input type='checkbox' name='pscat' ");
1.208     www      1058: 	$r->print('value="'.$tempkey.'"');
                   1059: 	if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                   1060: 	    $r->print(' checked');
                   1061: 	}
1.235     albertel 1062: 	$r->print('>'.$$allparms{$tempkey}.'</label></font></td>');
1.209     www      1063:  	$cnt++;
                   1064:         if ($cnt==3) {
                   1065: 	    $r->print("</tr>\n<tr>");
                   1066: 	    $cnt=0;
                   1067: 	}
1.208     www      1068:     }
                   1069:     $r->print('
                   1070: </tr><tr><td>
1.233     albertel 1071: <a href="javascript:checkall(true, \'pscat\')">Select&nbsp;All</a><br />
                   1072: <a href="javascript:checkstandard()">Select&nbsp;Common&nbsp;Only</a>
1.210     www      1073: </td><td>
1.233     albertel 1074: <a href="javascript:checkdates()">Add&nbsp;Problem&nbsp;Dates</a>
                   1075: <a href="javascript:checkcontdates()">Add&nbsp;Content&nbsp;Dates</a><br />
                   1076: <a href="javascript:checkdisset()">Add&nbsp;Discussion&nbsp;Settings</a>
                   1077: <a href="javascript:checkvisi()">Add&nbsp;Visibilities</a><br />
                   1078: <a href="javascript:checkparts()">Add&nbsp;Part&nbsp;Parameters</a>
1.210     www      1079: </td><td>
1.233     albertel 1080: <a href="javascript:checkall(false, \'pscat\')">Unselect&nbsp;All</a>
1.208     www      1081: </td>
                   1082: ');
                   1083:     $r->print('</tr></table>');
                   1084: }
                   1085: 
1.209     www      1086: sub partmenu {
                   1087:     my ($r,$allparts,$psprt)=@_;
1.211     www      1088:     $r->print('<select multiple name="psprt" size="8">');
1.208     www      1089:     $r->print('<option value="all"');
                   1090:     $r->print(' selected') unless (@{$psprt});
                   1091:     $r->print('>'.&mt('All Parts').'</option>');
                   1092:     my %temphash=();
                   1093:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.234     albertel 1094:     foreach my $tempkey (sort {
                   1095: 	if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
                   1096:     } keys(%{$allparts})) {
1.208     www      1097: 	unless ($tempkey =~ /\./) {
                   1098: 	    $r->print('<option value="'.$tempkey.'"');
                   1099: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
                   1100: 		$r->print(' selected');
                   1101: 	    }
                   1102: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                   1103: 	}
                   1104:     }
1.209     www      1105:     $r->print('</select>');
                   1106: }
                   1107: 
                   1108: sub usermenu {
1.275     raeburn  1109:     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
1.209     www      1110:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                   1111:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                   1112:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
                   1113:     my %lt=&Apache::lonlocal::texthash(
1.269     raeburn  1114: 		    'se'    => "Section",
                   1115:                     'gr'    => "Group",
1.209     www      1116: 		    'fu'    => "For User",
                   1117: 		    'oi'    => "or ID",
                   1118: 		    'ad'    => "at Domain"
                   1119: 				       );
                   1120:     my %sectionhash=();
                   1121:     my $sections='';
1.269     raeburn  1122:     my $numsec = &Apache::loncommon::get_sections(
1.209     www      1123:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1124:                  $env{'course.'.$env{'request.course.id'}.'.num'},
1.269     raeburn  1125: 					 \%sectionhash);
                   1126:     my $groups;
1.299   ! albertel 1127:     my %grouphash = &Apache::loncommon::coursegroups();
        !          1128: 
1.269     raeburn  1129:     if ($numsec > 0) {
                   1130:         $sections=$lt{'se'}.': <select name="csec"';
1.299   ! albertel 1131:         if (%grouphash && $parmlev ne 'full') {
1.269     raeburn  1132:             $sections .= qq| onchange="group_or_section('csec')" |;
                   1133:         }
                   1134:         $sections .= '>';
1.275     raeburn  1135: 	foreach my $section ('',sort keys %sectionhash) {
                   1136: 	    $sections.='<option value="'.$section.'" '.
                   1137: 		($section eq $csec?'selected="selected"':'').'>'.$section.
                   1138:                                                               '</option>';
1.209     www      1139:         }
                   1140:         $sections.='</select>';
1.269     raeburn  1141:     }
1.299   ! albertel 1142:     if ($numsec && %grouphash && $parmlev ne 'full') {
1.269     raeburn  1143:         $sections .= '&nbsp;or&nbsp;';
                   1144:         $sections .= qq|
                   1145: <script type="text/javascript">
                   1146: function group_or_section(caller) {
                   1147:    if (caller == "cgroup") {
                   1148:        if (document.parmform.cgroup.selectedIndex != 0) {
                   1149:            document.parmform.csec.selectedIndex = 0;
                   1150:        }
                   1151:    } else {
                   1152:        if (document.parmform.csec.selectedIndex != 0) {
                   1153:            document.parmform.cgroup.selectedIndex = 0;
                   1154:        }
                   1155:    }
                   1156: }
                   1157: </script>
                   1158: |;
                   1159:     } else {
                   1160:         $sections .= qq|
                   1161: <script type="text/javascript">
                   1162: function group_or_section(caller) {
                   1163:     return;
                   1164: }
                   1165: </script>
                   1166: |;
                   1167:     } 
1.299   ! albertel 1168: 
        !          1169:     if (%grouphash) {
1.269     raeburn  1170:         $groups=$lt{'gr'}.': <select name="cgroup"';
1.299   ! albertel 1171:         if ($numsec && $env{'form.action'} eq 'settable') {
1.269     raeburn  1172:             $groups .= qq| onchange="group_or_section('cgroup')" |;
                   1173:         }
                   1174:         $groups .= '>';
1.275     raeburn  1175:         foreach my $grp ('',sort keys %grouphash) {
                   1176:             $groups.='<option value="'.$grp.'" ';
                   1177:             if ($grp eq $cgroup) {
                   1178:                 unless ((defined($uname)) && ($grp eq '')) {
                   1179:                     $groups .=  'selected="selected" ';
                   1180:                 }
                   1181:             } elsif (!defined($cgroup)) {
                   1182:                 if (@{$usersgroups} == 1) {
                   1183:                     if ($grp eq $$usersgroups[0]) {
                   1184:                         $groups .=  'selected="selected" ';
                   1185:                     }
                   1186:                 }
                   1187:             }
                   1188:             $groups .= '>'.$grp.'</option>';
1.269     raeburn  1189:         }
                   1190:         $groups.='</select>';
                   1191:     }
                   1192:     $r->print(<<ENDMENU);
1.209     www      1193: <b>
                   1194: $sections
1.269     raeburn  1195: $groups
1.209     www      1196: <br />
                   1197: $lt{'fu'} 
                   1198: <input type="text" value="$uname" size="12" name="uname" />
                   1199: $lt{'oi'}
                   1200: <input type="text" value="$id" size="12" name="id" /> 
                   1201: $lt{'ad'}
                   1202: $chooseopt
                   1203: </b>
                   1204: ENDMENU
                   1205: }
                   1206: 
                   1207: sub displaymenu {
1.211     www      1208:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www      1209:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                   1210: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www      1211:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.209     www      1212:     $r->print('</td><td>');
                   1213:     &partmenu($r,$allparts,$psprt);
                   1214:     $r->print('</td></tr></table>');
                   1215: }
                   1216: 
                   1217: sub mapmenu {
                   1218:     my ($r,$allmaps,$pschp,$maptitles)=@_;
1.231     www      1219:     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');
1.209     www      1220:     $r->print('<select name="pschp">');
                   1221:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                   1222:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www      1223: 	$r->print('<option value="'.$_.'"');
1.209     www      1224: 	if (($pschp eq $_)) { $r->print(' selected'); }
                   1225: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                   1226:     }
                   1227:     $r->print("</select>");
                   1228: }
                   1229: 
                   1230: sub levelmenu {
                   1231:     my ($r,$alllevs,$parmlev)=@_;
1.231     www      1232:     $r->print('<b>'.&mt('Select Parameter Level').
                   1233: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');
1.209     www      1234:     $r->print('<select name="parmlev">');
                   1235:     foreach (reverse sort keys %{$alllevs}) {
                   1236: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                   1237: 	if ($parmlev eq $$alllevs{$_}) {
                   1238: 	    $r->print(' selected'); 
                   1239: 	}
                   1240: 	$r->print('>'.$_.'</option>');
1.208     www      1241:     }
1.209     www      1242:     $r->print("</select>");
1.208     www      1243: }
                   1244: 
1.211     www      1245: 
                   1246: sub sectionmenu {
                   1247:     my ($r,$selectedsections)=@_;
1.212     www      1248:     my %sectionhash=();
1.269     raeburn  1249:     my $sections='';
                   1250:     my $numsec = &Apache::loncommon::get_sections(
1.212     www      1251:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1252:                  $env{'course.'.$env{'request.course.id'}.'.num'},
1.269     raeburn  1253: 					 \%sectionhash);
                   1254:     if ($numsec) {
1.212     www      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;
                   1262: 		}
                   1263: 	    }
                   1264: 	    $r->print('>'.$s."</option>\n");
                   1265: 	}
1.269     raeburn  1266:         $r->print("</select>\n");
                   1267:    }
                   1268: }
                   1269: 
                   1270: sub groupmenu {
                   1271:     my ($r,$selectedgroups)=@_;
1.299   ! albertel 1272:     my %grouphash = &Apache::loncommon::coursegroups();
        !          1273:     return if (!%grouphash);
        !          1274: 
        !          1275:     $r->print('<select name="Group" multiple="true" size="8" >');
        !          1276:     foreach my $group (sort(keys(%grouphash))) {
        !          1277: 	$r->print('    <option value="'.$group.'"');
        !          1278: 	foreach (@{$selectedgroups}) {
        !          1279: 	    if ($group eq $_) {
        !          1280: 		$r->print(' selected');
        !          1281: 		last;
        !          1282: 	    }
        !          1283: 	}
        !          1284: 	$r->print('>'.$group."</option>\n");
1.211     www      1285:     }
1.299   ! albertel 1286:     $r->print("</select>\n");
1.211     www      1287: }
                   1288: 
1.269     raeburn  1289: 
1.210     www      1290: sub keysplit {
                   1291:     my $keyp=shift;
                   1292:     return (split(/\,/,$keyp));
                   1293: }
                   1294: 
                   1295: sub keysinorder {
                   1296:     my ($name,$keyorder)=@_;
                   1297:     return sort {
                   1298: 	$$keyorder{$a} <=> $$keyorder{$b};
                   1299:     } (keys %{$name});
                   1300: }
                   1301: 
1.236     albertel 1302: sub keysinorder_bytype {
                   1303:     my ($name,$keyorder)=@_;
                   1304:     return sort {
                   1305: 	my $ta=(split('_',$a))[-1];
                   1306: 	my $tb=(split('_',$b))[-1];
                   1307: 	if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
                   1308: 	    return ($a cmp $b);
                   1309: 	}
                   1310: 	$$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
                   1311:     } (keys %{$name});
                   1312: }
                   1313: 
1.211     www      1314: sub keysindisplayorder {
                   1315:     my ($name,$keyorder)=@_;
                   1316:     return sort {
                   1317: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                   1318:     } (keys %{$name});
                   1319: }
                   1320: 
1.214     www      1321: sub sortmenu {
                   1322:     my ($r,$sortorder)=@_;
1.236     albertel 1323:     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214     www      1324:     if ($sortorder eq 'realmstudent') {
                   1325:        $r->print(' checked="on"');
                   1326:     }
                   1327:     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236     albertel 1328:     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214     www      1329:     if ($sortorder eq 'studentrealm') {
                   1330:        $r->print(' checked="on"');
                   1331:     }
1.236     albertel 1332:     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
                   1333: 	      '</label>');
1.214     www      1334: }
                   1335: 
1.211     www      1336: sub standardkeyorder {
                   1337:     return ('parameter_0_opendate' => 1,
                   1338: 	    'parameter_0_duedate' => 2,
                   1339: 	    'parameter_0_answerdate' => 3,
                   1340: 	    'parameter_0_interval' => 4,
                   1341: 	    'parameter_0_weight' => 5,
                   1342: 	    'parameter_0_maxtries' => 6,
                   1343: 	    'parameter_0_hinttries' => 7,
                   1344: 	    'parameter_0_contentopen' => 8,
                   1345: 	    'parameter_0_contentclose' => 9,
                   1346: 	    'parameter_0_type' => 10,
                   1347: 	    'parameter_0_problemstatus' => 11,
                   1348: 	    'parameter_0_hiddenresource' => 12,
                   1349: 	    'parameter_0_hiddenparts' => 13,
                   1350: 	    'parameter_0_display' => 14,
                   1351: 	    'parameter_0_ordered' => 15,
                   1352: 	    'parameter_0_tol' => 16,
                   1353: 	    'parameter_0_sig' => 17,
1.218     www      1354: 	    'parameter_0_turnoffunit' => 18,
                   1355:             'parameter_0_discussend' => 19,
                   1356:             'parameter_0_discusshide' => 20);
1.211     www      1357: }
                   1358: 
1.59      matthew  1359: ##################################################
                   1360: ##################################################
                   1361: 
                   1362: =pod
                   1363: 
                   1364: =item assessparms
                   1365: 
                   1366: Show assessment data and parameters.  This is a large routine that should
                   1367: be simplified and shortened... someday.
                   1368: 
                   1369: Inputs: $r
                   1370: 
                   1371: Returns: nothing
                   1372: 
1.63      bowersj2 1373: Variables used (guessed by Jeremy):
                   1374: 
                   1375: =over 4
                   1376: 
                   1377: =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.
                   1378: 
                   1379: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1380: 
                   1381: =item B<allmaps>:
                   1382: 
                   1383: =back
                   1384: 
1.59      matthew  1385: =cut
                   1386: 
                   1387: ##################################################
                   1388: ##################################################
1.30      www      1389: sub assessparms {
1.1       www      1390: 
1.43      albertel 1391:     my $r=shift;
1.201     www      1392: 
                   1393:     my @ids=();
                   1394:     my %symbp=();
                   1395:     my %mapp=();
                   1396:     my %typep=();
                   1397:     my %keyp=();
                   1398:     my %uris=();
                   1399:     my %maptitles=();
                   1400: 
1.2       www      1401: # -------------------------------------------------------- Variable declaration
1.209     www      1402: 
1.129     www      1403:     my %allmaps=();
                   1404:     my %alllevs=();
1.57      albertel 1405: 
1.187     www      1406:     my $uname;
                   1407:     my $udom;
                   1408:     my $uhome;
                   1409:     my $csec;
1.269     raeburn  1410:     my $cgroup;
1.275     raeburn  1411:     my @usersgroups = ();
1.187     www      1412:  
1.190     albertel 1413:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1414: 
1.57      albertel 1415:     $alllevs{'Resource Level'}='full';
1.215     www      1416:     $alllevs{'Map/Folder Level'}='map';
1.57      albertel 1417:     $alllevs{'Course Level'}='general';
                   1418: 
                   1419:     my %allparms;
                   1420:     my %allparts;
1.210     www      1421: #
                   1422: # Order in which these parameters will be displayed
                   1423: #
1.211     www      1424:     my %keyorder=&standardkeyorder();
                   1425: 
1.43      albertel 1426:     @ids=();
                   1427:     %symbp=();
                   1428:     %typep=();
                   1429: 
                   1430:     my $message='';
                   1431: 
1.190     albertel 1432:     $csec=$env{'form.csec'};
1.269     raeburn  1433:     $cgroup=$env{'form.cgroup'};
1.188     www      1434: 
1.190     albertel 1435:     if      ($udom=$env{'form.udom'}) {
                   1436:     } elsif ($udom=$env{'request.role.domain'}) {
                   1437:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1438:     } else {
                   1439: 	$udom=$r->dir_config('lonDefDomain');
                   1440:     }
1.43      albertel 1441: 
1.134     albertel 1442:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1443:     my $pschp=$env{'form.pschp'};
1.134     albertel 1444:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1445:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1446: 
1.43      albertel 1447:     my $pssymb='';
1.57      albertel 1448:     my $parmlev='';
                   1449:  
1.190     albertel 1450:     unless ($env{'form.parmlev'}) {
1.57      albertel 1451:         $parmlev = 'map';
                   1452:     } else {
1.190     albertel 1453:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1454:     }
1.26      www      1455: 
1.29      www      1456: # ----------------------------------------------- Was this started from grades?
                   1457: 
1.190     albertel 1458:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1459: 	&& (!$env{'form.dis'})) {
                   1460: 	my $url=$env{'form.url'};
1.194     albertel 1461: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1462: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1463: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1464: 	$pschp='';
1.57      albertel 1465:         $parmlev = 'full';
1.190     albertel 1466:     } elsif ($env{'form.symb'}) {
                   1467: 	$pssymb=$env{'form.symb'};
1.92      albertel 1468: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1469: 	$pschp='';
1.57      albertel 1470:         $parmlev = 'full';
1.43      albertel 1471:     } else {
1.190     albertel 1472: 	$env{'form.url'}='';
1.43      albertel 1473:     }
                   1474: 
1.190     albertel 1475:     my $id=$env{'form.id'};
1.43      albertel 1476:     if (($id) && ($udom)) {
                   1477: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1478: 	if ($uname) {
                   1479: 	    $id='';
                   1480: 	} else {
                   1481: 	    $message=
1.133     www      1482: 		"<font color=red>".&mt("Unknown ID")." '$id' ".
                   1483: 		&mt('at domain')." '$udom'</font>";
1.43      albertel 1484: 	}
                   1485:     } else {
1.190     albertel 1486: 	$uname=$env{'form.uname'};
1.43      albertel 1487:     }
                   1488:     unless ($udom) { $uname=''; }
                   1489:     $uhome='';
                   1490:     if ($uname) {
                   1491: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1492:         if ($uhome eq 'no_host') {
                   1493: 	    $message=
1.133     www      1494: 		"<font color=red>".&mt("Unknown user")." '$uname' ".
                   1495: 		&mt("at domain")." '$udom'</font>";
1.43      albertel 1496: 	    $uname='';
1.12      www      1497:         } else {
1.103     albertel 1498: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1499: 					      $env{'request.course.id'});
1.269     raeburn  1500:             
1.43      albertel 1501: 	    if ($csec eq '-1') {
                   1502: 		$message="<font color=red>".
1.133     www      1503: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
                   1504: 		    &mt("not in this course")."</font>";
1.43      albertel 1505: 		$uname='';
1.190     albertel 1506: 		$csec=$env{'form.csec'};
1.269     raeburn  1507:                 $cgroup=$env{'form.cgroup'};
1.43      albertel 1508: 	    } else {
                   1509: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1510: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1511: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1512: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1513: 			.$name{'lastname'}.' '.$name{'generation'}.
1.133     www      1514: 			    "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1515: 	    }
1.297     raeburn  1516:             @usersgroups = &Apache::lonnet::get_users_groups(
1.275     raeburn  1517:                                        $udom,$uname,$env{'request.course.id'});
1.297     raeburn  1518:             if (@usersgroups > 0) {
1.275     raeburn  1519:                 unless (grep/^\Q$cgroup\E$/,@usersgroups) {
                   1520:                     $cgroup = $usersgroups[0];
1.297     raeburn  1521:                 }
1.269     raeburn  1522:             }
1.12      www      1523:         }
1.43      albertel 1524:     }
1.2       www      1525: 
1.43      albertel 1526:     unless ($csec) { $csec=''; }
1.269     raeburn  1527:     unless ($cgroup) { $cgroup=''; }
1.12      www      1528: 
1.14      www      1529: # --------------------------------------------------------- Get all assessments
1.210     www      1530:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1531: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1532: 				\%keyorder);
1.63      bowersj2 1533: 
1.57      albertel 1534:     $mapp{'0.0'} = '';
                   1535:     $symbp{'0.0'} = '';
1.99      albertel 1536: 
1.14      www      1537: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1538:     if ($env{'form.pres_marker'}) {
1.205     www      1539:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1540:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1541:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1542: 	for (my $i=0;$i<=$#markers;$i++) {
                   1543: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1544: 				 $values[$i],
                   1545: 				 $types[$i],
1.269     raeburn  1546: 				 $uname,$udom,$csec,$cgroup);
1.205     www      1547: 	}
1.68      www      1548: # ---------------------------------------------------------------- Done storing
1.130     www      1549: 	$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      1550:     }
1.57      albertel 1551: #----------------------------------------------- if all selected, fill in array
1.209     www      1552:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1553:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1554:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1555: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1556: 
1.209     www      1557:     &startpage($r);
1.57      albertel 1558: 
1.44      albertel 1559:     foreach ('tolerance','date_default','date_start','date_end',
                   1560: 	     'date_interval','int','float','string') {
                   1561: 	$r->print('<input type="hidden" value="'.
1.190     albertel 1562: 		  $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44      albertel 1563:     }
1.57      albertel 1564:                         
1.44      albertel 1565:     if (!$pssymb) {
1.209     www      1566:         $r->print('<table border="1"><tr><td>');
                   1567:         &levelmenu($r,\%alllevs,$parmlev);
1.128     albertel 1568: 	if ($parmlev ne 'general') {
1.209     www      1569:             $r->print('<td>');
                   1570: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1571: 	    $r->print('</td>');
1.128     albertel 1572: 	}
1.209     www      1573:         $r->print('</td></tr></table>');
1.211     www      1574: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1575:     } else {
1.125     www      1576:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.209     www      1577:         $r->print(&mt('Specific Resource').": ".$resource.
1.238     www      1578:                   '<input type="hidden" value="'.$pssymb.'" name="symb">'.
                   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='.
                   1738: 				  &Apache::lonnet::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.269     raeburn  1937:             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$csec</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.296     albertel 2084:     &Apache::lonnet::coursedescription($env{'request.course.id'}
                   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>';
                   3316:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
                   3317: 	$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
                   3318:     } elsif ($middle) {
                   3319: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   3320: 	$realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
                   3321:     }
1.291     www      3322:     my $what=$part.'.'.$name;
                   3323:     return ($realm,$section,$name,$part,$typeflag,
                   3324: 	    $what,$middle,$uname,$udom,$issection);
1.290     www      3325: }
1.293     www      3326: 
1.292     www      3327: sub standard_parameter_names {
                   3328:     my ($name)=@_;
                   3329:     my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date',
                   3330: 						   'answerdate' => 'Answer Date',
                   3331: 						   'opendate' => 'Open Date',
                   3332: 						   'maxtries' => 'Max. Number of Tries',
                   3333: 						   'weight' => 'Weight',
                   3334: 						   'date_start' => 'Starting Date',
1.293     www      3335: 						   'date_end' => 'Ending Date',
                   3336: 						   'int_pos' => 'Positive Integer',
                   3337: 						   'int_zero_pos' => 'Positive Integer or Zero',
                   3338: 						   'hinttries' => 'Number of Tries till Hints appear');
1.292     www      3339:     if ($standard_parms{$name}) {
                   3340: 	return $standard_parms{$name}; 
                   3341:     } else { 
                   3342: 	return $name; 
                   3343:     }
                   3344: }
1.290     www      3345: 
1.285     albertel 3346: sub parm_change_log {
1.284     www      3347:     my ($r)=@_;
                   3348:     &startpage($r);
1.286     www      3349:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   3350: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   3351: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.291     www      3352:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   3353: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.286     www      3354:     $r->print('<table border="2">');
1.293     www      3355:     my $bgcolor='#EEEEEE';
1.294     www      3356:     foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
1.293     www      3357: 	if ($bgcolor eq '#EEEEEE') { $bgcolor='#FFFFCC'; } else { $bgcolor='#EEEEEE'; }
1.294     www      3358:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.290     www      3359: 	my $count=$#changes+1;
1.288     albertel 3360: 	my $time =
1.294     www      3361: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      3362: 	my $plainname = 
1.294     www      3363: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   3364: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 3365: 	my $about_me_link = 
1.289     www      3366: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      3367: 					       $parmlog{$id}{'exe_uname'},
                   3368: 					       $parmlog{$id}{'exe_udom'});
1.293     www      3369: 	my $send_msg_link='';
1.294     www      3370: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   3371: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      3372: 	    $send_msg_link ='<br />'.
1.288     albertel 3373: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      3374: 						   $parmlog{$id}{'exe_uname'},
                   3375: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 3376: 	}
1.293     www      3377: 	$r->print('<tr bgcolor="'.$bgcolor.'"><td rowspan="'.$count.'">'.$time.'</td>
1.290     www      3378:                        <td rowspan="'.$count.'">'.$about_me_link.
1.294     www      3379: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   3380: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
1.290     www      3381: 		  $send_msg_link.'</td>');
                   3382: 	my $makenewrow=0;
                   3383: 	my %istype=();
1.293     www      3384: 	foreach my $changed (reverse(sort(@changes))) {
1.294     www      3385:             my $value=$parmlog{$id}{'logentry'}->{$changed};
1.291     www      3386:             my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection)=
1.294     www      3387: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
1.290     www      3388: 	    if ($typeflag) { $istype{$parmname}=$value; }
1.293     www      3389: 	    if ($makenewrow) { $r->print('<tr bgcolor="'.$bgcolor.'">'); } else { $makenewrow=1; }
1.290     www      3390: 	    $r->print('<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292     www      3391: 		      &standard_parameter_names($parmname).'</td><td>'.
                   3392: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>');
1.291     www      3393: 	    my $stillactive=0;
1.294     www      3394: 	    if ($parmlog{$id}{'deleteflag'}) {
1.290     www      3395: 		$r->print(&mt('Deleted'));
1.288     albertel 3396: 	    } else {
1.290     www      3397: 		if ($typeflag) {
1.292     www      3398: 		    $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
1.290     www      3399: 		} else {
1.291     www      3400: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   3401: 						      $uname,$udom,$issection,$issection,$courseopt);
                   3402: 		    if (&isdateparm($istype{$parmname})) {
                   3403: 			$r->print(&Apache::lonlocal::locallocaltime($value));
                   3404: 		    } else {
                   3405: 			$r->print($value);
                   3406: 		    }
                   3407: 		    if ($value ne $all[$level]) {
                   3408: 			$r->print('<br /><font color="red">'.&mt('Not active anymore').'</font>');
                   3409: 		    } else {
                   3410: 			$stillactive=1;
                   3411: 		    }
1.290     www      3412: 		}
1.288     albertel 3413: 	    }
1.291     www      3414: 	    $r->print('</td>');
                   3415: 	    if ($stillactive) {
1.292     www      3416: 		if (($uname) && ($udom)) {
                   3417: 		    $r->print('<td>Notify Link</td>');
                   3418: 		} else {
                   3419: 		    $r->print('<td>Blog Link</td>');
                   3420: 		}
1.291     www      3421: 	    } else {
                   3422: 		$r->print('<td>&nbsp;</td>');
                   3423: 	    }
                   3424: 	    $r->print('</tr>');
1.288     albertel 3425: 	}
1.286     www      3426:     }
                   3427:     $r->print('</table>');
1.284     www      3428:     $r->print(&Apache::loncommon::end_page());
                   3429: }
                   3430: 
1.178     raeburn  3431: ##################################################
                   3432: ##################################################
1.30      www      3433: 
1.59      matthew  3434: =pod
                   3435: 
1.83      bowersj2 3436: =item * handler
1.59      matthew  3437: 
                   3438: Main handler.  Calls &assessparms and &crsenv subroutines.
                   3439: 
                   3440: =cut
                   3441: ##################################################
                   3442: ##################################################
1.220     www      3443: #    use Data::Dumper;
                   3444: 
1.259     banghart 3445: 
1.30      www      3446: sub handler {
1.43      albertel 3447:     my $r=shift;
1.30      www      3448: 
1.43      albertel 3449:     if ($r->header_only) {
1.126     www      3450: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 3451: 	$r->send_http_header;
                   3452: 	return OK;
                   3453:     }
1.193     albertel 3454:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      3455: 					    ['action','state',
                   3456:                                              'pres_marker',
                   3457:                                              'pres_value',
1.206     www      3458:                                              'pres_type',
1.243     banghart 3459:                                              'udom','uname','symb','serial']);
1.131     www      3460: 
1.83      bowersj2 3461: 
1.193     albertel 3462:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 3463:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   3464: 					    text=>"Parameter Manager",
1.204     www      3465: 					    faq=>10,
1.194     albertel 3466: 					    bug=>'Instructor Interface'});
1.203     www      3467: 
1.30      www      3468: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 3469:     my $parm_permission =
                   3470: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 3471: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 3472: 				  $env{'request.course.sec'}));
1.194     albertel 3473:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 3474: 
                   3475:         # Start Page
1.126     www      3476:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      3477:         $r->send_http_header;
1.30      www      3478: 
1.203     www      3479: 
                   3480:         # id numbers can change on re-ordering of folders
                   3481: 
                   3482:         &resetsymbcache();
                   3483: 
1.193     albertel 3484:         #
                   3485:         # Main switch on form.action and form.state, as appropriate
                   3486:         #
                   3487:         # Check first if coming from someone else headed directly for
                   3488:         #  the table mode
                   3489:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   3490: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   3491: 	    &assessparms($r);
                   3492: 
                   3493:         } elsif (! exists($env{'form.action'})) {
                   3494:             $r->print(&header());
1.298     albertel 3495:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 3496:             &print_main_menu($r,$parm_permission);
                   3497:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 3498:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   3499: 						    text=>"Course Environment"});
1.193     albertel 3500:             &crsenv($r); 
                   3501:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 3502:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3503: 						    text=>"Overview Mode"});
1.121     www      3504: 	    &overview($r);
1.259     banghart 3505:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   3506:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   3507: 						    text=>"Restrict Metadata"});
                   3508: 	    &setrestrictmeta($r);
1.208     www      3509:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   3510:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3511: 						    text=>"Overview Mode"});
                   3512: 	    &newoverview($r);
1.220     www      3513:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   3514:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   3515: 						    text=>"Set Defaults"});
                   3516: 	    &defaultsetter($r);
                   3517: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 3518:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      3519: 						    text=>"Table Mode",
                   3520: 						    help => 'Course_Setting_Parameters'});
1.121     www      3521: 	    &assessparms($r);
1.284     www      3522:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   3523:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      3524: 						    text=>"Parameter Change Log"});
1.285     albertel 3525: 	    &parm_change_log($r);
1.284     www      3526: 	}       
1.43      albertel 3527:     } else {
1.1       www      3528: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 3529: 	$env{'user.error.msg'}=
1.43      albertel 3530: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   3531: 	return HTTP_NOT_ACCEPTABLE;
                   3532:     }
                   3533:     return OK;
1.1       www      3534: }
                   3535: 
                   3536: 1;
                   3537: __END__
                   3538: 
1.59      matthew  3539: =pod
1.38      harris41 3540: 
                   3541: =back
                   3542: 
                   3543: =cut
1.1       www      3544: 
                   3545: 
                   3546: 

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