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

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

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