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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.539   ! raeburn     4: # $Id: lonparmset.pm,v 1.538 2013/07/15 16:13:21 bisitz Exp $
1.40      albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.59      matthew    28: ###################################################################
                     29: ###################################################################
                     30: 
                     31: =pod
                     32: 
                     33: =head1 NAME
                     34: 
                     35: lonparmset - Handler to set parameters for assessments and course
                     36: 
                     37: =head1 SYNOPSIS
                     38: 
                     39: lonparmset provides an interface to setting course parameters. 
                     40: 
                     41: =head1 DESCRIPTION
                     42: 
                     43: This module sets coursewide and assessment parameters.
                     44: 
                     45: =head1 INTERNAL SUBROUTINES
                     46: 
1.416     jms        47: =over
1.59      matthew    48: 
                     49: =pod
                     50: 
1.416     jms        51: =item parmval()
1.59      matthew    52: 
                     53: Figure out a cascading parameter.
                     54: 
1.71      albertel   55: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   56:          $id   - a bighash Id number
1.71      albertel   57:          $def  - the resource's default value   'stupid emacs
                     58: 
1.269     raeburn    59: Returns:  A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels
1.71      albertel   60: 
1.306     albertel   61: 14- General Course
                     62: 13- Map or Folder level in course
1.269     raeburn    63: 12- resource default
                     64: 11- map default
1.306     albertel   65: 10- resource level in course
1.269     raeburn    66: 9 - General for section
                     67: 8 - Map or Folder level for section
                     68: 7 - resource level in section
                     69: 6 - General for group
                     70: 5 - Map or Folder level for group
                     71: 4 - resource level in group
1.71      albertel   72: 3 - General for specific student
1.82      www        73: 2 - Map or Folder level for specific student
1.71      albertel   74: 1 - resource level for specific student
1.2       www        75: 
1.416     jms        76: =item parmval_by_symb()
                     77: 
                     78: =item reset_caches()
                     79: 
                     80: =item cacheparmhash() 
                     81: 
                     82: =item parmhash()
                     83: 
                     84: =item symbcache()
                     85: 
                     86: =item preset_defaults()
                     87: 
                     88: =item date_sanity_info()
                     89: 
                     90: =item storeparm()
                     91: 
                     92: Store a parameter by symb
                     93: 
                     94:     Takes
                     95:     - symb
                     96:     - name of parameter
                     97:     - level
                     98:     - new value
                     99:     - new type
                    100:     - username
                    101:     - userdomain
                    102: 
                    103: =item log_parmset()
                    104: 
                    105: =item storeparm_by_symb_inner()
                    106: 
                    107: =item valout()
                    108: 
                    109: Format a value for output.
                    110: 
                    111: Inputs:  $value, $type, $editable
                    112: 
                    113: Returns: $value, formatted for output.  If $type indicates it is a date,
                    114: localtime($value) is returned.
                    115: $editable will return an icon to click on
                    116: 
                    117: =item plink()
                    118: 
                    119: Produces a link anchor.
                    120: 
                    121: Inputs: $type,$dis,$value,$marker,$return,$call
                    122: 
                    123: Returns: scalar with html code for a link which will envoke the 
                    124: javascript function 'pjump'.
                    125: 
                    126: =item page_js()
                    127: 
                    128: =item startpage()
                    129: 
                    130: =item print_row()
                    131: 
                    132: =item print_td()
                    133: 
                    134: =item print_usergroups()
                    135: 
                    136: =item parm_control_group()
                    137: 
                    138: =item extractResourceInformation() : 
                    139: 
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').'"'
1.539   ! raeburn   779:                .' title="'.&mt('Change').'" style="border:0;" />';
1.528     bisitz    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.538     bisitz   3638:     $r->print('<form name="shiftform" method="post" action="">'.
1.390     www      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.539   ! raeburn  3813:     $r->print('</form>');
1.507     www      3814:     &endSettingsScreen($r);
1.539   ! raeburn  3815:     $r->print(&Apache::loncommon::end_page());
1.193     albertel 3816:     return;
                   3817: }
1.414     droeschl 3818: 
1.416     jms      3819: 
                   3820: 
1.252     banghart 3821: sub output_row {
1.347     banghart 3822:     my ($r, $field_name, $field_text, $added_flag) = @_;
1.252     banghart 3823:     my $output;
1.263     banghart 3824:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3825:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337     banghart 3826:     if (!defined($options)) {
1.254     banghart 3827:         $options = 'active,stuadd';
1.261     banghart 3828:         $values = '';
1.252     banghart 3829:     }
1.337     banghart 3830:     if (!($options =~ /deleted/)) {
                   3831:         my @options= ( ['active', 'Show to student'],
1.418     schafran 3832:                     ['stuadd', 'Provide text area for students to type metadata'],
1.351     banghart 3833:                     ['choices','Provide choices for students to select from']);
1.473     amueller 3834: #           ['onlyone','Student may select only one choice']);
1.337     banghart 3835:         if ($added_flag) {
                   3836:             push @options,['deleted', 'Delete Metadata Field'];
                   3837:         }
1.351     banghart 3838:        $output = &Apache::loncommon::start_data_table_row();
1.451     bisitz   3839:         $output .= '<td><strong>'.$field_text.':</strong></td>';
1.351     banghart 3840:         $output .= &Apache::loncommon::end_data_table_row();
1.337     banghart 3841:         foreach my $opt (@options) {
1.473     amueller 3842:         my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
                   3843:         $output .= &Apache::loncommon::continue_data_table_row();
                   3844:         $output .= '<td>'.('&nbsp;' x 5).'<label>
                   3845:                    <input type="checkbox" name="'.
                   3846:                    $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3847:                    &mt($opt->[1]).'</label></td>';
                   3848:         $output .= &Apache::loncommon::end_data_table_row();
                   3849:     }
1.351     banghart 3850:         $output .= &Apache::loncommon::continue_data_table_row();
1.451     bisitz   3851:         $output .= '<td>'.('&nbsp;' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';
1.351     banghart 3852:         $output .= &Apache::loncommon::end_data_table_row();
                   3853:         my $multiple_checked;
                   3854:         my $single_checked;
                   3855:         if ($options =~ m/onlyone/) {
1.422     bisitz   3856:             $multiple_checked = '';
1.423     bisitz   3857:             $single_checked = ' checked="checked"';
1.351     banghart 3858:         } else {
1.423     bisitz   3859:             $multiple_checked = ' checked="checked"';
1.422     bisitz   3860:             $single_checked = '';
1.351     banghart 3861:         }
1.473     amueller 3862:     $output .= &Apache::loncommon::continue_data_table_row();
                   3863:     $output .= '<td>'.('&nbsp;' x 10).'
                   3864:                 <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
                   3865:                 '.&mt('Student may select multiple choices from list').'</td>';
                   3866:     $output .= &Apache::loncommon::end_data_table_row();
                   3867:     $output .= &Apache::loncommon::continue_data_table_row();
                   3868:     $output .= '<td>'.('&nbsp;' x 10).'
                   3869:                 <input type="radio" name="'.$field_name.'_onlyone"  value="single"'.$single_checked.' />
                   3870:                 '.&mt('Student may select only one choice from list').'</td>';
                   3871:     $output .= &Apache::loncommon::end_data_table_row();
1.252     banghart 3872:     }
                   3873:     return ($output);
                   3874: }
1.416     jms      3875: 
                   3876: 
                   3877: 
1.340     banghart 3878: sub order_meta_fields {
                   3879:     my ($r)=@_;
                   3880:     my $idx = 1;
                   3881:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3882:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531     raeburn  3883:     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};;
1.341     banghart 3884:     $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.414     droeschl 3885:     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473     amueller 3886:         text=>"Add Metadata Field"});
1.345     banghart 3887:     &Apache::lonhtmlcommon::add_breadcrumb
                   3888:             ({href=>"/adm/parmset?action=setrestrictmeta",
                   3889:               text=>"Restrict Metadata"},
                   3890:              {text=>"Order Metadata"});
                   3891:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.531     raeburn  3892:     &startSettingsScreen($r,'parmset',$crstype);
1.340     banghart 3893:     if ($env{'form.storeorder'}) {
                   3894:         my $newpos = $env{'form.newpos'} - 1;
                   3895:         my $currentpos = $env{'form.currentpos'} - 1;
                   3896:         my @neworder = ();
                   3897:         my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
                   3898:         my $i;
1.341     banghart 3899:         if ($newpos > $currentpos) {
1.340     banghart 3900:         # moving stuff up
                   3901:             for ($i=0;$i<$currentpos;$i++) {
1.473     amueller 3902:             $neworder[$i]=$oldorder[$i];
1.340     banghart 3903:             }
                   3904:             for ($i=$currentpos;$i<$newpos;$i++) {
1.473     amueller 3905:             $neworder[$i]=$oldorder[$i+1];
1.340     banghart 3906:             }
                   3907:             $neworder[$newpos]=$oldorder[$currentpos];
                   3908:             for ($i=$newpos+1;$i<=$#oldorder;$i++) {
1.473     amueller 3909:             $neworder[$i]=$oldorder[$i];
1.340     banghart 3910:             }
                   3911:         } else {
                   3912:         # moving stuff down
1.473     amueller 3913:             for ($i=0;$i<$newpos;$i++) {
                   3914:                 $neworder[$i]=$oldorder[$i];
                   3915:             }
                   3916:             $neworder[$newpos]=$oldorder[$currentpos];
                   3917:             for ($i=$newpos+1;$i<$currentpos+1;$i++) {
                   3918:                 $neworder[$i]=$oldorder[$i-1];
                   3919:             }
                   3920:             for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
                   3921:                 $neworder[$i]=$oldorder[$i];
                   3922:             }
1.340     banghart 3923:         }
1.473     amueller 3924:     my $ordered_fields = join ",", @neworder;
1.343     banghart 3925:         my $put_result = &Apache::lonnet::put('environment',
1.446     bisitz   3926:                            {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
1.473     amueller 3927:     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
1.340     banghart 3928:     }
1.357     raeburn  3929:     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341     banghart 3930:     my $ordered_fields;
1.340     banghart 3931:     my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
                   3932:     if (!@fields_in_order) {
                   3933:         # no order found, pick sorted order then create metadata.addedorder key.
                   3934:         foreach my $key (sort keys %$fields) {
                   3935:             push @fields_in_order, $key;
1.341     banghart 3936:             $ordered_fields = join ",", @fields_in_order;
1.340     banghart 3937:         }
1.341     banghart 3938:         my $put_result = &Apache::lonnet::put('environment',
1.446     bisitz   3939:                             {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
                   3940:     }
1.340     banghart 3941:     $r->print('<table>');
                   3942:     my $num_fields = scalar(@fields_in_order);
                   3943:     foreach my $key (@fields_in_order) {
                   3944:         $r->print('<tr><td>');
                   3945:         $r->print('<form method="post" action="">');
1.537     bisitz   3946:         $r->print('<select name="newpos" onchange="this.form.submit()">');
1.340     banghart 3947:         for (my $i = 1;$i le $num_fields;$i ++) {
                   3948:             if ($i eq $idx) {
                   3949:                 $r->print('<option value="'.$i.'"  SELECTED>('.$i.')</option>');
                   3950:             } else {
                   3951:                 $r->print('<option value="'.$i.'">'.$i.'</option>');
                   3952:             }
                   3953:         }
                   3954:         $r->print('</select></td><td>');
                   3955:         $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
                   3956:         $r->print('<input type="hidden" name="storeorder" value="true" />');
                   3957:         $r->print('</form>');
                   3958:         $r->print($$fields{$key}.'</td></tr>');
                   3959:         $idx ++;
                   3960:     }
                   3961:     $r->print('</table>');
1.507     www      3962:     &endSettingsScreen($r);
1.340     banghart 3963:     return 'ok';
                   3964: }
1.416     jms      3965: 
                   3966: 
1.359     banghart 3967: sub continue {
                   3968:     my $output;
                   3969:     $output .= '<form action="" method="post">';
                   3970:     $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
                   3971:     $output .= '<input type="submit" value="Continue" />';
                   3972:     return ($output);
                   3973: }
1.416     jms      3974: 
                   3975: 
1.334     banghart 3976: sub addmetafield {
                   3977:     my ($r)=@_;
1.414     droeschl 3978:     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473     amueller 3979:         text=>"Add Metadata Field"});
1.334     banghart 3980:     $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
                   3981:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335     banghart 3982:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3983:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531     raeburn  3984:     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
                   3985:     &startSettingsScreen($r,'parmset',$crstype);
1.339     banghart 3986:     if (exists($env{'form.undelete'})) {
1.358     banghart 3987:         my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339     banghart 3988:         foreach my $meta_field(@meta_fields) {
                   3989:             my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
                   3990:             $options =~ s/deleted//;
                   3991:             $options =~ s/,,/,/;
                   3992:             my $put_result = &Apache::lonnet::put('environment',
                   3993:                                         {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
1.446     bisitz   3994: 
1.339     banghart 3995:             $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
                   3996:         }
1.359     banghart 3997:         $r->print(&continue());
1.339     banghart 3998:     } elsif (exists($env{'form.fieldname'})) {
1.335     banghart 3999:         my $meta_field = $env{'form.fieldname'};
                   4000:         my $display_field = $env{'form.fieldname'};
                   4001:         $meta_field =~ s/\W/_/g;
1.338     banghart 4002:         $meta_field =~ tr/A-Z/a-z/;
1.335     banghart 4003:         my $put_result = &Apache::lonnet::put('environment',
                   4004:                             {'metadata.'.$meta_field.'.values'=>"",
                   4005:                              'metadata.'.$meta_field.'.added'=>"$display_field",
                   4006:                              'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359     banghart 4007:         $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
                   4008:         $r->print(&continue());
1.335     banghart 4009:     } else {
1.357     raeburn  4010:         my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339     banghart 4011:         if ($fields) {
                   4012:             $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
                   4013:             $r->print('<form method="post" action="">');
                   4014:             foreach my $key(keys(%$fields)) {
1.358     banghart 4015:                 $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339     banghart 4016:             }
                   4017:             $r->print('<input type="submit" name="undelete" value="Undelete" />');
                   4018:             $r->print('</form>');
                   4019:         }
                   4020:         $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 4021:         $r->print('<input type="text" name="fieldname" /><br />');
                   4022:         $r->print('<input type="submit" value="Add Metadata Field" />');
1.334     banghart 4023:     }
1.361     albertel 4024:     $r->print('</form>');
1.507     www      4025:     &endSettingsScreen($r);
1.334     banghart 4026: }
1.416     jms      4027: 
                   4028: 
                   4029: 
1.259     banghart 4030: sub setrestrictmeta {
1.240     banghart 4031:     my ($r)=@_;
1.242     banghart 4032:     my $next_meta;
1.244     banghart 4033:     my $output;
1.245     banghart 4034:     my $item_num;
1.246     banghart 4035:     my $put_result;
1.414     droeschl 4036:     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
1.473     amueller 4037:         text=>"Restrict Metadata"});
1.280     albertel 4038:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 4039:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 4040:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   4041:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531     raeburn  4042:     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
                   4043:     &startSettingsScreen($r,'parmset',$crstype);
1.259     banghart 4044:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 4045:     my $save_field = '';
1.259     banghart 4046:     if ($env{'form.restrictmeta'}) {
1.254     banghart 4047:         foreach my $field (sort(keys(%env))) {
1.252     banghart 4048:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 4049:                 my $options;
1.252     banghart 4050:                 my $meta_field = $1;
                   4051:                 my $meta_key = $2;
1.253     banghart 4052:                 if ($save_field ne $meta_field) {
1.252     banghart 4053:                     $save_field = $meta_field;
1.473     amueller 4054:                     if ($env{'form.'.$meta_field.'_stuadd'}) {
                   4055:                         $options.='stuadd,';
                   4056:                     }
                   4057:                     if ($env{'form.'.$meta_field.'_choices'}) {
                   4058:                         $options.='choices,';
                   4059:                     }
                   4060:                     if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
                   4061:                         $options.='onlyone,';
                   4062:                     }
                   4063:                     if ($env{'form.'.$meta_field.'_active'}) {
                   4064:                         $options.='active,';
                   4065:                     }
                   4066:                     if ($env{'form.'.$meta_field.'_deleted'}) {
                   4067:                         $options.='deleted,';
                   4068:                     }
1.259     banghart 4069:                     my $name = $save_field;
1.253     banghart 4070:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 4071:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   4072:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 4073:                                                    },$dom,$crs);
1.252     banghart 4074:                 }
                   4075:             }
                   4076:         }
                   4077:     }
1.296     albertel 4078:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.473     amueller 4079:                        {'freshen_cache' => 1});
1.335     banghart 4080:     # Get the default metadata fields
1.258     albertel 4081:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335     banghart 4082:     # Now get possible added metadata fields
1.357     raeburn  4083:     my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346     banghart 4084:     my $row_alt = 1;
1.347     banghart 4085:     $output .= &Apache::loncommon::start_data_table();
1.258     albertel 4086:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 4087:         if ($field ne 'courserestricted') {
1.346     banghart 4088:             $row_alt = $row_alt ? 0 : 1;
1.473     amueller 4089:         $output.= &output_row($r, $field, $metadata_fields{$field});
                   4090:     }
1.255     banghart 4091:     }
1.351     banghart 4092:     my $buttons = (<<ENDButtons);
                   4093:         <input type="submit" name="restrictmeta" value="Save" />
                   4094:         </form><br />
                   4095:         <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
                   4096:         <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
                   4097:         </form>
                   4098:         <br />
                   4099:         <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
                   4100:         <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
                   4101: ENDButtons
1.337     banghart 4102:     my $added_flag = 1;
1.335     banghart 4103:     foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346     banghart 4104:         $row_alt = $row_alt ? 0 : 1;
                   4105:         $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335     banghart 4106:     }
1.347     banghart 4107:     $output .= &Apache::loncommon::end_data_table();
1.446     bisitz   4108:     $r->print(<<ENDenv);
1.259     banghart 4109:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 4110:         $output
1.351     banghart 4111:         $buttons
1.340     banghart 4112:         </form>
1.244     banghart 4113: ENDenv
1.507     www      4114:     &endSettingsScreen($r);
1.280     albertel 4115:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 4116:     return 'ok';
                   4117: }
1.416     jms      4118: 
                   4119: 
                   4120: 
1.335     banghart 4121: sub get_added_meta_fieldnames {
1.357     raeburn  4122:     my ($cid) = @_;
1.335     banghart 4123:     my %fields;
                   4124:     foreach my $key(%env) {
1.357     raeburn  4125:         if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335     banghart 4126:             my $field_name = $1;
                   4127:             my ($display_field_name) = $env{$key};
                   4128:             $fields{$field_name} = $display_field_name;
                   4129:         }
                   4130:     }
                   4131:     return \%fields;
                   4132: }
1.416     jms      4133: 
                   4134: 
                   4135: 
1.339     banghart 4136: sub get_deleted_meta_fieldnames {
1.357     raeburn  4137:     my ($cid) = @_;
1.339     banghart 4138:     my %fields;
                   4139:     foreach my $key(%env) {
1.357     raeburn  4140:         if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339     banghart 4141:             my $field_name = $1;
                   4142:             if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
                   4143:                 my ($display_field_name) = $env{$key};
                   4144:                 $fields{$field_name} = $display_field_name;
                   4145:             }
                   4146:         }
                   4147:     }
                   4148:     return \%fields;
                   4149: }
1.220     www      4150: sub defaultsetter {
1.280     albertel 4151:     my ($r) = @_;
                   4152: 
1.414     droeschl 4153:     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
1.473     amueller 4154:         text=>"Set Defaults"});
1.531     raeburn  4155:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   4156:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   4157:     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.446     bisitz   4158:     my $start_page =
1.531     raeburn  4159:         &Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 4160:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.507     www      4161:     $r->print($start_page.$breadcrumbs);
1.531     raeburn  4162:     &startSettingsScreen($r,'parmset',$crstype);
1.507     www      4163:     $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');
1.280     albertel 4164: 
1.221     www      4165:     my @ids=();
                   4166:     my %typep=();
                   4167:     my %keyp=();
                   4168:     my %allparms=();
                   4169:     my %allparts=();
                   4170:     my %allmaps=();
                   4171:     my %mapp=();
                   4172:     my %symbp=();
                   4173:     my %maptitles=();
                   4174:     my %uris=();
                   4175:     my %keyorder=&standardkeyorder();
                   4176:     my %defkeytype=();
                   4177: 
1.446     bisitz   4178:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473     amueller 4179:                 \%mapp, \%symbp,\%maptitles,\%uris,
                   4180:                 \%keyorder,\%defkeytype);
1.224     www      4181:     if ($env{'form.storerules'}) {
1.473     amueller 4182:     my %newrules=();
                   4183:     my @delrules=();
                   4184:     my %triggers=();
                   4185:     foreach my $key (keys(%env)) {
1.225     albertel 4186:             if ($key=~/^form\.(\w+)\_action$/) {
1.473     amueller 4187:         my $tempkey=$1;
                   4188:         my $action=$env{$key};
1.226     www      4189:                 if ($action) {
1.473     amueller 4190:             $newrules{$tempkey.'_action'}=$action;
                   4191:             if ($action ne 'default') {
                   4192:             my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   4193:             $triggers{$whichparm}.=$tempkey.':';
                   4194:             }
                   4195:             $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
                   4196:             if (&isdateparm($defkeytype{$tempkey})) {
                   4197:             $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
                   4198:             $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   4199:             $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   4200:             $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   4201:             } else {
                   4202:             $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
                   4203:             $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
                   4204:             }
                   4205:         } else {
                   4206:             push(@delrules,$tempkey.'_action');
                   4207:             push(@delrules,$tempkey.'_type');
                   4208:             push(@delrules,$tempkey.'_hours');
                   4209:             push(@delrules,$tempkey.'_min');
                   4210:             push(@delrules,$tempkey.'_sec');
                   4211:             push(@delrules,$tempkey.'_value');
                   4212:         }
                   4213:         }
                   4214:     }
                   4215:     foreach my $key (keys %allparms) {
                   4216:         $newrules{$key.'_triggers'}=$triggers{$key};
                   4217:     }
1.531     raeburn  4218:     &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);
                   4219:     &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);
1.473     amueller 4220:     &resetrulescache();
1.224     www      4221:     }
1.227     www      4222:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
1.473     amueller 4223:                        'hours' => 'Hours',
                   4224:                        'min' => 'Minutes',
                   4225:                        'sec' => 'Seconds',
                   4226:                        'yes' => 'Yes',
                   4227:                        'no' => 'No');
1.222     www      4228:     my @standardoptions=('','default');
                   4229:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   4230:     my @dateoptions=('','default');
                   4231:     my @datedisplay=('',&mt('Default value when manually setting'));
                   4232:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473     amueller 4233:     unless ($tempkey) { next; }
                   4234:     push @standardoptions,'when_setting_'.$tempkey;
                   4235:     push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   4236:     if (&isdateparm($defkeytype{$tempkey})) {
                   4237:         push @dateoptions,'later_than_'.$tempkey;
                   4238:         push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   4239:         push @dateoptions,'earlier_than_'.$tempkey;
                   4240:         push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   4241:     }
1.222     www      4242:     }
1.231     www      4243: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
1.473     amueller 4244:       &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318     albertel 4245:     $r->print("\n".&Apache::loncommon::start_data_table().
1.473     amueller 4246:           &Apache::loncommon::start_data_table_header_row().
                   4247:           "<th>".&mt('Rule for parameter').'</th><th>'.
                   4248:           &mt('Action').'</th><th>'.&mt('Value').'</th>'.
                   4249:           &Apache::loncommon::end_data_table_header_row());
1.221     www      4250:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473     amueller 4251:     unless ($tempkey) { next; }
                   4252:     $r->print("\n".&Apache::loncommon::start_data_table_row().
                   4253:           "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
                   4254:     my $action=&rulescache($tempkey.'_action');
                   4255:     $r->print('<select name="'.$tempkey.'_action">');
                   4256:     if (&isdateparm($defkeytype{$tempkey})) {
                   4257:         for (my $i=0;$i<=$#dateoptions;$i++) {
                   4258:         if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   4259:         $r->print("\n<option value='$dateoptions[$i]'".
                   4260:               ($dateoptions[$i] eq $action?' selected="selected"':'').
                   4261:               ">$datedisplay[$i]</option>");
                   4262:         }
                   4263:     } else {
                   4264:         for (my $i=0;$i<=$#standardoptions;$i++) {
                   4265:         if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   4266:         $r->print("\n<option value='$standardoptions[$i]'".
                   4267:               ($standardoptions[$i] eq $action?' selected="selected"':'').
                   4268:               ">$standarddisplay[$i]</option>");
                   4269:         }
                   4270:     }
                   4271:     $r->print('</select>');
                   4272:     unless (&isdateparm($defkeytype{$tempkey})) {
                   4273:         $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   4274:               '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   4275:     }
                   4276:     $r->print("\n</td><td>\n");
1.222     www      4277: 
1.221     www      4278:         if (&isdateparm($defkeytype{$tempkey})) {
1.473     amueller 4279:         my $days=&rulescache($tempkey.'_days');
                   4280:         my $hours=&rulescache($tempkey.'_hours');
                   4281:         my $min=&rulescache($tempkey.'_min');
                   4282:         my $sec=&rulescache($tempkey.'_sec');
                   4283:         $r->print(<<ENDINPUTDATE);
1.227     www      4284: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      4285: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   4286: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   4287: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      4288: ENDINPUTDATE
1.473     amueller 4289:     } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      4290:             my $yeschecked='';
                   4291:             my $nochecked='';
1.444     bisitz   4292:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
                   4293:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
1.222     www      4294: 
1.473     amueller 4295:         $r->print(<<ENDYESNO);
1.444     bisitz   4296: <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
                   4297: <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
1.221     www      4298: ENDYESNO
                   4299:         } else {
1.473     amueller 4300:         $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
                   4301:     }
1.318     albertel 4302:         $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221     www      4303:     }
1.318     albertel 4304:     $r->print(&Apache::loncommon::end_data_table().
1.473     amueller 4305:           "\n".'<input type="submit" name="storerules" value="'.
1.507     www      4306:           &mt('Save').'" /></form>'."\n");
                   4307:     &endSettingsScreen($r);
                   4308:     $r->print(&Apache::loncommon::end_page());
1.220     www      4309:     return;
                   4310: }
1.193     albertel 4311: 
1.290     www      4312: sub components {
1.330     albertel 4313:     my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
                   4314: 
                   4315:     if ($typeflag) {
1.473     amueller 4316:     $key=~s/\.type$//;
1.290     www      4317:     }
1.330     albertel 4318: 
                   4319:     my ($middle,$part,$name)=
1.473     amueller 4320:     ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291     www      4321:     my $issection;
1.330     albertel 4322: 
1.290     www      4323:     my $section=&mt('All Students');
                   4324:     if ($middle=~/^\[(.*)\]/) {
1.473     amueller 4325:     $issection=$1;
                   4326:     $section=&mt('Group/Section').': '.$issection;
                   4327:     $middle=~s/^\[(.*)\]//;
1.290     www      4328:     }
                   4329:     $middle=~s/\.+$//;
                   4330:     $middle=~s/^\.+//;
1.291     www      4331:     if ($uname) {
1.473     amueller 4332:     $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   4333:     $issection='';
1.291     www      4334:     }
1.316     albertel 4335:     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.446     bisitz   4336:     my $realmdescription=&mt('all resources');
1.290     www      4337:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473     amueller 4338:     $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';
                   4339:      $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
1.304     www      4340:    } elsif ($middle) {
1.473     amueller 4341:     my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   4342:     $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>';
                   4343:     $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      4344:     }
1.291     www      4345:     my $what=$part.'.'.$name;
1.330     albertel 4346:     return ($realm,$section,$name,$part,
1.473     amueller 4347:         $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      4348: }
1.293     www      4349: 
1.328     albertel 4350: my %standard_parms;
1.469     raeburn  4351: my %standard_parms_types;
1.416     jms      4352: 
1.328     albertel 4353: sub load_parameter_names {
                   4354:     open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
                   4355:     while (my $configline=<$config>) {
1.473     amueller 4356:     if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
                   4357:     chomp($configline);
                   4358:     my ($short,$plain)=split(/:/,$configline);
                   4359:     my (undef,$name,$type)=split(/\&/,$short,3);
                   4360:     if ($type eq 'display') {
                   4361:         $standard_parms{$name} = $plain;
1.469     raeburn  4362:         } elsif ($type eq 'type') {
                   4363:             $standard_parms_types{$name} = $plain;
                   4364:         }
1.328     albertel 4365:     }
                   4366:     close($config);
                   4367:     $standard_parms{'int_pos'}      = 'Positive Integer';
                   4368:     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
                   4369: }
                   4370: 
1.292     www      4371: sub standard_parameter_names {
                   4372:     my ($name)=@_;
1.328     albertel 4373:     if (!%standard_parms) {
1.473     amueller 4374:     &load_parameter_names();
1.328     albertel 4375:     }
1.292     www      4376:     if ($standard_parms{$name}) {
1.473     amueller 4377:     return $standard_parms{$name};
1.446     bisitz   4378:     } else {
1.473     amueller 4379:     return $name;
1.292     www      4380:     }
                   4381: }
1.290     www      4382: 
1.469     raeburn  4383: sub standard_parameter_types {
                   4384:     my ($name)=@_;
                   4385:     if (!%standard_parms_types) {
                   4386:         &load_parameter_names();
                   4387:     }
                   4388:     if ($standard_parms_types{$name}) {
                   4389:         return $standard_parms_types{$name};
                   4390:     }
                   4391:     return;
                   4392: }
1.309     www      4393: 
1.285     albertel 4394: sub parm_change_log {
1.284     www      4395:     my ($r)=@_;
1.531     raeburn  4396:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   4397:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   4398:     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}
1.414     droeschl 4399:     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.473     amueller 4400:     text=>"Parameter Change Log"});
1.522     raeburn  4401:     my $js = '<script type="text/javascript">'."\n".
                   4402:              '// <![CDATA['."\n".
                   4403:              &Apache::loncommon::display_filter_js('parmslog')."\n".
                   4404:              '// ]]>'."\n".
                   4405:              '</script>'."\n";
                   4406:     $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));
1.327     albertel 4407:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
1.531     raeburn  4408:     &startSettingsScreen($r,'parmset',$crstype);
                   4409:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum);
1.311     albertel 4410: 
1.301     www      4411:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311     albertel 4412: 
1.522     raeburn  4413:     $r->print('<div class="LC_left_float">'.
                   4414:               '<fieldset><legend>'.&mt('Display of Changes').'</legend>'.
                   4415:               '<form action="/adm/parmset?action=parameterchangelog"
1.327     albertel 4416:                      method="post" name="parameterlog">');
1.446     bisitz   4417: 
1.311     albertel 4418:     my %saveable_parameters = ('show' => 'scalar',);
                   4419:     &Apache::loncommon::store_course_settings('parameter_log',
                   4420:                                               \%saveable_parameters);
                   4421:     &Apache::loncommon::restore_course_settings('parameter_log',
                   4422:                                                 \%saveable_parameters);
1.522     raeburn  4423:     $r->print(&Apache::loncommon::display_filter('parmslog').'&nbsp;'."\n".
                   4424:               '<input type="submit" value="'.&mt('Display').'" />'.
                   4425:               '</form></fieldset></div><br clear="all" />');
1.301     www      4426: 
1.531     raeburn  4427:     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.301     www      4428:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.473     amueller 4429:           '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   4430:           &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   4431:           &Apache::loncommon::end_data_table_header_row());
1.309     www      4432:     my $shown=0;
1.349     www      4433:     my $folder='';
                   4434:     if ($env{'form.displayfilter'} eq 'currentfolder') {
1.473     amueller 4435:     my $last='';
                   4436:     if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                   4437:         &GDBM_READER(),0640)) {
                   4438:         $last=$hash{'last_known'};
                   4439:         untie(%hash);
                   4440:     }
                   4441:     if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
1.349     www      4442:     }
1.446     bisitz   4443:     foreach my $id (sort
1.473     amueller 4444:             {
                   4445:             if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
                   4446:                 return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
                   4447:             }
                   4448:             my $aid = (split('00000',$a))[-1];
                   4449:             my $bid = (split('00000',$b))[-1];
                   4450:             return $bid<=>$aid;
                   4451:             } (keys(%parmlog))) {
1.294     www      4452:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.473     amueller 4453:     my $count = 0;
                   4454:     my $time =
                   4455:         &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
                   4456:     my $plainname =
                   4457:         &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   4458:                       $parmlog{$id}{'exe_udom'});
                   4459:     my $about_me_link =
                   4460:         &Apache::loncommon::aboutmewrapper($plainname,
                   4461:                            $parmlog{$id}{'exe_uname'},
                   4462:                            $parmlog{$id}{'exe_udom'});
                   4463:     my $send_msg_link='';
                   4464:     if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
                   4465:          || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
                   4466:         $send_msg_link ='<br />'.
                   4467:         &Apache::loncommon::messagewrapper(&mt('Send message'),
                   4468:                            $parmlog{$id}{'exe_uname'},
                   4469:                            $parmlog{$id}{'exe_udom'});
                   4470:     }
                   4471:     my $row_start=&Apache::loncommon::start_data_table_row();
                   4472:     my $makenewrow=0;
                   4473:     my %istype=();
                   4474:     my $output;
                   4475:     foreach my $changed (reverse(sort(@changes))) {
1.330     albertel 4476:             my $value=$parmlog{$id}{'logentry'}{$changed};
1.473     amueller 4477:         my $typeflag = ($changed =~/\.type$/ &&
                   4478:                 !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330     albertel 4479:             my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.473     amueller 4480:         &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
                   4481:         if ($env{'form.displayfilter'} eq 'currentfolder') {
                   4482:         if ($folder) {
                   4483:             if ($middle!~/^\Q$folder\E/) { next; }
                   4484:         }
                   4485:         }
                   4486:         if ($typeflag) {
                   4487:         $istype{$parmname}=$value;
                   4488:         if (!$env{'form.includetypes'}) { next; }
                   4489:         }
                   4490:         $count++;
                   4491:         if ($makenewrow) {
                   4492:         $output .= $row_start;
                   4493:         } else {
                   4494:         $makenewrow=1;
                   4495:         }
1.470     raeburn  4496:             my $parmitem = &standard_parameter_names($parmname);
1.473     amueller 4497:         $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
                   4498:               &mt($parmitem).'</td><td>'.
                   4499:               ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
                   4500:         my $stillactive=0;
                   4501:         if ($parmlog{$id}{'delflag'}) {
                   4502:         $output .= &mt('Deleted');
                   4503:         } else {
                   4504:         if ($typeflag) {
1.470     raeburn  4505:                     my $parmitem = &standard_parameter_names($value); 
                   4506:                     $parmitem = &mt($parmitem);
1.473     amueller 4507:             $output .= &mt('Type: [_1]',$parmitem);
                   4508:         } else {
                   4509:             my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   4510:                               $uname,$udom,$issection,$issection,$courseopt);
1.469     raeburn  4511:                     my $showvalue = $value;
                   4512:                     if ($istype{$parmname} eq '') {
                   4513:                         my $type = &standard_parameter_types($parmname);
                   4514:                         if ($type ne '') {
                   4515:                             if (&isdateparm($type)) {
                   4516:                                 $showvalue =
                   4517:                                     &Apache::lonlocal::locallocaltime($value);
                   4518:                             }
                   4519:                         }
                   4520:                     } else {
1.473     amueller 4521:                 if (&isdateparm($istype{$parmname})) {
                   4522:                 $showvalue = 
1.469     raeburn  4523:                                 &Apache::lonlocal::locallocaltime($value);
1.473     amueller 4524:                 }
1.469     raeburn  4525:                     }
                   4526:                     $output .= $showvalue;
1.473     amueller 4527:             if ($value ne $all[$level]) {
                   4528:             $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
                   4529:             } else {
                   4530:             $stillactive=1;
                   4531:             }
                   4532:         }
                   4533:         }
                   4534:         $output .= '</td><td>';
1.470     raeburn  4535:             
1.473     amueller 4536:         if ($stillactive) {
1.470     raeburn  4537:                 my $parmitem = &standard_parameter_names($parmname);
                   4538:                 $parmitem = &mt($parmitem);
1.473     amueller 4539:         my $title=&mt('Changed [_1]',$parmitem);
1.471     raeburn  4540:                 my $description=&mt('Changed [_1] for [_2] to [_3]',
                   4541:                                     $parmitem,$realmdescription,
1.473     amueller 4542:                     (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
                   4543:         if (($uname) && ($udom)) {
                   4544:             $output .=
                   4545:             &Apache::loncommon::messagewrapper('Notify User',
                   4546:                                $uname,$udom,$title,
                   4547:                                $description);
                   4548:         } else {
                   4549:             $output .=
                   4550:             &Apache::lonrss::course_blog_link($id,$title,
                   4551:                               $description);
                   4552:         }
                   4553:         }
                   4554:         $output .= '</td>'.&Apache::loncommon::end_data_table_row();
                   4555:     }
1.349     www      4556:         if ($env{'form.displayfilter'} eq 'containing') {
1.473     amueller 4557:         my $wholeentry=$about_me_link.':'.
                   4558:         $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
                   4559:         $output;
                   4560:         if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
                   4561:     }
1.349     www      4562:         if ($count) {
1.473     amueller 4563:         $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332     albertel 4564:                        <td rowspan="'.$count.'">'.$about_me_link.
1.473     amueller 4565:           '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   4566:                       ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
                   4567:           $send_msg_link.'</td>'.$output);
                   4568:         $shown++;
                   4569:     }
                   4570:     if (!($env{'form.show'} eq &mt('all')
                   4571:           || $shown<=$env{'form.show'})) { last; }
1.286     www      4572:     }
1.301     www      4573:     $r->print(&Apache::loncommon::end_data_table());
1.507     www      4574:     &endSettingsScreen($r);
1.284     www      4575:     $r->print(&Apache::loncommon::end_page());
                   4576: }
                   4577: 
1.437     raeburn  4578: sub update_slots {
                   4579:     my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
                   4580:     my %slot=&Apache::lonnet::get_slot($slot_name);
                   4581:     if (!keys(%slot)) {
                   4582:         return 'error: slot does not exist';
                   4583:     }
                   4584:     my $max=$slot{'maxspace'};
                   4585:     if (!defined($max)) { $max=99999; }
                   4586: 
                   4587:     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
                   4588:                                        "^$slot_name\0");
                   4589:     my ($tmp)=%consumed;
                   4590:     if ($tmp=~/^error: 2 / ) {
                   4591:         return 'error: unable to determine current slot status';
                   4592:     }
                   4593:     my $last=0;
                   4594:     foreach my $key (keys(%consumed)) {
                   4595:         my $num=(split('\0',$key))[1];
                   4596:         if ($num > $last) { $last=$num; }
                   4597:         if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
                   4598:             return 'ok';
                   4599:         }
                   4600:     }
                   4601: 
                   4602:     if (scalar(keys(%consumed)) >= $max) {
                   4603:         return 'error: no space left in slot';
                   4604:     }
                   4605:     my $wanted=$last+1;
                   4606: 
                   4607:     my %reservation=('name'      => $uname.':'.$udom,
                   4608:                      'timestamp' => time,
                   4609:                      'symb'      => $symb);
                   4610: 
                   4611:     my $success=&Apache::lonnet::newput('slot_reservations',
                   4612:                                         {"$slot_name\0$wanted" =>
                   4613:                                              \%reservation},
                   4614:                                         $cdom, $cnum);
1.438     raeburn  4615:     if ($success eq 'ok') {
                   4616:         my %storehash = (
                   4617:                           symb    => $symb,
                   4618:                           slot    => $slot_name,
                   4619:                           action  => 'reserve',
                   4620:                           context => 'parameter',
                   4621:                         );
1.526     raeburn  4622:         &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1.524     raeburn  4623:                                    '',$uname,$udom,$cnum,$cdom);
1.438     raeburn  4624: 
1.526     raeburn  4625:         &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1.524     raeburn  4626:                                    '',$uname,$udom,$uname,$udom);
1.438     raeburn  4627:     }
1.437     raeburn  4628:     return $success;
                   4629: }
                   4630: 
                   4631: sub delete_slots {
                   4632:     my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
                   4633:     my $delresult;
                   4634:     my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom,
                   4635:                                          $cnum, "^$slot_name\0");
                   4636:     if (&Apache::lonnet::error(%consumed)) {
                   4637:         return 'error: unable to determine current slot status';
                   4638:     }
                   4639:     my ($tmp)=%consumed;
                   4640:     if ($tmp=~/^error: 2 /) {
                   4641:         return 'error: unable to determine current slot status';
                   4642:     }
                   4643:     foreach my $key (keys(%consumed)) {
                   4644:         if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
                   4645:             my $num=(split('\0',$key))[1];
                   4646:             my $entry = $slot_name.'\0'.$num;
                   4647:             $delresult = &Apache::lonnet::del('slot_reservations',[$entry],
                   4648:                                               $cdom,$cnum);
                   4649:             if ($delresult eq 'ok') {
                   4650:                 my %storehash = (
                   4651:                                   symb    => $symb,
                   4652:                                   slot    => $slot_name,
                   4653:                                   action  => 'release',
                   4654:                                   context => 'parameter',
                   4655:                                 );
1.526     raeburn  4656:                 &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1.524     raeburn  4657:                                            1,$uname,$udom,$cnum,$cdom);
1.526     raeburn  4658:                 &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1.524     raeburn  4659:                                            1,$uname,$udom,$uname,$udom);
1.437     raeburn  4660:             }
                   4661:         }
                   4662:     }
                   4663:     return $delresult;
                   4664: }
                   4665: 
1.355     albertel 4666: sub check_for_course_info {
                   4667:     my $navmap = Apache::lonnavmaps::navmap->new();
                   4668:     return 1 if ($navmap);
                   4669:     return 0;
                   4670: }
                   4671: 
1.514     raeburn  4672: sub parameter_release_vars { 
1.504     raeburn  4673:    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   4674:    my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
                   4675:    my $chostname = &Apache::lonnet::hostname($chome);
                   4676:    my ($cmajor,$cminor) = 
                   4677:        split(/\./,&Apache::lonnet::get_server_loncaparev($cdom,$chome));
                   4678:    return ($chostname,$cmajor,$cminor);
                   4679: }
                   4680: 
1.514     raeburn  4681: sub parameter_releasecheck {
                   4682:     my ($name,$value,$needsrelease,$chostname,$cmajor,$cminor) = @_;
1.504     raeburn  4683:     my $needsnewer;
                   4684:     my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
                   4685:     if (($cmajor < $needsmajor) || 
                   4686:         ($cmajor == $needsmajor && $cminor < $needsminor)) {
                   4687:         $needsnewer = 1;
                   4688:     } else {
1.514     raeburn  4689:         &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});
1.504     raeburn  4690:     }
                   4691:     return $needsnewer;
                   4692: }
                   4693: 
                   4694: sub oldversion_warning {
1.514     raeburn  4695:     my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
1.504     raeburn  4696:     my $desc;
1.514     raeburn  4697:     my %stringtypes = (
1.519     raeburn  4698:                         type         => 'string_questiontype',
                   4699:                         lenient      => 'string_lenient',
                   4700:                         retrypartial => 'string_yesno',
1.521     raeburn  4701:                         discussvote  => 'string_discussvote',
1.533     raeburn  4702:                         examcode     => 'string_examcode',
1.514     raeburn  4703:                       );
                   4704:     if (exists($stringtypes{$name})) {
1.533     raeburn  4705:         if ($name eq 'examcode') {
1.535     raeburn  4706:             $desc = $value;
1.533     raeburn  4707:         } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
1.514     raeburn  4708:             foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
                   4709:                 next unless (ref($possibilities) eq 'ARRAY');
                   4710:                 my ($parmval, $description) = @{ $possibilities };
                   4711:                 if ($parmval eq $value) {
                   4712:                     $desc = $description;
                   4713:                     last;
                   4714:                 }
1.504     raeburn  4715:             }
                   4716:         }
                   4717:     }
1.514     raeburn  4718:     my $standard_name = &standard_parameter_names($name);
1.504     raeburn  4719:     return '<p class="LC_warning">'.
1.514     raeburn  4720:            &mt('[_1] was [_2]not[_3] set to [_4].',
                   4721:                $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.
1.504     raeburn  4722:            &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
                   4723:            $cmajor.'.'.$cminor,$chostname,
                   4724:            $needsrelease).
                   4725:            '</p>';
                   4726: }
1.259     banghart 4727: 
1.30      www      4728: sub handler {
1.43      albertel 4729:     my $r=shift;
1.30      www      4730: 
1.376     albertel 4731:     &reset_caches();
                   4732: 
1.414     droeschl 4733:     &Apache::loncommon::content_type($r,'text/html');
                   4734:     $r->send_http_header;
                   4735:     return OK if $r->header_only;
                   4736: 
1.193     albertel 4737:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.473     amueller 4738:                         ['action','state',
1.205     www      4739:                                              'pres_marker',
                   4740:                                              'pres_value',
1.206     www      4741:                                              'pres_type',
1.506     www      4742:                                              'filter','part',
1.390     www      4743:                                              'udom','uname','symb','serial','timebase']);
1.131     www      4744: 
1.83      bowersj2 4745: 
1.193     albertel 4746:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 4747:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
1.507     www      4748:                         text=>"Content and Problem Settings",
1.473     amueller 4749:                         faq=>10,
                   4750:                         bug=>'Instructor Interface',
1.442     droeschl 4751:                                             help =>
                   4752:                                             'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
1.203     www      4753: 
1.30      www      4754: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 4755:     my $parm_permission =
1.473     amueller 4756:     (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
                   4757:      &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
                   4758:                   $env{'request.course.sec'}));
1.355     albertel 4759:     my $exists = &check_for_course_info();
                   4760: 
                   4761:     if ($env{'request.course.id'} &&  $parm_permission && $exists) {
1.193     albertel 4762:         #
                   4763:         # Main switch on form.action and form.state, as appropriate
                   4764:         #
                   4765:         # Check first if coming from someone else headed directly for
                   4766:         #  the table mode
                   4767:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
1.473     amueller 4768:          && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   4769:         &assessparms($r);
1.193     albertel 4770:         } elsif (! exists($env{'form.action'})) {
                   4771:             &print_main_menu($r,$parm_permission);
1.414     droeschl 4772:         } elsif ($env{'form.action'} eq 'setoverview') {
1.473     amueller 4773:         &overview($r);
                   4774:     } elsif ($env{'form.action'} eq 'addmetadata') {
                   4775:         &addmetafield($r);
                   4776:     } elsif ($env{'form.action'} eq 'ordermetadata') {
                   4777:         &order_meta_fields($r);
1.414     droeschl 4778:         } elsif ($env{'form.action'} eq 'setrestrictmeta') {
1.473     amueller 4779:         &setrestrictmeta($r);
1.414     droeschl 4780:         } elsif ($env{'form.action'} eq 'newoverview') {
1.473     amueller 4781:         &newoverview($r);
1.414     droeschl 4782:         } elsif ($env{'form.action'} eq 'setdefaults') {
1.473     amueller 4783:         &defaultsetter($r);
                   4784:     } elsif ($env{'form.action'} eq 'settable') {
                   4785:         &assessparms($r);
1.414     droeschl 4786:         } elsif ($env{'form.action'} eq 'parameterchangelog') {
1.473     amueller 4787:         &parm_change_log($r);
1.414     droeschl 4788:         } elsif ($env{'form.action'} eq 'cleanparameters') {
1.473     amueller 4789:         &clean_parameters($r);
1.414     droeschl 4790:         } elsif ($env{'form.action'} eq 'dateshift1') {
1.390     www      4791:             &date_shift_one($r);
1.414     droeschl 4792:         } elsif ($env{'form.action'} eq 'dateshift2') {
1.390     www      4793:             &date_shift_two($r);
1.446     bisitz   4794:         }
1.43      albertel 4795:     } else {
1.1       www      4796: # ----------------------------- Not in a course, or not allowed to modify parms
1.473     amueller 4797:     if ($exists) {
                   4798:         $env{'user.error.msg'}=
                   4799:         "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   4800:     } else {
                   4801:         $env{'user.error.msg'}=
                   4802:         "/adm/parmset::0:1:Course environment gone, reinitialize the course";
                   4803:     }
                   4804:     return HTTP_NOT_ACCEPTABLE;
1.43      albertel 4805:     }
1.376     albertel 4806:     &reset_caches();
                   4807: 
1.43      albertel 4808:     return OK;
1.1       www      4809: }
                   4810: 
                   4811: 1;
                   4812: __END__
                   4813: 
                   4814: 

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