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

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

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