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

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

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