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

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

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