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

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

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