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

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

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