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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.213   ! www         4: # $Id: lonparmset.pm,v 1.212 2005/06/06 15:13:46 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+$//;
1.213   ! www       406:         } elsif (&isdateparm($type)) {
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) {
1.213   ! www       437: 	if (&isdateparm($type)) {
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: 
1.213   ! www       745: sub isdateparm {
        !           746:     my $type=shift;
        !           747:     return (($type=~/^date/) && (!($type eq 'date_interval')));
        !           748: }
        !           749: 
1.208     www       750: sub parmmenu {
1.211     www       751:     my ($r,$allparms,$pscat,$keyorder)=@_;
1.208     www       752:     my $tempkey;
                    753:     $r->print(<<ENDSCRIPT);
                    754: <script type="text/javascript">
                    755:     function checkall(value, checkName) {
                    756: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                    757:             ele = document.forms.parmform.elements[i];
                    758:             if (ele.name == checkName) {
                    759:                 document.forms.parmform.elements[i].checked=value;
                    760:             }
                    761:         }
                    762:     }
1.210     www       763: 
                    764:     function checkthis(thisvalue, checkName) {
                    765: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                    766:             ele = document.forms.parmform.elements[i];
                    767:             if (ele.name == checkName) {
                    768: 		if (ele.value == thisvalue) {
                    769: 		    document.forms.parmform.elements[i].checked=true;
                    770: 		}
                    771:             }
                    772:         }
                    773:     }
                    774: 
                    775:     function checkdates() {
                    776: 	checkthis('duedate','pscat');
                    777:  	checkthis('opendate','pscat');
                    778: 	checkthis('answerdate','pscat');
                    779: 	checkthis('interval','pscat');
                    780:    }
                    781: 
                    782:     function checkvisi() {
                    783: 	checkthis('hiddenresource','pscat');
                    784:  	checkthis('encrypturl','pscat');
                    785: 	checkthis('problemstatus','pscat');
                    786: 	checkthis('contentopen','pscat');
                    787: 	checkthis('opendate','pscat');
                    788:     }
                    789: 
                    790:     function checkparts() {
                    791: 	checkthis('hiddenparts','pscat');
                    792: 	checkthis('display','pscat');
                    793: 	checkthis('ordered','pscat');
                    794:     }
                    795: 
                    796:     function checkstandard() {
                    797:         checkall(false,'pscat');
                    798: 	checkdates();
                    799: 	checkthis('weight','pscat');
                    800: 	checkthis('maxtries','pscat');
                    801:     }
                    802: 
1.208     www       803: </script>
                    804: ENDSCRIPT
1.209     www       805:     $r->print();
1.208     www       806:     $r->print("\n<table><tr>");
                    807:     my $cnt=0;
1.211     www       808:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.209     www       809: 	$r->print("\n<td><font size='-1'><input type='checkbox' name='pscat' ");
1.208     www       810: 	$r->print('value="'.$tempkey.'"');
                    811: 	if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                    812: 	    $r->print(' checked');
                    813: 	}
1.209     www       814: 	$r->print('>'.$$allparms{$tempkey}.'</font></td>');
                    815:  	$cnt++;
                    816:         if ($cnt==3) {
                    817: 	    $r->print("</tr>\n<tr>");
                    818: 	    $cnt=0;
                    819: 	}
1.208     www       820:     }
                    821:     $r->print('
                    822: </tr><tr><td>
1.210     www       823: <a href="javascript:checkall(true, \'pscat\')">Select All</a>
                    824: <a href="javascript:checkstandard()">Select Standard</a>
                    825: </td><td>
                    826: <a href="javascript:checkdates()">Select Dates</a>
                    827: <a href="javascript:checkvisi()">Select Visibilities</a>
                    828: <a href="javascript:checkparts()">Select Part Parameters</a>
                    829: </td><td>
                    830: <a href="javascript:checkall(false, \'pscat\')">Unselect All</a>
1.208     www       831: </td>
                    832: ');
                    833:     $r->print('</tr></table>');
                    834: }
                    835: 
1.209     www       836: sub partmenu {
                    837:     my ($r,$allparts,$psprt)=@_;
1.211     www       838:     $r->print('<select multiple name="psprt" size="8">');
1.208     www       839:     $r->print('<option value="all"');
                    840:     $r->print(' selected') unless (@{$psprt});
                    841:     $r->print('>'.&mt('All Parts').'</option>');
                    842:     my %temphash=();
                    843:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.209     www       844:     foreach my $tempkey (sort keys %{$allparts}) {
1.208     www       845: 	unless ($tempkey =~ /\./) {
                    846: 	    $r->print('<option value="'.$tempkey.'"');
                    847: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
                    848: 		$r->print(' selected');
                    849: 	    }
                    850: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                    851: 	}
                    852:     }
1.209     www       853:     $r->print('</select>');
                    854: }
                    855: 
                    856: sub usermenu {
                    857:     my ($r,$uname,$id,$udom,$csec)=@_;
                    858:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                    859:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                    860:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
                    861:     my %lt=&Apache::lonlocal::texthash(
                    862: 		    'sg'    => "Section/Group",
                    863: 		    'fu'    => "For User",
                    864: 		    'oi'    => "or ID",
                    865: 		    'ad'    => "at Domain"
                    866: 				       );
                    867:     my %sectionhash=();
                    868:     my $sections='';
                    869:     if (&Apache::loncommon::get_sections(
                    870:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
                    871:                  $env{'course.'.$env{'request.course.id'}.'.num'},
                    872: 					 \%sectionhash)) {
                    873:         $sections=$lt{'sg'}.': <select name="csec">';
                    874: 	foreach ('',sort keys %sectionhash) {
                    875: 	    $sections.='<option value="'.$_.'"'.
                    876: 		($_ eq $csec?'selected="selected"':'').'>'.$_.'</option>';
                    877:         }
                    878:         $sections.='</select>';
                    879:      }
                    880:      $r->print(<<ENDMENU);
                    881: <b>
                    882: $sections
                    883: <br />
                    884: $lt{'fu'} 
                    885: <input type="text" value="$uname" size="12" name="uname" />
                    886: $lt{'oi'}
                    887: <input type="text" value="$id" size="12" name="id" /> 
                    888: $lt{'ad'}
                    889: $chooseopt
                    890: </b>
                    891: ENDMENU
                    892: }
                    893: 
                    894: sub displaymenu {
1.211     www       895:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www       896:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                    897: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www       898:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.209     www       899:     $r->print('</td><td>');
                    900:     &partmenu($r,$allparts,$psprt);
                    901:     $r->print('</td></tr></table>');
                    902: }
                    903: 
                    904: sub mapmenu {
                    905:     my ($r,$allmaps,$pschp,$maptitles)=@_;
                    906:     $r->print(&mt('Select Enclosing Map or Folder').' ');
                    907:     $r->print('<select name="pschp">');
                    908:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                    909:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www       910: 	$r->print('<option value="'.$_.'"');
1.209     www       911: 	if (($pschp eq $_)) { $r->print(' selected'); }
                    912: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                    913:     }
                    914:     $r->print("</select>");
                    915: }
                    916: 
                    917: sub levelmenu {
                    918:     my ($r,$alllevs,$parmlev)=@_;
                    919:     $r->print(&mt('Select Parameter Level').
                    920: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
                    921:     $r->print('<select name="parmlev">');
                    922:     foreach (reverse sort keys %{$alllevs}) {
                    923: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                    924: 	if ($parmlev eq $$alllevs{$_}) {
                    925: 	    $r->print(' selected'); 
                    926: 	}
                    927: 	$r->print('>'.$_.'</option>');
1.208     www       928:     }
1.209     www       929:     $r->print("</select>");
1.208     www       930: }
                    931: 
1.211     www       932: 
                    933: sub sectionmenu {
                    934:     my ($r,$selectedsections)=@_;
1.212     www       935:     my %sectionhash=();
1.211     www       936: 
1.212     www       937:     if (&Apache::loncommon::get_sections(
                    938:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
                    939:                  $env{'course.'.$env{'request.course.id'}.'.num'},
                    940: 					 \%sectionhash)) {
                    941: 	$r->print('<select name="Section" multiple="true" size="8" >');
                    942: 	foreach my $s ('all',sort keys %sectionhash) {
                    943: 	    $r->print('    <option value="'.$s.'"');
                    944: 	    foreach (@{$selectedsections}) {
                    945: 		if ($s eq $_) {
                    946: 		    $r->print(' selected');
                    947: 		    last;
                    948: 		}
                    949: 	    }
                    950: 	    $r->print('>'.$s."</option>\n");
                    951: 	}
                    952: 	$r->print("</select>\n");
1.211     www       953:     }
                    954: }
                    955: 
1.210     www       956: sub keysplit {
                    957:     my $keyp=shift;
                    958:     return (split(/\,/,$keyp));
                    959: }
                    960: 
                    961: sub keysinorder {
                    962:     my ($name,$keyorder)=@_;
                    963:     return sort {
                    964: 	$$keyorder{$a} <=> $$keyorder{$b};
                    965:     } (keys %{$name});
                    966: }
                    967: 
1.211     www       968: sub keysindisplayorder {
                    969:     my ($name,$keyorder)=@_;
                    970:     return sort {
                    971: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                    972:     } (keys %{$name});
                    973: }
                    974: 
                    975: sub standardkeyorder {
                    976:     return ('parameter_0_opendate' => 1,
                    977: 	    'parameter_0_duedate' => 2,
                    978: 	    'parameter_0_answerdate' => 3,
                    979: 	    'parameter_0_interval' => 4,
                    980: 	    'parameter_0_weight' => 5,
                    981: 	    'parameter_0_maxtries' => 6,
                    982: 	    'parameter_0_hinttries' => 7,
                    983: 	    'parameter_0_contentopen' => 8,
                    984: 	    'parameter_0_contentclose' => 9,
                    985: 	    'parameter_0_type' => 10,
                    986: 	    'parameter_0_problemstatus' => 11,
                    987: 	    'parameter_0_hiddenresource' => 12,
                    988: 	    'parameter_0_hiddenparts' => 13,
                    989: 	    'parameter_0_display' => 14,
                    990: 	    'parameter_0_ordered' => 15,
                    991: 	    'parameter_0_tol' => 16,
                    992: 	    'parameter_0_sig' => 17,
                    993: 	    'parameter_0_turnoffunit' => 18);
                    994: }
                    995: 
1.59      matthew   996: ##################################################
                    997: ##################################################
                    998: 
                    999: =pod
                   1000: 
                   1001: =item assessparms
                   1002: 
                   1003: Show assessment data and parameters.  This is a large routine that should
                   1004: be simplified and shortened... someday.
                   1005: 
                   1006: Inputs: $r
                   1007: 
                   1008: Returns: nothing
                   1009: 
1.63      bowersj2 1010: Variables used (guessed by Jeremy):
                   1011: 
                   1012: =over 4
                   1013: 
                   1014: =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.
                   1015: 
                   1016: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1017: 
                   1018: =item B<allmaps>:
                   1019: 
                   1020: =back
                   1021: 
1.59      matthew  1022: =cut
                   1023: 
                   1024: ##################################################
                   1025: ##################################################
1.30      www      1026: sub assessparms {
1.1       www      1027: 
1.43      albertel 1028:     my $r=shift;
1.201     www      1029: 
                   1030:     my @ids=();
                   1031:     my %symbp=();
                   1032:     my %mapp=();
                   1033:     my %typep=();
                   1034:     my %keyp=();
                   1035:     my %uris=();
                   1036:     my %maptitles=();
                   1037: 
1.2       www      1038: # -------------------------------------------------------- Variable declaration
1.209     www      1039: 
1.129     www      1040:     my %allmaps=();
                   1041:     my %alllevs=();
1.57      albertel 1042: 
1.187     www      1043:     my $uname;
                   1044:     my $udom;
                   1045:     my $uhome;
                   1046:     my $csec;
                   1047:  
1.190     albertel 1048:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1049: 
1.57      albertel 1050:     $alllevs{'Resource Level'}='full';
                   1051:     $alllevs{'Map Level'}='map';
                   1052:     $alllevs{'Course Level'}='general';
                   1053: 
                   1054:     my %allparms;
                   1055:     my %allparts;
1.210     www      1056: #
                   1057: # Order in which these parameters will be displayed
                   1058: #
1.211     www      1059:     my %keyorder=&standardkeyorder();
                   1060: 
1.43      albertel 1061:     @ids=();
                   1062:     %symbp=();
                   1063:     %typep=();
                   1064: 
                   1065:     my $message='';
                   1066: 
1.190     albertel 1067:     $csec=$env{'form.csec'};
1.188     www      1068: 
1.190     albertel 1069:     if      ($udom=$env{'form.udom'}) {
                   1070:     } elsif ($udom=$env{'request.role.domain'}) {
                   1071:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1072:     } else {
                   1073: 	$udom=$r->dir_config('lonDefDomain');
                   1074:     }
1.43      albertel 1075: 
1.134     albertel 1076:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1077:     my $pschp=$env{'form.pschp'};
1.134     albertel 1078:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1079:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1080: 
1.43      albertel 1081:     my $pssymb='';
1.57      albertel 1082:     my $parmlev='';
                   1083:  
1.190     albertel 1084:     unless ($env{'form.parmlev'}) {
1.57      albertel 1085:         $parmlev = 'map';
                   1086:     } else {
1.190     albertel 1087:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1088:     }
1.26      www      1089: 
1.29      www      1090: # ----------------------------------------------- Was this started from grades?
                   1091: 
1.190     albertel 1092:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1093: 	&& (!$env{'form.dis'})) {
                   1094: 	my $url=$env{'form.url'};
1.194     albertel 1095: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1096: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1097: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1098: 	$pschp='';
1.57      albertel 1099:         $parmlev = 'full';
1.190     albertel 1100:     } elsif ($env{'form.symb'}) {
                   1101: 	$pssymb=$env{'form.symb'};
1.92      albertel 1102: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1103: 	$pschp='';
1.57      albertel 1104:         $parmlev = 'full';
1.43      albertel 1105:     } else {
1.190     albertel 1106: 	$env{'form.url'}='';
1.43      albertel 1107:     }
                   1108: 
1.190     albertel 1109:     my $id=$env{'form.id'};
1.43      albertel 1110:     if (($id) && ($udom)) {
                   1111: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1112: 	if ($uname) {
                   1113: 	    $id='';
                   1114: 	} else {
                   1115: 	    $message=
1.133     www      1116: 		"<font color=red>".&mt("Unknown ID")." '$id' ".
                   1117: 		&mt('at domain')." '$udom'</font>";
1.43      albertel 1118: 	}
                   1119:     } else {
1.190     albertel 1120: 	$uname=$env{'form.uname'};
1.43      albertel 1121:     }
                   1122:     unless ($udom) { $uname=''; }
                   1123:     $uhome='';
                   1124:     if ($uname) {
                   1125: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1126:         if ($uhome eq 'no_host') {
                   1127: 	    $message=
1.133     www      1128: 		"<font color=red>".&mt("Unknown user")." '$uname' ".
                   1129: 		&mt("at domain")." '$udom'</font>";
1.43      albertel 1130: 	    $uname='';
1.12      www      1131:         } else {
1.103     albertel 1132: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1133: 					      $env{'request.course.id'});
1.43      albertel 1134: 	    if ($csec eq '-1') {
                   1135: 		$message="<font color=red>".
1.133     www      1136: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
                   1137: 		    &mt("not in this course")."</font>";
1.43      albertel 1138: 		$uname='';
1.190     albertel 1139: 		$csec=$env{'form.csec'};
1.43      albertel 1140: 	    } else {
                   1141: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1142: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1143: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1144: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1145: 			.$name{'lastname'}.' '.$name{'generation'}.
1.133     www      1146: 			    "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1147: 	    }
1.12      www      1148:         }
1.43      albertel 1149:     }
1.2       www      1150: 
1.43      albertel 1151:     unless ($csec) { $csec=''; }
1.12      www      1152: 
1.14      www      1153: # --------------------------------------------------------- Get all assessments
1.210     www      1154:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1155: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1156: 				\%keyorder);
1.63      bowersj2 1157: 
1.57      albertel 1158:     $mapp{'0.0'} = '';
                   1159:     $symbp{'0.0'} = '';
1.99      albertel 1160: 
1.14      www      1161: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1162:     if ($env{'form.pres_marker'}) {
1.205     www      1163:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1164:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1165:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1166: 	for (my $i=0;$i<=$#markers;$i++) {
                   1167: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1168: 				 $values[$i],
                   1169: 				 $types[$i],
                   1170: 				 $uname,$udom,$csec);
                   1171: 	}
1.68      www      1172: # ---------------------------------------------------------------- Done storing
1.130     www      1173: 	$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      1174:     }
1.57      albertel 1175: #----------------------------------------------- if all selected, fill in array
1.209     www      1176:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1177:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1178:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1179: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1180: 
1.209     www      1181:     &startpage($r);
1.57      albertel 1182: 
1.44      albertel 1183:     foreach ('tolerance','date_default','date_start','date_end',
                   1184: 	     'date_interval','int','float','string') {
                   1185: 	$r->print('<input type="hidden" value="'.
1.190     albertel 1186: 		  $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44      albertel 1187:     }
1.57      albertel 1188:                         
1.44      albertel 1189:     if (!$pssymb) {
1.209     www      1190:         $r->print('<table border="1"><tr><td>');
                   1191:         &levelmenu($r,\%alllevs,$parmlev);
1.128     albertel 1192: 	if ($parmlev ne 'general') {
1.209     www      1193:             $r->print('<td>');
                   1194: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1195: 	    $r->print('</td>');
1.128     albertel 1196: 	}
1.209     www      1197:         $r->print('</td></tr></table>');
1.211     www      1198: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1199:     } else {
1.125     www      1200:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.209     www      1201:         $r->print(&mt('Specific Resource').": ".$resource.
1.212     www      1202:                   '<input type="hidden" value="'.$pssymb.'" name="symb"><br />');
1.57      albertel 1203:     }
1.209     www      1204:     &usermenu($r,$uname,$id,$udom,$csec);    
1.57      albertel 1205: 
1.210     www      1206:     $r->print('<p>'.$message.'</p>');
                   1207: 
1.209     www      1208:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1209: 
                   1210:     my @temp_pscat;
                   1211:     map {
                   1212:         my $cat = $_;
                   1213:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1214:     } @pscat;
                   1215: 
                   1216:     @pscat = @temp_pscat;
                   1217: 
1.209     www      1218:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1219: # ----------------------------------------------------------------- Start Table
1.57      albertel 1220:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1221:         my $csuname=$env{'user.name'};
                   1222:         my $csudom=$env{'user.domain'};
1.57      albertel 1223: 
1.203     www      1224:         if ($parmlev eq 'full') {
1.57      albertel 1225:            my $coursespan=$csec?8:5;
                   1226:            $r->print('<p><table border=2>');
                   1227:            $r->print('<tr><td colspan=5></td>');
1.130     www      1228:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1229:            if ($uname) {
                   1230:                $r->print("<th colspan=3 rowspan=2>");
1.130     www      1231:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1232:            }
1.133     www      1233: 	   my %lt=&Apache::lonlocal::texthash(
                   1234: 				  'pie'    => "Parameter in Effect",
                   1235: 				  'csv'    => "Current Session Value",
                   1236:                                   'at'     => 'at',
                   1237:                                   'rl'     => "Resource Level",
                   1238: 				  'ic'     => 'in Course',
                   1239: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1240: 				  'type'   => 'Type',
1.133     www      1241: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1242: 				  'part'   => 'Part',
1.133     www      1243:                                   'pn'     => 'Parameter Name',
                   1244: 				  'def'    => 'default',
                   1245: 				  'femof'  => 'from Enclosing Map or Folder',
                   1246: 				  'gen'    => 'general',
                   1247: 				  'foremf' => 'for Enclosing Map or Folder',
                   1248: 				  'fr'     => 'for Resource'
                   1249: 					      );
1.57      albertel 1250:            $r->print(<<ENDTABLETWO);
1.133     www      1251: <th rowspan=3>$lt{'pie'}</th>
                   1252: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1253: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1254: <th colspan=1>$lt{'ic'}</th>
                   1255: 
1.10      www      1256: ENDTABLETWO
1.57      albertel 1257:            if ($csec) {
1.133     www      1258:                 $r->print("<th colspan=3>".
                   1259: 			  &mt("in Section/Group")." $csec</th>");
1.57      albertel 1260:            }
                   1261:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1262: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1263: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1264: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1265: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1266: ENDTABLEHEADFOUR
1.57      albertel 1267: 
                   1268:            if ($csec) {
1.130     www      1269:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1270:            }
                   1271: 
                   1272:            if ($uname) {
1.130     www      1273:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1274:            }
                   1275: 
                   1276:            $r->print('</tr>');
                   1277: 
                   1278:            my $defbgone='';
                   1279:            my $defbgtwo='';
                   1280: 
                   1281:            foreach (@ids) {
                   1282: 
                   1283:                 my $rid=$_;
                   1284:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1285: 
1.152     albertel 1286:                 if ((!$pssymb && 
                   1287: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1288: 		    ||
                   1289: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1290: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1291:                     if ($defbgone eq '"#E0E099"') {
                   1292:                         $defbgone='"#E0E0DD"';
1.57      albertel 1293:                     } else {
1.184     albertel 1294:                         $defbgone='"#E0E099"';
1.57      albertel 1295:                     }
1.184     albertel 1296:                     if ($defbgtwo eq '"#FFFF99"') {
                   1297:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1298:                     } else {
1.184     albertel 1299:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1300:                     }
                   1301:                     my $thistitle='';
                   1302:                     my %name=   ();
                   1303:                     undef %name;
                   1304:                     my %part=   ();
                   1305:                     my %display=();
                   1306:                     my %type=   ();
                   1307:                     my %default=();
1.196     www      1308:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1309: 
1.210     www      1310:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1311:                         my $tempkeyp = $_;
                   1312:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1313:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1314:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1315:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1316:                           unless ($display{$_}) { $display{$_}=''; }
                   1317:                           $display{$_}.=' ('.$name{$_}.')';
                   1318:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1319:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1320:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1321:                         }
                   1322:                     }
                   1323:                     my $totalparms=scalar keys %name;
                   1324:                     if ($totalparms>0) {
                   1325:                         my $firstrow=1;
1.180     albertel 1326: 			my $title=&Apache::lonnet::gettitle($uri);
1.57      albertel 1327:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1328:                              ' rowspan='.$totalparms.
                   1329:                              '><tt><font size=-1>'.
                   1330:                              join(' / ',split(/\//,$uri)).
                   1331:                              '</font></tt><p><b>'.
1.154     albertel 1332:                              "<a href=\"javascript:openWindow('".
                   1333: 				  &Apache::lonnet::clutter($uri).
1.57      albertel 1334:                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127     albertel 1335:                              " TARGET=_self>$title");
1.57      albertel 1336: 
                   1337:                         if ($thistitle) {
                   1338:                             $r->print(' ('.$thistitle.')');
                   1339:                         }
                   1340:                         $r->print('</a></b></td>');
                   1341:                         $r->print('<td bgcolor='.$defbgtwo.
                   1342:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1343:                                       '</td>');
                   1344: 
                   1345:                         $r->print('<td bgcolor='.$defbgone.
                   1346:                                       ' rowspan='.$totalparms.
                   1347:                                       '><tt><font size=-1>');
                   1348: 
                   1349:                         $r->print(' / res / ');
                   1350:                         $r->print(join(' / ', split(/\//,$mapp{$rid})));
                   1351: 
                   1352:                         $r->print('</font></tt></td>');
                   1353: 
1.210     www      1354:                         foreach (&keysinorder(\%name,\%keyorder)) {
1.57      albertel 1355:                             unless ($firstrow) {
                   1356:                                 $r->print('<tr>');
                   1357:                             } else {
                   1358:                                 undef $firstrow;
                   1359:                             }
                   1360: 
1.201     www      1361:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1362:                                        \%type,\%display,$defbgone,$defbgtwo,
1.187     www      1363:                                        $parmlev,$uname,$udom,$csec);
1.57      albertel 1364:                         }
                   1365:                     }
                   1366:                 }
                   1367:             } # end foreach ids
1.43      albertel 1368: # -------------------------------------------------- End entry for one resource
1.57      albertel 1369:             $r->print('</table>');
1.203     www      1370:         } # end of  full
1.57      albertel 1371: #--------------------------------------------------- Entry for parm level map
                   1372:         if ($parmlev eq 'map') {
                   1373:             my $defbgone = '"E0E099"';
                   1374:             my $defbgtwo = '"FFFF99"';
                   1375: 
                   1376:             my %maplist;
                   1377: 
                   1378:             if ($pschp eq 'all') {
                   1379:                 %maplist = %allmaps; 
                   1380:             } else {
                   1381:                 %maplist = ($pschp => $mapp{$pschp});
                   1382:             }
                   1383: 
                   1384: #-------------------------------------------- for each map, gather information
                   1385:             my $mapid;
1.60      albertel 1386: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1387:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1388: 
                   1389: #-----------------------  loop through ids and get all parameter types for map
                   1390: #-----------------------------------------          and associated information
                   1391:                 my %name = ();
                   1392:                 my %part = ();
                   1393:                 my %display = ();
                   1394:                 my %type = ();
                   1395:                 my %default = ();
                   1396:                 my $map = 0;
                   1397: 
                   1398: #		$r->print("Catmarker: @catmarker<br />\n");
                   1399:                
                   1400:                 foreach (@ids) {
                   1401:                   ($map)=(/([\d]*?)\./);
                   1402:                   my $rid = $_;
                   1403:         
                   1404: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1405: 
                   1406:                   if ($map eq $mapid) {
1.196     www      1407:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1408: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1409: 
                   1410: #--------------------------------------------------------------------
                   1411: # @catmarker contains list of all possible parameters including part #s
                   1412: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1413: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1414: # When storing information, store as part 0
                   1415: # When requesting information, request from full part
                   1416: #-------------------------------------------------------------------
1.210     www      1417:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1418:                       my $tempkeyp = $_;
                   1419:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1420:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1421:                       
                   1422:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1423:                         $part{$tempkeyp}="0";
                   1424:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1425:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1426:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1427:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1428:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1429:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1430:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1431:                       }
                   1432:                     } # end loop through keys
                   1433:                   }
                   1434:                 } # end loop through ids
                   1435:                                  
                   1436: #---------------------------------------------------- print header information
1.133     www      1437:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1438:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57      albertel 1439:                 $r->print(<<ENDMAPONE);
                   1440: <center><h4>
1.135     albertel 1441: Set Defaults for All Resources in $foldermap<br />
                   1442: <font color="red"><i>$showtitle</i></font><br />
1.57      albertel 1443: Specifically for
                   1444: ENDMAPONE
                   1445:                 if ($uname) {
                   1446:                     my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1447:                       ('firstname','middlename','lastname','generation', 'id'));
                   1448:                     my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
                   1449:                            .$name{'lastname'}.' '.$name{'generation'};
1.135     albertel 1450:                     $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130     www      1451:                         &mt('in')." \n");
1.57      albertel 1452:                 } else {
1.135     albertel 1453:                     $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57      albertel 1454:                 }
                   1455:             
1.135     albertel 1456:                 if ($csec) {$r->print(&mt("Section")." <font color=\"red\"><i>$csec</i></font> ".
1.130     www      1457: 				      &mt('of')." \n")};
1.57      albertel 1458: 
1.135     albertel 1459:                 $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
                   1460:                 $r->print("</h4>\n");
1.57      albertel 1461: #---------------------------------------------------------------- print table
                   1462:                 $r->print('<p><table border="2">');
1.130     www      1463:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1464:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1465:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1466: 
1.210     www      1467: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1468:                     $r->print('<tr>');
1.201     www      1469:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.57      albertel 1470:                            \%type,\%display,$defbgone,$defbgtwo,
1.187     www      1471:                            $parmlev,$uname,$udom,$csec);
1.57      albertel 1472:                 }
                   1473:                 $r->print("</table></center>");
                   1474:             } # end each map
                   1475:         } # end of $parmlev eq map
                   1476: #--------------------------------- Entry for parm level general (Course level)
                   1477:         if ($parmlev eq 'general') {
                   1478:             my $defbgone = '"E0E099"';
                   1479:             my $defbgtwo = '"FFFF99"';
                   1480: 
                   1481: #-------------------------------------------- for each map, gather information
                   1482:             my $mapid="0.0";
                   1483: #-----------------------  loop through ids and get all parameter types for map
                   1484: #-----------------------------------------          and associated information
                   1485:             my %name = ();
                   1486:             my %part = ();
                   1487:             my %display = ();
                   1488:             my %type = ();
                   1489:             my %default = ();
                   1490:                
                   1491:             foreach (@ids) {
                   1492:                 my $rid = $_;
                   1493:         
1.196     www      1494:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1495: 
                   1496: #--------------------------------------------------------------------
                   1497: # @catmarker contains list of all possible parameters including part #s
                   1498: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1499: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1500: # When storing information, store as part 0
                   1501: # When requesting information, request from full part
                   1502: #-------------------------------------------------------------------
1.210     www      1503:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1504:                   my $tempkeyp = $_;
                   1505:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1506:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1507:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1508:                     $part{$tempkeyp}="0";
                   1509:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1510:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1511:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1512:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1513:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1514:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1515:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1516:                   }
                   1517:                 } # end loop through keys
                   1518:             } # end loop through ids
                   1519:                                  
                   1520: #---------------------------------------------------- print header information
1.133     www      1521: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1522:             $r->print(<<ENDMAPONE);
1.133     www      1523: <center><h4>$setdef
1.135     albertel 1524: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1525: ENDMAPONE
                   1526:             if ($uname) {
                   1527:                 my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1528:                   ('firstname','middlename','lastname','generation', 'id'));
                   1529:                 my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
                   1530:                        .$name{'lastname'}.' '.$name{'generation'};
1.135     albertel 1531:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 1532:             } else {
1.135     albertel 1533:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 1534:             }
                   1535:             
1.135     albertel 1536:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
                   1537:             $r->print("</h4>\n");
1.57      albertel 1538: #---------------------------------------------------------------- print table
                   1539:             $r->print('<p><table border="2">');
1.130     www      1540:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1541:             $r->print('<th>'.&mt('Default Value').'</th>');
                   1542:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1543: 
1.210     www      1544: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1545:                 $r->print('<tr>');
1.201     www      1546:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.187     www      1547:                        \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
1.57      albertel 1548:             }
                   1549:             $r->print("</table></center>");
                   1550:         } # end of $parmlev eq general
1.43      albertel 1551:     }
1.44      albertel 1552:     $r->print('</form></body></html>');
1.57      albertel 1553: } # end sub assessparms
1.30      www      1554: 
1.59      matthew  1555: 
                   1556: ##################################################
                   1557: ##################################################
                   1558: 
                   1559: =pod
                   1560: 
                   1561: =item crsenv
                   1562: 
1.105     matthew  1563: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  1564: be simplified and shortened... someday.
                   1565: 
                   1566: Inputs: $r
                   1567: 
                   1568: Returns: nothing
                   1569: 
                   1570: =cut
                   1571: 
                   1572: ##################################################
                   1573: ##################################################
1.30      www      1574: sub crsenv {
                   1575:     my $r=shift;
                   1576:     my $setoutput='';
1.64      www      1577:     my $bodytag=&Apache::loncommon::bodytag(
                   1578:                              'Set Course Environment Parameters');
1.194     albertel 1579:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,
                   1580: 						    'Edit Course Environment');
1.190     albertel 1581:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1582:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  1583: 
                   1584:     #
                   1585:     # Go through list of changes
1.190     albertel 1586:     foreach (keys %env) {
1.105     matthew  1587:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   1588:         my $name  = $1;
1.190     albertel 1589:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  1590:         if ($name eq 'newp') {
1.190     albertel 1591:             $name = $env{'form.newp_name'};
1.105     matthew  1592:         }
                   1593:         if ($name eq 'url') {
                   1594:             $value=~s/^\/res\///;
                   1595:             my $bkuptime=time;
                   1596:             my @tmp = &Apache::lonnet::get
                   1597:                 ('environment',['url'],$dom,$crs);
1.130     www      1598:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  1599:                 &Apache::lonnet::put
                   1600:                 ('environment',
                   1601:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   1602:                  $dom,$crs).
                   1603:                      '<br>';
                   1604:         }
                   1605:         #
                   1606:         # Deal with modified default spreadsheets
                   1607:         if ($name =~ /^spreadsheet_default_(classcalc|
                   1608:                                             studentcalc|
                   1609:                                             assesscalc)$/x) {
                   1610:             my $sheettype = $1; 
                   1611:             if ($sheettype eq 'classcalc') {
                   1612:                 # no need to do anything since viewing the sheet will
                   1613:                 # cause it to be updated. 
                   1614:             } elsif ($sheettype eq 'studentcalc') {
                   1615:                 # expire all the student spreadsheets
                   1616:                 &Apache::lonnet::expirespread('','','studentcalc');
                   1617:             } else {
                   1618:                 # expire all the assessment spreadsheets 
                   1619:                 #    this includes non-default spreadsheets, but better to
                   1620:                 #    be safe than sorry.
                   1621:                 &Apache::lonnet::expirespread('','','assesscalc');
                   1622:                 # expire all the student spreadsheets
                   1623:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      1624:             }
1.105     matthew  1625:         }
                   1626:         #
1.107     matthew  1627:         # Deal with the enrollment dates
                   1628:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   1629:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   1630:         }
1.178     raeburn  1631:         # Get existing cloners
                   1632:         my @oldcloner = ();
                   1633:         if ($name eq 'cloners') {
                   1634:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   1635:             if ($clonenames{'cloners'} =~ /,/) {
                   1636:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   1637:             } else {
                   1638:                 $oldcloner[0] = $clonenames{'cloners'};
                   1639:             }
                   1640:         }
1.107     matthew  1641:         #
1.105     matthew  1642:         # Let the user know we made the changes
1.153     albertel 1643:         if ($name && defined($value)) {
1.178     raeburn  1644:             if ($name eq 'cloners') {
                   1645:                 $value =~ s/^,//;
                   1646:                 $value =~ s/,$//;
                   1647:             }
1.105     matthew  1648:             my $put_result = &Apache::lonnet::put('environment',
                   1649:                                                   {$name=>$value},$dom,$crs);
                   1650:             if ($put_result eq 'ok') {
1.130     www      1651:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178     raeburn  1652:                 if ($name eq 'cloners') {
                   1653:                     &change_clone($value,\@oldcloner);
                   1654:                 }
1.179     raeburn  1655:                 # Flush the course logs so course description is immediately updated
                   1656:                 if ($name eq 'description' && defined($value)) {
                   1657:                     &Apache::lonnet::flushcourselogs();
                   1658:                 }
1.105     matthew  1659:             } else {
1.130     www      1660:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   1661: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      1662:             }
                   1663:         }
1.38      harris41 1664:     }
1.108     www      1665: # ------------------------- Re-init course environment entries for this session
                   1666: 
1.190     albertel 1667:     &Apache::lonnet::coursedescription($env{'request.course.id'});
1.105     matthew  1668: 
1.30      www      1669: # -------------------------------------------------------- Get parameters again
1.45      matthew  1670: 
                   1671:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 1672:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 1673:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      1674:     my $output='';
1.45      matthew  1675:     if (! exists($values{'con_lost'})) {
1.30      www      1676:         my %descriptions=
1.140     sakharuk 1677: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  1678:                                  '<a href="javascript:openbrowser'.
1.47      matthew  1679:                                  "('envform','url','sequence')\">".
1.140     sakharuk 1680:                                  &mt('Select Map').'</a><br /><font color=red> '.
                   1681:                                  &mt('Modification may make assessment data inaccessible').
                   1682:                                  '</font>',
                   1683:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 1684:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 1685:                                  '</b><br />'.
                   1686:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  1687:              '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      1688:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   1689:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 1690:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      1691:                     '<a href="javascript:openbrowser'.
                   1692:                     "('envform','default_xml_style'".
1.140     sakharuk 1693:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 1694:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   1695:                                  '</b><br />(<tt>user:domain,'.
1.74      www      1696:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1697:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      1698:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1699:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 1700:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1701:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 1702:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 1703:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 1704:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 1705:                                  &mt('changes will not show until next login').')',
1.169     matthew  1706:              '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  1707: 
1.141     sakharuk 1708:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   1709:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 1710:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  1711:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 1712:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  1713: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   1714:              'plc.users.denied' => 
1.141     sakharuk 1715:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  1716:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   1717: 
1.141     sakharuk 1718:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   1719:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 1720:                                   'student, "<tt>ta</tt>": '.
                   1721:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 1722:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 1723: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      1724:              'pch.users.denied' => 
1.141     sakharuk 1725:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      1726:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  1727:              'spreadsheet_default_classcalc' 
1.141     sakharuk 1728:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  1729:                     '<a href="javascript:openbrowser'.
                   1730:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 1731:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  1732:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 1733:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  1734:                     '<a href="javascript:openbrowser'.
                   1735:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 1736:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  1737:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 1738:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  1739:                     '<a href="javascript:openbrowser'.
                   1740:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 1741:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 1742: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 1743: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 1744: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  1745:              'allow_discussion_post_editing'
                   1746:                  => '<b>'.&mt('Allow users to edit/delete their own discussion posts').'</b><br />'.
                   1747:                     '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.89      albertel 1748: 	     'rndseed'
1.140     sakharuk 1749: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
                   1750:                     '<font color="red">'.&mt('Modifying this will make problems').' '.
                   1751:                     &mt('have different numbers and answers').'</font>',
1.151     albertel 1752: 	     'receiptalg'
                   1753: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   1754:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 1755:              'suppress_tries'
                   1756:                  => '<b>'.&mt('Suppress number of tries in printing').'</b>('.
                   1757:                     &mt('yes if supress').')',
1.113     sakharuk 1758:              'problem_stream_switch'
1.141     sakharuk 1759:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 1760:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 1761:              'default_paper_size' 
                   1762:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   1763:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   1764:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   1765:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 1766:              'anonymous_quiz'
1.150     www      1767:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 1768:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
                   1769:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date when enrolling students').'</b>',
                   1770:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date when enrolling students').'</b>',
1.150     www      1771:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   1772:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 1773:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      1774:              'disable_receipt_display'
1.141     sakharuk 1775:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 1776:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163     albertel 1777: 	     'disablesigfigs'
                   1778: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   1779:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.149     albertel 1780: 	     'tthoptions'
                   1781: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  1782:              ); 
1.177     raeburn  1783:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.107     matthew  1784:                              'default_xml_style','pageseparators',
                   1785:                              'question.email','comment.email','policy.email',
1.169     matthew  1786:                              'student_classlist_view',
1.118     matthew  1787:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  1788:                              'pch.roles.denied','pch.users.denied',
                   1789:                              'allow_limited_html_in_feedback',
1.170     raeburn  1790:                              'allow_discussion_post_editing',
1.108     www      1791:                              'languages',
1.150     www      1792: 			     'nothideprivileged',
1.107     matthew  1793:                              'rndseed',
1.151     albertel 1794:                              'receiptalg',
1.107     matthew  1795:                              'problem_stream_switch',
1.164     sakharuk 1796: 			     'suppress_tries',
1.161     sakharuk 1797:                              'default_paper_size',
1.115     www      1798:                              'disable_receipt_display',
1.107     matthew  1799:                              'spreadsheet_default_classcalc',
                   1800:                              'spreadsheet_default_studentcalc',
                   1801:                              'spreadsheet_default_assesscalc', 
                   1802:                              'hideemptyrows',
                   1803:                              'default_enrollment_start_date',
                   1804:                              'default_enrollment_end_date',
1.163     albertel 1805: 			     'tthoptions',
                   1806: 			     'disablesigfigs'
1.107     matthew  1807:                              );
                   1808: 	foreach my $parameter (sort(keys(%values))) {
1.142     raeburn  1809:             unless ($parameter =~ m/^internal\./) {
                   1810:                 if (! $descriptions{$parameter}) {
                   1811:                     $descriptions{$parameter}=$parameter;
                   1812:                     push(@Display_Order,$parameter);
                   1813:                 }
                   1814:             }
1.43      albertel 1815: 	}
1.107     matthew  1816:         foreach my $parameter (@Display_Order) {
                   1817:             my $description = $descriptions{$parameter};
1.51      matthew  1818:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      1819:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  1820:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  1821:                 '.checked=true;"';
1.107     matthew  1822:             $output .= '<tr><td>'.$description.'</td>';
                   1823:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   1824:                 $output .= '<td>'.
                   1825:                     &Apache::lonhtmlcommon::date_setter('envform',
                   1826:                                                         $parameter.'_value',
                   1827:                                                         $values{$parameter},
                   1828:                                                         $onchange).
                   1829:                                                         '</td>';
                   1830:             } else {
                   1831:                 $output .= '<td>'.
                   1832:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   1833:                                                     $values{$parameter},
                   1834:                                                     40,$onchange).'</td>';
                   1835:             }
                   1836:             $output .= '<td>'.
                   1837:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   1838:                 '</td>';
                   1839:             $output .= "</tr>\n";
1.51      matthew  1840: 	}
1.69      www      1841:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  1842:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   1843:             '.checked=true;"';
1.130     www      1844: 	$output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  1845: 	    '<input type="text" size=40 name="newp_name" '.
                   1846:                 $onchange.' /></td><td>'.
                   1847:             '<input type="text" size=40 name="newp_value" '.
                   1848:                 $onchange.' /></td><td>'.
                   1849: 	    '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43      albertel 1850:     }
1.157     sakharuk 1851:     my %lt=&Apache::lonlocal::texthash(
                   1852: 		    'par'   => 'Parameter',
                   1853: 		    'val'   => 'Value',
                   1854: 		    'set'   => 'Set',
                   1855: 		    'sce'   => 'Set Course Environment'
                   1856: 				       );
                   1857: 
1.140     sakharuk 1858:     my $Parameter=&mt('Parameter');
                   1859:     my $Value=&mt('Value');
1.141     sakharuk 1860:     my $Set=&mt('Set');
1.167     albertel 1861:     my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');
1.183     albertel 1862:     my $html=&Apache::lonxml::xmlbegin();
1.190     albertel 1863:     $r->print(<<ENDenv);
1.183     albertel 1864: $html
                   1865: <head>
1.46      matthew  1866: <script type="text/javascript" language="Javascript" >
1.155     albertel 1867: $browse_js
1.46      matthew  1868: </script>
1.30      www      1869: <title>LON-CAPA Course Environment</title>
                   1870: </head>
1.64      www      1871: $bodytag
1.193     albertel 1872: $breadcrumbs
                   1873: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      1874: $setoutput
                   1875: <p>
                   1876: <table border=2>
1.157     sakharuk 1877: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30      www      1878: $output
                   1879: </table>
1.157     sakharuk 1880: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      1881: </form>
                   1882: </body>
                   1883: </html>    
1.190     albertel 1884: ENDenv
1.30      www      1885: }
1.120     www      1886: ##################################################
1.207     www      1887: # Overview mode
                   1888: ##################################################
1.124     www      1889: my $tableopen;
                   1890: 
                   1891: sub tablestart {
                   1892:     if ($tableopen) {
                   1893: 	return '';
                   1894:     } else {
                   1895: 	$tableopen=1;
1.130     www      1896: 	return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.
                   1897: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      1898:     }
                   1899: }
                   1900: 
                   1901: sub tableend {
                   1902:     if ($tableopen) {
                   1903: 	$tableopen=0;
                   1904: 	return '</table>';
                   1905:     } else {
                   1906: 	return'';
                   1907:     }
                   1908: }
                   1909: 
1.207     www      1910: sub readdata {
                   1911:     my ($crs,$dom)=@_;
                   1912: # Read coursedata
                   1913:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   1914: # Read userdata
                   1915: 
                   1916:     my $classlist=&Apache::loncoursedata::get_classlist();
                   1917:     foreach (keys %$classlist) {
                   1918:         # the following undefs are for 'domain', and 'username' respectively.
                   1919:         if ($_=~/^(\w+)\:(\w+)$/) {
                   1920: 	    my ($tuname,$tudom)=($1,$2);
                   1921: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   1922:             foreach my $userkey (keys %{$useropt}) {
                   1923: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   1924:                     my $newkey=$userkey;
                   1925: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   1926: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   1927: 		}
                   1928: 	    }
                   1929: 	}
                   1930:     }
                   1931:     return $resourcedata;
                   1932: }
                   1933: 
                   1934: 
1.124     www      1935: # Setting
1.208     www      1936: 
                   1937: sub storedata {
                   1938:     my ($r,$crs,$dom)=@_;
1.207     www      1939: # Set userlevel immediately
                   1940: # Do an intermediate store of course level
                   1941:     my $olddata=&readdata($crs,$dom);
1.124     www      1942:     my %newdata=();
                   1943:     undef %newdata;
                   1944:     my @deldata=();
                   1945:     undef @deldata;
1.190     albertel 1946:     foreach (keys %env) {
1.124     www      1947: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   1948: 	    my $cmd=$1;
                   1949: 	    my $thiskey=$2;
1.207     www      1950: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   1951: 	    my $tkey=$thiskey;
                   1952:             if ($tuname) {
                   1953: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   1954: 	    }
1.124     www      1955: 	    if ($cmd eq 'set') {
1.190     albertel 1956: 		my $data=$env{$_};
1.212     www      1957:                 my $typeof=$env{'form.typeof_'.$thiskey};
                   1958:  		if ($$olddata{$thiskey} ne $data) { 
1.207     www      1959: 		    if ($tuname) {
1.212     www      1960: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   1961: 								 $tkey.'.type' => $typeof},
                   1962: 						 $tudom,$tuname) eq 'ok') {
1.207     www      1963: 			    $r->print('<br />'.&mt('Stored modified parameter for').' '.
                   1964: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   1965: 			} else {
                   1966: 			    $r->print('<h2><font color="red">'.
                   1967: 				      &mt('Error storing parameters').'</font></h2>');
                   1968: 			}
                   1969: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   1970: 		    } else {
                   1971: 			$newdata{$thiskey}=$data;
1.212     www      1972:  			$newdata{$thiskey.'.type'}=$typeof; 
                   1973:                    } 
1.207     www      1974: 		}
1.124     www      1975: 	    } elsif ($cmd eq 'del') {
1.207     www      1976: 		if ($tuname) {
                   1977: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
                   1978: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   1979: 		    } else {
                   1980: 			$r->print('<h2><font color="red">'.
                   1981: 				  &mt('Error deleting parameters').'</font></h2>');
                   1982: 		    }
                   1983: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   1984: 		} else {
                   1985: 		    push (@deldata,$thiskey);
                   1986: 		}
1.124     www      1987: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 1988: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212     www      1989:                 my $typeof=$env{'form.typeof_'.$thiskey};
1.207     www      1990: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
                   1991: 		    if ($tuname) {
1.212     www      1992: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   1993: 								 $tkey.'.type' => $typeof},
                   1994: 						 $tudom,$tuname) eq 'ok') {
1.207     www      1995: 			    $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   1996: 			} else {
                   1997: 			    $r->print('<h2><font color="red">'.
                   1998: 				      &mt('Error storing parameters').'</font></h2>');
                   1999: 			}
                   2000: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2001: 		    } else {
1.212     www      2002: 			$newdata{$thiskey}=$data;
                   2003: 			$newdata{$thiskey.'.type'}=$typeof; 
1.207     www      2004: 		    }
                   2005: 		}
1.124     www      2006: 	    }
                   2007: 	}
                   2008:     }
1.207     www      2009: # Store all course level
1.144     www      2010:     my $delentries=$#deldata+1;
                   2011:     my @newdatakeys=keys %newdata;
                   2012:     my $putentries=$#newdatakeys+1;
                   2013:     if ($delentries) {
                   2014: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
                   2015: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2016: 	} else {
                   2017: 	    $r->print('<h2><font color="red">'.
                   2018: 		      &mt('Error deleting parameters').'</font></h2>');
                   2019: 	}
1.205     www      2020: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2021:     }
                   2022:     if ($putentries) {
                   2023: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.212     www      2024: 	    $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2025: 	} else {
                   2026: 	    $r->print('<h2><font color="red">'.
                   2027: 		      &mt('Error storing parameters').'</font></h2>');
                   2028: 	}
1.205     www      2029: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2030:     }
1.208     www      2031: }
1.207     www      2032: 
1.208     www      2033: sub extractuser {
                   2034:     my $key=shift;
                   2035:     return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
                   2036: }
1.206     www      2037: 
1.208     www      2038: sub listdata {
                   2039:     my ($r,$resourcedata,$listdata)=@_;
1.207     www      2040: # Start list output
1.206     www      2041: 
1.122     www      2042:     my $oldsection='';
                   2043:     my $oldrealm='';
                   2044:     my $oldpart='';
1.123     www      2045:     my $pointer=0;
1.124     www      2046:     $tableopen=0;
1.145     www      2047:     my $foundkeys=0;
1.208     www      2048:     foreach my $thiskey (sort keys %{$listdata}) {
1.211     www      2049: 	if ($$listdata{$thiskey.'.type'}) {
                   2050:             my $thistype=$$listdata{$thiskey.'.type'};
                   2051:             if ($$resourcedata{$thiskey.'.type'}) {
                   2052: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2053: 	    }
1.207     www      2054: 	    my ($middle,$part,$name)=
                   2055: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2056: 	    my $section=&mt('All Students');
1.207     www      2057: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2058: 		my $issection=$1;
                   2059: 		if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
                   2060: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2061: 		} else {
                   2062: 		    $section=&mt('Group/Section').': '.$issection;
                   2063: 		}
1.207     www      2064: 		$middle=~s/^\[(.*)\]//;
1.122     www      2065: 	    }
1.207     www      2066: 	    $middle=~s/\.+$//;
                   2067: 	    $middle=~s/^\.+//;
1.130     www      2068: 	    my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122     www      2069: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174     albertel 2070: 		$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122     www      2071: 	    } elsif ($middle) {
1.174     albertel 2072: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   2073: 		$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      2074: 	    }
                   2075: 	    if ($section ne $oldsection) {
1.124     www      2076: 		$r->print(&tableend()."\n<hr /><h1>$section</h1>");
1.122     www      2077: 		$oldsection=$section;
                   2078: 		$oldrealm='';
                   2079: 	    }
                   2080: 	    if ($realm ne $oldrealm) {
1.124     www      2081: 		$r->print(&tableend()."\n<h2>$realm</h2>");
1.122     www      2082: 		$oldrealm=$realm;
                   2083: 		$oldpart='';
                   2084: 	    }
                   2085: 	    if ($part ne $oldpart) {
1.124     www      2086: 		$r->print(&tableend().
1.130     www      2087: 			  "\n<h3><font color='blue'>".&mt('Part').": $part</font></h3>");
1.122     www      2088: 		$oldpart=$part;
                   2089: 	    }
1.123     www      2090: #
                   2091: # Ready to print
                   2092: #
1.124     www      2093: 	    $r->print(&tablestart().'<tr><td><b>'.$name.
                   2094: 		      ':</b></td><td><input type="checkbox" name="del_'.
                   2095: 		      $thiskey.'" /></td><td>');
1.145     www      2096: 	    $foundkeys++;
1.213   ! www      2097: 	    if (&isdateparm($thistype)) {
1.123     www      2098: 		my $jskey='key_'.$pointer;
                   2099: 		$pointer++;
                   2100: 		$r->print(
                   2101: 			  &Apache::lonhtmlcommon::date_setter('overviewform',
                   2102: 							      $jskey,
1.206     www      2103: 						      $$resourcedata{$thiskey}).
1.123     www      2104: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
                   2105: 			  );
                   2106: 	    } else {
1.211     www      2107: 		$r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.206     www      2108: 			  $$resourcedata{$thiskey}.'">');
1.123     www      2109: 	    }
1.211     www      2110: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2111: 		      $thistype.'">');
1.124     www      2112: 	    $r->print('</td></tr>');
1.122     www      2113: 	}
1.121     www      2114:     }
1.208     www      2115:     return $foundkeys;
                   2116: }
                   2117: 
                   2118: sub newoverview {
                   2119:     my $r=shift;
                   2120:     my $bodytag=&Apache::loncommon::bodytag(
                   2121:                              'Set Course Assessment Parameters');
                   2122:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2123:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2124:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
                   2125:     my $html=&Apache::lonxml::xmlbegin();
                   2126:     $r->print(<<ENDOVER);
                   2127: $html
                   2128: <head>
                   2129: <title>LON-CAPA Parameters</title>
                   2130: </head>
                   2131: $bodytag
                   2132: $breadcrumbs
1.211     www      2133: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      2134: ENDOVER
1.211     www      2135:     my @ids=();
                   2136:     my %typep=();
                   2137:     my %keyp=();
                   2138:     my %allparms=();
                   2139:     my %allparts=();
                   2140:     my %allmaps=();
                   2141:     my %mapp=();
                   2142:     my %symbp=();
                   2143:     my %maptitles=();
                   2144:     my %uris=();
                   2145:     my %keyorder=&standardkeyorder();
                   2146:     my %defkeytype=();
                   2147: 
                   2148:     my %alllevs=();
                   2149:     $alllevs{'Resource Level'}='full';
                   2150:     $alllevs{'Map Level'}='map';
                   2151:     $alllevs{'Course Level'}='general';
                   2152: 
                   2153:     my $csec=$env{'form.csec'};
                   2154: 
                   2155:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   2156:     my $pschp=$env{'form.pschp'};
                   2157:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   2158:     if (!@psprt) { $psprt[0]='0'; }
                   2159: 
                   2160:     my @selected_sections = 
                   2161: 	&Apache::loncommon::get_env_multiple('form.Section');
                   2162:     @selected_sections = ('all') if (! @selected_sections);
                   2163:     foreach (@selected_sections) {
                   2164:         if ($_ eq 'all') {
                   2165:             @selected_sections = ('all');
                   2166:         }
                   2167:     }
                   2168: 
                   2169:     my $pssymb='';
                   2170:     my $parmlev='';
                   2171:  
                   2172:     unless ($env{'form.parmlev'}) {
                   2173:         $parmlev = 'map';
                   2174:     } else {
                   2175:         $parmlev = $env{'form.parmlev'};
                   2176:     }
                   2177: 
                   2178:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   2179: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   2180: 				\%keyorder,\%defkeytype);
                   2181: 
                   2182: # Menu to select levels, etc
                   2183: 
                   2184:     $r->print('<table border="1"><tr><td>');
                   2185:     &levelmenu($r,\%alllevs,$parmlev);
                   2186:     if ($parmlev ne 'general') {
                   2187: 	$r->print('<td>');
                   2188: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   2189: 	$r->print('</td>');
                   2190:     }
                   2191:     $r->print('</td></tr></table>');
                   2192: 
                   2193:     $r->print('<table border="1"><tr><td>');  
                   2194:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
                   2195:     $r->print('</td><td>');
                   2196:     &partmenu($r,\%allparts,\@psprt);
                   2197:     $r->print('</td><td>');
                   2198:     &sectionmenu($r,\@selected_sections);
1.212     www      2199:     $r->print('</td></tr></table>'.
                   2200: 	      '<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      2201: 
                   2202: # Build the list data hash from the specified parms
                   2203: 
                   2204:     my $listdata;
                   2205:     %{$listdata}=();
                   2206: 
                   2207:     foreach my $cat (@pscat) {
                   2208: 	foreach my $section (@selected_sections) {
                   2209: 	    foreach my $part (@psprt) {
1.212     www      2210:                 my $rootparmkey=$env{'request.course.id'};
1.211     www      2211:                 if (($section ne 'all') && ($section ne 'none') && ($section)) {
1.212     www      2212: 		    $rootparmkey.='.['.$section.']';
1.211     www      2213: 		}
                   2214: 		if ($parmlev eq 'general') {
                   2215: # course-level parameter
1.212     www      2216: 		    my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   2217: 		    $$listdata{$newparmkey}=1;
                   2218: 		    $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
1.211     www      2219: 		} elsif ($parmlev eq 'map') {
1.212     www      2220: # map-level parameter
                   2221: 		    foreach my $mapid (keys %allmaps) {
                   2222: 			if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   2223: 			my $newparmkey=$rootparmkey.'.'.$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
1.211     www      2224:                         $$listdata{$newparmkey}=1;
                   2225:                         $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
                   2226: 		    }
                   2227: 		} else {
                   2228: # resource-level parameter
1.212     www      2229: 		    foreach my $rid (@ids) {
                   2230: 			my ($map,$resid,$url)=&Apache::lonnet::decode_symb($symbp{$rid});
                   2231: 			if (($pschp ne 'all') && ($allmaps{$pschp} ne $map)) { next; }
                   2232: 			my $newparmkey=$rootparmkey.'.'.$symbp{$rid}.'.'.$part.'.'.$cat;
                   2233:                         $$listdata{$newparmkey}=1;
                   2234:                         $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
                   2235: 		    }
1.211     www      2236: 		}
                   2237: 	    }
                   2238: 	}
                   2239:     }
                   2240: 
1.212     www      2241:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      2242: 
1.212     www      2243: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      2244: 
                   2245: # Read modified data
                   2246: 
                   2247: 	my $resourcedata=&readdata($crs,$dom);
                   2248: 
                   2249: # List data
                   2250: 
                   2251: 	&listdata($r,$resourcedata,$listdata);
                   2252:     }
                   2253:     $r->print(&tableend().
1.212     www      2254: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
                   2255: 	      '</form></body></html>');
1.208     www      2256: }
                   2257: 
                   2258: sub overview {
                   2259:     my $r=shift;
                   2260:     my $bodytag=&Apache::loncommon::bodytag(
                   2261:                              'Modify Course Assessment Parameters');
                   2262:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2263:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2264:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
                   2265:     my $html=&Apache::lonxml::xmlbegin();
                   2266:     $r->print(<<ENDOVER);
                   2267: $html
                   2268: <head>
                   2269: <title>LON-CAPA Parameters</title>
                   2270: </head>
                   2271: $bodytag
                   2272: $breadcrumbs
                   2273: <form method="post" action="/adm/parmset?action=setoverview" name="overviewform">
                   2274: ENDOVER
                   2275: # Store modified
                   2276: 
                   2277:     &storedata($r,$crs,$dom);
                   2278: 
                   2279: # Read modified data
                   2280: 
                   2281:     my $resourcedata=&readdata($crs,$dom);
                   2282: 
                   2283: # List data
                   2284: 
                   2285:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata);
                   2286: 
1.145     www      2287:     $r->print(&tableend().'<p>'.
1.208     www      2288: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form></body></html>');
1.120     www      2289: }
1.121     www      2290: 
1.59      matthew  2291: ##################################################
                   2292: ##################################################
1.178     raeburn  2293:                                                                                             
                   2294: =pod
                   2295:                                                                                             
                   2296: =item change clone
                   2297:                                                                                             
                   2298: Modifies the list of courses a user can clone (stored
                   2299: in the user's environemnt.db file), called when a
                   2300: change is made to the list of users allowed to clone
                   2301: a course.
                   2302:                                                                                             
                   2303: Inputs: $action,$cloner
                   2304: where $action is add or drop, and $cloner is identity of 
                   2305: user for whom cloning ability is to be changed in course. 
                   2306:                                                                                             
                   2307: Returns: 
                   2308: 
                   2309: =cut
                   2310:                                                                                             
                   2311: ##################################################
                   2312: ##################################################
                   2313: 
                   2314: 
                   2315: sub change_clone {
                   2316:     my ($clonelist,$oldcloner) = @_;
                   2317:     my ($uname,$udom);
1.190     albertel 2318:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2319:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  2320:     my $clone_crs = $cnum.':'.$cdom;
                   2321:     
                   2322:     if ($cnum && $cdom) {
                   2323:         my @allowclone = ();
                   2324:         if ($clonelist =~ /,/) {
                   2325:             @allowclone = split/,/,$clonelist;
                   2326:         } else {
                   2327:             $allowclone[0] = $clonelist;
                   2328:         }
                   2329:         foreach my $currclone (@allowclone) {
                   2330:             if (!grep/^$currclone$/,@$oldcloner) {
                   2331:                 ($uname,$udom) = split/:/,$currclone;
                   2332:                 if ($uname && $udom) {
                   2333:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2334:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2335:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2336:                             if ($currclonecrs{'cloneable'} eq '') {
                   2337:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2338:                             } else {
                   2339:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2340:                             }
                   2341:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2342:                         }
                   2343:                     }
                   2344:                 }
                   2345:             }
                   2346:         }
                   2347:         foreach my $oldclone (@$oldcloner) {
                   2348:             if (!grep/^$oldclone$/,@allowclone) {
                   2349:                 ($uname,$udom) = split/:/,$oldclone;
                   2350:                 if ($uname && $udom) {
                   2351:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2352:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2353:                         my %newclonecrs = ();
                   2354:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2355:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2356:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2357:                                 foreach (@currclonecrs) {
                   2358:                                     unless ($_ eq $clone_crs) {
                   2359:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2360:                                     }
                   2361:                                 }
                   2362:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2363:                             } else {
                   2364:                                 $newclonecrs{'cloneable'} = '';
                   2365:                             }
                   2366:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2367:                         }
                   2368:                     }
                   2369:                 }
                   2370:             }
                   2371:         }
                   2372:     }
                   2373: }
                   2374: 
1.193     albertel 2375: 
                   2376: ##################################################
                   2377: ##################################################
                   2378: 
                   2379: =pod
                   2380: 
                   2381: =item * header
                   2382: 
                   2383: Output html header for page
                   2384: 
                   2385: =cut
                   2386: 
                   2387: ##################################################
                   2388: ##################################################
                   2389: sub header {
                   2390:     my $html=&Apache::lonxml::xmlbegin();
                   2391:     my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');
                   2392:     my $title = &mt('LON-CAPA Parameter Manager');
                   2393:     return(<<ENDHEAD);
                   2394: $html
                   2395: <head>
                   2396: <title>$title</title>
                   2397: </head>
                   2398: $bodytag
                   2399: ENDHEAD
                   2400: }
                   2401: ##################################################
                   2402: ##################################################
                   2403: sub print_main_menu {
                   2404:     my ($r,$parm_permission)=@_;
                   2405:     #
                   2406:     $r->print(<<ENDMAINFORMHEAD);
                   2407: <form method="post" enctype="multipart/form-data"
                   2408:       action="/adm/parmset" name="studentform">
                   2409: ENDMAINFORMHEAD
                   2410: #
1.195     albertel 2411:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2412:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.193     albertel 2413:     my @menu =
                   2414:         (
                   2415:           { text => 'Set Course Environment Parameters',
1.204     www      2416: 	    action => 'crsenv',
1.193     albertel 2417:             permission => $parm_permission,
                   2418:             },
                   2419:           { text => 'Set/Modify Course Assessment Parameters - Helper Mode',
                   2420:             url => '/adm/helper/parameter.helper',
                   2421:             permission => $parm_permission,
                   2422:             },
                   2423:           { text => 'Modify Course Assessment Parameters - Overview Mode',
                   2424:             action => 'setoverview',
                   2425:             permission => $parm_permission,
1.208     www      2426:             },          
                   2427: 	  { text => 'Set Course Assessment Parameters - Overview Mode',
                   2428:             action => 'newoverview',
                   2429:             permission => $parm_permission,
1.193     albertel 2430:             },
                   2431:           { text => 'Set/Modify Course Assessment Parameters - Table Mode',
                   2432:             action => 'settable',
                   2433:             permission => $parm_permission,
1.204     www      2434:             help => 'Cascading_Parameters',
1.193     albertel 2435:             },
                   2436: #          { text => 'Set Parameter Default Preferences',
                   2437: #            help => 'Course_View_Class_List',
                   2438: #            action => 'setdefaults',
                   2439: #            permission => $parm_permission,
                   2440: #            },
                   2441:           );
                   2442:     my $menu_html = '';
                   2443:     foreach my $menu_item (@menu) {
                   2444:         next if (! $menu_item->{'permission'});
                   2445:         $menu_html.='<p>';
                   2446:         $menu_html.='<font size="+1">';
                   2447:         if (exists($menu_item->{'url'})) {
                   2448:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   2449:         } else {
                   2450:             $menu_html.=
                   2451:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   2452:         }
                   2453:         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
                   2454:         if (exists($menu_item->{'help'})) {
                   2455:             $menu_html.=
                   2456:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   2457:         }
                   2458:         $menu_html.='</p>'.$/;
                   2459:     }
                   2460:     $r->print($menu_html);
                   2461:     return;
                   2462: }
                   2463: 
                   2464: 
                   2465: 
                   2466: 
1.178     raeburn  2467: ##################################################
                   2468: ##################################################
1.30      www      2469: 
1.59      matthew  2470: =pod
                   2471: 
1.83      bowersj2 2472: =item * handler
1.59      matthew  2473: 
                   2474: Main handler.  Calls &assessparms and &crsenv subroutines.
                   2475: 
                   2476: =cut
                   2477: ##################################################
                   2478: ##################################################
1.85      bowersj2 2479:     use Data::Dumper;
1.30      www      2480: sub handler {
1.43      albertel 2481:     my $r=shift;
1.30      www      2482: 
1.43      albertel 2483:     if ($r->header_only) {
1.126     www      2484: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 2485: 	$r->send_http_header;
                   2486: 	return OK;
                   2487:     }
1.193     albertel 2488:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      2489: 					    ['action','state',
                   2490:                                              'pres_marker',
                   2491:                                              'pres_value',
1.206     www      2492:                                              'pres_type',
                   2493:                                              'udom','uname']);
1.131     www      2494: 
1.83      bowersj2 2495: 
1.193     albertel 2496:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 2497:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   2498: 					    text=>"Parameter Manager",
1.204     www      2499: 					    faq=>10,
1.194     albertel 2500: 					    bug=>'Instructor Interface'});
1.203     www      2501: 
1.30      www      2502: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 2503:     my $parm_permission =
                   2504: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 2505: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 2506: 				  $env{'request.course.sec'}));
1.194     albertel 2507:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 2508: 
                   2509:         # Start Page
1.126     www      2510:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      2511:         $r->send_http_header;
1.30      www      2512: 
1.203     www      2513: 
                   2514:         # id numbers can change on re-ordering of folders
                   2515: 
                   2516:         &resetsymbcache();
                   2517: 
1.193     albertel 2518:         #
                   2519:         # Main switch on form.action and form.state, as appropriate
                   2520:         #
                   2521:         # Check first if coming from someone else headed directly for
                   2522:         #  the table mode
                   2523:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   2524: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   2525: 	    &assessparms($r);
                   2526: 
                   2527:         } elsif (! exists($env{'form.action'})) {
                   2528:             $r->print(&header());
1.194     albertel 2529:             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
                   2530: 							 'Parameter Manager'));
1.193     albertel 2531:             &print_main_menu($r,$parm_permission);
                   2532:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 2533:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   2534: 						    text=>"Course Environment"});
                   2535:             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
                   2536: 						   'Edit Course Environment'));
1.193     albertel 2537:             &crsenv($r); 
                   2538:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 2539:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   2540: 						    text=>"Overview Mode"});
1.121     www      2541: 	    &overview($r);
1.208     www      2542:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   2543:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   2544: 						    text=>"Overview Mode"});
                   2545: 	    &newoverview($r);
1.193     albertel 2546:         } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 2547:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      2548: 						    text=>"Table Mode",
                   2549: 						    help => 'Course_Setting_Parameters'});
1.121     www      2550: 	    &assessparms($r);
1.193     albertel 2551:         }
                   2552:         
1.43      albertel 2553:     } else {
1.1       www      2554: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 2555: 	$env{'user.error.msg'}=
1.43      albertel 2556: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   2557: 	return HTTP_NOT_ACCEPTABLE;
                   2558:     }
                   2559:     return OK;
1.1       www      2560: }
                   2561: 
                   2562: 1;
                   2563: __END__
                   2564: 
1.59      matthew  2565: =pod
1.38      harris41 2566: 
                   2567: =back
                   2568: 
                   2569: =cut
1.1       www      2570: 
                   2571: 
                   2572: 

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