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

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

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