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

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

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