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

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

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