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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.413.6.1! raeburn     4: # $Id: lonparmset.pm,v 1.413 2008/10/23 14:26:17 bisitz 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.350     albertel   68: use LONCAPA qw(:DEFAULT :match);
1.1       www        69: 
1.198     www        70: 
1.59      matthew    71: ##################################################
                     72: ##################################################
                     73: 
                     74: =pod
                     75: 
                     76: =item parmval
                     77: 
                     78: Figure out a cascading parameter.
                     79: 
1.71      albertel   80: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   81:          $id   - a bighash Id number
1.71      albertel   82:          $def  - the resource's default value   'stupid emacs
                     83: 
1.269     raeburn    84: 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   85: 
1.306     albertel   86: 14- General Course
                     87: 13- Map or Folder level in course
1.269     raeburn    88: 12- resource default
                     89: 11- map default
1.306     albertel   90: 10- resource level in course
1.269     raeburn    91: 9 - General for section
                     92: 8 - Map or Folder level for section
                     93: 7 - resource level in section
                     94: 6 - General for group
                     95: 5 - Map or Folder level for group
                     96: 4 - resource level in group
1.71      albertel   97: 3 - General for specific student
1.82      www        98: 2 - Map or Folder level for specific student
1.71      albertel   99: 1 - resource level for specific student
1.2       www       100: 
1.59      matthew   101: =cut
                    102: 
                    103: ##################################################
1.2       www       104: sub parmval {
1.275     raeburn   105:     my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
                    106:     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
                    107:                                                            $cgroup,$courseopt);
1.201     www       108: }
                    109: 
                    110: sub parmval_by_symb {
1.275     raeburn   111:     my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
1.200     www       112: 
1.352     albertel  113:     my $useropt;
                    114:     if ($uname ne '' && $udom ne '') {
                    115: 	$useropt = &Apache::lonnet::get_userresdata($uname,$udom);
                    116:     }
1.200     www       117: 
1.8       www       118:     my $result='';
1.44      albertel  119:     my @outpar=();
1.2       www       120: # ----------------------------------------------------- Cascading lookup scheme
1.201     www       121:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.305     albertel  122:     $map = &Apache::lonnet::deversion($map);
1.10      www       123: 
1.201     www       124:     my $symbparm=$symb.'.'.$what;
                    125:     my $mapparm=$map.'___(all).'.$what;
1.10      www       126: 
1.269     raeburn   127:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
                    128:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    129:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    130: 
1.190     albertel  131:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
                    132:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    133:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
                    134: 
                    135:     my $courselevel=$env{'request.course.id'}.'.'.$what;
                    136:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    137:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2       www       138: 
1.11      www       139: 
1.182     albertel  140: # --------------------------------------------------------- first, check course
1.11      www       141: 
1.200     www       142:     if (defined($$courseopt{$courselevel})) {
1.269     raeburn   143: 	$outpar[14]=$$courseopt{$courselevel};
                    144: 	$result=14;
1.43      albertel  145:     }
1.11      www       146: 
1.200     www       147:     if (defined($$courseopt{$courselevelm})) {
1.269     raeburn   148: 	$outpar[13]=$$courseopt{$courselevelm};
                    149: 	$result=13;
1.43      albertel  150:     }
1.11      www       151: 
1.182     albertel  152: # ------------------------------------------------------- second, check default
                    153: 
1.269     raeburn   154:     if (defined($def)) { $outpar[12]=$def; $result=12; }
1.182     albertel  155: 
                    156: # ------------------------------------------------------ third, check map parms
                    157: 
1.376     albertel  158:     my $thisparm=&parmhash($symbparm);
1.269     raeburn   159:     if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
1.182     albertel  160: 
1.200     www       161:     if (defined($$courseopt{$courselevelr})) {
1.269     raeburn   162: 	$outpar[10]=$$courseopt{$courselevelr};
                    163: 	$result=10;
1.43      albertel  164:     }
1.11      www       165: 
1.182     albertel  166: # ------------------------------------------------------ fourth, back to course
1.352     albertel  167:     if ($csec ne '') {
1.200     www       168:         if (defined($$courseopt{$seclevel})) {
1.269     raeburn   169: 	    $outpar[9]=$$courseopt{$seclevel};
                    170: 	    $result=9;
1.43      albertel  171: 	}
1.200     www       172:         if (defined($$courseopt{$seclevelm})) {
1.269     raeburn   173: 	    $outpar[8]=$$courseopt{$seclevelm};
                    174: 	    $result=8;
1.43      albertel  175: 	}
                    176: 
1.200     www       177:         if (defined($$courseopt{$seclevelr})) {
1.269     raeburn   178: 	    $outpar[7]=$$courseopt{$seclevelr};
                    179: 	    $result=7;
1.43      albertel  180: 	}
                    181:     }
1.275     raeburn   182: # ------------------------------------------------------ fifth, check course group
1.352     albertel  183:     if ($cgroup ne '') {
1.269     raeburn   184:         if (defined($$courseopt{$grplevel})) {
                    185:             $outpar[6]=$$courseopt{$grplevel};
                    186:             $result=6;
                    187:         }
                    188:         if (defined($$courseopt{$grplevelm})) {
                    189:             $outpar[5]=$$courseopt{$grplevelm};
                    190:             $result=5;
                    191:         }
                    192:         if (defined($$courseopt{$grplevelr})) {
                    193:             $outpar[4]=$$courseopt{$grplevelr};
                    194:             $result=4;
                    195:         }
                    196:     }
1.11      www       197: 
1.182     albertel  198: # ---------------------------------------------------------- fifth, check user
1.11      www       199: 
1.352     albertel  200:     if ($uname ne '') {
1.200     www       201: 	if (defined($$useropt{$courselevel})) {
                    202: 	    $outpar[3]=$$useropt{$courselevel};
1.43      albertel  203: 	    $result=3;
                    204: 	}
1.10      www       205: 
1.200     www       206: 	if (defined($$useropt{$courselevelm})) {
                    207: 	    $outpar[2]=$$useropt{$courselevelm};
1.43      albertel  208: 	    $result=2;
                    209: 	}
1.2       www       210: 
1.200     www       211: 	if (defined($$useropt{$courselevelr})) {
                    212: 	    $outpar[1]=$$useropt{$courselevelr};
1.43      albertel  213: 	    $result=1;
                    214: 	}
                    215:     }
1.44      albertel  216:     return ($result,@outpar);
1.2       www       217: }
                    218: 
1.198     www       219: 
                    220: 
1.376     albertel  221: # --- Caches local to lonparmset
                    222: 
                    223:     
                    224: sub reset_caches {
                    225:     &resetparmhash();
                    226:     &resetsymbcache();
                    227:     &resetrulescache();
1.203     www       228: }
                    229: 
1.376     albertel  230: {
                    231:     my $parmhashid;
                    232:     my %parmhash;
                    233:     sub resetparmhash {
                    234: 	undef($parmhashid);
                    235: 	undef(%parmhash);
                    236:     }
                    237:     
                    238:     sub cacheparmhash {
                    239: 	if ($parmhashid eq  $env{'request.course.fn'}) { return; }
                    240: 	my %parmhashfile;
                    241: 	if (tie(%parmhashfile,'GDBM_File',
                    242: 		$env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
                    243: 	    %parmhash=%parmhashfile;
                    244: 	    untie(%parmhashfile);
                    245: 	    $parmhashid=$env{'request.course.fn'};
                    246: 	}
1.201     www       247:     }
1.376     albertel  248:  
                    249:     sub parmhash {
                    250: 	my ($id) = @_;
                    251: 	&cacheparmhash();
                    252: 	return $parmhash{$id};
                    253:     }
                    254:  }
                    255: 
                    256: {   
                    257:     my $symbsid;
                    258:     my %symbs;
                    259:     sub resetsymbcache {
                    260: 	undef($symbsid);
                    261: 	undef(%symbs);
                    262:     }
                    263:     
                    264:     sub symbcache {
                    265: 	my $id=shift;
                    266: 	if ($symbsid ne $env{'request.course.id'}) {
                    267: 	    undef(%symbs);
                    268: 	}
                    269: 	if (!$symbs{$id}) {
                    270: 	    my $navmap = Apache::lonnavmaps::navmap->new();
                    271: 	    if ($id=~/\./) {
                    272: 		my $resource=$navmap->getById($id);
                    273: 		$symbs{$id}=$resource->symb();
                    274: 	    } else {
                    275: 		my $resource=$navmap->getByMapPc($id);
                    276: 		$symbs{$id}=&Apache::lonnet::declutter($resource->src());
                    277: 	    }
                    278: 	    $symbsid=$env{'request.course.id'};
1.201     www       279: 	}
1.376     albertel  280: 	return $symbs{$id};
1.201     www       281:     }
1.376     albertel  282:  }
1.201     www       283: 
1.376     albertel  284: {   
                    285:     my $rulesid;
                    286:     my %rules;
                    287:     sub resetrulescache {
                    288: 	undef($rulesid);
                    289: 	undef(%rules);
                    290:     }
                    291:     
                    292:     sub rulescache {
                    293: 	my $id=shift;
                    294: 	if ($rulesid ne $env{'request.course.id'}
                    295: 	    && !defined($rules{$id})) {
                    296: 	    my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    297: 	    my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                    298: 	    %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
                    299: 	    $rulesid=$env{'request.course.id'};
                    300: 	}
                    301: 	return $rules{$id};
1.221     www       302:     }
                    303: }
                    304: 
1.229     www       305: sub preset_defaults {
                    306:     my $type=shift;
                    307:     if (&rulescache($type.'_action') eq 'default') {
                    308: # yes, there is something
                    309: 	return (&rulescache($type.'_hours'),
                    310: 		&rulescache($type.'_min'),
                    311: 		&rulescache($type.'_sec'),
                    312: 		&rulescache($type.'_value'));
                    313:     } else {
                    314: # nothing there or something else
                    315: 	return ('','','','','');
                    316:     }
                    317: }
                    318: 
1.186     www       319: ##################################################
1.277     www       320: 
                    321: sub date_sanity_info {
                    322:    my $checkdate=shift;
                    323:    unless ($checkdate) { return ''; }
                    324:    my $result='';
                    325:    my $crsprefix='course.'.$env{'request.course.id'}.'.';
                    326:    if ($env{$crsprefix.'default_enrollment_end_date'}) {
                    327:       if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
1.413     bisitz    328:          $result.='<div class="LC_warning">'
                    329:                  .&mt('After course enrollment end!')
                    330:                  .'</div>';
1.277     www       331:       }
                    332:    }
                    333:    if ($env{$crsprefix.'default_enrollment_start_date'}) {
                    334:       if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
1.413     bisitz    335:          $result.='<div class="LC_warning">'
                    336:                  .&mt('Before course enrollment start!')
                    337:                  .'</div>';
1.277     www       338:       }
                    339:    }
1.413     bisitz    340: # Preparation for additional warnings about dates in the past/future.
                    341: # An improved, more context sensitive version is recommended,
                    342: # e.g. warn for due and answer dates which are defined before the corresponding open date, etc.
                    343: #   if ($checkdate<time) {
                    344: #      $result.='<div class="LC_info">'
                    345: #              .'('.&mt('in the past').')'
                    346: #              .'</div>';
                    347: #      }
                    348: #   if ($checkdate>time) {
                    349: #      $result.='<div class="LC_info">'
                    350: #              .'('.&mt('in the future').')'
                    351: #              .'</div>';
                    352: #      }
1.277     www       353:    return $result;
                    354: }
                    355: ##################################################
1.186     www       356: ##################################################
                    357: #
1.197     www       358: # Store a parameter by ID
1.186     www       359: #
                    360: # Takes
                    361: # - resource id
                    362: # - name of parameter
                    363: # - level
                    364: # - new value
                    365: # - new type
1.187     www       366: # - username
                    367: # - userdomain
                    368: 
1.186     www       369: sub storeparm {
1.269     raeburn   370:     my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.275     raeburn   371:     &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup);
1.197     www       372: }
                    373: 
                    374: #
                    375: # Store a parameter by symb
                    376: #
                    377: # Takes
                    378: # - symb
                    379: # - name of parameter
                    380: # - level
                    381: # - new value
                    382: # - new type
                    383: # - username
                    384: # - userdomain
1.226     www       385: my %recstack;
1.197     www       386: sub storeparm_by_symb {
1.275     raeburn   387:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
1.226     www       388:     unless ($recflag) {
                    389: # first time call
                    390: 	%recstack=();
                    391: 	$recflag=1;
                    392:     }
                    393: # store parameter
                    394:     &storeparm_by_symb_inner
1.269     raeburn   395: 	($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
1.266     www       396: # don't do anything if parameter was reset
                    397:     unless ($nval) { return; }
1.226     www       398:     my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
                    399: # remember that this was set
                    400:     $recstack{$parm}=1;
                    401: # what does this trigger?
                    402:     foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
                    403: # don't backfire
                    404:        unless ((!$triggered) || ($recstack{$triggered})) {
                    405: 	   my $action=&rulescache($triggered.'_action');
                    406: 	   my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                    407: # set triggered parameter on same level
                    408: 	   my $newspnam=$prefix.$triggered;
1.227     www       409: 	   my $newvalue='';
1.228     www       410: 	   my $active=1;
                    411: 	   if ($action=~/^when\_setting/) {
                    412: # are there restrictions?
                    413: 	       if (&rulescache($triggered.'_triggervalue')=~/\w/) {
                    414: 		   $active=0;
                    415: 		   foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
                    416: 		       if (lc($possiblevalue) eq lc($nval)) { $active=1; }
                    417: 		   }
                    418: 	       }
                    419: 	       $newvalue=&rulescache($triggered.'_value');
1.227     www       420: 	   } else {
                    421: 	       my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
1.228     www       422: 	       if ($action=~/^later\_than/) {
                    423: 		   $newvalue=$nval+$totalsecs;
                    424: 	       } else {
                    425: 		   $newvalue=$nval-$totalsecs;
                    426: 	       }
                    427: 	   }
                    428: 	   if ($active) {
                    429: 	       &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
1.275     raeburn   430: 				   $uname,$udom,$csec,$recflag,$cgroup);
1.227     www       431: 	   }
1.226     www       432:        }
                    433:     }
                    434:     return '';
                    435: }
                    436: 
1.293     www       437: sub log_parmset {
                    438:     return &Apache::lonnet::instructor_log('parameterlog',@_);
1.284     www       439: }
                    440: 
1.226     www       441: sub storeparm_by_symb_inner {
1.197     www       442: # ---------------------------------------------------------- Get symb, map, etc
1.269     raeburn   443:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.197     www       444: # ---------------------------------------------------------- Construct prefixes
1.186     www       445:     $spnam=~s/\_([^\_]+)$/\.$1/;
1.197     www       446:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.305     albertel  447:     $map = &Apache::lonnet::deversion($map);
                    448: 
1.197     www       449:     my $symbparm=$symb.'.'.$spnam;
                    450:     my $mapparm=$map.'___(all).'.$spnam;
                    451: 
1.269     raeburn   452:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
                    453:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    454:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    455: 
1.190     albertel  456:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
                    457:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    458:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186     www       459:     
1.190     albertel  460:     my $courselevel=$env{'request.course.id'}.'.'.$spnam;
                    461:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    462:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186     www       463:     
                    464:     my $storeunder='';
1.269     raeburn   465:     if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
                    466:     if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
                    467:     if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; }
                    468:     if ($snum==9) { $storeunder=$seclevel; }
                    469:     if ($snum==8) { $storeunder=$seclevelm; }
                    470:     if ($snum==7) { $storeunder=$seclevelr; }
                    471:     if ($snum==6) { $storeunder=$grplevel; }
                    472:     if ($snum==5) { $storeunder=$grplevelm; }
                    473:     if ($snum==4) { $storeunder=$grplevelr; }
                    474: 
1.186     www       475:     
                    476:     my $delete;
                    477:     if ($nval eq '') { $delete=1;}
                    478:     my %storecontent = ($storeunder         => $nval,
                    479: 			$storeunder.'.type' => $ntype);
                    480:     my $reply='';
                    481:     if ($snum>3) {
                    482: # ---------------------------------------------------------------- Store Course
                    483: #
1.200     www       484: 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    485: 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.186     www       486: # Expire sheets
                    487: 	&Apache::lonnet::expirespread('','','studentcalc');
1.269     raeburn   488: 	if (($snum==10) || ($snum==7) || ($snum==4)) {
1.197     www       489: 	    &Apache::lonnet::expirespread('','','assesscalc',$symb);
1.269     raeburn   490: 	} elsif (($snum==11) || ($snum==8) || ($snum==5)) {
1.197     www       491: 	    &Apache::lonnet::expirespread('','','assesscalc',$map);
1.186     www       492: 	} else {
                    493: 	    &Apache::lonnet::expirespread('','','assesscalc');
                    494: 	}
                    495: # Store parameter
                    496: 	if ($delete) {
                    497: 	    $reply=&Apache::lonnet::del
1.200     www       498: 		('resourcedata',[keys(%storecontent)],$cdom,$cnum);
1.290     www       499:             &log_parmset(\%storecontent,1);
1.186     www       500: 	} else {
                    501: 	    $reply=&Apache::lonnet::cput
1.200     www       502: 		('resourcedata',\%storecontent,$cdom,$cnum);
1.290     www       503: 	    &log_parmset(\%storecontent);
1.186     www       504: 	}
1.200     www       505: 	&Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
1.186     www       506:     } else {
                    507: # ------------------------------------------------------------------ Store User
                    508: #
                    509: # Expire sheets
                    510: 	&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
                    511: 	if ($snum==1) {
                    512: 	    &Apache::lonnet::expirespread
1.197     www       513: 		($uname,$udom,'assesscalc',$symb);
1.186     www       514: 	} elsif ($snum==2) {
                    515: 	    &Apache::lonnet::expirespread
1.197     www       516: 		($uname,$udom,'assesscalc',$map);
1.186     www       517: 	} else {
                    518: 	    &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
                    519: 	}
                    520: # Store parameter
                    521: 	if ($delete) {
                    522: 	    $reply=&Apache::lonnet::del
                    523: 		('resourcedata',[keys(%storecontent)],$udom,$uname);
1.290     www       524: 	    &log_parmset(\%storecontent,1,$uname,$udom);
1.186     www       525: 	} else {
                    526: 	    $reply=&Apache::lonnet::cput
                    527: 		('resourcedata',\%storecontent,$udom,$uname);
1.290     www       528: 	    &log_parmset(\%storecontent,0,$uname,$udom);
1.186     www       529: 	}
1.191     albertel  530: 	&Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186     www       531:     }
                    532:     
                    533:     if ($reply=~/^error\:(.*)/) {
1.314     albertel  534: 	return "<span class=\"LC_error\">Write Error: $1</span>";
1.186     www       535:     }
                    536:     return '';
                    537: }
                    538: 
1.59      matthew   539: ##################################################
                    540: ##################################################
                    541: 
                    542: =pod
                    543: 
                    544: =item valout
                    545: 
                    546: Format a value for output.
                    547: 
1.320     www       548: Inputs:  $value, $type, $editable
1.59      matthew   549: 
                    550: Returns: $value, formatted for output.  If $type indicates it is a date,
                    551: localtime($value) is returned.
1.320     www       552: $editable will return an icon to click on
1.9       www       553: 
1.59      matthew   554: =cut
                    555: 
                    556: ##################################################
                    557: ##################################################
1.9       www       558: sub valout {
1.320     www       559:     my ($value,$type,$editable)=@_;
1.59      matthew   560:     my $result = '';
                    561:     # Values of zero are valid.
                    562:     if (! $value && $value ne '0') {
1.320     www       563: 	if ($editable) {
1.324     www       564: 	    $result = '<span class="LC_clickhere">*</span>';
1.320     www       565: 	} else {
                    566: 	    $result='&nbsp;';
                    567: 	}
1.59      matthew   568:     } else {
1.66      www       569:         if ($type eq 'date_interval') {
                    570:             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
1.413     bisitz    571:             my @timer;
1.66      www       572:             $year=$year-70;
                    573:             $mday--;
                    574:             if ($year) {
1.413     bisitz    575: #               $result.=&mt('[quant,_1,yr]',$year).' ';
                    576:                 push(@timer,&mt('[quant,_1,yr]',$year));
1.66      www       577:             }
                    578:             if ($mon) {
1.413     bisitz    579: #               $result.=&mt('[quant,_1,mth]',$mon).' ';
                    580:                 push(@timer,&mt('[quant,_1,mth]',$mon));
1.66      www       581:             }
                    582:             if ($mday) {
1.413     bisitz    583: #               $result.=&mt('[quant,_1,day]',$mday).' ';
                    584:                 push(@timer,&mt('[quant,_1,day]',$mday));
1.66      www       585:             }
                    586:             if ($hour) {
1.413     bisitz    587: #               $result.=&mt('[quant,_1,hr]',$hour).' ';
                    588:                 push(@timer,&mt('[quant,_1,hr]',$hour));
1.66      www       589:             }
                    590:             if ($min) {
1.413     bisitz    591: #               $result.=&mt('[quant,_1,min]',$min).' ';
                    592:                 push(@timer,&mt('[quant,_1,min]',$min));
1.66      www       593:             }
                    594:             if ($sec) {
1.413     bisitz    595: #               $result.=&mt('[quant,_1,sec]',$sec).' ';
                    596:                 push(@timer,&mt('[quant,_1,sec]',$sec));
1.66      www       597:             }
1.413     bisitz    598: #           $result=~s/\s+$//;
                    599:             if (!@timer) { # Special case: all entries 0 -> display "0 secs" intead of empty field to keep this field editable
                    600:                 push(@timer,&mt('[quant,_1,sec]',0));
                    601:             }
                    602:             $result.=join(", ",@timer);
1.213     www       603:         } elsif (&isdateparm($type)) {
1.361     albertel  604:             $result = &Apache::lonlocal::locallocaltime($value).
                    605: 		&date_sanity_info($value);
1.59      matthew   606:         } else {
                    607:             $result = $value;
1.378     albertel  608: 	    $result = &HTML::Entities::encode($result,'"<>&');
1.59      matthew   609:         }
                    610:     }
                    611:     return $result;
1.9       www       612: }
                    613: 
1.59      matthew   614: ##################################################
                    615: ##################################################
                    616: 
                    617: =pod
1.5       www       618: 
1.59      matthew   619: =item plink
                    620: 
                    621: Produces a link anchor.
                    622: 
                    623: Inputs: $type,$dis,$value,$marker,$return,$call
                    624: 
                    625: Returns: scalar with html code for a link which will envoke the 
                    626: javascript function 'pjump'.
                    627: 
                    628: =cut
                    629: 
                    630: ##################################################
                    631: ##################################################
1.5       www       632: sub plink {
                    633:     my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23      www       634:     my $winvalue=$value;
                    635:     unless ($winvalue) {
1.213     www       636: 	if (&isdateparm($type)) {
1.190     albertel  637:             $winvalue=$env{'form.recent_'.$type};
1.23      www       638:         } else {
1.190     albertel  639:             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23      www       640:         }
                    641:     }
1.229     www       642:     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
                    643:     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
                    644:     unless (defined($winvalue)) { $winvalue=$val; }
1.378     albertel  645:     my $valout = &valout($value,$type,1);
1.413.6.1! raeburn   646:     my $unencmarker = $marker;
1.378     albertel  647:     foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
                    648: 		      \$hour, \$min, \$sec) {
                    649: 	$$item = &HTML::Entities::encode($$item,'"<>&');
                    650: 	$$item =~ s/\'/\\\'/g;
                    651:     }
1.413.6.1! raeburn   652:     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
1.43      albertel  653: 	'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
1.229     www       654: 	    .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
1.378     albertel  655: 	    $valout.'</a></td></tr></table>';
1.5       www       656: }
                    657: 
1.280     albertel  658: sub page_js {
                    659: 
1.81      www       660:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88      matthew   661:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.280     albertel  662: 
                    663:     return(<<ENDJS);
                    664: <script type="text/javascript">
1.44      albertel  665: 
                    666:     function pclose() {
                    667:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    668:                  "height=350,width=350,scrollbars=no,menubar=no");
                    669:         parmwin.close();
                    670:     }
                    671: 
1.88      matthew   672:     $pjump_def
1.44      albertel  673: 
                    674:     function psub() {
                    675:         pclose();
                    676:         if (document.parmform.pres_marker.value!='') {
                    677:             document.parmform.action+='#'+document.parmform.pres_marker.value;
                    678:             var typedef=new Array();
                    679:             typedef=document.parmform.pres_type.value.split('_');
                    680:            if (document.parmform.pres_type.value!='') {
                    681:             if (typedef[0]=='date') {
                    682:                 eval('document.parmform.recent_'+
                    683:                      document.parmform.pres_type.value+
                    684: 		     '.value=document.parmform.pres_value.value;');
                    685:             } else {
                    686:                 eval('document.parmform.recent_'+typedef[0]+
                    687: 		     '.value=document.parmform.pres_value.value;');
                    688:             }
                    689: 	   }
                    690:             document.parmform.submit();
                    691:         } else {
                    692:             document.parmform.pres_value.value='';
                    693:             document.parmform.pres_marker.value='';
                    694:         }
                    695:     }
                    696: 
1.57      albertel  697:     function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                    698:         var options = "width=" + w + ",height=" + h + ",";
                    699:         options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                    700:         options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                    701:         var newWin = window.open(url, wdwName, options);
                    702:         newWin.focus();
                    703:     }
1.44      albertel  704: </script>
1.81      www       705: $selscript
1.280     albertel  706: ENDJS
                    707: 
                    708: }
                    709: sub startpage {
                    710:     my ($r) = @_;
1.281     albertel  711: 
1.282     albertel  712:     my %loaditems = ('onunload' => "pclose()",
1.283     albertel  713: 		     'onload'   => "group_or_section('cgroup')",);
1.280     albertel  714: 
1.281     albertel  715:     my $start_page = 
                    716: 	&Apache::loncommon::start_page('Set/Modify Course Parameters',
                    717: 				       &page_js(),
1.282     albertel  718: 				       {'add_entries' => \%loaditems,});
1.280     albertel  719:     my $breadcrumbs = 
1.321     www       720: 	&Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
1.280     albertel  721:     $r->print(<<ENDHEAD);
1.281     albertel  722: $start_page
1.193     albertel  723: $breadcrumbs
                    724: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.280     albertel  725: <input type="hidden" value='' name="pres_value" />
                    726: <input type="hidden" value='' name="pres_type" />
                    727: <input type="hidden" value='' name="pres_marker" />
                    728: <input type="hidden" value='1' name="prevvisit" />
1.44      albertel  729: ENDHEAD
                    730: }
                    731: 
1.209     www       732: 
1.44      albertel  733: sub print_row {
1.201     www       734:     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
1.275     raeburn   735: 	$defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_;
                    736:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    737:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    738:     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.66      www       739: # get the values for the parameter in cascading order
                    740: # empty levels will remain empty
1.44      albertel  741:     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.275     raeburn   742: 	  $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       743: # get the type for the parameters
                    744: # problem: these may not be set for all levels
                    745:     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
1.275     raeburn   746:                                           $$name{$which}.'.type',$rid,
                    747: 		 $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       748: # cascade down manually
1.182     albertel  749:     my $cascadetype=$$defaulttype{$which};
1.269     raeburn   750:     for (my $i=14;$i>0;$i--) {
1.66      www       751: 	 if ($typeoutpar[$i]) { 
                    752:             $cascadetype=$typeoutpar[$i];
                    753: 	} else {
                    754:             $typeoutpar[$i]=$cascadetype;
                    755:         }
                    756:     }
1.57      albertel  757:     my $parm=$$display{$which};
                    758: 
1.203     www       759:     if ($parmlev eq 'full') {
1.57      albertel  760:         $r->print('<td bgcolor='.$defbgtwo.' align="center">'
                    761:                   .$$part{$which}.'</td>');
                    762:     } else {    
                    763:         $parm=~s|\[.*\]\s||g;
                    764:     }
1.231     www       765:     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
                    766:     if ($automatic) {
1.314     albertel  767: 	$parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';
1.231     www       768:     }
1.159     albertel  769:     $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57      albertel  770:    
1.44      albertel  771:     my $thismarker=$which;
                    772:     $thismarker=~s/^parameter\_//;
                    773:     my $mprefix=$rid.'&'.$thismarker.'&';
1.275     raeburn   774:     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);
                    775:     my ($othergrp,$grp_parm,$controlgrp);
1.44      albertel  776: 
1.57      albertel  777:     if ($parmlev eq 'general') {
                    778: 
                    779:         if ($uname) {
1.66      www       780:             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   781:         } elsif ($cgroup) {
                    782:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  783:         } elsif ($csec) {
1.269     raeburn   784:             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  785:         } else {
1.269     raeburn   786:             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  787:         }
                    788:     } elsif ($parmlev eq 'map') {
                    789: 
                    790:         if ($uname) {
1.66      www       791:             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   792:         } elsif ($cgroup) {
                    793:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  794:         } elsif ($csec) {
1.269     raeburn   795:             &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  796:         } else {
1.269     raeburn   797:             &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  798:         }
                    799:     } else {
1.275     raeburn   800:         if ($uname) {
                    801:             if (@{$usersgroups} > 1) {
                    802:                 my ($coursereply,$grp_parm,$controlgrp);
                    803:                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                    804:                     &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
                    805:                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                    806:                 if ($coursereply && $result > 3) {
                    807:                     if (defined($controlgrp)) {
                    808:                         if ($cgroup ne $controlgrp) {
                    809:                             $effective_parm = $grp_parm;
                    810:                             $result = 0;
                    811:                         }
                    812:                     }
                    813:                 }
                    814:             }
                    815:         }
1.57      albertel  816: 
1.269     raeburn   817:         &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  818: 
1.269     raeburn   819: 	&print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    820: 	&print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    821: 	&print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       822: 	&print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    823: 	
                    824: 	if ($csec) {
1.269     raeburn   825: 	    &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    826: 	    &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    827: 	    &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       828: 	}
1.269     raeburn   829: 
                    830:         if ($cgroup) {
                    831:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    832:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    833:             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    834:         }
1.275     raeburn   835:      
1.203     www       836: 	if ($uname) {
1.275     raeburn   837:             if ($othergrp) {
                    838:                 $r->print($othergrp);
                    839:             }
1.203     www       840: 	    &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    841: 	    &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    842: 	    &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    843: 	}
1.57      albertel  844: 
                    845:     } # end of $parmlev if/else
1.275     raeburn   846:     $r->print('<td bgcolor="#CCCCFF" align="center">'.$effective_parm.'</td>');
1.136     albertel  847: 
1.203     www       848:     if ($parmlev eq 'full') {
1.136     albertel  849:         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.201     www       850:                                         '.'.$$name{$which},$$symbp{$rid});
1.136     albertel  851:         my $sessionvaltype=$typeoutpar[$result];
                    852:         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
1.275     raeburn   853:         $r->print('<td bgcolor="#999999" align="center"><font color="#FFFFFF">'.
1.66      www       854:                   &valout($sessionval,$sessionvaltype).'&nbsp;'.
1.57      albertel  855:                   '</font></td>');
1.136     albertel  856:     }
1.44      albertel  857:     $r->print('</tr>');
1.57      albertel  858:     $r->print("\n");
1.44      albertel  859: }
1.59      matthew   860: 
1.44      albertel  861: sub print_td {
1.66      www       862:     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57      albertel  863:     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114     www       864:               ' align="center">');
1.269     raeburn   865:     if ($which<11 || $which > 12) {
1.114     www       866: 	$r->print(&plink($$typeoutpar[$which],
                    867: 			 $$display{$value},$$outpar[$which],
                    868: 			 $mprefix."$which",'parmform.pres','psub'));
                    869:     } else {
                    870: 	$r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
                    871:     }
                    872:     $r->print('</td>'."\n");
1.57      albertel  873: }
                    874: 
1.275     raeburn   875: sub print_usergroups {
                    876:     my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
                    877:     my $courseid = $env{'request.course.id'};
                    878:     my $output;
                    879:     my $symb = &symbcache($rid);
                    880:     my $symbparm=$symb.'.'.$what;
                    881:     my $map=(&Apache::lonnet::decode_symb($symb))[0];
                    882:     my $mapparm=$map.'___(all).'.$what;
                    883:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =
                    884:           &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what,
                    885:                                                                    $courseopt);
                    886:     my $bgcolor = $defbg;
                    887:     my $grp_parm;
                    888:     if (($coursereply) && ($cgroup ne $resultgroup)) { 
                    889:         if ($result > 3) {
                    890:             $bgcolor = '"#AAFFAA"';
                    891:             $grp_parm = &valout($coursereply,$resulttype);
                    892:         }
                    893:         $grp_parm = &valout($coursereply,$resulttype);
                    894:         $output = '<td bgcolor='.$bgcolor.' align="center">';
                    895:         if ($resultgroup && $resultlevel) {
                    896:             $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;
                    897:         } else {
                    898:             $output .= '&nbsp;';
                    899:         }
                    900:         $output .= '</td>';
                    901:     } else {
                    902:         $output .= '<td bgcolor='.$bgcolor.'>&nbsp;</td>';
                    903:     }
                    904:     return ($coursereply,$output,$grp_parm,$resultgroup);
                    905: }
                    906: 
                    907: sub parm_control_group {
                    908:     my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_;
                    909:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    910:     my $grpfound = 0;
                    911:     my @levels = ($symbparm,$mapparm,$what);
                    912:     my @levelnames = ('resource','map/folder','general');
                    913:     foreach my $group (@{$usersgroups}) {
                    914:         if ($grpfound) { last; }
                    915:         for (my $i=0; $i<@levels; $i++) {
                    916:             my $item = $courseid.'.['.$group.'].'.$levels[$i];
                    917:             if (defined($$courseopt{$item})) {
                    918:                 $coursereply = $$courseopt{$item};
                    919:                 $resultitem = $item;
                    920:                 $resultgroup = $group;
                    921:                 $resultlevel = $levelnames[$i];
                    922:                 $resulttype = $$courseopt{$item.'.type'};
                    923:                 $grpfound = 1;
                    924:                 last;
                    925:             }
                    926:         }
                    927:     }
                    928:     return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    929: }
1.201     www       930: 
1.63      bowersj2  931: =pod
                    932: 
                    933: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
                    934: 
                    935: Input: See list below:
                    936: 
                    937: =over 4
                    938: 
                    939: =item B<ids>: An array that will contain all of the ids in the course.
                    940: 
                    941: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
                    942: 
1.171     www       943: =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  944: 
                    945: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
                    946: 
                    947: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
                    948: 
                    949: =item B<allkeys>: hash, full key to part->display value (what's display value?)
                    950: 
                    951: =item B<allmaps>: hash, ???
                    952: 
                    953: =item B<fcat>: ???
                    954: 
                    955: =item B<defp>: hash, ???
                    956: 
                    957: =item B<mapp>: ??
                    958: 
                    959: =item B<symbp>: hash, id->full sym?
                    960: 
                    961: =back
                    962: 
                    963: =cut
                    964: 
                    965: sub extractResourceInformation {
                    966:     my $ids = shift;
                    967:     my $typep = shift;
                    968:     my $keyp = shift;
                    969:     my $allparms = shift;
                    970:     my $allparts = shift;
                    971:     my $allmaps = shift;
                    972:     my $mapp = shift;
                    973:     my $symbp = shift;
1.82      www       974:     my $maptitles=shift;
1.196     www       975:     my $uris=shift;
1.210     www       976:     my $keyorder=shift;
1.211     www       977:     my $defkeytype=shift;
1.196     www       978: 
1.210     www       979:     my $keyordercnt=100;
1.63      bowersj2  980: 
1.196     www       981:     my $navmap = Apache::lonnavmaps::navmap->new();
                    982:     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
                    983:     foreach my $resource (@allres) {
                    984: 	my $id=$resource->id();
                    985:         my ($mapid,$resid)=split(/\./,$id);
                    986: 	if ($mapid eq '0') { next; }
                    987: 	$$ids[$#$ids+1]=$id;
                    988: 	my $srcf=$resource->src();
                    989: 	$srcf=~/\.(\w+)$/;
                    990: 	$$typep{$id}=$1;
                    991: 	$$keyp{$id}='';
                    992:         $$uris{$id}=$srcf;
1.363     albertel  993: 	foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
                    994: 	    next if ($key!~/^parameter_/);
                    995: 
1.209     www       996: # Hidden parameters
1.363     albertel  997: 	    next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
1.209     www       998: #
                    999: # allparms is a hash of parameter names
                   1000: #
1.363     albertel 1001: 	    my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
1.375     albertel 1002: 	    if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {
1.413.6.1! raeburn  1003: 		my ($display,$parmdis);
        !          1004: 		$display = &standard_parameter_names($name);
        !          1005: 		if ($display eq '') {
        !          1006: 		    $display= &Apache::lonnet::metadata($srcf,$key.'.display');
        !          1007: 		    $parmdis = $display;
        !          1008: 		    $parmdis =~ s/\s*\[Part.*$//g;
        !          1009: 		} else {
        !          1010: 		    $parmdis = &mt($display);
        !          1011: 		}
1.363     albertel 1012: 		$$allparms{$name}=$parmdis;
                   1013: 		if (ref($defkeytype)) {
                   1014: 		    $$defkeytype{$name}=
                   1015: 			&Apache::lonnet::metadata($srcf,$key.'.type');
                   1016: 		}
                   1017: 	    }
                   1018: 
1.209     www      1019: #
                   1020: # allparts is a hash of all parts
                   1021: #
1.363     albertel 1022: 	    my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
1.410     bisitz   1023: 	    $$allparts{$part} = &mt('Part: [_1]',$part);
1.209     www      1024: #
                   1025: # Remember all keys going with this resource
                   1026: #
1.363     albertel 1027: 	    if ($$keyp{$id}) {
                   1028: 		$$keyp{$id}.=','.$key;
                   1029: 	    } else {
                   1030: 		$$keyp{$id}=$key;
                   1031: 	    }
1.210     www      1032: #
                   1033: # Put in order
                   1034: # 
1.363     albertel 1035: 	    unless ($$keyorder{$key}) {
                   1036: 		$$keyorder{$key}=$keyordercnt;
                   1037: 		$keyordercnt++;
                   1038: 	    }
                   1039: 	}
1.210     www      1040: 
1.363     albertel 1041: 	
                   1042: 	if (!exists($$mapp{$mapid})) {
                   1043: 	    $$mapp{$id}=
                   1044: 		&Apache::lonnet::declutter($resource->enclosing_map_src());
                   1045: 	    $$mapp{$mapid}=$$mapp{$id};
                   1046: 	    $$allmaps{$mapid}=$$mapp{$id};
                   1047: 	    if ($mapid eq '1') {
1.401     bisitz   1048: 		$$maptitles{$mapid}=&mt('Main Course Documents');
1.363     albertel 1049: 	    } else {
                   1050: 		$$maptitles{$mapid}=
                   1051: 		    &Apache::lonnet::gettitle($$mapp{$id});    
1.63      bowersj2 1052: 	    }
1.363     albertel 1053: 	    $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
                   1054: 	    $$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.196     www      1055: 	} else {
1.363     albertel 1056: 	    $$mapp{$id} = $$mapp{$mapid};
1.196     www      1057: 	}
                   1058: 	$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
1.63      bowersj2 1059:     }
                   1060: }
                   1061: 
1.208     www      1062: 
                   1063: ##################################################
                   1064: ##################################################
                   1065: 
1.213     www      1066: sub isdateparm {
                   1067:     my $type=shift;
                   1068:     return (($type=~/^date/) && (!($type eq 'date_interval')));
                   1069: }
                   1070: 
1.208     www      1071: sub parmmenu {
1.211     www      1072:     my ($r,$allparms,$pscat,$keyorder)=@_;
1.208     www      1073:     my $tempkey;
                   1074:     $r->print(<<ENDSCRIPT);
                   1075: <script type="text/javascript">
                   1076:     function checkall(value, checkName) {
                   1077: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1078:             ele = document.forms.parmform.elements[i];
                   1079:             if (ele.name == checkName) {
                   1080:                 document.forms.parmform.elements[i].checked=value;
                   1081:             }
                   1082:         }
                   1083:     }
1.210     www      1084: 
                   1085:     function checkthis(thisvalue, checkName) {
                   1086: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1087:             ele = document.forms.parmform.elements[i];
                   1088:             if (ele.name == checkName) {
                   1089: 		if (ele.value == thisvalue) {
                   1090: 		    document.forms.parmform.elements[i].checked=true;
                   1091: 		}
                   1092:             }
                   1093:         }
                   1094:     }
                   1095: 
                   1096:     function checkdates() {
                   1097: 	checkthis('duedate','pscat');
                   1098:  	checkthis('opendate','pscat');
                   1099: 	checkthis('answerdate','pscat');
1.218     www      1100:     }
                   1101: 
                   1102:     function checkdisset() {
                   1103: 	checkthis('discussend','pscat');
                   1104:  	checkthis('discusshide','pscat');
                   1105:     }
                   1106: 
                   1107:     function checkcontdates() {
                   1108: 	checkthis('contentopen','pscat');
                   1109:  	checkthis('contentclose','pscat');
                   1110:     }
                   1111:  
1.210     www      1112: 
                   1113:     function checkvisi() {
                   1114: 	checkthis('hiddenresource','pscat');
                   1115:  	checkthis('encrypturl','pscat');
                   1116: 	checkthis('problemstatus','pscat');
                   1117: 	checkthis('contentopen','pscat');
                   1118: 	checkthis('opendate','pscat');
                   1119:     }
                   1120: 
                   1121:     function checkparts() {
                   1122: 	checkthis('hiddenparts','pscat');
                   1123: 	checkthis('display','pscat');
                   1124: 	checkthis('ordered','pscat');
                   1125:     }
                   1126: 
                   1127:     function checkstandard() {
                   1128:         checkall(false,'pscat');
                   1129: 	checkdates();
                   1130: 	checkthis('weight','pscat');
                   1131: 	checkthis('maxtries','pscat');
                   1132:     }
                   1133: 
1.208     www      1134: </script>
                   1135: ENDSCRIPT
1.209     www      1136:     $r->print();
1.413.6.1! raeburn  1137:     $r->print("\n".'<table id="LC_parm_overview_parm_menu"><tr>');
1.208     www      1138:     my $cnt=0;
1.211     www      1139:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.317     albertel 1140: 	$r->print("\n<td><label><input type='checkbox' name='pscat' ");
1.208     www      1141: 	$r->print('value="'.$tempkey.'"');
                   1142: 	if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
1.413.6.1! raeburn  1143: 	    $r->print(' checked="checked"');
1.208     www      1144: 	}
1.413.6.1! raeburn  1145: 	$r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
        !          1146: 		                                  : $tempkey)
1.375     albertel 1147: 		  .'</label></td>');
1.209     www      1148:  	$cnt++;
                   1149:         if ($cnt==3) {
                   1150: 	    $r->print("</tr>\n<tr>");
                   1151: 	    $cnt=0;
                   1152: 	}
1.208     www      1153:     }
1.410     bisitz   1154:     $r->print('</tr>'
1.413.6.1! raeburn  1155:              .'<tr id="LC_parm_overview_parm_menu_selectors">'
1.410     bisitz   1156:              .'<td valign="top">'
                   1157:              .'<fieldset><legend><b>'.&mt('Parameter Selection').'</b></legend>'
                   1158:              .'<span class="LC_nobreak">'
                   1159:              .'&bull; <a href="javascript:checkall(true, \'pscat\')">'.&mt('Select All').'</a>'
                   1160:              .'</span>'
                   1161:              .'<br />'
                   1162:              .'<span class="LC_nobreak">'
                   1163:              .'&bull; <a href="javascript:checkstandard()">'.&mt('Select Common Only').'</a>'
                   1164:              .'</span>'
                   1165:              .'<br />'
                   1166:              .'<span class="LC_nobreak">'
                   1167:              .'&bull; <a href="javascript:checkall(false, \'pscat\')">'.&mt('Unselect All').'</a>'
                   1168:              .'</span>'
                   1169:              .'</fieldset>'
                   1170:              .'</td>'
                   1171:              .'<td colspan="2" valign="top">'
                   1172:              .'<fieldset><legend><b>'.&mt('Add Selection for...').'</b></legend>'
                   1173:              .'<span class="LC_nobreak">'
                   1174:              .'&bull; <a href="javascript:checkdates()">'.&mt('Problem Dates').'</a>'
                   1175:              .'</span>'
                   1176:              .'<span class="LC_nobreak">'
                   1177:              .' &bull; <a href="javascript:checkcontdates()">'.&mt('Content Dates').'</a>'
                   1178:              .'</span>'
                   1179: #            .'<br />'
                   1180:              .'<span class="LC_nobreak">'
                   1181:              .' &bull; <a href="javascript:checkdisset()">'.&mt('Discussion Settings').'</a>'
                   1182:              .'</span>'
                   1183:              .'<span class="LC_nobreak">'
                   1184:              .' &bull; <a href="javascript:checkvisi()">'.&mt('Visibilities').'</a>'
                   1185:              .'</span>'
                   1186: #            .'<br />'
                   1187:              .'<span class="LC_nobreak">'
                   1188:              .' &bull; <a href="javascript:checkparts()">'.&mt('Part Parameters').'</a>'
                   1189:              .'</span>'
                   1190:              .'</fieldset>'
                   1191:              .'</td>'
                   1192:              .'</tr></table>'
                   1193:     );
1.208     www      1194: }
                   1195: 
1.209     www      1196: sub partmenu {
                   1197:     my ($r,$allparts,$psprt)=@_;
1.413.6.1! raeburn  1198:     $r->print('<select multiple="multiple" name="psprt" size="8">');
1.208     www      1199:     $r->print('<option value="all"');
1.401     bisitz   1200:     $r->print(' selected="selected"') unless (@{$psprt});
1.208     www      1201:     $r->print('>'.&mt('All Parts').'</option>');
                   1202:     my %temphash=();
                   1203:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.234     albertel 1204:     foreach my $tempkey (sort {
                   1205: 	if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
                   1206:     } keys(%{$allparts})) {
1.208     www      1207: 	unless ($tempkey =~ /\./) {
                   1208: 	    $r->print('<option value="'.$tempkey.'"');
                   1209: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
1.401     bisitz   1210: 		$r->print(' selected="selected"');
1.208     www      1211: 	    }
                   1212: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                   1213: 	}
                   1214:     }
1.209     www      1215:     $r->print('</select>');
                   1216: }
                   1217: 
                   1218: sub usermenu {
1.275     raeburn  1219:     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
1.209     www      1220:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                   1221:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                   1222:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.412     bisitz   1223: 
1.209     www      1224:     my $sections='';
1.300     albertel 1225:     my %sectionhash = &Apache::loncommon::get_sections();
                   1226: 
1.269     raeburn  1227:     my $groups;
1.307     raeburn  1228:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1229: 
1.412     bisitz   1230:     my $g_s_header='';
                   1231:     my $g_s_footer='';
                   1232: 
1.300     albertel 1233:     if (%sectionhash) {
1.412     bisitz   1234:         $sections=&mt('Section:').' <select name="csec"';
1.299     albertel 1235:         if (%grouphash && $parmlev ne 'full') {
1.269     raeburn  1236:             $sections .= qq| onchange="group_or_section('csec')" |;
                   1237:         }
                   1238:         $sections .= '>';
1.275     raeburn  1239: 	foreach my $section ('',sort keys %sectionhash) {
                   1240: 	    $sections.='<option value="'.$section.'" '.
                   1241: 		($section eq $csec?'selected="selected"':'').'>'.$section.
                   1242:                                                               '</option>';
1.209     www      1243:         }
                   1244:         $sections.='</select>';
1.269     raeburn  1245:     }
1.412     bisitz   1246: 
1.300     albertel 1247:     if (%sectionhash && %grouphash && $parmlev ne 'full') {
1.412     bisitz   1248:         $sections .= '&nbsp;'.&mt('or').'&nbsp;';
1.269     raeburn  1249:         $sections .= qq|
                   1250: <script type="text/javascript">
                   1251: function group_or_section(caller) {
                   1252:    if (caller == "cgroup") {
                   1253:        if (document.parmform.cgroup.selectedIndex != 0) {
                   1254:            document.parmform.csec.selectedIndex = 0;
                   1255:        }
                   1256:    } else {
                   1257:        if (document.parmform.csec.selectedIndex != 0) {
                   1258:            document.parmform.cgroup.selectedIndex = 0;
                   1259:        }
                   1260:    }
                   1261: }
                   1262: </script>
                   1263: |;
                   1264:     } else {
                   1265:         $sections .= qq|
                   1266: <script type="text/javascript">
                   1267: function group_or_section(caller) {
                   1268:     return;
                   1269: }
                   1270: </script>
                   1271: |;
                   1272:     } 
1.299     albertel 1273: 
                   1274:     if (%grouphash) {
1.412     bisitz   1275:         $groups=&mt('Group:').' <select name="cgroup"';
1.300     albertel 1276:         if (%sectionhash && $env{'form.action'} eq 'settable') {
1.269     raeburn  1277:             $groups .= qq| onchange="group_or_section('cgroup')" |;
                   1278:         }
                   1279:         $groups .= '>';
1.275     raeburn  1280:         foreach my $grp ('',sort keys %grouphash) {
                   1281:             $groups.='<option value="'.$grp.'" ';
                   1282:             if ($grp eq $cgroup) {
                   1283:                 unless ((defined($uname)) && ($grp eq '')) {
                   1284:                     $groups .=  'selected="selected" ';
                   1285:                 }
                   1286:             } elsif (!defined($cgroup)) {
                   1287:                 if (@{$usersgroups} == 1) {
                   1288:                     if ($grp eq $$usersgroups[0]) {
                   1289:                         $groups .=  'selected="selected" ';
                   1290:                     }
                   1291:                 }
                   1292:             }
                   1293:             $groups .= '>'.$grp.'</option>';
1.269     raeburn  1294:         }
                   1295:         $groups.='</select>';
                   1296:     }
1.412     bisitz   1297: 
                   1298:     if (%sectionhash || %grouphash) {
                   1299:         $g_s_header='<fieldset><legend>'.&mt('Group/Section').'</legend><div>';
                   1300:         $g_s_footer='</div></fieldset>';
                   1301:     }
                   1302: 
                   1303:     $r->print('<b>'
                   1304:              .$g_s_header
                   1305:              .$sections
                   1306:              .$groups
                   1307:              .$g_s_footer
                   1308:              .'<fieldset><legend>'.&mt('User').'</legend><div>'
                   1309:              .&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
                   1310:                  ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'
                   1311:                  ,'<input type="text" value="'.$id.'" size="12" name="id" /> '
                   1312:                  ,$chooseopt)
                   1313:              .'</div></fieldset>'
                   1314:              .'</b>'
                   1315:     );
1.209     www      1316: }
                   1317: 
                   1318: sub displaymenu {
1.211     www      1319:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www      1320:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                   1321: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www      1322:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.412     bisitz   1323:     $r->print('</td><td valign="top" align="center">');
1.209     www      1324:     &partmenu($r,$allparts,$psprt);
                   1325:     $r->print('</td></tr></table>');
                   1326: }
                   1327: 
                   1328: sub mapmenu {
                   1329:     my ($r,$allmaps,$pschp,$maptitles)=@_;
1.231     www      1330:     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');
1.209     www      1331:     $r->print('<select name="pschp">');
                   1332:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                   1333:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www      1334: 	$r->print('<option value="'.$_.'"');
1.401     bisitz   1335: 	if (($pschp eq $_)) { $r->print(' selected="selected"'); }
1.209     www      1336: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                   1337:     }
                   1338:     $r->print("</select>");
                   1339: }
                   1340: 
                   1341: sub levelmenu {
                   1342:     my ($r,$alllevs,$parmlev)=@_;
1.231     www      1343:     $r->print('<b>'.&mt('Select Parameter Level').
                   1344: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');
1.209     www      1345:     $r->print('<select name="parmlev">');
                   1346:     foreach (reverse sort keys %{$alllevs}) {
                   1347: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                   1348: 	if ($parmlev eq $$alllevs{$_}) {
1.401     bisitz   1349: 	    $r->print(' selected="selected"'); 
1.209     www      1350: 	}
1.401     bisitz   1351: 	$r->print('>'.&mt($_).'</option>');
1.208     www      1352:     }
1.209     www      1353:     $r->print("</select>");
1.208     www      1354: }
                   1355: 
1.211     www      1356: 
                   1357: sub sectionmenu {
                   1358:     my ($r,$selectedsections)=@_;
1.300     albertel 1359:     my %sectionhash = &Apache::loncommon::get_sections();
                   1360:     return if (!%sectionhash);
                   1361: 
1.413.6.1! raeburn  1362:     $r->print('<select name="Section" multiple="multiple" size="8">');
1.300     albertel 1363:     foreach my $s ('all',sort keys %sectionhash) {
                   1364: 	$r->print('    <option value="'.$s.'"');
                   1365: 	foreach (@{$selectedsections}) {
                   1366: 	    if ($s eq $_) {
1.401     bisitz   1367: 		$r->print(' selected="selected"');
1.300     albertel 1368: 		last;
1.212     www      1369: 	    }
                   1370: 	}
1.300     albertel 1371: 	$r->print('>'.$s."</option>\n");
                   1372:     }
                   1373:     $r->print("</select>\n");
1.269     raeburn  1374: }
                   1375: 
                   1376: sub groupmenu {
                   1377:     my ($r,$selectedgroups)=@_;
1.307     raeburn  1378:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1379:     return if (!%grouphash);
                   1380: 
1.413.6.1! raeburn  1381:     $r->print('<select name="Group" multiple="multiple" size="8">');
1.299     albertel 1382:     foreach my $group (sort(keys(%grouphash))) {
                   1383: 	$r->print('    <option value="'.$group.'"');
                   1384: 	foreach (@{$selectedgroups}) {
                   1385: 	    if ($group eq $_) {
1.401     bisitz   1386: 		$r->print(' selected="selected"');
1.299     albertel 1387: 		last;
                   1388: 	    }
                   1389: 	}
                   1390: 	$r->print('>'.$group."</option>\n");
1.211     www      1391:     }
1.299     albertel 1392:     $r->print("</select>\n");
1.211     www      1393: }
                   1394: 
1.269     raeburn  1395: 
1.210     www      1396: sub keysplit {
                   1397:     my $keyp=shift;
                   1398:     return (split(/\,/,$keyp));
                   1399: }
                   1400: 
                   1401: sub keysinorder {
                   1402:     my ($name,$keyorder)=@_;
                   1403:     return sort {
                   1404: 	$$keyorder{$a} <=> $$keyorder{$b};
                   1405:     } (keys %{$name});
                   1406: }
                   1407: 
1.236     albertel 1408: sub keysinorder_bytype {
                   1409:     my ($name,$keyorder)=@_;
                   1410:     return sort {
                   1411: 	my $ta=(split('_',$a))[-1];
                   1412: 	my $tb=(split('_',$b))[-1];
                   1413: 	if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
                   1414: 	    return ($a cmp $b);
                   1415: 	}
                   1416: 	$$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
                   1417:     } (keys %{$name});
                   1418: }
                   1419: 
1.211     www      1420: sub keysindisplayorder {
                   1421:     my ($name,$keyorder)=@_;
                   1422:     return sort {
                   1423: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                   1424:     } (keys %{$name});
                   1425: }
                   1426: 
1.214     www      1427: sub sortmenu {
                   1428:     my ($r,$sortorder)=@_;
1.236     albertel 1429:     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214     www      1430:     if ($sortorder eq 'realmstudent') {
                   1431:        $r->print(' checked="on"');
                   1432:     }
                   1433:     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236     albertel 1434:     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214     www      1435:     if ($sortorder eq 'studentrealm') {
1.413.6.1! raeburn  1436:        $r->print(' checked="checked"');
1.214     www      1437:     }
1.236     albertel 1438:     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
                   1439: 	      '</label>');
1.214     www      1440: }
                   1441: 
1.211     www      1442: sub standardkeyorder {
                   1443:     return ('parameter_0_opendate' => 1,
                   1444: 	    'parameter_0_duedate' => 2,
                   1445: 	    'parameter_0_answerdate' => 3,
                   1446: 	    'parameter_0_interval' => 4,
                   1447: 	    'parameter_0_weight' => 5,
                   1448: 	    'parameter_0_maxtries' => 6,
                   1449: 	    'parameter_0_hinttries' => 7,
                   1450: 	    'parameter_0_contentopen' => 8,
                   1451: 	    'parameter_0_contentclose' => 9,
                   1452: 	    'parameter_0_type' => 10,
                   1453: 	    'parameter_0_problemstatus' => 11,
                   1454: 	    'parameter_0_hiddenresource' => 12,
                   1455: 	    'parameter_0_hiddenparts' => 13,
                   1456: 	    'parameter_0_display' => 14,
                   1457: 	    'parameter_0_ordered' => 15,
                   1458: 	    'parameter_0_tol' => 16,
                   1459: 	    'parameter_0_sig' => 17,
1.218     www      1460: 	    'parameter_0_turnoffunit' => 18,
                   1461:             'parameter_0_discussend' => 19,
                   1462:             'parameter_0_discusshide' => 20);
1.211     www      1463: }
                   1464: 
1.59      matthew  1465: ##################################################
                   1466: ##################################################
                   1467: 
                   1468: =pod
                   1469: 
                   1470: =item assessparms
                   1471: 
                   1472: Show assessment data and parameters.  This is a large routine that should
                   1473: be simplified and shortened... someday.
                   1474: 
                   1475: Inputs: $r
                   1476: 
                   1477: Returns: nothing
                   1478: 
1.63      bowersj2 1479: Variables used (guessed by Jeremy):
                   1480: 
                   1481: =over 4
                   1482: 
                   1483: =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.
                   1484: 
                   1485: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1486: 
                   1487: =item B<allmaps>:
                   1488: 
                   1489: =back
                   1490: 
1.59      matthew  1491: =cut
                   1492: 
                   1493: ##################################################
                   1494: ##################################################
1.30      www      1495: sub assessparms {
1.1       www      1496: 
1.43      albertel 1497:     my $r=shift;
1.201     www      1498: 
                   1499:     my @ids=();
                   1500:     my %symbp=();
                   1501:     my %mapp=();
                   1502:     my %typep=();
                   1503:     my %keyp=();
                   1504:     my %uris=();
                   1505:     my %maptitles=();
                   1506: 
1.2       www      1507: # -------------------------------------------------------- Variable declaration
1.209     www      1508: 
1.129     www      1509:     my %allmaps=();
                   1510:     my %alllevs=();
1.57      albertel 1511: 
1.187     www      1512:     my $uname;
                   1513:     my $udom;
                   1514:     my $uhome;
                   1515:     my $csec;
1.269     raeburn  1516:     my $cgroup;
1.275     raeburn  1517:     my @usersgroups = ();
1.187     www      1518:  
1.190     albertel 1519:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1520: 
1.57      albertel 1521:     $alllevs{'Resource Level'}='full';
1.215     www      1522:     $alllevs{'Map/Folder Level'}='map';
1.57      albertel 1523:     $alllevs{'Course Level'}='general';
                   1524: 
                   1525:     my %allparms;
                   1526:     my %allparts;
1.210     www      1527: #
                   1528: # Order in which these parameters will be displayed
                   1529: #
1.211     www      1530:     my %keyorder=&standardkeyorder();
                   1531: 
1.43      albertel 1532:     @ids=();
                   1533:     %symbp=();
                   1534:     %typep=();
                   1535: 
                   1536:     my $message='';
                   1537: 
1.190     albertel 1538:     $csec=$env{'form.csec'};
1.269     raeburn  1539:     $cgroup=$env{'form.cgroup'};
1.188     www      1540: 
1.190     albertel 1541:     if      ($udom=$env{'form.udom'}) {
                   1542:     } elsif ($udom=$env{'request.role.domain'}) {
                   1543:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1544:     } else {
                   1545: 	$udom=$r->dir_config('lonDefDomain');
                   1546:     }
1.43      albertel 1547: 
1.134     albertel 1548:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1549:     my $pschp=$env{'form.pschp'};
1.134     albertel 1550:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1551:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1552: 
1.43      albertel 1553:     my $pssymb='';
1.57      albertel 1554:     my $parmlev='';
                   1555:  
1.190     albertel 1556:     unless ($env{'form.parmlev'}) {
1.57      albertel 1557:         $parmlev = 'map';
                   1558:     } else {
1.190     albertel 1559:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1560:     }
1.26      www      1561: 
1.29      www      1562: # ----------------------------------------------- Was this started from grades?
                   1563: 
1.190     albertel 1564:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1565: 	&& (!$env{'form.dis'})) {
                   1566: 	my $url=$env{'form.url'};
1.194     albertel 1567: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1568: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1569: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1570: 	$pschp='';
1.57      albertel 1571:         $parmlev = 'full';
1.190     albertel 1572:     } elsif ($env{'form.symb'}) {
                   1573: 	$pssymb=$env{'form.symb'};
1.92      albertel 1574: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1575: 	$pschp='';
1.57      albertel 1576:         $parmlev = 'full';
1.43      albertel 1577:     } else {
1.190     albertel 1578: 	$env{'form.url'}='';
1.43      albertel 1579:     }
                   1580: 
1.190     albertel 1581:     my $id=$env{'form.id'};
1.43      albertel 1582:     if (($id) && ($udom)) {
                   1583: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1584: 	if ($uname) {
                   1585: 	    $id='';
                   1586: 	} else {
                   1587: 	    $message=
1.314     albertel 1588: 		'<span class="LC_error">'.&mt("Unknown ID")." '$id' ".
                   1589: 		&mt('at domain')." '$udom'</span>";
1.43      albertel 1590: 	}
                   1591:     } else {
1.190     albertel 1592: 	$uname=$env{'form.uname'};
1.43      albertel 1593:     }
                   1594:     unless ($udom) { $uname=''; }
                   1595:     $uhome='';
                   1596:     if ($uname) {
                   1597: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1598:         if ($uhome eq 'no_host') {
                   1599: 	    $message=
1.314     albertel 1600: 		'<span class="LC_error">'.&mt("Unknown user")." '$uname' ".
                   1601: 		&mt("at domain")." '$udom'</span>";
1.43      albertel 1602: 	    $uname='';
1.12      www      1603:         } else {
1.103     albertel 1604: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1605: 					      $env{'request.course.id'});
1.269     raeburn  1606:             
1.43      albertel 1607: 	    if ($csec eq '-1') {
1.314     albertel 1608: 		$message='<span class="LC_error">'.
1.133     www      1609: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
1.314     albertel 1610: 		    &mt("not in this course")."</span>";
1.43      albertel 1611: 		$uname='';
1.190     albertel 1612: 		$csec=$env{'form.csec'};
1.269     raeburn  1613:                 $cgroup=$env{'form.cgroup'};
1.43      albertel 1614: 	    } else {
                   1615: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1616: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1617: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1618: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1619: 			.$name{'lastname'}.' '.$name{'generation'}.
1.336     albertel 1620: 			    "<br />\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1621: 	    }
1.297     raeburn  1622:             @usersgroups = &Apache::lonnet::get_users_groups(
1.275     raeburn  1623:                                        $udom,$uname,$env{'request.course.id'});
1.297     raeburn  1624:             if (@usersgroups > 0) {
1.306     albertel 1625:                 unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275     raeburn  1626:                     $cgroup = $usersgroups[0];
1.297     raeburn  1627:                 }
1.269     raeburn  1628:             }
1.12      www      1629:         }
1.43      albertel 1630:     }
1.2       www      1631: 
1.43      albertel 1632:     unless ($csec) { $csec=''; }
1.269     raeburn  1633:     unless ($cgroup) { $cgroup=''; }
1.12      www      1634: 
1.14      www      1635: # --------------------------------------------------------- Get all assessments
1.210     www      1636:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1637: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1638: 				\%keyorder);
1.63      bowersj2 1639: 
1.57      albertel 1640:     $mapp{'0.0'} = '';
                   1641:     $symbp{'0.0'} = '';
1.99      albertel 1642: 
1.14      www      1643: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1644:     if ($env{'form.pres_marker'}) {
1.205     www      1645:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1646:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1647:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1648: 	for (my $i=0;$i<=$#markers;$i++) {
                   1649: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1650: 				 $values[$i],
                   1651: 				 $types[$i],
1.269     raeburn  1652: 				 $uname,$udom,$csec,$cgroup);
1.205     www      1653: 	}
1.68      www      1654: # ---------------------------------------------------------------- Done storing
1.130     www      1655: 	$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      1656:     }
1.57      albertel 1657: #----------------------------------------------- if all selected, fill in array
1.209     www      1658:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1659:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1660:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1661: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1662: 
1.209     www      1663:     &startpage($r);
1.57      albertel 1664: 
1.44      albertel 1665:     foreach ('tolerance','date_default','date_start','date_end',
                   1666: 	     'date_interval','int','float','string') {
                   1667: 	$r->print('<input type="hidden" value="'.
1.378     albertel 1668: 		  &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
                   1669: 		  '" name="recent_'.$_.'" />');
1.44      albertel 1670:     }
1.57      albertel 1671:                         
1.44      albertel 1672:     if (!$pssymb) {
1.209     www      1673:         $r->print('<table border="1"><tr><td>');
                   1674:         &levelmenu($r,\%alllevs,$parmlev);
1.413.6.1! raeburn  1675:         $r->print('</td>');
1.128     albertel 1676: 	if ($parmlev ne 'general') {
1.209     www      1677:             $r->print('<td>');
                   1678: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1679: 	    $r->print('</td>');
1.128     albertel 1680: 	}
1.413.6.1! raeburn  1681:         $r->print('</tr></table>');
1.211     www      1682: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1683:     } else {
1.125     www      1684:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.312     albertel 1685: 	my $title = &Apache::lonnet::gettitle($pssymb);
                   1686:         $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
                   1687:                   '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.238     www      1688: 		  '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
                   1689: 		  ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
1.57      albertel 1690:     }
1.275     raeburn  1691:     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);    
1.57      albertel 1692: 
1.210     www      1693:     $r->print('<p>'.$message.'</p>');
                   1694: 
1.209     www      1695:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1696: 
                   1697:     my @temp_pscat;
                   1698:     map {
                   1699:         my $cat = $_;
                   1700:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1701:     } @pscat;
                   1702: 
                   1703:     @pscat = @temp_pscat;
                   1704: 
1.209     www      1705:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1706: # ----------------------------------------------------------------- Start Table
1.57      albertel 1707:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1708:         my $csuname=$env{'user.name'};
                   1709:         my $csudom=$env{'user.domain'};
1.57      albertel 1710: 
1.203     www      1711:         if ($parmlev eq 'full') {
1.57      albertel 1712:            my $coursespan=$csec?8:5;
1.275     raeburn  1713:            my $userspan=3;
1.269     raeburn  1714:            if ($cgroup ne '') {
                   1715:               $coursespan += 3;
                   1716:            } 
                   1717:       
1.57      albertel 1718:            $r->print('<p><table border=2>');
                   1719:            $r->print('<tr><td colspan=5></td>');
1.130     www      1720:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1721:            if ($uname) {
1.275     raeburn  1722:                if (@usersgroups > 1) {
                   1723:                    $userspan ++;
                   1724:                }
                   1725:                $r->print('<th colspan="'.$userspan.'" rowspan="2">');
1.130     www      1726:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1727:            }
1.133     www      1728: 	   my %lt=&Apache::lonlocal::texthash(
                   1729: 				  'pie'    => "Parameter in Effect",
                   1730: 				  'csv'    => "Current Session Value",
                   1731:                                   'at'     => 'at',
                   1732:                                   'rl'     => "Resource Level",
                   1733: 				  'ic'     => 'in Course',
                   1734: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1735: 				  'type'   => 'Type',
1.133     www      1736: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1737: 				  'part'   => 'Part',
1.133     www      1738:                                   'pn'     => 'Parameter Name',
                   1739: 				  'def'    => 'default',
                   1740: 				  'femof'  => 'from Enclosing Map or Folder',
                   1741: 				  'gen'    => 'general',
                   1742: 				  'foremf' => 'for Enclosing Map or Folder',
                   1743: 				  'fr'     => 'for Resource'
                   1744: 					      );
1.57      albertel 1745:            $r->print(<<ENDTABLETWO);
1.133     www      1746: <th rowspan=3>$lt{'pie'}</th>
1.336     albertel 1747: <th rowspan=3>$lt{'csv'}<br />($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1748: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1749: <th colspan=1>$lt{'ic'}</th>
                   1750: 
1.10      www      1751: ENDTABLETWO
1.57      albertel 1752:            if ($csec) {
1.133     www      1753:                 $r->print("<th colspan=3>".
1.269     raeburn  1754: 			  &mt("in Section")." $csec</th>");
                   1755:            }
                   1756:            if ($cgroup) {
                   1757:                 $r->print("<th colspan=3>".
                   1758:                           &mt("in Group")." $cgroup</th>");
1.57      albertel 1759:            }
                   1760:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1761: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1762: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1763: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1764: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1765: ENDTABLEHEADFOUR
1.57      albertel 1766: 
                   1767:            if ($csec) {
1.130     www      1768:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1769:            }
                   1770: 
1.269     raeburn  1771:            if ($cgroup) {
                   1772:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
                   1773:            }
                   1774: 
1.57      albertel 1775:            if ($uname) {
1.275     raeburn  1776:                if (@usersgroups > 1) {
                   1777:                    $r->print('<th>'.&mt('Control by other group?').'</th>');
                   1778:                }
1.130     www      1779:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1780:            }
                   1781: 
                   1782:            $r->print('</tr>');
                   1783: 
                   1784:            my $defbgone='';
                   1785:            my $defbgtwo='';
1.269     raeburn  1786:            my $defbgthree = '';
1.57      albertel 1787: 
                   1788:            foreach (@ids) {
                   1789: 
                   1790:                 my $rid=$_;
                   1791:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1792: 
1.152     albertel 1793:                 if ((!$pssymb && 
                   1794: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1795: 		    ||
                   1796: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1797: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1798:                     if ($defbgone eq '"#E0E099"') {
                   1799:                         $defbgone='"#E0E0DD"';
1.57      albertel 1800:                     } else {
1.184     albertel 1801:                         $defbgone='"#E0E099"';
1.57      albertel 1802:                     }
1.184     albertel 1803:                     if ($defbgtwo eq '"#FFFF99"') {
                   1804:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1805:                     } else {
1.184     albertel 1806:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1807:                     }
1.269     raeburn  1808:                     if ($defbgthree eq '"#FFBB99"') {
                   1809:                         $defbgthree='"#FFBBDD"';
                   1810:                     } else {
                   1811:                         $defbgthree='"#FFBB99"';
                   1812:                     }
                   1813: 
1.57      albertel 1814:                     my $thistitle='';
                   1815:                     my %name=   ();
                   1816:                     undef %name;
                   1817:                     my %part=   ();
                   1818:                     my %display=();
                   1819:                     my %type=   ();
                   1820:                     my %default=();
1.196     www      1821:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1822: 
1.210     www      1823:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1824:                         my $tempkeyp = $_;
                   1825:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1826:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1827:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
1.413.6.1! raeburn  1828:                           my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
        !          1829:                           if ($allparms{$name{$_}} ne '') {
        !          1830:                               my $identifier;
        !          1831:                               if ($parmdis =~ /(\s*\[Part.*)$/) {
        !          1832:                                   $identifier = $1;
        !          1833:                               }
        !          1834:                               $display{$_} = $allparms{$name{$_}}.$identifier;
        !          1835:                           } else {
        !          1836:                               $display{$_} = $parmdis;
        !          1837:                           }
1.57      albertel 1838:                           unless ($display{$_}) { $display{$_}=''; }
                   1839:                           $display{$_}.=' ('.$name{$_}.')';
                   1840:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1841:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1842:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1843:                         }
                   1844:                     }
                   1845:                     my $totalparms=scalar keys %name;
                   1846:                     if ($totalparms>0) {
                   1847:                         my $firstrow=1;
1.274     albertel 1848: 			my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.57      albertel 1849:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1850:                              ' rowspan='.$totalparms.
                   1851:                              '><tt><font size=-1>'.
                   1852:                              join(' / ',split(/\//,$uri)).
                   1853:                              '</font></tt><p><b>'.
1.154     albertel 1854:                              "<a href=\"javascript:openWindow('".
1.274     albertel 1855: 				  &Apache::lonnet::clutter($uri).'?symb='.
1.308     www      1856: 				  &escape($symbp{$rid}).
1.336     albertel 1857:                              "', 'metadatafile', '450', '500', 'no', 'yes');\"".
                   1858:                              " target=\"_self\">$title");
1.57      albertel 1859: 
                   1860:                         if ($thistitle) {
                   1861:                             $r->print(' ('.$thistitle.')');
                   1862:                         }
                   1863:                         $r->print('</a></b></td>');
                   1864:                         $r->print('<td bgcolor='.$defbgtwo.
                   1865:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1866:                                       '</td>');
                   1867: 
                   1868:                         $r->print('<td bgcolor='.$defbgone.
                   1869:                                       ' rowspan='.$totalparms.
1.238     www      1870:                                       '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57      albertel 1871: 
1.236     albertel 1872:                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57      albertel 1873:                             unless ($firstrow) {
                   1874:                                 $r->print('<tr>');
                   1875:                             } else {
                   1876:                                 undef $firstrow;
                   1877:                             }
1.201     www      1878:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1879:                                        \%type,\%display,$defbgone,$defbgtwo,
1.269     raeburn  1880:                                        $defbgthree,$parmlev,$uname,$udom,$csec,
1.275     raeburn  1881:                                                             $cgroup,\@usersgroups);
1.57      albertel 1882:                         }
                   1883:                     }
                   1884:                 }
                   1885:             } # end foreach ids
1.43      albertel 1886: # -------------------------------------------------- End entry for one resource
1.57      albertel 1887:             $r->print('</table>');
1.203     www      1888:         } # end of  full
1.57      albertel 1889: #--------------------------------------------------- Entry for parm level map
                   1890:         if ($parmlev eq 'map') {
                   1891:             my $defbgone = '"E0E099"';
                   1892:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1893:             my $defbgthree = '"FFBB99"';
1.57      albertel 1894: 
                   1895:             my %maplist;
                   1896: 
                   1897:             if ($pschp eq 'all') {
                   1898:                 %maplist = %allmaps; 
                   1899:             } else {
                   1900:                 %maplist = ($pschp => $mapp{$pschp});
                   1901:             }
                   1902: 
                   1903: #-------------------------------------------- for each map, gather information
                   1904:             my $mapid;
1.60      albertel 1905: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1906:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1907: 
                   1908: #-----------------------  loop through ids and get all parameter types for map
                   1909: #-----------------------------------------          and associated information
                   1910:                 my %name = ();
                   1911:                 my %part = ();
                   1912:                 my %display = ();
                   1913:                 my %type = ();
                   1914:                 my %default = ();
                   1915:                 my $map = 0;
                   1916: 
                   1917: #		$r->print("Catmarker: @catmarker<br />\n");
                   1918:                
                   1919:                 foreach (@ids) {
                   1920:                   ($map)=(/([\d]*?)\./);
                   1921:                   my $rid = $_;
                   1922:         
                   1923: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1924: 
                   1925:                   if ($map eq $mapid) {
1.196     www      1926:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1927: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1928: 
                   1929: #--------------------------------------------------------------------
                   1930: # @catmarker contains list of all possible parameters including part #s
                   1931: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1932: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1933: # When storing information, store as part 0
                   1934: # When requesting information, request from full part
                   1935: #-------------------------------------------------------------------
1.210     www      1936:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1937:                       my $tempkeyp = $_;
                   1938:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1939:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1940:                       
                   1941:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1942:                         $part{$tempkeyp}="0";
                   1943:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1.413.6.1! raeburn  1944:                         my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
        !          1945:                         if ($allparms{$name{$tempkeyp}} ne '') {
        !          1946:                             my $identifier;
        !          1947:                             if ($parmdis =~ /(\s*\[Part.*)$/) {
        !          1948:                                 $identifier = $1;
        !          1949:                             }
        !          1950:                             $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
        !          1951:                         } else {
        !          1952:                             $display{$tempkeyp} = $parmdis;
        !          1953:                         }
1.57      albertel 1954:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1955:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1956:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1957:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1958:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1959:                       }
                   1960:                     } # end loop through keys
                   1961:                   }
                   1962:                 } # end loop through ids
                   1963:                                  
                   1964: #---------------------------------------------------- print header information
1.133     www      1965:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1966:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.401     bisitz   1967:                 my $tmp="";
1.57      albertel 1968:                 if ($uname) {
1.267     albertel 1969: 		    my $person=&Apache::loncommon::plainname($uname,$udom);
1.401     bisitz   1970:                     $tmp.=&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
                   1971:                         &mt('in')." \n";
1.57      albertel 1972:                 } else {
1.401     bisitz   1973:                     $tmp.="<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n";
1.57      albertel 1974:                 }
1.269     raeburn  1975:                 if ($cgroup) {
1.401     bisitz   1976:                     $tmp.=&mt("Group")." <font color=\"red\"><i>$cgroup".
                   1977:                               "</i></font> ".&mt('of')." \n";
1.269     raeburn  1978:                     $csec = '';
                   1979:                 } elsif ($csec) {
1.401     bisitz   1980:                     $tmp.=&mt("Section")." <font color=\"red\"><i>$csec".
                   1981:                               "</i></font> ".&mt('of')." \n";
1.269     raeburn  1982:                 }
1.401     bisitz   1983:                 $r->print('<div align="center"><h4>'
                   1984:                          .&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
1.404     bisitz   1985:                              ,$foldermap.'<br /><font color="red"><i>'.$showtitle.'</i></font><br />'
1.401     bisitz   1986:                              ,$tmp
                   1987:                              ,'<font color="red"><i>'.$coursename.'</i></font>'
                   1988:                              )
                   1989:                          ."<br /></h4>\n"
                   1990:                          );
1.57      albertel 1991: #---------------------------------------------------------------- print table
                   1992:                 $r->print('<p><table border="2">');
1.130     www      1993:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1994:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1995:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1996: 
1.210     www      1997: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1998:                     $r->print('<tr>');
1.201     www      1999:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  2000:                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   2001:                            $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 2002:                 }
1.401     bisitz   2003:                 $r->print("</table></div>");
1.57      albertel 2004:             } # end each map
                   2005:         } # end of $parmlev eq map
                   2006: #--------------------------------- Entry for parm level general (Course level)
                   2007:         if ($parmlev eq 'general') {
                   2008:             my $defbgone = '"E0E099"';
                   2009:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  2010:             my $defbgthree = '"FFBB99"';
1.57      albertel 2011: 
                   2012: #-------------------------------------------- for each map, gather information
                   2013:             my $mapid="0.0";
                   2014: #-----------------------  loop through ids and get all parameter types for map
                   2015: #-----------------------------------------          and associated information
                   2016:             my %name = ();
                   2017:             my %part = ();
                   2018:             my %display = ();
                   2019:             my %type = ();
                   2020:             my %default = ();
                   2021:                
                   2022:             foreach (@ids) {
                   2023:                 my $rid = $_;
                   2024:         
1.196     www      2025:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 2026: 
                   2027: #--------------------------------------------------------------------
                   2028: # @catmarker contains list of all possible parameters including part #s
                   2029: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   2030: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   2031: # When storing information, store as part 0
                   2032: # When requesting information, request from full part
                   2033: #-------------------------------------------------------------------
1.210     www      2034:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 2035:                   my $tempkeyp = $_;
                   2036:                   my $fullkeyp = $tempkeyp;
1.73      albertel 2037:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 2038:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   2039:                     $part{$tempkeyp}="0";
                   2040:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1.413.6.1! raeburn  2041:                     my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
        !          2042:                     if ($allparms{$name{$tempkeyp}} ne '') {
        !          2043:                         my $identifier;
        !          2044:                         if ($parmdis =~ /(\s*\[Part.*)$/) {
        !          2045:                             $identifier = $1;
        !          2046:                         }
        !          2047:                         $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
        !          2048:                     } else {
        !          2049:                         $display{$tempkeyp} = $parmdis;
        !          2050:                     }
1.57      albertel 2051:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   2052:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 2053:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 2054:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   2055:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   2056:                   }
                   2057:                 } # end loop through keys
                   2058:             } # end loop through ids
                   2059:                                  
                   2060: #---------------------------------------------------- print header information
1.133     www      2061: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 2062:             $r->print(<<ENDMAPONE);
1.133     www      2063: <center><h4>$setdef
1.135     albertel 2064: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 2065: ENDMAPONE
                   2066:             if ($uname) {
1.267     albertel 2067: 		my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 2068:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 2069:             } else {
1.135     albertel 2070:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 2071:             }
                   2072:             
1.135     albertel 2073:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306     albertel 2074:             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135     albertel 2075:             $r->print("</h4>\n");
1.57      albertel 2076: #---------------------------------------------------------------- print table
                   2077:             $r->print('<p><table border="2">');
1.130     www      2078:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   2079:             $r->print('<th>'.&mt('Default Value').'</th>');
                   2080:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 2081: 
1.210     www      2082: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  2083:                 $r->print('<tr>');
1.201     www      2084:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  2085:                        \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   2086:                                    $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 2087:             }
                   2088:             $r->print("</table></center>");
                   2089:         } # end of $parmlev eq general
1.43      albertel 2090:     }
1.280     albertel 2091:     $r->print('</form>'.&Apache::loncommon::end_page());
1.57      albertel 2092: } # end sub assessparms
1.30      www      2093: 
1.59      matthew  2094: 
                   2095: ##################################################
                   2096: ##################################################
                   2097: 
                   2098: =pod
                   2099: 
                   2100: =item crsenv
                   2101: 
1.105     matthew  2102: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  2103: be simplified and shortened... someday.
                   2104: 
                   2105: Inputs: $r
                   2106: 
                   2107: Returns: nothing
                   2108: 
                   2109: =cut
                   2110: 
                   2111: ##################################################
                   2112: ##################################################
1.30      www      2113: sub crsenv {
                   2114:     my $r=shift;
                   2115:     my $setoutput='';
1.280     albertel 2116: 
1.298     albertel 2117:     my $breadcrumbs = 
                   2118: 	&Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
1.190     albertel 2119:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2120:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  2121: 
1.392     raeburn  2122:     my (%crsinfo,$chome);
                   2123: 
1.105     matthew  2124:     #
                   2125:     # Go through list of changes
1.190     albertel 2126:     foreach (keys %env) {
1.105     matthew  2127:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   2128:         my $name  = $1;
1.190     albertel 2129:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  2130:         if ($name eq 'newp') {
1.190     albertel 2131:             $name = $env{'form.newp_name'};
1.105     matthew  2132:         }
                   2133:         if ($name eq 'url') {
                   2134:             $value=~s/^\/res\///;
                   2135:             my $bkuptime=time;
                   2136:             my @tmp = &Apache::lonnet::get
                   2137:                 ('environment',['url'],$dom,$crs);
1.130     www      2138:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  2139:                 &Apache::lonnet::put
                   2140:                 ('environment',
                   2141:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   2142:                  $dom,$crs).
1.336     albertel 2143:                      '<br />';
1.105     matthew  2144:         }
                   2145:         #
                   2146:         # Deal with modified default spreadsheets
                   2147:         if ($name =~ /^spreadsheet_default_(classcalc|
                   2148:                                             studentcalc|
                   2149:                                             assesscalc)$/x) {
                   2150:             my $sheettype = $1; 
                   2151:             if ($sheettype eq 'classcalc') {
                   2152:                 # no need to do anything since viewing the sheet will
                   2153:                 # cause it to be updated. 
                   2154:             } elsif ($sheettype eq 'studentcalc') {
                   2155:                 # expire all the student spreadsheets
                   2156:                 &Apache::lonnet::expirespread('','','studentcalc');
                   2157:             } else {
                   2158:                 # expire all the assessment spreadsheets 
                   2159:                 #    this includes non-default spreadsheets, but better to
                   2160:                 #    be safe than sorry.
                   2161:                 &Apache::lonnet::expirespread('','','assesscalc');
                   2162:                 # expire all the student spreadsheets
                   2163:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      2164:             }
1.105     matthew  2165:         }
                   2166:         #
1.107     matthew  2167:         # Deal with the enrollment dates
                   2168:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2169:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   2170:         }
1.364     albertel 2171: 	#
                   2172:         # Deal with the emails
                   2173:         if ($name =~ /\.email$/) {
1.371     albertel 2174: 	    foreach my $specifier (split(',',$value)) {
                   2175: 		my ($user,$sections_or_groups)=
                   2176: 		    ($specifier=~/^([^\(]+)\(([^\)]+)\)/);
                   2177: 		if (!$sections_or_groups) {
                   2178: 		    $user = $specifier;
                   2179: 		}
                   2180: 		my ($name,$domain) = split(':',$user);
                   2181: 		if (!defined($user) || !defined($domain)) {
                   2182: 		    $setoutput.= '<br /> <span class="LC_error">'.
                   2183: 			&mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).
                   2184: 			'</span>';
                   2185: 		    undef($value);
                   2186: 		} elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {
                   2187: 		    $setoutput.= '<br /> <span class="LC_error">'.
                   2188: 			&mt("Invalid email address specified, user [_1] is unknown.",$name).
                   2189: 			'</span>';
                   2190: 		    undef($value);
                   2191: 		}
1.364     albertel 2192: 	    }
                   2193:         }
1.178     raeburn  2194:         # Get existing cloners
                   2195:         my @oldcloner = ();
                   2196:         if ($name eq 'cloners') {
                   2197:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   2198:             if ($clonenames{'cloners'} =~ /,/) {
                   2199:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   2200:             } else {
                   2201:                 $oldcloner[0] = $clonenames{'cloners'};
                   2202:             }
                   2203:         }
1.107     matthew  2204:         #
1.105     matthew  2205:         # Let the user know we made the changes
1.153     albertel 2206:         if ($name && defined($value)) {
1.379     raeburn  2207:             my %failed_cloners;
1.178     raeburn  2208:             if ($name eq 'cloners') {
1.239     raeburn  2209:                 $value =~ s/\s//g;
1.178     raeburn  2210:                 $value =~ s/^,//;
                   2211:                 $value =~ s/,$//;
1.239     raeburn  2212:                 # check requested clones are valid users.
1.379     raeburn  2213:                 %failed_cloners = &check_cloners(\$value,\@oldcloner);
1.178     raeburn  2214:             }
1.105     matthew  2215:             my $put_result = &Apache::lonnet::put('environment',
                   2216:                                                   {$name=>$value},$dom,$crs);
                   2217:             if ($put_result eq 'ok') {
1.392     raeburn  2218:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>';
                   2219:                 if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2220:                     $setoutput .= &Apache::lonlocal::locallocaltime($value);
1.406     raeburn  2221:                 } elsif ($name eq 'categories') {
                   2222:                     $setoutput .= $env{'form.categories_display'};
1.392     raeburn  2223:                 } else {
                   2224:                     $setoutput .= $value;
                   2225:                 }
                   2226:                 $setoutput .= '</b>.<br />';
1.178     raeburn  2227:                 if ($name eq 'cloners') {
                   2228:                     &change_clone($value,\@oldcloner);
                   2229:                 }
1.382     raeburn  2230:                 # Update environment and nohist_courseids.db
1.402     raeburn  2231:                 if (($name eq 'description') || ($name eq 'cloners') || 
1.403     raeburn  2232:                     ($name eq 'hidefromcat') || ($name eq 'categories')) {
1.392     raeburn  2233:                     if ($chome eq '') {
                   2234:                         %crsinfo =
                   2235:                             &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
1.403     raeburn  2236:                                                  $crs,undef,undef,'.');
1.392     raeburn  2237:                         $chome = &Apache::lonnet::homeserver($crs,$dom);
                   2238:                     }
                   2239:                 }
1.179     raeburn  2240:                 if ($name eq 'description' && defined($value)) {
1.393     raeburn  2241:                     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value});
1.382     raeburn  2242:                     if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
                   2243:                         $crsinfo{$env{'request.course.id'}}{'description'} = $value; 
1.392     raeburn  2244:                         my $putresult =
                   2245:                             &Apache::lonnet::courseidput($dom,\%crsinfo,
                   2246:                                                          $chome,'notime');
                   2247:                     }
                   2248:                 }
1.403     raeburn  2249:                 if (($name eq 'cloners') || ($name eq 'hidefromcat') || ($name eq 'categories')) {
1.402     raeburn  2250:                     if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
1.403     raeburn  2251:                         &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$name => $value});
                   2252:                         $crsinfo{$env{'request.course.id'}}{$name} = $value;
1.402     raeburn  2253:                         my $putresult =
                   2254:                             &Apache::lonnet::courseidput($dom,\%crsinfo,
                   2255:                                                          $chome,'notime');
                   2256:                     }
                   2257:                 }
1.105     matthew  2258:             } else {
1.130     www      2259:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   2260: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      2261:             }
1.379     raeburn  2262:             if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) {
                   2263:                 $setoutput.= &mt('Unable to include').': ';
                   2264:                 my @fails;
                   2265:                 my $num = 0;
                   2266:                 if (defined($failed_cloners{'format'})) {
                   2267:                     $fails[$num] .= '<b>'.$failed_cloners{'format'}.
                   2268:                                   '</b>, '.&mt('reason').' - '.
                   2269:                                   &mt('Invalid format');
                   2270:                     $num ++;
                   2271:                 }
                   2272:                 if (defined($failed_cloners{'domain'})) {
                   2273:                     $fails[$num] .= '<b>'.$failed_cloners{'domain'}.
                   2274:                                   '</b>, '.&mt('reason').' - '.
                   2275:                                   &mt('Domain does not exist');
                   2276:                     $num ++;
                   2277:                 }
                   2278:                 if (defined($failed_cloners{'newuser'})) {
                   2279:                     $fails[$num] .= '<b>'.$failed_cloners{'newuser'}.                                   '</b>, '.&mt('reason').' - '.
                   2280:                         &mt('LON-CAPA user(s) do(es) not exist.').
                   2281:                         '.<br />'.&mt('Please ').
                   2282:                         ' <a href="/adm/createuser">'.
                   2283:                         &mt('add the user(s)').'</a>, '.
                   2284:                         &mt('and then return to the ').
                   2285:                         '<a href="/adm/parmset?action=crsenv">'.
                   2286:                         &mt('Course Parameters page').'</a> '.
                   2287:                         &mt('to add the new user(s) to the list of possible cloners');
                   2288:                 }
                   2289:                 $setoutput .= join(';&nbsp;&nbsp;',@fails).'.<br />';
1.239     raeburn  2290:             }
1.30      www      2291:         }
1.38      harris41 2292:     }
1.315     albertel 2293: 
                   2294:     my $start_table     =&Apache::loncommon::start_data_table();
                   2295:     my $start_header_row=&Apache::loncommon::start_data_table_header_row();
                   2296:     my $end_header_row  =&Apache::loncommon::end_data_table_header_row();
1.108     www      2297: # ------------------------- Re-init course environment entries for this session
                   2298: 
1.302     albertel 2299:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296     albertel 2300: 				       {'freshen_cache' => 1});
1.105     matthew  2301: 
1.30      www      2302: # -------------------------------------------------------- Get parameters again
1.45      matthew  2303: 
                   2304:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 2305:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 2306:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      2307:     my $output='';
1.403     raeburn  2308:     my $can_categorize;
1.45      matthew  2309:     if (! exists($values{'con_lost'})) {
1.30      www      2310:         my %descriptions=
1.395     bisitz   2311: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b><br />'.
1.46      matthew  2312:                                  '<a href="javascript:openbrowser'.
1.47      matthew  2313:                                  "('envform','url','sequence')\">".
1.314     albertel 2314:                                  &mt('Select Map').'</a><br /><span class="LC_warning"> '.
1.395     bisitz   2315:                                  &mt('Modification may make assessment data inaccessible!').
1.314     albertel 2316:                                  '</span>',
1.140     sakharuk 2317:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 2318:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 2319:                                  '</b><br />'.
1.395     bisitz   2320:                                  '('.&mt('internal, optional').')',
                   2321:              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br />'
                   2322:                                 .'("<tt>'.&mt('user:domain,user:domain,*:domain').'</tt>")<br />'
                   2323:                                 .&mt('Users with active Course Coordinator role in this course are permitted to clone and need not be included.').'<br />'
                   2324:                                 .&mt('Use [_1] to allow course to be cloned by anyone in the specified domain.','"<tt>*:domain</tt>"').'<br />'
                   2325:                                 .&mt('Use [_1] to allow unrestricted cloning in all domains.','"<tt>*</tt>"'),
1.150     www      2326:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
1.395     bisitz   2327:                                  &mt('[_1], [_2], or [_3]','"<tt>standard</tt>"','"<tt>external</tt>"','"<tt>spreadsheet</tt>"').&Apache::loncommon::help_open_topic('GradingOptions'),
                   2328: 	     'task_grading'   => '<b>'.&mt('Bridge Task Grading').'</b><br />'
                   2329:                                 .&mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections.').'<br />'
                   2330:                                 .'('.&mt('[_1]: they are allowed (this is the default). [_2]: no, they can only grade their own section.','"<tt>any</tt>"','"<tt>section</tt>"').')',
                   2331:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b><br />'.
1.52      www      2332:                     '<a href="javascript:openbrowser'.
                   2333:                     "('envform','default_xml_style'".
1.336     albertel 2334:                     ",'sty')\">$SelectStyleFile</a><br />",
1.395     bisitz   2335:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').'</b><br />'
                   2336:                                 .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',
                   2337:              'question.email.text' => '<b>'.&mt('Custom Text for Resource Content Question Option in Feedback').'</b>',
                   2338:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'
                   2339:                                 .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',
                   2340:              'comment.email.text' => '<b>'.&mt('Custom Text for Course Content Option in Feedback').'</b>',
                   2341:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b><br />'
                   2342:                                  .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',
                   2343:              'policy.email.text' => '<b>'.&mt('Custom Text for Course Policy Option in Feedback').'</b>',
                   2344:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'
                   2345:                                 .'('.&mt('[_1] for default hiding','"<tt>yes</tt>"').')',
                   2346:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'
                   2347:                                  .'('.&mt('[_1] for visible separation.','"<tt>yes</tt>"').' '
                   2348:                                  .&mt('Changes will not show until next login.').')',
                   2349:              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b><br />'
                   2350:                                         .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"<tt>all</tt>"','"<tt>section</tt>"','"<tt>disabled</tt>"').')',
                   2351:              'student_classlist_portfiles' => '<b>'.&mt('Include link to accessible portfolio files').'</b><br />'
1.413.6.1! raeburn  2352:                                              .'('.&mt("[_1] for link to each a listing of each student's files.",'"<tt>yes</tt>"').')',
1.395     bisitz   2353:              'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'
                   2354:                                            .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"<tt>yes</tt>"').')',
                   2355:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').'</b><br />'
                   2356:                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'
                   2357:                                  .'("<tt>'.&mt('role,role,...').'</tt>") '
                   2358: 	                         .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.118     matthew  2359:              'plc.users.denied' => 
1.141     sakharuk 2360:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.395     bisitz   2361:                                   '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',
1.118     matthew  2362: 
1.395     bisitz   2363:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').'</b><br />'
                   2364:                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"')
                   2365:                                  .'("<tt>'.&mt('role,role,...').'</tt>") '
                   2366:                                  .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      2367:              'pch.users.denied' => 
1.141     sakharuk 2368:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.395     bisitz   2369:                                  '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',
1.49      matthew  2370:              'spreadsheet_default_classcalc' 
1.141     sakharuk 2371:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  2372:                     '<a href="javascript:openbrowser'.
                   2373:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 2374:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2375:              'spreadsheet_default_studentcalc' 
1.395     bisitz   2376:                  => '<b>'.&mt('Default Student Spreadsheet').'</b><br />'.
1.50      matthew  2377:                     '<a href="javascript:openbrowser'.
                   2378:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 2379:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2380:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 2381:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  2382:                     '<a href="javascript:openbrowser'.
                   2383:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 2384:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 2385: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 2386: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.395     bisitz   2387: 	            '('.&mt('Set value to [_1] to allow.','"<tt>yes</tt>"').')',
1.170     raeburn  2388:              'allow_discussion_post_editing'
1.395     bisitz   2389:                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />'
                   2390:                    .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'
                   2391:                    .'('.&mt('Set value to [_1] to allow all roles.','"<tt>yes</tt>"').')'
                   2392:                    .'("<tt>'.&mt('role:section,role:section,...').'</tt>")<br />'
                   2393:                    .'('.&mt('Example: "<tt>st:001,st:002,in,cc</tt>" would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')',
1.89      albertel 2394: 	     'rndseed'
1.395     bisitz   2395: 	         => '<b>'.&mt('Randomization algorithm used').'</b><br />'
                   2396:                    .'<span class="LC_error">'
                   2397:                    .&mt('Modifying this will make problems have different numbers and answers!')
                   2398:                    .'</span>',
1.151     albertel 2399: 	     'receiptalg'
                   2400: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   2401:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 2402:              'suppress_tries'
1.272     albertel 2403:                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.395     bisitz   2404:                     ' ('.&mt('[_1] to suppress, anything else to not suppress','"<tt>yes</tt>"').')',
1.113     sakharuk 2405:              'problem_stream_switch'
1.141     sakharuk 2406:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.395     bisitz   2407:                     ' ('.&mt('[_1] if allowed, anything else if not','"<tt>yes</tt>"').')',
1.161     sakharuk 2408:              'default_paper_size' 
                   2409:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   2410:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   2411:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   2412:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.319     foxr     2413: 	     'print_header_format'
1.395     bisitz   2414: 	         => ' <b>'.&mt('Print header format').'</b><br />'
                   2415:                    .&mt('Substitutions:<br />[_1]: student name, [_2]: course id, [_3]: assignment note. Numbers after the <tt>%</tt> limit the field size.','"<tt>%n</tt>"','"<tt>%c</tt>"','"<tt>%a</tt>"'),
1.217     albertel 2416:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
                   2417:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
1.395     bisitz   2418:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b><br />'
                   2419:                                      .'("<tt>'.&mt('user:domain,user:domain,*:domain').'</tt>")',
1.140     sakharuk 2420:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      2421:              'disable_receipt_display'
1.141     sakharuk 2422:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 2423:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.313     albertel 2424: 	     'task_messages'
1.395     bisitz   2425: 	         => '<b>'.&mt('Send message to student when clicking Done on Tasks').'</b><br /> ('.&mt('[_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>"').')',
1.163     albertel 2426: 	     'disablesigfigs'
                   2427: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   2428:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251     albertel 2429: 	     'disableexampointprint'
                   2430: 	         => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                   2431:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278     www      2432:              'externalsyllabus'
1.279     www      2433:                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149     albertel 2434: 	     'tthoptions'
1.367     albertel 2435: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>',
                   2436: 
                   2437: 	     'texengine'
1.395     bisitz   2438: 	         => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'
1.413.6.1! raeburn  2439:                    .'('.&mt("[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student's preference",'"<tt>jsMath</tt>"','"<tt>mimetex</tt>"','"<tt>tth</tt>"').')',
1.397     www      2440:              'timezone'
1.400     raeburn  2441:                  => '<b>'.&mt('Timezone in which the course takes place').'</b>',
1.392     raeburn  2442: 
1.400     raeburn  2443:              'suppress_embed_prompt'
                   2444:                  => '<b>'.&mt('Suppress prompt to upload items referenced in a web page being uploaded to portfolio, when current role is student.').'</b><br />'.
1.402     raeburn  2445:                     ' ('.&mt('[_1] to suppress, anything else to not suppress','"<tt>yes</tt>"').')',
1.403     raeburn  2446:              'hidefromcat'
1.402     raeburn  2447:                  => '<b>'.&mt('Exclude from course catalog').'</b><br />'.
                   2448:                     ' ('.&mt('[_1] to exclude, anything else to include - included if assigned an institutional code, or manually catagorized','"<tt>yes</tt>"').')',
1.403     raeburn  2449:              'categories'
                   2450:                  => '<b>'.&mt('Categorize course').'</b> <a href="javascript:catsbrowser()">'.
                   2451:                     &mt('Display Categories').'</a>',
1.409     raeburn  2452:              'datelocale' 
                   2453:                  => '<b>'.&mt('Locale used for course calendar').'</b>',
1.402     raeburn  2454:              );
                   2455:         my @Display_Order = ('url','description','courseid','cloners');
1.403     raeburn  2456:         (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom);
                   2457:         if ($can_toggle_cat) {
1.402     raeburn  2458:             push(@Display_Order,'hidefromcat');
                   2459:         }
1.403     raeburn  2460:         if ($can_categorize) {
                   2461:             push(@Display_Order,'categories');
                   2462:         }
1.402     raeburn  2463:         push (@Display_Order,('grading',
1.278     www      2464:                              'externalsyllabus',
1.107     matthew  2465:                              'default_xml_style','pageseparators',
1.402     raeburn  2466:                              'question.email','question.email.text','comment.email',
                   2467:                              'comment.email.text','policy.email','policy.email.text',
1.169     matthew  2468:                              'student_classlist_view',
1.372     raeburn  2469:                              'student_classlist_opt_in',
                   2470:                              'student_classlist_portfiles',
1.118     matthew  2471:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  2472:                              'pch.roles.denied','pch.users.denied',
                   2473:                              'allow_limited_html_in_feedback',
1.170     raeburn  2474:                              'allow_discussion_post_editing',
1.108     www      2475:                              'languages',
1.397     www      2476:                              'timezone',
1.409     raeburn  2477:                              'datelocale',
1.150     www      2478: 			     'nothideprivileged',
1.107     matthew  2479:                              'rndseed',
1.151     albertel 2480:                              'receiptalg',
1.107     matthew  2481:                              'problem_stream_switch',
1.164     sakharuk 2482: 			     'suppress_tries',
1.400     raeburn  2483:                              'suppress_embed_prompt',
1.161     sakharuk 2484:                              'default_paper_size',
1.319     foxr     2485: 			     'print_header_format',
1.115     www      2486:                              'disable_receipt_display',
1.107     matthew  2487:                              'spreadsheet_default_classcalc',
                   2488:                              'spreadsheet_default_studentcalc',
                   2489:                              'spreadsheet_default_assesscalc', 
                   2490:                              'hideemptyrows',
                   2491:                              'default_enrollment_start_date',
                   2492:                              'default_enrollment_end_date',
1.163     albertel 2493: 			     'tthoptions',
1.367     albertel 2494: 			     'texengine',
1.251     albertel 2495: 			     'disablesigfigs',
1.313     albertel 2496: 			     'disableexampointprint',
1.402     raeburn  2497: 			     'task_messages','task_grading'));
1.107     matthew  2498: 	foreach my $parameter (sort(keys(%values))) {
1.405     raeburn  2499:             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
                   2500:                     ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
                   2501:                     || ($parameter eq 'type')) {
1.142     raeburn  2502:                 if (! $descriptions{$parameter}) {
                   2503:                     $descriptions{$parameter}=$parameter;
                   2504:                     push(@Display_Order,$parameter);
                   2505:                 }
                   2506:             }
1.43      albertel 2507: 	}
1.315     albertel 2508: 	
1.107     matthew  2509:         foreach my $parameter (@Display_Order) {
                   2510:             my $description = $descriptions{$parameter};
1.51      matthew  2511:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      2512:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  2513:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  2514:                 '.checked=true;"';
1.315     albertel 2515:             $output .= &Apache::loncommon::start_data_table_row().
                   2516: 		'<td>'.$description.'</td>';
1.107     matthew  2517:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   2518:                 $output .= '<td>'.
                   2519:                     &Apache::lonhtmlcommon::date_setter('envform',
                   2520:                                                         $parameter.'_value',
                   2521:                                                         $values{$parameter},
                   2522:                                                         $onchange).
                   2523:                                                         '</td>';
1.398     www      2524:             } elsif ($parameter eq 'timezone') {
1.399     raeburn  2525:                 my $includeempty = 1;
                   2526:                 my $timezone = &Apache::lonlocal::gettimezone();
1.398     www      2527:                 $output .= '<td>'.
                   2528:                     &Apache::loncommon::select_timezone($parameter.'_value',
1.399     raeburn  2529:                                                         $timezone,
                   2530:                                                         $onchange,$includeempty).'</td>';
1.409     raeburn  2531:             } elsif ($parameter eq 'datelocale') {
                   2532:                 my $includeempty = 1;
                   2533:                 my $locale_obj = &Apache::lonlocal::getdatelocale();
                   2534:                 my $currdatelocale;
                   2535:                 if (ref($locale_obj)) {
                   2536:                     $currdatelocale = $locale_obj->id();
                   2537:                 }
                   2538:                 $output .= '<td>'.
                   2539:                     &Apache::loncommon::select_datelocale($parameter.'_value',
                   2540:                                                           $currdatelocale,
                   2541:                                                           $onchange,$includeempty).'</td>'; 
1.406     raeburn  2542:             } elsif ($parameter eq 'categories') {
                   2543:                 my $catdisplay;
                   2544:                 if ($values{'categories'} ne '') {
                   2545:                     my @curritems = split(/\&/,$values{'categories'});
                   2546:                     foreach my $item (@curritems) {
                   2547:                         my ($name,$parent,$pos) = split(/:/,$item);
                   2548:                         $catdisplay .= &unescape($name).'&';
                   2549:                     }
                   2550:                     $catdisplay =~ s/\&$//;
                   2551:                 } 
                   2552:                 $output .= '<td>'.
                   2553:                            '<input type="hidden" name="categories_value" value="'.
                   2554:                            $values{'categories'}.'" />'.
                   2555:                            '<input type="textbox" name="categories_display" value="'.
                   2556:                            $catdisplay.'" readonly="readonly" size="40" /></td>';
1.107     matthew  2557:             } else {
                   2558:                 $output .= '<td>'.
                   2559:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   2560:                                                     $values{$parameter},
                   2561:                                                     40,$onchange).'</td>';
                   2562:             }
                   2563:             $output .= '<td>'.
                   2564:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   2565:                 '</td>';
1.315     albertel 2566:             $output .= &Apache::loncommon::end_data_table_row()."\n";
1.51      matthew  2567: 	}
1.69      www      2568:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  2569:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   2570:             '.checked=true;"';
1.315     albertel 2571: 	$output.=&Apache::loncommon::start_data_table_row().
                   2572: 	    '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  2573: 	    '<input type="text" size=40 name="newp_name" '.
                   2574:                 $onchange.' /></td><td>'.
                   2575:             '<input type="text" size=40 name="newp_value" '.
                   2576:                 $onchange.' /></td><td>'.
1.315     albertel 2577: 	    '<input type="checkbox" name="newp_setparmval" /></td>'.
                   2578: 	    &Apache::loncommon::end_data_table_row()."\n";
1.43      albertel 2579:     }
1.157     sakharuk 2580:     my %lt=&Apache::lonlocal::texthash(
                   2581: 		    'par'   => 'Parameter',
                   2582: 		    'val'   => 'Value',
1.395     bisitz   2583: 		    'set'   => 'Set?',
                   2584: 		    'sav'   => 'Save'
1.157     sakharuk 2585: 				       );
                   2586: 
1.140     sakharuk 2587:     my $Parameter=&mt('Parameter');
                   2588:     my $Value=&mt('Value');
1.141     sakharuk 2589:     my $Set=&mt('Set');
1.403     raeburn  2590:     my ($jscript,$categorize_js);
                   2591:     my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');
                   2592:     if ($can_categorize) {
                   2593:         $categorize_js = <<ENDSCRIPT;
                   2594: function catsbrowser() {
                   2595:     var catswin = null;
                   2596:     var url = '/adm/parmset?action=categorizecourse';
                   2597:     if (!catswin || catswin.closed) {
                   2598:         catswin=window.open(url,'categorieswin','height=480,width=600,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
                   2599:     } else {
                   2600:         catswin.focus();
                   2601:     }
                   2602: } 
                   2603: ENDSCRIPT
                   2604:     }
                   2605:     $jscript = '<script type="text/javascript" language="Javascript">'."\n".
                   2606:                $browse_js."\n".$categorize_js."\n".'</script>';
1.280     albertel 2607:     my $start_page = 
1.323     albertel 2608: 	&Apache::loncommon::start_page('Set Course Environment',
1.403     raeburn  2609: 				       $jscript);
1.280     albertel 2610:     my $end_page = 
                   2611: 	&Apache::loncommon::end_page();
1.315     albertel 2612:     my $end_table=&Apache::loncommon::end_data_table();
1.280     albertel 2613:     $r->print(<<ENDENV);
                   2614: $start_page
1.193     albertel 2615: $breadcrumbs
                   2616: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      2617: $setoutput
1.395     bisitz   2618: <div><input type="submit" name="crsenv" value="$lt{'sav'}" /></div>
1.315     albertel 2619: $start_table
                   2620: $start_header_row
1.395     bisitz   2621: <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}</th>
1.315     albertel 2622: $end_header_row
1.30      www      2623: $output
1.315     albertel 2624: $end_table
1.395     bisitz   2625: <input type="submit" name="crsenv" value="$lt{'sav'}" />
1.30      www      2626: </form>
1.280     albertel 2627: $end_page
                   2628: ENDENV
1.30      www      2629: }
1.402     raeburn  2630: 
1.403     raeburn  2631: sub can_modify_catsettings {
1.402     raeburn  2632:     my ($dom) = @_;
                   2633:     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);
1.403     raeburn  2634:     my ($can_toggle_cat,$can_categorize);
1.402     raeburn  2635:     if (ref($domconf{'coursecategories'}) eq 'HASH') {
                   2636:         if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
                   2637:             $can_toggle_cat = 1;
                   2638:         }
1.403     raeburn  2639:         if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
                   2640:             $can_categorize = 1;
                   2641:         }
                   2642:     }
                   2643:     return ($can_toggle_cat,$can_categorize);
                   2644: }
                   2645: 
                   2646: sub assign_course_categories {
                   2647:     my ($r) = @_;
                   2648:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2649:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2650:     my $hascats = 0;
                   2651:     my $cathash;
                   2652:     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
                   2653:     if (ref($domconf{'coursecategories'}) eq 'HASH') {
                   2654:         $cathash = $domconf{'coursecategories'}{'cats'};
                   2655:         if (ref($cathash) eq 'HASH') {
                   2656:             $hascats = 1;   
                   2657:         }
1.402     raeburn  2658:     }
1.403     raeburn  2659:     my $catwin_js;
                   2660:     if ($hascats) {
                   2661:         my $alert = &mt('Use \"Save\" in the main window to save course categories');
                   2662:         $catwin_js = <<ENDSCRIPT;
                   2663: <script type="text/javascript">
                   2664: 
                   2665: function updateCategories() {
                   2666:     var newcategories = '';
1.406     raeburn  2667:     var unescapedcats = '';
1.403     raeburn  2668:     if (document.chgcats.usecategory.length) {
                   2669:         for (var i=0; i<document.chgcats.usecategory.length; i++) {
                   2670:             if (document.chgcats.usecategory[i].checked == true) {
                   2671:                 newcategories = newcategories + document.chgcats.usecategory[i].value + '&';
1.406     raeburn  2672:                 unescapedcats = unescapedcats + document.chgcats.catname[i].value + ' & ';
1.403     raeburn  2673:             }
                   2674:         }
                   2675:         if (newcategories.length > 0) {
                   2676:             newcategories = newcategories.slice(0,-1);
                   2677:         }
1.406     raeburn  2678:         if (unescapedcats.length > 0) {
1.408     raeburn  2679:             unescapedcats = unescapedcats.slice(0,-3);
1.406     raeburn  2680:         }
1.403     raeburn  2681:     } else {
                   2682:          if (document.chgcats.usecategory.checked == true) {
                   2683:              newcategories = document.chgcats.usecategory.value;
1.406     raeburn  2684:              unescapedcats = document.chgcats.catname.value;
1.403     raeburn  2685:          }
                   2686:     }
                   2687:     opener.document.envform.categories_value.value = newcategories;
1.406     raeburn  2688:     opener.document.envform.categories_display.value = unescapedcats;
1.403     raeburn  2689:     opener.document.envform.categories_setparmval.checked = true;
                   2690:     alert("$alert");
                   2691:     self.close();
                   2692:     return;
                   2693: }
                   2694: 
                   2695: </script>
                   2696: ENDSCRIPT
                   2697:     } else {
                   2698:         my $onload; 
                   2699:     }
                   2700:     my $start_page =
                   2701:         &Apache::loncommon::start_page('Course Categories',$catwin_js,
                   2702:                                        {'only_body'      => 1,});
                   2703:     my $end_page = &Apache::loncommon::end_page();
                   2704:     my $categoriesform = '<h3>'.&mt('Categorize Course').'</h3>';
                   2705:     if ($hascats) {
                   2706:         my %currsettings =
                   2707:             &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);
                   2708:         $categoriesform .= &mt('Assign one or more categories to this course.').'<br /><br />'.
                   2709:                                '<form name="chgcats" action="/adm/parmset" method="post">'."\n"
                   2710:                                .&Apache::loncommon::assign_categories_table($cathash,
                   2711:                                                        $currsettings{'categories'})."\n"
                   2712:                                .'<br /><input type="button" name="changes" value="'
                   2713:                                .&mt('Copy to main window').'" '
                   2714:                                .'onclick="javascript:updateCategories()" /></form><br />';
                   2715:     } else {
                   2716:         $categoriesform .= &mt('No categories defined for this domain');
                   2717:     }
                   2718:     $r->print($start_page.$categoriesform.$end_page);
                   2719:     return;
1.402     raeburn  2720: }
                   2721: 
1.120     www      2722: ##################################################
1.207     www      2723: # Overview mode
                   2724: ##################################################
1.124     www      2725: my $tableopen;
                   2726: 
                   2727: sub tablestart {
                   2728:     if ($tableopen) {
                   2729: 	return '';
                   2730:     } else {
                   2731: 	$tableopen=1;
1.295     albertel 2732: 	return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130     www      2733: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      2734:     }
                   2735: }
                   2736: 
                   2737: sub tableend {
                   2738:     if ($tableopen) {
                   2739: 	$tableopen=0;
1.295     albertel 2740: 	return &Apache::loncommon::end_data_table();
1.124     www      2741:     } else {
                   2742: 	return'';
                   2743:     }
                   2744: }
                   2745: 
1.207     www      2746: sub readdata {
                   2747:     my ($crs,$dom)=@_;
                   2748: # Read coursedata
                   2749:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   2750: # Read userdata
                   2751: 
                   2752:     my $classlist=&Apache::loncoursedata::get_classlist();
                   2753:     foreach (keys %$classlist) {
1.350     albertel 2754:         if ($_=~/^($match_username)\:($match_domain)$/) {
1.207     www      2755: 	    my ($tuname,$tudom)=($1,$2);
                   2756: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   2757:             foreach my $userkey (keys %{$useropt}) {
                   2758: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   2759:                     my $newkey=$userkey;
                   2760: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   2761: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   2762: 		}
                   2763: 	    }
                   2764: 	}
                   2765:     }
                   2766:     return $resourcedata;
                   2767: }
                   2768: 
                   2769: 
1.124     www      2770: # Setting
1.208     www      2771: 
                   2772: sub storedata {
                   2773:     my ($r,$crs,$dom)=@_;
1.207     www      2774: # Set userlevel immediately
                   2775: # Do an intermediate store of course level
                   2776:     my $olddata=&readdata($crs,$dom);
1.124     www      2777:     my %newdata=();
                   2778:     undef %newdata;
                   2779:     my @deldata=();
                   2780:     undef @deldata;
1.190     albertel 2781:     foreach (keys %env) {
1.124     www      2782: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   2783: 	    my $cmd=$1;
                   2784: 	    my $thiskey=$2;
1.207     www      2785: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   2786: 	    my $tkey=$thiskey;
                   2787:             if ($tuname) {
                   2788: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   2789: 	    }
1.385     albertel 2790: 	    if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
1.384     albertel 2791: 		my ($data, $typeof, $text);
                   2792: 		if ($cmd eq 'set') {
                   2793: 		    $data=$env{$_};
                   2794: 		    $typeof=$env{'form.typeof_'.$thiskey};
                   2795: 		    $text = &mt('Saved modified parameter for');
                   2796: 		} elsif ($cmd eq 'datepointer') {
                   2797: 		    $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
                   2798: 		    $typeof=$env{'form.typeof_'.$thiskey};
                   2799: 		    $text = &mt('Saved modified date for');
1.385     albertel 2800: 		} elsif ($cmd eq 'dateinterval') {
                   2801: 		    $data=&get_date_interval_from_form($thiskey);
                   2802: 		    $typeof=$env{'form.typeof_'.$thiskey};
                   2803: 		    $text = &mt('Saved modified date for');
1.384     albertel 2804: 		}
                   2805: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
1.207     www      2806: 		    if ($tuname) {
1.212     www      2807: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2808: 								 $tkey.'.type' => $typeof},
                   2809: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2810: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.384     albertel 2811: 			    $r->print('<br />'.$text.' '.
1.207     www      2812: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   2813: 			} else {
1.314     albertel 2814: 			    $r->print('<div class="LC_error">'.
1.365     albertel 2815: 				      &mt('Error saving parameters').'</div>');
1.207     www      2816: 			}
                   2817: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2818: 		    } else {
                   2819: 			$newdata{$thiskey}=$data;
1.212     www      2820:  			$newdata{$thiskey.'.type'}=$typeof; 
                   2821:                    } 
1.207     www      2822: 		}
1.124     www      2823: 	    } elsif ($cmd eq 'del') {
1.207     www      2824: 		if ($tuname) {
                   2825: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290     www      2826: 			    &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207     www      2827: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2828: 		    } else {
1.314     albertel 2829: 			$r->print('<div class="LC_error">'.
                   2830: 				  &mt('Error deleting parameters').'</div>');
1.207     www      2831: 		    }
                   2832: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2833: 		} else {
1.333     albertel 2834: 		    push (@deldata,$thiskey,$thiskey.'.type');
1.207     www      2835: 		}
1.124     www      2836: 	    }
                   2837: 	}
                   2838:     }
1.207     www      2839: # Store all course level
1.144     www      2840:     my $delentries=$#deldata+1;
                   2841:     my @newdatakeys=keys %newdata;
                   2842:     my $putentries=$#newdatakeys+1;
                   2843:     if ($delentries) {
                   2844: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290     www      2845: 	    my %loghash=map { $_ => '' } @deldata;
                   2846: 	    &log_parmset(\%loghash,1);
1.144     www      2847: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2848: 	} else {
1.314     albertel 2849: 	    $r->print('<div class="LC_error">'.
                   2850: 		      &mt('Error deleting parameters').'</div>');
1.144     www      2851: 	}
1.205     www      2852: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2853:     }
                   2854:     if ($putentries) {
                   2855: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290     www      2856: 			    &log_parmset(\%newdata,0);
1.365     albertel 2857: 	    $r->print('<h3>'.&mt('Saved [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2858: 	} else {
1.314     albertel 2859: 	    $r->print('<div class="LC_error">'.
1.365     albertel 2860: 		      &mt('Error saving parameters').'</div>');
1.144     www      2861: 	}
1.205     www      2862: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2863:     }
1.208     www      2864: }
1.207     www      2865: 
1.208     www      2866: sub extractuser {
                   2867:     my $key=shift;
1.350     albertel 2868:     return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
1.208     www      2869: }
1.206     www      2870: 
1.381     albertel 2871: sub parse_listdata_key {
                   2872:     my ($key,$listdata) = @_;
                   2873:     # split into student/section affected, and
                   2874:     # the realm (folder/resource part and parameter
                   2875:     my ($student,$realm) = 
                   2876: 	($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
                   2877:     # if course wide student would be undefined
                   2878:     if (!defined($student)) {
                   2879: 	($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
                   2880:     }
                   2881:     # strip off the .type if it's not the Question type parameter
                   2882:     if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
                   2883: 	$realm=~s/\.type//;
                   2884:     }
                   2885:     # split into resource+part and parameter name
1.388     albertel 2886:     my ($res,    $parm) = ($realm=~/^(.*)\.(.*)$/);
                   2887:        ($res, my $part) = ($res  =~/^(.*)\.(.*)$/);
1.381     albertel 2888:     return ($student,$res,$part,$parm);
                   2889: }
                   2890: 
1.208     www      2891: sub listdata {
1.214     www      2892:     my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207     www      2893: # Start list output
1.206     www      2894: 
1.122     www      2895:     my $oldsection='';
                   2896:     my $oldrealm='';
                   2897:     my $oldpart='';
1.123     www      2898:     my $pointer=0;
1.124     www      2899:     $tableopen=0;
1.145     www      2900:     my $foundkeys=0;
1.248     albertel 2901:     my %keyorder=&standardkeyorder();
1.381     albertel 2902: 
1.214     www      2903:     foreach my $thiskey (sort {
1.381     albertel 2904: 	my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
                   2905: 	my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
                   2906: 
                   2907: 	# get the numerical order for the param
                   2908: 	$aparm=$keyorder{'parameter_0_'.$aparm};
                   2909: 	$bparm=$keyorder{'parameter_0_'.$bparm};
                   2910: 
                   2911: 	my $result=0;
                   2912: 
1.214     www      2913: 	if ($sortorder eq 'realmstudent') {
1.381     albertel 2914:             if ($ares     ne $bres    ) {
                   2915: 		$result = ($ares     cmp $bres);
                   2916:             } elsif ($astudent ne $bstudent) { 
                   2917: 		$result = ($astudent cmp $bstudent);
                   2918: 	    } elsif ($apart    ne $bpart   ) {
                   2919: 		$result = ($apart    cmp $bpart);
1.237     albertel 2920: 	    }
1.381     albertel 2921: 	} else {
                   2922: 	    if      ($astudent ne $bstudent) { 
                   2923: 		$result = ($astudent cmp $bstudent);
                   2924: 	    } elsif ($ares     ne $bres    ) {
                   2925: 		$result = ($ares     cmp $bres);
                   2926: 	    } elsif ($apart    ne $bpart   ) {
                   2927: 		$result = ($apart    cmp $bpart);
1.247     albertel 2928: 	    }
1.381     albertel 2929: 	}
                   2930: 	    
                   2931: 	if (!$result) {
                   2932:             if (defined($aparm) && defined($bparm)) {
                   2933: 		$result = ($aparm <=> $bparm);
                   2934:             } elsif (defined($aparm)) {
                   2935: 		$result = -1;
                   2936:             } elsif (defined($bparm)) {
                   2937: 		$result = 1;
1.248     albertel 2938: 	    }
1.214     www      2939: 	}
1.381     albertel 2940: 
                   2941: 	$result;
1.214     www      2942:     } keys %{$listdata}) {
1.381     albertel 2943: 
1.211     www      2944: 	if ($$listdata{$thiskey.'.type'}) {
                   2945:             my $thistype=$$listdata{$thiskey.'.type'};
                   2946:             if ($$resourcedata{$thiskey.'.type'}) {
                   2947: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2948: 	    }
1.207     www      2949: 	    my ($middle,$part,$name)=
                   2950: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2951: 	    my $section=&mt('All Students');
1.207     www      2952: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2953: 		my $issection=$1;
1.350     albertel 2954: 		if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
1.206     www      2955: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2956: 		} else {
                   2957: 		    $section=&mt('Group/Section').': '.$issection;
                   2958: 		}
1.207     www      2959: 		$middle=~s/^\[(.*)\]//;
1.122     www      2960: 	    }
1.207     www      2961: 	    $middle=~s/\.+$//;
                   2962: 	    $middle=~s/^\.+//;
1.316     albertel 2963: 	    my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.122     www      2964: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316     albertel 2965: 		$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      2966: 	    } elsif ($middle) {
1.174     albertel 2967: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316     albertel 2968: 		$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      2969: 	    }
1.214     www      2970: 	    if ($sortorder eq 'realmstudent') {
                   2971: 		if ($realm ne $oldrealm) {
                   2972: 		    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                   2973: 		    $oldrealm=$realm;
                   2974: 		    $oldsection='';
                   2975: 		}
                   2976: 		if ($section ne $oldsection) {
                   2977: 		    $r->print(&tableend()."\n<h2>$section</h2>");
                   2978: 		    $oldsection=$section;
                   2979: 		    $oldpart='';
                   2980: 		}
                   2981: 	    } else {
                   2982: 		if ($section ne $oldsection) {
                   2983: 		    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                   2984: 		    $oldsection=$section;
                   2985: 		    $oldrealm='';
                   2986: 		}
                   2987: 		if ($realm ne $oldrealm) {
                   2988: 		    $r->print(&tableend()."\n<h2>$realm</h2>");
                   2989: 		    $oldrealm=$realm;
                   2990: 		    $oldpart='';
                   2991: 		}
1.122     www      2992: 	    }
                   2993: 	    if ($part ne $oldpart) {
1.124     www      2994: 		$r->print(&tableend().
1.413.6.1! raeburn  2995: 			  "\n".'<span class="LC_parm_part">'.&mt('Part').": $part</span>");
1.122     www      2996: 		$oldpart=$part;
                   2997: 	    }
1.123     www      2998: #
                   2999: # Ready to print
                   3000: #
1.413.6.1! raeburn  3001:             my $parmitem = &standard_parameter_names($name);
1.295     albertel 3002: 	    $r->print(&tablestart().
                   3003: 		      &Apache::loncommon::start_data_table_row().
1.413.6.1! raeburn  3004: 		      '<td><b>'.&mt($parmitem).
1.293     www      3005: 		      '</b></td><td><input type="checkbox" name="del_'.
1.124     www      3006: 		      $thiskey.'" /></td><td>');
1.145     www      3007: 	    $foundkeys++;
1.213     www      3008: 	    if (&isdateparm($thistype)) {
1.123     www      3009: 		my $jskey='key_'.$pointer;
                   3010: 		$pointer++;
                   3011: 		$r->print(
1.232     albertel 3012: 			  &Apache::lonhtmlcommon::date_setter('parmform',
1.123     www      3013: 							      $jskey,
1.219     www      3014: 						      $$resourcedata{$thiskey},
1.325     www      3015: 							      '',1,'','').
1.277     www      3016: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
1.413     bisitz   3017: (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
                   3018: &mt('Shift all dates based on this date').'</a></span>':'').
1.277     www      3019: &date_sanity_info($$resourcedata{$thiskey})
1.123     www      3020: 			  );
1.385     albertel 3021: 	    } elsif ($thistype eq 'date_interval') {
                   3022: 		$r->print(&date_interval_selector($thiskey,
                   3023: 						  $$resourcedata{$thiskey}));
1.383     albertel 3024: 	    } elsif ($thistype =~ m/^string/) {
                   3025: 		$r->print(&string_selector($thistype,$thiskey,
                   3026: 					   $$resourcedata{$thiskey}));
1.123     www      3027: 	    } else {
1.383     albertel 3028: 		$r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
1.123     www      3029: 	    }
1.211     www      3030: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
1.413.6.1! raeburn  3031: 		      $thistype.'" />');
1.295     albertel 3032: 	    $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122     www      3033: 	}
1.121     www      3034:     }
1.208     www      3035:     return $foundkeys;
                   3036: }
                   3037: 
1.385     albertel 3038: 
                   3039: sub date_interval_selector {
                   3040:     my ($thiskey, $showval) = @_;
                   3041:     my $result;
                   3042:     foreach my $which (['days', 86400, 31],
                   3043: 		       ['hours', 3600, 23],
                   3044: 		       ['minutes', 60, 59],
                   3045: 		       ['seconds',  1, 59]) {
                   3046: 	my ($name, $factor, $max) = @{ $which };
                   3047: 	my $amount = int($showval/$factor);
                   3048: 	$showval  %= $factor;
                   3049: 	my %select = ((map {$_ => $_} (0..$max)),
                   3050: 		      'select_form_order' => [0..$max]);
                   3051: 	$result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                   3052: 						   %select);
                   3053: 	$result .= ' '.&mt($name);
                   3054:     }
                   3055:     $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
                   3056:     return $result;
                   3057: 
                   3058: }
                   3059: 
                   3060: sub get_date_interval_from_form {
                   3061:     my ($key) = @_;
                   3062:     my $seconds = 0;
                   3063:     foreach my $which (['days', 86400],
                   3064: 		       ['hours', 3600],
                   3065: 		       ['minutes', 60],
                   3066: 		       ['seconds',  1]) {
                   3067: 	my ($name, $factor) = @{ $which };
                   3068: 	if (defined($env{'form.'.$name.'_'.$key})) {
                   3069: 	    $seconds += $env{'form.'.$name.'_'.$key} * $factor;
                   3070: 	}
                   3071:     }
                   3072:     return $seconds;
                   3073: }
                   3074: 
                   3075: 
1.383     albertel 3076: sub default_selector {
                   3077:     my ($thiskey, $showval) = @_;
1.385     albertel 3078:     return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';
1.383     albertel 3079: }
                   3080: 
                   3081: my %strings = 
                   3082:     (
                   3083:      'string_yesno'
                   3084:              => [[ 'yes', 'Yes' ],
                   3085: 		 [ 'no', 'No' ]],
                   3086:      'string_problemstatus'
                   3087:              => [[ 'yes', 'Yes' ],
1.394     www      3088: 		 [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
1.383     albertel 3089: 		 [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
                   3090: 		 [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
                   3091:      );
                   3092: 
                   3093: 
                   3094: sub string_selector {
                   3095:     my ($thistype, $thiskey, $showval) = @_;
                   3096:     
                   3097:     if (!exists($strings{$thistype})) {
                   3098: 	return &default_selector($thiskey,$showval);
                   3099:     }
                   3100: 
                   3101:     my $result;
                   3102:     foreach my $possibilities (@{ $strings{$thistype} }) {
                   3103: 	my ($name, $description) = @{ $possibilities };
                   3104: 	$result .= '<label><input type="radio" name="set_'.$thiskey.
                   3105: 		  '" value="'.$name.'"';
                   3106: 	if ($showval eq $name) {
                   3107: 	    $result .= ' checked="checked"';
                   3108: 	}
                   3109: 	$result .= ' />'.&mt($description).'</label> ';
                   3110:     }
                   3111:     return $result;
                   3112: }
                   3113: 
1.389     www      3114: #
                   3115: # Shift all start and end dates by $shift
                   3116: #
                   3117: 
                   3118: sub dateshift {
                   3119:     my ($shift)=@_;
                   3120:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3121:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3122:     my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
                   3123: # ugly retro fix for broken version of types
                   3124:     foreach my $key (keys %data) {
                   3125:         if ($key=~/\wtype$/) {
                   3126:             my $newkey=$key;
                   3127:             $newkey=~s/type$/\.type/;
                   3128:             $data{$newkey}=$data{$key};
                   3129:             delete $data{$key};
                   3130:         }
                   3131:     }
1.391     www      3132:     my %storecontent=();
1.389     www      3133: # go through all parameters and look for dates
                   3134:     foreach my $key (keys %data) {
                   3135:        if ($data{$key.'.type'}=~/^date_(start|end)$/) {
                   3136:           my $newdate=$data{$key}+$shift;
1.391     www      3137:           $storecontent{$key}=$newdate;
1.389     www      3138:        }
                   3139:     }
1.391     www      3140:     my $reply=&Apache::lonnet::cput
                   3141:                 ('resourcedata',\%storecontent,$dom,$crs);
                   3142:     if ($reply eq 'ok') {
                   3143:        &log_parmset(\%storecontent);
                   3144:     }
                   3145:     &Apache::lonnet::devalidatecourseresdata($crs,$dom);
                   3146:     return $reply;
1.389     www      3147: }
                   3148: 
1.208     www      3149: sub newoverview {
1.280     albertel 3150:     my ($r) = @_;
                   3151: 
1.208     www      3152:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3153:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 3154:     my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298     albertel 3155:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      3156:     $r->print(<<ENDOVER);
1.280     albertel 3157: $start_page
1.208     www      3158: $breadcrumbs
1.232     albertel 3159: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      3160: ENDOVER
1.211     www      3161:     my @ids=();
                   3162:     my %typep=();
                   3163:     my %keyp=();
                   3164:     my %allparms=();
                   3165:     my %allparts=();
                   3166:     my %allmaps=();
                   3167:     my %mapp=();
                   3168:     my %symbp=();
                   3169:     my %maptitles=();
                   3170:     my %uris=();
                   3171:     my %keyorder=&standardkeyorder();
                   3172:     my %defkeytype=();
                   3173: 
                   3174:     my %alllevs=();
                   3175:     $alllevs{'Resource Level'}='full';
1.215     www      3176:     $alllevs{'Map/Folder Level'}='map';
1.211     www      3177:     $alllevs{'Course Level'}='general';
                   3178: 
                   3179:     my $csec=$env{'form.csec'};
1.269     raeburn  3180:     my $cgroup=$env{'form.cgroup'};
1.211     www      3181: 
                   3182:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   3183:     my $pschp=$env{'form.pschp'};
                   3184:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   3185:     if (!@psprt) { $psprt[0]='0'; }
                   3186: 
                   3187:     my @selected_sections = 
                   3188: 	&Apache::loncommon::get_env_multiple('form.Section');
                   3189:     @selected_sections = ('all') if (! @selected_sections);
1.374     albertel 3190:     foreach my $sec (@selected_sections) {
                   3191:         if ($sec eq 'all') {
1.211     www      3192:             @selected_sections = ('all');
                   3193:         }
                   3194:     }
1.269     raeburn  3195:     my @selected_groups =
                   3196:         &Apache::loncommon::get_env_multiple('form.Group');
1.211     www      3197: 
                   3198:     my $pssymb='';
                   3199:     my $parmlev='';
                   3200:  
                   3201:     unless ($env{'form.parmlev'}) {
                   3202:         $parmlev = 'map';
                   3203:     } else {
                   3204:         $parmlev = $env{'form.parmlev'};
                   3205:     }
                   3206: 
                   3207:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   3208: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   3209: 				\%keyorder,\%defkeytype);
                   3210: 
1.374     albertel 3211:     if (grep {$_ eq 'all'} (@psprt)) {
                   3212: 	@psprt = keys(%allparts);
                   3213:     }
1.211     www      3214: # Menu to select levels, etc
                   3215: 
1.317     albertel 3216:     $r->print('<table id="LC_parm_overview_scope">
                   3217:                <tr><td class="LC_parm_overview_level_menu">');
1.211     www      3218:     &levelmenu($r,\%alllevs,$parmlev);
                   3219:     if ($parmlev ne 'general') {
1.317     albertel 3220: 	$r->print('<td class="LC_parm_overview_map_menu">');
1.211     www      3221: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   3222: 	$r->print('</td>');
                   3223:     }
                   3224:     $r->print('</td></tr></table>');
                   3225: 
1.317     albertel 3226:     $r->print('<table id="LC_parm_overview_controls">
                   3227:                <tr><td class="LC_parm_overview_parm_selectors">');  
1.211     www      3228:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.317     albertel 3229:     $r->print('</td><td class="LC_parm_overview_restrictions">
                   3230:                 <table class="LC_parm_overview_restrictions">'.
                   3231:               '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
                   3232:               '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
1.211     www      3233:     &partmenu($r,\%allparts,\@psprt);
1.317     albertel 3234:     $r->print('</td><td>');
1.211     www      3235:     &sectionmenu($r,\@selected_sections);
1.317     albertel 3236:     $r->print('</td><td>');
1.269     raeburn  3237:     &groupmenu($r,\@selected_groups);
                   3238:     $r->print('</td></tr></table>');
1.214     www      3239:     $r->print('</td></tr></table>');
                   3240:  
                   3241:     my $sortorder=$env{'form.sortorder'};
                   3242:     unless ($sortorder) { $sortorder='realmstudent'; }
                   3243:     &sortmenu($r,$sortorder);
                   3244: 
                   3245:     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      3246: 
                   3247: # Build the list data hash from the specified parms
                   3248: 
                   3249:     my $listdata;
                   3250:     %{$listdata}=();
                   3251: 
                   3252:     foreach my $cat (@pscat) {
1.269     raeburn  3253:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
                   3254:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211     www      3255:     }
                   3256: 
1.212     www      3257:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      3258: 
1.212     www      3259: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      3260: 
                   3261: # Read modified data
                   3262: 
                   3263: 	my $resourcedata=&readdata($crs,$dom);
                   3264: 
                   3265: # List data
                   3266: 
1.214     www      3267: 	&listdata($r,$resourcedata,$listdata,$sortorder);
1.211     www      3268:     }
                   3269:     $r->print(&tableend().
1.365     albertel 3270: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
1.280     albertel 3271: 	      '</form>'.&Apache::loncommon::end_page());
1.208     www      3272: }
                   3273: 
1.269     raeburn  3274: sub secgroup_lister {
                   3275:     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
                   3276:     foreach my $item (@{$selections}) {
                   3277:         foreach my $part (@{$psprt}) {
                   3278:             my $rootparmkey=$env{'request.course.id'};
                   3279:             if (($item ne 'all') && ($item ne 'none') && ($item)) {
                   3280:                 $rootparmkey.='.['.$item.']';
                   3281:             }
                   3282:             if ($parmlev eq 'general') {
                   3283: # course-level parameter
                   3284:                 my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   3285:                 $$listdata{$newparmkey}=1;
                   3286:                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   3287:             } elsif ($parmlev eq 'map') {
                   3288: # map-level parameter
                   3289:                 foreach my $mapid (keys %{$allmaps}) {
                   3290:                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   3291:                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                   3292:                     $$listdata{$newparmkey}=1;
                   3293:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   3294:                 }
                   3295:             } else {
                   3296: # resource-level parameter
                   3297:                 foreach my $rid (@{$ids}) {
                   3298:                     my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
                   3299:                     if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
                   3300:                     my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
                   3301:                     $$listdata{$newparmkey}=1;
                   3302:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   3303:                 }
                   3304:             }
                   3305:         }
                   3306:     }
                   3307: }
                   3308: 
1.208     www      3309: sub overview {
1.280     albertel 3310:     my ($r) = @_;
1.208     www      3311:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3312:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 3313: 
                   3314:     my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298     albertel 3315:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      3316:     $r->print(<<ENDOVER);
1.280     albertel 3317: $start_page
1.208     www      3318: $breadcrumbs
1.232     albertel 3319: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208     www      3320: ENDOVER
                   3321: # Store modified
                   3322: 
                   3323:     &storedata($r,$crs,$dom);
                   3324: 
                   3325: # Read modified data
                   3326: 
                   3327:     my $resourcedata=&readdata($crs,$dom);
                   3328: 
1.214     www      3329: 
                   3330:     my $sortorder=$env{'form.sortorder'};
                   3331:     unless ($sortorder) { $sortorder='realmstudent'; }
                   3332:     &sortmenu($r,$sortorder);
                   3333: 
1.208     www      3334: # List data
                   3335: 
1.214     www      3336:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208     www      3337: 
1.145     www      3338:     $r->print(&tableend().'<p>'.
1.280     albertel 3339: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
                   3340: 	      &Apache::loncommon::end_page());
1.120     www      3341: }
1.121     www      3342: 
1.333     albertel 3343: sub clean_parameters {
                   3344:     my ($r) = @_;
                   3345:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3346:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3347: 
                   3348:     my $start_page=&Apache::loncommon::start_page('Clean Parameters');
                   3349:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean');
                   3350:     $r->print(<<ENDOVER);
                   3351: $start_page
                   3352: $breadcrumbs
                   3353: <form method="post" action="/adm/parmset?action=cleanparameters" name="parmform">
                   3354: ENDOVER
                   3355: # Store modified
                   3356: 
                   3357:     &storedata($r,$crs,$dom);
                   3358: 
                   3359: # Read modified data
                   3360: 
                   3361:     my $resourcedata=&readdata($crs,$dom);
                   3362: 
                   3363: # List data
                   3364: 
                   3365:     $r->print('<h3>'.
                   3366: 	      &mt('These parameters refer to resources that do not exist.').
                   3367: 	      '</h3>'.
1.413.6.1! raeburn  3368: 	      '<input type="submit" value="'.&mt('Delete Selected').'" />'.'<br />'.
1.333     albertel 3369: 	      '<br />');
                   3370:     $r->print(&Apache::loncommon::start_data_table().
                   3371: 	      '<tr>'.
                   3372: 	      '<th>'.&mt('Delete').'</th>'.
                   3373: 	      '<th>'.&mt('Parameter').'</th>'.
                   3374: 	      '</tr>');
                   3375:     foreach my $thiskey (sort(keys(%{$resourcedata}))) {
                   3376: 	next if (!exists($resourcedata->{$thiskey.'.type'})
                   3377: 		 && $thiskey=~/\.type$/);
                   3378: 	my %data = &parse_key($thiskey);
1.383     albertel 3379: 	if (1) { #exists($data{'realm_exists'})
                   3380: 	    #&& !$data{'realm_exists'}) {
1.333     albertel 3381: 	    $r->print(&Apache::loncommon::start_data_table_row().
                   3382: 		      '<tr>'.
                   3383: 		      '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'		      );
                   3384: 	    
                   3385: 	    $r->print('<td>');
1.362     albertel 3386: 	    my $display_value = $resourcedata->{$thiskey};
                   3387: 	    if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
                   3388: 		$display_value = 
                   3389: 		    &Apache::lonlocal::locallocaltime($display_value);
                   3390: 	    }
1.413.6.1! raeburn  3391:             my $parmitem = &standard_parameter_names($data{'parameter_name'});
        !          3392:             $parmitem = &mt($parmitem);
1.333     albertel 3393: 	    $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
1.413.6.1! raeburn  3394: 			  $parmitem,$resourcedata->{$thiskey}));
1.333     albertel 3395: 	    $r->print('<br />');
                   3396: 	    if ($data{'scope_type'} eq 'all') {
                   3397: 		$r->print(&mt('All users'));
                   3398: 	    } elsif ($data{'scope_type'} eq 'user') {
                   3399: 		$r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
                   3400: 	    } elsif ($data{'scope_type'} eq 'section') {
                   3401: 		$r->print(&mt('Section: [_1]',$data{'scope'}));
                   3402: 	    } elsif ($data{'scope_type'} eq 'group') {
                   3403: 		$r->print(&mt('Group: [_1]',$data{'scope'}));
                   3404: 	    }
                   3405: 	    $r->print('<br />');
                   3406: 	    if ($data{'realm_type'} eq 'all') {
                   3407: 		$r->print(&mt('All Resources'));
                   3408: 	    } elsif ($data{'realm_type'} eq 'folder') {
                   3409: 		$r->print(&mt('Folder: [_1]'),$data{'realm'});
                   3410: 	    } elsif ($data{'realm_type'} eq 'symb') {
                   3411: 		my ($map,$resid,$url) =
                   3412: 		    &Apache::lonnet::decode_symb($data{'realm'});
                   3413: 		$r->print(&mt('Resource: [_1] <br />&nbsp;&nbsp;&nbsp;with ID: [_2] <br />&nbsp;&nbsp;&nbsp;in folder [_3]',
                   3414: 			      $url,$resid,$map));
                   3415: 	    }
1.362     albertel 3416: 	    $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));
1.333     albertel 3417: 	    $r->print('</td></tr>');
                   3418: 	
                   3419: 	}
                   3420:     }
                   3421:     $r->print(&Apache::loncommon::end_data_table().'<p>'.
1.413.6.1! raeburn  3422: 	      '<input type="submit" value="'.&mt('Delete Selected').'" />'.
1.333     albertel 3423: 	      '</p></form>'.
                   3424: 	      &Apache::loncommon::end_page());
                   3425: }
                   3426: 
1.390     www      3427: sub date_shift_one {
                   3428:     my ($r) = @_;
                   3429:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3430:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3431: 
                   3432:     my $start_page=&Apache::loncommon::start_page('Shift Dates');
                   3433:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
                   3434:     $r->print(<<ENDOVER);
                   3435: $start_page
                   3436: $breadcrumbs
                   3437: ENDOVER
                   3438:     $r->print('<form name="shiftform" method="post">'.
                   3439:               '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
                   3440:               &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
                   3441:               '<tr><td>'.&mt('Shifted date:').'</td><td>'.
                   3442:                     &Apache::lonhtmlcommon::date_setter('shiftform',
                   3443:                                                         'timeshifted',
                   3444:                                                         $env{'form.timebase'},,
                   3445:                                                         '').
                   3446:               '</td></tr></table>'.
                   3447:               '<input type="hidden" name="action" value="dateshift2" />'.
                   3448:               '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
                   3449:               '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
                   3450:     $r->print(&Apache::loncommon::end_page());
                   3451: }
                   3452: 
                   3453: sub date_shift_two {
                   3454:     my ($r) = @_;
                   3455:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3456:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3457:     my $start_page=&Apache::loncommon::start_page('Shift Dates');
                   3458:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
                   3459:     $r->print(<<ENDOVER);
                   3460: $start_page
                   3461: $breadcrumbs
                   3462: ENDOVER
                   3463:     my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
                   3464:     $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
                   3465:               &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
                   3466:               &Apache::lonlocal::locallocaltime($timeshifted)));
                   3467:     my $delta=$timeshifted-$env{'form.timebase'};
                   3468:     &dateshift($delta);
                   3469:     $r->print(&Apache::loncommon::end_page());
                   3470: }
                   3471: 
1.333     albertel 3472: sub parse_key {
                   3473:     my ($key) = @_;
                   3474:     my %data;
                   3475:     my ($middle,$part,$name)=
                   3476: 	($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
                   3477:     $data{'scope_type'} = 'all';
                   3478:     if ($middle=~/^\[(.*)\]/) {
                   3479:        	$data{'scope'} = $1;
1.350     albertel 3480: 	if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
1.333     albertel 3481: 	    $data{'scope_type'} = 'user';
                   3482: 	    $data{'scope'} = [$1,$2];
                   3483: 	} else {
                   3484: 	    #FIXME check for group scope
                   3485: 	    $data{'scope_type'} = 'section';
                   3486: 	}
                   3487: 	$middle=~s/^\[(.*)\]//;
                   3488:     }
                   3489:     $middle=~s/\.+$//;
                   3490:     $middle=~s/^\.+//;
                   3491:     $data{'realm_type'}='all';
                   3492:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
                   3493: 	$data{'realm'} = $1;
                   3494: 	$data{'realm_type'} = 'folder';
                   3495: 	$data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
                   3496: 	($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
                   3497:     } elsif ($middle) {
                   3498: 	$data{'realm'} = $middle;
                   3499: 	$data{'realm_type'} = 'symb';
                   3500: 	$data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
                   3501: 	my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
                   3502: 	$data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
                   3503:     }
                   3504:     
                   3505:     $data{'parameter_part'} = $part;
                   3506:     $data{'parameter_name'} = $name;
                   3507: 
                   3508:     return %data;
                   3509: }
                   3510: 
1.59      matthew  3511: ##################################################
                   3512: ##################################################
1.333     albertel 3513: 
1.178     raeburn  3514: =pod
1.239     raeburn  3515: 
                   3516: =item check_cloners
                   3517: 
                   3518: Checks if new users included in list of allowed cloners
                   3519: are valid users.  Replaces supplied list with 
                   3520: cleaned list containing only users with valid usernames
                   3521: and domains.
                   3522: 
                   3523: Inputs: $clonelist, $oldcloner 
                   3524: where $clonelist is ref to array of requested cloners,
                   3525: and $oldcloner is ref to array of currently allowed
                   3526: cloners.
                   3527: 
                   3528: Returns: string - comma separated list of requested
                   3529: cloners (username:domain) who do not exist in system.
                   3530: 
                   3531: =item change_clone
                   3532: 
1.178     raeburn  3533: Modifies the list of courses a user can clone (stored
1.239     raeburn  3534: in the user's environment.db file), called when a
1.178     raeburn  3535: change is made to the list of users allowed to clone
                   3536: a course.
1.239     raeburn  3537: 
1.178     raeburn  3538: Inputs: $action,$cloner
                   3539: where $action is add or drop, and $cloner is identity of 
                   3540: user for whom cloning ability is to be changed in course. 
                   3541: 
                   3542: =cut
1.380     albertel 3543: 
1.178     raeburn  3544: ##################################################
                   3545: ##################################################
                   3546: 
1.239     raeburn  3547: sub extract_cloners {
                   3548:     my ($clonelist,$allowclone) = @_;
                   3549:     if ($clonelist =~ /,/) {
1.380     albertel 3550:         @{$allowclone} = split(/,/,$clonelist);
1.239     raeburn  3551:     } else {
                   3552:         $$allowclone[0] = $clonelist;
                   3553:     }
                   3554: }
                   3555: 
                   3556: sub check_cloners {
                   3557:     my ($clonelist,$oldcloner) = @_;
1.379     raeburn  3558:     my ($clean_clonelist,%disallowed);
1.239     raeburn  3559:     my @allowclone = ();
                   3560:     &extract_cloners($$clonelist,\@allowclone);
                   3561:     foreach my $currclone (@allowclone) {
1.380     albertel 3562:         if (!grep(/^\Q$currclone\E$/,@$oldcloner)) {
1.379     raeburn  3563:             if ($currclone eq '*') {
                   3564:                 $clean_clonelist .= $currclone.',';
                   3565:             } else {
                   3566:                 my ($uname,$udom) = split(/:/,$currclone);
                   3567:                 if ($uname eq '*') {
                   3568:                     if ($udom =~ /^$match_domain$/) {
1.380     albertel 3569:                         if (!&Apache::lonnet::domain($udom)) {
1.379     raeburn  3570:                             $disallowed{'domain'} .= $currclone.',';
                   3571:                         } else {
                   3572:                             $clean_clonelist .= $currclone.',';
                   3573:                         }
                   3574:                     } else {
                   3575:                         $disallowed{'format'} .= $currclone.',';
                   3576:                     }
                   3577:                 } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {
                   3578:                     $disallowed{'format'} .= $currclone.','; 
1.239     raeburn  3579:                 } else {
1.379     raeburn  3580:                     if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   3581:                         $disallowed{'newuser'} .= $currclone.',';
                   3582:                     } else {
                   3583:                         $clean_clonelist .= $currclone.',';
                   3584:                     }
1.239     raeburn  3585:                 }
                   3586:             }
                   3587:         } else {
                   3588:             $clean_clonelist .= $currclone.',';
                   3589:         }
                   3590:     }
1.379     raeburn  3591:     foreach my $key (keys(%disallowed)) {
                   3592:         $disallowed{$key} =~ s/,$//;
1.239     raeburn  3593:     }
                   3594:     if ($clean_clonelist) {
                   3595:         $clean_clonelist =~ s/,$//;
                   3596:     }
                   3597:     $$clonelist = $clean_clonelist;
1.379     raeburn  3598:     return %disallowed;
                   3599: }
1.178     raeburn  3600: 
                   3601: sub change_clone {
                   3602:     my ($clonelist,$oldcloner) = @_;
                   3603:     my ($uname,$udom);
1.190     albertel 3604:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3605:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  3606:     my $clone_crs = $cnum.':'.$cdom;
                   3607:     
                   3608:     if ($cnum && $cdom) {
1.239     raeburn  3609:         my @allowclone;
                   3610:         &extract_cloners($clonelist,\@allowclone);
1.178     raeburn  3611:         foreach my $currclone (@allowclone) {
1.380     albertel 3612:             if (!grep(/^$currclone$/,@$oldcloner)) {
1.379     raeburn  3613:                 if ($currclone ne '*') {
1.380     albertel 3614:                     ($uname,$udom) = split(/:/,$currclone);
1.379     raeburn  3615:                     if ($uname && $udom && $uname ne '*') {
                   3616:                         if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                   3617:                             my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   3618:                             if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   3619:                                 if ($currclonecrs{'cloneable'} eq '') {
                   3620:                                     $currclonecrs{'cloneable'} = $clone_crs;
                   3621:                                 } else {
                   3622:                                     $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   3623:                                 }
                   3624:                                 &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
1.178     raeburn  3625:                             }
                   3626:                         }
                   3627:                     }
                   3628:                 }
                   3629:             }
                   3630:         }
                   3631:         foreach my $oldclone (@$oldcloner) {
1.380     albertel 3632:             if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
1.379     raeburn  3633:                 if ($oldclone ne '*') {
1.380     albertel 3634:                     ($uname,$udom) = split(/:/,$oldclone);
1.379     raeburn  3635:                     if ($uname && $udom && $uname ne '*' ) {
                   3636:                         if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                   3637:                             my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   3638:                             my %newclonecrs = ();
                   3639:                             if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   3640:                                 if ($currclonecrs{'cloneable'} =~ /,/) {
                   3641:                                     my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   3642:                                     foreach my $crs (@currclonecrs) {
                   3643:                                         if ($crs ne $clone_crs) {
                   3644:                                             $newclonecrs{'cloneable'} .= $crs.',';
                   3645:                                         }
1.178     raeburn  3646:                                     }
1.379     raeburn  3647:                                     $newclonecrs{'cloneable'} =~ s/,$//;
                   3648:                                 } else {
                   3649:                                     $newclonecrs{'cloneable'} = '';
1.178     raeburn  3650:                                 }
1.379     raeburn  3651:                                 &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
1.178     raeburn  3652:                             }
                   3653:                         }
                   3654:                     }
                   3655:                 }
                   3656:             }
                   3657:         }
                   3658:     }
                   3659: }
                   3660: 
1.193     albertel 3661: 
                   3662: ##################################################
                   3663: ##################################################
                   3664: 
                   3665: =pod
                   3666: 
                   3667: =item * header
                   3668: 
                   3669: Output html header for page
                   3670: 
                   3671: =cut
                   3672: 
                   3673: ##################################################
                   3674: ##################################################
                   3675: sub header {
1.280     albertel 3676:     return &Apache::loncommon::start_page('Parameter Manager');
1.193     albertel 3677: }
                   3678: ##################################################
                   3679: ##################################################
                   3680: sub print_main_menu {
                   3681:     my ($r,$parm_permission)=@_;
                   3682:     #
                   3683:     $r->print(<<ENDMAINFORMHEAD);
                   3684: <form method="post" enctype="multipart/form-data"
                   3685:       action="/adm/parmset" name="studentform">
                   3686: ENDMAINFORMHEAD
                   3687: #
1.195     albertel 3688:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3689:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268     albertel 3690:     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
1.366     albertel 3691:     my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
1.268     albertel 3692: 
1.193     albertel 3693:     my @menu =
1.322     www      3694:         ( { divider=>'Settings for Your Course',
                   3695: 	  },
1.323     albertel 3696:           { text => 'Set Course Environment',
1.204     www      3697: 	    action => 'crsenv',
1.193     albertel 3698:             permission => $parm_permission,
1.324     www      3699:             help => 'Course_Environment',
1.193     albertel 3700:             },
1.255     banghart 3701:           { text => 'Set Portfolio Metadata',
1.259     banghart 3702: 	    action => 'setrestrictmeta',
1.240     banghart 3703:             permission => $parm_permission,
                   3704:             },
1.271     www      3705: 	  { text => 'Manage Course Slots',
1.268     albertel 3706: 	    url => '/adm/slotrequest?command=showslots',
                   3707: 	    permission => $vgr,
                   3708:             },
1.366     albertel 3709: 	  { text => 'Reset Student Access Times',
                   3710: 	    url => '/adm/helper/resettimes.helper',
                   3711: 	    permission => $mgr,
                   3712:             },
                   3713: 
1.322     www      3714:           { text => 'Set Parameter Setting Default Actions',
                   3715:             action => 'setdefaults',
                   3716:             permission => $parm_permission,
                   3717:             },          
                   3718: 	  { divider => 'New and Existing Parameter Settings for Your Resources',
1.268     albertel 3719: 	    },
1.216     www      3720:           { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193     albertel 3721:             url => '/adm/helper/parameter.helper',
                   3722:             permission => $parm_permission,
1.324     www      3723:             help => 'Parameter_Helper',
1.193     albertel 3724:             },
1.322     www      3725:  	  { text => 'Set/Modify Resource Parameters - Overview Mode',
1.208     www      3726:             action => 'newoverview',
                   3727:             permission => $parm_permission,
1.324     www      3728:             help => 'Parameter_Overview',
1.193     albertel 3729:             },
1.216     www      3730:           { text => 'Set/Modify Resource Parameters - Table Mode',
1.193     albertel 3731:             action => 'settable',
                   3732:             permission => $parm_permission,
1.324     www      3733:             help => 'Table_Mode',
1.193     albertel 3734:             },
1.322     www      3735:            { divider => 'Existing Parameter Settings for Your Resources',
                   3736: 	  },
                   3737: 	  { text => 'Modify Resource Parameters - Overview Mode',
                   3738:             action => 'setoverview',
1.220     www      3739:             permission => $parm_permission,
1.324     www      3740:             help => 'Parameter_Overview',
1.322     www      3741:  	    },          
1.292     www      3742: 	  { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284     www      3743:             action => 'parameterchangelog',
                   3744:             permission => $parm_permission,
1.220     www      3745:             },
1.193     albertel 3746:           );
                   3747:     my $menu_html = '';
                   3748:     foreach my $menu_item (@menu) {
1.268     albertel 3749: 	if ($menu_item->{'divider'}) {
1.322     www      3750: 	    $menu_html .= '<h3>'.&mt($menu_item->{'divider'}).'</h3>';
1.268     albertel 3751: 	    next;
                   3752: 	}
1.193     albertel 3753:         next if (! $menu_item->{'permission'});
                   3754:         $menu_html.='<p>';
1.316     albertel 3755:         $menu_html.='<span class="LC_parm_menu_item">';
1.193     albertel 3756:         if (exists($menu_item->{'url'})) {
                   3757:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   3758:         } else {
                   3759:             $menu_html.=
                   3760:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   3761:         }
1.316     albertel 3762:         $menu_html.= &mt($menu_item->{'text'}).'</a></span>';
1.193     albertel 3763:         if (exists($menu_item->{'help'})) {
                   3764:             $menu_html.=
                   3765:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   3766:         }
                   3767:         $menu_html.='</p>'.$/;
                   3768:     }
                   3769:     $r->print($menu_html);
                   3770:     return;
                   3771: }
1.255     banghart 3772: ### Set portfolio metadata
1.252     banghart 3773: sub output_row {
1.347     banghart 3774:     my ($r, $field_name, $field_text, $added_flag) = @_;
1.252     banghart 3775:     my $output;
1.263     banghart 3776:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3777:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337     banghart 3778:     if (!defined($options)) {
1.254     banghart 3779:         $options = 'active,stuadd';
1.261     banghart 3780:         $values = '';
1.252     banghart 3781:     }
1.337     banghart 3782:     if (!($options =~ /deleted/)) {
                   3783:         my @options= ( ['active', 'Show to student'],
1.351     banghart 3784:                     ['stuadd', 'Provide text area for students to type catalog information'],
                   3785:                     ['choices','Provide choices for students to select from']);
                   3786: #		   ['onlyone','Student may select only one choice']);
1.337     banghart 3787:         if ($added_flag) {
                   3788:             push @options,['deleted', 'Delete Metadata Field'];
                   3789:         }
1.351     banghart 3790:        $output = &Apache::loncommon::start_data_table_row();
                   3791:         $output .= '<td><span class="LC_metadata"><strong>'.$field_text.':</strong></span></td>';
                   3792:         $output .= &Apache::loncommon::end_data_table_row();
1.337     banghart 3793:         foreach my $opt (@options) {
                   3794: 	    my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
1.347     banghart 3795: 	    $output .= &Apache::loncommon::continue_data_table_row();
1.351     banghart 3796: 	    $output .= '<td>'.('&nbsp;' x 5).'<span class="LC_metadata"><label>
                   3797: 	               <input type="checkbox" name="'.
                   3798: 	               $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3799: 	               &mt($opt->[1]).'</label></span> </td>';
1.347     banghart 3800: 	    $output .= &Apache::loncommon::end_data_table_row();
1.337     banghart 3801: 	}
1.351     banghart 3802:         $output .= &Apache::loncommon::continue_data_table_row();
                   3803:         $output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata"><input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></span></td>';
                   3804:         $output .= &Apache::loncommon::end_data_table_row();
                   3805:         my $multiple_checked;
                   3806:         my $single_checked;
                   3807:         if ($options =~ m/onlyone/) {
1.413.6.1! raeburn  3808:             $multiple_checked = '';
        !          3809:             $single_checked = ' checked="checked"';
1.351     banghart 3810:         } else {
1.413.6.1! raeburn  3811:             $multiple_checked = ' checked="checked"';
        !          3812:             $single_checked = '';
1.351     banghart 3813:         }
                   3814: 	$output .= &Apache::loncommon::continue_data_table_row();
                   3815: 	$output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata">
1.413.6.1! raeburn  3816: 	            <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
        !          3817: 	            '.&mt('Student may select multiple choices from list').'</span></td>';
1.351     banghart 3818: 	$output .= &Apache::loncommon::end_data_table_row();
                   3819: 	$output .= &Apache::loncommon::continue_data_table_row();
                   3820: 	$output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata">
                   3821: 	            <input type="radio" name="'.$field_name.'_onlyone"  value="single" '.$single_checked.'/>
1.413.6.1! raeburn  3822: 	            '.&mt('Student may select only one choice from list').'</span></td>';
1.351     banghart 3823: 	$output .= &Apache::loncommon::end_data_table_row();
1.252     banghart 3824:     }
                   3825:     return ($output);
                   3826: }
1.340     banghart 3827: sub order_meta_fields {
                   3828:     my ($r)=@_;
                   3829:     my $idx = 1;
                   3830:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3831:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.341     banghart 3832:     $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.345     banghart 3833:     &Apache::lonhtmlcommon::add_breadcrumb
                   3834:             ({href=>"/adm/parmset?action=setrestrictmeta",
                   3835:               text=>"Restrict Metadata"},
                   3836:              {text=>"Order Metadata"});
                   3837:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.340     banghart 3838:     if ($env{'form.storeorder'}) {
                   3839:         my $newpos = $env{'form.newpos'} - 1;
                   3840:         my $currentpos = $env{'form.currentpos'} - 1;
                   3841:         my @neworder = ();
                   3842:         my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
                   3843:         my $i;
1.341     banghart 3844:         if ($newpos > $currentpos) {
1.340     banghart 3845:         # moving stuff up
                   3846:             for ($i=0;$i<$currentpos;$i++) {
                   3847:         	$neworder[$i]=$oldorder[$i];
                   3848:             }
                   3849:             for ($i=$currentpos;$i<$newpos;$i++) {
                   3850:         	$neworder[$i]=$oldorder[$i+1];
                   3851:             }
                   3852:             $neworder[$newpos]=$oldorder[$currentpos];
                   3853:             for ($i=$newpos+1;$i<=$#oldorder;$i++) {
                   3854:         	$neworder[$i]=$oldorder[$i];
                   3855:             }
                   3856:         } else {
                   3857:         # moving stuff down
                   3858:     	    for ($i=0;$i<$newpos;$i++) {
                   3859:     	        $neworder[$i]=$oldorder[$i];
                   3860:     	    }
                   3861:     	    $neworder[$newpos]=$oldorder[$currentpos];
                   3862:     	    for ($i=$newpos+1;$i<$currentpos+1;$i++) {
                   3863:     	        $neworder[$i]=$oldorder[$i-1];
                   3864:     	    }
                   3865:     	    for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
                   3866:     	        $neworder[$i]=$oldorder[$i];
                   3867:     	    }
                   3868:         }
                   3869: 	my $ordered_fields = join ",", @neworder;
1.343     banghart 3870:         my $put_result = &Apache::lonnet::put('environment',
                   3871:                            {'metadata.addedorder'=>$ordered_fields},$dom,$crs); 	
1.393     raeburn  3872: 	&Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
1.340     banghart 3873:     }
1.357     raeburn  3874:     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341     banghart 3875:     my $ordered_fields;
1.340     banghart 3876:     my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
                   3877:     if (!@fields_in_order) {
                   3878:         # no order found, pick sorted order then create metadata.addedorder key.
                   3879:         foreach my $key (sort keys %$fields) {
                   3880:             push @fields_in_order, $key;
1.341     banghart 3881:             $ordered_fields = join ",", @fields_in_order;
1.340     banghart 3882:         }
1.341     banghart 3883:         my $put_result = &Apache::lonnet::put('environment',
                   3884:                             {'metadata.addedorder'=>$ordered_fields},$dom,$crs); 
                   3885:     } 
1.340     banghart 3886:     $r->print('<table>');
                   3887:     my $num_fields = scalar(@fields_in_order);
                   3888:     foreach my $key (@fields_in_order) {
                   3889:         $r->print('<tr><td>');
                   3890:         $r->print('<form method="post" action="">');
                   3891:         $r->print('<select name="newpos" onChange="this.form.submit()">');
                   3892:         for (my $i = 1;$i le $num_fields;$i ++) {
                   3893:             if ($i eq $idx) {
                   3894:                 $r->print('<option value="'.$i.'"  SELECTED>('.$i.')</option>');
                   3895:             } else {
                   3896:                 $r->print('<option value="'.$i.'">'.$i.'</option>');
                   3897:             }
                   3898:         }
                   3899:         $r->print('</select></td><td>');
                   3900:         $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
                   3901:         $r->print('<input type="hidden" name="storeorder" value="true" />');
                   3902:         $r->print('</form>');
                   3903:         $r->print($$fields{$key}.'</td></tr>');
                   3904:         $idx ++;
                   3905:     }
                   3906:     $r->print('</table>');
                   3907:     return 'ok';
                   3908: }
1.359     banghart 3909: sub continue {
                   3910:     my $output;
                   3911:     $output .= '<form action="" method="post">';
                   3912:     $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
                   3913:     $output .= '<input type="submit" value="Continue" />';
                   3914:     return ($output);
                   3915: }
1.334     banghart 3916: sub addmetafield {
                   3917:     my ($r)=@_;
                   3918:     $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
                   3919:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335     banghart 3920:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3921:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.339     banghart 3922:     if (exists($env{'form.undelete'})) {
1.358     banghart 3923:         my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339     banghart 3924:         foreach my $meta_field(@meta_fields) {
                   3925:             my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
                   3926:             $options =~ s/deleted//;
                   3927:             $options =~ s/,,/,/;
                   3928:             my $put_result = &Apache::lonnet::put('environment',
                   3929:                                         {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
                   3930:                                         
                   3931:             $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
                   3932:         }
1.359     banghart 3933:         $r->print(&continue());
1.339     banghart 3934:     } elsif (exists($env{'form.fieldname'})) {
1.335     banghart 3935:         my $meta_field = $env{'form.fieldname'};
                   3936:         my $display_field = $env{'form.fieldname'};
                   3937:         $meta_field =~ s/\W/_/g;
1.338     banghart 3938:         $meta_field =~ tr/A-Z/a-z/;
1.335     banghart 3939:         my $put_result = &Apache::lonnet::put('environment',
                   3940:                             {'metadata.'.$meta_field.'.values'=>"",
                   3941:                              'metadata.'.$meta_field.'.added'=>"$display_field",
                   3942:                              'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359     banghart 3943:         $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
                   3944:         $r->print(&continue());
1.335     banghart 3945:     } else {
1.357     raeburn  3946:         my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339     banghart 3947:         if ($fields) {
                   3948:             $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
                   3949:             $r->print('<form method="post" action="">');
                   3950:             foreach my $key(keys(%$fields)) {
1.358     banghart 3951:                 $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339     banghart 3952:             }
                   3953:             $r->print('<input type="submit" name="undelete" value="Undelete" />');
                   3954:             $r->print('</form>');
                   3955:         }
                   3956:         $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"');
1.335     banghart 3957:         $r->print('<input type="text" name="fieldname" /><br />');
                   3958:         $r->print('<input type="submit" value="Add Metadata Field" />');
1.334     banghart 3959:     }
1.361     albertel 3960:     $r->print('</form>');
1.334     banghart 3961: }
1.259     banghart 3962: sub setrestrictmeta {
1.240     banghart 3963:     my ($r)=@_;
1.242     banghart 3964:     my $next_meta;
1.244     banghart 3965:     my $output;
1.245     banghart 3966:     my $item_num;
1.246     banghart 3967:     my $put_result;
1.280     albertel 3968:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 3969:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 3970:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3971:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259     banghart 3972:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 3973:     my $save_field = '';
1.259     banghart 3974:     if ($env{'form.restrictmeta'}) {
1.254     banghart 3975:         foreach my $field (sort(keys(%env))) {
1.252     banghart 3976:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 3977:                 my $options;
1.252     banghart 3978:                 my $meta_field = $1;
                   3979:                 my $meta_key = $2;
1.253     banghart 3980:                 if ($save_field ne $meta_field) {
1.252     banghart 3981:                     $save_field = $meta_field;
1.253     banghart 3982:             	    if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254     banghart 3983:             	        $options.='stuadd,';
                   3984:             	    } 
1.351     banghart 3985:             	    if ($env{'form.'.$meta_field.'_choices'}) {
                   3986:             	        $options.='choices,';
                   3987:             	    } 
                   3988:             	    if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
1.254     banghart 3989:             	        $options.='onlyone,';
                   3990:             	    } 
                   3991:             	    if ($env{'form.'.$meta_field.'_active'}) {
                   3992:             	        $options.='active,';
1.253     banghart 3993:             	    }
1.337     banghart 3994:             	    if ($env{'form.'.$meta_field.'_deleted'}) {
                   3995:             	        $options.='deleted,';
                   3996:             	    }
1.259     banghart 3997:                     my $name = $save_field;
1.253     banghart 3998:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 3999:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   4000:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 4001:                                                    },$dom,$crs);
1.252     banghart 4002:                 }
                   4003:             }
                   4004:         }
                   4005:     }
1.296     albertel 4006:     &Apache::lonnet::coursedescription($env{'request.course.id'},
                   4007: 				       {'freshen_cache' => 1});
1.335     banghart 4008:     # Get the default metadata fields
1.258     albertel 4009:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335     banghart 4010:     # Now get possible added metadata fields
1.357     raeburn  4011:     my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346     banghart 4012:     my $row_alt = 1;
1.347     banghart 4013:     $output .= &Apache::loncommon::start_data_table();
1.258     albertel 4014:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 4015:         if ($field ne 'courserestricted') {
1.346     banghart 4016:             $row_alt = $row_alt ? 0 : 1;
1.347     banghart 4017: 	    $output.= &output_row($r, $field, $metadata_fields{$field});
1.265     banghart 4018: 	}
1.255     banghart 4019:     }
1.351     banghart 4020:     my $buttons = (<<ENDButtons);
                   4021:         <input type="submit" name="restrictmeta" value="Save" />
                   4022:         </form><br />
                   4023:         <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
                   4024:         <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
                   4025:         </form>
                   4026:         <br />
                   4027:         <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
                   4028:         <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
                   4029: ENDButtons
1.337     banghart 4030:     my $added_flag = 1;
1.335     banghart 4031:     foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346     banghart 4032:         $row_alt = $row_alt ? 0 : 1;
                   4033:         $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335     banghart 4034:     }
1.347     banghart 4035:     $output .= &Apache::loncommon::end_data_table();
1.244     banghart 4036:     $r->print(<<ENDenv);       
1.259     banghart 4037:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 4038:         $output
1.351     banghart 4039:         $buttons
1.340     banghart 4040:         </form>
1.244     banghart 4041: ENDenv
1.280     albertel 4042:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 4043:     return 'ok';
                   4044: }
1.220     www      4045: ##################################################
1.335     banghart 4046: sub get_added_meta_fieldnames {
1.357     raeburn  4047:     my ($cid) = @_;
1.335     banghart 4048:     my %fields;
                   4049:     foreach my $key(%env) {
1.357     raeburn  4050:         if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335     banghart 4051:             my $field_name = $1;
                   4052:             my ($display_field_name) = $env{$key};
                   4053:             $fields{$field_name} = $display_field_name;
                   4054:         }
                   4055:     }
                   4056:     return \%fields;
                   4057: }
1.339     banghart 4058: sub get_deleted_meta_fieldnames {
1.357     raeburn  4059:     my ($cid) = @_;
1.339     banghart 4060:     my %fields;
                   4061:     foreach my $key(%env) {
1.357     raeburn  4062:         if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339     banghart 4063:             my $field_name = $1;
                   4064:             if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
                   4065:                 my ($display_field_name) = $env{$key};
                   4066:                 $fields{$field_name} = $display_field_name;
                   4067:             }
                   4068:         }
                   4069:     }
                   4070:     return \%fields;
                   4071: }
1.220     www      4072: sub defaultsetter {
1.280     albertel 4073:     my ($r) = @_;
                   4074: 
                   4075:     my $start_page = 
                   4076: 	&Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 4077:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220     www      4078:     $r->print(<<ENDDEFHEAD);
1.280     albertel 4079: $start_page
1.220     www      4080: $breadcrumbs
                   4081: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
                   4082: ENDDEFHEAD
1.280     albertel 4083: 
                   4084:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   4085:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221     www      4086:     my @ids=();
                   4087:     my %typep=();
                   4088:     my %keyp=();
                   4089:     my %allparms=();
                   4090:     my %allparts=();
                   4091:     my %allmaps=();
                   4092:     my %mapp=();
                   4093:     my %symbp=();
                   4094:     my %maptitles=();
                   4095:     my %uris=();
                   4096:     my %keyorder=&standardkeyorder();
                   4097:     my %defkeytype=();
                   4098: 
                   4099:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   4100: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   4101: 				\%keyorder,\%defkeytype);
1.224     www      4102:     if ($env{'form.storerules'}) {
                   4103: 	my %newrules=();
                   4104: 	my @delrules=();
1.226     www      4105: 	my %triggers=();
1.225     albertel 4106: 	foreach my $key (keys(%env)) {
                   4107:             if ($key=~/^form\.(\w+)\_action$/) {
1.224     www      4108: 		my $tempkey=$1;
1.226     www      4109: 		my $action=$env{$key};
                   4110:                 if ($action) {
                   4111: 		    $newrules{$tempkey.'_action'}=$action;
                   4112: 		    if ($action ne 'default') {
                   4113: 			my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   4114: 			$triggers{$whichparm}.=$tempkey.':';
                   4115: 		    }
                   4116: 		    $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224     www      4117: 		    if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      4118: 			$newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224     www      4119: 			$newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   4120: 			$newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   4121: 			$newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   4122: 		    } else {
                   4123: 			$newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227     www      4124: 			$newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224     www      4125: 		    }
                   4126: 		} else {
1.225     albertel 4127: 		    push(@delrules,$tempkey.'_action');
1.226     www      4128: 		    push(@delrules,$tempkey.'_type');
1.225     albertel 4129: 		    push(@delrules,$tempkey.'_hours');
                   4130: 		    push(@delrules,$tempkey.'_min');
                   4131: 		    push(@delrules,$tempkey.'_sec');
                   4132: 		    push(@delrules,$tempkey.'_value');
1.224     www      4133: 		}
                   4134: 	    }
                   4135: 	}
1.226     www      4136: 	foreach my $key (keys %allparms) {
                   4137: 	    $newrules{$key.'_triggers'}=$triggers{$key};
                   4138: 	}
1.224     www      4139: 	&Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
                   4140: 	&Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
                   4141: 	&resetrulescache();
                   4142:     }
1.227     www      4143:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                   4144: 				       'hours' => 'Hours',
1.221     www      4145: 				       'min' => 'Minutes',
                   4146: 				       'sec' => 'Seconds',
                   4147: 				       'yes' => 'Yes',
                   4148: 				       'no' => 'No');
1.222     www      4149:     my @standardoptions=('','default');
                   4150:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   4151:     my @dateoptions=('','default');
                   4152:     my @datedisplay=('',&mt('Default value when manually setting'));
                   4153:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
                   4154: 	unless ($tempkey) { next; }
                   4155: 	push @standardoptions,'when_setting_'.$tempkey;
                   4156: 	push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   4157: 	if (&isdateparm($defkeytype{$tempkey})) {
                   4158: 	    push @dateoptions,'later_than_'.$tempkey;
                   4159: 	    push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   4160: 	    push @dateoptions,'earlier_than_'.$tempkey;
                   4161: 	    push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   4162: 	} 
                   4163:     }
1.231     www      4164: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
                   4165: 	  &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318     albertel 4166:     $r->print("\n".&Apache::loncommon::start_data_table().
                   4167: 	      &Apache::loncommon::start_data_table_header_row().
                   4168: 	      "<th>".&mt('Rule for parameter').'</th><th>'.
                   4169: 	      &mt('Action').'</th><th>'.&mt('Value').'</th>'.
                   4170: 	      &Apache::loncommon::end_data_table_header_row());
1.221     www      4171:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222     www      4172: 	unless ($tempkey) { next; }
1.318     albertel 4173: 	$r->print("\n".&Apache::loncommon::start_data_table_row().
                   4174: 		  "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222     www      4175: 	my $action=&rulescache($tempkey.'_action');
                   4176: 	$r->print('<select name="'.$tempkey.'_action">');
                   4177: 	if (&isdateparm($defkeytype{$tempkey})) {
                   4178: 	    for (my $i=0;$i<=$#dateoptions;$i++) {
                   4179: 		if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   4180: 		$r->print("\n<option value='$dateoptions[$i]'".
                   4181: 			  ($dateoptions[$i] eq $action?' selected="selected"':'').
                   4182: 			  ">$datedisplay[$i]</option>");
                   4183: 	    }
                   4184: 	} else {
                   4185: 	    for (my $i=0;$i<=$#standardoptions;$i++) {
                   4186: 		if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   4187: 		$r->print("\n<option value='$standardoptions[$i]'".
                   4188: 			  ($standardoptions[$i] eq $action?' selected="selected"':'').
                   4189: 			  ">$standarddisplay[$i]</option>");
                   4190: 	    }
                   4191: 	}
                   4192: 	$r->print('</select>');
1.227     www      4193: 	unless (&isdateparm($defkeytype{$tempkey})) {
                   4194: 	    $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   4195: 		      '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   4196: 	}
1.222     www      4197: 	$r->print("\n</td><td>\n");
                   4198: 
1.221     www      4199:         if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      4200: 	    my $days=&rulescache($tempkey.'_days');
1.222     www      4201: 	    my $hours=&rulescache($tempkey.'_hours');
                   4202: 	    my $min=&rulescache($tempkey.'_min');
                   4203: 	    my $sec=&rulescache($tempkey.'_sec');
1.221     www      4204: 	    $r->print(<<ENDINPUTDATE);
1.227     www      4205: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      4206: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   4207: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   4208: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      4209: ENDINPUTDATE
                   4210: 	} elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      4211:             my $yeschecked='';
                   4212:             my $nochecked='';
                   4213:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
                   4214:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
                   4215: 
1.221     www      4216: 	    $r->print(<<ENDYESNO);
1.224     www      4217: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
                   4218: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221     www      4219: ENDYESNO
                   4220:         } else {
1.224     www      4221: 	    $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221     www      4222: 	}
1.318     albertel 4223:         $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221     www      4224:     }
1.318     albertel 4225:     $r->print(&Apache::loncommon::end_data_table().
                   4226: 	      "\n<input type='submit' name='storerules' value='".
1.365     albertel 4227: 	      &mt('Save Rules')."' /></form>\n".
1.280     albertel 4228: 	      &Apache::loncommon::end_page());
1.220     www      4229:     return;
                   4230: }
1.193     albertel 4231: 
1.290     www      4232: sub components {
1.330     albertel 4233:     my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
                   4234: 
                   4235:     if ($typeflag) {
1.290     www      4236: 	$key=~s/\.type$//;
                   4237:     }
1.330     albertel 4238: 
                   4239:     my ($middle,$part,$name)=
                   4240: 	($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291     www      4241:     my $issection;
1.330     albertel 4242: 
1.290     www      4243:     my $section=&mt('All Students');
                   4244:     if ($middle=~/^\[(.*)\]/) {
1.291     www      4245: 	$issection=$1;
                   4246: 	$section=&mt('Group/Section').': '.$issection;
1.290     www      4247: 	$middle=~s/^\[(.*)\]//;
                   4248:     }
                   4249:     $middle=~s/\.+$//;
                   4250:     $middle=~s/^\.+//;
1.291     www      4251:     if ($uname) {
                   4252: 	$section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   4253: 	$issection='';
                   4254:     }
1.316     albertel 4255:     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.304     www      4256:     my $realmdescription=&mt('all resources'); 
1.290     www      4257:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316     albertel 4258: 	$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      4259:  	$realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
                   4260:    } elsif ($middle) {
1.290     www      4261: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316     albertel 4262: 	$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      4263: 	$realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      4264:     }
1.291     www      4265:     my $what=$part.'.'.$name;
1.330     albertel 4266:     return ($realm,$section,$name,$part,
1.304     www      4267: 	    $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      4268: }
1.293     www      4269: 
1.328     albertel 4270: my %standard_parms;
                   4271: sub load_parameter_names {
                   4272:     open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
                   4273:     while (my $configline=<$config>) {
                   4274: 	if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
                   4275: 	chomp($configline);
                   4276: 	my ($short,$plain)=split(/:/,$configline);
                   4277: 	my (undef,$name,$type)=split(/\&/,$short,3);
                   4278: 	if ($type eq 'display') {
                   4279: 	    $standard_parms{$name} = $plain;
                   4280: 	}
                   4281:     }
                   4282:     close($config);
                   4283:     $standard_parms{'int_pos'}      = 'Positive Integer';
                   4284:     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
                   4285: }
                   4286: 
1.292     www      4287: sub standard_parameter_names {
                   4288:     my ($name)=@_;
1.328     albertel 4289:     if (!%standard_parms) {
                   4290: 	&load_parameter_names();
                   4291:     }
1.292     www      4292:     if ($standard_parms{$name}) {
                   4293: 	return $standard_parms{$name}; 
                   4294:     } else { 
                   4295: 	return $name; 
                   4296:     }
                   4297: }
1.290     www      4298: 
1.309     www      4299: #
                   4300: # Parameter Change Log
                   4301: #
                   4302: 
                   4303: 
1.285     albertel 4304: sub parm_change_log {
1.284     www      4305:     my ($r)=@_;
1.327     albertel 4306:     $r->print(&Apache::loncommon::start_page('Parameter Change Log'));
                   4307:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
                   4308: 
1.286     www      4309:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   4310: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   4311: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.311     albertel 4312: 
1.301     www      4313:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311     albertel 4314: 
1.327     albertel 4315:     $r->print('<form action="/adm/parmset?action=parameterchangelog"
                   4316:                      method="post" name="parameterlog">');
1.311     albertel 4317:     
                   4318:     my %saveable_parameters = ('show' => 'scalar',);
                   4319:     &Apache::loncommon::store_course_settings('parameter_log',
                   4320:                                               \%saveable_parameters);
                   4321:     &Apache::loncommon::restore_course_settings('parameter_log',
                   4322:                                                 \%saveable_parameters);
1.348     www      4323:     $r->print(&Apache::loncommon::display_filter().
1.326     www      4324:               '<label>'.&Apache::lonhtmlcommon::checkbox('includetypes',$env{'form.includetypes'},'1').
                   4325: 	      ' '.&mt('Include parameter types').'</label>'.
1.327     albertel 4326: 	      '<input type="submit" value="'.&mt('Display').'" /></form>');
1.301     www      4327: 
1.291     www      4328:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   4329: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301     www      4330:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
                   4331: 	      '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   4332: 	      &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   4333: 	      &Apache::loncommon::end_data_table_header_row());
1.309     www      4334:     my $shown=0;
1.349     www      4335:     my $folder='';
                   4336:     if ($env{'form.displayfilter'} eq 'currentfolder') {
                   4337: 	my $last='';
                   4338: 	if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                   4339: 		&GDBM_READER(),0640)) {
                   4340: 	    $last=$hash{'last_known'};
                   4341: 	    untie(%hash);
                   4342: 	}
                   4343: 	if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
                   4344:     }
1.356     albertel 4345:     foreach my $id (sort 
                   4346: 		    {
                   4347: 			if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
                   4348: 			    return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
                   4349: 			}
                   4350: 			my $aid = (split('00000',$a))[-1];
                   4351: 			my $bid = (split('00000',$b))[-1];
                   4352: 			return $bid<=>$aid;
                   4353: 		    } (keys(%parmlog))) {
1.294     www      4354:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.332     albertel 4355: 	my $count = 0;
1.288     albertel 4356: 	my $time =
1.294     www      4357: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      4358: 	my $plainname = 
1.294     www      4359: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   4360: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 4361: 	my $about_me_link = 
1.289     www      4362: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      4363: 					       $parmlog{$id}{'exe_uname'},
                   4364: 					       $parmlog{$id}{'exe_udom'});
1.293     www      4365: 	my $send_msg_link='';
1.294     www      4366: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   4367: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      4368: 	    $send_msg_link ='<br />'.
1.288     albertel 4369: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      4370: 						   $parmlog{$id}{'exe_uname'},
                   4371: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 4372: 	}
1.301     www      4373: 	my $row_start=&Apache::loncommon::start_data_table_row();
1.290     www      4374: 	my $makenewrow=0;
                   4375: 	my %istype=();
1.332     albertel 4376: 	my $output;
1.293     www      4377: 	foreach my $changed (reverse(sort(@changes))) {
1.330     albertel 4378:             my $value=$parmlog{$id}{'logentry'}{$changed};
1.331     albertel 4379: 	    my $typeflag = ($changed =~/\.type$/ &&
                   4380: 			    !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330     albertel 4381:             my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
                   4382: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
1.349     www      4383: 	    if ($env{'form.displayfilter'} eq 'currentfolder') {
                   4384: 		if ($folder) {
                   4385: 		    if ($middle!~/^\Q$folder\E/) { next; }
                   4386: 		}
                   4387: 	    }
1.326     www      4388: 	    if ($typeflag) {
1.329     albertel 4389: 		$istype{$parmname}=$value; 
1.326     www      4390: 		if (!$env{'form.includetypes'}) { next; } 
                   4391: 	    }
1.332     albertel 4392: 	    $count++;
                   4393: 	    if ($makenewrow) {
                   4394: 		$output .= $row_start;
                   4395: 	    } else {
                   4396: 		$makenewrow=1;
                   4397: 	    }
1.413.6.1! raeburn  4398:             my $parmitem = &standard_parameter_names($parmname);
1.332     albertel 4399: 	    $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.413.6.1! raeburn  4400: 		      &mt($parmitem).'</td><td>'.
1.332     albertel 4401: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
1.291     www      4402: 	    my $stillactive=0;
1.332     albertel 4403: 	    if ($parmlog{$id}{'delflag'}) {
                   4404: 		$output .= &mt('Deleted');
1.288     albertel 4405: 	    } else {
1.290     www      4406: 		if ($typeflag) {
1.413.6.1! raeburn  4407:                     my $parmitem = &standard_parameter_names($value);
        !          4408:                     $parmitem = &mt($parmitem);
        !          4409: 		    $output .= &mt('Type: [_1]',$parmitem);
1.290     www      4410: 		} else {
1.291     www      4411: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   4412: 						      $uname,$udom,$issection,$issection,$courseopt);
                   4413: 		    if (&isdateparm($istype{$parmname})) {
1.332     albertel 4414: 			$output .= &Apache::lonlocal::locallocaltime($value);
1.291     www      4415: 		    } else {
1.332     albertel 4416: 			$output .= $value;
1.291     www      4417: 		    }
                   4418: 		    if ($value ne $all[$level]) {
1.332     albertel 4419: 			$output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
1.291     www      4420: 		    } else {
                   4421: 			$stillactive=1;
                   4422: 		    }
1.290     www      4423: 		}
1.288     albertel 4424: 	    }
1.332     albertel 4425: 	    $output .= '</td><td>';
1.291     www      4426: 	    if ($stillactive) {
1.413.6.1! raeburn  4427:                 my $parmitem = &standard_parameter_names($parmname);
        !          4428:                 $parmitem = &mt($parmitem);
        !          4429: 		my $title=&mt('Changed [_1]',$parmitem);
        !          4430:                 my $description=&mt('Changed [_1] for [_2] to [_3]',
        !          4431:                                     $parmitem,$realmdescription,
1.304     www      4432: 				    (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292     www      4433: 		if (($uname) && ($udom)) {
1.332     albertel 4434: 		    $output .= 
                   4435: 			&Apache::loncommon::messagewrapper('Notify User',
                   4436: 							   $uname,$udom,$title,
                   4437: 							   $description);
1.292     www      4438: 		} else {
1.332     albertel 4439: 		    $output .= 
                   4440: 			&Apache::lonrss::course_blog_link($id,$title,
                   4441: 							  $description);
1.292     www      4442: 		}
1.291     www      4443: 	    }
1.332     albertel 4444: 	    $output .= '</td>'.&Apache::loncommon::end_data_table_row();
1.288     albertel 4445: 	}
1.349     www      4446:         if ($env{'form.displayfilter'} eq 'containing') {
                   4447: 	    my $wholeentry=$about_me_link.':'.
                   4448: 		$parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
                   4449: 		$output;
                   4450: 	    if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }        
                   4451: 	}
                   4452:         if ($count) {
                   4453: 	    $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332     albertel 4454:                        <td rowspan="'.$count.'">'.$about_me_link.
                   4455: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   4456: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
                   4457: 		  $send_msg_link.'</td>'.$output);
1.349     www      4458: 	    $shown++;
                   4459: 	}
1.311     albertel 4460: 	if (!($env{'form.show'} eq &mt('all') 
                   4461: 	      || $shown<=$env{'form.show'})) { last; }
1.286     www      4462:     }
1.301     www      4463:     $r->print(&Apache::loncommon::end_data_table());
1.284     www      4464:     $r->print(&Apache::loncommon::end_page());
                   4465: }
                   4466: 
1.355     albertel 4467: sub check_for_course_info {
                   4468:     my $navmap = Apache::lonnavmaps::navmap->new();
                   4469:     return 1 if ($navmap);
                   4470:     return 0;
                   4471: }
                   4472: 
1.178     raeburn  4473: ##################################################
                   4474: ##################################################
1.30      www      4475: 
1.59      matthew  4476: =pod
                   4477: 
1.83      bowersj2 4478: =item * handler
1.59      matthew  4479: 
                   4480: Main handler.  Calls &assessparms and &crsenv subroutines.
                   4481: 
                   4482: =cut
1.376     albertel 4483: 
1.59      matthew  4484: ##################################################
                   4485: ##################################################
1.259     banghart 4486: 
1.30      www      4487: sub handler {
1.43      albertel 4488:     my $r=shift;
1.30      www      4489: 
1.376     albertel 4490:     &reset_caches();
                   4491: 
1.43      albertel 4492:     if ($r->header_only) {
1.126     www      4493: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 4494: 	$r->send_http_header;
                   4495: 	return OK;
                   4496:     }
1.193     albertel 4497:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      4498: 					    ['action','state',
                   4499:                                              'pres_marker',
                   4500:                                              'pres_value',
1.206     www      4501:                                              'pres_type',
1.390     www      4502:                                              'udom','uname','symb','serial','timebase']);
1.131     www      4503: 
1.83      bowersj2 4504: 
1.193     albertel 4505:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 4506:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   4507: 					    text=>"Parameter Manager",
1.204     www      4508: 					    faq=>10,
1.324     www      4509: 					    bug=>'Instructor Interface',
                   4510:                                             help => 'Parameter_Manager'});
1.203     www      4511: 
1.30      www      4512: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 4513:     my $parm_permission =
                   4514: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 4515: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 4516: 				  $env{'request.course.sec'}));
1.355     albertel 4517:     my $exists = &check_for_course_info();
                   4518: 
                   4519:     if ($env{'request.course.id'} &&  $parm_permission && $exists) {
1.193     albertel 4520: 
                   4521:         # Start Page
1.126     www      4522:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      4523:         $r->send_http_header;
1.30      www      4524: 
1.203     www      4525: 
1.193     albertel 4526:         #
                   4527:         # Main switch on form.action and form.state, as appropriate
                   4528:         #
                   4529:         # Check first if coming from someone else headed directly for
                   4530:         #  the table mode
                   4531:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   4532: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
1.324     www      4533:             &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
                   4534: 						    text=>"Problem Parameters"});
1.193     albertel 4535: 	    &assessparms($r);
                   4536: 
                   4537:         } elsif (! exists($env{'form.action'})) {
                   4538:             $r->print(&header());
1.298     albertel 4539:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 4540:             &print_main_menu($r,$parm_permission);
                   4541:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 4542:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   4543: 						    text=>"Course Environment"});
1.193     albertel 4544:             &crsenv($r); 
                   4545:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 4546:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   4547: 						    text=>"Overview Mode"});
1.121     www      4548: 	    &overview($r);
1.334     banghart 4549: 	} elsif ($env{'form.action'} eq 'addmetadata' && $parm_permission) {
                   4550:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
                   4551: 						    text=>"Add Metadata Field"});
                   4552: 	    &addmetafield($r);
1.340     banghart 4553: 	} elsif ($env{'form.action'} eq 'ordermetadata' && $parm_permission) {
                   4554:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
                   4555: 						    text=>"Add Metadata Field"});
                   4556: 	    &order_meta_fields($r);
1.259     banghart 4557:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   4558:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   4559: 						    text=>"Restrict Metadata"});
                   4560: 	    &setrestrictmeta($r);
1.208     www      4561:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   4562:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   4563: 						    text=>"Overview Mode"});
                   4564: 	    &newoverview($r);
1.220     www      4565:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   4566:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   4567: 						    text=>"Set Defaults"});
                   4568: 	    &defaultsetter($r);
                   4569: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 4570:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      4571: 						    text=>"Table Mode",
                   4572: 						    help => 'Course_Setting_Parameters'});
1.121     www      4573: 	    &assessparms($r);
1.284     www      4574:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   4575:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      4576: 						    text=>"Parameter Change Log"});
1.285     albertel 4577: 	    &parm_change_log($r);
1.333     albertel 4578:         } elsif ($env{'form.action'} eq 'cleanparameters' && $parm_permission) {
                   4579:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
                   4580: 						    text=>"Clean Parameters"});
                   4581: 	    &clean_parameters($r);
1.390     www      4582:         } elsif ($env{'form.action'} eq 'dateshift1' && $parm_permission) {
                   4583:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.391     www      4584:                                                     text=>"Shifting Dates"});
1.390     www      4585:             &date_shift_one($r);
                   4586:         } elsif ($env{'form.action'} eq 'dateshift2' && $parm_permission) {
                   4587:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.391     www      4588:                                                     text=>"Shifting Dates"});
1.390     www      4589:             &date_shift_two($r);
1.403     raeburn  4590: 	} elsif ($env{'form.action'} eq 'categorizecourse' && $parm_permission) {
                   4591:             &assign_course_categories($r);
                   4592:         } 
1.43      albertel 4593:     } else {
1.1       www      4594: # ----------------------------- Not in a course, or not allowed to modify parms
1.355     albertel 4595: 	if ($exists) {
                   4596: 	    $env{'user.error.msg'}=
                   4597: 		"/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   4598: 	} else {
                   4599: 	    $env{'user.error.msg'}=
                   4600: 		"/adm/parmset::0:1:Course environment gone, reinitialize the course";
                   4601: 	}
1.43      albertel 4602: 	return HTTP_NOT_ACCEPTABLE;
                   4603:     }
1.376     albertel 4604:     &reset_caches();
                   4605: 
1.43      albertel 4606:     return OK;
1.1       www      4607: }
                   4608: 
                   4609: 1;
                   4610: __END__
                   4611: 
1.59      matthew  4612: =pod
1.38      harris41 4613: 
                   4614: =back
                   4615: 
                   4616: =cut
1.1       www      4617: 
                   4618: 
                   4619: 

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