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

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

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