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

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

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