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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.410   ! bisitz      4: # $Id: lonparmset.pm,v 1.409 2008/09/19 03:27:04 raeburn 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');
1.410   ! bisitz    988: 	    $$allparts{$part} = &mt('Part: [_1]',$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') {
1.401     bisitz   1013: 		$$maptitles{$mapid}=&mt('Main Course Documents');
1.363     albertel 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:     }
1.410   ! bisitz   1119:     $r->print('</tr>'
        !          1120:              .'<tr id=\"LC_parm_overview_parm_menu_selectors\">'
        !          1121:              .'<td valign="top">'
        !          1122:              .'<fieldset><legend><b>'.&mt('Parameter Selection').'</b></legend>'
        !          1123:              .'<span class="LC_nobreak">'
        !          1124:              .'&bull; <a href="javascript:checkall(true, \'pscat\')">'.&mt('Select All').'</a>'
        !          1125:              .'</span>'
        !          1126:              .'<br />'
        !          1127:              .'<span class="LC_nobreak">'
        !          1128:              .'&bull; <a href="javascript:checkstandard()">'.&mt('Select Common Only').'</a>'
        !          1129:              .'</span>'
        !          1130:              .'<br />'
        !          1131:              .'<span class="LC_nobreak">'
        !          1132:              .'&bull; <a href="javascript:checkall(false, \'pscat\')">'.&mt('Unselect All').'</a>'
        !          1133:              .'</span>'
        !          1134:              .'</fieldset>'
        !          1135:              .'</td>'
        !          1136:              .'<td colspan="2" valign="top">'
        !          1137:              .'<fieldset><legend><b>'.&mt('Add Selection for...').'</b></legend>'
        !          1138:              .'<span class="LC_nobreak">'
        !          1139:              .'&bull; <a href="javascript:checkdates()">'.&mt('Problem Dates').'</a>'
        !          1140:              .'</span>'
        !          1141:              .'<span class="LC_nobreak">'
        !          1142:              .' &bull; <a href="javascript:checkcontdates()">'.&mt('Content Dates').'</a>'
        !          1143:              .'</span>'
        !          1144: #            .'<br />'
        !          1145:              .'<span class="LC_nobreak">'
        !          1146:              .' &bull; <a href="javascript:checkdisset()">'.&mt('Discussion Settings').'</a>'
        !          1147:              .'</span>'
        !          1148:              .'<span class="LC_nobreak">'
        !          1149:              .' &bull; <a href="javascript:checkvisi()">'.&mt('Visibilities').'</a>'
        !          1150:              .'</span>'
        !          1151: #            .'<br />'
        !          1152:              .'<span class="LC_nobreak">'
        !          1153:              .' &bull; <a href="javascript:checkparts()">'.&mt('Part Parameters').'</a>'
        !          1154:              .'</span>'
        !          1155:              .'</fieldset>'
        !          1156:              .'</td>'
        !          1157:              .'</tr></table>'
        !          1158:     );
1.208     www      1159: }
                   1160: 
1.209     www      1161: sub partmenu {
                   1162:     my ($r,$allparts,$psprt)=@_;
1.211     www      1163:     $r->print('<select multiple name="psprt" size="8">');
1.208     www      1164:     $r->print('<option value="all"');
1.401     bisitz   1165:     $r->print(' selected="selected"') unless (@{$psprt});
1.208     www      1166:     $r->print('>'.&mt('All Parts').'</option>');
                   1167:     my %temphash=();
                   1168:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.234     albertel 1169:     foreach my $tempkey (sort {
                   1170: 	if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
                   1171:     } keys(%{$allparts})) {
1.208     www      1172: 	unless ($tempkey =~ /\./) {
                   1173: 	    $r->print('<option value="'.$tempkey.'"');
                   1174: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
1.401     bisitz   1175: 		$r->print(' selected="selected"');
1.208     www      1176: 	    }
                   1177: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                   1178: 	}
                   1179:     }
1.209     www      1180:     $r->print('</select>');
                   1181: }
                   1182: 
                   1183: sub usermenu {
1.275     raeburn  1184:     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
1.209     www      1185:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                   1186:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                   1187:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
                   1188:     my %lt=&Apache::lonlocal::texthash(
1.269     raeburn  1189: 		    'se'    => "Section",
                   1190:                     'gr'    => "Group",
1.209     www      1191: 		    'fu'    => "For User",
                   1192: 		    'oi'    => "or ID",
                   1193: 		    'ad'    => "at Domain"
                   1194: 				       );
                   1195:     my $sections='';
1.300     albertel 1196:     my %sectionhash = &Apache::loncommon::get_sections();
                   1197: 
1.269     raeburn  1198:     my $groups;
1.307     raeburn  1199:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1200: 
1.300     albertel 1201:     if (%sectionhash) {
1.269     raeburn  1202:         $sections=$lt{'se'}.': <select name="csec"';
1.299     albertel 1203:         if (%grouphash && $parmlev ne 'full') {
1.269     raeburn  1204:             $sections .= qq| onchange="group_or_section('csec')" |;
                   1205:         }
                   1206:         $sections .= '>';
1.275     raeburn  1207: 	foreach my $section ('',sort keys %sectionhash) {
                   1208: 	    $sections.='<option value="'.$section.'" '.
                   1209: 		($section eq $csec?'selected="selected"':'').'>'.$section.
                   1210:                                                               '</option>';
1.209     www      1211:         }
                   1212:         $sections.='</select>';
1.269     raeburn  1213:     }
1.300     albertel 1214:     if (%sectionhash && %grouphash && $parmlev ne 'full') {
1.269     raeburn  1215:         $sections .= '&nbsp;or&nbsp;';
                   1216:         $sections .= qq|
                   1217: <script type="text/javascript">
                   1218: function group_or_section(caller) {
                   1219:    if (caller == "cgroup") {
                   1220:        if (document.parmform.cgroup.selectedIndex != 0) {
                   1221:            document.parmform.csec.selectedIndex = 0;
                   1222:        }
                   1223:    } else {
                   1224:        if (document.parmform.csec.selectedIndex != 0) {
                   1225:            document.parmform.cgroup.selectedIndex = 0;
                   1226:        }
                   1227:    }
                   1228: }
                   1229: </script>
                   1230: |;
                   1231:     } else {
                   1232:         $sections .= qq|
                   1233: <script type="text/javascript">
                   1234: function group_or_section(caller) {
                   1235:     return;
                   1236: }
                   1237: </script>
                   1238: |;
                   1239:     } 
1.299     albertel 1240: 
                   1241:     if (%grouphash) {
1.269     raeburn  1242:         $groups=$lt{'gr'}.': <select name="cgroup"';
1.300     albertel 1243:         if (%sectionhash && $env{'form.action'} eq 'settable') {
1.269     raeburn  1244:             $groups .= qq| onchange="group_or_section('cgroup')" |;
                   1245:         }
                   1246:         $groups .= '>';
1.275     raeburn  1247:         foreach my $grp ('',sort keys %grouphash) {
                   1248:             $groups.='<option value="'.$grp.'" ';
                   1249:             if ($grp eq $cgroup) {
                   1250:                 unless ((defined($uname)) && ($grp eq '')) {
                   1251:                     $groups .=  'selected="selected" ';
                   1252:                 }
                   1253:             } elsif (!defined($cgroup)) {
                   1254:                 if (@{$usersgroups} == 1) {
                   1255:                     if ($grp eq $$usersgroups[0]) {
                   1256:                         $groups .=  'selected="selected" ';
                   1257:                     }
                   1258:                 }
                   1259:             }
                   1260:             $groups .= '>'.$grp.'</option>';
1.269     raeburn  1261:         }
                   1262:         $groups.='</select>';
                   1263:     }
                   1264:     $r->print(<<ENDMENU);
1.209     www      1265: <b>
                   1266: $sections
1.269     raeburn  1267: $groups
1.209     www      1268: <br />
                   1269: $lt{'fu'} 
                   1270: <input type="text" value="$uname" size="12" name="uname" />
                   1271: $lt{'oi'}
                   1272: <input type="text" value="$id" size="12" name="id" /> 
                   1273: $lt{'ad'}
                   1274: $chooseopt
                   1275: </b>
                   1276: ENDMENU
                   1277: }
                   1278: 
                   1279: sub displaymenu {
1.211     www      1280:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www      1281:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                   1282: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www      1283:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.209     www      1284:     $r->print('</td><td>');
                   1285:     &partmenu($r,$allparts,$psprt);
                   1286:     $r->print('</td></tr></table>');
                   1287: }
                   1288: 
                   1289: sub mapmenu {
                   1290:     my ($r,$allmaps,$pschp,$maptitles)=@_;
1.231     www      1291:     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');
1.209     www      1292:     $r->print('<select name="pschp">');
                   1293:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                   1294:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www      1295: 	$r->print('<option value="'.$_.'"');
1.401     bisitz   1296: 	if (($pschp eq $_)) { $r->print(' selected="selected"'); }
1.209     www      1297: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                   1298:     }
                   1299:     $r->print("</select>");
                   1300: }
                   1301: 
                   1302: sub levelmenu {
                   1303:     my ($r,$alllevs,$parmlev)=@_;
1.231     www      1304:     $r->print('<b>'.&mt('Select Parameter Level').
                   1305: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');
1.209     www      1306:     $r->print('<select name="parmlev">');
                   1307:     foreach (reverse sort keys %{$alllevs}) {
                   1308: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                   1309: 	if ($parmlev eq $$alllevs{$_}) {
1.401     bisitz   1310: 	    $r->print(' selected="selected"'); 
1.209     www      1311: 	}
1.401     bisitz   1312: 	$r->print('>'.&mt($_).'</option>');
1.208     www      1313:     }
1.209     www      1314:     $r->print("</select>");
1.208     www      1315: }
                   1316: 
1.211     www      1317: 
                   1318: sub sectionmenu {
                   1319:     my ($r,$selectedsections)=@_;
1.300     albertel 1320:     my %sectionhash = &Apache::loncommon::get_sections();
                   1321:     return if (!%sectionhash);
                   1322: 
                   1323:     $r->print('<select name="Section" multiple="true" size="8" >');
                   1324:     foreach my $s ('all',sort keys %sectionhash) {
                   1325: 	$r->print('    <option value="'.$s.'"');
                   1326: 	foreach (@{$selectedsections}) {
                   1327: 	    if ($s eq $_) {
1.401     bisitz   1328: 		$r->print(' selected="selected"');
1.300     albertel 1329: 		last;
1.212     www      1330: 	    }
                   1331: 	}
1.300     albertel 1332: 	$r->print('>'.$s."</option>\n");
                   1333:     }
                   1334:     $r->print("</select>\n");
1.269     raeburn  1335: }
                   1336: 
                   1337: sub groupmenu {
                   1338:     my ($r,$selectedgroups)=@_;
1.307     raeburn  1339:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1340:     return if (!%grouphash);
                   1341: 
                   1342:     $r->print('<select name="Group" multiple="true" size="8" >');
                   1343:     foreach my $group (sort(keys(%grouphash))) {
                   1344: 	$r->print('    <option value="'.$group.'"');
                   1345: 	foreach (@{$selectedgroups}) {
                   1346: 	    if ($group eq $_) {
1.401     bisitz   1347: 		$r->print(' selected="selected"');
1.299     albertel 1348: 		last;
                   1349: 	    }
                   1350: 	}
                   1351: 	$r->print('>'.$group."</option>\n");
1.211     www      1352:     }
1.299     albertel 1353:     $r->print("</select>\n");
1.211     www      1354: }
                   1355: 
1.269     raeburn  1356: 
1.210     www      1357: sub keysplit {
                   1358:     my $keyp=shift;
                   1359:     return (split(/\,/,$keyp));
                   1360: }
                   1361: 
                   1362: sub keysinorder {
                   1363:     my ($name,$keyorder)=@_;
                   1364:     return sort {
                   1365: 	$$keyorder{$a} <=> $$keyorder{$b};
                   1366:     } (keys %{$name});
                   1367: }
                   1368: 
1.236     albertel 1369: sub keysinorder_bytype {
                   1370:     my ($name,$keyorder)=@_;
                   1371:     return sort {
                   1372: 	my $ta=(split('_',$a))[-1];
                   1373: 	my $tb=(split('_',$b))[-1];
                   1374: 	if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
                   1375: 	    return ($a cmp $b);
                   1376: 	}
                   1377: 	$$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
                   1378:     } (keys %{$name});
                   1379: }
                   1380: 
1.211     www      1381: sub keysindisplayorder {
                   1382:     my ($name,$keyorder)=@_;
                   1383:     return sort {
                   1384: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                   1385:     } (keys %{$name});
                   1386: }
                   1387: 
1.214     www      1388: sub sortmenu {
                   1389:     my ($r,$sortorder)=@_;
1.236     albertel 1390:     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214     www      1391:     if ($sortorder eq 'realmstudent') {
                   1392:        $r->print(' checked="on"');
                   1393:     }
                   1394:     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236     albertel 1395:     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214     www      1396:     if ($sortorder eq 'studentrealm') {
                   1397:        $r->print(' checked="on"');
                   1398:     }
1.236     albertel 1399:     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
                   1400: 	      '</label>');
1.214     www      1401: }
                   1402: 
1.211     www      1403: sub standardkeyorder {
                   1404:     return ('parameter_0_opendate' => 1,
                   1405: 	    'parameter_0_duedate' => 2,
                   1406: 	    'parameter_0_answerdate' => 3,
                   1407: 	    'parameter_0_interval' => 4,
                   1408: 	    'parameter_0_weight' => 5,
                   1409: 	    'parameter_0_maxtries' => 6,
                   1410: 	    'parameter_0_hinttries' => 7,
                   1411: 	    'parameter_0_contentopen' => 8,
                   1412: 	    'parameter_0_contentclose' => 9,
                   1413: 	    'parameter_0_type' => 10,
                   1414: 	    'parameter_0_problemstatus' => 11,
                   1415: 	    'parameter_0_hiddenresource' => 12,
                   1416: 	    'parameter_0_hiddenparts' => 13,
                   1417: 	    'parameter_0_display' => 14,
                   1418: 	    'parameter_0_ordered' => 15,
                   1419: 	    'parameter_0_tol' => 16,
                   1420: 	    'parameter_0_sig' => 17,
1.218     www      1421: 	    'parameter_0_turnoffunit' => 18,
                   1422:             'parameter_0_discussend' => 19,
                   1423:             'parameter_0_discusshide' => 20);
1.211     www      1424: }
                   1425: 
1.59      matthew  1426: ##################################################
                   1427: ##################################################
                   1428: 
                   1429: =pod
                   1430: 
                   1431: =item assessparms
                   1432: 
                   1433: Show assessment data and parameters.  This is a large routine that should
                   1434: be simplified and shortened... someday.
                   1435: 
                   1436: Inputs: $r
                   1437: 
                   1438: Returns: nothing
                   1439: 
1.63      bowersj2 1440: Variables used (guessed by Jeremy):
                   1441: 
                   1442: =over 4
                   1443: 
                   1444: =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.
                   1445: 
                   1446: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1447: 
                   1448: =item B<allmaps>:
                   1449: 
                   1450: =back
                   1451: 
1.59      matthew  1452: =cut
                   1453: 
                   1454: ##################################################
                   1455: ##################################################
1.30      www      1456: sub assessparms {
1.1       www      1457: 
1.43      albertel 1458:     my $r=shift;
1.201     www      1459: 
                   1460:     my @ids=();
                   1461:     my %symbp=();
                   1462:     my %mapp=();
                   1463:     my %typep=();
                   1464:     my %keyp=();
                   1465:     my %uris=();
                   1466:     my %maptitles=();
                   1467: 
1.2       www      1468: # -------------------------------------------------------- Variable declaration
1.209     www      1469: 
1.129     www      1470:     my %allmaps=();
                   1471:     my %alllevs=();
1.57      albertel 1472: 
1.187     www      1473:     my $uname;
                   1474:     my $udom;
                   1475:     my $uhome;
                   1476:     my $csec;
1.269     raeburn  1477:     my $cgroup;
1.275     raeburn  1478:     my @usersgroups = ();
1.187     www      1479:  
1.190     albertel 1480:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1481: 
1.57      albertel 1482:     $alllevs{'Resource Level'}='full';
1.215     www      1483:     $alllevs{'Map/Folder Level'}='map';
1.57      albertel 1484:     $alllevs{'Course Level'}='general';
                   1485: 
                   1486:     my %allparms;
                   1487:     my %allparts;
1.210     www      1488: #
                   1489: # Order in which these parameters will be displayed
                   1490: #
1.211     www      1491:     my %keyorder=&standardkeyorder();
                   1492: 
1.43      albertel 1493:     @ids=();
                   1494:     %symbp=();
                   1495:     %typep=();
                   1496: 
                   1497:     my $message='';
                   1498: 
1.190     albertel 1499:     $csec=$env{'form.csec'};
1.269     raeburn  1500:     $cgroup=$env{'form.cgroup'};
1.188     www      1501: 
1.190     albertel 1502:     if      ($udom=$env{'form.udom'}) {
                   1503:     } elsif ($udom=$env{'request.role.domain'}) {
                   1504:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1505:     } else {
                   1506: 	$udom=$r->dir_config('lonDefDomain');
                   1507:     }
1.43      albertel 1508: 
1.134     albertel 1509:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1510:     my $pschp=$env{'form.pschp'};
1.134     albertel 1511:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1512:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1513: 
1.43      albertel 1514:     my $pssymb='';
1.57      albertel 1515:     my $parmlev='';
                   1516:  
1.190     albertel 1517:     unless ($env{'form.parmlev'}) {
1.57      albertel 1518:         $parmlev = 'map';
                   1519:     } else {
1.190     albertel 1520:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1521:     }
1.26      www      1522: 
1.29      www      1523: # ----------------------------------------------- Was this started from grades?
                   1524: 
1.190     albertel 1525:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1526: 	&& (!$env{'form.dis'})) {
                   1527: 	my $url=$env{'form.url'};
1.194     albertel 1528: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1529: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1530: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1531: 	$pschp='';
1.57      albertel 1532:         $parmlev = 'full';
1.190     albertel 1533:     } elsif ($env{'form.symb'}) {
                   1534: 	$pssymb=$env{'form.symb'};
1.92      albertel 1535: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1536: 	$pschp='';
1.57      albertel 1537:         $parmlev = 'full';
1.43      albertel 1538:     } else {
1.190     albertel 1539: 	$env{'form.url'}='';
1.43      albertel 1540:     }
                   1541: 
1.190     albertel 1542:     my $id=$env{'form.id'};
1.43      albertel 1543:     if (($id) && ($udom)) {
                   1544: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1545: 	if ($uname) {
                   1546: 	    $id='';
                   1547: 	} else {
                   1548: 	    $message=
1.314     albertel 1549: 		'<span class="LC_error">'.&mt("Unknown ID")." '$id' ".
                   1550: 		&mt('at domain')." '$udom'</span>";
1.43      albertel 1551: 	}
                   1552:     } else {
1.190     albertel 1553: 	$uname=$env{'form.uname'};
1.43      albertel 1554:     }
                   1555:     unless ($udom) { $uname=''; }
                   1556:     $uhome='';
                   1557:     if ($uname) {
                   1558: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1559:         if ($uhome eq 'no_host') {
                   1560: 	    $message=
1.314     albertel 1561: 		'<span class="LC_error">'.&mt("Unknown user")." '$uname' ".
                   1562: 		&mt("at domain")." '$udom'</span>";
1.43      albertel 1563: 	    $uname='';
1.12      www      1564:         } else {
1.103     albertel 1565: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1566: 					      $env{'request.course.id'});
1.269     raeburn  1567:             
1.43      albertel 1568: 	    if ($csec eq '-1') {
1.314     albertel 1569: 		$message='<span class="LC_error">'.
1.133     www      1570: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
1.314     albertel 1571: 		    &mt("not in this course")."</span>";
1.43      albertel 1572: 		$uname='';
1.190     albertel 1573: 		$csec=$env{'form.csec'};
1.269     raeburn  1574:                 $cgroup=$env{'form.cgroup'};
1.43      albertel 1575: 	    } else {
                   1576: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1577: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1578: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1579: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1580: 			.$name{'lastname'}.' '.$name{'generation'}.
1.336     albertel 1581: 			    "<br />\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1582: 	    }
1.297     raeburn  1583:             @usersgroups = &Apache::lonnet::get_users_groups(
1.275     raeburn  1584:                                        $udom,$uname,$env{'request.course.id'});
1.297     raeburn  1585:             if (@usersgroups > 0) {
1.306     albertel 1586:                 unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275     raeburn  1587:                     $cgroup = $usersgroups[0];
1.297     raeburn  1588:                 }
1.269     raeburn  1589:             }
1.12      www      1590:         }
1.43      albertel 1591:     }
1.2       www      1592: 
1.43      albertel 1593:     unless ($csec) { $csec=''; }
1.269     raeburn  1594:     unless ($cgroup) { $cgroup=''; }
1.12      www      1595: 
1.14      www      1596: # --------------------------------------------------------- Get all assessments
1.210     www      1597:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1598: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1599: 				\%keyorder);
1.63      bowersj2 1600: 
1.57      albertel 1601:     $mapp{'0.0'} = '';
                   1602:     $symbp{'0.0'} = '';
1.99      albertel 1603: 
1.14      www      1604: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1605:     if ($env{'form.pres_marker'}) {
1.205     www      1606:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1607:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1608:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1609: 	for (my $i=0;$i<=$#markers;$i++) {
                   1610: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1611: 				 $values[$i],
                   1612: 				 $types[$i],
1.269     raeburn  1613: 				 $uname,$udom,$csec,$cgroup);
1.205     www      1614: 	}
1.68      www      1615: # ---------------------------------------------------------------- Done storing
1.130     www      1616: 	$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      1617:     }
1.57      albertel 1618: #----------------------------------------------- if all selected, fill in array
1.209     www      1619:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1620:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1621:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1622: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1623: 
1.209     www      1624:     &startpage($r);
1.57      albertel 1625: 
1.44      albertel 1626:     foreach ('tolerance','date_default','date_start','date_end',
                   1627: 	     'date_interval','int','float','string') {
                   1628: 	$r->print('<input type="hidden" value="'.
1.378     albertel 1629: 		  &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
                   1630: 		  '" name="recent_'.$_.'" />');
1.44      albertel 1631:     }
1.57      albertel 1632:                         
1.44      albertel 1633:     if (!$pssymb) {
1.209     www      1634:         $r->print('<table border="1"><tr><td>');
                   1635:         &levelmenu($r,\%alllevs,$parmlev);
1.128     albertel 1636: 	if ($parmlev ne 'general') {
1.209     www      1637:             $r->print('<td>');
                   1638: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1639: 	    $r->print('</td>');
1.128     albertel 1640: 	}
1.209     www      1641:         $r->print('</td></tr></table>');
1.211     www      1642: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1643:     } else {
1.125     www      1644:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.312     albertel 1645: 	my $title = &Apache::lonnet::gettitle($pssymb);
                   1646:         $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
                   1647:                   '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.238     www      1648: 		  '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
                   1649: 		  ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
1.57      albertel 1650:     }
1.275     raeburn  1651:     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);    
1.57      albertel 1652: 
1.210     www      1653:     $r->print('<p>'.$message.'</p>');
                   1654: 
1.209     www      1655:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1656: 
                   1657:     my @temp_pscat;
                   1658:     map {
                   1659:         my $cat = $_;
                   1660:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1661:     } @pscat;
                   1662: 
                   1663:     @pscat = @temp_pscat;
                   1664: 
1.209     www      1665:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1666: # ----------------------------------------------------------------- Start Table
1.57      albertel 1667:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1668:         my $csuname=$env{'user.name'};
                   1669:         my $csudom=$env{'user.domain'};
1.57      albertel 1670: 
1.203     www      1671:         if ($parmlev eq 'full') {
1.57      albertel 1672:            my $coursespan=$csec?8:5;
1.275     raeburn  1673:            my $userspan=3;
1.269     raeburn  1674:            if ($cgroup ne '') {
                   1675:               $coursespan += 3;
                   1676:            } 
                   1677:       
1.57      albertel 1678:            $r->print('<p><table border=2>');
                   1679:            $r->print('<tr><td colspan=5></td>');
1.130     www      1680:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1681:            if ($uname) {
1.275     raeburn  1682:                if (@usersgroups > 1) {
                   1683:                    $userspan ++;
                   1684:                }
                   1685:                $r->print('<th colspan="'.$userspan.'" rowspan="2">');
1.130     www      1686:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1687:            }
1.133     www      1688: 	   my %lt=&Apache::lonlocal::texthash(
                   1689: 				  'pie'    => "Parameter in Effect",
                   1690: 				  'csv'    => "Current Session Value",
                   1691:                                   'at'     => 'at',
                   1692:                                   'rl'     => "Resource Level",
                   1693: 				  'ic'     => 'in Course',
                   1694: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1695: 				  'type'   => 'Type',
1.133     www      1696: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1697: 				  'part'   => 'Part',
1.133     www      1698:                                   'pn'     => 'Parameter Name',
                   1699: 				  'def'    => 'default',
                   1700: 				  'femof'  => 'from Enclosing Map or Folder',
                   1701: 				  'gen'    => 'general',
                   1702: 				  'foremf' => 'for Enclosing Map or Folder',
                   1703: 				  'fr'     => 'for Resource'
                   1704: 					      );
1.57      albertel 1705:            $r->print(<<ENDTABLETWO);
1.133     www      1706: <th rowspan=3>$lt{'pie'}</th>
1.336     albertel 1707: <th rowspan=3>$lt{'csv'}<br />($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1708: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1709: <th colspan=1>$lt{'ic'}</th>
                   1710: 
1.10      www      1711: ENDTABLETWO
1.57      albertel 1712:            if ($csec) {
1.133     www      1713:                 $r->print("<th colspan=3>".
1.269     raeburn  1714: 			  &mt("in Section")." $csec</th>");
                   1715:            }
                   1716:            if ($cgroup) {
                   1717:                 $r->print("<th colspan=3>".
                   1718:                           &mt("in Group")." $cgroup</th>");
1.57      albertel 1719:            }
                   1720:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1721: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1722: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1723: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1724: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1725: ENDTABLEHEADFOUR
1.57      albertel 1726: 
                   1727:            if ($csec) {
1.130     www      1728:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1729:            }
                   1730: 
1.269     raeburn  1731:            if ($cgroup) {
                   1732:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
                   1733:            }
                   1734: 
1.57      albertel 1735:            if ($uname) {
1.275     raeburn  1736:                if (@usersgroups > 1) {
                   1737:                    $r->print('<th>'.&mt('Control by other group?').'</th>');
                   1738:                }
1.130     www      1739:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1740:            }
                   1741: 
                   1742:            $r->print('</tr>');
                   1743: 
                   1744:            my $defbgone='';
                   1745:            my $defbgtwo='';
1.269     raeburn  1746:            my $defbgthree = '';
1.57      albertel 1747: 
                   1748:            foreach (@ids) {
                   1749: 
                   1750:                 my $rid=$_;
                   1751:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1752: 
1.152     albertel 1753:                 if ((!$pssymb && 
                   1754: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1755: 		    ||
                   1756: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1757: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1758:                     if ($defbgone eq '"#E0E099"') {
                   1759:                         $defbgone='"#E0E0DD"';
1.57      albertel 1760:                     } else {
1.184     albertel 1761:                         $defbgone='"#E0E099"';
1.57      albertel 1762:                     }
1.184     albertel 1763:                     if ($defbgtwo eq '"#FFFF99"') {
                   1764:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1765:                     } else {
1.184     albertel 1766:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1767:                     }
1.269     raeburn  1768:                     if ($defbgthree eq '"#FFBB99"') {
                   1769:                         $defbgthree='"#FFBBDD"';
                   1770:                     } else {
                   1771:                         $defbgthree='"#FFBB99"';
                   1772:                     }
                   1773: 
1.57      albertel 1774:                     my $thistitle='';
                   1775:                     my %name=   ();
                   1776:                     undef %name;
                   1777:                     my %part=   ();
                   1778:                     my %display=();
                   1779:                     my %type=   ();
                   1780:                     my %default=();
1.196     www      1781:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1782: 
1.210     www      1783:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1784:                         my $tempkeyp = $_;
                   1785:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1786:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1787:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1788:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1789:                           unless ($display{$_}) { $display{$_}=''; }
                   1790:                           $display{$_}.=' ('.$name{$_}.')';
                   1791:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1792:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1793:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1794:                         }
                   1795:                     }
                   1796:                     my $totalparms=scalar keys %name;
                   1797:                     if ($totalparms>0) {
                   1798:                         my $firstrow=1;
1.274     albertel 1799: 			my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.57      albertel 1800:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1801:                              ' rowspan='.$totalparms.
                   1802:                              '><tt><font size=-1>'.
                   1803:                              join(' / ',split(/\//,$uri)).
                   1804:                              '</font></tt><p><b>'.
1.154     albertel 1805:                              "<a href=\"javascript:openWindow('".
1.274     albertel 1806: 				  &Apache::lonnet::clutter($uri).'?symb='.
1.308     www      1807: 				  &escape($symbp{$rid}).
1.336     albertel 1808:                              "', 'metadatafile', '450', '500', 'no', 'yes');\"".
                   1809:                              " target=\"_self\">$title");
1.57      albertel 1810: 
                   1811:                         if ($thistitle) {
                   1812:                             $r->print(' ('.$thistitle.')');
                   1813:                         }
                   1814:                         $r->print('</a></b></td>');
                   1815:                         $r->print('<td bgcolor='.$defbgtwo.
                   1816:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1817:                                       '</td>');
                   1818: 
                   1819:                         $r->print('<td bgcolor='.$defbgone.
                   1820:                                       ' rowspan='.$totalparms.
1.238     www      1821:                                       '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57      albertel 1822: 
1.236     albertel 1823:                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57      albertel 1824:                             unless ($firstrow) {
                   1825:                                 $r->print('<tr>');
                   1826:                             } else {
                   1827:                                 undef $firstrow;
                   1828:                             }
1.201     www      1829:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1830:                                        \%type,\%display,$defbgone,$defbgtwo,
1.269     raeburn  1831:                                        $defbgthree,$parmlev,$uname,$udom,$csec,
1.275     raeburn  1832:                                                             $cgroup,\@usersgroups);
1.57      albertel 1833:                         }
                   1834:                     }
                   1835:                 }
                   1836:             } # end foreach ids
1.43      albertel 1837: # -------------------------------------------------- End entry for one resource
1.57      albertel 1838:             $r->print('</table>');
1.203     www      1839:         } # end of  full
1.57      albertel 1840: #--------------------------------------------------- Entry for parm level map
                   1841:         if ($parmlev eq 'map') {
                   1842:             my $defbgone = '"E0E099"';
                   1843:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1844:             my $defbgthree = '"FFBB99"';
1.57      albertel 1845: 
                   1846:             my %maplist;
                   1847: 
                   1848:             if ($pschp eq 'all') {
                   1849:                 %maplist = %allmaps; 
                   1850:             } else {
                   1851:                 %maplist = ($pschp => $mapp{$pschp});
                   1852:             }
                   1853: 
                   1854: #-------------------------------------------- for each map, gather information
                   1855:             my $mapid;
1.60      albertel 1856: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1857:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1858: 
                   1859: #-----------------------  loop through ids and get all parameter types for map
                   1860: #-----------------------------------------          and associated information
                   1861:                 my %name = ();
                   1862:                 my %part = ();
                   1863:                 my %display = ();
                   1864:                 my %type = ();
                   1865:                 my %default = ();
                   1866:                 my $map = 0;
                   1867: 
                   1868: #		$r->print("Catmarker: @catmarker<br />\n");
                   1869:                
                   1870:                 foreach (@ids) {
                   1871:                   ($map)=(/([\d]*?)\./);
                   1872:                   my $rid = $_;
                   1873:         
                   1874: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1875: 
                   1876:                   if ($map eq $mapid) {
1.196     www      1877:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1878: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1879: 
                   1880: #--------------------------------------------------------------------
                   1881: # @catmarker contains list of all possible parameters including part #s
                   1882: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1883: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1884: # When storing information, store as part 0
                   1885: # When requesting information, request from full part
                   1886: #-------------------------------------------------------------------
1.210     www      1887:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1888:                       my $tempkeyp = $_;
                   1889:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1890:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1891:                       
                   1892:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1893:                         $part{$tempkeyp}="0";
                   1894:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1895:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1896:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1897:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1898:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1899:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1900:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1901:                       }
                   1902:                     } # end loop through keys
                   1903:                   }
                   1904:                 } # end loop through ids
                   1905:                                  
                   1906: #---------------------------------------------------- print header information
1.133     www      1907:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1908:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.401     bisitz   1909:                 my $tmp="";
1.57      albertel 1910:                 if ($uname) {
1.267     albertel 1911: 		    my $person=&Apache::loncommon::plainname($uname,$udom);
1.401     bisitz   1912:                     $tmp.=&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
                   1913:                         &mt('in')." \n";
1.57      albertel 1914:                 } else {
1.401     bisitz   1915:                     $tmp.="<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n";
1.57      albertel 1916:                 }
1.269     raeburn  1917:                 if ($cgroup) {
1.401     bisitz   1918:                     $tmp.=&mt("Group")." <font color=\"red\"><i>$cgroup".
                   1919:                               "</i></font> ".&mt('of')." \n";
1.269     raeburn  1920:                     $csec = '';
                   1921:                 } elsif ($csec) {
1.401     bisitz   1922:                     $tmp.=&mt("Section")." <font color=\"red\"><i>$csec".
                   1923:                               "</i></font> ".&mt('of')." \n";
1.269     raeburn  1924:                 }
1.401     bisitz   1925:                 $r->print('<div align="center"><h4>'
                   1926:                          .&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
1.404     bisitz   1927:                              ,$foldermap.'<br /><font color="red"><i>'.$showtitle.'</i></font><br />'
1.401     bisitz   1928:                              ,$tmp
                   1929:                              ,'<font color="red"><i>'.$coursename.'</i></font>'
                   1930:                              )
                   1931:                          ."<br /></h4>\n"
                   1932:                          );
1.57      albertel 1933: #---------------------------------------------------------------- print table
                   1934:                 $r->print('<p><table border="2">');
1.130     www      1935:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1936:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1937:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1938: 
1.210     www      1939: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1940:                     $r->print('<tr>');
1.201     www      1941:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1942:                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1943:                            $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1944:                 }
1.401     bisitz   1945:                 $r->print("</table></div>");
1.57      albertel 1946:             } # end each map
                   1947:         } # end of $parmlev eq map
                   1948: #--------------------------------- Entry for parm level general (Course level)
                   1949:         if ($parmlev eq 'general') {
                   1950:             my $defbgone = '"E0E099"';
                   1951:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1952:             my $defbgthree = '"FFBB99"';
1.57      albertel 1953: 
                   1954: #-------------------------------------------- for each map, gather information
                   1955:             my $mapid="0.0";
                   1956: #-----------------------  loop through ids and get all parameter types for map
                   1957: #-----------------------------------------          and associated information
                   1958:             my %name = ();
                   1959:             my %part = ();
                   1960:             my %display = ();
                   1961:             my %type = ();
                   1962:             my %default = ();
                   1963:                
                   1964:             foreach (@ids) {
                   1965:                 my $rid = $_;
                   1966:         
1.196     www      1967:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1968: 
                   1969: #--------------------------------------------------------------------
                   1970: # @catmarker contains list of all possible parameters including part #s
                   1971: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1972: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1973: # When storing information, store as part 0
                   1974: # When requesting information, request from full part
                   1975: #-------------------------------------------------------------------
1.210     www      1976:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1977:                   my $tempkeyp = $_;
                   1978:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1979:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1980:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1981:                     $part{$tempkeyp}="0";
                   1982:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1983:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1984:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1985:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1986:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1987:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1988:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1989:                   }
                   1990:                 } # end loop through keys
                   1991:             } # end loop through ids
                   1992:                                  
                   1993: #---------------------------------------------------- print header information
1.133     www      1994: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1995:             $r->print(<<ENDMAPONE);
1.133     www      1996: <center><h4>$setdef
1.135     albertel 1997: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1998: ENDMAPONE
                   1999:             if ($uname) {
1.267     albertel 2000: 		my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 2001:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 2002:             } else {
1.135     albertel 2003:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 2004:             }
                   2005:             
1.135     albertel 2006:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306     albertel 2007:             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135     albertel 2008:             $r->print("</h4>\n");
1.57      albertel 2009: #---------------------------------------------------------------- print table
                   2010:             $r->print('<p><table border="2">');
1.130     www      2011:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   2012:             $r->print('<th>'.&mt('Default Value').'</th>');
                   2013:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 2014: 
1.210     www      2015: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  2016:                 $r->print('<tr>');
1.201     www      2017:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  2018:                        \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   2019:                                    $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 2020:             }
                   2021:             $r->print("</table></center>");
                   2022:         } # end of $parmlev eq general
1.43      albertel 2023:     }
1.280     albertel 2024:     $r->print('</form>'.&Apache::loncommon::end_page());
1.57      albertel 2025: } # end sub assessparms
1.30      www      2026: 
1.59      matthew  2027: 
                   2028: ##################################################
                   2029: ##################################################
                   2030: 
                   2031: =pod
                   2032: 
                   2033: =item crsenv
                   2034: 
1.105     matthew  2035: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  2036: be simplified and shortened... someday.
                   2037: 
                   2038: Inputs: $r
                   2039: 
                   2040: Returns: nothing
                   2041: 
                   2042: =cut
                   2043: 
                   2044: ##################################################
                   2045: ##################################################
1.30      www      2046: sub crsenv {
                   2047:     my $r=shift;
                   2048:     my $setoutput='';
1.280     albertel 2049: 
1.298     albertel 2050:     my $breadcrumbs = 
                   2051: 	&Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
1.190     albertel 2052:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2053:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  2054: 
1.392     raeburn  2055:     my (%crsinfo,$chome);
                   2056: 
1.105     matthew  2057:     #
                   2058:     # Go through list of changes
1.190     albertel 2059:     foreach (keys %env) {
1.105     matthew  2060:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   2061:         my $name  = $1;
1.190     albertel 2062:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  2063:         if ($name eq 'newp') {
1.190     albertel 2064:             $name = $env{'form.newp_name'};
1.105     matthew  2065:         }
                   2066:         if ($name eq 'url') {
                   2067:             $value=~s/^\/res\///;
                   2068:             my $bkuptime=time;
                   2069:             my @tmp = &Apache::lonnet::get
                   2070:                 ('environment',['url'],$dom,$crs);
1.130     www      2071:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  2072:                 &Apache::lonnet::put
                   2073:                 ('environment',
                   2074:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   2075:                  $dom,$crs).
1.336     albertel 2076:                      '<br />';
1.105     matthew  2077:         }
                   2078:         #
                   2079:         # Deal with modified default spreadsheets
                   2080:         if ($name =~ /^spreadsheet_default_(classcalc|
                   2081:                                             studentcalc|
                   2082:                                             assesscalc)$/x) {
                   2083:             my $sheettype = $1; 
                   2084:             if ($sheettype eq 'classcalc') {
                   2085:                 # no need to do anything since viewing the sheet will
                   2086:                 # cause it to be updated. 
                   2087:             } elsif ($sheettype eq 'studentcalc') {
                   2088:                 # expire all the student spreadsheets
                   2089:                 &Apache::lonnet::expirespread('','','studentcalc');
                   2090:             } else {
                   2091:                 # expire all the assessment spreadsheets 
                   2092:                 #    this includes non-default spreadsheets, but better to
                   2093:                 #    be safe than sorry.
                   2094:                 &Apache::lonnet::expirespread('','','assesscalc');
                   2095:                 # expire all the student spreadsheets
                   2096:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      2097:             }
1.105     matthew  2098:         }
                   2099:         #
1.107     matthew  2100:         # Deal with the enrollment dates
                   2101:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2102:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   2103:         }
1.364     albertel 2104: 	#
                   2105:         # Deal with the emails
                   2106:         if ($name =~ /\.email$/) {
1.371     albertel 2107: 	    foreach my $specifier (split(',',$value)) {
                   2108: 		my ($user,$sections_or_groups)=
                   2109: 		    ($specifier=~/^([^\(]+)\(([^\)]+)\)/);
                   2110: 		if (!$sections_or_groups) {
                   2111: 		    $user = $specifier;
                   2112: 		}
                   2113: 		my ($name,$domain) = split(':',$user);
                   2114: 		if (!defined($user) || !defined($domain)) {
                   2115: 		    $setoutput.= '<br /> <span class="LC_error">'.
                   2116: 			&mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).
                   2117: 			'</span>';
                   2118: 		    undef($value);
                   2119: 		} elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {
                   2120: 		    $setoutput.= '<br /> <span class="LC_error">'.
                   2121: 			&mt("Invalid email address specified, user [_1] is unknown.",$name).
                   2122: 			'</span>';
                   2123: 		    undef($value);
                   2124: 		}
1.364     albertel 2125: 	    }
                   2126:         }
1.178     raeburn  2127:         # Get existing cloners
                   2128:         my @oldcloner = ();
                   2129:         if ($name eq 'cloners') {
                   2130:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   2131:             if ($clonenames{'cloners'} =~ /,/) {
                   2132:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   2133:             } else {
                   2134:                 $oldcloner[0] = $clonenames{'cloners'};
                   2135:             }
                   2136:         }
1.107     matthew  2137:         #
1.105     matthew  2138:         # Let the user know we made the changes
1.153     albertel 2139:         if ($name && defined($value)) {
1.379     raeburn  2140:             my %failed_cloners;
1.178     raeburn  2141:             if ($name eq 'cloners') {
1.239     raeburn  2142:                 $value =~ s/\s//g;
1.178     raeburn  2143:                 $value =~ s/^,//;
                   2144:                 $value =~ s/,$//;
1.239     raeburn  2145:                 # check requested clones are valid users.
1.379     raeburn  2146:                 %failed_cloners = &check_cloners(\$value,\@oldcloner);
1.178     raeburn  2147:             }
1.105     matthew  2148:             my $put_result = &Apache::lonnet::put('environment',
                   2149:                                                   {$name=>$value},$dom,$crs);
                   2150:             if ($put_result eq 'ok') {
1.392     raeburn  2151:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>';
                   2152:                 if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2153:                     $setoutput .= &Apache::lonlocal::locallocaltime($value);
1.406     raeburn  2154:                 } elsif ($name eq 'categories') {
                   2155:                     $setoutput .= $env{'form.categories_display'};
1.392     raeburn  2156:                 } else {
                   2157:                     $setoutput .= $value;
                   2158:                 }
                   2159:                 $setoutput .= '</b>.<br />';
1.178     raeburn  2160:                 if ($name eq 'cloners') {
                   2161:                     &change_clone($value,\@oldcloner);
                   2162:                 }
1.382     raeburn  2163:                 # Update environment and nohist_courseids.db
1.402     raeburn  2164:                 if (($name eq 'description') || ($name eq 'cloners') || 
1.403     raeburn  2165:                     ($name eq 'hidefromcat') || ($name eq 'categories')) {
1.392     raeburn  2166:                     if ($chome eq '') {
                   2167:                         %crsinfo =
                   2168:                             &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
1.403     raeburn  2169:                                                  $crs,undef,undef,'.');
1.392     raeburn  2170:                         $chome = &Apache::lonnet::homeserver($crs,$dom);
                   2171:                     }
                   2172:                 }
1.179     raeburn  2173:                 if ($name eq 'description' && defined($value)) {
1.393     raeburn  2174:                     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value});
1.382     raeburn  2175:                     if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
                   2176:                         $crsinfo{$env{'request.course.id'}}{'description'} = $value; 
1.392     raeburn  2177:                         my $putresult =
                   2178:                             &Apache::lonnet::courseidput($dom,\%crsinfo,
                   2179:                                                          $chome,'notime');
                   2180:                     }
                   2181:                 }
1.403     raeburn  2182:                 if (($name eq 'cloners') || ($name eq 'hidefromcat') || ($name eq 'categories')) {
1.402     raeburn  2183:                     if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
1.403     raeburn  2184:                         &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$name => $value});
                   2185:                         $crsinfo{$env{'request.course.id'}}{$name} = $value;
1.402     raeburn  2186:                         my $putresult =
                   2187:                             &Apache::lonnet::courseidput($dom,\%crsinfo,
                   2188:                                                          $chome,'notime');
                   2189:                     }
                   2190:                 }
1.105     matthew  2191:             } else {
1.130     www      2192:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   2193: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      2194:             }
1.379     raeburn  2195:             if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) {
                   2196:                 $setoutput.= &mt('Unable to include').': ';
                   2197:                 my @fails;
                   2198:                 my $num = 0;
                   2199:                 if (defined($failed_cloners{'format'})) {
                   2200:                     $fails[$num] .= '<b>'.$failed_cloners{'format'}.
                   2201:                                   '</b>, '.&mt('reason').' - '.
                   2202:                                   &mt('Invalid format');
                   2203:                     $num ++;
                   2204:                 }
                   2205:                 if (defined($failed_cloners{'domain'})) {
                   2206:                     $fails[$num] .= '<b>'.$failed_cloners{'domain'}.
                   2207:                                   '</b>, '.&mt('reason').' - '.
                   2208:                                   &mt('Domain does not exist');
                   2209:                     $num ++;
                   2210:                 }
                   2211:                 if (defined($failed_cloners{'newuser'})) {
                   2212:                     $fails[$num] .= '<b>'.$failed_cloners{'newuser'}.                                   '</b>, '.&mt('reason').' - '.
                   2213:                         &mt('LON-CAPA user(s) do(es) not exist.').
                   2214:                         '.<br />'.&mt('Please ').
                   2215:                         ' <a href="/adm/createuser">'.
                   2216:                         &mt('add the user(s)').'</a>, '.
                   2217:                         &mt('and then return to the ').
                   2218:                         '<a href="/adm/parmset?action=crsenv">'.
                   2219:                         &mt('Course Parameters page').'</a> '.
                   2220:                         &mt('to add the new user(s) to the list of possible cloners');
                   2221:                 }
                   2222:                 $setoutput .= join(';&nbsp;&nbsp;',@fails).'.<br />';
1.239     raeburn  2223:             }
1.30      www      2224:         }
1.38      harris41 2225:     }
1.315     albertel 2226: 
                   2227:     my $start_table     =&Apache::loncommon::start_data_table();
                   2228:     my $start_header_row=&Apache::loncommon::start_data_table_header_row();
                   2229:     my $end_header_row  =&Apache::loncommon::end_data_table_header_row();
1.108     www      2230: # ------------------------- Re-init course environment entries for this session
                   2231: 
1.302     albertel 2232:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296     albertel 2233: 				       {'freshen_cache' => 1});
1.105     matthew  2234: 
1.30      www      2235: # -------------------------------------------------------- Get parameters again
1.45      matthew  2236: 
                   2237:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 2238:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 2239:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      2240:     my $output='';
1.403     raeburn  2241:     my $can_categorize;
1.45      matthew  2242:     if (! exists($values{'con_lost'})) {
1.30      www      2243:         my %descriptions=
1.395     bisitz   2244: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b><br />'.
1.46      matthew  2245:                                  '<a href="javascript:openbrowser'.
1.47      matthew  2246:                                  "('envform','url','sequence')\">".
1.314     albertel 2247:                                  &mt('Select Map').'</a><br /><span class="LC_warning"> '.
1.395     bisitz   2248:                                  &mt('Modification may make assessment data inaccessible!').
1.314     albertel 2249:                                  '</span>',
1.140     sakharuk 2250:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 2251:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 2252:                                  '</b><br />'.
1.395     bisitz   2253:                                  '('.&mt('internal, optional').')',
                   2254:              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br />'
                   2255:                                 .'("<tt>'.&mt('user:domain,user:domain,*:domain').'</tt>")<br />'
                   2256:                                 .&mt('Users with active Course Coordinator role in this course are permitted to clone and need not be included.').'<br />'
                   2257:                                 .&mt('Use [_1] to allow course to be cloned by anyone in the specified domain.','"<tt>*:domain</tt>"').'<br />'
                   2258:                                 .&mt('Use [_1] to allow unrestricted cloning in all domains.','"<tt>*</tt>"'),
1.150     www      2259:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
1.395     bisitz   2260:                                  &mt('[_1], [_2], or [_3]','"<tt>standard</tt>"','"<tt>external</tt>"','"<tt>spreadsheet</tt>"').&Apache::loncommon::help_open_topic('GradingOptions'),
                   2261: 	     'task_grading'   => '<b>'.&mt('Bridge Task Grading').'</b><br />'
                   2262:                                 .&mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections.').'<br />'
                   2263:                                 .'('.&mt('[_1]: they are allowed (this is the default). [_2]: no, they can only grade their own section.','"<tt>any</tt>"','"<tt>section</tt>"').')',
                   2264:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b><br />'.
1.52      www      2265:                     '<a href="javascript:openbrowser'.
                   2266:                     "('envform','default_xml_style'".
1.336     albertel 2267:                     ",'sty')\">$SelectStyleFile</a><br />",
1.395     bisitz   2268:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').'</b><br />'
                   2269:                                 .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',
                   2270:              'question.email.text' => '<b>'.&mt('Custom Text for Resource Content Question Option in Feedback').'</b>',
                   2271:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'
                   2272:                                 .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',
                   2273:              'comment.email.text' => '<b>'.&mt('Custom Text for Course Content Option in Feedback').'</b>',
                   2274:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b><br />'
                   2275:                                  .'("<tt>'.&mt('user:domain,user:domain(section;section;...;*;...),...').'</tt>")',
                   2276:              'policy.email.text' => '<b>'.&mt('Custom Text for Course Policy Option in Feedback').'</b>',
                   2277:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'
                   2278:                                 .'('.&mt('[_1] for default hiding','"<tt>yes</tt>"').')',
                   2279:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'
                   2280:                                  .'('.&mt('[_1] for visible separation.','"<tt>yes</tt>"').' '
                   2281:                                  .&mt('Changes will not show until next login.').')',
                   2282:              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b><br />'
                   2283:                                         .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"<tt>all</tt>"','"<tt>section</tt>"','"<tt>disabled</tt>"').')',
                   2284:              'student_classlist_portfiles' => '<b>'.&mt('Include link to accessible portfolio files').'</b><br />'
                   2285:                                              .'('.&mt('[_1] for link to each a listing of each student\'s files.','"<tt>yes</tt>"').')',
                   2286:              'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'
                   2287:                                            .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"<tt>yes</tt>"').')',
                   2288:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').'</b><br />'
                   2289:                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'
                   2290:                                  .'("<tt>'.&mt('role,role,...').'</tt>") '
                   2291: 	                         .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.118     matthew  2292:              'plc.users.denied' => 
1.141     sakharuk 2293:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.395     bisitz   2294:                                   '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',
1.118     matthew  2295: 
1.395     bisitz   2296:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').'</b><br />'
                   2297:                                  .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"')
                   2298:                                  .'("<tt>'.&mt('role,role,...').'</tt>") '
                   2299:                                  .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      2300:              'pch.users.denied' => 
1.141     sakharuk 2301:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.395     bisitz   2302:                                  '("<tt>'.&mt('user:domain,user:domain,...').'</tt>")',
1.49      matthew  2303:              'spreadsheet_default_classcalc' 
1.141     sakharuk 2304:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  2305:                     '<a href="javascript:openbrowser'.
                   2306:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 2307:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2308:              'spreadsheet_default_studentcalc' 
1.395     bisitz   2309:                  => '<b>'.&mt('Default Student Spreadsheet').'</b><br />'.
1.50      matthew  2310:                     '<a href="javascript:openbrowser'.
                   2311:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 2312:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2313:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 2314:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  2315:                     '<a href="javascript:openbrowser'.
                   2316:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 2317:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 2318: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 2319: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.395     bisitz   2320: 	            '('.&mt('Set value to [_1] to allow.','"<tt>yes</tt>"').')',
1.170     raeburn  2321:              'allow_discussion_post_editing'
1.395     bisitz   2322:                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />'
                   2323:                    .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"<tt>st</tt>"','"<tt>ta</tt>"','"<tt>in</tt>"').')<br />'
                   2324:                    .'('.&mt('Set value to [_1] to allow all roles.','"<tt>yes</tt>"').')'
                   2325:                    .'("<tt>'.&mt('role:section,role:section,...').'</tt>")<br />'
                   2326:                    .'('.&mt('Example: "<tt>st:001,st:002,in,cc</tt>" would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')',
1.89      albertel 2327: 	     'rndseed'
1.395     bisitz   2328: 	         => '<b>'.&mt('Randomization algorithm used').'</b><br />'
                   2329:                    .'<span class="LC_error">'
                   2330:                    .&mt('Modifying this will make problems have different numbers and answers!')
                   2331:                    .'</span>',
1.151     albertel 2332: 	     'receiptalg'
                   2333: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   2334:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 2335:              'suppress_tries'
1.272     albertel 2336:                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.395     bisitz   2337:                     ' ('.&mt('[_1] to suppress, anything else to not suppress','"<tt>yes</tt>"').')',
1.113     sakharuk 2338:              'problem_stream_switch'
1.141     sakharuk 2339:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.395     bisitz   2340:                     ' ('.&mt('[_1] if allowed, anything else if not','"<tt>yes</tt>"').')',
1.161     sakharuk 2341:              'default_paper_size' 
                   2342:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   2343:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   2344:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   2345:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.319     foxr     2346: 	     'print_header_format'
1.395     bisitz   2347: 	         => ' <b>'.&mt('Print header format').'</b><br />'
                   2348:                    .&mt('Substitutions:<br />[_1]: student name, [_2]: course id, [_3]: assignment note. Numbers after the <tt>%</tt> limit the field size.','"<tt>%n</tt>"','"<tt>%c</tt>"','"<tt>%a</tt>"'),
1.217     albertel 2349:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
                   2350:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
1.395     bisitz   2351:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b><br />'
                   2352:                                      .'("<tt>'.&mt('user:domain,user:domain,*:domain').'</tt>")',
1.140     sakharuk 2353:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      2354:              'disable_receipt_display'
1.141     sakharuk 2355:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 2356:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.313     albertel 2357: 	     'task_messages'
1.395     bisitz   2358: 	         => '<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 2359: 	     'disablesigfigs'
                   2360: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   2361:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251     albertel 2362: 	     'disableexampointprint'
                   2363: 	         => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                   2364:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278     www      2365:              'externalsyllabus'
1.279     www      2366:                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149     albertel 2367: 	     'tthoptions'
1.367     albertel 2368: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>',
                   2369: 
                   2370: 	     'texengine'
1.395     bisitz   2371: 	         => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'
1.396     bisitz   2372:                    .'('.&mt('[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student\'s preference','"<tt>jsMath</tt>"','"<tt>mimetex</tt>"','"<tt>tth</tt>"').')',
1.397     www      2373:              'timezone'
1.400     raeburn  2374:                  => '<b>'.&mt('Timezone in which the course takes place').'</b>',
1.392     raeburn  2375: 
1.400     raeburn  2376:              'suppress_embed_prompt'
                   2377:                  => '<b>'.&mt('Suppress prompt to upload items referenced in a web page being uploaded to portfolio, when current role is student.').'</b><br />'.
1.402     raeburn  2378:                     ' ('.&mt('[_1] to suppress, anything else to not suppress','"<tt>yes</tt>"').')',
1.403     raeburn  2379:              'hidefromcat'
1.402     raeburn  2380:                  => '<b>'.&mt('Exclude from course catalog').'</b><br />'.
                   2381:                     ' ('.&mt('[_1] to exclude, anything else to include - included if assigned an institutional code, or manually catagorized','"<tt>yes</tt>"').')',
1.403     raeburn  2382:              'categories'
                   2383:                  => '<b>'.&mt('Categorize course').'</b> <a href="javascript:catsbrowser()">'.
                   2384:                     &mt('Display Categories').'</a>',
1.409     raeburn  2385:              'datelocale' 
                   2386:                  => '<b>'.&mt('Locale used for course calendar').'</b>',
1.402     raeburn  2387:              );
                   2388:         my @Display_Order = ('url','description','courseid','cloners');
1.403     raeburn  2389:         (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom);
                   2390:         if ($can_toggle_cat) {
1.402     raeburn  2391:             push(@Display_Order,'hidefromcat');
                   2392:         }
1.403     raeburn  2393:         if ($can_categorize) {
                   2394:             push(@Display_Order,'categories');
                   2395:         }
1.402     raeburn  2396:         push (@Display_Order,('grading',
1.278     www      2397:                              'externalsyllabus',
1.107     matthew  2398:                              'default_xml_style','pageseparators',
1.402     raeburn  2399:                              'question.email','question.email.text','comment.email',
                   2400:                              'comment.email.text','policy.email','policy.email.text',
1.169     matthew  2401:                              'student_classlist_view',
1.372     raeburn  2402:                              'student_classlist_opt_in',
                   2403:                              'student_classlist_portfiles',
1.118     matthew  2404:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  2405:                              'pch.roles.denied','pch.users.denied',
                   2406:                              'allow_limited_html_in_feedback',
1.170     raeburn  2407:                              'allow_discussion_post_editing',
1.108     www      2408:                              'languages',
1.397     www      2409:                              'timezone',
1.409     raeburn  2410:                              'datelocale',
1.150     www      2411: 			     'nothideprivileged',
1.107     matthew  2412:                              'rndseed',
1.151     albertel 2413:                              'receiptalg',
1.107     matthew  2414:                              'problem_stream_switch',
1.164     sakharuk 2415: 			     'suppress_tries',
1.400     raeburn  2416:                              'suppress_embed_prompt',
1.161     sakharuk 2417:                              'default_paper_size',
1.319     foxr     2418: 			     'print_header_format',
1.115     www      2419:                              'disable_receipt_display',
1.107     matthew  2420:                              'spreadsheet_default_classcalc',
                   2421:                              'spreadsheet_default_studentcalc',
                   2422:                              'spreadsheet_default_assesscalc', 
                   2423:                              'hideemptyrows',
                   2424:                              'default_enrollment_start_date',
                   2425:                              'default_enrollment_end_date',
1.163     albertel 2426: 			     'tthoptions',
1.367     albertel 2427: 			     'texengine',
1.251     albertel 2428: 			     'disablesigfigs',
1.313     albertel 2429: 			     'disableexampointprint',
1.402     raeburn  2430: 			     'task_messages','task_grading'));
1.107     matthew  2431: 	foreach my $parameter (sort(keys(%values))) {
1.405     raeburn  2432:             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
                   2433:                     ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
                   2434:                     || ($parameter eq 'type')) {
1.142     raeburn  2435:                 if (! $descriptions{$parameter}) {
                   2436:                     $descriptions{$parameter}=$parameter;
                   2437:                     push(@Display_Order,$parameter);
                   2438:                 }
                   2439:             }
1.43      albertel 2440: 	}
1.315     albertel 2441: 	
1.107     matthew  2442:         foreach my $parameter (@Display_Order) {
                   2443:             my $description = $descriptions{$parameter};
1.51      matthew  2444:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      2445:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  2446:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  2447:                 '.checked=true;"';
1.315     albertel 2448:             $output .= &Apache::loncommon::start_data_table_row().
                   2449: 		'<td>'.$description.'</td>';
1.107     matthew  2450:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   2451:                 $output .= '<td>'.
                   2452:                     &Apache::lonhtmlcommon::date_setter('envform',
                   2453:                                                         $parameter.'_value',
                   2454:                                                         $values{$parameter},
                   2455:                                                         $onchange).
                   2456:                                                         '</td>';
1.398     www      2457:             } elsif ($parameter eq 'timezone') {
1.399     raeburn  2458:                 my $includeempty = 1;
                   2459:                 my $timezone = &Apache::lonlocal::gettimezone();
1.398     www      2460:                 $output .= '<td>'.
                   2461:                     &Apache::loncommon::select_timezone($parameter.'_value',
1.399     raeburn  2462:                                                         $timezone,
                   2463:                                                         $onchange,$includeempty).'</td>';
1.409     raeburn  2464:             } elsif ($parameter eq 'datelocale') {
                   2465:                 my $includeempty = 1;
                   2466:                 my $locale_obj = &Apache::lonlocal::getdatelocale();
                   2467:                 my $currdatelocale;
                   2468:                 if (ref($locale_obj)) {
                   2469:                     $currdatelocale = $locale_obj->id();
                   2470:                 }
                   2471:                 $output .= '<td>'.
                   2472:                     &Apache::loncommon::select_datelocale($parameter.'_value',
                   2473:                                                           $currdatelocale,
                   2474:                                                           $onchange,$includeempty).'</td>'; 
1.406     raeburn  2475:             } elsif ($parameter eq 'categories') {
                   2476:                 my $catdisplay;
                   2477:                 if ($values{'categories'} ne '') {
                   2478:                     my @curritems = split(/\&/,$values{'categories'});
                   2479:                     foreach my $item (@curritems) {
                   2480:                         my ($name,$parent,$pos) = split(/:/,$item);
                   2481:                         $catdisplay .= &unescape($name).'&';
                   2482:                     }
                   2483:                     $catdisplay =~ s/\&$//;
                   2484:                 } 
                   2485:                 $output .= '<td>'.
                   2486:                            '<input type="hidden" name="categories_value" value="'.
                   2487:                            $values{'categories'}.'" />'.
                   2488:                            '<input type="textbox" name="categories_display" value="'.
                   2489:                            $catdisplay.'" readonly="readonly" size="40" /></td>';
1.107     matthew  2490:             } else {
                   2491:                 $output .= '<td>'.
                   2492:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   2493:                                                     $values{$parameter},
                   2494:                                                     40,$onchange).'</td>';
                   2495:             }
                   2496:             $output .= '<td>'.
                   2497:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   2498:                 '</td>';
1.315     albertel 2499:             $output .= &Apache::loncommon::end_data_table_row()."\n";
1.51      matthew  2500: 	}
1.69      www      2501:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  2502:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   2503:             '.checked=true;"';
1.315     albertel 2504: 	$output.=&Apache::loncommon::start_data_table_row().
                   2505: 	    '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  2506: 	    '<input type="text" size=40 name="newp_name" '.
                   2507:                 $onchange.' /></td><td>'.
                   2508:             '<input type="text" size=40 name="newp_value" '.
                   2509:                 $onchange.' /></td><td>'.
1.315     albertel 2510: 	    '<input type="checkbox" name="newp_setparmval" /></td>'.
                   2511: 	    &Apache::loncommon::end_data_table_row()."\n";
1.43      albertel 2512:     }
1.157     sakharuk 2513:     my %lt=&Apache::lonlocal::texthash(
                   2514: 		    'par'   => 'Parameter',
                   2515: 		    'val'   => 'Value',
1.395     bisitz   2516: 		    'set'   => 'Set?',
                   2517: 		    'sav'   => 'Save'
1.157     sakharuk 2518: 				       );
                   2519: 
1.140     sakharuk 2520:     my $Parameter=&mt('Parameter');
                   2521:     my $Value=&mt('Value');
1.141     sakharuk 2522:     my $Set=&mt('Set');
1.403     raeburn  2523:     my ($jscript,$categorize_js);
                   2524:     my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');
                   2525:     if ($can_categorize) {
                   2526:         $categorize_js = <<ENDSCRIPT;
                   2527: function catsbrowser() {
                   2528:     var catswin = null;
                   2529:     var url = '/adm/parmset?action=categorizecourse';
                   2530:     if (!catswin || catswin.closed) {
                   2531:         catswin=window.open(url,'categorieswin','height=480,width=600,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
                   2532:     } else {
                   2533:         catswin.focus();
                   2534:     }
                   2535: } 
                   2536: ENDSCRIPT
                   2537:     }
                   2538:     $jscript = '<script type="text/javascript" language="Javascript">'."\n".
                   2539:                $browse_js."\n".$categorize_js."\n".'</script>';
1.280     albertel 2540:     my $start_page = 
1.323     albertel 2541: 	&Apache::loncommon::start_page('Set Course Environment',
1.403     raeburn  2542: 				       $jscript);
1.280     albertel 2543:     my $end_page = 
                   2544: 	&Apache::loncommon::end_page();
1.315     albertel 2545:     my $end_table=&Apache::loncommon::end_data_table();
1.280     albertel 2546:     $r->print(<<ENDENV);
                   2547: $start_page
1.193     albertel 2548: $breadcrumbs
                   2549: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      2550: $setoutput
1.395     bisitz   2551: <div><input type="submit" name="crsenv" value="$lt{'sav'}" /></div>
1.315     albertel 2552: $start_table
                   2553: $start_header_row
1.395     bisitz   2554: <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}</th>
1.315     albertel 2555: $end_header_row
1.30      www      2556: $output
1.315     albertel 2557: $end_table
1.395     bisitz   2558: <input type="submit" name="crsenv" value="$lt{'sav'}" />
1.30      www      2559: </form>
1.280     albertel 2560: $end_page
                   2561: ENDENV
1.30      www      2562: }
1.402     raeburn  2563: 
1.403     raeburn  2564: sub can_modify_catsettings {
1.402     raeburn  2565:     my ($dom) = @_;
                   2566:     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);
1.403     raeburn  2567:     my ($can_toggle_cat,$can_categorize);
1.402     raeburn  2568:     if (ref($domconf{'coursecategories'}) eq 'HASH') {
                   2569:         if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
                   2570:             $can_toggle_cat = 1;
                   2571:         }
1.403     raeburn  2572:         if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
                   2573:             $can_categorize = 1;
                   2574:         }
                   2575:     }
                   2576:     return ($can_toggle_cat,$can_categorize);
                   2577: }
                   2578: 
                   2579: sub assign_course_categories {
                   2580:     my ($r) = @_;
                   2581:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2582:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2583:     my $hascats = 0;
                   2584:     my $cathash;
                   2585:     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
                   2586:     if (ref($domconf{'coursecategories'}) eq 'HASH') {
                   2587:         $cathash = $domconf{'coursecategories'}{'cats'};
                   2588:         if (ref($cathash) eq 'HASH') {
                   2589:             $hascats = 1;   
                   2590:         }
1.402     raeburn  2591:     }
1.403     raeburn  2592:     my $catwin_js;
                   2593:     if ($hascats) {
                   2594:         my $alert = &mt('Use \"Save\" in the main window to save course categories');
                   2595:         $catwin_js = <<ENDSCRIPT;
                   2596: <script type="text/javascript">
                   2597: 
                   2598: function updateCategories() {
                   2599:     var newcategories = '';
1.406     raeburn  2600:     var unescapedcats = '';
1.403     raeburn  2601:     if (document.chgcats.usecategory.length) {
                   2602:         for (var i=0; i<document.chgcats.usecategory.length; i++) {
                   2603:             if (document.chgcats.usecategory[i].checked == true) {
                   2604:                 newcategories = newcategories + document.chgcats.usecategory[i].value + '&';
1.406     raeburn  2605:                 unescapedcats = unescapedcats + document.chgcats.catname[i].value + ' & ';
1.403     raeburn  2606:             }
                   2607:         }
                   2608:         if (newcategories.length > 0) {
                   2609:             newcategories = newcategories.slice(0,-1);
                   2610:         }
1.406     raeburn  2611:         if (unescapedcats.length > 0) {
1.408     raeburn  2612:             unescapedcats = unescapedcats.slice(0,-3);
1.406     raeburn  2613:         }
1.403     raeburn  2614:     } else {
                   2615:          if (document.chgcats.usecategory.checked == true) {
                   2616:              newcategories = document.chgcats.usecategory.value;
1.406     raeburn  2617:              unescapedcats = document.chgcats.catname.value;
1.403     raeburn  2618:          }
                   2619:     }
                   2620:     opener.document.envform.categories_value.value = newcategories;
1.406     raeburn  2621:     opener.document.envform.categories_display.value = unescapedcats;
1.403     raeburn  2622:     opener.document.envform.categories_setparmval.checked = true;
                   2623:     alert("$alert");
                   2624:     self.close();
                   2625:     return;
                   2626: }
                   2627: 
                   2628: </script>
                   2629: ENDSCRIPT
                   2630:     } else {
                   2631:         my $onload; 
                   2632:     }
                   2633:     my $start_page =
                   2634:         &Apache::loncommon::start_page('Course Categories',$catwin_js,
                   2635:                                        {'only_body'      => 1,});
                   2636:     my $end_page = &Apache::loncommon::end_page();
                   2637:     my $categoriesform = '<h3>'.&mt('Categorize Course').'</h3>';
                   2638:     if ($hascats) {
                   2639:         my %currsettings =
                   2640:             &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);
                   2641:         $categoriesform .= &mt('Assign one or more categories to this course.').'<br /><br />'.
                   2642:                                '<form name="chgcats" action="/adm/parmset" method="post">'."\n"
                   2643:                                .&Apache::loncommon::assign_categories_table($cathash,
                   2644:                                                        $currsettings{'categories'})."\n"
                   2645:                                .'<br /><input type="button" name="changes" value="'
                   2646:                                .&mt('Copy to main window').'" '
                   2647:                                .'onclick="javascript:updateCategories()" /></form><br />';
                   2648:     } else {
                   2649:         $categoriesform .= &mt('No categories defined for this domain');
                   2650:     }
                   2651:     $r->print($start_page.$categoriesform.$end_page);
                   2652:     return;
1.402     raeburn  2653: }
                   2654: 
1.120     www      2655: ##################################################
1.207     www      2656: # Overview mode
                   2657: ##################################################
1.124     www      2658: my $tableopen;
                   2659: 
                   2660: sub tablestart {
                   2661:     if ($tableopen) {
                   2662: 	return '';
                   2663:     } else {
                   2664: 	$tableopen=1;
1.295     albertel 2665: 	return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130     www      2666: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      2667:     }
                   2668: }
                   2669: 
                   2670: sub tableend {
                   2671:     if ($tableopen) {
                   2672: 	$tableopen=0;
1.295     albertel 2673: 	return &Apache::loncommon::end_data_table();
1.124     www      2674:     } else {
                   2675: 	return'';
                   2676:     }
                   2677: }
                   2678: 
1.207     www      2679: sub readdata {
                   2680:     my ($crs,$dom)=@_;
                   2681: # Read coursedata
                   2682:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   2683: # Read userdata
                   2684: 
                   2685:     my $classlist=&Apache::loncoursedata::get_classlist();
                   2686:     foreach (keys %$classlist) {
1.350     albertel 2687:         if ($_=~/^($match_username)\:($match_domain)$/) {
1.207     www      2688: 	    my ($tuname,$tudom)=($1,$2);
                   2689: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   2690:             foreach my $userkey (keys %{$useropt}) {
                   2691: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   2692:                     my $newkey=$userkey;
                   2693: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   2694: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   2695: 		}
                   2696: 	    }
                   2697: 	}
                   2698:     }
                   2699:     return $resourcedata;
                   2700: }
                   2701: 
                   2702: 
1.124     www      2703: # Setting
1.208     www      2704: 
                   2705: sub storedata {
                   2706:     my ($r,$crs,$dom)=@_;
1.207     www      2707: # Set userlevel immediately
                   2708: # Do an intermediate store of course level
                   2709:     my $olddata=&readdata($crs,$dom);
1.124     www      2710:     my %newdata=();
                   2711:     undef %newdata;
                   2712:     my @deldata=();
                   2713:     undef @deldata;
1.190     albertel 2714:     foreach (keys %env) {
1.124     www      2715: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   2716: 	    my $cmd=$1;
                   2717: 	    my $thiskey=$2;
1.207     www      2718: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   2719: 	    my $tkey=$thiskey;
                   2720:             if ($tuname) {
                   2721: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   2722: 	    }
1.385     albertel 2723: 	    if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
1.384     albertel 2724: 		my ($data, $typeof, $text);
                   2725: 		if ($cmd eq 'set') {
                   2726: 		    $data=$env{$_};
                   2727: 		    $typeof=$env{'form.typeof_'.$thiskey};
                   2728: 		    $text = &mt('Saved modified parameter for');
                   2729: 		} elsif ($cmd eq 'datepointer') {
                   2730: 		    $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
                   2731: 		    $typeof=$env{'form.typeof_'.$thiskey};
                   2732: 		    $text = &mt('Saved modified date for');
1.385     albertel 2733: 		} elsif ($cmd eq 'dateinterval') {
                   2734: 		    $data=&get_date_interval_from_form($thiskey);
                   2735: 		    $typeof=$env{'form.typeof_'.$thiskey};
                   2736: 		    $text = &mt('Saved modified date for');
1.384     albertel 2737: 		}
                   2738: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
1.207     www      2739: 		    if ($tuname) {
1.212     www      2740: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2741: 								 $tkey.'.type' => $typeof},
                   2742: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2743: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.384     albertel 2744: 			    $r->print('<br />'.$text.' '.
1.207     www      2745: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   2746: 			} else {
1.314     albertel 2747: 			    $r->print('<div class="LC_error">'.
1.365     albertel 2748: 				      &mt('Error saving parameters').'</div>');
1.207     www      2749: 			}
                   2750: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2751: 		    } else {
                   2752: 			$newdata{$thiskey}=$data;
1.212     www      2753:  			$newdata{$thiskey.'.type'}=$typeof; 
                   2754:                    } 
1.207     www      2755: 		}
1.124     www      2756: 	    } elsif ($cmd eq 'del') {
1.207     www      2757: 		if ($tuname) {
                   2758: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290     www      2759: 			    &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207     www      2760: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2761: 		    } else {
1.314     albertel 2762: 			$r->print('<div class="LC_error">'.
                   2763: 				  &mt('Error deleting parameters').'</div>');
1.207     www      2764: 		    }
                   2765: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2766: 		} else {
1.333     albertel 2767: 		    push (@deldata,$thiskey,$thiskey.'.type');
1.207     www      2768: 		}
1.124     www      2769: 	    }
                   2770: 	}
                   2771:     }
1.207     www      2772: # Store all course level
1.144     www      2773:     my $delentries=$#deldata+1;
                   2774:     my @newdatakeys=keys %newdata;
                   2775:     my $putentries=$#newdatakeys+1;
                   2776:     if ($delentries) {
                   2777: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290     www      2778: 	    my %loghash=map { $_ => '' } @deldata;
                   2779: 	    &log_parmset(\%loghash,1);
1.144     www      2780: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2781: 	} else {
1.314     albertel 2782: 	    $r->print('<div class="LC_error">'.
                   2783: 		      &mt('Error deleting parameters').'</div>');
1.144     www      2784: 	}
1.205     www      2785: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2786:     }
                   2787:     if ($putentries) {
                   2788: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290     www      2789: 			    &log_parmset(\%newdata,0);
1.365     albertel 2790: 	    $r->print('<h3>'.&mt('Saved [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2791: 	} else {
1.314     albertel 2792: 	    $r->print('<div class="LC_error">'.
1.365     albertel 2793: 		      &mt('Error saving parameters').'</div>');
1.144     www      2794: 	}
1.205     www      2795: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2796:     }
1.208     www      2797: }
1.207     www      2798: 
1.208     www      2799: sub extractuser {
                   2800:     my $key=shift;
1.350     albertel 2801:     return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
1.208     www      2802: }
1.206     www      2803: 
1.381     albertel 2804: sub parse_listdata_key {
                   2805:     my ($key,$listdata) = @_;
                   2806:     # split into student/section affected, and
                   2807:     # the realm (folder/resource part and parameter
                   2808:     my ($student,$realm) = 
                   2809: 	($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
                   2810:     # if course wide student would be undefined
                   2811:     if (!defined($student)) {
                   2812: 	($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
                   2813:     }
                   2814:     # strip off the .type if it's not the Question type parameter
                   2815:     if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
                   2816: 	$realm=~s/\.type//;
                   2817:     }
                   2818:     # split into resource+part and parameter name
1.388     albertel 2819:     my ($res,    $parm) = ($realm=~/^(.*)\.(.*)$/);
                   2820:        ($res, my $part) = ($res  =~/^(.*)\.(.*)$/);
1.381     albertel 2821:     return ($student,$res,$part,$parm);
                   2822: }
                   2823: 
1.208     www      2824: sub listdata {
1.214     www      2825:     my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207     www      2826: # Start list output
1.206     www      2827: 
1.122     www      2828:     my $oldsection='';
                   2829:     my $oldrealm='';
                   2830:     my $oldpart='';
1.123     www      2831:     my $pointer=0;
1.124     www      2832:     $tableopen=0;
1.145     www      2833:     my $foundkeys=0;
1.248     albertel 2834:     my %keyorder=&standardkeyorder();
1.381     albertel 2835: 
1.214     www      2836:     foreach my $thiskey (sort {
1.381     albertel 2837: 	my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
                   2838: 	my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
                   2839: 
                   2840: 	# get the numerical order for the param
                   2841: 	$aparm=$keyorder{'parameter_0_'.$aparm};
                   2842: 	$bparm=$keyorder{'parameter_0_'.$bparm};
                   2843: 
                   2844: 	my $result=0;
                   2845: 
1.214     www      2846: 	if ($sortorder eq 'realmstudent') {
1.381     albertel 2847:             if ($ares     ne $bres    ) {
                   2848: 		$result = ($ares     cmp $bres);
                   2849:             } elsif ($astudent ne $bstudent) { 
                   2850: 		$result = ($astudent cmp $bstudent);
                   2851: 	    } elsif ($apart    ne $bpart   ) {
                   2852: 		$result = ($apart    cmp $bpart);
1.237     albertel 2853: 	    }
1.381     albertel 2854: 	} else {
                   2855: 	    if      ($astudent ne $bstudent) { 
                   2856: 		$result = ($astudent cmp $bstudent);
                   2857: 	    } elsif ($ares     ne $bres    ) {
                   2858: 		$result = ($ares     cmp $bres);
                   2859: 	    } elsif ($apart    ne $bpart   ) {
                   2860: 		$result = ($apart    cmp $bpart);
1.247     albertel 2861: 	    }
1.381     albertel 2862: 	}
                   2863: 	    
                   2864: 	if (!$result) {
                   2865:             if (defined($aparm) && defined($bparm)) {
                   2866: 		$result = ($aparm <=> $bparm);
                   2867:             } elsif (defined($aparm)) {
                   2868: 		$result = -1;
                   2869:             } elsif (defined($bparm)) {
                   2870: 		$result = 1;
1.248     albertel 2871: 	    }
1.214     www      2872: 	}
1.381     albertel 2873: 
                   2874: 	$result;
1.214     www      2875:     } keys %{$listdata}) {
1.381     albertel 2876: 
1.211     www      2877: 	if ($$listdata{$thiskey.'.type'}) {
                   2878:             my $thistype=$$listdata{$thiskey.'.type'};
                   2879:             if ($$resourcedata{$thiskey.'.type'}) {
                   2880: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2881: 	    }
1.207     www      2882: 	    my ($middle,$part,$name)=
                   2883: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2884: 	    my $section=&mt('All Students');
1.207     www      2885: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2886: 		my $issection=$1;
1.350     albertel 2887: 		if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
1.206     www      2888: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2889: 		} else {
                   2890: 		    $section=&mt('Group/Section').': '.$issection;
                   2891: 		}
1.207     www      2892: 		$middle=~s/^\[(.*)\]//;
1.122     www      2893: 	    }
1.207     www      2894: 	    $middle=~s/\.+$//;
                   2895: 	    $middle=~s/^\.+//;
1.316     albertel 2896: 	    my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.122     www      2897: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316     albertel 2898: 		$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      2899: 	    } elsif ($middle) {
1.174     albertel 2900: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316     albertel 2901: 		$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      2902: 	    }
1.214     www      2903: 	    if ($sortorder eq 'realmstudent') {
                   2904: 		if ($realm ne $oldrealm) {
                   2905: 		    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                   2906: 		    $oldrealm=$realm;
                   2907: 		    $oldsection='';
                   2908: 		}
                   2909: 		if ($section ne $oldsection) {
                   2910: 		    $r->print(&tableend()."\n<h2>$section</h2>");
                   2911: 		    $oldsection=$section;
                   2912: 		    $oldpart='';
                   2913: 		}
                   2914: 	    } else {
                   2915: 		if ($section ne $oldsection) {
                   2916: 		    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                   2917: 		    $oldsection=$section;
                   2918: 		    $oldrealm='';
                   2919: 		}
                   2920: 		if ($realm ne $oldrealm) {
                   2921: 		    $r->print(&tableend()."\n<h2>$realm</h2>");
                   2922: 		    $oldrealm=$realm;
                   2923: 		    $oldpart='';
                   2924: 		}
1.122     www      2925: 	    }
                   2926: 	    if ($part ne $oldpart) {
1.124     www      2927: 		$r->print(&tableend().
1.316     albertel 2928: 			  "\n<span class=\"LC_parm_part\">".&mt('Part').": $part</span>");
1.122     www      2929: 		$oldpart=$part;
                   2930: 	    }
1.123     www      2931: #
                   2932: # Ready to print
                   2933: #
1.295     albertel 2934: 	    $r->print(&tablestart().
                   2935: 		      &Apache::loncommon::start_data_table_row().
                   2936: 		      '<td><b>'.&standard_parameter_names($name).
1.293     www      2937: 		      '</b></td><td><input type="checkbox" name="del_'.
1.124     www      2938: 		      $thiskey.'" /></td><td>');
1.145     www      2939: 	    $foundkeys++;
1.213     www      2940: 	    if (&isdateparm($thistype)) {
1.123     www      2941: 		my $jskey='key_'.$pointer;
                   2942: 		$pointer++;
                   2943: 		$r->print(
1.232     albertel 2944: 			  &Apache::lonhtmlcommon::date_setter('parmform',
1.123     www      2945: 							      $jskey,
1.219     www      2946: 						      $$resourcedata{$thiskey},
1.325     www      2947: 							      '',1,'','').
1.277     www      2948: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
1.390     www      2949: (($$resourcedata{$thiskey}!=0)?'<a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
                   2950: &mt('Shift all dates based on this date').'</a>':'').
1.277     www      2951: &date_sanity_info($$resourcedata{$thiskey})
1.123     www      2952: 			  );
1.385     albertel 2953: 	    } elsif ($thistype eq 'date_interval') {
                   2954: 		$r->print(&date_interval_selector($thiskey,
                   2955: 						  $$resourcedata{$thiskey}));
1.383     albertel 2956: 	    } elsif ($thistype =~ m/^string/) {
                   2957: 		$r->print(&string_selector($thistype,$thiskey,
                   2958: 					   $$resourcedata{$thiskey}));
1.123     www      2959: 	    } else {
1.383     albertel 2960: 		$r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
1.123     www      2961: 	    }
1.211     www      2962: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2963: 		      $thistype.'">');
1.295     albertel 2964: 	    $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122     www      2965: 	}
1.121     www      2966:     }
1.208     www      2967:     return $foundkeys;
                   2968: }
                   2969: 
1.385     albertel 2970: 
                   2971: sub date_interval_selector {
                   2972:     my ($thiskey, $showval) = @_;
                   2973:     my $result;
                   2974:     foreach my $which (['days', 86400, 31],
                   2975: 		       ['hours', 3600, 23],
                   2976: 		       ['minutes', 60, 59],
                   2977: 		       ['seconds',  1, 59]) {
                   2978: 	my ($name, $factor, $max) = @{ $which };
                   2979: 	my $amount = int($showval/$factor);
                   2980: 	$showval  %= $factor;
                   2981: 	my %select = ((map {$_ => $_} (0..$max)),
                   2982: 		      'select_form_order' => [0..$max]);
                   2983: 	$result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                   2984: 						   %select);
                   2985: 	$result .= ' '.&mt($name);
                   2986:     }
                   2987:     $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
                   2988:     return $result;
                   2989: 
                   2990: }
                   2991: 
                   2992: sub get_date_interval_from_form {
                   2993:     my ($key) = @_;
                   2994:     my $seconds = 0;
                   2995:     foreach my $which (['days', 86400],
                   2996: 		       ['hours', 3600],
                   2997: 		       ['minutes', 60],
                   2998: 		       ['seconds',  1]) {
                   2999: 	my ($name, $factor) = @{ $which };
                   3000: 	if (defined($env{'form.'.$name.'_'.$key})) {
                   3001: 	    $seconds += $env{'form.'.$name.'_'.$key} * $factor;
                   3002: 	}
                   3003:     }
                   3004:     return $seconds;
                   3005: }
                   3006: 
                   3007: 
1.383     albertel 3008: sub default_selector {
                   3009:     my ($thiskey, $showval) = @_;
1.385     albertel 3010:     return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';
1.383     albertel 3011: }
                   3012: 
                   3013: my %strings = 
                   3014:     (
                   3015:      'string_yesno'
                   3016:              => [[ 'yes', 'Yes' ],
                   3017: 		 [ 'no', 'No' ]],
                   3018:      'string_problemstatus'
                   3019:              => [[ 'yes', 'Yes' ],
1.394     www      3020: 		 [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
1.383     albertel 3021: 		 [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
                   3022: 		 [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
                   3023:      );
                   3024: 
                   3025: 
                   3026: sub string_selector {
                   3027:     my ($thistype, $thiskey, $showval) = @_;
                   3028:     
                   3029:     if (!exists($strings{$thistype})) {
                   3030: 	return &default_selector($thiskey,$showval);
                   3031:     }
                   3032: 
                   3033:     my $result;
                   3034:     foreach my $possibilities (@{ $strings{$thistype} }) {
                   3035: 	my ($name, $description) = @{ $possibilities };
                   3036: 	$result .= '<label><input type="radio" name="set_'.$thiskey.
                   3037: 		  '" value="'.$name.'"';
                   3038: 	if ($showval eq $name) {
                   3039: 	    $result .= ' checked="checked"';
                   3040: 	}
                   3041: 	$result .= ' />'.&mt($description).'</label> ';
                   3042:     }
                   3043:     return $result;
                   3044: }
                   3045: 
1.389     www      3046: #
                   3047: # Shift all start and end dates by $shift
                   3048: #
                   3049: 
                   3050: sub dateshift {
                   3051:     my ($shift)=@_;
                   3052:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3053:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3054:     my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
                   3055: # ugly retro fix for broken version of types
                   3056:     foreach my $key (keys %data) {
                   3057:         if ($key=~/\wtype$/) {
                   3058:             my $newkey=$key;
                   3059:             $newkey=~s/type$/\.type/;
                   3060:             $data{$newkey}=$data{$key};
                   3061:             delete $data{$key};
                   3062:         }
                   3063:     }
1.391     www      3064:     my %storecontent=();
1.389     www      3065: # go through all parameters and look for dates
                   3066:     foreach my $key (keys %data) {
                   3067:        if ($data{$key.'.type'}=~/^date_(start|end)$/) {
                   3068:           my $newdate=$data{$key}+$shift;
1.391     www      3069:           $storecontent{$key}=$newdate;
1.389     www      3070:        }
                   3071:     }
1.391     www      3072:     my $reply=&Apache::lonnet::cput
                   3073:                 ('resourcedata',\%storecontent,$dom,$crs);
                   3074:     if ($reply eq 'ok') {
                   3075:        &log_parmset(\%storecontent);
                   3076:     }
                   3077:     &Apache::lonnet::devalidatecourseresdata($crs,$dom);
                   3078:     return $reply;
1.389     www      3079: }
                   3080: 
1.208     www      3081: sub newoverview {
1.280     albertel 3082:     my ($r) = @_;
                   3083: 
1.208     www      3084:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3085:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 3086:     my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298     albertel 3087:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      3088:     $r->print(<<ENDOVER);
1.280     albertel 3089: $start_page
1.208     www      3090: $breadcrumbs
1.232     albertel 3091: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      3092: ENDOVER
1.211     www      3093:     my @ids=();
                   3094:     my %typep=();
                   3095:     my %keyp=();
                   3096:     my %allparms=();
                   3097:     my %allparts=();
                   3098:     my %allmaps=();
                   3099:     my %mapp=();
                   3100:     my %symbp=();
                   3101:     my %maptitles=();
                   3102:     my %uris=();
                   3103:     my %keyorder=&standardkeyorder();
                   3104:     my %defkeytype=();
                   3105: 
                   3106:     my %alllevs=();
                   3107:     $alllevs{'Resource Level'}='full';
1.215     www      3108:     $alllevs{'Map/Folder Level'}='map';
1.211     www      3109:     $alllevs{'Course Level'}='general';
                   3110: 
                   3111:     my $csec=$env{'form.csec'};
1.269     raeburn  3112:     my $cgroup=$env{'form.cgroup'};
1.211     www      3113: 
                   3114:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   3115:     my $pschp=$env{'form.pschp'};
                   3116:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   3117:     if (!@psprt) { $psprt[0]='0'; }
                   3118: 
                   3119:     my @selected_sections = 
                   3120: 	&Apache::loncommon::get_env_multiple('form.Section');
                   3121:     @selected_sections = ('all') if (! @selected_sections);
1.374     albertel 3122:     foreach my $sec (@selected_sections) {
                   3123:         if ($sec eq 'all') {
1.211     www      3124:             @selected_sections = ('all');
                   3125:         }
                   3126:     }
1.269     raeburn  3127:     my @selected_groups =
                   3128:         &Apache::loncommon::get_env_multiple('form.Group');
1.211     www      3129: 
                   3130:     my $pssymb='';
                   3131:     my $parmlev='';
                   3132:  
                   3133:     unless ($env{'form.parmlev'}) {
                   3134:         $parmlev = 'map';
                   3135:     } else {
                   3136:         $parmlev = $env{'form.parmlev'};
                   3137:     }
                   3138: 
                   3139:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   3140: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   3141: 				\%keyorder,\%defkeytype);
                   3142: 
1.374     albertel 3143:     if (grep {$_ eq 'all'} (@psprt)) {
                   3144: 	@psprt = keys(%allparts);
                   3145:     }
1.211     www      3146: # Menu to select levels, etc
                   3147: 
1.317     albertel 3148:     $r->print('<table id="LC_parm_overview_scope">
                   3149:                <tr><td class="LC_parm_overview_level_menu">');
1.211     www      3150:     &levelmenu($r,\%alllevs,$parmlev);
                   3151:     if ($parmlev ne 'general') {
1.317     albertel 3152: 	$r->print('<td class="LC_parm_overview_map_menu">');
1.211     www      3153: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   3154: 	$r->print('</td>');
                   3155:     }
                   3156:     $r->print('</td></tr></table>');
                   3157: 
1.317     albertel 3158:     $r->print('<table id="LC_parm_overview_controls">
                   3159:                <tr><td class="LC_parm_overview_parm_selectors">');  
1.211     www      3160:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.317     albertel 3161:     $r->print('</td><td class="LC_parm_overview_restrictions">
                   3162:                 <table class="LC_parm_overview_restrictions">'.
                   3163:               '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
                   3164:               '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
1.211     www      3165:     &partmenu($r,\%allparts,\@psprt);
1.317     albertel 3166:     $r->print('</td><td>');
1.211     www      3167:     &sectionmenu($r,\@selected_sections);
1.317     albertel 3168:     $r->print('</td><td>');
1.269     raeburn  3169:     &groupmenu($r,\@selected_groups);
                   3170:     $r->print('</td></tr></table>');
1.214     www      3171:     $r->print('</td></tr></table>');
                   3172:  
                   3173:     my $sortorder=$env{'form.sortorder'};
                   3174:     unless ($sortorder) { $sortorder='realmstudent'; }
                   3175:     &sortmenu($r,$sortorder);
                   3176: 
                   3177:     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      3178: 
                   3179: # Build the list data hash from the specified parms
                   3180: 
                   3181:     my $listdata;
                   3182:     %{$listdata}=();
                   3183: 
                   3184:     foreach my $cat (@pscat) {
1.269     raeburn  3185:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
                   3186:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211     www      3187:     }
                   3188: 
1.212     www      3189:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      3190: 
1.212     www      3191: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      3192: 
                   3193: # Read modified data
                   3194: 
                   3195: 	my $resourcedata=&readdata($crs,$dom);
                   3196: 
                   3197: # List data
                   3198: 
1.214     www      3199: 	&listdata($r,$resourcedata,$listdata,$sortorder);
1.211     www      3200:     }
                   3201:     $r->print(&tableend().
1.365     albertel 3202: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
1.280     albertel 3203: 	      '</form>'.&Apache::loncommon::end_page());
1.208     www      3204: }
                   3205: 
1.269     raeburn  3206: sub secgroup_lister {
                   3207:     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
                   3208:     foreach my $item (@{$selections}) {
                   3209:         foreach my $part (@{$psprt}) {
                   3210:             my $rootparmkey=$env{'request.course.id'};
                   3211:             if (($item ne 'all') && ($item ne 'none') && ($item)) {
                   3212:                 $rootparmkey.='.['.$item.']';
                   3213:             }
                   3214:             if ($parmlev eq 'general') {
                   3215: # course-level parameter
                   3216:                 my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   3217:                 $$listdata{$newparmkey}=1;
                   3218:                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   3219:             } elsif ($parmlev eq 'map') {
                   3220: # map-level parameter
                   3221:                 foreach my $mapid (keys %{$allmaps}) {
                   3222:                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   3223:                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                   3224:                     $$listdata{$newparmkey}=1;
                   3225:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   3226:                 }
                   3227:             } else {
                   3228: # resource-level parameter
                   3229:                 foreach my $rid (@{$ids}) {
                   3230:                     my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
                   3231:                     if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
                   3232:                     my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
                   3233:                     $$listdata{$newparmkey}=1;
                   3234:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   3235:                 }
                   3236:             }
                   3237:         }
                   3238:     }
                   3239: }
                   3240: 
1.208     www      3241: sub overview {
1.280     albertel 3242:     my ($r) = @_;
1.208     www      3243:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3244:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 3245: 
                   3246:     my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298     albertel 3247:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      3248:     $r->print(<<ENDOVER);
1.280     albertel 3249: $start_page
1.208     www      3250: $breadcrumbs
1.232     albertel 3251: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208     www      3252: ENDOVER
                   3253: # Store modified
                   3254: 
                   3255:     &storedata($r,$crs,$dom);
                   3256: 
                   3257: # Read modified data
                   3258: 
                   3259:     my $resourcedata=&readdata($crs,$dom);
                   3260: 
1.214     www      3261: 
                   3262:     my $sortorder=$env{'form.sortorder'};
                   3263:     unless ($sortorder) { $sortorder='realmstudent'; }
                   3264:     &sortmenu($r,$sortorder);
                   3265: 
1.208     www      3266: # List data
                   3267: 
1.214     www      3268:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208     www      3269: 
1.145     www      3270:     $r->print(&tableend().'<p>'.
1.280     albertel 3271: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
                   3272: 	      &Apache::loncommon::end_page());
1.120     www      3273: }
1.121     www      3274: 
1.333     albertel 3275: sub clean_parameters {
                   3276:     my ($r) = @_;
                   3277:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3278:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3279: 
                   3280:     my $start_page=&Apache::loncommon::start_page('Clean Parameters');
                   3281:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean');
                   3282:     $r->print(<<ENDOVER);
                   3283: $start_page
                   3284: $breadcrumbs
                   3285: <form method="post" action="/adm/parmset?action=cleanparameters" name="parmform">
                   3286: ENDOVER
                   3287: # Store modified
                   3288: 
                   3289:     &storedata($r,$crs,$dom);
                   3290: 
                   3291: # Read modified data
                   3292: 
                   3293:     my $resourcedata=&readdata($crs,$dom);
                   3294: 
                   3295: # List data
                   3296: 
                   3297:     $r->print('<h3>'.
                   3298: 	      &mt('These parameters refer to resources that do not exist.').
                   3299: 	      '</h3>'.
                   3300: 	      '<input type="submit" value="'.&mt('Delete Checked Parameters').'" />'.'<br />'.
                   3301: 	      '<br />');
                   3302:     $r->print(&Apache::loncommon::start_data_table().
                   3303: 	      '<tr>'.
                   3304: 	      '<th>'.&mt('Delete').'</th>'.
                   3305: 	      '<th>'.&mt('Parameter').'</th>'.
                   3306: 	      '</tr>');
                   3307:     foreach my $thiskey (sort(keys(%{$resourcedata}))) {
                   3308: 	next if (!exists($resourcedata->{$thiskey.'.type'})
                   3309: 		 && $thiskey=~/\.type$/);
                   3310: 	my %data = &parse_key($thiskey);
1.383     albertel 3311: 	if (1) { #exists($data{'realm_exists'})
                   3312: 	    #&& !$data{'realm_exists'}) {
1.333     albertel 3313: 	    $r->print(&Apache::loncommon::start_data_table_row().
                   3314: 		      '<tr>'.
                   3315: 		      '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'		      );
                   3316: 	    
                   3317: 	    $r->print('<td>');
1.362     albertel 3318: 	    my $display_value = $resourcedata->{$thiskey};
                   3319: 	    if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
                   3320: 		$display_value = 
                   3321: 		    &Apache::lonlocal::locallocaltime($display_value);
                   3322: 	    }
1.333     albertel 3323: 	    $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
                   3324: 			  &standard_parameter_names($data{'parameter_name'}),
                   3325: 			  $resourcedata->{$thiskey}));
                   3326: 	    $r->print('<br />');
                   3327: 	    if ($data{'scope_type'} eq 'all') {
                   3328: 		$r->print(&mt('All users'));
                   3329: 	    } elsif ($data{'scope_type'} eq 'user') {
                   3330: 		$r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
                   3331: 	    } elsif ($data{'scope_type'} eq 'section') {
                   3332: 		$r->print(&mt('Section: [_1]',$data{'scope'}));
                   3333: 	    } elsif ($data{'scope_type'} eq 'group') {
                   3334: 		$r->print(&mt('Group: [_1]',$data{'scope'}));
                   3335: 	    }
                   3336: 	    $r->print('<br />');
                   3337: 	    if ($data{'realm_type'} eq 'all') {
                   3338: 		$r->print(&mt('All Resources'));
                   3339: 	    } elsif ($data{'realm_type'} eq 'folder') {
                   3340: 		$r->print(&mt('Folder: [_1]'),$data{'realm'});
                   3341: 	    } elsif ($data{'realm_type'} eq 'symb') {
                   3342: 		my ($map,$resid,$url) =
                   3343: 		    &Apache::lonnet::decode_symb($data{'realm'});
                   3344: 		$r->print(&mt('Resource: [_1] <br />&nbsp;&nbsp;&nbsp;with ID: [_2] <br />&nbsp;&nbsp;&nbsp;in folder [_3]',
                   3345: 			      $url,$resid,$map));
                   3346: 	    }
1.362     albertel 3347: 	    $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));
1.333     albertel 3348: 	    $r->print('</td></tr>');
                   3349: 	
                   3350: 	}
                   3351:     }
                   3352:     $r->print(&Apache::loncommon::end_data_table().'<p>'.
                   3353: 	      '<input type="submit" value="'.&mt('Delete Checked Parameters').'" />'.
                   3354: 	      '</p></form>'.
                   3355: 	      &Apache::loncommon::end_page());
                   3356: }
                   3357: 
1.390     www      3358: sub date_shift_one {
                   3359:     my ($r) = @_;
                   3360:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3361:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3362: 
                   3363:     my $start_page=&Apache::loncommon::start_page('Shift Dates');
                   3364:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
                   3365:     $r->print(<<ENDOVER);
                   3366: $start_page
                   3367: $breadcrumbs
                   3368: ENDOVER
                   3369:     $r->print('<form name="shiftform" method="post">'.
                   3370:               '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
                   3371:               &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
                   3372:               '<tr><td>'.&mt('Shifted date:').'</td><td>'.
                   3373:                     &Apache::lonhtmlcommon::date_setter('shiftform',
                   3374:                                                         'timeshifted',
                   3375:                                                         $env{'form.timebase'},,
                   3376:                                                         '').
                   3377:               '</td></tr></table>'.
                   3378:               '<input type="hidden" name="action" value="dateshift2" />'.
                   3379:               '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
                   3380:               '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
                   3381:     $r->print(&Apache::loncommon::end_page());
                   3382: }
                   3383: 
                   3384: sub date_shift_two {
                   3385:     my ($r) = @_;
                   3386:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3387:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3388:     my $start_page=&Apache::loncommon::start_page('Shift Dates');
                   3389:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
                   3390:     $r->print(<<ENDOVER);
                   3391: $start_page
                   3392: $breadcrumbs
                   3393: ENDOVER
                   3394:     my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
                   3395:     $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
                   3396:               &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
                   3397:               &Apache::lonlocal::locallocaltime($timeshifted)));
                   3398:     my $delta=$timeshifted-$env{'form.timebase'};
                   3399:     &dateshift($delta);
                   3400:     $r->print(&Apache::loncommon::end_page());
                   3401: }
                   3402: 
1.333     albertel 3403: sub parse_key {
                   3404:     my ($key) = @_;
                   3405:     my %data;
                   3406:     my ($middle,$part,$name)=
                   3407: 	($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
                   3408:     $data{'scope_type'} = 'all';
                   3409:     if ($middle=~/^\[(.*)\]/) {
                   3410:        	$data{'scope'} = $1;
1.350     albertel 3411: 	if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
1.333     albertel 3412: 	    $data{'scope_type'} = 'user';
                   3413: 	    $data{'scope'} = [$1,$2];
                   3414: 	} else {
                   3415: 	    #FIXME check for group scope
                   3416: 	    $data{'scope_type'} = 'section';
                   3417: 	}
                   3418: 	$middle=~s/^\[(.*)\]//;
                   3419:     }
                   3420:     $middle=~s/\.+$//;
                   3421:     $middle=~s/^\.+//;
                   3422:     $data{'realm_type'}='all';
                   3423:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
                   3424: 	$data{'realm'} = $1;
                   3425: 	$data{'realm_type'} = 'folder';
                   3426: 	$data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
                   3427: 	($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
                   3428:     } elsif ($middle) {
                   3429: 	$data{'realm'} = $middle;
                   3430: 	$data{'realm_type'} = 'symb';
                   3431: 	$data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
                   3432: 	my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
                   3433: 	$data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
                   3434:     }
                   3435:     
                   3436:     $data{'parameter_part'} = $part;
                   3437:     $data{'parameter_name'} = $name;
                   3438: 
                   3439:     return %data;
                   3440: }
                   3441: 
1.59      matthew  3442: ##################################################
                   3443: ##################################################
1.333     albertel 3444: 
1.178     raeburn  3445: =pod
1.239     raeburn  3446: 
                   3447: =item check_cloners
                   3448: 
                   3449: Checks if new users included in list of allowed cloners
                   3450: are valid users.  Replaces supplied list with 
                   3451: cleaned list containing only users with valid usernames
                   3452: and domains.
                   3453: 
                   3454: Inputs: $clonelist, $oldcloner 
                   3455: where $clonelist is ref to array of requested cloners,
                   3456: and $oldcloner is ref to array of currently allowed
                   3457: cloners.
                   3458: 
                   3459: Returns: string - comma separated list of requested
                   3460: cloners (username:domain) who do not exist in system.
                   3461: 
                   3462: =item change_clone
                   3463: 
1.178     raeburn  3464: Modifies the list of courses a user can clone (stored
1.239     raeburn  3465: in the user's environment.db file), called when a
1.178     raeburn  3466: change is made to the list of users allowed to clone
                   3467: a course.
1.239     raeburn  3468: 
1.178     raeburn  3469: Inputs: $action,$cloner
                   3470: where $action is add or drop, and $cloner is identity of 
                   3471: user for whom cloning ability is to be changed in course. 
                   3472: 
                   3473: =cut
1.380     albertel 3474: 
1.178     raeburn  3475: ##################################################
                   3476: ##################################################
                   3477: 
1.239     raeburn  3478: sub extract_cloners {
                   3479:     my ($clonelist,$allowclone) = @_;
                   3480:     if ($clonelist =~ /,/) {
1.380     albertel 3481:         @{$allowclone} = split(/,/,$clonelist);
1.239     raeburn  3482:     } else {
                   3483:         $$allowclone[0] = $clonelist;
                   3484:     }
                   3485: }
                   3486: 
                   3487: sub check_cloners {
                   3488:     my ($clonelist,$oldcloner) = @_;
1.379     raeburn  3489:     my ($clean_clonelist,%disallowed);
1.239     raeburn  3490:     my @allowclone = ();
                   3491:     &extract_cloners($$clonelist,\@allowclone);
                   3492:     foreach my $currclone (@allowclone) {
1.380     albertel 3493:         if (!grep(/^\Q$currclone\E$/,@$oldcloner)) {
1.379     raeburn  3494:             if ($currclone eq '*') {
                   3495:                 $clean_clonelist .= $currclone.',';
                   3496:             } else {
                   3497:                 my ($uname,$udom) = split(/:/,$currclone);
                   3498:                 if ($uname eq '*') {
                   3499:                     if ($udom =~ /^$match_domain$/) {
1.380     albertel 3500:                         if (!&Apache::lonnet::domain($udom)) {
1.379     raeburn  3501:                             $disallowed{'domain'} .= $currclone.',';
                   3502:                         } else {
                   3503:                             $clean_clonelist .= $currclone.',';
                   3504:                         }
                   3505:                     } else {
                   3506:                         $disallowed{'format'} .= $currclone.',';
                   3507:                     }
                   3508:                 } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {
                   3509:                     $disallowed{'format'} .= $currclone.','; 
1.239     raeburn  3510:                 } else {
1.379     raeburn  3511:                     if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   3512:                         $disallowed{'newuser'} .= $currclone.',';
                   3513:                     } else {
                   3514:                         $clean_clonelist .= $currclone.',';
                   3515:                     }
1.239     raeburn  3516:                 }
                   3517:             }
                   3518:         } else {
                   3519:             $clean_clonelist .= $currclone.',';
                   3520:         }
                   3521:     }
1.379     raeburn  3522:     foreach my $key (keys(%disallowed)) {
                   3523:         $disallowed{$key} =~ s/,$//;
1.239     raeburn  3524:     }
                   3525:     if ($clean_clonelist) {
                   3526:         $clean_clonelist =~ s/,$//;
                   3527:     }
                   3528:     $$clonelist = $clean_clonelist;
1.379     raeburn  3529:     return %disallowed;
                   3530: }
1.178     raeburn  3531: 
                   3532: sub change_clone {
                   3533:     my ($clonelist,$oldcloner) = @_;
                   3534:     my ($uname,$udom);
1.190     albertel 3535:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3536:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  3537:     my $clone_crs = $cnum.':'.$cdom;
                   3538:     
                   3539:     if ($cnum && $cdom) {
1.239     raeburn  3540:         my @allowclone;
                   3541:         &extract_cloners($clonelist,\@allowclone);
1.178     raeburn  3542:         foreach my $currclone (@allowclone) {
1.380     albertel 3543:             if (!grep(/^$currclone$/,@$oldcloner)) {
1.379     raeburn  3544:                 if ($currclone ne '*') {
1.380     albertel 3545:                     ($uname,$udom) = split(/:/,$currclone);
1.379     raeburn  3546:                     if ($uname && $udom && $uname ne '*') {
                   3547:                         if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                   3548:                             my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   3549:                             if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   3550:                                 if ($currclonecrs{'cloneable'} eq '') {
                   3551:                                     $currclonecrs{'cloneable'} = $clone_crs;
                   3552:                                 } else {
                   3553:                                     $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   3554:                                 }
                   3555:                                 &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
1.178     raeburn  3556:                             }
                   3557:                         }
                   3558:                     }
                   3559:                 }
                   3560:             }
                   3561:         }
                   3562:         foreach my $oldclone (@$oldcloner) {
1.380     albertel 3563:             if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
1.379     raeburn  3564:                 if ($oldclone ne '*') {
1.380     albertel 3565:                     ($uname,$udom) = split(/:/,$oldclone);
1.379     raeburn  3566:                     if ($uname && $udom && $uname ne '*' ) {
                   3567:                         if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                   3568:                             my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   3569:                             my %newclonecrs = ();
                   3570:                             if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   3571:                                 if ($currclonecrs{'cloneable'} =~ /,/) {
                   3572:                                     my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   3573:                                     foreach my $crs (@currclonecrs) {
                   3574:                                         if ($crs ne $clone_crs) {
                   3575:                                             $newclonecrs{'cloneable'} .= $crs.',';
                   3576:                                         }
1.178     raeburn  3577:                                     }
1.379     raeburn  3578:                                     $newclonecrs{'cloneable'} =~ s/,$//;
                   3579:                                 } else {
                   3580:                                     $newclonecrs{'cloneable'} = '';
1.178     raeburn  3581:                                 }
1.379     raeburn  3582:                                 &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
1.178     raeburn  3583:                             }
                   3584:                         }
                   3585:                     }
                   3586:                 }
                   3587:             }
                   3588:         }
                   3589:     }
                   3590: }
                   3591: 
1.193     albertel 3592: 
                   3593: ##################################################
                   3594: ##################################################
                   3595: 
                   3596: =pod
                   3597: 
                   3598: =item * header
                   3599: 
                   3600: Output html header for page
                   3601: 
                   3602: =cut
                   3603: 
                   3604: ##################################################
                   3605: ##################################################
                   3606: sub header {
1.280     albertel 3607:     return &Apache::loncommon::start_page('Parameter Manager');
1.193     albertel 3608: }
                   3609: ##################################################
                   3610: ##################################################
                   3611: sub print_main_menu {
                   3612:     my ($r,$parm_permission)=@_;
                   3613:     #
                   3614:     $r->print(<<ENDMAINFORMHEAD);
                   3615: <form method="post" enctype="multipart/form-data"
                   3616:       action="/adm/parmset" name="studentform">
                   3617: ENDMAINFORMHEAD
                   3618: #
1.195     albertel 3619:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   3620:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268     albertel 3621:     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
1.366     albertel 3622:     my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
1.268     albertel 3623: 
1.193     albertel 3624:     my @menu =
1.322     www      3625:         ( { divider=>'Settings for Your Course',
                   3626: 	  },
1.323     albertel 3627:           { text => 'Set Course Environment',
1.204     www      3628: 	    action => 'crsenv',
1.193     albertel 3629:             permission => $parm_permission,
1.324     www      3630:             help => 'Course_Environment',
1.193     albertel 3631:             },
1.255     banghart 3632:           { text => 'Set Portfolio Metadata',
1.259     banghart 3633: 	    action => 'setrestrictmeta',
1.240     banghart 3634:             permission => $parm_permission,
                   3635:             },
1.271     www      3636: 	  { text => 'Manage Course Slots',
1.268     albertel 3637: 	    url => '/adm/slotrequest?command=showslots',
                   3638: 	    permission => $vgr,
                   3639:             },
1.366     albertel 3640: 	  { text => 'Reset Student Access Times',
                   3641: 	    url => '/adm/helper/resettimes.helper',
                   3642: 	    permission => $mgr,
                   3643:             },
                   3644: 
1.322     www      3645:           { text => 'Set Parameter Setting Default Actions',
                   3646:             action => 'setdefaults',
                   3647:             permission => $parm_permission,
                   3648:             },          
                   3649: 	  { divider => 'New and Existing Parameter Settings for Your Resources',
1.268     albertel 3650: 	    },
1.216     www      3651:           { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193     albertel 3652:             url => '/adm/helper/parameter.helper',
                   3653:             permission => $parm_permission,
1.324     www      3654:             help => 'Parameter_Helper',
1.193     albertel 3655:             },
1.322     www      3656:  	  { text => 'Set/Modify Resource Parameters - Overview Mode',
1.208     www      3657:             action => 'newoverview',
                   3658:             permission => $parm_permission,
1.324     www      3659:             help => 'Parameter_Overview',
1.193     albertel 3660:             },
1.216     www      3661:           { text => 'Set/Modify Resource Parameters - Table Mode',
1.193     albertel 3662:             action => 'settable',
                   3663:             permission => $parm_permission,
1.324     www      3664:             help => 'Table_Mode',
1.193     albertel 3665:             },
1.322     www      3666:            { divider => 'Existing Parameter Settings for Your Resources',
                   3667: 	  },
                   3668: 	  { text => 'Modify Resource Parameters - Overview Mode',
                   3669:             action => 'setoverview',
1.220     www      3670:             permission => $parm_permission,
1.324     www      3671:             help => 'Parameter_Overview',
1.322     www      3672:  	    },          
1.292     www      3673: 	  { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284     www      3674:             action => 'parameterchangelog',
                   3675:             permission => $parm_permission,
1.220     www      3676:             },
1.193     albertel 3677:           );
                   3678:     my $menu_html = '';
                   3679:     foreach my $menu_item (@menu) {
1.268     albertel 3680: 	if ($menu_item->{'divider'}) {
1.322     www      3681: 	    $menu_html .= '<h3>'.&mt($menu_item->{'divider'}).'</h3>';
1.268     albertel 3682: 	    next;
                   3683: 	}
1.193     albertel 3684:         next if (! $menu_item->{'permission'});
                   3685:         $menu_html.='<p>';
1.316     albertel 3686:         $menu_html.='<span class="LC_parm_menu_item">';
1.193     albertel 3687:         if (exists($menu_item->{'url'})) {
                   3688:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   3689:         } else {
                   3690:             $menu_html.=
                   3691:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   3692:         }
1.316     albertel 3693:         $menu_html.= &mt($menu_item->{'text'}).'</a></span>';
1.193     albertel 3694:         if (exists($menu_item->{'help'})) {
                   3695:             $menu_html.=
                   3696:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   3697:         }
                   3698:         $menu_html.='</p>'.$/;
                   3699:     }
                   3700:     $r->print($menu_html);
                   3701:     return;
                   3702: }
1.255     banghart 3703: ### Set portfolio metadata
1.252     banghart 3704: sub output_row {
1.347     banghart 3705:     my ($r, $field_name, $field_text, $added_flag) = @_;
1.252     banghart 3706:     my $output;
1.263     banghart 3707:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3708:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337     banghart 3709:     if (!defined($options)) {
1.254     banghart 3710:         $options = 'active,stuadd';
1.261     banghart 3711:         $values = '';
1.252     banghart 3712:     }
1.337     banghart 3713:     if (!($options =~ /deleted/)) {
                   3714:         my @options= ( ['active', 'Show to student'],
1.351     banghart 3715:                     ['stuadd', 'Provide text area for students to type catalog information'],
                   3716:                     ['choices','Provide choices for students to select from']);
                   3717: #		   ['onlyone','Student may select only one choice']);
1.337     banghart 3718:         if ($added_flag) {
                   3719:             push @options,['deleted', 'Delete Metadata Field'];
                   3720:         }
1.351     banghart 3721:        $output = &Apache::loncommon::start_data_table_row();
                   3722:         $output .= '<td><span class="LC_metadata"><strong>'.$field_text.':</strong></span></td>';
                   3723:         $output .= &Apache::loncommon::end_data_table_row();
1.337     banghart 3724:         foreach my $opt (@options) {
                   3725: 	    my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
1.347     banghart 3726: 	    $output .= &Apache::loncommon::continue_data_table_row();
1.351     banghart 3727: 	    $output .= '<td>'.('&nbsp;' x 5).'<span class="LC_metadata"><label>
                   3728: 	               <input type="checkbox" name="'.
                   3729: 	               $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3730: 	               &mt($opt->[1]).'</label></span> </td>';
1.347     banghart 3731: 	    $output .= &Apache::loncommon::end_data_table_row();
1.337     banghart 3732: 	}
1.351     banghart 3733:         $output .= &Apache::loncommon::continue_data_table_row();
                   3734:         $output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata"><input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></span></td>';
                   3735:         $output .= &Apache::loncommon::end_data_table_row();
                   3736:         my $multiple_checked;
                   3737:         my $single_checked;
                   3738:         if ($options =~ m/onlyone/) {
                   3739:             $multiple_checked = "";
                   3740:             $single_checked = " CHECKED ";
                   3741:         } else {
                   3742:             $multiple_checked = " CHECKED ";
                   3743:             $single_checked = "";
                   3744:         }
                   3745: 	$output .= &Apache::loncommon::continue_data_table_row();
                   3746: 	$output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata">
                   3747: 	            <input type="radio" name="'.$field_name.'_onlyone" value="multiple" '.$multiple_checked .'/>
                   3748: 	            Student may select multiple choices from list</span></td>';
                   3749: 	$output .= &Apache::loncommon::end_data_table_row();
                   3750: 	$output .= &Apache::loncommon::continue_data_table_row();
                   3751: 	$output .= '<td>'.('&nbsp;' x 10).'<span class="LC_metadata">
                   3752: 	            <input type="radio" name="'.$field_name.'_onlyone"  value="single" '.$single_checked.'/>
                   3753: 	            Student may select only one choice from list</span></td>';
                   3754: 	$output .= &Apache::loncommon::end_data_table_row();
1.252     banghart 3755:     }
                   3756:     return ($output);
                   3757: }
1.340     banghart 3758: sub order_meta_fields {
                   3759:     my ($r)=@_;
                   3760:     my $idx = 1;
                   3761:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3762:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.341     banghart 3763:     $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.345     banghart 3764:     &Apache::lonhtmlcommon::add_breadcrumb
                   3765:             ({href=>"/adm/parmset?action=setrestrictmeta",
                   3766:               text=>"Restrict Metadata"},
                   3767:              {text=>"Order Metadata"});
                   3768:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.340     banghart 3769:     if ($env{'form.storeorder'}) {
                   3770:         my $newpos = $env{'form.newpos'} - 1;
                   3771:         my $currentpos = $env{'form.currentpos'} - 1;
                   3772:         my @neworder = ();
                   3773:         my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
                   3774:         my $i;
1.341     banghart 3775:         if ($newpos > $currentpos) {
1.340     banghart 3776:         # moving stuff up
                   3777:             for ($i=0;$i<$currentpos;$i++) {
                   3778:         	$neworder[$i]=$oldorder[$i];
                   3779:             }
                   3780:             for ($i=$currentpos;$i<$newpos;$i++) {
                   3781:         	$neworder[$i]=$oldorder[$i+1];
                   3782:             }
                   3783:             $neworder[$newpos]=$oldorder[$currentpos];
                   3784:             for ($i=$newpos+1;$i<=$#oldorder;$i++) {
                   3785:         	$neworder[$i]=$oldorder[$i];
                   3786:             }
                   3787:         } else {
                   3788:         # moving stuff down
                   3789:     	    for ($i=0;$i<$newpos;$i++) {
                   3790:     	        $neworder[$i]=$oldorder[$i];
                   3791:     	    }
                   3792:     	    $neworder[$newpos]=$oldorder[$currentpos];
                   3793:     	    for ($i=$newpos+1;$i<$currentpos+1;$i++) {
                   3794:     	        $neworder[$i]=$oldorder[$i-1];
                   3795:     	    }
                   3796:     	    for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
                   3797:     	        $neworder[$i]=$oldorder[$i];
                   3798:     	    }
                   3799:         }
                   3800: 	my $ordered_fields = join ",", @neworder;
1.343     banghart 3801:         my $put_result = &Apache::lonnet::put('environment',
                   3802:                            {'metadata.addedorder'=>$ordered_fields},$dom,$crs); 	
1.393     raeburn  3803: 	&Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
1.340     banghart 3804:     }
1.357     raeburn  3805:     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341     banghart 3806:     my $ordered_fields;
1.340     banghart 3807:     my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
                   3808:     if (!@fields_in_order) {
                   3809:         # no order found, pick sorted order then create metadata.addedorder key.
                   3810:         foreach my $key (sort keys %$fields) {
                   3811:             push @fields_in_order, $key;
1.341     banghart 3812:             $ordered_fields = join ",", @fields_in_order;
1.340     banghart 3813:         }
1.341     banghart 3814:         my $put_result = &Apache::lonnet::put('environment',
                   3815:                             {'metadata.addedorder'=>$ordered_fields},$dom,$crs); 
                   3816:     } 
1.340     banghart 3817:     $r->print('<table>');
                   3818:     my $num_fields = scalar(@fields_in_order);
                   3819:     foreach my $key (@fields_in_order) {
                   3820:         $r->print('<tr><td>');
                   3821:         $r->print('<form method="post" action="">');
                   3822:         $r->print('<select name="newpos" onChange="this.form.submit()">');
                   3823:         for (my $i = 1;$i le $num_fields;$i ++) {
                   3824:             if ($i eq $idx) {
                   3825:                 $r->print('<option value="'.$i.'"  SELECTED>('.$i.')</option>');
                   3826:             } else {
                   3827:                 $r->print('<option value="'.$i.'">'.$i.'</option>');
                   3828:             }
                   3829:         }
                   3830:         $r->print('</select></td><td>');
                   3831:         $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
                   3832:         $r->print('<input type="hidden" name="storeorder" value="true" />');
                   3833:         $r->print('</form>');
                   3834:         $r->print($$fields{$key}.'</td></tr>');
                   3835:         $idx ++;
                   3836:     }
                   3837:     $r->print('</table>');
                   3838:     return 'ok';
                   3839: }
1.359     banghart 3840: sub continue {
                   3841:     my $output;
                   3842:     $output .= '<form action="" method="post">';
                   3843:     $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
                   3844:     $output .= '<input type="submit" value="Continue" />';
                   3845:     return ($output);
                   3846: }
1.334     banghart 3847: sub addmetafield {
                   3848:     my ($r)=@_;
                   3849:     $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
                   3850:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335     banghart 3851:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3852:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.339     banghart 3853:     if (exists($env{'form.undelete'})) {
1.358     banghart 3854:         my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339     banghart 3855:         foreach my $meta_field(@meta_fields) {
                   3856:             my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
                   3857:             $options =~ s/deleted//;
                   3858:             $options =~ s/,,/,/;
                   3859:             my $put_result = &Apache::lonnet::put('environment',
                   3860:                                         {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
                   3861:                                         
                   3862:             $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
                   3863:         }
1.359     banghart 3864:         $r->print(&continue());
1.339     banghart 3865:     } elsif (exists($env{'form.fieldname'})) {
1.335     banghart 3866:         my $meta_field = $env{'form.fieldname'};
                   3867:         my $display_field = $env{'form.fieldname'};
                   3868:         $meta_field =~ s/\W/_/g;
1.338     banghart 3869:         $meta_field =~ tr/A-Z/a-z/;
1.335     banghart 3870:         my $put_result = &Apache::lonnet::put('environment',
                   3871:                             {'metadata.'.$meta_field.'.values'=>"",
                   3872:                              'metadata.'.$meta_field.'.added'=>"$display_field",
                   3873:                              'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359     banghart 3874:         $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
                   3875:         $r->print(&continue());
1.335     banghart 3876:     } else {
1.357     raeburn  3877:         my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339     banghart 3878:         if ($fields) {
                   3879:             $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
                   3880:             $r->print('<form method="post" action="">');
                   3881:             foreach my $key(keys(%$fields)) {
1.358     banghart 3882:                 $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339     banghart 3883:             }
                   3884:             $r->print('<input type="submit" name="undelete" value="Undelete" />');
                   3885:             $r->print('</form>');
                   3886:         }
                   3887:         $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 3888:         $r->print('<input type="text" name="fieldname" /><br />');
                   3889:         $r->print('<input type="submit" value="Add Metadata Field" />');
1.334     banghart 3890:     }
1.361     albertel 3891:     $r->print('</form>');
1.334     banghart 3892: }
1.259     banghart 3893: sub setrestrictmeta {
1.240     banghart 3894:     my ($r)=@_;
1.242     banghart 3895:     my $next_meta;
1.244     banghart 3896:     my $output;
1.245     banghart 3897:     my $item_num;
1.246     banghart 3898:     my $put_result;
1.280     albertel 3899:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 3900:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 3901:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3902:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259     banghart 3903:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 3904:     my $save_field = '';
1.259     banghart 3905:     if ($env{'form.restrictmeta'}) {
1.254     banghart 3906:         foreach my $field (sort(keys(%env))) {
1.252     banghart 3907:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 3908:                 my $options;
1.252     banghart 3909:                 my $meta_field = $1;
                   3910:                 my $meta_key = $2;
1.253     banghart 3911:                 if ($save_field ne $meta_field) {
1.252     banghart 3912:                     $save_field = $meta_field;
1.253     banghart 3913:             	    if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254     banghart 3914:             	        $options.='stuadd,';
                   3915:             	    } 
1.351     banghart 3916:             	    if ($env{'form.'.$meta_field.'_choices'}) {
                   3917:             	        $options.='choices,';
                   3918:             	    } 
                   3919:             	    if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
1.254     banghart 3920:             	        $options.='onlyone,';
                   3921:             	    } 
                   3922:             	    if ($env{'form.'.$meta_field.'_active'}) {
                   3923:             	        $options.='active,';
1.253     banghart 3924:             	    }
1.337     banghart 3925:             	    if ($env{'form.'.$meta_field.'_deleted'}) {
                   3926:             	        $options.='deleted,';
                   3927:             	    }
1.259     banghart 3928:                     my $name = $save_field;
1.253     banghart 3929:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 3930:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   3931:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 3932:                                                    },$dom,$crs);
1.252     banghart 3933:                 }
                   3934:             }
                   3935:         }
                   3936:     }
1.296     albertel 3937:     &Apache::lonnet::coursedescription($env{'request.course.id'},
                   3938: 				       {'freshen_cache' => 1});
1.335     banghart 3939:     # Get the default metadata fields
1.258     albertel 3940:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335     banghart 3941:     # Now get possible added metadata fields
1.357     raeburn  3942:     my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346     banghart 3943:     my $row_alt = 1;
1.347     banghart 3944:     $output .= &Apache::loncommon::start_data_table();
1.258     albertel 3945:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 3946:         if ($field ne 'courserestricted') {
1.346     banghart 3947:             $row_alt = $row_alt ? 0 : 1;
1.347     banghart 3948: 	    $output.= &output_row($r, $field, $metadata_fields{$field});
1.265     banghart 3949: 	}
1.255     banghart 3950:     }
1.351     banghart 3951:     my $buttons = (<<ENDButtons);
                   3952:         <input type="submit" name="restrictmeta" value="Save" />
                   3953:         </form><br />
                   3954:         <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
                   3955:         <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
                   3956:         </form>
                   3957:         <br />
                   3958:         <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
                   3959:         <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
                   3960: ENDButtons
1.337     banghart 3961:     my $added_flag = 1;
1.335     banghart 3962:     foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346     banghart 3963:         $row_alt = $row_alt ? 0 : 1;
                   3964:         $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335     banghart 3965:     }
1.347     banghart 3966:     $output .= &Apache::loncommon::end_data_table();
1.244     banghart 3967:     $r->print(<<ENDenv);       
1.259     banghart 3968:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 3969:         $output
1.351     banghart 3970:         $buttons
1.340     banghart 3971:         </form>
1.244     banghart 3972: ENDenv
1.280     albertel 3973:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 3974:     return 'ok';
                   3975: }
1.220     www      3976: ##################################################
1.335     banghart 3977: sub get_added_meta_fieldnames {
1.357     raeburn  3978:     my ($cid) = @_;
1.335     banghart 3979:     my %fields;
                   3980:     foreach my $key(%env) {
1.357     raeburn  3981:         if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335     banghart 3982:             my $field_name = $1;
                   3983:             my ($display_field_name) = $env{$key};
                   3984:             $fields{$field_name} = $display_field_name;
                   3985:         }
                   3986:     }
                   3987:     return \%fields;
                   3988: }
1.339     banghart 3989: sub get_deleted_meta_fieldnames {
1.357     raeburn  3990:     my ($cid) = @_;
1.339     banghart 3991:     my %fields;
                   3992:     foreach my $key(%env) {
1.357     raeburn  3993:         if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339     banghart 3994:             my $field_name = $1;
                   3995:             if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
                   3996:                 my ($display_field_name) = $env{$key};
                   3997:                 $fields{$field_name} = $display_field_name;
                   3998:             }
                   3999:         }
                   4000:     }
                   4001:     return \%fields;
                   4002: }
1.220     www      4003: sub defaultsetter {
1.280     albertel 4004:     my ($r) = @_;
                   4005: 
                   4006:     my $start_page = 
                   4007: 	&Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 4008:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220     www      4009:     $r->print(<<ENDDEFHEAD);
1.280     albertel 4010: $start_page
1.220     www      4011: $breadcrumbs
                   4012: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
                   4013: ENDDEFHEAD
1.280     albertel 4014: 
                   4015:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   4016:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221     www      4017:     my @ids=();
                   4018:     my %typep=();
                   4019:     my %keyp=();
                   4020:     my %allparms=();
                   4021:     my %allparts=();
                   4022:     my %allmaps=();
                   4023:     my %mapp=();
                   4024:     my %symbp=();
                   4025:     my %maptitles=();
                   4026:     my %uris=();
                   4027:     my %keyorder=&standardkeyorder();
                   4028:     my %defkeytype=();
                   4029: 
                   4030:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   4031: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   4032: 				\%keyorder,\%defkeytype);
1.224     www      4033:     if ($env{'form.storerules'}) {
                   4034: 	my %newrules=();
                   4035: 	my @delrules=();
1.226     www      4036: 	my %triggers=();
1.225     albertel 4037: 	foreach my $key (keys(%env)) {
                   4038:             if ($key=~/^form\.(\w+)\_action$/) {
1.224     www      4039: 		my $tempkey=$1;
1.226     www      4040: 		my $action=$env{$key};
                   4041:                 if ($action) {
                   4042: 		    $newrules{$tempkey.'_action'}=$action;
                   4043: 		    if ($action ne 'default') {
                   4044: 			my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   4045: 			$triggers{$whichparm}.=$tempkey.':';
                   4046: 		    }
                   4047: 		    $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224     www      4048: 		    if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      4049: 			$newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224     www      4050: 			$newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   4051: 			$newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   4052: 			$newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   4053: 		    } else {
                   4054: 			$newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227     www      4055: 			$newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224     www      4056: 		    }
                   4057: 		} else {
1.225     albertel 4058: 		    push(@delrules,$tempkey.'_action');
1.226     www      4059: 		    push(@delrules,$tempkey.'_type');
1.225     albertel 4060: 		    push(@delrules,$tempkey.'_hours');
                   4061: 		    push(@delrules,$tempkey.'_min');
                   4062: 		    push(@delrules,$tempkey.'_sec');
                   4063: 		    push(@delrules,$tempkey.'_value');
1.224     www      4064: 		}
                   4065: 	    }
                   4066: 	}
1.226     www      4067: 	foreach my $key (keys %allparms) {
                   4068: 	    $newrules{$key.'_triggers'}=$triggers{$key};
                   4069: 	}
1.224     www      4070: 	&Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
                   4071: 	&Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
                   4072: 	&resetrulescache();
                   4073:     }
1.227     www      4074:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                   4075: 				       'hours' => 'Hours',
1.221     www      4076: 				       'min' => 'Minutes',
                   4077: 				       'sec' => 'Seconds',
                   4078: 				       'yes' => 'Yes',
                   4079: 				       'no' => 'No');
1.222     www      4080:     my @standardoptions=('','default');
                   4081:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   4082:     my @dateoptions=('','default');
                   4083:     my @datedisplay=('',&mt('Default value when manually setting'));
                   4084:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
                   4085: 	unless ($tempkey) { next; }
                   4086: 	push @standardoptions,'when_setting_'.$tempkey;
                   4087: 	push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   4088: 	if (&isdateparm($defkeytype{$tempkey})) {
                   4089: 	    push @dateoptions,'later_than_'.$tempkey;
                   4090: 	    push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   4091: 	    push @dateoptions,'earlier_than_'.$tempkey;
                   4092: 	    push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   4093: 	} 
                   4094:     }
1.231     www      4095: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
                   4096: 	  &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318     albertel 4097:     $r->print("\n".&Apache::loncommon::start_data_table().
                   4098: 	      &Apache::loncommon::start_data_table_header_row().
                   4099: 	      "<th>".&mt('Rule for parameter').'</th><th>'.
                   4100: 	      &mt('Action').'</th><th>'.&mt('Value').'</th>'.
                   4101: 	      &Apache::loncommon::end_data_table_header_row());
1.221     www      4102:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222     www      4103: 	unless ($tempkey) { next; }
1.318     albertel 4104: 	$r->print("\n".&Apache::loncommon::start_data_table_row().
                   4105: 		  "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222     www      4106: 	my $action=&rulescache($tempkey.'_action');
                   4107: 	$r->print('<select name="'.$tempkey.'_action">');
                   4108: 	if (&isdateparm($defkeytype{$tempkey})) {
                   4109: 	    for (my $i=0;$i<=$#dateoptions;$i++) {
                   4110: 		if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   4111: 		$r->print("\n<option value='$dateoptions[$i]'".
                   4112: 			  ($dateoptions[$i] eq $action?' selected="selected"':'').
                   4113: 			  ">$datedisplay[$i]</option>");
                   4114: 	    }
                   4115: 	} else {
                   4116: 	    for (my $i=0;$i<=$#standardoptions;$i++) {
                   4117: 		if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   4118: 		$r->print("\n<option value='$standardoptions[$i]'".
                   4119: 			  ($standardoptions[$i] eq $action?' selected="selected"':'').
                   4120: 			  ">$standarddisplay[$i]</option>");
                   4121: 	    }
                   4122: 	}
                   4123: 	$r->print('</select>');
1.227     www      4124: 	unless (&isdateparm($defkeytype{$tempkey})) {
                   4125: 	    $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   4126: 		      '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   4127: 	}
1.222     www      4128: 	$r->print("\n</td><td>\n");
                   4129: 
1.221     www      4130:         if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      4131: 	    my $days=&rulescache($tempkey.'_days');
1.222     www      4132: 	    my $hours=&rulescache($tempkey.'_hours');
                   4133: 	    my $min=&rulescache($tempkey.'_min');
                   4134: 	    my $sec=&rulescache($tempkey.'_sec');
1.221     www      4135: 	    $r->print(<<ENDINPUTDATE);
1.227     www      4136: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      4137: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   4138: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   4139: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      4140: ENDINPUTDATE
                   4141: 	} elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      4142:             my $yeschecked='';
                   4143:             my $nochecked='';
                   4144:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
                   4145:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
                   4146: 
1.221     www      4147: 	    $r->print(<<ENDYESNO);
1.224     www      4148: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
                   4149: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221     www      4150: ENDYESNO
                   4151:         } else {
1.224     www      4152: 	    $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221     www      4153: 	}
1.318     albertel 4154:         $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221     www      4155:     }
1.318     albertel 4156:     $r->print(&Apache::loncommon::end_data_table().
                   4157: 	      "\n<input type='submit' name='storerules' value='".
1.365     albertel 4158: 	      &mt('Save Rules')."' /></form>\n".
1.280     albertel 4159: 	      &Apache::loncommon::end_page());
1.220     www      4160:     return;
                   4161: }
1.193     albertel 4162: 
1.290     www      4163: sub components {
1.330     albertel 4164:     my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
                   4165: 
                   4166:     if ($typeflag) {
1.290     www      4167: 	$key=~s/\.type$//;
                   4168:     }
1.330     albertel 4169: 
                   4170:     my ($middle,$part,$name)=
                   4171: 	($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291     www      4172:     my $issection;
1.330     albertel 4173: 
1.290     www      4174:     my $section=&mt('All Students');
                   4175:     if ($middle=~/^\[(.*)\]/) {
1.291     www      4176: 	$issection=$1;
                   4177: 	$section=&mt('Group/Section').': '.$issection;
1.290     www      4178: 	$middle=~s/^\[(.*)\]//;
                   4179:     }
                   4180:     $middle=~s/\.+$//;
                   4181:     $middle=~s/^\.+//;
1.291     www      4182:     if ($uname) {
                   4183: 	$section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   4184: 	$issection='';
                   4185:     }
1.316     albertel 4186:     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.304     www      4187:     my $realmdescription=&mt('all resources'); 
1.290     www      4188:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316     albertel 4189: 	$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      4190:  	$realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
                   4191:    } elsif ($middle) {
1.290     www      4192: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316     albertel 4193: 	$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      4194: 	$realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      4195:     }
1.291     www      4196:     my $what=$part.'.'.$name;
1.330     albertel 4197:     return ($realm,$section,$name,$part,
1.304     www      4198: 	    $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      4199: }
1.293     www      4200: 
1.328     albertel 4201: my %standard_parms;
                   4202: sub load_parameter_names {
                   4203:     open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
                   4204:     while (my $configline=<$config>) {
                   4205: 	if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
                   4206: 	chomp($configline);
                   4207: 	my ($short,$plain)=split(/:/,$configline);
                   4208: 	my (undef,$name,$type)=split(/\&/,$short,3);
                   4209: 	if ($type eq 'display') {
                   4210: 	    $standard_parms{$name} = $plain;
                   4211: 	}
                   4212:     }
                   4213:     close($config);
                   4214:     $standard_parms{'int_pos'}      = 'Positive Integer';
                   4215:     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
                   4216:     %standard_parms=&Apache::lonlocal::texthash(%standard_parms);	
                   4217: }
                   4218: 
1.292     www      4219: sub standard_parameter_names {
                   4220:     my ($name)=@_;
1.328     albertel 4221:     if (!%standard_parms) {
                   4222: 	&load_parameter_names();
                   4223:     }
1.292     www      4224:     if ($standard_parms{$name}) {
                   4225: 	return $standard_parms{$name}; 
                   4226:     } else { 
                   4227: 	return $name; 
                   4228:     }
                   4229: }
1.290     www      4230: 
1.309     www      4231: #
                   4232: # Parameter Change Log
                   4233: #
                   4234: 
                   4235: 
1.285     albertel 4236: sub parm_change_log {
1.284     www      4237:     my ($r)=@_;
1.327     albertel 4238:     $r->print(&Apache::loncommon::start_page('Parameter Change Log'));
                   4239:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
                   4240: 
1.286     www      4241:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   4242: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   4243: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.311     albertel 4244: 
1.301     www      4245:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311     albertel 4246: 
1.327     albertel 4247:     $r->print('<form action="/adm/parmset?action=parameterchangelog"
                   4248:                      method="post" name="parameterlog">');
1.311     albertel 4249:     
                   4250:     my %saveable_parameters = ('show' => 'scalar',);
                   4251:     &Apache::loncommon::store_course_settings('parameter_log',
                   4252:                                               \%saveable_parameters);
                   4253:     &Apache::loncommon::restore_course_settings('parameter_log',
                   4254:                                                 \%saveable_parameters);
1.348     www      4255:     $r->print(&Apache::loncommon::display_filter().
1.326     www      4256:               '<label>'.&Apache::lonhtmlcommon::checkbox('includetypes',$env{'form.includetypes'},'1').
                   4257: 	      ' '.&mt('Include parameter types').'</label>'.
1.327     albertel 4258: 	      '<input type="submit" value="'.&mt('Display').'" /></form>');
1.301     www      4259: 
1.291     www      4260:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   4261: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301     www      4262:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
                   4263: 	      '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   4264: 	      &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   4265: 	      &Apache::loncommon::end_data_table_header_row());
1.309     www      4266:     my $shown=0;
1.349     www      4267:     my $folder='';
                   4268:     if ($env{'form.displayfilter'} eq 'currentfolder') {
                   4269: 	my $last='';
                   4270: 	if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                   4271: 		&GDBM_READER(),0640)) {
                   4272: 	    $last=$hash{'last_known'};
                   4273: 	    untie(%hash);
                   4274: 	}
                   4275: 	if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
                   4276:     }
1.356     albertel 4277:     foreach my $id (sort 
                   4278: 		    {
                   4279: 			if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
                   4280: 			    return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
                   4281: 			}
                   4282: 			my $aid = (split('00000',$a))[-1];
                   4283: 			my $bid = (split('00000',$b))[-1];
                   4284: 			return $bid<=>$aid;
                   4285: 		    } (keys(%parmlog))) {
1.294     www      4286:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.332     albertel 4287: 	my $count = 0;
1.288     albertel 4288: 	my $time =
1.294     www      4289: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      4290: 	my $plainname = 
1.294     www      4291: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   4292: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 4293: 	my $about_me_link = 
1.289     www      4294: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      4295: 					       $parmlog{$id}{'exe_uname'},
                   4296: 					       $parmlog{$id}{'exe_udom'});
1.293     www      4297: 	my $send_msg_link='';
1.294     www      4298: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   4299: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      4300: 	    $send_msg_link ='<br />'.
1.288     albertel 4301: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      4302: 						   $parmlog{$id}{'exe_uname'},
                   4303: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 4304: 	}
1.301     www      4305: 	my $row_start=&Apache::loncommon::start_data_table_row();
1.290     www      4306: 	my $makenewrow=0;
                   4307: 	my %istype=();
1.332     albertel 4308: 	my $output;
1.293     www      4309: 	foreach my $changed (reverse(sort(@changes))) {
1.330     albertel 4310:             my $value=$parmlog{$id}{'logentry'}{$changed};
1.331     albertel 4311: 	    my $typeflag = ($changed =~/\.type$/ &&
                   4312: 			    !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330     albertel 4313:             my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
                   4314: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
1.349     www      4315: 	    if ($env{'form.displayfilter'} eq 'currentfolder') {
                   4316: 		if ($folder) {
                   4317: 		    if ($middle!~/^\Q$folder\E/) { next; }
                   4318: 		}
                   4319: 	    }
1.326     www      4320: 	    if ($typeflag) {
1.329     albertel 4321: 		$istype{$parmname}=$value; 
1.326     www      4322: 		if (!$env{'form.includetypes'}) { next; } 
                   4323: 	    }
1.332     albertel 4324: 	    $count++;
                   4325: 	    if ($makenewrow) {
                   4326: 		$output .= $row_start;
                   4327: 	    } else {
                   4328: 		$makenewrow=1;
                   4329: 	    }
                   4330: 	    $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292     www      4331: 		      &standard_parameter_names($parmname).'</td><td>'.
1.332     albertel 4332: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
1.291     www      4333: 	    my $stillactive=0;
1.332     albertel 4334: 	    if ($parmlog{$id}{'delflag'}) {
                   4335: 		$output .= &mt('Deleted');
1.288     albertel 4336: 	    } else {
1.290     www      4337: 		if ($typeflag) {
1.332     albertel 4338: 		    $output .= &mt('Type: [_1]',&standard_parameter_names($value));
1.290     www      4339: 		} else {
1.291     www      4340: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   4341: 						      $uname,$udom,$issection,$issection,$courseopt);
                   4342: 		    if (&isdateparm($istype{$parmname})) {
1.332     albertel 4343: 			$output .= &Apache::lonlocal::locallocaltime($value);
1.291     www      4344: 		    } else {
1.332     albertel 4345: 			$output .= $value;
1.291     www      4346: 		    }
                   4347: 		    if ($value ne $all[$level]) {
1.332     albertel 4348: 			$output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
1.291     www      4349: 		    } else {
                   4350: 			$stillactive=1;
                   4351: 		    }
1.290     www      4352: 		}
1.288     albertel 4353: 	    }
1.332     albertel 4354: 	    $output .= '</td><td>';
1.291     www      4355: 	    if ($stillactive) {
1.304     www      4356: 		my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
                   4357:                 my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
                   4358: 				    (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292     www      4359: 		if (($uname) && ($udom)) {
1.332     albertel 4360: 		    $output .= 
                   4361: 			&Apache::loncommon::messagewrapper('Notify User',
                   4362: 							   $uname,$udom,$title,
                   4363: 							   $description);
1.292     www      4364: 		} else {
1.332     albertel 4365: 		    $output .= 
                   4366: 			&Apache::lonrss::course_blog_link($id,$title,
                   4367: 							  $description);
1.292     www      4368: 		}
1.291     www      4369: 	    }
1.332     albertel 4370: 	    $output .= '</td>'.&Apache::loncommon::end_data_table_row();
1.288     albertel 4371: 	}
1.349     www      4372:         if ($env{'form.displayfilter'} eq 'containing') {
                   4373: 	    my $wholeentry=$about_me_link.':'.
                   4374: 		$parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
                   4375: 		$output;
                   4376: 	    if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }        
                   4377: 	}
                   4378:         if ($count) {
                   4379: 	    $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332     albertel 4380:                        <td rowspan="'.$count.'">'.$about_me_link.
                   4381: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   4382: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
                   4383: 		  $send_msg_link.'</td>'.$output);
1.349     www      4384: 	    $shown++;
                   4385: 	}
1.311     albertel 4386: 	if (!($env{'form.show'} eq &mt('all') 
                   4387: 	      || $shown<=$env{'form.show'})) { last; }
1.286     www      4388:     }
1.301     www      4389:     $r->print(&Apache::loncommon::end_data_table());
1.284     www      4390:     $r->print(&Apache::loncommon::end_page());
                   4391: }
                   4392: 
1.355     albertel 4393: sub check_for_course_info {
                   4394:     my $navmap = Apache::lonnavmaps::navmap->new();
                   4395:     return 1 if ($navmap);
                   4396:     return 0;
                   4397: }
                   4398: 
1.178     raeburn  4399: ##################################################
                   4400: ##################################################
1.30      www      4401: 
1.59      matthew  4402: =pod
                   4403: 
1.83      bowersj2 4404: =item * handler
1.59      matthew  4405: 
                   4406: Main handler.  Calls &assessparms and &crsenv subroutines.
                   4407: 
                   4408: =cut
1.376     albertel 4409: 
1.59      matthew  4410: ##################################################
                   4411: ##################################################
1.259     banghart 4412: 
1.30      www      4413: sub handler {
1.43      albertel 4414:     my $r=shift;
1.30      www      4415: 
1.376     albertel 4416:     &reset_caches();
                   4417: 
1.43      albertel 4418:     if ($r->header_only) {
1.126     www      4419: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 4420: 	$r->send_http_header;
                   4421: 	return OK;
                   4422:     }
1.193     albertel 4423:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      4424: 					    ['action','state',
                   4425:                                              'pres_marker',
                   4426:                                              'pres_value',
1.206     www      4427:                                              'pres_type',
1.390     www      4428:                                              'udom','uname','symb','serial','timebase']);
1.131     www      4429: 
1.83      bowersj2 4430: 
1.193     albertel 4431:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 4432:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   4433: 					    text=>"Parameter Manager",
1.204     www      4434: 					    faq=>10,
1.324     www      4435: 					    bug=>'Instructor Interface',
                   4436:                                             help => 'Parameter_Manager'});
1.203     www      4437: 
1.30      www      4438: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 4439:     my $parm_permission =
                   4440: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 4441: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 4442: 				  $env{'request.course.sec'}));
1.355     albertel 4443:     my $exists = &check_for_course_info();
                   4444: 
                   4445:     if ($env{'request.course.id'} &&  $parm_permission && $exists) {
1.193     albertel 4446: 
                   4447:         # Start Page
1.126     www      4448:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      4449:         $r->send_http_header;
1.30      www      4450: 
1.203     www      4451: 
1.193     albertel 4452:         #
                   4453:         # Main switch on form.action and form.state, as appropriate
                   4454:         #
                   4455:         # Check first if coming from someone else headed directly for
                   4456:         #  the table mode
                   4457:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   4458: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
1.324     www      4459:             &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
                   4460: 						    text=>"Problem Parameters"});
1.193     albertel 4461: 	    &assessparms($r);
                   4462: 
                   4463:         } elsif (! exists($env{'form.action'})) {
                   4464:             $r->print(&header());
1.298     albertel 4465:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 4466:             &print_main_menu($r,$parm_permission);
                   4467:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 4468:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   4469: 						    text=>"Course Environment"});
1.193     albertel 4470:             &crsenv($r); 
                   4471:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 4472:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   4473: 						    text=>"Overview Mode"});
1.121     www      4474: 	    &overview($r);
1.334     banghart 4475: 	} elsif ($env{'form.action'} eq 'addmetadata' && $parm_permission) {
                   4476:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
                   4477: 						    text=>"Add Metadata Field"});
                   4478: 	    &addmetafield($r);
1.340     banghart 4479: 	} elsif ($env{'form.action'} eq 'ordermetadata' && $parm_permission) {
                   4480:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
                   4481: 						    text=>"Add Metadata Field"});
                   4482: 	    &order_meta_fields($r);
1.259     banghart 4483:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   4484:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   4485: 						    text=>"Restrict Metadata"});
                   4486: 	    &setrestrictmeta($r);
1.208     www      4487:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   4488:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   4489: 						    text=>"Overview Mode"});
                   4490: 	    &newoverview($r);
1.220     www      4491:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   4492:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   4493: 						    text=>"Set Defaults"});
                   4494: 	    &defaultsetter($r);
                   4495: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 4496:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      4497: 						    text=>"Table Mode",
                   4498: 						    help => 'Course_Setting_Parameters'});
1.121     www      4499: 	    &assessparms($r);
1.284     www      4500:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   4501:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      4502: 						    text=>"Parameter Change Log"});
1.285     albertel 4503: 	    &parm_change_log($r);
1.333     albertel 4504:         } elsif ($env{'form.action'} eq 'cleanparameters' && $parm_permission) {
                   4505:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
                   4506: 						    text=>"Clean Parameters"});
                   4507: 	    &clean_parameters($r);
1.390     www      4508:         } elsif ($env{'form.action'} eq 'dateshift1' && $parm_permission) {
                   4509:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.391     www      4510:                                                     text=>"Shifting Dates"});
1.390     www      4511:             &date_shift_one($r);
                   4512:         } elsif ($env{'form.action'} eq 'dateshift2' && $parm_permission) {
                   4513:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.391     www      4514:                                                     text=>"Shifting Dates"});
1.390     www      4515:             &date_shift_two($r);
1.403     raeburn  4516: 	} elsif ($env{'form.action'} eq 'categorizecourse' && $parm_permission) {
                   4517:             &assign_course_categories($r);
                   4518:         } 
1.43      albertel 4519:     } else {
1.1       www      4520: # ----------------------------- Not in a course, or not allowed to modify parms
1.355     albertel 4521: 	if ($exists) {
                   4522: 	    $env{'user.error.msg'}=
                   4523: 		"/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   4524: 	} else {
                   4525: 	    $env{'user.error.msg'}=
                   4526: 		"/adm/parmset::0:1:Course environment gone, reinitialize the course";
                   4527: 	}
1.43      albertel 4528: 	return HTTP_NOT_ACCEPTABLE;
                   4529:     }
1.376     albertel 4530:     &reset_caches();
                   4531: 
1.43      albertel 4532:     return OK;
1.1       www      4533: }
                   4534: 
                   4535: 1;
                   4536: __END__
                   4537: 
1.59      matthew  4538: =pod
1.38      harris41 4539: 
                   4540: =back
                   4541: 
                   4542: =cut
1.1       www      4543: 
                   4544: 
                   4545: 

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