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

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

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