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

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

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