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

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

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