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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.212   ! www         4: # $Id: lonparmset.pm,v 1.211 2005/06/06 02:25:09 www Exp $
1.40      albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.59      matthew    28: ###################################################################
                     29: ###################################################################
                     30: 
                     31: =pod
                     32: 
                     33: =head1 NAME
                     34: 
                     35: lonparmset - Handler to set parameters for assessments and course
                     36: 
                     37: =head1 SYNOPSIS
                     38: 
                     39: lonparmset provides an interface to setting course parameters. 
                     40: 
                     41: =head1 DESCRIPTION
                     42: 
                     43: This module sets coursewide and assessment parameters.
                     44: 
                     45: =head1 INTERNAL SUBROUTINES
                     46: 
                     47: =over 4
                     48: 
                     49: =cut
                     50: 
                     51: ###################################################################
                     52: ###################################################################
1.1       www        53: 
                     54: package Apache::lonparmset;
                     55: 
                     56: use strict;
                     57: use Apache::lonnet;
                     58: use Apache::Constants qw(:common :http REDIRECT);
1.88      matthew    59: use Apache::lonhtmlcommon();
1.36      albertel   60: use Apache::loncommon;
1.1       www        61: use GDBM_File;
1.57      albertel   62: use Apache::lonhomework;
                     63: use Apache::lonxml;
1.130     www        64: use Apache::lonlocal;
1.197     www        65: use Apache::lonnavmaps;
1.1       www        66: 
1.198     www        67: # --- Caches local to lonparmset
1.2       www        68: 
1.199     www        69: my $parmhashid;
                     70: my %parmhash;
1.201     www        71: my $symbsid;
                     72: my %symbs;
1.198     www        73: 
                     74: # --- end local caches
                     75: 
1.59      matthew    76: ##################################################
                     77: ##################################################
                     78: 
                     79: =pod
                     80: 
                     81: =item parmval
                     82: 
                     83: Figure out a cascading parameter.
                     84: 
1.71      albertel   85: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   86:          $id   - a bighash Id number
1.71      albertel   87:          $def  - the resource's default value   'stupid emacs
                     88: 
                     89: 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 11 possible levels
                     90: 
1.182     albertel   91: 11 - General Course
                     92: 10 - Map or Folder level in course
                     93: 9- resource default
                     94: 8- map default
1.71      albertel   95: 7 - resource level in course
                     96: 6 - General for section
1.82      www        97: 5 - Map or Folder level for section
1.71      albertel   98: 4 - resource level in section
                     99: 3 - General for specific student
1.82      www       100: 2 - Map or Folder level for specific student
1.71      albertel  101: 1 - resource level for specific student
1.2       www       102: 
1.59      matthew   103: =cut
                    104: 
                    105: ##################################################
1.2       www       106: sub parmval {
1.187     www       107:     my ($what,$id,$def,$uname,$udom,$csec)=@_;
1.201     www       108:     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec);
                    109: }
                    110: 
                    111: sub parmval_by_symb {
                    112:     my ($what,$symb,$def,$uname,$udom,$csec)=@_;
1.198     www       113: # load caches
1.200     www       114: 
1.198     www       115:     &cacheparmhash();
1.200     www       116: 
                    117:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    118:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    119:     my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
                    120:     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
                    121: 
1.198     www       122: 
1.8       www       123:     my $result='';
1.44      albertel  124:     my @outpar=();
1.2       www       125: # ----------------------------------------------------- Cascading lookup scheme
1.201     www       126:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.10      www       127: 
1.201     www       128:     my $symbparm=$symb.'.'.$what;
                    129:     my $mapparm=$map.'___(all).'.$what;
1.10      www       130: 
1.190     albertel  131:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
                    132:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    133:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
                    134: 
                    135:     my $courselevel=$env{'request.course.id'}.'.'.$what;
                    136:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    137:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2       www       138: 
1.11      www       139: 
                    140: 
1.182     albertel  141: # --------------------------------------------------------- first, check course
1.11      www       142: 
1.200     www       143:     if (defined($$courseopt{$courselevel})) {
                    144: 	$outpar[11]=$$courseopt{$courselevel};
1.182     albertel  145: 	$result=11;
1.43      albertel  146:     }
1.11      www       147: 
1.200     www       148:     if (defined($$courseopt{$courselevelm})) {
                    149: 	$outpar[10]=$$courseopt{$courselevelm};
1.182     albertel  150: 	$result=10;
1.43      albertel  151:     }
1.11      www       152: 
1.182     albertel  153: # ------------------------------------------------------- second, check default
                    154: 
                    155:     if (defined($def)) { $outpar[9]=$def; $result=9; }
                    156: 
                    157: # ------------------------------------------------------ third, check map parms
                    158: 
                    159:     my $thisparm=$parmhash{$symbparm};
                    160:     if (defined($thisparm)) { $outpar[8]=$thisparm; $result=8; }
                    161: 
1.200     www       162:     if (defined($$courseopt{$courselevelr})) {
                    163: 	$outpar[7]=$$courseopt{$courselevelr};
1.43      albertel  164: 	$result=7;
                    165:     }
1.11      www       166: 
1.182     albertel  167: # ------------------------------------------------------ fourth, back to course
1.71      albertel  168:     if (defined($csec)) {
1.200     www       169:         if (defined($$courseopt{$seclevel})) {
                    170: 	    $outpar[6]=$$courseopt{$seclevel};
1.43      albertel  171: 	    $result=6;
                    172: 	}
1.200     www       173:         if (defined($$courseopt{$seclevelm})) {
                    174: 	    $outpar[5]=$$courseopt{$seclevelm};
1.43      albertel  175: 	    $result=5;
                    176: 	}
                    177: 
1.200     www       178:         if (defined($$courseopt{$seclevelr})) {
1.201     www       179: 	    $outpar[4]=$$courseopt{$seclevelr};
1.43      albertel  180: 	    $result=4;
                    181: 	}
                    182:     }
1.11      www       183: 
1.182     albertel  184: # ---------------------------------------------------------- fifth, check user
1.11      www       185: 
1.71      albertel  186:     if (defined($uname)) {
1.200     www       187: 	if (defined($$useropt{$courselevel})) {
                    188: 	    $outpar[3]=$$useropt{$courselevel};
1.43      albertel  189: 	    $result=3;
                    190: 	}
1.10      www       191: 
1.200     www       192: 	if (defined($$useropt{$courselevelm})) {
                    193: 	    $outpar[2]=$$useropt{$courselevelm};
1.43      albertel  194: 	    $result=2;
                    195: 	}
1.2       www       196: 
1.200     www       197: 	if (defined($$useropt{$courselevelr})) {
                    198: 	    $outpar[1]=$$useropt{$courselevelr};
1.43      albertel  199: 	    $result=1;
                    200: 	}
                    201:     }
1.44      albertel  202:     return ($result,@outpar);
1.2       www       203: }
                    204: 
1.198     www       205: sub resetparmhash {
                    206:     $parmhashid='';
                    207: }
                    208: 
                    209: sub cacheparmhash {
                    210:     if ($parmhashid eq  $env{'request.course.fn'}) { return; }
                    211:     my %parmhashfile;
                    212:     if (tie(%parmhashfile,'GDBM_File',
                    213: 	      $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
                    214: 	%parmhash=%parmhashfile;
                    215: 	untie %parmhashfile;
                    216: 	$parmhashid=$env{'request.course.fn'};
                    217:     }
                    218: }
                    219: 
1.203     www       220: sub resetsymbcache {
                    221:     $symbsid='';
                    222: }
                    223: 
1.201     www       224: sub symbcache {
                    225:     my $id=shift;
                    226:     if ($symbsid ne $env{'request.course.id'}) {
                    227: 	%symbs=();
                    228:     }
                    229:     unless ($symbs{$id}) {
                    230: 	my $navmap = Apache::lonnavmaps::navmap->new();
                    231: 	if ($id=~/\./) {
                    232: 	    my $resource=$navmap->getById($id);
                    233: 	    $symbs{$id}=$resource->symb();
                    234: 	} else {
                    235: 	    my $resource=$navmap->getByMapPc($id);
                    236: 	    $symbs{$id}=&Apache::lonnet::declutter($resource->src());
                    237: 	}
                    238: 	$symbsid=$env{'request.course.id'};
                    239:     }
                    240:     return $symbs{$id};
                    241: }
                    242: 
1.186     www       243: ##################################################
                    244: ##################################################
                    245: #
1.197     www       246: # Store a parameter by ID
1.186     www       247: #
                    248: # Takes
                    249: # - resource id
                    250: # - name of parameter
                    251: # - level
                    252: # - new value
                    253: # - new type
1.187     www       254: # - username
                    255: # - userdomain
                    256: 
1.186     www       257: sub storeparm {
1.187     www       258:     my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
1.201     www       259:     &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec);
1.197     www       260: }
                    261: 
                    262: #
                    263: # Store a parameter by symb
                    264: #
                    265: # Takes
                    266: # - symb
                    267: # - name of parameter
                    268: # - level
                    269: # - new value
                    270: # - new type
                    271: # - username
                    272: # - userdomain
                    273: 
                    274: sub storeparm_by_symb {
                    275: # ---------------------------------------------------------- Get symb, map, etc
                    276:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
                    277: # ---------------------------------------------------------- Construct prefixes
1.186     www       278:     $spnam=~s/\_([^\_]+)$/\.$1/;
1.197     www       279:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
                    280:     my $symbparm=$symb.'.'.$spnam;
                    281:     my $mapparm=$map.'___(all).'.$spnam;
                    282: 
1.190     albertel  283:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
                    284:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    285:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186     www       286:     
1.190     albertel  287:     my $courselevel=$env{'request.course.id'}.'.'.$spnam;
                    288:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    289:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186     www       290:     
                    291:     my $storeunder='';
                    292:     if (($snum==11) || ($snum==3)) { $storeunder=$courselevel; }
                    293:     if (($snum==10) || ($snum==2)) { $storeunder=$courselevelm; }
                    294:     if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
                    295:     if ($snum==6) { $storeunder=$seclevel; }
                    296:     if ($snum==5) { $storeunder=$seclevelm; }
                    297:     if ($snum==4) { $storeunder=$seclevelr; }
                    298:     
                    299:     my $delete;
                    300:     if ($nval eq '') { $delete=1;}
                    301:     my %storecontent = ($storeunder         => $nval,
                    302: 			$storeunder.'.type' => $ntype);
                    303:     my $reply='';
                    304:     if ($snum>3) {
                    305: # ---------------------------------------------------------------- Store Course
                    306: #
1.200     www       307: 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    308: 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.186     www       309: # Expire sheets
                    310: 	&Apache::lonnet::expirespread('','','studentcalc');
                    311: 	if (($snum==7) || ($snum==4)) {
1.197     www       312: 	    &Apache::lonnet::expirespread('','','assesscalc',$symb);
1.186     www       313: 	} elsif (($snum==8) || ($snum==5)) {
1.197     www       314: 	    &Apache::lonnet::expirespread('','','assesscalc',$map);
1.186     www       315: 	} else {
                    316: 	    &Apache::lonnet::expirespread('','','assesscalc');
                    317: 	}
                    318: # Store parameter
                    319: 	if ($delete) {
                    320: 	    $reply=&Apache::lonnet::del
1.200     www       321: 		('resourcedata',[keys(%storecontent)],$cdom,$cnum);
1.186     www       322: 	} else {
                    323: 	    $reply=&Apache::lonnet::cput
1.200     www       324: 		('resourcedata',\%storecontent,$cdom,$cnum);
1.186     www       325: 	}
1.200     www       326: 	&Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
1.186     www       327:     } else {
                    328: # ------------------------------------------------------------------ Store User
                    329: #
                    330: # Expire sheets
                    331: 	&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
                    332: 	if ($snum==1) {
                    333: 	    &Apache::lonnet::expirespread
1.197     www       334: 		($uname,$udom,'assesscalc',$symb);
1.186     www       335: 	} elsif ($snum==2) {
                    336: 	    &Apache::lonnet::expirespread
1.197     www       337: 		($uname,$udom,'assesscalc',$map);
1.186     www       338: 	} else {
                    339: 	    &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
                    340: 	}
                    341: # Store parameter
                    342: 	if ($delete) {
                    343: 	    $reply=&Apache::lonnet::del
                    344: 		('resourcedata',[keys(%storecontent)],$udom,$uname);
                    345: 	} else {
                    346: 	    $reply=&Apache::lonnet::cput
                    347: 		('resourcedata',\%storecontent,$udom,$uname);
                    348: 	}
1.191     albertel  349: 	&Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186     www       350:     }
                    351:     
                    352:     if ($reply=~/^error\:(.*)/) {
                    353: 	return "<font color=red>Write Error: $1</font>";
                    354:     }
                    355:     return '';
                    356: }
                    357: 
1.59      matthew   358: ##################################################
                    359: ##################################################
                    360: 
                    361: =pod
                    362: 
                    363: =item valout
                    364: 
                    365: Format a value for output.
                    366: 
                    367: Inputs:  $value, $type
                    368: 
                    369: Returns: $value, formatted for output.  If $type indicates it is a date,
                    370: localtime($value) is returned.
1.9       www       371: 
1.59      matthew   372: =cut
                    373: 
                    374: ##################################################
                    375: ##################################################
1.9       www       376: sub valout {
                    377:     my ($value,$type)=@_;
1.59      matthew   378:     my $result = '';
                    379:     # Values of zero are valid.
                    380:     if (! $value && $value ne '0') {
1.71      albertel  381: 	$result = '&nbsp;&nbsp;';
1.59      matthew   382:     } else {
1.66      www       383:         if ($type eq 'date_interval') {
                    384:             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
                    385:             $year=$year-70;
                    386:             $mday--;
                    387:             if ($year) {
                    388: 		$result.=$year.' yrs ';
                    389:             }
                    390:             if ($mon) {
                    391: 		$result.=$mon.' mths ';
                    392:             }
                    393:             if ($mday) {
                    394: 		$result.=$mday.' days ';
                    395:             }
                    396:             if ($hour) {
                    397: 		$result.=$hour.' hrs ';
                    398:             }
                    399:             if ($min) {
                    400: 		$result.=$min.' mins ';
                    401:             }
                    402:             if ($sec) {
                    403: 		$result.=$sec.' secs ';
                    404:             }
                    405:             $result=~s/\s+$//;
                    406:         } elsif ($type=~/^date/) {
1.59      matthew   407:             $result = localtime($value);
                    408:         } else {
                    409:             $result = $value;
                    410:         }
                    411:     }
                    412:     return $result;
1.9       www       413: }
                    414: 
1.59      matthew   415: ##################################################
                    416: ##################################################
                    417: 
                    418: =pod
1.5       www       419: 
1.59      matthew   420: =item plink
                    421: 
                    422: Produces a link anchor.
                    423: 
                    424: Inputs: $type,$dis,$value,$marker,$return,$call
                    425: 
                    426: Returns: scalar with html code for a link which will envoke the 
                    427: javascript function 'pjump'.
                    428: 
                    429: =cut
                    430: 
                    431: ##################################################
                    432: ##################################################
1.5       www       433: sub plink {
                    434:     my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23      www       435:     my $winvalue=$value;
                    436:     unless ($winvalue) {
                    437: 	if ($type=~/^date/) {
1.190     albertel  438:             $winvalue=$env{'form.recent_'.$type};
1.23      www       439:         } else {
1.190     albertel  440:             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23      www       441:         }
                    442:     }
1.209     www       443: 
                    444: 
1.23      www       445:     return 
1.43      albertel  446: 	'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
                    447: 	    .$marker."','".$return."','".$call."'".');">'.
                    448: 		&valout($value,$type).'</a><a name="'.$marker.'"></a>';
1.5       www       449: }
                    450: 
1.44      albertel  451: sub startpage {
1.209     www       452:     my $r=shift;
1.99      albertel  453: 
1.120     www       454:     my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',
1.98      www       455:                                             'onUnload="pclose()"');
1.204     www       456:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table Mode Parameter Setting');
1.81      www       457:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88      matthew   458:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.183     albertel  459:     my $html=&Apache::lonxml::xmlbegin();
1.44      albertel  460:     $r->print(<<ENDHEAD);
1.183     albertel  461: $html
1.44      albertel  462: <head>
                    463: <title>LON-CAPA Course Parameters</title>
                    464: <script>
                    465: 
                    466:     function pclose() {
                    467:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    468:                  "height=350,width=350,scrollbars=no,menubar=no");
                    469:         parmwin.close();
                    470:     }
                    471: 
1.88      matthew   472:     $pjump_def
1.44      albertel  473: 
                    474:     function psub() {
                    475:         pclose();
                    476:         if (document.parmform.pres_marker.value!='') {
                    477:             document.parmform.action+='#'+document.parmform.pres_marker.value;
                    478:             var typedef=new Array();
                    479:             typedef=document.parmform.pres_type.value.split('_');
                    480:            if (document.parmform.pres_type.value!='') {
                    481:             if (typedef[0]=='date') {
                    482:                 eval('document.parmform.recent_'+
                    483:                      document.parmform.pres_type.value+
                    484: 		     '.value=document.parmform.pres_value.value;');
                    485:             } else {
                    486:                 eval('document.parmform.recent_'+typedef[0]+
                    487: 		     '.value=document.parmform.pres_value.value;');
                    488:             }
                    489: 	   }
                    490:             document.parmform.submit();
                    491:         } else {
                    492:             document.parmform.pres_value.value='';
                    493:             document.parmform.pres_marker.value='';
                    494:         }
                    495:     }
                    496: 
1.57      albertel  497:     function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                    498:         var options = "width=" + w + ",height=" + h + ",";
                    499:         options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                    500:         options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                    501:         var newWin = window.open(url, wdwName, options);
                    502:         newWin.focus();
                    503:     }
1.44      albertel  504: </script>
1.81      www       505: $selscript
1.44      albertel  506: </head>
1.64      www       507: $bodytag
1.193     albertel  508: $breadcrumbs
                    509: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.44      albertel  510: <input type="hidden" value='' name="pres_value">
                    511: <input type="hidden" value='' name="pres_type">
                    512: <input type="hidden" value='' name="pres_marker">
1.209     www       513: <input type="hidden" value='1' name="prevvisit">
1.44      albertel  514: ENDHEAD
                    515: }
                    516: 
1.209     www       517: 
1.44      albertel  518: sub print_row {
1.201     www       519:     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
1.187     www       520: 	$defbgtwo,$parmlev,$uname,$udom,$csec)=@_;
1.66      www       521: # get the values for the parameter in cascading order
                    522: # empty levels will remain empty
1.44      albertel  523:     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.187     www       524: 				  $rid,$$default{$which},$uname,$udom,$csec);
1.66      www       525: # get the type for the parameters
                    526: # problem: these may not be set for all levels
                    527:     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
                    528:                                           $$name{$which}.'.type',
1.187     www       529: 				  $rid,$$defaulttype{$which},$uname,$udom,$csec);
1.66      www       530: # cascade down manually
1.182     albertel  531:     my $cascadetype=$$defaulttype{$which};
                    532:     for (my $i=11;$i>0;$i--) {
1.66      www       533: 	 if ($typeoutpar[$i]) { 
                    534:             $cascadetype=$typeoutpar[$i];
                    535: 	} else {
                    536:             $typeoutpar[$i]=$cascadetype;
                    537:         }
                    538:     }
1.57      albertel  539:     my $parm=$$display{$which};
                    540: 
1.203     www       541:     if ($parmlev eq 'full') {
1.57      albertel  542:         $r->print('<td bgcolor='.$defbgtwo.' align="center">'
                    543:                   .$$part{$which}.'</td>');
                    544:     } else {    
                    545:         $parm=~s|\[.*\]\s||g;
                    546:     }
                    547: 
1.159     albertel  548:     $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57      albertel  549:    
1.44      albertel  550:     my $thismarker=$which;
                    551:     $thismarker=~s/^parameter\_//;
                    552:     my $mprefix=$rid.'&'.$thismarker.'&';
                    553: 
1.57      albertel  554:     if ($parmlev eq 'general') {
                    555: 
                    556:         if ($uname) {
1.66      www       557:             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  558:         } elsif ($csec) {
1.66      www       559:             &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  560:         } else {
1.182     albertel  561:             &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  562:         }
                    563:     } elsif ($parmlev eq 'map') {
                    564: 
                    565:         if ($uname) {
1.66      www       566:             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  567:         } elsif ($csec) {
1.66      www       568:             &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  569:         } else {
1.182     albertel  570:             &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  571:         }
                    572:     } else {
                    573: 
1.182     albertel  574:         &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  575: 
1.203     www       576: 	&print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    577: 	&print_td($r,9,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    578: 	&print_td($r,8,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    579: 	&print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    580: 	
                    581: 	if ($csec) {
                    582: 	    &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    583: 	    &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    584: 	    &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    585: 	}
                    586: 	if ($uname) {
                    587: 	    &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    588: 	    &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    589: 	    &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    590: 	}
1.57      albertel  591: 
                    592:     } # end of $parmlev if/else
                    593: 
1.136     albertel  594:     $r->print('<td bgcolor=#CCCCFF align="center">'.
                    595:                   &valout($outpar[$result],$typeoutpar[$result]).'</td>');
                    596: 
1.203     www       597:     if ($parmlev eq 'full') {
1.136     albertel  598:         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.201     www       599:                                         '.'.$$name{$which},$$symbp{$rid});
1.136     albertel  600:         my $sessionvaltype=$typeoutpar[$result];
                    601:         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
                    602:         $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.
1.66      www       603:                   &valout($sessionval,$sessionvaltype).'&nbsp;'.
1.57      albertel  604:                   '</font></td>');
1.136     albertel  605:     }
1.44      albertel  606:     $r->print('</tr>');
1.57      albertel  607:     $r->print("\n");
1.44      albertel  608: }
1.59      matthew   609: 
1.44      albertel  610: sub print_td {
1.66      www       611:     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57      albertel  612:     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114     www       613:               ' align="center">');
1.182     albertel  614:     if ($which<8 || $which > 9) {
1.114     www       615: 	$r->print(&plink($$typeoutpar[$which],
                    616: 			 $$display{$value},$$outpar[$which],
                    617: 			 $mprefix."$which",'parmform.pres','psub'));
                    618:     } else {
                    619: 	$r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
                    620:     }
                    621:     $r->print('</td>'."\n");
1.57      albertel  622: }
                    623: 
1.201     www       624: 
1.63      bowersj2  625: =pod
                    626: 
                    627: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
                    628: 
                    629: Input: See list below:
                    630: 
                    631: =over 4
                    632: 
                    633: =item B<ids>: An array that will contain all of the ids in the course.
                    634: 
                    635: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
                    636: 
1.171     www       637: =item B<keyp>: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
1.63      bowersj2  638: 
                    639: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
                    640: 
                    641: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
                    642: 
                    643: =item B<allkeys>: hash, full key to part->display value (what's display value?)
                    644: 
                    645: =item B<allmaps>: hash, ???
                    646: 
                    647: =item B<fcat>: ???
                    648: 
                    649: =item B<defp>: hash, ???
                    650: 
                    651: =item B<mapp>: ??
                    652: 
                    653: =item B<symbp>: hash, id->full sym?
                    654: 
                    655: =back
                    656: 
                    657: =cut
                    658: 
                    659: sub extractResourceInformation {
                    660:     my $ids = shift;
                    661:     my $typep = shift;
                    662:     my $keyp = shift;
                    663:     my $allparms = shift;
                    664:     my $allparts = shift;
                    665:     my $allmaps = shift;
                    666:     my $mapp = shift;
                    667:     my $symbp = shift;
1.82      www       668:     my $maptitles=shift;
1.196     www       669:     my $uris=shift;
1.210     www       670:     my $keyorder=shift;
1.211     www       671:     my $defkeytype=shift;
1.196     www       672: 
1.210     www       673:     my $keyordercnt=100;
1.63      bowersj2  674: 
1.196     www       675:     my $navmap = Apache::lonnavmaps::navmap->new();
                    676:     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
                    677:     foreach my $resource (@allres) {
                    678: 	my $id=$resource->id();
                    679:         my ($mapid,$resid)=split(/\./,$id);
                    680: 	if ($mapid eq '0') { next; }
                    681: 	$$ids[$#$ids+1]=$id;
                    682: 	my $srcf=$resource->src();
                    683: 	$srcf=~/\.(\w+)$/;
                    684: 	$$typep{$id}=$1;
                    685: 	$$keyp{$id}='';
                    686:         $$uris{$id}=$srcf;
                    687: 	foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
                    688: 	    if ($_=~/^parameter\_(.*)/) {
                    689: 		my $key=$_;
1.209     www       690: # Hidden parameters
                    691: 		if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {
                    692: 		    next;
1.63      bowersj2  693: 		}
1.196     www       694: 		my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
                    695: 		my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
                    696: 		my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
1.209     www       697: #
                    698: # allparms is a hash of parameter names
                    699: #
1.196     www       700: 		my $parmdis = $display;
1.209     www       701: 		$parmdis =~ s/\[Part.*$//g;
                    702:                 $$allparms{$name}=$parmdis;
1.211     www       703: 		$$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');
1.209     www       704: #
                    705: # allparts is a hash of all parts
                    706: #
                    707: 		$$allparts{$part} = "Part: $part";
                    708: #
                    709: # Remember all keys going with this resource
                    710: #
1.196     www       711: 		if ($$keyp{$id}) {
                    712: 		    $$keyp{$id}.=','.$key;
1.175     albertel  713: 		} else {
1.196     www       714: 		    $$keyp{$id}=$key;
1.175     albertel  715: 		}
1.210     www       716: #
                    717: # Put in order
                    718: # 
                    719:                 unless ($$keyorder{$key}) {
                    720:                     $$keyorder{$key}=$keyordercnt;
                    721:                     $keyordercnt++;
                    722: 		}
                    723: 
1.63      bowersj2  724: 	    }
                    725: 	}
1.196     www       726: 	$$mapp{$id}=
                    727: 	    &Apache::lonnet::declutter($resource->enclosing_map_src());
                    728: 	$$mapp{$mapid}=$$mapp{$id};
                    729: 	$$allmaps{$mapid}=$$mapp{$id};
                    730: 	if ($mapid eq '1') {
                    731: 	    $$maptitles{$mapid}='Main Course Documents';
                    732: 	} else {
                    733: 	    $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
                    734: 	}
                    735: 	$$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
                    736: 	$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
                    737: 	$$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63      bowersj2  738:     }
                    739: }
                    740: 
1.208     www       741: 
                    742: ##################################################
                    743: ##################################################
                    744: 
                    745: sub parmmenu {
1.211     www       746:     my ($r,$allparms,$pscat,$keyorder)=@_;
1.208     www       747:     my $tempkey;
                    748:     $r->print(<<ENDSCRIPT);
                    749: <script type="text/javascript">
                    750:     function checkall(value, checkName) {
                    751: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                    752:             ele = document.forms.parmform.elements[i];
                    753:             if (ele.name == checkName) {
                    754:                 document.forms.parmform.elements[i].checked=value;
                    755:             }
                    756:         }
                    757:     }
1.210     www       758: 
                    759:     function checkthis(thisvalue, checkName) {
                    760: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                    761:             ele = document.forms.parmform.elements[i];
                    762:             if (ele.name == checkName) {
                    763: 		if (ele.value == thisvalue) {
                    764: 		    document.forms.parmform.elements[i].checked=true;
                    765: 		}
                    766:             }
                    767:         }
                    768:     }
                    769: 
                    770:     function checkdates() {
                    771: 	checkthis('duedate','pscat');
                    772:  	checkthis('opendate','pscat');
                    773: 	checkthis('answerdate','pscat');
                    774: 	checkthis('interval','pscat');
                    775:    }
                    776: 
                    777:     function checkvisi() {
                    778: 	checkthis('hiddenresource','pscat');
                    779:  	checkthis('encrypturl','pscat');
                    780: 	checkthis('problemstatus','pscat');
                    781: 	checkthis('contentopen','pscat');
                    782: 	checkthis('opendate','pscat');
                    783:     }
                    784: 
                    785:     function checkparts() {
                    786: 	checkthis('hiddenparts','pscat');
                    787: 	checkthis('display','pscat');
                    788: 	checkthis('ordered','pscat');
                    789:     }
                    790: 
                    791:     function checkstandard() {
                    792:         checkall(false,'pscat');
                    793: 	checkdates();
                    794: 	checkthis('weight','pscat');
                    795: 	checkthis('maxtries','pscat');
                    796:     }
                    797: 
1.208     www       798: </script>
                    799: ENDSCRIPT
1.209     www       800:     $r->print();
1.208     www       801:     $r->print("\n<table><tr>");
                    802:     my $cnt=0;
1.211     www       803:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.209     www       804: 	$r->print("\n<td><font size='-1'><input type='checkbox' name='pscat' ");
1.208     www       805: 	$r->print('value="'.$tempkey.'"');
                    806: 	if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                    807: 	    $r->print(' checked');
                    808: 	}
1.209     www       809: 	$r->print('>'.$$allparms{$tempkey}.'</font></td>');
                    810:  	$cnt++;
                    811:         if ($cnt==3) {
                    812: 	    $r->print("</tr>\n<tr>");
                    813: 	    $cnt=0;
                    814: 	}
1.208     www       815:     }
                    816:     $r->print('
                    817: </tr><tr><td>
1.210     www       818: <a href="javascript:checkall(true, \'pscat\')">Select All</a>
                    819: <a href="javascript:checkstandard()">Select Standard</a>
                    820: </td><td>
                    821: <a href="javascript:checkdates()">Select Dates</a>
                    822: <a href="javascript:checkvisi()">Select Visibilities</a>
                    823: <a href="javascript:checkparts()">Select Part Parameters</a>
                    824: </td><td>
                    825: <a href="javascript:checkall(false, \'pscat\')">Unselect All</a>
1.208     www       826: </td>
                    827: ');
                    828:     $r->print('</tr></table>');
                    829: }
                    830: 
1.209     www       831: sub partmenu {
                    832:     my ($r,$allparts,$psprt)=@_;
1.211     www       833:     $r->print('<select multiple name="psprt" size="8">');
1.208     www       834:     $r->print('<option value="all"');
                    835:     $r->print(' selected') unless (@{$psprt});
                    836:     $r->print('>'.&mt('All Parts').'</option>');
                    837:     my %temphash=();
                    838:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.209     www       839:     foreach my $tempkey (sort keys %{$allparts}) {
1.208     www       840: 	unless ($tempkey =~ /\./) {
                    841: 	    $r->print('<option value="'.$tempkey.'"');
                    842: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
                    843: 		$r->print(' selected');
                    844: 	    }
                    845: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                    846: 	}
                    847:     }
1.209     www       848:     $r->print('</select>');
                    849: }
                    850: 
                    851: sub usermenu {
                    852:     my ($r,$uname,$id,$udom,$csec)=@_;
                    853:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                    854:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                    855:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
                    856:     my %lt=&Apache::lonlocal::texthash(
                    857: 		    'sg'    => "Section/Group",
                    858: 		    'fu'    => "For User",
                    859: 		    'oi'    => "or ID",
                    860: 		    'ad'    => "at Domain"
                    861: 				       );
                    862:     my %sectionhash=();
                    863:     my $sections='';
                    864:     if (&Apache::loncommon::get_sections(
                    865:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
                    866:                  $env{'course.'.$env{'request.course.id'}.'.num'},
                    867: 					 \%sectionhash)) {
                    868:         $sections=$lt{'sg'}.': <select name="csec">';
                    869: 	foreach ('',sort keys %sectionhash) {
                    870: 	    $sections.='<option value="'.$_.'"'.
                    871: 		($_ eq $csec?'selected="selected"':'').'>'.$_.'</option>';
                    872:         }
                    873:         $sections.='</select>';
                    874:      }
                    875:      $r->print(<<ENDMENU);
                    876: <b>
                    877: $sections
                    878: <br />
                    879: $lt{'fu'} 
                    880: <input type="text" value="$uname" size="12" name="uname" />
                    881: $lt{'oi'}
                    882: <input type="text" value="$id" size="12" name="id" /> 
                    883: $lt{'ad'}
                    884: $chooseopt
                    885: </b>
                    886: ENDMENU
                    887: }
                    888: 
                    889: sub displaymenu {
1.211     www       890:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www       891:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                    892: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www       893:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.209     www       894:     $r->print('</td><td>');
                    895:     &partmenu($r,$allparts,$psprt);
                    896:     $r->print('</td></tr></table>');
                    897: }
                    898: 
                    899: sub mapmenu {
                    900:     my ($r,$allmaps,$pschp,$maptitles)=@_;
                    901:     $r->print(&mt('Select Enclosing Map or Folder').' ');
                    902:     $r->print('<select name="pschp">');
                    903:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                    904:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www       905: 	$r->print('<option value="'.$_.'"');
1.209     www       906: 	if (($pschp eq $_)) { $r->print(' selected'); }
                    907: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                    908:     }
                    909:     $r->print("</select>");
                    910: }
                    911: 
                    912: sub levelmenu {
                    913:     my ($r,$alllevs,$parmlev)=@_;
                    914:     $r->print(&mt('Select Parameter Level').
                    915: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
                    916:     $r->print('<select name="parmlev">');
                    917:     foreach (reverse sort keys %{$alllevs}) {
                    918: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                    919: 	if ($parmlev eq $$alllevs{$_}) {
                    920: 	    $r->print(' selected'); 
                    921: 	}
                    922: 	$r->print('>'.$_.'</option>');
1.208     www       923:     }
1.209     www       924:     $r->print("</select>");
1.208     www       925: }
                    926: 
1.211     www       927: 
                    928: sub sectionmenu {
                    929:     my ($r,$selectedsections)=@_;
1.212   ! www       930:     my %sectionhash=();
1.211     www       931: 
1.212   ! www       932:     if (&Apache::loncommon::get_sections(
        !           933:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
        !           934:                  $env{'course.'.$env{'request.course.id'}.'.num'},
        !           935: 					 \%sectionhash)) {
        !           936: 	$r->print('<select name="Section" multiple="true" size="8" >');
        !           937: 	foreach my $s ('all',sort keys %sectionhash) {
        !           938: 	    $r->print('    <option value="'.$s.'"');
        !           939: 	    foreach (@{$selectedsections}) {
        !           940: 		if ($s eq $_) {
        !           941: 		    $r->print(' selected');
        !           942: 		    last;
        !           943: 		}
        !           944: 	    }
        !           945: 	    $r->print('>'.$s."</option>\n");
        !           946: 	}
        !           947: 	$r->print("</select>\n");
1.211     www       948:     }
                    949: }
                    950: 
1.210     www       951: sub keysplit {
                    952:     my $keyp=shift;
                    953:     return (split(/\,/,$keyp));
                    954: }
                    955: 
                    956: sub keysinorder {
                    957:     my ($name,$keyorder)=@_;
                    958:     return sort {
                    959: 	$$keyorder{$a} <=> $$keyorder{$b};
                    960:     } (keys %{$name});
                    961: }
                    962: 
1.211     www       963: sub keysindisplayorder {
                    964:     my ($name,$keyorder)=@_;
                    965:     return sort {
                    966: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                    967:     } (keys %{$name});
                    968: }
                    969: 
                    970: sub standardkeyorder {
                    971:     return ('parameter_0_opendate' => 1,
                    972: 	    'parameter_0_duedate' => 2,
                    973: 	    'parameter_0_answerdate' => 3,
                    974: 	    'parameter_0_interval' => 4,
                    975: 	    'parameter_0_weight' => 5,
                    976: 	    'parameter_0_maxtries' => 6,
                    977: 	    'parameter_0_hinttries' => 7,
                    978: 	    'parameter_0_contentopen' => 8,
                    979: 	    'parameter_0_contentclose' => 9,
                    980: 	    'parameter_0_type' => 10,
                    981: 	    'parameter_0_problemstatus' => 11,
                    982: 	    'parameter_0_hiddenresource' => 12,
                    983: 	    'parameter_0_hiddenparts' => 13,
                    984: 	    'parameter_0_display' => 14,
                    985: 	    'parameter_0_ordered' => 15,
                    986: 	    'parameter_0_tol' => 16,
                    987: 	    'parameter_0_sig' => 17,
                    988: 	    'parameter_0_turnoffunit' => 18);
                    989: }
                    990: 
1.59      matthew   991: ##################################################
                    992: ##################################################
                    993: 
                    994: =pod
                    995: 
                    996: =item assessparms
                    997: 
                    998: Show assessment data and parameters.  This is a large routine that should
                    999: be simplified and shortened... someday.
                   1000: 
                   1001: Inputs: $r
                   1002: 
                   1003: Returns: nothing
                   1004: 
1.63      bowersj2 1005: Variables used (guessed by Jeremy):
                   1006: 
                   1007: =over 4
                   1008: 
                   1009: =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.
                   1010: 
                   1011: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1012: 
                   1013: =item B<allmaps>:
                   1014: 
                   1015: =back
                   1016: 
1.59      matthew  1017: =cut
                   1018: 
                   1019: ##################################################
                   1020: ##################################################
1.30      www      1021: sub assessparms {
1.1       www      1022: 
1.43      albertel 1023:     my $r=shift;
1.201     www      1024: 
                   1025:     my @ids=();
                   1026:     my %symbp=();
                   1027:     my %mapp=();
                   1028:     my %typep=();
                   1029:     my %keyp=();
                   1030:     my %uris=();
                   1031:     my %maptitles=();
                   1032: 
1.2       www      1033: # -------------------------------------------------------- Variable declaration
1.209     www      1034: 
1.129     www      1035:     my %allmaps=();
                   1036:     my %alllevs=();
1.57      albertel 1037: 
1.187     www      1038:     my $uname;
                   1039:     my $udom;
                   1040:     my $uhome;
                   1041:     my $csec;
                   1042:  
1.190     albertel 1043:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1044: 
1.57      albertel 1045:     $alllevs{'Resource Level'}='full';
                   1046:     $alllevs{'Map Level'}='map';
                   1047:     $alllevs{'Course Level'}='general';
                   1048: 
                   1049:     my %allparms;
                   1050:     my %allparts;
1.210     www      1051: #
                   1052: # Order in which these parameters will be displayed
                   1053: #
1.211     www      1054:     my %keyorder=&standardkeyorder();
                   1055: 
1.43      albertel 1056:     @ids=();
                   1057:     %symbp=();
                   1058:     %typep=();
                   1059: 
                   1060:     my $message='';
                   1061: 
1.190     albertel 1062:     $csec=$env{'form.csec'};
1.188     www      1063: 
1.190     albertel 1064:     if      ($udom=$env{'form.udom'}) {
                   1065:     } elsif ($udom=$env{'request.role.domain'}) {
                   1066:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1067:     } else {
                   1068: 	$udom=$r->dir_config('lonDefDomain');
                   1069:     }
1.43      albertel 1070: 
1.134     albertel 1071:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1072:     my $pschp=$env{'form.pschp'};
1.134     albertel 1073:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1074:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1075: 
1.43      albertel 1076:     my $pssymb='';
1.57      albertel 1077:     my $parmlev='';
                   1078:  
1.190     albertel 1079:     unless ($env{'form.parmlev'}) {
1.57      albertel 1080:         $parmlev = 'map';
                   1081:     } else {
1.190     albertel 1082:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1083:     }
1.26      www      1084: 
1.29      www      1085: # ----------------------------------------------- Was this started from grades?
                   1086: 
1.190     albertel 1087:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1088: 	&& (!$env{'form.dis'})) {
                   1089: 	my $url=$env{'form.url'};
1.194     albertel 1090: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1091: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1092: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1093: 	$pschp='';
1.57      albertel 1094:         $parmlev = 'full';
1.190     albertel 1095:     } elsif ($env{'form.symb'}) {
                   1096: 	$pssymb=$env{'form.symb'};
1.92      albertel 1097: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1098: 	$pschp='';
1.57      albertel 1099:         $parmlev = 'full';
1.43      albertel 1100:     } else {
1.190     albertel 1101: 	$env{'form.url'}='';
1.43      albertel 1102:     }
                   1103: 
1.190     albertel 1104:     my $id=$env{'form.id'};
1.43      albertel 1105:     if (($id) && ($udom)) {
                   1106: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1107: 	if ($uname) {
                   1108: 	    $id='';
                   1109: 	} else {
                   1110: 	    $message=
1.133     www      1111: 		"<font color=red>".&mt("Unknown ID")." '$id' ".
                   1112: 		&mt('at domain')." '$udom'</font>";
1.43      albertel 1113: 	}
                   1114:     } else {
1.190     albertel 1115: 	$uname=$env{'form.uname'};
1.43      albertel 1116:     }
                   1117:     unless ($udom) { $uname=''; }
                   1118:     $uhome='';
                   1119:     if ($uname) {
                   1120: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1121:         if ($uhome eq 'no_host') {
                   1122: 	    $message=
1.133     www      1123: 		"<font color=red>".&mt("Unknown user")." '$uname' ".
                   1124: 		&mt("at domain")." '$udom'</font>";
1.43      albertel 1125: 	    $uname='';
1.12      www      1126:         } else {
1.103     albertel 1127: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1128: 					      $env{'request.course.id'});
1.43      albertel 1129: 	    if ($csec eq '-1') {
                   1130: 		$message="<font color=red>".
1.133     www      1131: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
                   1132: 		    &mt("not in this course")."</font>";
1.43      albertel 1133: 		$uname='';
1.190     albertel 1134: 		$csec=$env{'form.csec'};
1.43      albertel 1135: 	    } else {
                   1136: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1137: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1138: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1139: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1140: 			.$name{'lastname'}.' '.$name{'generation'}.
1.133     www      1141: 			    "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1142: 	    }
1.12      www      1143:         }
1.43      albertel 1144:     }
1.2       www      1145: 
1.43      albertel 1146:     unless ($csec) { $csec=''; }
1.12      www      1147: 
1.14      www      1148: # --------------------------------------------------------- Get all assessments
1.210     www      1149:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1150: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1151: 				\%keyorder);
1.63      bowersj2 1152: 
1.57      albertel 1153:     $mapp{'0.0'} = '';
                   1154:     $symbp{'0.0'} = '';
1.99      albertel 1155: 
1.14      www      1156: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1157:     if ($env{'form.pres_marker'}) {
1.205     www      1158:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1159:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1160:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1161: 	for (my $i=0;$i<=$#markers;$i++) {
                   1162: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1163: 				 $values[$i],
                   1164: 				 $types[$i],
                   1165: 				 $uname,$udom,$csec);
                   1166: 	}
1.68      www      1167: # ---------------------------------------------------------------- Done storing
1.130     www      1168: 	$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      1169:     }
1.57      albertel 1170: #----------------------------------------------- if all selected, fill in array
1.209     www      1171:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1172:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1173:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1174: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1175: 
1.209     www      1176:     &startpage($r);
1.57      albertel 1177: 
1.44      albertel 1178:     foreach ('tolerance','date_default','date_start','date_end',
                   1179: 	     'date_interval','int','float','string') {
                   1180: 	$r->print('<input type="hidden" value="'.
1.190     albertel 1181: 		  $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44      albertel 1182:     }
1.57      albertel 1183:                         
1.44      albertel 1184:     if (!$pssymb) {
1.209     www      1185:         $r->print('<table border="1"><tr><td>');
                   1186:         &levelmenu($r,\%alllevs,$parmlev);
1.128     albertel 1187: 	if ($parmlev ne 'general') {
1.209     www      1188:             $r->print('<td>');
                   1189: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1190: 	    $r->print('</td>');
1.128     albertel 1191: 	}
1.209     www      1192:         $r->print('</td></tr></table>');
1.211     www      1193: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1194:     } else {
1.125     www      1195:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.209     www      1196:         $r->print(&mt('Specific Resource').": ".$resource.
1.212   ! www      1197:                   '<input type="hidden" value="'.$pssymb.'" name="symb"><br />');
1.57      albertel 1198:     }
1.209     www      1199:     &usermenu($r,$uname,$id,$udom,$csec);    
1.57      albertel 1200: 
1.210     www      1201:     $r->print('<p>'.$message.'</p>');
                   1202: 
1.209     www      1203:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1204: 
                   1205:     my @temp_pscat;
                   1206:     map {
                   1207:         my $cat = $_;
                   1208:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1209:     } @pscat;
                   1210: 
                   1211:     @pscat = @temp_pscat;
                   1212: 
1.209     www      1213:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1214: # ----------------------------------------------------------------- Start Table
1.57      albertel 1215:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1216:         my $csuname=$env{'user.name'};
                   1217:         my $csudom=$env{'user.domain'};
1.57      albertel 1218: 
1.203     www      1219:         if ($parmlev eq 'full') {
1.57      albertel 1220:            my $coursespan=$csec?8:5;
                   1221:            $r->print('<p><table border=2>');
                   1222:            $r->print('<tr><td colspan=5></td>');
1.130     www      1223:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1224:            if ($uname) {
                   1225:                $r->print("<th colspan=3 rowspan=2>");
1.130     www      1226:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1227:            }
1.133     www      1228: 	   my %lt=&Apache::lonlocal::texthash(
                   1229: 				  'pie'    => "Parameter in Effect",
                   1230: 				  'csv'    => "Current Session Value",
                   1231:                                   'at'     => 'at',
                   1232:                                   'rl'     => "Resource Level",
                   1233: 				  'ic'     => 'in Course',
                   1234: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1235: 				  'type'   => 'Type',
1.133     www      1236: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1237: 				  'part'   => 'Part',
1.133     www      1238:                                   'pn'     => 'Parameter Name',
                   1239: 				  'def'    => 'default',
                   1240: 				  'femof'  => 'from Enclosing Map or Folder',
                   1241: 				  'gen'    => 'general',
                   1242: 				  'foremf' => 'for Enclosing Map or Folder',
                   1243: 				  'fr'     => 'for Resource'
                   1244: 					      );
1.57      albertel 1245:            $r->print(<<ENDTABLETWO);
1.133     www      1246: <th rowspan=3>$lt{'pie'}</th>
                   1247: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1248: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1249: <th colspan=1>$lt{'ic'}</th>
                   1250: 
1.10      www      1251: ENDTABLETWO
1.57      albertel 1252:            if ($csec) {
1.133     www      1253:                 $r->print("<th colspan=3>".
                   1254: 			  &mt("in Section/Group")." $csec</th>");
1.57      albertel 1255:            }
                   1256:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1257: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1258: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1259: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1260: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1261: ENDTABLEHEADFOUR
1.57      albertel 1262: 
                   1263:            if ($csec) {
1.130     www      1264:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1265:            }
                   1266: 
                   1267:            if ($uname) {
1.130     www      1268:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1269:            }
                   1270: 
                   1271:            $r->print('</tr>');
                   1272: 
                   1273:            my $defbgone='';
                   1274:            my $defbgtwo='';
                   1275: 
                   1276:            foreach (@ids) {
                   1277: 
                   1278:                 my $rid=$_;
                   1279:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1280: 
1.152     albertel 1281:                 if ((!$pssymb && 
                   1282: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1283: 		    ||
                   1284: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1285: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1286:                     if ($defbgone eq '"#E0E099"') {
                   1287:                         $defbgone='"#E0E0DD"';
1.57      albertel 1288:                     } else {
1.184     albertel 1289:                         $defbgone='"#E0E099"';
1.57      albertel 1290:                     }
1.184     albertel 1291:                     if ($defbgtwo eq '"#FFFF99"') {
                   1292:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1293:                     } else {
1.184     albertel 1294:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1295:                     }
                   1296:                     my $thistitle='';
                   1297:                     my %name=   ();
                   1298:                     undef %name;
                   1299:                     my %part=   ();
                   1300:                     my %display=();
                   1301:                     my %type=   ();
                   1302:                     my %default=();
1.196     www      1303:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1304: 
1.210     www      1305:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1306:                         my $tempkeyp = $_;
                   1307:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1308:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1309:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1310:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1311:                           unless ($display{$_}) { $display{$_}=''; }
                   1312:                           $display{$_}.=' ('.$name{$_}.')';
                   1313:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1314:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1315:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1316:                         }
                   1317:                     }
                   1318:                     my $totalparms=scalar keys %name;
                   1319:                     if ($totalparms>0) {
                   1320:                         my $firstrow=1;
1.180     albertel 1321: 			my $title=&Apache::lonnet::gettitle($uri);
1.57      albertel 1322:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1323:                              ' rowspan='.$totalparms.
                   1324:                              '><tt><font size=-1>'.
                   1325:                              join(' / ',split(/\//,$uri)).
                   1326:                              '</font></tt><p><b>'.
1.154     albertel 1327:                              "<a href=\"javascript:openWindow('".
                   1328: 				  &Apache::lonnet::clutter($uri).
1.57      albertel 1329:                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127     albertel 1330:                              " TARGET=_self>$title");
1.57      albertel 1331: 
                   1332:                         if ($thistitle) {
                   1333:                             $r->print(' ('.$thistitle.')');
                   1334:                         }
                   1335:                         $r->print('</a></b></td>');
                   1336:                         $r->print('<td bgcolor='.$defbgtwo.
                   1337:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1338:                                       '</td>');
                   1339: 
                   1340:                         $r->print('<td bgcolor='.$defbgone.
                   1341:                                       ' rowspan='.$totalparms.
                   1342:                                       '><tt><font size=-1>');
                   1343: 
                   1344:                         $r->print(' / res / ');
                   1345:                         $r->print(join(' / ', split(/\//,$mapp{$rid})));
                   1346: 
                   1347:                         $r->print('</font></tt></td>');
                   1348: 
1.210     www      1349:                         foreach (&keysinorder(\%name,\%keyorder)) {
1.57      albertel 1350:                             unless ($firstrow) {
                   1351:                                 $r->print('<tr>');
                   1352:                             } else {
                   1353:                                 undef $firstrow;
                   1354:                             }
                   1355: 
1.201     www      1356:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1357:                                        \%type,\%display,$defbgone,$defbgtwo,
1.187     www      1358:                                        $parmlev,$uname,$udom,$csec);
1.57      albertel 1359:                         }
                   1360:                     }
                   1361:                 }
                   1362:             } # end foreach ids
1.43      albertel 1363: # -------------------------------------------------- End entry for one resource
1.57      albertel 1364:             $r->print('</table>');
1.203     www      1365:         } # end of  full
1.57      albertel 1366: #--------------------------------------------------- Entry for parm level map
                   1367:         if ($parmlev eq 'map') {
                   1368:             my $defbgone = '"E0E099"';
                   1369:             my $defbgtwo = '"FFFF99"';
                   1370: 
                   1371:             my %maplist;
                   1372: 
                   1373:             if ($pschp eq 'all') {
                   1374:                 %maplist = %allmaps; 
                   1375:             } else {
                   1376:                 %maplist = ($pschp => $mapp{$pschp});
                   1377:             }
                   1378: 
                   1379: #-------------------------------------------- for each map, gather information
                   1380:             my $mapid;
1.60      albertel 1381: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1382:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1383: 
                   1384: #-----------------------  loop through ids and get all parameter types for map
                   1385: #-----------------------------------------          and associated information
                   1386:                 my %name = ();
                   1387:                 my %part = ();
                   1388:                 my %display = ();
                   1389:                 my %type = ();
                   1390:                 my %default = ();
                   1391:                 my $map = 0;
                   1392: 
                   1393: #		$r->print("Catmarker: @catmarker<br />\n");
                   1394:                
                   1395:                 foreach (@ids) {
                   1396:                   ($map)=(/([\d]*?)\./);
                   1397:                   my $rid = $_;
                   1398:         
                   1399: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1400: 
                   1401:                   if ($map eq $mapid) {
1.196     www      1402:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1403: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1404: 
                   1405: #--------------------------------------------------------------------
                   1406: # @catmarker contains list of all possible parameters including part #s
                   1407: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1408: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1409: # When storing information, store as part 0
                   1410: # When requesting information, request from full part
                   1411: #-------------------------------------------------------------------
1.210     www      1412:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1413:                       my $tempkeyp = $_;
                   1414:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1415:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1416:                       
                   1417:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1418:                         $part{$tempkeyp}="0";
                   1419:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1420:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1421:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1422:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1423:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1424:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1425:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1426:                       }
                   1427:                     } # end loop through keys
                   1428:                   }
                   1429:                 } # end loop through ids
                   1430:                                  
                   1431: #---------------------------------------------------- print header information
1.133     www      1432:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1433:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57      albertel 1434:                 $r->print(<<ENDMAPONE);
                   1435: <center><h4>
1.135     albertel 1436: Set Defaults for All Resources in $foldermap<br />
                   1437: <font color="red"><i>$showtitle</i></font><br />
1.57      albertel 1438: Specifically for
                   1439: ENDMAPONE
                   1440:                 if ($uname) {
                   1441:                     my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1442:                       ('firstname','middlename','lastname','generation', 'id'));
                   1443:                     my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
                   1444:                            .$name{'lastname'}.' '.$name{'generation'};
1.135     albertel 1445:                     $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130     www      1446:                         &mt('in')." \n");
1.57      albertel 1447:                 } else {
1.135     albertel 1448:                     $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57      albertel 1449:                 }
                   1450:             
1.135     albertel 1451:                 if ($csec) {$r->print(&mt("Section")." <font color=\"red\"><i>$csec</i></font> ".
1.130     www      1452: 				      &mt('of')." \n")};
1.57      albertel 1453: 
1.135     albertel 1454:                 $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
                   1455:                 $r->print("</h4>\n");
1.57      albertel 1456: #---------------------------------------------------------------- print table
                   1457:                 $r->print('<p><table border="2">');
1.130     www      1458:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1459:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1460:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1461: 
1.210     www      1462: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1463:                     $r->print('<tr>');
1.201     www      1464:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.57      albertel 1465:                            \%type,\%display,$defbgone,$defbgtwo,
1.187     www      1466:                            $parmlev,$uname,$udom,$csec);
1.57      albertel 1467:                 }
                   1468:                 $r->print("</table></center>");
                   1469:             } # end each map
                   1470:         } # end of $parmlev eq map
                   1471: #--------------------------------- Entry for parm level general (Course level)
                   1472:         if ($parmlev eq 'general') {
                   1473:             my $defbgone = '"E0E099"';
                   1474:             my $defbgtwo = '"FFFF99"';
                   1475: 
                   1476: #-------------------------------------------- for each map, gather information
                   1477:             my $mapid="0.0";
                   1478: #-----------------------  loop through ids and get all parameter types for map
                   1479: #-----------------------------------------          and associated information
                   1480:             my %name = ();
                   1481:             my %part = ();
                   1482:             my %display = ();
                   1483:             my %type = ();
                   1484:             my %default = ();
                   1485:                
                   1486:             foreach (@ids) {
                   1487:                 my $rid = $_;
                   1488:         
1.196     www      1489:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1490: 
                   1491: #--------------------------------------------------------------------
                   1492: # @catmarker contains list of all possible parameters including part #s
                   1493: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1494: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1495: # When storing information, store as part 0
                   1496: # When requesting information, request from full part
                   1497: #-------------------------------------------------------------------
1.210     www      1498:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1499:                   my $tempkeyp = $_;
                   1500:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1501:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1502:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1503:                     $part{$tempkeyp}="0";
                   1504:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1505:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1506:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1507:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1508:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1509:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1510:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1511:                   }
                   1512:                 } # end loop through keys
                   1513:             } # end loop through ids
                   1514:                                  
                   1515: #---------------------------------------------------- print header information
1.133     www      1516: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1517:             $r->print(<<ENDMAPONE);
1.133     www      1518: <center><h4>$setdef
1.135     albertel 1519: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1520: ENDMAPONE
                   1521:             if ($uname) {
                   1522:                 my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1523:                   ('firstname','middlename','lastname','generation', 'id'));
                   1524:                 my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
                   1525:                        .$name{'lastname'}.' '.$name{'generation'};
1.135     albertel 1526:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 1527:             } else {
1.135     albertel 1528:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 1529:             }
                   1530:             
1.135     albertel 1531:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
                   1532:             $r->print("</h4>\n");
1.57      albertel 1533: #---------------------------------------------------------------- print table
                   1534:             $r->print('<p><table border="2">');
1.130     www      1535:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1536:             $r->print('<th>'.&mt('Default Value').'</th>');
                   1537:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1538: 
1.210     www      1539: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1540:                 $r->print('<tr>');
1.201     www      1541:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.187     www      1542:                        \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
1.57      albertel 1543:             }
                   1544:             $r->print("</table></center>");
                   1545:         } # end of $parmlev eq general
1.43      albertel 1546:     }
1.44      albertel 1547:     $r->print('</form></body></html>');
1.57      albertel 1548: } # end sub assessparms
1.30      www      1549: 
1.59      matthew  1550: 
                   1551: ##################################################
                   1552: ##################################################
                   1553: 
                   1554: =pod
                   1555: 
                   1556: =item crsenv
                   1557: 
1.105     matthew  1558: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  1559: be simplified and shortened... someday.
                   1560: 
                   1561: Inputs: $r
                   1562: 
                   1563: Returns: nothing
                   1564: 
                   1565: =cut
                   1566: 
                   1567: ##################################################
                   1568: ##################################################
1.30      www      1569: sub crsenv {
                   1570:     my $r=shift;
                   1571:     my $setoutput='';
1.64      www      1572:     my $bodytag=&Apache::loncommon::bodytag(
                   1573:                              'Set Course Environment Parameters');
1.194     albertel 1574:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,
                   1575: 						    'Edit Course Environment');
1.190     albertel 1576:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1577:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  1578: 
                   1579:     #
                   1580:     # Go through list of changes
1.190     albertel 1581:     foreach (keys %env) {
1.105     matthew  1582:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   1583:         my $name  = $1;
1.190     albertel 1584:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  1585:         if ($name eq 'newp') {
1.190     albertel 1586:             $name = $env{'form.newp_name'};
1.105     matthew  1587:         }
                   1588:         if ($name eq 'url') {
                   1589:             $value=~s/^\/res\///;
                   1590:             my $bkuptime=time;
                   1591:             my @tmp = &Apache::lonnet::get
                   1592:                 ('environment',['url'],$dom,$crs);
1.130     www      1593:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  1594:                 &Apache::lonnet::put
                   1595:                 ('environment',
                   1596:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   1597:                  $dom,$crs).
                   1598:                      '<br>';
                   1599:         }
                   1600:         #
                   1601:         # Deal with modified default spreadsheets
                   1602:         if ($name =~ /^spreadsheet_default_(classcalc|
                   1603:                                             studentcalc|
                   1604:                                             assesscalc)$/x) {
                   1605:             my $sheettype = $1; 
                   1606:             if ($sheettype eq 'classcalc') {
                   1607:                 # no need to do anything since viewing the sheet will
                   1608:                 # cause it to be updated. 
                   1609:             } elsif ($sheettype eq 'studentcalc') {
                   1610:                 # expire all the student spreadsheets
                   1611:                 &Apache::lonnet::expirespread('','','studentcalc');
                   1612:             } else {
                   1613:                 # expire all the assessment spreadsheets 
                   1614:                 #    this includes non-default spreadsheets, but better to
                   1615:                 #    be safe than sorry.
                   1616:                 &Apache::lonnet::expirespread('','','assesscalc');
                   1617:                 # expire all the student spreadsheets
                   1618:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      1619:             }
1.105     matthew  1620:         }
                   1621:         #
1.107     matthew  1622:         # Deal with the enrollment dates
                   1623:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   1624:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   1625:         }
1.178     raeburn  1626:         # Get existing cloners
                   1627:         my @oldcloner = ();
                   1628:         if ($name eq 'cloners') {
                   1629:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   1630:             if ($clonenames{'cloners'} =~ /,/) {
                   1631:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   1632:             } else {
                   1633:                 $oldcloner[0] = $clonenames{'cloners'};
                   1634:             }
                   1635:         }
1.107     matthew  1636:         #
1.105     matthew  1637:         # Let the user know we made the changes
1.153     albertel 1638:         if ($name && defined($value)) {
1.178     raeburn  1639:             if ($name eq 'cloners') {
                   1640:                 $value =~ s/^,//;
                   1641:                 $value =~ s/,$//;
                   1642:             }
1.105     matthew  1643:             my $put_result = &Apache::lonnet::put('environment',
                   1644:                                                   {$name=>$value},$dom,$crs);
                   1645:             if ($put_result eq 'ok') {
1.130     www      1646:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178     raeburn  1647:                 if ($name eq 'cloners') {
                   1648:                     &change_clone($value,\@oldcloner);
                   1649:                 }
1.179     raeburn  1650:                 # Flush the course logs so course description is immediately updated
                   1651:                 if ($name eq 'description' && defined($value)) {
                   1652:                     &Apache::lonnet::flushcourselogs();
                   1653:                 }
1.105     matthew  1654:             } else {
1.130     www      1655:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   1656: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      1657:             }
                   1658:         }
1.38      harris41 1659:     }
1.108     www      1660: # ------------------------- Re-init course environment entries for this session
                   1661: 
1.190     albertel 1662:     &Apache::lonnet::coursedescription($env{'request.course.id'});
1.105     matthew  1663: 
1.30      www      1664: # -------------------------------------------------------- Get parameters again
1.45      matthew  1665: 
                   1666:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 1667:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 1668:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      1669:     my $output='';
1.45      matthew  1670:     if (! exists($values{'con_lost'})) {
1.30      www      1671:         my %descriptions=
1.140     sakharuk 1672: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  1673:                                  '<a href="javascript:openbrowser'.
1.47      matthew  1674:                                  "('envform','url','sequence')\">".
1.140     sakharuk 1675:                                  &mt('Select Map').'</a><br /><font color=red> '.
                   1676:                                  &mt('Modification may make assessment data inaccessible').
                   1677:                                  '</font>',
                   1678:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 1679:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 1680:                                  '</b><br />'.
                   1681:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  1682:              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain)</tt><br />'.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),
1.150     www      1683:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   1684:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 1685:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      1686:                     '<a href="javascript:openbrowser'.
                   1687:                     "('envform','default_xml_style'".
1.140     sakharuk 1688:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 1689:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   1690:                                  '</b><br />(<tt>user:domain,'.
1.74      www      1691:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1692:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      1693:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1694:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 1695:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1696:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 1697:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 1698:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 1699:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 1700:                                  &mt('changes will not show until next login').')',
1.169     matthew  1701:              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b>'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),
1.118     matthew  1702: 
1.141     sakharuk 1703:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   1704:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 1705:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  1706:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 1707:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  1708: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   1709:              'plc.users.denied' => 
1.141     sakharuk 1710:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  1711:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   1712: 
1.141     sakharuk 1713:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   1714:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 1715:                                   'student, "<tt>ta</tt>": '.
                   1716:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 1717:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 1718: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      1719:              'pch.users.denied' => 
1.141     sakharuk 1720:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      1721:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  1722:              'spreadsheet_default_classcalc' 
1.141     sakharuk 1723:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  1724:                     '<a href="javascript:openbrowser'.
                   1725:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 1726:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  1727:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 1728:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  1729:                     '<a href="javascript:openbrowser'.
                   1730:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 1731:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  1732:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 1733:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  1734:                     '<a href="javascript:openbrowser'.
                   1735:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 1736:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 1737: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 1738: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 1739: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  1740:              'allow_discussion_post_editing'
                   1741:                  => '<b>'.&mt('Allow users to edit/delete their own discussion posts').'</b><br />'.
                   1742:                     '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.89      albertel 1743: 	     'rndseed'
1.140     sakharuk 1744: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
                   1745:                     '<font color="red">'.&mt('Modifying this will make problems').' '.
                   1746:                     &mt('have different numbers and answers').'</font>',
1.151     albertel 1747: 	     'receiptalg'
                   1748: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   1749:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 1750:              'suppress_tries'
                   1751:                  => '<b>'.&mt('Suppress number of tries in printing').'</b>('.
                   1752:                     &mt('yes if supress').')',
1.113     sakharuk 1753:              'problem_stream_switch'
1.141     sakharuk 1754:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 1755:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 1756:              'default_paper_size' 
                   1757:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   1758:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   1759:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   1760:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 1761:              'anonymous_quiz'
1.150     www      1762:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 1763:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
                   1764:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date when enrolling students').'</b>',
                   1765:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date when enrolling students').'</b>',
1.150     www      1766:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   1767:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 1768:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      1769:              'disable_receipt_display'
1.141     sakharuk 1770:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 1771:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163     albertel 1772: 	     'disablesigfigs'
                   1773: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   1774:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.149     albertel 1775: 	     'tthoptions'
                   1776: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  1777:              ); 
1.177     raeburn  1778:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.107     matthew  1779:                              'default_xml_style','pageseparators',
                   1780:                              'question.email','comment.email','policy.email',
1.169     matthew  1781:                              'student_classlist_view',
1.118     matthew  1782:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  1783:                              'pch.roles.denied','pch.users.denied',
                   1784:                              'allow_limited_html_in_feedback',
1.170     raeburn  1785:                              'allow_discussion_post_editing',
1.108     www      1786:                              'languages',
1.150     www      1787: 			     'nothideprivileged',
1.107     matthew  1788:                              'rndseed',
1.151     albertel 1789:                              'receiptalg',
1.107     matthew  1790:                              'problem_stream_switch',
1.164     sakharuk 1791: 			     'suppress_tries',
1.161     sakharuk 1792:                              'default_paper_size',
1.115     www      1793:                              'disable_receipt_display',
1.107     matthew  1794:                              'spreadsheet_default_classcalc',
                   1795:                              'spreadsheet_default_studentcalc',
                   1796:                              'spreadsheet_default_assesscalc', 
                   1797:                              'hideemptyrows',
                   1798:                              'default_enrollment_start_date',
                   1799:                              'default_enrollment_end_date',
1.163     albertel 1800: 			     'tthoptions',
                   1801: 			     'disablesigfigs'
1.107     matthew  1802:                              );
                   1803: 	foreach my $parameter (sort(keys(%values))) {
1.142     raeburn  1804:             unless ($parameter =~ m/^internal\./) {
                   1805:                 if (! $descriptions{$parameter}) {
                   1806:                     $descriptions{$parameter}=$parameter;
                   1807:                     push(@Display_Order,$parameter);
                   1808:                 }
                   1809:             }
1.43      albertel 1810: 	}
1.107     matthew  1811:         foreach my $parameter (@Display_Order) {
                   1812:             my $description = $descriptions{$parameter};
1.51      matthew  1813:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      1814:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  1815:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  1816:                 '.checked=true;"';
1.107     matthew  1817:             $output .= '<tr><td>'.$description.'</td>';
                   1818:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   1819:                 $output .= '<td>'.
                   1820:                     &Apache::lonhtmlcommon::date_setter('envform',
                   1821:                                                         $parameter.'_value',
                   1822:                                                         $values{$parameter},
                   1823:                                                         $onchange).
                   1824:                                                         '</td>';
                   1825:             } else {
                   1826:                 $output .= '<td>'.
                   1827:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   1828:                                                     $values{$parameter},
                   1829:                                                     40,$onchange).'</td>';
                   1830:             }
                   1831:             $output .= '<td>'.
                   1832:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   1833:                 '</td>';
                   1834:             $output .= "</tr>\n";
1.51      matthew  1835: 	}
1.69      www      1836:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  1837:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   1838:             '.checked=true;"';
1.130     www      1839: 	$output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  1840: 	    '<input type="text" size=40 name="newp_name" '.
                   1841:                 $onchange.' /></td><td>'.
                   1842:             '<input type="text" size=40 name="newp_value" '.
                   1843:                 $onchange.' /></td><td>'.
                   1844: 	    '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43      albertel 1845:     }
1.157     sakharuk 1846:     my %lt=&Apache::lonlocal::texthash(
                   1847: 		    'par'   => 'Parameter',
                   1848: 		    'val'   => 'Value',
                   1849: 		    'set'   => 'Set',
                   1850: 		    'sce'   => 'Set Course Environment'
                   1851: 				       );
                   1852: 
1.140     sakharuk 1853:     my $Parameter=&mt('Parameter');
                   1854:     my $Value=&mt('Value');
1.141     sakharuk 1855:     my $Set=&mt('Set');
1.167     albertel 1856:     my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');
1.183     albertel 1857:     my $html=&Apache::lonxml::xmlbegin();
1.190     albertel 1858:     $r->print(<<ENDenv);
1.183     albertel 1859: $html
                   1860: <head>
1.46      matthew  1861: <script type="text/javascript" language="Javascript" >
1.155     albertel 1862: $browse_js
1.46      matthew  1863: </script>
1.30      www      1864: <title>LON-CAPA Course Environment</title>
                   1865: </head>
1.64      www      1866: $bodytag
1.193     albertel 1867: $breadcrumbs
                   1868: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      1869: $setoutput
                   1870: <p>
                   1871: <table border=2>
1.157     sakharuk 1872: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30      www      1873: $output
                   1874: </table>
1.157     sakharuk 1875: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      1876: </form>
                   1877: </body>
                   1878: </html>    
1.190     albertel 1879: ENDenv
1.30      www      1880: }
1.120     www      1881: ##################################################
1.207     www      1882: # Overview mode
                   1883: ##################################################
1.124     www      1884: my $tableopen;
                   1885: 
                   1886: sub tablestart {
                   1887:     if ($tableopen) {
                   1888: 	return '';
                   1889:     } else {
                   1890: 	$tableopen=1;
1.130     www      1891: 	return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.
                   1892: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      1893:     }
                   1894: }
                   1895: 
                   1896: sub tableend {
                   1897:     if ($tableopen) {
                   1898: 	$tableopen=0;
                   1899: 	return '</table>';
                   1900:     } else {
                   1901: 	return'';
                   1902:     }
                   1903: }
                   1904: 
1.207     www      1905: sub readdata {
                   1906:     my ($crs,$dom)=@_;
                   1907: # Read coursedata
                   1908:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   1909: # Read userdata
                   1910: 
                   1911:     my $classlist=&Apache::loncoursedata::get_classlist();
                   1912:     foreach (keys %$classlist) {
                   1913:         # the following undefs are for 'domain', and 'username' respectively.
                   1914:         if ($_=~/^(\w+)\:(\w+)$/) {
                   1915: 	    my ($tuname,$tudom)=($1,$2);
                   1916: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   1917:             foreach my $userkey (keys %{$useropt}) {
                   1918: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   1919:                     my $newkey=$userkey;
                   1920: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   1921: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   1922: 		}
                   1923: 	    }
                   1924: 	}
                   1925:     }
                   1926:     return $resourcedata;
                   1927: }
                   1928: 
                   1929: 
1.124     www      1930: # Setting
1.208     www      1931: 
                   1932: sub storedata {
                   1933:     my ($r,$crs,$dom)=@_;
1.207     www      1934: # Set userlevel immediately
                   1935: # Do an intermediate store of course level
                   1936:     my $olddata=&readdata($crs,$dom);
1.124     www      1937:     my %newdata=();
                   1938:     undef %newdata;
                   1939:     my @deldata=();
                   1940:     undef @deldata;
1.190     albertel 1941:     foreach (keys %env) {
1.124     www      1942: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   1943: 	    my $cmd=$1;
                   1944: 	    my $thiskey=$2;
1.207     www      1945: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   1946: 	    my $tkey=$thiskey;
                   1947:             if ($tuname) {
                   1948: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   1949: 	    }
1.124     www      1950: 	    if ($cmd eq 'set') {
1.190     albertel 1951: 		my $data=$env{$_};
1.212   ! www      1952:                 my $typeof=$env{'form.typeof_'.$thiskey};
        !          1953:  		if ($$olddata{$thiskey} ne $data) { 
1.207     www      1954: 		    if ($tuname) {
1.212   ! www      1955: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
        !          1956: 								 $tkey.'.type' => $typeof},
        !          1957: 						 $tudom,$tuname) eq 'ok') {
1.207     www      1958: 			    $r->print('<br />'.&mt('Stored modified parameter for').' '.
                   1959: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   1960: 			} else {
                   1961: 			    $r->print('<h2><font color="red">'.
                   1962: 				      &mt('Error storing parameters').'</font></h2>');
                   1963: 			}
                   1964: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   1965: 		    } else {
                   1966: 			$newdata{$thiskey}=$data;
1.212   ! www      1967:  			$newdata{$thiskey.'.type'}=$typeof; 
        !          1968:                    } 
1.207     www      1969: 		}
1.124     www      1970: 	    } elsif ($cmd eq 'del') {
1.207     www      1971: 		if ($tuname) {
                   1972: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
                   1973: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   1974: 		    } else {
                   1975: 			$r->print('<h2><font color="red">'.
                   1976: 				  &mt('Error deleting parameters').'</font></h2>');
                   1977: 		    }
                   1978: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   1979: 		} else {
                   1980: 		    push (@deldata,$thiskey);
                   1981: 		}
1.124     www      1982: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 1983: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212   ! www      1984:                 my $typeof=$env{'form.typeof_'.$thiskey};
1.207     www      1985: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
                   1986: 		    if ($tuname) {
1.212   ! www      1987: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
        !          1988: 								 $tkey.'.type' => $typeof},
        !          1989: 						 $tudom,$tuname) eq 'ok') {
1.207     www      1990: 			    $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   1991: 			} else {
                   1992: 			    $r->print('<h2><font color="red">'.
                   1993: 				      &mt('Error storing parameters').'</font></h2>');
                   1994: 			}
                   1995: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   1996: 		    } else {
1.212   ! www      1997: 			$newdata{$thiskey}=$data;
        !          1998: 			$newdata{$thiskey.'.type'}=$typeof; 
1.207     www      1999: 		    }
                   2000: 		}
1.124     www      2001: 	    }
                   2002: 	}
                   2003:     }
1.207     www      2004: # Store all course level
1.144     www      2005:     my $delentries=$#deldata+1;
                   2006:     my @newdatakeys=keys %newdata;
                   2007:     my $putentries=$#newdatakeys+1;
                   2008:     if ($delentries) {
                   2009: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
                   2010: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2011: 	} else {
                   2012: 	    $r->print('<h2><font color="red">'.
                   2013: 		      &mt('Error deleting parameters').'</font></h2>');
                   2014: 	}
1.205     www      2015: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2016:     }
                   2017:     if ($putentries) {
                   2018: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.212   ! www      2019: 	    $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2020: 	} else {
                   2021: 	    $r->print('<h2><font color="red">'.
                   2022: 		      &mt('Error storing parameters').'</font></h2>');
                   2023: 	}
1.205     www      2024: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2025:     }
1.208     www      2026: }
1.207     www      2027: 
1.208     www      2028: sub extractuser {
                   2029:     my $key=shift;
                   2030:     return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
                   2031: }
1.206     www      2032: 
1.208     www      2033: sub listdata {
                   2034:     my ($r,$resourcedata,$listdata)=@_;
1.207     www      2035: # Start list output
1.206     www      2036: 
1.122     www      2037:     my $oldsection='';
                   2038:     my $oldrealm='';
                   2039:     my $oldpart='';
1.123     www      2040:     my $pointer=0;
1.124     www      2041:     $tableopen=0;
1.145     www      2042:     my $foundkeys=0;
1.208     www      2043:     foreach my $thiskey (sort keys %{$listdata}) {
1.211     www      2044: 	if ($$listdata{$thiskey.'.type'}) {
                   2045:             my $thistype=$$listdata{$thiskey.'.type'};
                   2046:             if ($$resourcedata{$thiskey.'.type'}) {
                   2047: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2048: 	    }
1.207     www      2049: 	    my ($middle,$part,$name)=
                   2050: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2051: 	    my $section=&mt('All Students');
1.207     www      2052: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2053: 		my $issection=$1;
                   2054: 		if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
                   2055: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2056: 		} else {
                   2057: 		    $section=&mt('Group/Section').': '.$issection;
                   2058: 		}
1.207     www      2059: 		$middle=~s/^\[(.*)\]//;
1.122     www      2060: 	    }
1.207     www      2061: 	    $middle=~s/\.+$//;
                   2062: 	    $middle=~s/^\.+//;
1.130     www      2063: 	    my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122     www      2064: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174     albertel 2065: 		$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122     www      2066: 	    } elsif ($middle) {
1.174     albertel 2067: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   2068: 		$realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
1.122     www      2069: 	    }
                   2070: 	    if ($section ne $oldsection) {
1.124     www      2071: 		$r->print(&tableend()."\n<hr /><h1>$section</h1>");
1.122     www      2072: 		$oldsection=$section;
                   2073: 		$oldrealm='';
                   2074: 	    }
                   2075: 	    if ($realm ne $oldrealm) {
1.124     www      2076: 		$r->print(&tableend()."\n<h2>$realm</h2>");
1.122     www      2077: 		$oldrealm=$realm;
                   2078: 		$oldpart='';
                   2079: 	    }
                   2080: 	    if ($part ne $oldpart) {
1.124     www      2081: 		$r->print(&tableend().
1.130     www      2082: 			  "\n<h3><font color='blue'>".&mt('Part').": $part</font></h3>");
1.122     www      2083: 		$oldpart=$part;
                   2084: 	    }
1.123     www      2085: #
                   2086: # Ready to print
                   2087: #
1.124     www      2088: 	    $r->print(&tablestart().'<tr><td><b>'.$name.
                   2089: 		      ':</b></td><td><input type="checkbox" name="del_'.
                   2090: 		      $thiskey.'" /></td><td>');
1.145     www      2091: 	    $foundkeys++;
1.211     www      2092: 	    if ($thistype=~/^date/) {
1.123     www      2093: 		my $jskey='key_'.$pointer;
                   2094: 		$pointer++;
                   2095: 		$r->print(
                   2096: 			  &Apache::lonhtmlcommon::date_setter('overviewform',
                   2097: 							      $jskey,
1.206     www      2098: 						      $$resourcedata{$thiskey}).
1.123     www      2099: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
                   2100: 			  );
                   2101: 	    } else {
1.211     www      2102: 		$r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.206     www      2103: 			  $$resourcedata{$thiskey}.'">');
1.123     www      2104: 	    }
1.211     www      2105: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2106: 		      $thistype.'">');
1.124     www      2107: 	    $r->print('</td></tr>');
1.122     www      2108: 	}
1.121     www      2109:     }
1.208     www      2110:     return $foundkeys;
                   2111: }
                   2112: 
                   2113: sub newoverview {
                   2114:     my $r=shift;
                   2115:     my $bodytag=&Apache::loncommon::bodytag(
                   2116:                              'Set Course Assessment Parameters');
                   2117:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2118:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2119:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
                   2120:     my $html=&Apache::lonxml::xmlbegin();
                   2121:     $r->print(<<ENDOVER);
                   2122: $html
                   2123: <head>
                   2124: <title>LON-CAPA Parameters</title>
                   2125: </head>
                   2126: $bodytag
                   2127: $breadcrumbs
1.211     www      2128: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      2129: ENDOVER
1.211     www      2130:     my @ids=();
                   2131:     my %typep=();
                   2132:     my %keyp=();
                   2133:     my %allparms=();
                   2134:     my %allparts=();
                   2135:     my %allmaps=();
                   2136:     my %mapp=();
                   2137:     my %symbp=();
                   2138:     my %maptitles=();
                   2139:     my %uris=();
                   2140:     my %keyorder=&standardkeyorder();
                   2141:     my %defkeytype=();
                   2142: 
                   2143:     my %alllevs=();
                   2144:     $alllevs{'Resource Level'}='full';
                   2145:     $alllevs{'Map Level'}='map';
                   2146:     $alllevs{'Course Level'}='general';
                   2147: 
                   2148:     my $csec=$env{'form.csec'};
                   2149: 
                   2150:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   2151:     my $pschp=$env{'form.pschp'};
                   2152:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   2153:     if (!@psprt) { $psprt[0]='0'; }
                   2154: 
                   2155:     my @selected_sections = 
                   2156: 	&Apache::loncommon::get_env_multiple('form.Section');
                   2157:     @selected_sections = ('all') if (! @selected_sections);
                   2158:     foreach (@selected_sections) {
                   2159:         if ($_ eq 'all') {
                   2160:             @selected_sections = ('all');
                   2161:         }
                   2162:     }
                   2163: 
                   2164:     my $pssymb='';
                   2165:     my $parmlev='';
                   2166:  
                   2167:     unless ($env{'form.parmlev'}) {
                   2168:         $parmlev = 'map';
                   2169:     } else {
                   2170:         $parmlev = $env{'form.parmlev'};
                   2171:     }
                   2172: 
                   2173:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   2174: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   2175: 				\%keyorder,\%defkeytype);
                   2176: 
                   2177: # Menu to select levels, etc
                   2178: 
                   2179:     $r->print('<table border="1"><tr><td>');
                   2180:     &levelmenu($r,\%alllevs,$parmlev);
                   2181:     if ($parmlev ne 'general') {
                   2182: 	$r->print('<td>');
                   2183: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   2184: 	$r->print('</td>');
                   2185:     }
                   2186:     $r->print('</td></tr></table>');
                   2187: 
                   2188:     $r->print('<table border="1"><tr><td>');  
                   2189:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
                   2190:     $r->print('</td><td>');
                   2191:     &partmenu($r,\%allparts,\@psprt);
                   2192:     $r->print('</td><td>');
                   2193:     &sectionmenu($r,\@selected_sections);
1.212   ! www      2194:     $r->print('</td></tr></table>'.
        !          2195: 	      '<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      2196: 
                   2197: # Build the list data hash from the specified parms
                   2198: 
                   2199:     my $listdata;
                   2200:     %{$listdata}=();
                   2201: 
                   2202:     foreach my $cat (@pscat) {
                   2203: 	foreach my $section (@selected_sections) {
                   2204: 	    foreach my $part (@psprt) {
1.212   ! www      2205:                 my $rootparmkey=$env{'request.course.id'};
1.211     www      2206:                 if (($section ne 'all') && ($section ne 'none') && ($section)) {
1.212   ! www      2207: 		    $rootparmkey.='.['.$section.']';
1.211     www      2208: 		}
                   2209: 		if ($parmlev eq 'general') {
                   2210: # course-level parameter
1.212   ! www      2211: 		    my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
        !          2212: 		    $$listdata{$newparmkey}=1;
        !          2213: 		    $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
1.211     www      2214: 		} elsif ($parmlev eq 'map') {
1.212   ! www      2215: # map-level parameter
        !          2216: 		    foreach my $mapid (keys %allmaps) {
        !          2217: 			if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
        !          2218: 			my $newparmkey=$rootparmkey.'.'.$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
1.211     www      2219:                         $$listdata{$newparmkey}=1;
                   2220:                         $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
                   2221: 		    }
                   2222: 		} else {
                   2223: # resource-level parameter
1.212   ! www      2224: 		    foreach my $rid (@ids) {
        !          2225: 			my ($map,$resid,$url)=&Apache::lonnet::decode_symb($symbp{$rid});
        !          2226: 			if (($pschp ne 'all') && ($allmaps{$pschp} ne $map)) { next; }
        !          2227: 			my $newparmkey=$rootparmkey.'.'.$symbp{$rid}.'.'.$part.'.'.$cat;
        !          2228:                         $$listdata{$newparmkey}=1;
        !          2229:                         $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
        !          2230: 		    }
1.211     www      2231: 		}
                   2232: 	    }
                   2233: 	}
                   2234:     }
                   2235: 
1.212   ! www      2236:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      2237: 
1.212   ! www      2238: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      2239: 
                   2240: # Read modified data
                   2241: 
                   2242: 	my $resourcedata=&readdata($crs,$dom);
                   2243: 
                   2244: # List data
                   2245: 
                   2246: 	&listdata($r,$resourcedata,$listdata);
                   2247:     }
                   2248:     $r->print(&tableend().
1.212   ! www      2249: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
        !          2250: 	      '</form></body></html>');
1.208     www      2251: }
                   2252: 
                   2253: sub overview {
                   2254:     my $r=shift;
                   2255:     my $bodytag=&Apache::loncommon::bodytag(
                   2256:                              'Modify Course Assessment Parameters');
                   2257:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2258:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2259:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
                   2260:     my $html=&Apache::lonxml::xmlbegin();
                   2261:     $r->print(<<ENDOVER);
                   2262: $html
                   2263: <head>
                   2264: <title>LON-CAPA Parameters</title>
                   2265: </head>
                   2266: $bodytag
                   2267: $breadcrumbs
                   2268: <form method="post" action="/adm/parmset?action=setoverview" name="overviewform">
                   2269: ENDOVER
                   2270: # Store modified
                   2271: 
                   2272:     &storedata($r,$crs,$dom);
                   2273: 
                   2274: # Read modified data
                   2275: 
                   2276:     my $resourcedata=&readdata($crs,$dom);
                   2277: 
                   2278: # List data
                   2279: 
                   2280:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata);
                   2281: 
1.145     www      2282:     $r->print(&tableend().'<p>'.
1.208     www      2283: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form></body></html>');
1.120     www      2284: }
1.121     www      2285: 
1.59      matthew  2286: ##################################################
                   2287: ##################################################
1.178     raeburn  2288:                                                                                             
                   2289: =pod
                   2290:                                                                                             
                   2291: =item change clone
                   2292:                                                                                             
                   2293: Modifies the list of courses a user can clone (stored
                   2294: in the user's environemnt.db file), called when a
                   2295: change is made to the list of users allowed to clone
                   2296: a course.
                   2297:                                                                                             
                   2298: Inputs: $action,$cloner
                   2299: where $action is add or drop, and $cloner is identity of 
                   2300: user for whom cloning ability is to be changed in course. 
                   2301:                                                                                             
                   2302: Returns: 
                   2303: 
                   2304: =cut
                   2305:                                                                                             
                   2306: ##################################################
                   2307: ##################################################
                   2308: 
                   2309: 
                   2310: sub change_clone {
                   2311:     my ($clonelist,$oldcloner) = @_;
                   2312:     my ($uname,$udom);
1.190     albertel 2313:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2314:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  2315:     my $clone_crs = $cnum.':'.$cdom;
                   2316:     
                   2317:     if ($cnum && $cdom) {
                   2318:         my @allowclone = ();
                   2319:         if ($clonelist =~ /,/) {
                   2320:             @allowclone = split/,/,$clonelist;
                   2321:         } else {
                   2322:             $allowclone[0] = $clonelist;
                   2323:         }
                   2324:         foreach my $currclone (@allowclone) {
                   2325:             if (!grep/^$currclone$/,@$oldcloner) {
                   2326:                 ($uname,$udom) = split/:/,$currclone;
                   2327:                 if ($uname && $udom) {
                   2328:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2329:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2330:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2331:                             if ($currclonecrs{'cloneable'} eq '') {
                   2332:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2333:                             } else {
                   2334:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2335:                             }
                   2336:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2337:                         }
                   2338:                     }
                   2339:                 }
                   2340:             }
                   2341:         }
                   2342:         foreach my $oldclone (@$oldcloner) {
                   2343:             if (!grep/^$oldclone$/,@allowclone) {
                   2344:                 ($uname,$udom) = split/:/,$oldclone;
                   2345:                 if ($uname && $udom) {
                   2346:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2347:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2348:                         my %newclonecrs = ();
                   2349:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2350:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2351:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2352:                                 foreach (@currclonecrs) {
                   2353:                                     unless ($_ eq $clone_crs) {
                   2354:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2355:                                     }
                   2356:                                 }
                   2357:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2358:                             } else {
                   2359:                                 $newclonecrs{'cloneable'} = '';
                   2360:                             }
                   2361:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2362:                         }
                   2363:                     }
                   2364:                 }
                   2365:             }
                   2366:         }
                   2367:     }
                   2368: }
                   2369: 
1.193     albertel 2370: 
                   2371: ##################################################
                   2372: ##################################################
                   2373: 
                   2374: =pod
                   2375: 
                   2376: =item * header
                   2377: 
                   2378: Output html header for page
                   2379: 
                   2380: =cut
                   2381: 
                   2382: ##################################################
                   2383: ##################################################
                   2384: sub header {
                   2385:     my $html=&Apache::lonxml::xmlbegin();
                   2386:     my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');
                   2387:     my $title = &mt('LON-CAPA Parameter Manager');
                   2388:     return(<<ENDHEAD);
                   2389: $html
                   2390: <head>
                   2391: <title>$title</title>
                   2392: </head>
                   2393: $bodytag
                   2394: ENDHEAD
                   2395: }
                   2396: ##################################################
                   2397: ##################################################
                   2398: sub print_main_menu {
                   2399:     my ($r,$parm_permission)=@_;
                   2400:     #
                   2401:     $r->print(<<ENDMAINFORMHEAD);
                   2402: <form method="post" enctype="multipart/form-data"
                   2403:       action="/adm/parmset" name="studentform">
                   2404: ENDMAINFORMHEAD
                   2405: #
1.195     albertel 2406:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2407:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.193     albertel 2408:     my @menu =
                   2409:         (
                   2410:           { text => 'Set Course Environment Parameters',
1.204     www      2411: 	    action => 'crsenv',
1.193     albertel 2412:             permission => $parm_permission,
                   2413:             },
                   2414:           { text => 'Set/Modify Course Assessment Parameters - Helper Mode',
                   2415:             url => '/adm/helper/parameter.helper',
                   2416:             permission => $parm_permission,
                   2417:             },
                   2418:           { text => 'Modify Course Assessment Parameters - Overview Mode',
                   2419:             action => 'setoverview',
                   2420:             permission => $parm_permission,
1.208     www      2421:             },          
                   2422: 	  { text => 'Set Course Assessment Parameters - Overview Mode',
                   2423:             action => 'newoverview',
                   2424:             permission => $parm_permission,
1.193     albertel 2425:             },
                   2426:           { text => 'Set/Modify Course Assessment Parameters - Table Mode',
                   2427:             action => 'settable',
                   2428:             permission => $parm_permission,
1.204     www      2429:             help => 'Cascading_Parameters',
1.193     albertel 2430:             },
                   2431: #          { text => 'Set Parameter Default Preferences',
                   2432: #            help => 'Course_View_Class_List',
                   2433: #            action => 'setdefaults',
                   2434: #            permission => $parm_permission,
                   2435: #            },
                   2436:           );
                   2437:     my $menu_html = '';
                   2438:     foreach my $menu_item (@menu) {
                   2439:         next if (! $menu_item->{'permission'});
                   2440:         $menu_html.='<p>';
                   2441:         $menu_html.='<font size="+1">';
                   2442:         if (exists($menu_item->{'url'})) {
                   2443:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   2444:         } else {
                   2445:             $menu_html.=
                   2446:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   2447:         }
                   2448:         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
                   2449:         if (exists($menu_item->{'help'})) {
                   2450:             $menu_html.=
                   2451:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   2452:         }
                   2453:         $menu_html.='</p>'.$/;
                   2454:     }
                   2455:     $r->print($menu_html);
                   2456:     return;
                   2457: }
                   2458: 
                   2459: 
                   2460: 
                   2461: 
1.178     raeburn  2462: ##################################################
                   2463: ##################################################
1.30      www      2464: 
1.59      matthew  2465: =pod
                   2466: 
1.83      bowersj2 2467: =item * handler
1.59      matthew  2468: 
                   2469: Main handler.  Calls &assessparms and &crsenv subroutines.
                   2470: 
                   2471: =cut
                   2472: ##################################################
                   2473: ##################################################
1.85      bowersj2 2474:     use Data::Dumper;
1.30      www      2475: sub handler {
1.43      albertel 2476:     my $r=shift;
1.30      www      2477: 
1.43      albertel 2478:     if ($r->header_only) {
1.126     www      2479: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 2480: 	$r->send_http_header;
                   2481: 	return OK;
                   2482:     }
1.193     albertel 2483:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      2484: 					    ['action','state',
                   2485:                                              'pres_marker',
                   2486:                                              'pres_value',
1.206     www      2487:                                              'pres_type',
                   2488:                                              'udom','uname']);
1.131     www      2489: 
1.83      bowersj2 2490: 
1.193     albertel 2491:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 2492:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   2493: 					    text=>"Parameter Manager",
1.204     www      2494: 					    faq=>10,
1.194     albertel 2495: 					    bug=>'Instructor Interface'});
1.203     www      2496: 
1.30      www      2497: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 2498:     my $parm_permission =
                   2499: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 2500: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 2501: 				  $env{'request.course.sec'}));
1.194     albertel 2502:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 2503: 
                   2504:         # Start Page
1.126     www      2505:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      2506:         $r->send_http_header;
1.30      www      2507: 
1.203     www      2508: 
                   2509:         # id numbers can change on re-ordering of folders
                   2510: 
                   2511:         &resetsymbcache();
                   2512: 
1.193     albertel 2513:         #
                   2514:         # Main switch on form.action and form.state, as appropriate
                   2515:         #
                   2516:         # Check first if coming from someone else headed directly for
                   2517:         #  the table mode
                   2518:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   2519: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   2520: 	    &assessparms($r);
                   2521: 
                   2522:         } elsif (! exists($env{'form.action'})) {
                   2523:             $r->print(&header());
1.194     albertel 2524:             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
                   2525: 							 'Parameter Manager'));
1.193     albertel 2526:             &print_main_menu($r,$parm_permission);
                   2527:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 2528:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   2529: 						    text=>"Course Environment"});
                   2530:             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
                   2531: 						   'Edit Course Environment'));
1.193     albertel 2532:             &crsenv($r); 
                   2533:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 2534:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   2535: 						    text=>"Overview Mode"});
1.121     www      2536: 	    &overview($r);
1.208     www      2537:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   2538:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   2539: 						    text=>"Overview Mode"});
                   2540: 	    &newoverview($r);
1.193     albertel 2541:         } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 2542:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      2543: 						    text=>"Table Mode",
                   2544: 						    help => 'Course_Setting_Parameters'});
1.121     www      2545: 	    &assessparms($r);
1.193     albertel 2546:         }
                   2547:         
1.43      albertel 2548:     } else {
1.1       www      2549: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 2550: 	$env{'user.error.msg'}=
1.43      albertel 2551: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   2552: 	return HTTP_NOT_ACCEPTABLE;
                   2553:     }
                   2554:     return OK;
1.1       www      2555: }
                   2556: 
                   2557: 1;
                   2558: __END__
                   2559: 
1.59      matthew  2560: =pod
1.38      harris41 2561: 
                   2562: =back
                   2563: 
                   2564: =cut
1.1       www      2565: 
                   2566: 
                   2567: 

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