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

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

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