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

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

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