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

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

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