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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.317   ! albertel    4: # $Id: lonparmset.pm,v 1.316 2006/06/23 05:25:27 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.317   ! albertel 1060:     $r->print("\n<table id=\"LC_parm_overview_parm_menu\"><tr>");
1.208     www      1061:     my $cnt=0;
1.211     www      1062:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.317   ! albertel 1063: 	$r->print("\n<td><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.317   ! albertel 1068: 	$r->print('>'.$$allparms{$tempkey}.'</label></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('
1.317   ! albertel 1076: </tr><tr id=\"LC_parm_overview_parm_menu_selectors\"><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.315     albertel 2081: 
                   2082:     my $start_table     =&Apache::loncommon::start_data_table();
                   2083:     my $start_header_row=&Apache::loncommon::start_data_table_header_row();
                   2084:     my $end_header_row  =&Apache::loncommon::end_data_table_header_row();
1.108     www      2085: # ------------------------- Re-init course environment entries for this session
                   2086: 
1.302     albertel 2087:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296     albertel 2088: 				       {'freshen_cache' => 1});
1.105     matthew  2089: 
1.30      www      2090: # -------------------------------------------------------- Get parameters again
1.45      matthew  2091: 
                   2092:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 2093:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 2094:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      2095:     my $output='';
1.45      matthew  2096:     if (! exists($values{'con_lost'})) {
1.30      www      2097:         my %descriptions=
1.140     sakharuk 2098: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  2099:                                  '<a href="javascript:openbrowser'.
1.47      matthew  2100:                                  "('envform','url','sequence')\">".
1.314     albertel 2101:                                  &mt('Select Map').'</a><br /><span class="LC_warning"> '.
1.140     sakharuk 2102:                                  &mt('Modification may make assessment data inaccessible').
1.314     albertel 2103:                                  '</span>',
1.140     sakharuk 2104:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 2105:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 2106:                                  '</b><br />'.
                   2107:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  2108:              '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      2109:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   2110:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 2111:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      2112:                     '<a href="javascript:openbrowser'.
                   2113:                     "('envform','default_xml_style'".
1.140     sakharuk 2114:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 2115:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   2116:                                  '</b><br />(<tt>user:domain,'.
1.74      www      2117:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2118:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      2119:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2120:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 2121:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2122:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 2123:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 2124:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 2125:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 2126:                                  &mt('changes will not show until next login').')',
1.169     matthew  2127:              '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  2128: 
1.141     sakharuk 2129:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   2130:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 2131:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  2132:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 2133:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  2134: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   2135:              'plc.users.denied' => 
1.141     sakharuk 2136:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  2137:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   2138: 
1.141     sakharuk 2139:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   2140:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 2141:                                   'student, "<tt>ta</tt>": '.
                   2142:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 2143:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 2144: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      2145:              'pch.users.denied' => 
1.141     sakharuk 2146:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      2147:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  2148:              'spreadsheet_default_classcalc' 
1.141     sakharuk 2149:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  2150:                     '<a href="javascript:openbrowser'.
                   2151:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 2152:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2153:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 2154:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  2155:                     '<a href="javascript:openbrowser'.
                   2156:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 2157:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2158:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 2159:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  2160:                     '<a href="javascript:openbrowser'.
                   2161:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 2162:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 2163: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 2164: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 2165: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  2166:              'allow_discussion_post_editing'
1.276     raeburn  2167:                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />"<tt>st</tt>": '.
                   2168:                                   &mt('student').', "<tt>ta</tt>": '.
                   2169:                                   'TA, "<tt>in</tt>": '.
                   2170:                                   &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 />'.
                   2171:                     '('.&mt('or set value to "[_1]" to allow all roles',"<tt>yes</tt>").')',
1.89      albertel 2172: 	     'rndseed'
1.140     sakharuk 2173: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
1.314     albertel 2174:                     '<span class="LC_error">'.&mt('Modifying this will make problems').' '.
                   2175:                     &mt('have different numbers and answers').'</span>',
1.151     albertel 2176: 	     'receiptalg'
                   2177: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   2178:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 2179:              'suppress_tries'
1.272     albertel 2180:                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.273     www      2181:                     ' ('.&mt('"[_1]" to suppress, anything else to not suppress','<tt>yes</tt>').')',
1.113     sakharuk 2182:              'problem_stream_switch'
1.141     sakharuk 2183:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 2184:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 2185:              'default_paper_size' 
                   2186:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   2187:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   2188:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   2189:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 2190:              'anonymous_quiz'
1.150     www      2191:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 2192:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1.217     albertel 2193:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
                   2194:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
1.150     www      2195:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   2196:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 2197:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      2198:              'disable_receipt_display'
1.141     sakharuk 2199:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 2200:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.313     albertel 2201: 	     'task_messages'
                   2202: 	         => '<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 2203: 	     'disablesigfigs'
                   2204: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   2205:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251     albertel 2206: 	     'disableexampointprint'
                   2207: 	         => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                   2208:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278     www      2209:              'externalsyllabus'
1.279     www      2210:                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149     albertel 2211: 	     'tthoptions'
                   2212: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  2213:              ); 
1.177     raeburn  2214:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.278     www      2215:                              'externalsyllabus',
1.107     matthew  2216:                              'default_xml_style','pageseparators',
                   2217:                              'question.email','comment.email','policy.email',
1.169     matthew  2218:                              'student_classlist_view',
1.118     matthew  2219:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  2220:                              'pch.roles.denied','pch.users.denied',
                   2221:                              'allow_limited_html_in_feedback',
1.170     raeburn  2222:                              'allow_discussion_post_editing',
1.108     www      2223:                              'languages',
1.150     www      2224: 			     'nothideprivileged',
1.107     matthew  2225:                              'rndseed',
1.151     albertel 2226:                              'receiptalg',
1.107     matthew  2227:                              'problem_stream_switch',
1.164     sakharuk 2228: 			     'suppress_tries',
1.161     sakharuk 2229:                              'default_paper_size',
1.115     www      2230:                              'disable_receipt_display',
1.107     matthew  2231:                              'spreadsheet_default_classcalc',
                   2232:                              'spreadsheet_default_studentcalc',
                   2233:                              'spreadsheet_default_assesscalc', 
                   2234:                              'hideemptyrows',
                   2235:                              'default_enrollment_start_date',
                   2236:                              'default_enrollment_end_date',
1.163     albertel 2237: 			     'tthoptions',
1.251     albertel 2238: 			     'disablesigfigs',
1.313     albertel 2239: 			     'disableexampointprint',
                   2240: 			     'task_messages'
1.107     matthew  2241:                              );
                   2242: 	foreach my $parameter (sort(keys(%values))) {
1.244     banghart 2243:             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
1.142     raeburn  2244:                 if (! $descriptions{$parameter}) {
                   2245:                     $descriptions{$parameter}=$parameter;
                   2246:                     push(@Display_Order,$parameter);
                   2247:                 }
                   2248:             }
1.43      albertel 2249: 	}
1.315     albertel 2250: 	
1.107     matthew  2251:         foreach my $parameter (@Display_Order) {
                   2252:             my $description = $descriptions{$parameter};
1.51      matthew  2253:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      2254:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  2255:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  2256:                 '.checked=true;"';
1.315     albertel 2257:             $output .= &Apache::loncommon::start_data_table_row().
                   2258: 		'<td>'.$description.'</td>';
1.107     matthew  2259:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   2260:                 $output .= '<td>'.
                   2261:                     &Apache::lonhtmlcommon::date_setter('envform',
                   2262:                                                         $parameter.'_value',
                   2263:                                                         $values{$parameter},
                   2264:                                                         $onchange).
                   2265:                                                         '</td>';
                   2266:             } else {
                   2267:                 $output .= '<td>'.
                   2268:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   2269:                                                     $values{$parameter},
                   2270:                                                     40,$onchange).'</td>';
                   2271:             }
                   2272:             $output .= '<td>'.
                   2273:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   2274:                 '</td>';
1.315     albertel 2275:             $output .= &Apache::loncommon::end_data_table_row()."\n";
1.51      matthew  2276: 	}
1.69      www      2277:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  2278:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   2279:             '.checked=true;"';
1.315     albertel 2280: 	$output.=&Apache::loncommon::start_data_table_row().
                   2281: 	    '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  2282: 	    '<input type="text" size=40 name="newp_name" '.
                   2283:                 $onchange.' /></td><td>'.
                   2284:             '<input type="text" size=40 name="newp_value" '.
                   2285:                 $onchange.' /></td><td>'.
1.315     albertel 2286: 	    '<input type="checkbox" name="newp_setparmval" /></td>'.
                   2287: 	    &Apache::loncommon::end_data_table_row()."\n";
1.43      albertel 2288:     }
1.157     sakharuk 2289:     my %lt=&Apache::lonlocal::texthash(
                   2290: 		    'par'   => 'Parameter',
                   2291: 		    'val'   => 'Value',
                   2292: 		    'set'   => 'Set',
                   2293: 		    'sce'   => 'Set Course Environment'
                   2294: 				       );
                   2295: 
1.140     sakharuk 2296:     my $Parameter=&mt('Parameter');
                   2297:     my $Value=&mt('Value');
1.141     sakharuk 2298:     my $Set=&mt('Set');
1.280     albertel 2299:     my $browse_js=
                   2300: 	'<script type="text/javascript" language="Javascript">'.
                   2301: 	&Apache::loncommon::browser_and_searcher_javascript('parmset').
                   2302: 	'</script>';
                   2303:     
                   2304:     my $start_page = 
                   2305: 	&Apache::loncommon::start_page('Set Course Environment Parameters',
                   2306: 				       $browse_js);
                   2307:     my $end_page = 
                   2308: 	&Apache::loncommon::end_page();
1.315     albertel 2309:     my $end_table=&Apache::loncommon::end_data_table();
1.280     albertel 2310:     $r->print(<<ENDENV);
                   2311: $start_page
1.193     albertel 2312: $breadcrumbs
                   2313: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      2314: $setoutput
1.315     albertel 2315: $start_table
                   2316: $start_header_row
                   2317: <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th>
                   2318: $end_header_row
1.30      www      2319: $output
1.315     albertel 2320: $end_table
1.157     sakharuk 2321: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      2322: </form>
1.280     albertel 2323: $end_page
                   2324: ENDENV
1.30      www      2325: }
1.120     www      2326: ##################################################
1.207     www      2327: # Overview mode
                   2328: ##################################################
1.124     www      2329: my $tableopen;
                   2330: 
                   2331: sub tablestart {
                   2332:     if ($tableopen) {
                   2333: 	return '';
                   2334:     } else {
                   2335: 	$tableopen=1;
1.295     albertel 2336: 	return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130     www      2337: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      2338:     }
                   2339: }
                   2340: 
                   2341: sub tableend {
                   2342:     if ($tableopen) {
                   2343: 	$tableopen=0;
1.295     albertel 2344: 	return &Apache::loncommon::end_data_table();
1.124     www      2345:     } else {
                   2346: 	return'';
                   2347:     }
                   2348: }
                   2349: 
1.207     www      2350: sub readdata {
                   2351:     my ($crs,$dom)=@_;
                   2352: # Read coursedata
                   2353:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   2354: # Read userdata
                   2355: 
                   2356:     my $classlist=&Apache::loncoursedata::get_classlist();
                   2357:     foreach (keys %$classlist) {
                   2358:         # the following undefs are for 'domain', and 'username' respectively.
                   2359:         if ($_=~/^(\w+)\:(\w+)$/) {
                   2360: 	    my ($tuname,$tudom)=($1,$2);
                   2361: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   2362:             foreach my $userkey (keys %{$useropt}) {
                   2363: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   2364:                     my $newkey=$userkey;
                   2365: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   2366: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   2367: 		}
                   2368: 	    }
                   2369: 	}
                   2370:     }
                   2371:     return $resourcedata;
                   2372: }
                   2373: 
                   2374: 
1.124     www      2375: # Setting
1.208     www      2376: 
                   2377: sub storedata {
                   2378:     my ($r,$crs,$dom)=@_;
1.207     www      2379: # Set userlevel immediately
                   2380: # Do an intermediate store of course level
                   2381:     my $olddata=&readdata($crs,$dom);
1.124     www      2382:     my %newdata=();
                   2383:     undef %newdata;
                   2384:     my @deldata=();
                   2385:     undef @deldata;
1.190     albertel 2386:     foreach (keys %env) {
1.124     www      2387: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   2388: 	    my $cmd=$1;
                   2389: 	    my $thiskey=$2;
1.207     www      2390: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   2391: 	    my $tkey=$thiskey;
                   2392:             if ($tuname) {
                   2393: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   2394: 	    }
1.124     www      2395: 	    if ($cmd eq 'set') {
1.190     albertel 2396: 		my $data=$env{$_};
1.212     www      2397:                 my $typeof=$env{'form.typeof_'.$thiskey};
                   2398:  		if ($$olddata{$thiskey} ne $data) { 
1.207     www      2399: 		    if ($tuname) {
1.212     www      2400: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2401: 								 $tkey.'.type' => $typeof},
                   2402: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2403: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2404: 			    $r->print('<br />'.&mt('Stored modified parameter for').' '.
                   2405: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   2406: 			} else {
1.314     albertel 2407: 			    $r->print('<div class="LC_error">'.
                   2408: 				      &mt('Error storing parameters').'</div>');
1.207     www      2409: 			}
                   2410: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2411: 		    } else {
                   2412: 			$newdata{$thiskey}=$data;
1.212     www      2413:  			$newdata{$thiskey.'.type'}=$typeof; 
                   2414:                    } 
1.207     www      2415: 		}
1.124     www      2416: 	    } elsif ($cmd eq 'del') {
1.207     www      2417: 		if ($tuname) {
                   2418: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290     www      2419: 			    &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207     www      2420: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2421: 		    } else {
1.314     albertel 2422: 			$r->print('<div class="LC_error">'.
                   2423: 				  &mt('Error deleting parameters').'</div>');
1.207     www      2424: 		    }
                   2425: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2426: 		} else {
                   2427: 		    push (@deldata,$thiskey);
                   2428: 		}
1.124     www      2429: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 2430: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212     www      2431:                 my $typeof=$env{'form.typeof_'.$thiskey};
1.207     www      2432: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
                   2433: 		    if ($tuname) {
1.212     www      2434: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2435: 								 $tkey.'.type' => $typeof},
                   2436: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2437: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2438: 			    $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2439: 			} else {
1.314     albertel 2440: 			    $r->print('<div class="LC_error">'.
                   2441: 				      &mt('Error storing parameters').'</div>');
1.207     www      2442: 			}
                   2443: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2444: 		    } else {
1.212     www      2445: 			$newdata{$thiskey}=$data;
                   2446: 			$newdata{$thiskey.'.type'}=$typeof; 
1.207     www      2447: 		    }
                   2448: 		}
1.124     www      2449: 	    }
                   2450: 	}
                   2451:     }
1.207     www      2452: # Store all course level
1.144     www      2453:     my $delentries=$#deldata+1;
                   2454:     my @newdatakeys=keys %newdata;
                   2455:     my $putentries=$#newdatakeys+1;
                   2456:     if ($delentries) {
                   2457: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290     www      2458: 	    my %loghash=map { $_ => '' } @deldata;
                   2459: 	    &log_parmset(\%loghash,1);
1.144     www      2460: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2461: 	} else {
1.314     albertel 2462: 	    $r->print('<div class="LC_error">'.
                   2463: 		      &mt('Error deleting parameters').'</div>');
1.144     www      2464: 	}
1.205     www      2465: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2466:     }
                   2467:     if ($putentries) {
                   2468: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290     www      2469: 			    &log_parmset(\%newdata,0);
1.212     www      2470: 	    $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2471: 	} else {
1.314     albertel 2472: 	    $r->print('<div class="LC_error">'.
                   2473: 		      &mt('Error storing parameters').'</div>');
1.144     www      2474: 	}
1.205     www      2475: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2476:     }
1.208     www      2477: }
1.207     www      2478: 
1.208     www      2479: sub extractuser {
                   2480:     my $key=shift;
                   2481:     return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
                   2482: }
1.206     www      2483: 
1.208     www      2484: sub listdata {
1.214     www      2485:     my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207     www      2486: # Start list output
1.206     www      2487: 
1.122     www      2488:     my $oldsection='';
                   2489:     my $oldrealm='';
                   2490:     my $oldpart='';
1.123     www      2491:     my $pointer=0;
1.124     www      2492:     $tableopen=0;
1.145     www      2493:     my $foundkeys=0;
1.248     albertel 2494:     my %keyorder=&standardkeyorder();
1.214     www      2495:     foreach my $thiskey (sort {
                   2496: 	if ($sortorder eq 'realmstudent') {
1.247     albertel 2497: 	    my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2498: 	    my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2499: 	    if (!defined($astudent)) {
                   2500: 		($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.237     albertel 2501: 	    }
1.247     albertel 2502: 	    if (!defined($bstudent)) {
                   2503: 		($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
                   2504: 	    }
1.248     albertel 2505: 	    $arealm=~s/\.type//;
                   2506: 	    my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/);
                   2507: 	    $aparm=$keyorder{'parameter_0_'.$aparm};
                   2508: 	    $brealm=~s/\.type//;
                   2509: 	    my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/);
                   2510: 	    $bparm=$keyorder{'parameter_0_'.$bparm};	   
                   2511: 	    if ($ares eq $bres) {
                   2512: 		if (defined($aparm) && defined($bparm)) {
                   2513: 		    ($aparm <=> $bparm);
                   2514: 		} elsif (defined($aparm)) {
                   2515: 		    -1;
                   2516: 		} elsif (defined($bparm)) {
                   2517: 		    1;
                   2518: 		} else {
                   2519: 		    ($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2520: 		}
                   2521: 	    } else {
                   2522: 		($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2523: 	    }
1.214     www      2524: 	} else {
                   2525: 	    $a cmp $b;
                   2526: 	}
                   2527:     } keys %{$listdata}) {
1.247     albertel 2528: 	 
1.211     www      2529: 	if ($$listdata{$thiskey.'.type'}) {
                   2530:             my $thistype=$$listdata{$thiskey.'.type'};
                   2531:             if ($$resourcedata{$thiskey.'.type'}) {
                   2532: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2533: 	    }
1.207     www      2534: 	    my ($middle,$part,$name)=
                   2535: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2536: 	    my $section=&mt('All Students');
1.207     www      2537: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2538: 		my $issection=$1;
                   2539: 		if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
                   2540: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2541: 		} else {
                   2542: 		    $section=&mt('Group/Section').': '.$issection;
                   2543: 		}
1.207     www      2544: 		$middle=~s/^\[(.*)\]//;
1.122     www      2545: 	    }
1.207     www      2546: 	    $middle=~s/\.+$//;
                   2547: 	    $middle=~s/^\.+//;
1.316     albertel 2548: 	    my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.122     www      2549: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316     albertel 2550: 		$realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';
1.122     www      2551: 	    } elsif ($middle) {
1.174     albertel 2552: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316     albertel 2553: 		$realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';
1.122     www      2554: 	    }
1.214     www      2555: 	    if ($sortorder eq 'realmstudent') {
                   2556: 		if ($realm ne $oldrealm) {
                   2557: 		    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                   2558: 		    $oldrealm=$realm;
                   2559: 		    $oldsection='';
                   2560: 		}
                   2561: 		if ($section ne $oldsection) {
                   2562: 		    $r->print(&tableend()."\n<h2>$section</h2>");
                   2563: 		    $oldsection=$section;
                   2564: 		    $oldpart='';
                   2565: 		}
                   2566: 	    } else {
                   2567: 		if ($section ne $oldsection) {
                   2568: 		    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                   2569: 		    $oldsection=$section;
                   2570: 		    $oldrealm='';
                   2571: 		}
                   2572: 		if ($realm ne $oldrealm) {
                   2573: 		    $r->print(&tableend()."\n<h2>$realm</h2>");
                   2574: 		    $oldrealm=$realm;
                   2575: 		    $oldpart='';
                   2576: 		}
1.122     www      2577: 	    }
                   2578: 	    if ($part ne $oldpart) {
1.124     www      2579: 		$r->print(&tableend().
1.316     albertel 2580: 			  "\n<span class=\"LC_parm_part\">".&mt('Part').": $part</span>");
1.122     www      2581: 		$oldpart=$part;
                   2582: 	    }
1.123     www      2583: #
1.230     www      2584: # Preset defaults?
                   2585: #
                   2586:             my ($hour,$min,$sec,$val)=('','','','');
                   2587: 	    unless ($$resourcedata{$thiskey}) {
                   2588: 		my ($parmname)=($thiskey=~/\.(\w+)$/);
                   2589: 		($hour,$min,$sec,$val)=&preset_defaults($parmname);
                   2590: 	    }
                   2591: 
                   2592: #
1.123     www      2593: # Ready to print
                   2594: #
1.295     albertel 2595: 	    $r->print(&tablestart().
                   2596: 		      &Apache::loncommon::start_data_table_row().
                   2597: 		      '<td><b>'.&standard_parameter_names($name).
1.293     www      2598: 		      '</b></td><td><input type="checkbox" name="del_'.
1.124     www      2599: 		      $thiskey.'" /></td><td>');
1.145     www      2600: 	    $foundkeys++;
1.213     www      2601: 	    if (&isdateparm($thistype)) {
1.123     www      2602: 		my $jskey='key_'.$pointer;
                   2603: 		$pointer++;
                   2604: 		$r->print(
1.232     albertel 2605: 			  &Apache::lonhtmlcommon::date_setter('parmform',
1.123     www      2606: 							      $jskey,
1.219     www      2607: 						      $$resourcedata{$thiskey},
1.230     www      2608: 							      '',1,'','',$hour,$min,$sec).
1.277     www      2609: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
                   2610: &date_sanity_info($$resourcedata{$thiskey})
1.123     www      2611: 			  );
1.219     www      2612: 	    } elsif ($thistype eq 'string_yesno') {
1.230     www      2613: 		my $showval;
                   2614: 		if (defined($$resourcedata{$thiskey})) {
                   2615: 		    $showval=$$resourcedata{$thiskey};
                   2616: 		} else {
                   2617: 		    $showval=$val;
                   2618: 		}
1.219     www      2619: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2620: 			  '" value="yes"');
1.230     www      2621: 		if ($showval eq 'yes') {
1.219     www      2622: 		    $r->print(' checked="checked"');
                   2623: 		}
                   2624:                 $r->print(' />'.&mt('Yes').'</label> ');
                   2625: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2626: 			  '" value="no"');
1.230     www      2627: 		if ($showval eq 'no') {
1.219     www      2628: 		    $r->print(' checked="checked"');
                   2629: 		}
                   2630:                 $r->print(' />'.&mt('No').'</label>');
1.123     www      2631: 	    } else {
1.230     www      2632: 		my $showval;
                   2633: 		if (defined($$resourcedata{$thiskey})) {
                   2634: 		    $showval=$$resourcedata{$thiskey};
                   2635: 		} else {
                   2636: 		    $showval=$val;
                   2637: 		}
1.211     www      2638: 		$r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.230     www      2639: 			  $showval.'">');
1.123     www      2640: 	    }
1.211     www      2641: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2642: 		      $thistype.'">');
1.295     albertel 2643: 	    $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122     www      2644: 	}
1.121     www      2645:     }
1.208     www      2646:     return $foundkeys;
                   2647: }
                   2648: 
                   2649: sub newoverview {
1.280     albertel 2650:     my ($r) = @_;
                   2651: 
1.208     www      2652:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2653:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2654:     my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298     albertel 2655:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2656:     $r->print(<<ENDOVER);
1.280     albertel 2657: $start_page
1.208     www      2658: $breadcrumbs
1.232     albertel 2659: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      2660: ENDOVER
1.211     www      2661:     my @ids=();
                   2662:     my %typep=();
                   2663:     my %keyp=();
                   2664:     my %allparms=();
                   2665:     my %allparts=();
                   2666:     my %allmaps=();
                   2667:     my %mapp=();
                   2668:     my %symbp=();
                   2669:     my %maptitles=();
                   2670:     my %uris=();
                   2671:     my %keyorder=&standardkeyorder();
                   2672:     my %defkeytype=();
                   2673: 
                   2674:     my %alllevs=();
                   2675:     $alllevs{'Resource Level'}='full';
1.215     www      2676:     $alllevs{'Map/Folder Level'}='map';
1.211     www      2677:     $alllevs{'Course Level'}='general';
                   2678: 
                   2679:     my $csec=$env{'form.csec'};
1.269     raeburn  2680:     my $cgroup=$env{'form.cgroup'};
1.211     www      2681: 
                   2682:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   2683:     my $pschp=$env{'form.pschp'};
                   2684:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   2685:     if (!@psprt) { $psprt[0]='0'; }
                   2686: 
                   2687:     my @selected_sections = 
                   2688: 	&Apache::loncommon::get_env_multiple('form.Section');
                   2689:     @selected_sections = ('all') if (! @selected_sections);
                   2690:     foreach (@selected_sections) {
                   2691:         if ($_ eq 'all') {
                   2692:             @selected_sections = ('all');
                   2693:         }
                   2694:     }
1.269     raeburn  2695:     my @selected_groups =
                   2696:         &Apache::loncommon::get_env_multiple('form.Group');
1.211     www      2697: 
                   2698:     my $pssymb='';
                   2699:     my $parmlev='';
                   2700:  
                   2701:     unless ($env{'form.parmlev'}) {
                   2702:         $parmlev = 'map';
                   2703:     } else {
                   2704:         $parmlev = $env{'form.parmlev'};
                   2705:     }
                   2706: 
                   2707:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   2708: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   2709: 				\%keyorder,\%defkeytype);
                   2710: 
                   2711: # Menu to select levels, etc
                   2712: 
1.317   ! albertel 2713:     $r->print('<table id="LC_parm_overview_scope">
        !          2714:                <tr><td class="LC_parm_overview_level_menu">');
1.211     www      2715:     &levelmenu($r,\%alllevs,$parmlev);
                   2716:     if ($parmlev ne 'general') {
1.317   ! albertel 2717: 	$r->print('<td class="LC_parm_overview_map_menu">');
1.211     www      2718: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   2719: 	$r->print('</td>');
                   2720:     }
                   2721:     $r->print('</td></tr></table>');
                   2722: 
1.317   ! albertel 2723:     $r->print('<table id="LC_parm_overview_controls">
        !          2724:                <tr><td class="LC_parm_overview_parm_selectors">');  
1.211     www      2725:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.317   ! albertel 2726:     $r->print('</td><td class="LC_parm_overview_restrictions">
        !          2727:                 <table class="LC_parm_overview_restrictions">'.
        !          2728:               '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
        !          2729:               '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
1.211     www      2730:     &partmenu($r,\%allparts,\@psprt);
1.317   ! albertel 2731:     $r->print('</td><td>');
1.211     www      2732:     &sectionmenu($r,\@selected_sections);
1.317   ! albertel 2733:     $r->print('</td><td>');
1.269     raeburn  2734:     &groupmenu($r,\@selected_groups);
                   2735:     $r->print('</td></tr></table>');
1.214     www      2736:     $r->print('</td></tr></table>');
                   2737:  
                   2738:     my $sortorder=$env{'form.sortorder'};
                   2739:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2740:     &sortmenu($r,$sortorder);
                   2741: 
                   2742:     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      2743: 
                   2744: # Build the list data hash from the specified parms
                   2745: 
                   2746:     my $listdata;
                   2747:     %{$listdata}=();
                   2748: 
                   2749:     foreach my $cat (@pscat) {
1.269     raeburn  2750:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
                   2751:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211     www      2752:     }
                   2753: 
1.212     www      2754:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      2755: 
1.212     www      2756: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      2757: 
                   2758: # Read modified data
                   2759: 
                   2760: 	my $resourcedata=&readdata($crs,$dom);
                   2761: 
                   2762: # List data
                   2763: 
1.214     www      2764: 	&listdata($r,$resourcedata,$listdata,$sortorder);
1.211     www      2765:     }
                   2766:     $r->print(&tableend().
1.212     www      2767: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
1.280     albertel 2768: 	      '</form>'.&Apache::loncommon::end_page());
1.208     www      2769: }
                   2770: 
1.269     raeburn  2771: sub secgroup_lister {
                   2772:     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
                   2773:     foreach my $item (@{$selections}) {
                   2774:         foreach my $part (@{$psprt}) {
                   2775:             my $rootparmkey=$env{'request.course.id'};
                   2776:             if (($item ne 'all') && ($item ne 'none') && ($item)) {
                   2777:                 $rootparmkey.='.['.$item.']';
                   2778:             }
                   2779:             if ($parmlev eq 'general') {
                   2780: # course-level parameter
                   2781:                 my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   2782:                 $$listdata{$newparmkey}=1;
                   2783:                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2784:             } elsif ($parmlev eq 'map') {
                   2785: # map-level parameter
                   2786:                 foreach my $mapid (keys %{$allmaps}) {
                   2787:                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   2788:                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                   2789:                     $$listdata{$newparmkey}=1;
                   2790:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2791:                 }
                   2792:             } else {
                   2793: # resource-level parameter
                   2794:                 foreach my $rid (@{$ids}) {
                   2795:                     my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
                   2796:                     if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
                   2797:                     my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
                   2798:                     $$listdata{$newparmkey}=1;
                   2799:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2800:                 }
                   2801:             }
                   2802:         }
                   2803:     }
                   2804: }
                   2805: 
1.208     www      2806: sub overview {
1.280     albertel 2807:     my ($r) = @_;
1.208     www      2808:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2809:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2810: 
                   2811:     my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298     albertel 2812:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2813:     $r->print(<<ENDOVER);
1.280     albertel 2814: $start_page
1.208     www      2815: $breadcrumbs
1.232     albertel 2816: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208     www      2817: ENDOVER
                   2818: # Store modified
                   2819: 
                   2820:     &storedata($r,$crs,$dom);
                   2821: 
                   2822: # Read modified data
                   2823: 
                   2824:     my $resourcedata=&readdata($crs,$dom);
                   2825: 
1.214     www      2826: 
                   2827:     my $sortorder=$env{'form.sortorder'};
                   2828:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2829:     &sortmenu($r,$sortorder);
                   2830: 
1.208     www      2831: # List data
                   2832: 
1.214     www      2833:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208     www      2834: 
1.145     www      2835:     $r->print(&tableend().'<p>'.
1.280     albertel 2836: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
                   2837: 	      &Apache::loncommon::end_page());
1.120     www      2838: }
1.121     www      2839: 
1.59      matthew  2840: ##################################################
                   2841: ##################################################
1.178     raeburn  2842:                                                                                             
                   2843: =pod
1.239     raeburn  2844: 
                   2845: =item check_cloners
                   2846: 
                   2847: Checks if new users included in list of allowed cloners
                   2848: are valid users.  Replaces supplied list with 
                   2849: cleaned list containing only users with valid usernames
                   2850: and domains.
                   2851: 
                   2852: Inputs: $clonelist, $oldcloner 
                   2853: where $clonelist is ref to array of requested cloners,
                   2854: and $oldcloner is ref to array of currently allowed
                   2855: cloners.
                   2856: 
                   2857: Returns: string - comma separated list of requested
                   2858: cloners (username:domain) who do not exist in system.
                   2859: 
                   2860: =item change_clone
                   2861: 
1.178     raeburn  2862: Modifies the list of courses a user can clone (stored
1.239     raeburn  2863: in the user's environment.db file), called when a
1.178     raeburn  2864: change is made to the list of users allowed to clone
                   2865: a course.
1.239     raeburn  2866: 
1.178     raeburn  2867: Inputs: $action,$cloner
                   2868: where $action is add or drop, and $cloner is identity of 
                   2869: user for whom cloning ability is to be changed in course. 
                   2870: 
                   2871: =cut
                   2872:                                                                                             
                   2873: ##################################################
                   2874: ##################################################
                   2875: 
1.239     raeburn  2876: sub extract_cloners {
                   2877:     my ($clonelist,$allowclone) = @_;
                   2878:     if ($clonelist =~ /,/) {
                   2879:         @{$allowclone} = split/,/,$clonelist;
                   2880:     } else {
                   2881:         $$allowclone[0] = $clonelist;
                   2882:     }
                   2883: }
                   2884: 
                   2885: 
                   2886: sub check_cloners {
                   2887:     my ($clonelist,$oldcloner) = @_;
                   2888:     my ($clean_clonelist,$disallowed);
                   2889:     my @allowclone = ();
                   2890:     &extract_cloners($$clonelist,\@allowclone);
                   2891:     foreach my $currclone (@allowclone) {
                   2892:         if (!grep/^$currclone$/,@$oldcloner) {
                   2893:             my ($uname,$udom) = split/:/,$currclone;
                   2894:             if ($uname && $udom) {
                   2895:                 if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2896:                     $disallowed .= $currclone.',';   
                   2897:                 } else {
                   2898:                     $clean_clonelist .= $currclone.',';
                   2899:                 }
                   2900:             }
                   2901:         } else {
                   2902:             $clean_clonelist .= $currclone.',';
                   2903:         }
                   2904:     }
                   2905:     if ($disallowed) {
                   2906:         $disallowed =~ s/,$//;
                   2907:     }
                   2908:     if ($clean_clonelist) {
                   2909:         $clean_clonelist =~ s/,$//;
                   2910:     }
                   2911:     $$clonelist = $clean_clonelist;
                   2912:     return $disallowed;
                   2913: }  
1.178     raeburn  2914: 
                   2915: sub change_clone {
                   2916:     my ($clonelist,$oldcloner) = @_;
                   2917:     my ($uname,$udom);
1.190     albertel 2918:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2919:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  2920:     my $clone_crs = $cnum.':'.$cdom;
                   2921:     
                   2922:     if ($cnum && $cdom) {
1.239     raeburn  2923:         my @allowclone;
                   2924:         &extract_cloners($clonelist,\@allowclone);
1.178     raeburn  2925:         foreach my $currclone (@allowclone) {
                   2926:             if (!grep/^$currclone$/,@$oldcloner) {
                   2927:                 ($uname,$udom) = split/:/,$currclone;
                   2928:                 if ($uname && $udom) {
                   2929:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2930:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2931:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2932:                             if ($currclonecrs{'cloneable'} eq '') {
                   2933:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2934:                             } else {
                   2935:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2936:                             }
                   2937:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2938:                         }
                   2939:                     }
                   2940:                 }
                   2941:             }
                   2942:         }
                   2943:         foreach my $oldclone (@$oldcloner) {
                   2944:             if (!grep/^$oldclone$/,@allowclone) {
                   2945:                 ($uname,$udom) = split/:/,$oldclone;
                   2946:                 if ($uname && $udom) {
                   2947:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2948:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2949:                         my %newclonecrs = ();
                   2950:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2951:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2952:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2953:                                 foreach (@currclonecrs) {
                   2954:                                     unless ($_ eq $clone_crs) {
                   2955:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2956:                                     }
                   2957:                                 }
                   2958:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2959:                             } else {
                   2960:                                 $newclonecrs{'cloneable'} = '';
                   2961:                             }
                   2962:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2963:                         }
                   2964:                     }
                   2965:                 }
                   2966:             }
                   2967:         }
                   2968:     }
                   2969: }
                   2970: 
1.193     albertel 2971: 
                   2972: ##################################################
                   2973: ##################################################
                   2974: 
                   2975: =pod
                   2976: 
                   2977: =item * header
                   2978: 
                   2979: Output html header for page
                   2980: 
                   2981: =cut
                   2982: 
                   2983: ##################################################
                   2984: ##################################################
                   2985: sub header {
1.280     albertel 2986:     return &Apache::loncommon::start_page('Parameter Manager');
1.193     albertel 2987: }
                   2988: ##################################################
                   2989: ##################################################
                   2990: sub print_main_menu {
                   2991:     my ($r,$parm_permission)=@_;
                   2992:     #
                   2993:     $r->print(<<ENDMAINFORMHEAD);
                   2994: <form method="post" enctype="multipart/form-data"
                   2995:       action="/adm/parmset" name="studentform">
                   2996: ENDMAINFORMHEAD
                   2997: #
1.195     albertel 2998:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2999:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268     albertel 3000:     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
                   3001: 
1.193     albertel 3002:     my @menu =
                   3003:         (
                   3004:           { text => 'Set Course Environment Parameters',
1.204     www      3005: 	    action => 'crsenv',
1.193     albertel 3006:             permission => $parm_permission,
                   3007:             },
1.255     banghart 3008:           { text => 'Set Portfolio Metadata',
1.259     banghart 3009: 	    action => 'setrestrictmeta',
1.240     banghart 3010:             permission => $parm_permission,
                   3011:             },
1.271     www      3012: 	  { text => 'Manage Course Slots',
1.268     albertel 3013: 	    url => '/adm/slotrequest?command=showslots',
                   3014: 	    permission => $vgr,
                   3015:             },
                   3016: 	  { divider => 1,
                   3017: 	    },
1.216     www      3018:           { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193     albertel 3019:             url => '/adm/helper/parameter.helper',
                   3020:             permission => $parm_permission,
                   3021:             },
1.216     www      3022:           { text => 'Modify Resource Parameters - Overview Mode',
1.193     albertel 3023:             action => 'setoverview',
                   3024:             permission => $parm_permission,
1.208     www      3025:             },          
1.216     www      3026: 	  { text => 'Set Resource Parameters - Overview Mode',
1.208     www      3027:             action => 'newoverview',
                   3028:             permission => $parm_permission,
1.193     albertel 3029:             },
1.216     www      3030:           { text => 'Set/Modify Resource Parameters - Table Mode',
1.193     albertel 3031:             action => 'settable',
                   3032:             permission => $parm_permission,
1.204     www      3033:             help => 'Cascading_Parameters',
1.193     albertel 3034:             },
1.220     www      3035:           { text => 'Set Parameter Setting Default Actions',
                   3036:             action => 'setdefaults',
                   3037:             permission => $parm_permission,
1.284     www      3038:             },          
1.292     www      3039: 	  { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284     www      3040:             action => 'parameterchangelog',
                   3041:             permission => $parm_permission,
1.220     www      3042:             },
1.193     albertel 3043:           );
                   3044:     my $menu_html = '';
                   3045:     foreach my $menu_item (@menu) {
1.268     albertel 3046: 	if ($menu_item->{'divider'}) {
                   3047: 	    $menu_html .= '<hr />';
                   3048: 	    next;
                   3049: 	}
1.193     albertel 3050:         next if (! $menu_item->{'permission'});
                   3051:         $menu_html.='<p>';
1.316     albertel 3052:         $menu_html.='<span class="LC_parm_menu_item">';
1.193     albertel 3053:         if (exists($menu_item->{'url'})) {
                   3054:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   3055:         } else {
                   3056:             $menu_html.=
                   3057:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   3058:         }
1.316     albertel 3059:         $menu_html.= &mt($menu_item->{'text'}).'</a></span>';
1.193     albertel 3060:         if (exists($menu_item->{'help'})) {
                   3061:             $menu_html.=
                   3062:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   3063:         }
                   3064:         $menu_html.='</p>'.$/;
                   3065:     }
                   3066:     $r->print($menu_html);
                   3067:     return;
                   3068: }
1.255     banghart 3069: ### Set portfolio metadata
1.252     banghart 3070: sub output_row {
1.255     banghart 3071:     my ($r, $field_name, $field_text) = @_;
1.252     banghart 3072:     my $output;
1.263     banghart 3073:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3074:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.254     banghart 3075:     unless (defined($options)) {
                   3076:         $options = 'active,stuadd';
1.261     banghart 3077:         $values = '';
1.252     banghart 3078:     }
1.260     banghart 3079:     $output.='<strong>'.$field_text.':</strong>';
1.264     albertel 3080:     $output.='<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /><br />';
                   3081: 
                   3082:     my @options= ( ['active', 'Show to student'],
                   3083: 		   ['onlyone','Student may select only one choice'],
                   3084: 		   ['stuadd', 'Student may type choices']);
                   3085:     foreach my $opt (@options) {
                   3086: 	my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
                   3087: 	$output.=('&nbsp;'x5).'<label><input type="checkbox" name="'.
                   3088: 	    $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3089: 	    &mt($opt->[1]).'</label> <br />';
1.252     banghart 3090:     }
                   3091:     return ($output);
                   3092: }
1.259     banghart 3093: 
                   3094: sub setrestrictmeta {
1.240     banghart 3095:     my ($r)=@_;
1.242     banghart 3096:     my $next_meta;
1.244     banghart 3097:     my $output;
1.245     banghart 3098:     my $item_num;
1.246     banghart 3099:     my $put_result;
1.280     albertel 3100:     
                   3101:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 3102:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 3103:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3104:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259     banghart 3105:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 3106:     my $save_field = '';
1.259     banghart 3107:     if ($env{'form.restrictmeta'}) {
1.254     banghart 3108:         foreach my $field (sort(keys(%env))) {
1.252     banghart 3109:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 3110:                 my $options;
1.252     banghart 3111:                 my $meta_field = $1;
                   3112:                 my $meta_key = $2;
1.253     banghart 3113:                 if ($save_field ne $meta_field) {
1.252     banghart 3114:                     $save_field = $meta_field;
1.253     banghart 3115:             	    if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254     banghart 3116:             	        $options.='stuadd,';
                   3117:             	    } 
1.253     banghart 3118:             	    if ($env{'form.'.$meta_field.'_onlyone'}) {
1.254     banghart 3119:             	        $options.='onlyone,';
                   3120:             	    } 
                   3121:             	    if ($env{'form.'.$meta_field.'_active'}) {
                   3122:             	        $options.='active,';
1.253     banghart 3123:             	    }
1.259     banghart 3124:                     my $name = $save_field;
1.253     banghart 3125:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 3126:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   3127:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 3128:                                                    },$dom,$crs);
1.252     banghart 3129:                 }
                   3130:             }
                   3131:         }
                   3132:     }
1.296     albertel 3133:     &Apache::lonnet::coursedescription($env{'request.course.id'},
                   3134: 				       {'freshen_cache' => 1});
1.258     albertel 3135:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
                   3136:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 3137:         &Apache::lonnet::logthis ($field);
                   3138:         if ($field ne 'courserestricted') {
                   3139: 	    $output.= &output_row($r, $field, $metadata_fields{$field});
                   3140: 	}
1.255     banghart 3141:     }
1.244     banghart 3142:     $r->print(<<ENDenv);       
1.259     banghart 3143:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 3144:         <p>
                   3145:         $output
1.259     banghart 3146:         <input type="submit" name="restrictmeta" value="Update Metadata Restrictions">
1.244     banghart 3147:         </form>
                   3148: ENDenv
1.280     albertel 3149:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 3150:     return 'ok';
                   3151: }
1.220     www      3152: ##################################################
1.193     albertel 3153: 
1.220     www      3154: sub defaultsetter {
1.280     albertel 3155:     my ($r) = @_;
                   3156: 
                   3157:     my $start_page = 
                   3158: 	&Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 3159:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220     www      3160:     $r->print(<<ENDDEFHEAD);
1.280     albertel 3161: $start_page
1.220     www      3162: $breadcrumbs
                   3163: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
                   3164: ENDDEFHEAD
1.280     albertel 3165: 
                   3166:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3167:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221     www      3168:     my @ids=();
                   3169:     my %typep=();
                   3170:     my %keyp=();
                   3171:     my %allparms=();
                   3172:     my %allparts=();
                   3173:     my %allmaps=();
                   3174:     my %mapp=();
                   3175:     my %symbp=();
                   3176:     my %maptitles=();
                   3177:     my %uris=();
                   3178:     my %keyorder=&standardkeyorder();
                   3179:     my %defkeytype=();
                   3180: 
                   3181:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   3182: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   3183: 				\%keyorder,\%defkeytype);
1.224     www      3184:     if ($env{'form.storerules'}) {
                   3185: 	my %newrules=();
                   3186: 	my @delrules=();
1.226     www      3187: 	my %triggers=();
1.225     albertel 3188: 	foreach my $key (keys(%env)) {
                   3189:             if ($key=~/^form\.(\w+)\_action$/) {
1.224     www      3190: 		my $tempkey=$1;
1.226     www      3191: 		my $action=$env{$key};
                   3192:                 if ($action) {
                   3193: 		    $newrules{$tempkey.'_action'}=$action;
                   3194: 		    if ($action ne 'default') {
                   3195: 			my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   3196: 			$triggers{$whichparm}.=$tempkey.':';
                   3197: 		    }
                   3198: 		    $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224     www      3199: 		    if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3200: 			$newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224     www      3201: 			$newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   3202: 			$newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   3203: 			$newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   3204: 		    } else {
                   3205: 			$newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227     www      3206: 			$newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224     www      3207: 		    }
                   3208: 		} else {
1.225     albertel 3209: 		    push(@delrules,$tempkey.'_action');
1.226     www      3210: 		    push(@delrules,$tempkey.'_type');
1.225     albertel 3211: 		    push(@delrules,$tempkey.'_hours');
                   3212: 		    push(@delrules,$tempkey.'_min');
                   3213: 		    push(@delrules,$tempkey.'_sec');
                   3214: 		    push(@delrules,$tempkey.'_value');
1.224     www      3215: 		}
                   3216: 	    }
                   3217: 	}
1.226     www      3218: 	foreach my $key (keys %allparms) {
                   3219: 	    $newrules{$key.'_triggers'}=$triggers{$key};
                   3220: 	}
1.224     www      3221: 	&Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
                   3222: 	&Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
                   3223: 	&resetrulescache();
                   3224:     }
1.227     www      3225:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                   3226: 				       'hours' => 'Hours',
1.221     www      3227: 				       'min' => 'Minutes',
                   3228: 				       'sec' => 'Seconds',
                   3229: 				       'yes' => 'Yes',
                   3230: 				       'no' => 'No');
1.222     www      3231:     my @standardoptions=('','default');
                   3232:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   3233:     my @dateoptions=('','default');
                   3234:     my @datedisplay=('',&mt('Default value when manually setting'));
                   3235:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
                   3236: 	unless ($tempkey) { next; }
                   3237: 	push @standardoptions,'when_setting_'.$tempkey;
                   3238: 	push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   3239: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3240: 	    push @dateoptions,'later_than_'.$tempkey;
                   3241: 	    push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   3242: 	    push @dateoptions,'earlier_than_'.$tempkey;
                   3243: 	    push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   3244: 	} 
                   3245:     }
1.231     www      3246: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
                   3247: 	  &mt('Automatic setting rules apply to table mode interfaces only.'));
1.221     www      3248:     $r->print("\n<table border='1'><tr><th>".&mt('Rule for parameter').'</th><th>'.
1.222     www      3249: 	      &mt('Action').'</th><th>'.&mt('Value').'</th></tr>');
1.221     www      3250:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222     www      3251: 	unless ($tempkey) { next; }
1.221     www      3252: 	$r->print("\n<tr><td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222     www      3253: 	my $action=&rulescache($tempkey.'_action');
                   3254: 	$r->print('<select name="'.$tempkey.'_action">');
                   3255: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3256: 	    for (my $i=0;$i<=$#dateoptions;$i++) {
                   3257: 		if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   3258: 		$r->print("\n<option value='$dateoptions[$i]'".
                   3259: 			  ($dateoptions[$i] eq $action?' selected="selected"':'').
                   3260: 			  ">$datedisplay[$i]</option>");
                   3261: 	    }
                   3262: 	} else {
                   3263: 	    for (my $i=0;$i<=$#standardoptions;$i++) {
                   3264: 		if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   3265: 		$r->print("\n<option value='$standardoptions[$i]'".
                   3266: 			  ($standardoptions[$i] eq $action?' selected="selected"':'').
                   3267: 			  ">$standarddisplay[$i]</option>");
                   3268: 	    }
                   3269: 	}
                   3270: 	$r->print('</select>');
1.227     www      3271: 	unless (&isdateparm($defkeytype{$tempkey})) {
                   3272: 	    $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   3273: 		      '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   3274: 	}
1.222     www      3275: 	$r->print("\n</td><td>\n");
                   3276: 
1.221     www      3277:         if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3278: 	    my $days=&rulescache($tempkey.'_days');
1.222     www      3279: 	    my $hours=&rulescache($tempkey.'_hours');
                   3280: 	    my $min=&rulescache($tempkey.'_min');
                   3281: 	    my $sec=&rulescache($tempkey.'_sec');
1.221     www      3282: 	    $r->print(<<ENDINPUTDATE);
1.227     www      3283: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      3284: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   3285: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   3286: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      3287: ENDINPUTDATE
                   3288: 	} elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      3289:             my $yeschecked='';
                   3290:             my $nochecked='';
                   3291:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
                   3292:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
                   3293: 
1.221     www      3294: 	    $r->print(<<ENDYESNO);
1.224     www      3295: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
                   3296: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221     www      3297: ENDYESNO
                   3298:         } else {
1.224     www      3299: 	    $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221     www      3300: 	}
                   3301:         $r->print('</td></tr>');
                   3302:     }
1.224     www      3303:     $r->print("</table>\n<input type='submit' name='storerules' value='".
1.280     albertel 3304: 	      &mt('Store Rules')."' /></form>\n".
                   3305: 	      &Apache::loncommon::end_page());
1.220     www      3306:     return;
                   3307: }
1.193     albertel 3308: 
1.290     www      3309: sub components {
1.291     www      3310:     my ($key,$uname,$udom,$exeuser,$exedomain)=@_;
1.290     www      3311:     my $typeflag=0;
                   3312:     if ($key=~/\.type$/) {
                   3313: 	$key=~s/\.type$//;
                   3314:         $typeflag=1;
                   3315:     }
1.291     www      3316:     my $issection;
1.290     www      3317:     my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
                   3318:     my $section=&mt('All Students');
                   3319:     if ($middle=~/^\[(.*)\]/) {
1.291     www      3320: 	$issection=$1;
                   3321: 	$section=&mt('Group/Section').': '.$issection;
1.290     www      3322: 	$middle=~s/^\[(.*)\]//;
                   3323:     }
                   3324:     $middle=~s/\.+$//;
                   3325:     $middle=~s/^\.+//;
1.291     www      3326:     if ($uname) {
                   3327: 	$section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   3328: 	$issection='';
                   3329:     }
1.316     albertel 3330:     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.304     www      3331:     my $realmdescription=&mt('all resources'); 
1.290     www      3332:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316     albertel 3333: 	$realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';
1.304     www      3334:  	$realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
                   3335:    } elsif ($middle) {
1.290     www      3336: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316     albertel 3337: 	$realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';
1.304     www      3338: 	$realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      3339:     }
1.291     www      3340:     my $what=$part.'.'.$name;
                   3341:     return ($realm,$section,$name,$part,$typeflag,
1.304     www      3342: 	    $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      3343: }
1.293     www      3344: 
1.292     www      3345: sub standard_parameter_names {
                   3346:     my ($name)=@_;
                   3347:     my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date',
                   3348: 						   'answerdate' => 'Answer Date',
                   3349: 						   'opendate' => 'Open Date',
                   3350: 						   'maxtries' => 'Max. Number of Tries',
                   3351: 						   'weight' => 'Weight',
                   3352: 						   'date_start' => 'Starting Date',
1.293     www      3353: 						   'date_end' => 'Ending Date',
1.309     www      3354:                                                    'interval' => 'Time Interval Length',
                   3355:                                                    'tol' => 'Numerical Tolerance',
                   3356:                                                    'sig' => 'Significant Digits',
                   3357:                                                    'contentopen' => 'Content Opening Date',
                   3358:                                                    'contentclose' => 'Content Closing Date',
                   3359:                                                    'discussend' => 'End of Discussion Time',
                   3360:                                                    'discusshide' => 'Discussion Hidden',
                   3361:                                                    'problemstatus' => 'Problem Status Visible',
1.293     www      3362: 						   'int_pos' => 'Positive Integer',
                   3363: 						   'int_zero_pos' => 'Positive Integer or Zero',
1.310     www      3364: 						   'hinttries' => 'Number of Tries till Hints appear',
                   3365:                                                    'numbubbles' => 'Number of Bubbles in Exam Mode');
1.292     www      3366:     if ($standard_parms{$name}) {
                   3367: 	return $standard_parms{$name}; 
                   3368:     } else { 
                   3369: 	return $name; 
                   3370:     }
                   3371: }
1.290     www      3372: 
1.309     www      3373: #
                   3374: # Parameter Change Log
                   3375: #
                   3376: 
                   3377: 
1.285     albertel 3378: sub parm_change_log {
1.284     www      3379:     my ($r)=@_;
                   3380:     &startpage($r);
1.286     www      3381:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   3382: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   3383: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.311     albertel 3384: 
1.301     www      3385:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311     albertel 3386: 
                   3387:     $r->print('<form action="/adm/parmset?action=settable"
                   3388:                      method="post" name"parameterlog">
                   3389:                <input type="hidden" name="action"
                   3390:                       value="parameterchangelog" />');
                   3391:     
                   3392:     my %saveable_parameters = ('show' => 'scalar',);
                   3393:     &Apache::loncommon::store_course_settings('parameter_log',
                   3394:                                               \%saveable_parameters);
                   3395:     &Apache::loncommon::restore_course_settings('parameter_log',
                   3396:                                                 \%saveable_parameters);
                   3397:     if (!$env{'form.show'}) { $env{'form.show'}=10; }
                   3398: 
                   3399:     my $countselect =
                   3400: 	&Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
                   3401: 				    (&mt('all'),10,20,50,100,1000,10000));
                   3402: 
1.309     www      3403:     $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
                   3404: 	      '<input type="submit" value="'.&mt('Display').'" />');
1.301     www      3405: 
1.291     www      3406:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   3407: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301     www      3408:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
                   3409: 	      '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   3410: 	      &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   3411: 	      &Apache::loncommon::end_data_table_header_row());
1.309     www      3412:     my $shown=0;
1.294     www      3413:     foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
                   3414:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.290     www      3415: 	my $count=$#changes+1;
1.288     albertel 3416: 	my $time =
1.294     www      3417: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      3418: 	my $plainname = 
1.294     www      3419: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   3420: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 3421: 	my $about_me_link = 
1.289     www      3422: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      3423: 					       $parmlog{$id}{'exe_uname'},
                   3424: 					       $parmlog{$id}{'exe_udom'});
1.293     www      3425: 	my $send_msg_link='';
1.294     www      3426: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   3427: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      3428: 	    $send_msg_link ='<br />'.
1.288     albertel 3429: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      3430: 						   $parmlog{$id}{'exe_uname'},
                   3431: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 3432: 	}
1.301     www      3433: 	my $row_start=&Apache::loncommon::start_data_table_row();
                   3434: 	$r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.290     www      3435:                        <td rowspan="'.$count.'">'.$about_me_link.
1.294     www      3436: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   3437: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
1.290     www      3438: 		  $send_msg_link.'</td>');
                   3439: 	my $makenewrow=0;
                   3440: 	my %istype=();
1.293     www      3441: 	foreach my $changed (reverse(sort(@changes))) {
1.294     www      3442:             my $value=$parmlog{$id}{'logentry'}->{$changed};
1.304     www      3443:             my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.294     www      3444: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
1.290     www      3445: 	    if ($typeflag) { $istype{$parmname}=$value; }
1.301     www      3446: 	    if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; }
1.290     www      3447: 	    $r->print('<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292     www      3448: 		      &standard_parameter_names($parmname).'</td><td>'.
                   3449: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>');
1.291     www      3450: 	    my $stillactive=0;
1.294     www      3451: 	    if ($parmlog{$id}{'deleteflag'}) {
1.290     www      3452: 		$r->print(&mt('Deleted'));
1.288     albertel 3453: 	    } else {
1.290     www      3454: 		if ($typeflag) {
1.292     www      3455: 		    $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
1.290     www      3456: 		} else {
1.291     www      3457: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   3458: 						      $uname,$udom,$issection,$issection,$courseopt);
                   3459: 		    if (&isdateparm($istype{$parmname})) {
                   3460: 			$r->print(&Apache::lonlocal::locallocaltime($value));
                   3461: 		    } else {
                   3462: 			$r->print($value);
                   3463: 		    }
                   3464: 		    if ($value ne $all[$level]) {
1.316     albertel 3465: 			$r->print('<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>');
1.291     www      3466: 		    } else {
                   3467: 			$stillactive=1;
                   3468: 		    }
1.290     www      3469: 		}
1.288     albertel 3470: 	    }
1.291     www      3471: 	    $r->print('</td>');
                   3472: 	    if ($stillactive) {
1.304     www      3473: 		my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
                   3474:                 my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
                   3475: 				    (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292     www      3476: 		if (($uname) && ($udom)) {
1.304     www      3477: 		    $r->print('<td>'.
                   3478: 			      &Apache::loncommon::messagewrapper('Notify User',$uname,$udom,$title,$description).
                   3479: 			      '</td>');
1.292     www      3480: 		} else {
1.303     www      3481: 		    $r->print('<td>'.
1.304     www      3482: 			      &Apache::lonrss::course_blog_link($id,$title,$description).
                   3483: 			      '</td>');
1.292     www      3484: 		}
1.291     www      3485: 	    } else {
                   3486: 		$r->print('<td>&nbsp;</td>');
                   3487: 	    }
1.301     www      3488: 	    $r->print(&Apache::loncommon::end_data_table_row());
1.288     albertel 3489: 	}
1.309     www      3490: 	$shown++;
1.311     albertel 3491: 	if (!($env{'form.show'} eq &mt('all') 
                   3492: 	      || $shown<=$env{'form.show'})) { last; }
1.286     www      3493:     }
1.301     www      3494:     $r->print(&Apache::loncommon::end_data_table());
1.309     www      3495:     $r->print('</form>');
1.284     www      3496:     $r->print(&Apache::loncommon::end_page());
                   3497: }
                   3498: 
1.178     raeburn  3499: ##################################################
                   3500: ##################################################
1.30      www      3501: 
1.59      matthew  3502: =pod
                   3503: 
1.83      bowersj2 3504: =item * handler
1.59      matthew  3505: 
                   3506: Main handler.  Calls &assessparms and &crsenv subroutines.
                   3507: 
                   3508: =cut
                   3509: ##################################################
                   3510: ##################################################
1.220     www      3511: #    use Data::Dumper;
                   3512: 
1.259     banghart 3513: 
1.30      www      3514: sub handler {
1.43      albertel 3515:     my $r=shift;
1.30      www      3516: 
1.43      albertel 3517:     if ($r->header_only) {
1.126     www      3518: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 3519: 	$r->send_http_header;
                   3520: 	return OK;
                   3521:     }
1.193     albertel 3522:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      3523: 					    ['action','state',
                   3524:                                              'pres_marker',
                   3525:                                              'pres_value',
1.206     www      3526:                                              'pres_type',
1.243     banghart 3527:                                              'udom','uname','symb','serial']);
1.131     www      3528: 
1.83      bowersj2 3529: 
1.193     albertel 3530:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 3531:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   3532: 					    text=>"Parameter Manager",
1.204     www      3533: 					    faq=>10,
1.194     albertel 3534: 					    bug=>'Instructor Interface'});
1.203     www      3535: 
1.30      www      3536: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 3537:     my $parm_permission =
                   3538: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 3539: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 3540: 				  $env{'request.course.sec'}));
1.194     albertel 3541:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 3542: 
                   3543:         # Start Page
1.126     www      3544:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      3545:         $r->send_http_header;
1.30      www      3546: 
1.203     www      3547: 
                   3548:         # id numbers can change on re-ordering of folders
                   3549: 
                   3550:         &resetsymbcache();
                   3551: 
1.193     albertel 3552:         #
                   3553:         # Main switch on form.action and form.state, as appropriate
                   3554:         #
                   3555:         # Check first if coming from someone else headed directly for
                   3556:         #  the table mode
                   3557:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   3558: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   3559: 	    &assessparms($r);
                   3560: 
                   3561:         } elsif (! exists($env{'form.action'})) {
                   3562:             $r->print(&header());
1.298     albertel 3563:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 3564:             &print_main_menu($r,$parm_permission);
                   3565:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 3566:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   3567: 						    text=>"Course Environment"});
1.193     albertel 3568:             &crsenv($r); 
                   3569:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 3570:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3571: 						    text=>"Overview Mode"});
1.121     www      3572: 	    &overview($r);
1.259     banghart 3573:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   3574:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   3575: 						    text=>"Restrict Metadata"});
                   3576: 	    &setrestrictmeta($r);
1.208     www      3577:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   3578:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3579: 						    text=>"Overview Mode"});
                   3580: 	    &newoverview($r);
1.220     www      3581:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   3582:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   3583: 						    text=>"Set Defaults"});
                   3584: 	    &defaultsetter($r);
                   3585: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 3586:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      3587: 						    text=>"Table Mode",
                   3588: 						    help => 'Course_Setting_Parameters'});
1.121     www      3589: 	    &assessparms($r);
1.284     www      3590:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   3591:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      3592: 						    text=>"Parameter Change Log"});
1.285     albertel 3593: 	    &parm_change_log($r);
1.284     www      3594: 	}       
1.43      albertel 3595:     } else {
1.1       www      3596: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 3597: 	$env{'user.error.msg'}=
1.43      albertel 3598: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   3599: 	return HTTP_NOT_ACCEPTABLE;
                   3600:     }
                   3601:     return OK;
1.1       www      3602: }
                   3603: 
                   3604: 1;
                   3605: __END__
                   3606: 
1.59      matthew  3607: =pod
1.38      harris41 3608: 
                   3609: =back
                   3610: 
                   3611: =cut
1.1       www      3612: 
                   3613: 
                   3614: 

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