Annotation of loncom/homework/inputtags.pm, revision 1.328

1.43      albertel    1: # The LearningOnline Network with CAPA
                      2: # input  definitons
1.47      albertel    3: #
1.328   ! raeburn     4: # $Id: inputtags.pm,v 1.327 2014/11/07 22:00:17 raeburn Exp $
1.47      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/
1.1       albertel   27: 
1.249     jms        28: =pod
                     29: 
                     30: =head1 NAME
                     31: 
                     32: Apache::inputtags
                     33: 
                     34: =head1 SYNOPSIS
                     35: 
                     36: 
                     37: 
                     38: This is part of the LearningOnline Network with CAPA project
                     39: described at http://www.lon-capa.org.
                     40: 
                     41: 
                     42: =head1 NOTABLE SUBROUTINES
                     43: 
                     44: =over
                     45: 
                     46: =item 
                     47: 
                     48: =back
                     49: 
                     50: =cut
                     51: 
1.1       albertel   52: package Apache::inputtags;
1.55      albertel   53: use HTML::Entities();
1.1       albertel   54: use strict;
1.82      www        55: use Apache::loncommon;
1.265     raeburn    56: use Apache::lonhtmlcommon;
1.115     www        57: use Apache::lonlocal;
1.165     albertel   58: use Apache::lonnet;
1.192     www        59: use LONCAPA;
                     60:  
1.1       albertel   61: 
1.50      harris41   62: BEGIN {
1.286     www        63:     &Apache::lonxml::register('Apache::inputtags',('hiddensubmission','hiddenline','textfield','textline'));
1.1       albertel   64: }
                     65: 
1.249     jms        66: =pod
                     67: 
                     68: =item initialize_inputtags()
                     69: 
                     70: Initializes a set of global variables used during the parse of the problem.
                     71: 
                     72: @Apache::inputtags::input        - List of current input ids.
                     73: @Apache::inputtags::inputlist    - List of all input ids seen this problem.
                     74: @Apache::inputtags::response     - List of all current resopnse ids.
                     75: @Apache::inputtags::responselist - List of all response ids seen this 
                     76:                                      problem.
                     77: @Apache::inputtags::hint         - List of all hint ids.
                     78: @Apache::inputtags::hintlist     - List of all hint ids seen this problem.
                     79: @Apache::inputtags::previous     - List describing if specific responseds
                     80:                                      have been used
                     81: @Apache::inputtags::previous_version - Submission responses were used in.
                     82: $Apache::inputtags::part         - Current part id (valid only in 
                     83:                                      <problem>)
                     84:                                    0 if not in a part.
                     85: @Apache::inputtags::partlist     - List of part ids seen in the current
                     86:                                      <problem>
                     87: @Apache::inputtags::status       - List of problem  statuses. First 
                     88:                                    element is the status of the <problem>
                     89:                                    the remainder are for individual <part>s.
                     90: %Apache::inputtags::params       - Hash of defined parameters for the
                     91:                                    current response.
                     92: @Apache::inputtags::import       - List of all ids for <import> thes get
                     93:                                    join()ed and prepended.
                     94: @Apache::inputtags::importlist   - List of all import ids seen.
                     95: $Apache::inputtags::response_with_no_part
                     96:                                  - Flag set true if we have seen a response
                     97:                                    that is not inside a <part>
                     98: %Apache::inputtags::answertxt    - <*response> tags store correct
                     99:                                    answer strings for display by <textline/>
                    100:                                    in this hash.
                    101: %Apache::inputtags::submission_display
                    102:                                  - <*response> tags store improved display
                    103:                                    of submission strings for display by part
                    104:                                    end.
                    105: 
                    106: =cut
1.178     albertel  107: 
1.1       albertel  108: sub initialize_inputtags {
1.135     albertel  109:     @Apache::inputtags::input=();
                    110:     @Apache::inputtags::inputlist=();
1.174     albertel  111:     @Apache::inputtags::response=();
1.135     albertel  112:     @Apache::inputtags::responselist=();
1.174     albertel  113:     @Apache::inputtags::hint=();
1.173     albertel  114:     @Apache::inputtags::hintlist=();
1.135     albertel  115:     @Apache::inputtags::previous=();
                    116:     @Apache::inputtags::previous_version=();
                    117:     $Apache::inputtags::part='';
                    118:     @Apache::inputtags::partlist=();
                    119:     @Apache::inputtags::status=();
                    120:     %Apache::inputtags::params=();
                    121:     @Apache::inputtags::import=();
                    122:     @Apache::inputtags::importlist=();
                    123:     $Apache::inputtags::response_with_no_part=0;
1.144     albertel  124:     %Apache::inputtags::answertxt=();
1.217     albertel  125:     %Apache::inputtags::submission_display=();
1.103     albertel  126: }
                    127: 
1.310     foxr      128: #
                    129: #  provides the onblur binding for spellchecking.  This could be an
                    130: #  empty string if spellchecking was not enabled.
                    131: #  Jquery selector binding is done rather than setting an onblur
                    132: #  attribute because we'll need to set the element's spellcheck language
                    133: #  option dynamically so we need $(this) to be defined.
                    134: #
                    135: # @param id   - The element id to bind.
                    136: # @param lang - Language in which spellchecking is desired.
                    137: #               if undef, nothing is generated.  
                    138: # @return string - onblur specification to do the requested spellchecking.
                    139: #
                    140: sub spellcheck_onblur {
                    141:     my ($id, $lang) = @_;
                    142:     my $result = '';
                    143:     if ($lang) {
                    144: 
                    145: 	$result = <<JAVASCRIPT;
                    146: <script type="text/javascript">
                    147: \$('\#$id').blur(function() {
                    148:     doSpellcheck('\#$id', '$lang');
                    149:  });
                    150: </script>
                    151: 
                    152: JAVASCRIPT
                    153: 
                    154: 
                    155:     }
                    156:     return $result;
                    157: }
                    158: 
1.103     albertel  159: sub check_for_duplicate_ids {
                    160:     my %check;
                    161:     foreach my $id (@Apache::inputtags::partlist,
                    162: 		    @Apache::inputtags::responselist,
1.173     albertel  163: 		    @Apache::inputtags::hintlist,
1.103     albertel  164: 		    @Apache::inputtags::importlist) {
                    165: 	$check{$id}++;
                    166:     }
                    167:     my @duplicates;
                    168:     foreach my $id (sort(keys(%check))) {
                    169: 	if ($check{$id} > 1) {
                    170: 	    push(@duplicates,$id);
                    171: 	}
                    172:     }
                    173:     if (@duplicates) {
                    174: 	&Apache::lonxml::error("Duplicated ids found, problem will operate incorrectly. Duplicated ids seen: ",join(', ',@duplicates));
                    175:     }
1.1       albertel  176: }
                    177: 
1.14      albertel  178: sub start_input {
1.135     albertel  179:     my ($parstack,$safeeval)=@_;
1.228     albertel  180:     my $id = &Apache::lonxml::get_id($parstack,$safeeval);
1.135     albertel  181:     push (@Apache::inputtags::input,$id);
                    182:     push (@Apache::inputtags::inputlist,$id);
                    183:     return $id;
1.14      albertel  184: }
                    185: 
                    186: sub end_input {
1.135     albertel  187:     pop @Apache::inputtags::input;
                    188:     return '';
1.14      albertel  189: }
                    190: 
1.124     www       191: sub addchars {
                    192:     my ($fieldid,$addchars)=@_;
                    193:     my $output='';
                    194:     foreach (split(/\,/,$addchars)) {
                    195: 	$output.='<a href="javascript:void(document.forms.lonhomework.'.
                    196: 	    $fieldid.'.value+=\''.$_.'\')">'.$_.'</a> ';
                    197:     }
                    198:     return $output;
                    199: }
                    200: 
1.48      albertel  201: sub start_textfield {
1.185     albertel  202:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.135     albertel  203:     my $result = "";
                    204:     my $id = &start_input($parstack,$safeeval);
                    205:     my $resid=$Apache::inputtags::response[-1];
                    206:     if ($target eq 'web') {
                    207: 	$Apache::lonxml::evaluate--;
1.205     albertel  208: 	my $partid=$Apache::inputtags::part;
1.274     raeburn   209:         my ($oldresponse,$newvariation);
                    210:         if ((($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry') ||
                    211:              ($Apache::lonhomework::type eq 'randomizetry')) &&
                    212:              ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
                    213:             if ($env{'form.'.$partid.'.rndseed'} ne
                    214:                 $Apache::lonhomework::history{"resource.$partid.rndseed"}) {
                    215:                 $newvariation = 1;
                    216:             }
                    217:         }
                    218:         unless ($newvariation) {
1.317     raeburn   219:             if ((($env{'form.grade_username'} eq '') && ($env{'form.grade_domain'} eq '')) ||
                    220:                 (($env{'form.grade_username'} eq $env{'user.name'}) &&
                    221:                  ($env{'form.grade_domain'} eq $env{'user.domain'}))) {
                    222:                 $oldresponse = $Apache::lonhomework::history{"resource.$partid.$resid.submission"};
                    223:             } elsif (($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurvey') ||
                    224:                     ($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurveycred')) {
1.322     raeburn   225:                 $oldresponse = '* '.&mt('(only shown to submitter)').' *';
1.317     raeburn   226:             } else {
                    227:                 $oldresponse = $Apache::lonhomework::history{"resource.$partid.$resid.submission"};
                    228:             }
1.274     raeburn   229:         }
1.135     albertel  230: 	if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    231: 	    my $cols = &Apache::lonxml::get_param('cols',$parstack,$safeeval);
                    232: 	    if ( $cols eq '') { $cols = 80; }
                    233: 	    my $rows = &Apache::lonxml::get_param('rows',$parstack,$safeeval);
1.143     www       234: 	    if ( $rows eq '') { $rows = 16; }
1.135     albertel  235: 	    my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval);
                    236: 	    $result='';
1.310     foxr      237: 	    my $tagident = 'HWVAL_' . $resid;
1.326     raeburn   238:             my $itemid = 'HWVAL_'.$partid.'_'.$resid;
1.135     albertel  239: 	    if ($addchars) {
1.310     foxr      240: 		$result.=&addchars($tagident, $addchars);
1.135     albertel  241: 	    }
1.324     raeburn   242:             my $textareaclass;
                    243:             unless (&Apache::londefdef::is_inside_of($tagstack,
                    244:                                                     'externalresponse')) {
                    245:                 $textareaclass = 'class="LC_richDetectHtml spellchecked"';
                    246:             }
1.326     raeburn   247: 	    $result.= '<textarea wrap="hard" name="'.$tagident.'" id="'.$itemid.'" ' .
1.308     foxr      248: 		      'rows="'.$rows.'" cols="'.$cols.'" '.$textareaclass
                    249: 		      .'>'.
1.302     raeburn   250:                       &HTML::Entities::encode($oldresponse,'<>&"');
1.135     albertel  251: 	    if ($oldresponse ne '') {
1.143     www       252: 
1.135     albertel  253: 		#get rid of any startup text if the user has already responded
1.185     albertel  254: 		&Apache::lonxml::get_all_text("/textfield",$parser,$style);
1.135     albertel  255: 	    }
                    256: 	} else {
1.205     albertel  257: 	    #show past answer in the essayresponse case
                    258: 	    if ($oldresponse =~ /\S/
                    259: 		&& &Apache::londefdef::is_inside_of($tagstack,
                    260: 						    'essayresponse') ) {
                    261: 		$result='<table class="LC_pastsubmission"><tr><td>'.
1.323     bisitz    262: 		    &HTML::Entities::encode($oldresponse,'"<>&').
                    263:                     '</td></tr></table>';
1.205     albertel  264: 	    }
1.135     albertel  265: 	    #get rid of any startup text
1.185     albertel  266: 	    &Apache::lonxml::get_all_text("/textfield",$parser,$style);
1.61      albertel  267: 	}
1.135     albertel  268:     } elsif ($target eq 'grade') {
1.185     albertel  269: 	my $seedtext=&Apache::lonxml::get_all_text("/textfield",$parser,
                    270: 						   $style);
1.165     albertel  271: 	if ($seedtext eq $env{'form.HWVAL_'.$resid}) {
1.135     albertel  272: 	    # if the seed text is still there it wasn't a real submission
1.165     albertel  273: 	    $env{'form.HWVAL_'.$resid}='';
1.135     albertel  274: 	}
                    275:     } elsif ($target eq 'edit') {
                    276: 	$result.=&Apache::edit::tag_start($target,$token);
                    277: 	$result.=&Apache::edit::text_arg('Rows:','rows',$token,4);
                    278: 	$result.=&Apache::edit::text_arg('Columns:','cols',$token,4);
                    279: 	$result.=&Apache::edit::text_arg
                    280: 	    ('Click-On Texts (comma sep):','addchars',$token,10);
1.185     albertel  281: 	my $bodytext=&Apache::lonxml::get_all_text("/textfield",$parser,
                    282: 						   $style);
1.135     albertel  283: 	$result.=&Apache::edit::editfield($token->[1],$bodytext,'Text you want to appear by default:',80,2);
1.314     raeburn   284:         my $spell_langs = &spelling_languages();
1.312     raeburn   285: 	$result .= &Apache::edit::select_arg('Spellcheck for:', 'spellcheck',
1.314     raeburn   286: 					     $spell_langs, $token);
1.135     albertel  287:     } elsif ($target eq 'modified') {
                    288: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    289: 						     $safeeval,'rows','cols',
1.311     foxr      290: 						     'addchars', 'spellcheck');
1.135     albertel  291: 	if ($constructtag) {
                    292: 	    $result = &Apache::edit::rebuild_tag($token);
                    293: 	} else {
                    294: 	    $result=$token->[4];
                    295: 	}
                    296: 	$result.=&Apache::edit::modifiedfield("/textfield",$parser);
                    297:     } elsif ($target eq 'tex') {
                    298: 	my $number_of_lines = &Apache::lonxml::get_param('rows',$parstack,$safeeval);
                    299: 	my $width_of_box = &Apache::lonxml::get_param('cols',$parstack,$safeeval);
                    300: 	if ($$tagstack[-2] eq 'essayresponse' and $Apache::lonhomework::type eq 'exam') {
                    301: 	    $result = '\fbox{\fbox{\parbox{\textwidth-5mm}{';
                    302: 	    for (my $i=0;$i<int $number_of_lines*2;$i++) {$result.='\strut \\\\ ';}
                    303: 	    $result.='\strut \\\\\strut \\\\\strut \\\\\strut \\\\}}}';
                    304: 	} else {
1.313     raeburn   305:             if ($env{'form.pdfFormFields'} eq 'yes') {
                    306:                 my $fieldname = $env{'request.symb'}.
                    307:                                 '&part_'. $Apache::inputtags::part.
                    308:                                 '&textresponse'.
                    309:                                 '&HWVAL_' . $Apache::inputtags::response['-1'];
                    310:                 $result.='\TextField[name='.$fieldname.',multiline=true,height=6\baselineskip,width=270,borderwidth=0,backgroundcolor={.85 .85 .85}]\\';
                    311:             } else {
                    312:                 my $TeXwidth=$width_of_box/80;
                    313:                 $result = '\vskip 1 mm \fbox{\fbox{\parbox{'.$TeXwidth.'\textwidth-5mm}{';
                    314:                 for (my $i=0;$i<int $number_of_lines*2;$i++) {$result.='\strut \\\\ ';}
                    315:                 $result.='}}}\vskip 2 mm ';
                    316:             }
1.135     albertel  317: 	}
1.60      albertel  318:     }
1.135     albertel  319:     return $result;
1.6       albertel  320: }
                    321: 
1.48      albertel  322: sub end_textfield {
1.135     albertel  323:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    324:     my $result;
                    325:     if ($target eq 'web') {
1.310     foxr      326: 	my $spellcheck = &Apache::lonxml::get_param('spellcheck', $parstack, $safeeval);
1.135     albertel  327: 	$Apache::lonxml::evaluate++;
                    328: 	if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
1.326     raeburn   329:             my $partid=$Apache::inputtags::part;
1.310     foxr      330: 	    my $resid = $Apache::inputtags::response[-1];
1.326     raeburn   331: 	    my $itemid = 'HWVAL_' . $partid . '_' . $resid;
1.310     foxr      332: 	    my $result =  "</textarea>";
1.326     raeburn   333: 	    $result .= &spellcheck_onblur($itemid, $spellcheck);
1.310     foxr      334: 	    return $result;
1.135     albertel  335: 	}
                    336:     } elsif ($target eq 'edit') {
                    337: 	$result=&Apache::edit::end_table();
                    338:     }
                    339:     &end_input;
                    340:     return $result;
1.6       albertel  341: }
                    342: 
1.190     albertel  343: sub exam_score_line {
1.188     albertel  344:     my ($target) = @_;
1.190     albertel  345: 
1.188     albertel  346:     my $result;
                    347:     if ($target eq 'tex') {
                    348: 	my $repetition = &Apache::response::repetition();
                    349: 	$result.='\begin{enumerate}';
1.190     albertel  350: 	if ($env{'request.state'} eq "construct" ) {$result.='\item[\strut]';}
1.188     albertel  351: 	foreach my $i (0..$repetition-1) {
                    352: 	    $result.='\item[\textbf{'.
                    353: 		($Apache::lonxml::counter+$i).
                    354: 		'}.]\textit{Leave blank on scoring form}\vskip 0 mm';
                    355: 	}
                    356: 	$result.= '\end{enumerate}';
1.190     albertel  357:     }
                    358: 
                    359:     return $result;
                    360: }
                    361: 
                    362: sub exam_box {
                    363:     my ($target) = @_;
                    364:     my $result;
1.188     albertel  365: 
1.190     albertel  366:     if ($target eq 'tex') {
                    367: 	$result .= '\fbox{\fbox{\parbox{\textwidth-5mm}{\strut\\\\\strut\\\\\strut\\\\\strut\\\\}}}';
                    368: 	$result .= &exam_score_line($target);
1.188     albertel  369:     } elsif ($target eq 'web') {
                    370: 	my $id=$Apache::inputtags::response[-1];
                    371: 	$result.= '<br /><br />
                    372:                    <textarea name="HWVAL_'.$id.'" rows="4" cols="50">
                    373:                    </textarea> <br /><br />';
                    374:     }
                    375:     return $result;
                    376: }
                    377: 
                    378: sub needs_exam_box {
                    379:     my ($tagstack) = @_;
                    380:     my @tags = ('formularesponse',
                    381: 		'stringresponse',
                    382: 		'reactionresponse',
                    383: 		'organicresponse',
                    384: 		);
                    385: 
                    386:     foreach my $tag (@tags) {
                    387: 	if (grep(/\Q$tag\E/,@$tagstack)) {
                    388: 	    return 1;
                    389: 	}
                    390:     }
                    391:     return 0;
                    392: }
                    393: 
1.1       albertel  394: sub start_textline {
1.135     albertel  395:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    396:     my $result = "";
1.210     albertel  397:     my $input_id = &start_input($parstack,$safeeval);
1.310     foxr      398: 
                    399:     # The spellcheck attribute 
                    400:     # 1. enables spellchecking.
                    401:     # 2. Provides the language code in which the spellchecking will be performed.
                    402: 
                    403:     my $spellcheck = &Apache::lonxml::get_param('spellcheck', $parstack, $safeeval);
1.135     albertel  404:     if ($target eq 'web') {
                    405: 	$Apache::lonxml::evaluate--;
                    406: 	my $partid=$Apache::inputtags::part;
                    407: 	my $id=$Apache::inputtags::response[-1];
1.204     albertel  408: 	if (!&Apache::response::show_answer()) {
1.135     albertel  409: 	    my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
                    410: 	    my $maxlength;
                    411: 	    if ($size eq '') { $size=20; } else {
1.214     albertel  412: 		if ($size < 20) {
                    413: 		    $maxlength = ' maxlength="'.$size.'"';
                    414: 		}
1.135     albertel  415: 	    }
1.274     raeburn   416:             my ($oldresponse,$newvariation);
                    417:             if ((($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry') ||
                    418:                  ($Apache::lonhomework::type eq 'randomizetry')) &&
                    419:                  ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
                    420:                 if ($env{'form.'.$partid.'.rndseed'} ne
                    421:                     $Apache::lonhomework::history{"resource.$partid.rndseed"}) {
                    422:                     $newvariation = 1;
                    423:                 }
                    424:             }
                    425:             unless ($newvariation) {
1.317     raeburn   426:                 if ((($env{'form.grade_username'} eq '') && ($env{'form.grade_domain'} eq '')) ||
                    427:                     (($env{'form.grade_username'} eq $env{'user.name'}) &&
                    428:                      ($env{'form.grade_domain'} eq $env{'user.domain'}))) {
                    429:                     $oldresponse = $Apache::lonhomework::history{"resource.$partid.$id.submission"};
                    430:                 } elsif (($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurvey') ||
                    431:                         ($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurveycred') ||
                    432:                         ($Apache::lonhomework::type eq 'anonsurvey') ||
                    433:                         ($Apache::lonhomework::type eq 'anonsurveycred')) {
1.322     raeburn   434:                         $oldresponse = '* '.&mt('(only shown to submitter)').' *';
1.317     raeburn   435:                 } else {
                    436:                     $oldresponse = $Apache::lonhomework::history{"resource.$partid.$id.submission"};
                    437:                 }
1.274     raeburn   438: 	        &Apache::lonxml::debug("oldresponse $oldresponse is ".ref($oldresponse));
                    439: 	        if (ref($oldresponse) eq 'ARRAY') {
                    440: 		    $oldresponse = $oldresponse->[$#Apache::inputtags::inputlist];
                    441: 	        }
                    442: 	        $oldresponse = &HTML::Entities::encode($oldresponse,'<>&"');
                    443:                 $oldresponse =~ s/^\s+//;
                    444:                 $oldresponse =~ s/\s+$//;
                    445:                 $oldresponse =~ s/\s+/ /g;
                    446:             }
1.135     albertel  447: 	    if ($Apache::lonhomework::type ne 'exam') {
                    448: 		my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval);
                    449: 		$result='';
                    450: 		if ($addchars) {
                    451: 		    $result.=&addchars('HWVAL_'.$id,$addchars);
                    452: 		}
1.157     albertel  453: 		my $readonly=&Apache::lonxml::get_param('readonly',$parstack,
                    454: 							$safeeval);
1.193     albertel  455: 		if (lc($readonly) eq 'yes' 
                    456: 		    || $Apache::inputtags::status[-1] eq 'CANNOT_ANSWER') {
1.157     albertel  457: 		    $readonly=' readonly="readonly" ';
1.158     albertel  458: 		} else {
                    459: 		    $readonly='';
1.157     albertel  460: 		}
1.193     albertel  461: 		my $name = 'HWVAL_'.$id;
1.326     raeburn   462:                 my $itemid = 'HWVAL_'.$partid.'_'.$id;
1.193     albertel  463: 		if ($Apache::inputtags::status[-1] eq 'CANNOT_ANSWER') {
                    464: 		    $name = "none";
                    465: 		}
1.310     foxr      466: 		$result.= '<input onkeydown="javascript:setSubmittedPart(\''.$partid.'\');"'
                    467: 		     . ' type="text" '
                    468: 		     . $readonly.' name="'. $name . '"'
1.326     raeburn   469: 		     . ' id="' . $itemid . '"'
1.310     foxr      470: 		     . ' value="'.  $oldresponse.'"'
1.326     raeburn   471: 		     . ' class="LC_textline spellchecked"  size="'.$size.'"'.$maxlength
1.327     raeburn   472: 		     . ' autocomplete="off" />';
1.310     foxr      473: 
1.326     raeburn   474: 		$result .= &spellcheck_onblur($itemid, $spellcheck);
1.135     albertel  475: 	    }
1.188     albertel  476: 	    if ($Apache::lonhomework::type eq 'exam'
                    477: 		&& &needs_exam_box($tagstack)) {
                    478: 		$result.=&exam_box($target);
                    479: 	    }
1.135     albertel  480: 	} else {
                    481: 	    #right or wrong don't show what was last typed in.
1.208     albertel  482: 	    my $count = scalar(@Apache::inputtags::inputlist)-1;
                    483: 	    $result='<b>'.$Apache::inputtags::answertxt{$id}[$count].'</b>';
1.144     albertel  484: 	    #$result='';
1.135     albertel  485: 	}
                    486:     } elsif ($target eq 'edit') {
                    487: 	$result=&Apache::edit::tag_start($target,$token);
                    488: 	$result.=&Apache::edit::text_arg('Size:','size',$token,'5').
1.157     albertel  489: 	    &Apache::edit::text_arg('Click-On Texts (comma sep):',
                    490: 				    'addchars',$token,10);
                    491:         $result.=&Apache::edit::select_arg('Readonly:','readonly',
                    492: 					   ['no','yes'],$token);
1.314     raeburn   493:         my $spell_langs = &spelling_languages();
1.316     bisitz    494: 	$result.=&Apache::edit::select_arg('Spellcheck for:', 'spellcheck',
1.314     raeburn   495: 					   $spell_langs, $token);
1.157     albertel  496: 	$result.=&Apache::edit::end_row();
                    497: 	$result.=&Apache::edit::end_table();
1.135     albertel  498:     } elsif ($target eq 'modified') {
1.157     albertel  499: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    500: 						     $safeeval,'size',
1.311     foxr      501: 						     'addchars','readonly', 'spellcheck');
1.135     albertel  502: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.188     albertel  503:     } elsif ($target eq 'tex' 
                    504: 	     && $Apache::lonhomework::type ne 'exam') {
1.135     albertel  505: 	my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
                    506: 	if ($size != 0) {$size=$size*2; $size.=' mm';} else {$size='40 mm';}
1.257     onken     507: 	if ($env{'form.pdfFormFields'} eq 'yes'
                    508:             && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
1.246     onken     509:             my $fieldname = $env{'request.symb'}.
                    510:                                  '&part_'. $Apache::inputtags::part.
                    511:                                  '&textresponse'.
                    512:                                  '&HWVAL_' . $Apache::inputtags::response['-1'];
1.259     onken     513:             $result='\textField{'.$fieldname.'}{'.$size.'}{12 bp}';
1.246     onken     514:         } else {
                    515:             $result='\framebox['.$size.'][s]{\tiny\strut}';
                    516:         }
1.188     albertel  517:     } elsif ($target eq 'tex' 
                    518: 	     && $Apache::lonhomework::type eq 'exam'
                    519: 	     && &needs_exam_box($tagstack)) {
                    520: 	$result.=&exam_box($target);
1.135     albertel  521:     }
                    522:     return $result;
1.1       albertel  523: }
                    524: 
                    525: sub end_textline {
1.135     albertel  526:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    527:     if    ($target eq 'web') { $Apache::lonxml::evaluate++; }
                    528:     elsif ($target eq 'edit') { return ('','no'); }
1.208     albertel  529:     &end_input();
1.135     albertel  530:     return "";
1.9       albertel  531: }
                    532: 
1.98      albertel  533: sub start_hiddenline {
                    534:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    535:     my $result = "";
1.211     albertel  536:     my $input_id = &start_input($parstack,$safeeval);
1.98      albertel  537:     if ($target eq 'web') {
                    538: 	$Apache::lonxml::evaluate--;
                    539: 	if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    540: 	    my $partid=$Apache::inputtags::part;
                    541: 	    my $id=$Apache::inputtags::response[-1];
1.211     albertel  542: 	    my $oldresponse = $Apache::lonhomework::history{"resource.$partid.$id.submission"};
                    543: 	    if (ref($oldresponse) eq 'ARRAY') {
                    544: 		$oldresponse = $oldresponse->[$#Apache::inputtags::inputlist];
                    545: 	    }
                    546: 	    $oldresponse = &HTML::Entities::encode($oldresponse,'<>&"');
                    547: 
1.98      albertel  548: 	    if ($Apache::lonhomework::type ne 'exam') {
                    549: 		$result= '<input type="hidden" name="HWVAL_'.$id.'" value="'.
                    550: 		    $oldresponse.'" />';
                    551: 	    }
                    552: 	}
                    553:     } elsif ($target eq 'edit') {
                    554: 	$result=&Apache::edit::tag_start($target,$token);
                    555: 	$result.=&Apache::edit::end_table;
                    556:     }
1.189     albertel  557: 
                    558:     if ( ($target eq 'web' || $target eq 'tex')
                    559: 	 && $Apache::lonhomework::type eq 'exam'
                    560: 	 && &needs_exam_box($tagstack)) {
                    561: 	$result.=&exam_box($target);
                    562:     }
1.98      albertel  563:     return $result;
                    564: }
                    565: 
                    566: sub end_hiddenline {
1.135     albertel  567:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    568:     if    ($target eq 'web') { $Apache::lonxml::evaluate++; }
                    569:     elsif ($target eq 'edit') { return ('','no'); }
1.211     albertel  570:     &end_input();
1.135     albertel  571:     return "";
1.98      albertel  572: }
                    573: 
1.286     www       574: 
                    575: sub start_hiddensubmission {
                    576:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    577:     my $result = "";
                    578:     my $input_id = &start_input($parstack,$safeeval);
                    579:     if ($target eq 'web') {
                    580:         $Apache::lonxml::evaluate--;
                    581:         if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    582:             my $partid=$Apache::inputtags::part;
                    583:             my $id=$Apache::inputtags::response[-1];
                    584:             if ($Apache::lonhomework::type ne 'exam') {
                    585:                 my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
                    586:                 $value = &HTML::Entities::encode($value,'<>&"');
                    587:                 $result= '<input type="hidden" name="HWVAL_'.$id.'" value="'.$value.'" />';
                    588:             }
                    589:         }
                    590:     } elsif ($target eq 'edit') {
                    591:         $result=&Apache::edit::tag_start($target,$token);
                    592:         $result.=&Apache::edit::text_arg('Value:','value',$token,'15');
                    593:         $result.=&Apache::edit::end_row();
                    594:         $result.=&Apache::edit::end_table();
                    595:     } elsif ($target eq 'modified') {
                    596:         my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    597:                                                      $safeeval,'value');
                    598:         if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    599:     }
                    600: 
                    601:     if ( ($target eq 'web' || $target eq 'tex')
                    602:          && $Apache::lonhomework::type eq 'exam'
                    603:          && &needs_exam_box($tagstack)) {
                    604:         $result.=&exam_box($target);
                    605:     }
                    606:     return $result;
                    607: }
                    608: 
                    609: sub end_hiddensubmission {
                    610:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    611:     if    ($target eq 'web') { $Apache::lonxml::evaluate++; }
                    612:     elsif ($target eq 'edit') { return ('','no'); }
                    613:     &end_input();
                    614:     return "";
                    615: }
                    616: 
1.249     jms       617: =pod
                    618: 
                    619: =item file_selector()
                    620: 
                    621: $part -> partid
                    622: $id -> responseid
                    623: $uploadefiletypes -> comma seperated list of extensions allowed or * for any
1.252     raeburn   624: $which -> 'uploadonly'  -> only newly uploaded files
1.249     jms       625:           'portfolioonly' -> only allow files from portfolio
                    626:           'both' -> allow files from either location
                    627: $extratext -> additional text to go between the link and the input box
1.252     raeburn   628: $maxfilesize -> maximum cumulative filesize for submitted files (in MB).
1.249     jms       629: returns a table row <tr> 
                    630: 
                    631: =cut
                    632: 
1.160     albertel  633: sub file_selector {
1.252     raeburn   634:     my ($part,$id,$uploadedfiletypes,$which,$extratext,$maxfilesize)=@_;
1.160     albertel  635:     if (!$uploadedfiletypes) { return ''; }
1.167     albertel  636: 
                    637:     my $jspart=$part;
                    638:     $jspart=~s/\./_/g;
                    639: 
1.160     albertel  640:     my $result;
1.265     raeburn   641:     my $current_files_display = &current_file_submissions($part,$id);
                    642:     my $addfiles;
                    643:     if ($current_files_display) {
1.268     raeburn   644:         $result .= &Apache::lonhtmlcommon::row_title(&mt('Currently submitted files')).
1.265     raeburn   645:                    $current_files_display.
                    646:                    &Apache::lonhtmlcommon::row_closure();
                    647:         $addfiles = &mt('Submit other file(s)');
                    648:     } else {
                    649:         $addfiles = &mt('Choose file(s) to submit');
                    650:     }
                    651:     $result .= &Apache::lonhtmlcommon::row_title($addfiles);
                    652:     my $constraints;
                    653:     if ($uploadedfiletypes ne '*') {
                    654: 	$constraints =
                    655: 	    &mt('Allowed filetypes: [_1]','<b>'.$uploadedfiletypes.'</b>').'<br />';
                    656:     }
                    657:     if ($maxfilesize) {
1.319     bisitz    658:         $constraints .= &mt('Combined size of all files not to exceed: [_1] MB.',
1.265     raeburn   659:                         '<b>'.$maxfilesize.'</b>').'<br />';
                    660:     }
                    661:     if ($constraints) {
                    662:         $result .= $constraints.'<br />';
1.162     albertel  663:     }
1.160     albertel  664:     if ($which eq 'uploadonly' || $which eq 'both') { 
1.265     raeburn   665: 	$result.=&mt('Submit a file: (only one file per submission)').
1.160     albertel  666: 	    ' <br /><input type="file" size="50" name="HWFILE'.
1.293     raeburn   667: 	    $jspart.'_'.$id.'" id="HWFILE'.$jspart.'_'.$id.'" /><br />';
1.160     albertel  668:     }
1.265     raeburn   669:     if ( $which eq 'both') {
1.160     albertel  670: 	$result.='<br />'.'<strong>'.&mt('OR:').'</strong><br />';
                    671:     }
1.303     raeburn   672:     if ($which eq 'portfolioonly' || $which eq 'both') {
                    673:         my $symb = $env{'request.symb'};
                    674:         (undef,undef,my $res)=&Apache::lonnet::decode_symb($symb);
                    675:         my $showsymb;
                    676:         # If resource is a .task and URL is unencrypted, include symb in query string
                    677:         # for url opened in portfolio file selection window. Can be used to override
                    678:         # blocking of portfolio access resulting from an exam event in a different course. 
                    679:         if ($res =~ /\.task$/i) {
                    680:             my $encsymb = &Apache::lonenc::check_encrypt($symb);
                    681:             if ($symb eq $encsymb) {
                    682:                 $showsymb = $symb;
                    683:             }
                    684:         }
1.306     raeburn   685: 	$result.=$extratext.'<a href='."'".'javascript:void(window.open("/adm/portfolio?mode=selectfile&amp;fieldname='.$env{'form.request.prefix'}.'HWPORT'.$jspart.'_'.$id.'&amp;symb='.$showsymb.'","cat","height=600,width=800,scrollbars=1,resizable=1,menubar=2,location=1"))'."'".'>'.
1.265     raeburn   686: 	    &mt('Select Portfolio Files: (one or more files per submission)').'</a><br />'.
1.167     albertel  687: 	    '<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'.
1.160     albertel  688: 	    '<br />';
1.265     raeburn   689: 
1.160     albertel  690:     }
1.265     raeburn   691:     $result.=&Apache::lonhtmlcommon::row_closure(1);
1.160     albertel  692:     return $result;
                    693: }
                    694: 
1.265     raeburn   695: sub current_file_submissions {
1.205     albertel  696:     my ($part,$id) = @_;
1.265     raeburn   697:     my $jspart=$part;
                    698:     $jspart=~s/\./_/g;
1.270     raeburn   699:     my $uploadedfile=$Apache::lonhomework::history{"resource.$part.$id.uploadedfile"};
1.265     raeburn   700:     my $portfiles=$Apache::lonhomework::history{"resource.$part.$id.portfiles"};
                    701:     return if (($uploadedfile eq '') && ($portfiles !~/[^\s]/));
1.320     raeburn   702:     my $header = &portpath_popup_js().
                    703:                  &Apache::loncommon::start_data_table().
1.270     raeburn   704:                  &Apache::loncommon::start_data_table_header_row();
                    705:     if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    706:         $header .= '<th>'.&mt('Delete?').'</th>';
                    707:     }
1.271     raeburn   708:     $header .=   '<th>'.&mt('File').'</th>'.
1.265     raeburn   709:                  '<th>'.&mt('Size (MB)').'</th>'.
                    710:                  '<th>'.&mt('Last Modified').'</th>'.
                    711:                  &Apache::loncommon::end_data_table_header_row();
                    712:     my (undef,$crsid,$udom,$uname)=&Apache::lonnet::whichuser();
                    713:     my ($cdom,$cnum) = ($crsid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/);
1.271     raeburn   714:     my ($result,$header_shown,%okfiles,%rows,%legacy,@bad_file_list);
1.265     raeburn   715:     if ($uploadedfile) {
                    716:         my $url=$Apache::lonhomework::history{"resource.$part.$id.uploadedurl"};
1.270     raeburn   717:         my $link = &HTML::Entities::encode($url,'<>&"');
                    718:         my ($path,$name) = ($url =~ m{^(/uploaded/\Q$udom\E/\Q$uname\E/essayresponse.*/)([^/]+)$});
1.265     raeburn   719:         my ($status,$hashref,$error) =
1.270     raeburn   720:             &current_file_info($url,$link,$name,$path);
1.265     raeburn   721:         if ($status eq 'ok') {
                    722:             push(@{$okfiles{$name}},$url);
                    723:             $rows{$url} = $hashref;
1.271     raeburn   724:             $legacy{$url} = 1;
1.265     raeburn   725:             &Apache::lonxml::extlink($url);
                    726:             &Apache::lonnet::allowuploaded('/adm/essayresponse',$url);
                    727:         } else {
                    728:             push(@bad_file_list,$error);
                    729:         }
                    730:     }
                    731:     if ($portfiles =~ /[^\s]/) {
                    732:         my $prefix = "/uploaded/$udom/$uname/portfolio";
                    733:         foreach my $file (split(/\s*,\s*/,&unescape($portfiles))) {
                    734:             my ($path,$name) = ($file =~ m{^(.*/)([^/]+)$});
                    735:             my $url = $prefix.$path.$name;
                    736:             my $uploadedfile = &HTML::Entities::encode($url,'<>&"');
                    737:             my ($status,$hashref,$error) =
                    738:                 &current_file_info($url,$uploadedfile,$name,$path);
                    739:             if ($status eq 'ok') {
                    740:                 push(@{$okfiles{$name}},$url);
                    741:                 $rows{$url} = $hashref;
                    742:             } else {
                    743:                 push(@bad_file_list,$error);
                    744:             }
                    745:         }
                    746:     }
1.276     raeburn   747:     my $num = 0;
1.265     raeburn   748:     foreach my $name (sort(keys(%okfiles))) {
                    749:         if (ref($okfiles{$name}) eq 'ARRAY') {
                    750:             foreach my $url (@{$okfiles{$name}}) {
                    751:                 if (ref($rows{$url}) eq 'HASH') {
                    752:                     my $link = $rows{$url}{link};
                    753:                     my $portfile = $rows{$url}{path}.$rows{$url}{name};
                    754:                     $portfile = &HTML::Entities::encode($portfile,'<>&"');
                    755:                     if ($link) {
                    756:                         my $icon=&Apache::loncommon::icon($url);
                    757:                         unless ($header_shown) {
                    758:                             $result .= $header;
                    759:                             $header_shown = 1;
                    760:                         }
                    761:                         $result.=
1.270     raeburn   762:                             &Apache::loncommon::start_data_table_row()."\n";
                    763:                         if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    764:                             $result .=
                    765:                                  '<td valign="bottom"><input type="checkbox" name="HWFILE'.$jspart.'_'.$id.'_delete"'.
1.273     raeburn   766:                                  ' value="'.$portfile.'" id="HWFILE'.$jspart.'_'.$id.'_'.$num.'_delete" /></td>'."\n";
                    767:                             $num ++;
1.270     raeburn   768:                         }
1.320     raeburn   769:                         my $pathid = 'HWFILE'.$jspart.'_'.$id.'_'.$num.'_path';
                    770:                         my $pathidtext = $pathid.'text';
                    771:                         my ($showname,$showpath);
1.271     raeburn   772:                         if ($legacy{$url}) {
                    773:                             $showname = $name.' '.&mt('not in portfolio');
1.320     raeburn   774:                         } else {
                    775:                             $showname = $name;
                    776:                             $showpath = '<br />'. 
                    777:                                         '<span id="'.$pathidtext.'" class="LC_cusr_subheading">'.
                    778:                                         '<a href="javascript:showPortPath('."'$pathid','$pathidtext'".');" '.
                    779:                                         'class="LC_menubuttons_link">'.
                    780:                                         &mt('(Show path)').'</a></span>'.
                    781:                                         '<div id="'.$pathid.'" class="LC_dccid">'.$rows{$url}{path}.$name.
                    782: '</div>';
1.271     raeburn   783:                         }
1.270     raeburn   784:                         $result .= 
1.265     raeburn   785:                             '<td><a href="'.$link.'"><img src="'.$icon.
1.320     raeburn   786:                             '" border="0" alt="" />'.$showname.'</a>'.$showpath.'</td>'."\n".
1.265     raeburn   787:                             '<td align="right" valign="bottom">'.$rows{$url}{size}.'</td>'."\n".
                    788:                             '<td align="right" valign="bottom">'.$rows{$url}{lastmodified}.'</td>'."\n".
                    789:                             &Apache::loncommon::end_data_table_row();
                    790:                     }
                    791:                 }
                    792:             }
                    793:         }
                    794:     }
                    795:     if ($header_shown) {
1.307     raeburn   796:         $result .= &Apache::loncommon::end_data_table();
                    797:         if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    798:             $result .= '<br /><span class="LC_warning">'.
                    799:                        &mt('Exclude existing file(s) from grading by checking the "Delete?" checkbox(es) and clicking "Submit Answer"').'</span>';
                    800:         }
1.205     albertel  801:     }
                    802:     if (@bad_file_list) {
1.265     raeburn   803:         my $bad_files = '<span class="LC_filename">'.
                    804:             join('</span>, <span class="LC_filename">',@bad_file_list).
                    805:             '</span>';
                    806:         $result.='<p class="LC_error">'.
                    807:                  &mt("These file(s) don't exist: [_1]",$bad_files).
                    808:                  '</p>';
1.205     albertel  809:     }
                    810:     return $result;
1.265     raeburn   811: }
1.205     albertel  812: 
1.265     raeburn   813: sub current_file_info {
                    814:     my ($url,$uploadedfile,$name,$path) = @_;
                    815:     my ($status,$error,%info);
                    816:     my @stat = &Apache::lonnet::stat_file($url);
                    817:     if ((@stat) && ($stat[0] ne 'no_such_dir')) {
                    818:         my ($lastmod,$size);
                    819:         if ($stat[9] =~ /^\d+$/) {
                    820:             $lastmod = &Apache::lonlocal::locallocaltime($stat[9]);
                    821:         }
                    822:         $size = $stat[7]/(1024*1024);
                    823:         $size = sprintf("%.3f",$size);
                    824:         %info = (
                    825:                     link         => $uploadedfile,
                    826:                     name         => $name,
                    827:                     path         => $path,
                    828:                     size         => $size,
                    829:                     lastmodified => $lastmod,
                    830:                 );
                    831:         $status = 'ok';
                    832:     } else {
                    833:         &Apache::lonnet::logthis("bad file is $url");
                    834:         my $icon=&Apache::loncommon::icon($url);
                    835:         $error = '<a href="'.$url.'"><img src="'.$icon.
                    836:                  '" border="0" />'.$uploadedfile.'</a>';
                    837:     }
                    838:     return ($status,\%info,$error);
1.205     albertel  839: }
                    840: 
1.320     raeburn   841: sub portpath_popup_js {
                    842:     my %lt = &Apache::lonlocal::texthash(
                    843:                                           show => '(Show path)',
                    844:                                           hide => '(Hide)',
                    845:                                         );
                    846:     return <<"END";
                    847: <script type="text/javascript"> 
                    848: // <![CDATA[
                    849: 
                    850: function showPortPath(id,idtext) {
                    851:     document.getElementById(id).style.display='block';
                    852:     document.getElementById(id).style.textAlign='left';
                    853:     document.getElementById(id).style.textFace='normal';
                    854:     if (document.getElementById(idtext)) {
                    855:         document.getElementById(idtext).innerHTML ='<a href="javascript:hidePortPath(\\''+id+'\\',\\''+idtext+'\\'); '+
                    856:                                                    '"class="LC_menubuttons_link">$lt{'hide'}</a>&nbsp;';
                    857:     }
                    858:     return;
                    859: }
                    860: 
                    861: function hidePortPath(id,idtext) {
                    862:     if (document.getElementById(id)) {
                    863:         document.getElementById(id).style.display='none';
                    864:     }
                    865:     if (document.getElementById(idtext)) {
                    866:         document.getElementById(idtext).innerHTML ='<a href="javascript:showPortPath(\\''+id+'\\',\\''+idtext+'\\');" '+
                    867:                                                    'class="LC_menubuttons_link">$lt{'show'}</a>';
                    868:     }
                    869:     return;
                    870: }
                    871: 
                    872: // ]]>
                    873: </script>
                    874: 
                    875: END
                    876: }
                    877: 
1.179     albertel  878: sub valid_award {
                    879:     my ($award) =@_;
1.182     albertel  880:     foreach my $possibleaward ('EXTRA_ANSWER','MISSING_ANSWER', 'ERROR',
1.328   ! raeburn   881: 			       'NO_RESPONSE','WRONG_NUMBOXESCHECKED',
1.179     albertel  882: 			       'TOO_LONG', 'UNIT_INVALID_INSTRUCTOR',
                    883: 			       'UNIT_INVALID_STUDENT', 'UNIT_IRRECONCIBLE',
                    884: 			       'UNIT_FAIL', 'NO_UNIT',
                    885: 			       'UNIT_NOTNEEDED', 'WANTED_NUMERIC',
1.272     www       886: 			       'BAD_FORMULA', 'NOT_FUNCTION', 'WRONG_FORMAT', 
                    887:                                'INTERNAL_ERROR', 'SIG_FAIL', 'INCORRECT', 
1.179     albertel  888: 			       'MISORDERED_RANK', 'INVALID_FILETYPE',
1.264     raeburn   889:                                'EXCESS_FILESIZE', 'FILENAME_INUSE', 
                    890: 			       'DRAFT', 'SUBMITTED', 'SUBMITTED_CREDIT', 
1.261     raeburn   891:                                'ANONYMOUS', 'ANONYMOUS_CREDIT',
                    892:                                'ASSIGNED_SCORE', 'APPROX_ANS',
                    893: 			       'EXACT_ANS','COMMA_FAIL') {
1.179     albertel  894: 	if ($award eq $possibleaward) { return 1; }
                    895:     }
                    896:     return 0;
                    897: }
                    898: 
1.207     albertel  899: {
                    900:     my @awards = ('EXTRA_ANSWER', 'MISSING_ANSWER', 'ERROR', 'NO_RESPONSE',
1.328   ! raeburn   901: 		  'WRONG_NUMCHECKEDBOXES','TOO_LONG',
1.207     albertel  902: 		  'UNIT_INVALID_INSTRUCTOR', 'UNIT_INVALID_STUDENT',
                    903: 		  'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT',
1.272     www       904: 		  'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA',  'NOT_FUNCTION', 
                    905:                   'WRONG_FORMAT', 'INTERNAL_ERROR',
1.207     albertel  906: 		  'COMMA_FAIL', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK',
1.264     raeburn   907: 		  'INVALID_FILETYPE', 'EXCESS_FILESIZE', 'FILENAME_INUSE', 
                    908:                   'DRAFT', 'SUBMITTED',
1.261     raeburn   909:                   'SUBMITTED_CREDIT', 'ANONYMOUS', 'ANONYMOUS_CREDIT',
1.248     raeburn   910:                   'ASSIGNED_SCORE', 'APPROX_ANS', 'EXACT_ANS');
1.207     albertel  911:     my $i=0;
                    912:     my %fwd_awards = map { ($_,$i++) } @awards;
                    913:     my $max=scalar(@awards);
                    914:     @awards=reverse(@awards);
1.208     albertel  915:     $i=0;
1.207     albertel  916:     my %rev_awards = map { ($_,$i++) } @awards;
                    917: 
1.232     albertel  918: sub awarddetail_to_awarded {
                    919:     my ($awarddetail) = @_;
                    920:     if ($awarddetail eq 'EXACT_ANS'
                    921: 	|| $awarddetail eq 'APPROX_ANS') {
                    922: 	return 1;
                    923:     }
                    924:     return 0;
                    925: }
                    926: 
1.233     albertel  927: sub hide_award {
                    928:     my ($award) = @_;
                    929:     if (&Apache::lonhomework::show_no_problem_status()) {
                    930: 	return 1;
                    931:     }
                    932:     if ($award =~
1.261     raeburn   933: 	/^(?:EXACT_ANS|APPROX_ANS|SUBMITTED|SUBMITTED_CREDIT|ANONYMOUS|ANONYMOUS_CREDIT|ASSIGNED_SCORE|INCORRECT)/) {
1.233     albertel  934: 	return 1;
                    935:     }
                    936:     return 0;
                    937: }
                    938: 
1.9       albertel  939: sub finalizeawards {
1.232     albertel  940:     my ($awardref,$msgref,$nameref,$reverse,$final_scantron)=@_;
1.207     albertel  941:     my $result;
1.136     albertel  942:     if ($#$awardref == -1) { $result = "NO_RESPONSE"; }
1.135     albertel  943:     if ($result eq '' ) {
                    944: 	my $blankcount;
1.207     albertel  945: 	foreach my $award (@$awardref) {
1.135     albertel  946: 	    if ($award eq '') {
                    947: 		$result='MISSING_ANSWER';
                    948: 		$blankcount++;
                    949: 	    }
                    950: 	}
1.232     albertel  951: 	if ($blankcount == ($#$awardref + 1)) {
                    952: 	    return ('NO_RESPONSE');
                    953: 	}
1.135     albertel  954:     }
1.251     www       955: 
                    956:     if ($Apache::lonxml::internal_error) { $result='INTERNAL_ERROR'; }
                    957: 
1.232     albertel  958:     if (!$final_scantron && defined($result)) { return ($result); }
1.181     albertel  959: 
1.232     albertel  960:     # if in scantron mode, if the award for any response is 
                    961:     # assigned score, then the part gets an assigned score
                    962:     if ($final_scantron 
                    963: 	&& grep {$_ eq 'ASSIGNED_SCORE'} (@$awardref)) {
                    964: 	return ('ASSIGNED_SCORE');
                    965:     }
                    966: 
                    967:     # if in scantron mode, if the award for any response is 
                    968:     # correct and there are non-correct responses,
                    969:     # then the part gets an assigned score
                    970:     if ($final_scantron 
                    971: 	&& (grep { $_ eq 'EXACT_ANS' ||
                    972: 		   $_ eq 'APPROX_ANS'  } (@$awardref))
                    973: 	&& (grep { $_ ne 'EXACT_ANS' &&
                    974: 		   $_ ne 'APPROX_ANS'  } (@$awardref))) {
                    975: 	return ('ASSIGNED_SCORE');
                    976:     }
1.181     albertel  977:     # these awards are ordered from most important error through best correct
1.207     albertel  978:     my $awards = (!$reverse) ? \%fwd_awards : \%rev_awards ;
                    979: 
                    980:     my $best = $max;
                    981:     my $j=0;
                    982:     my $which;
                    983:     foreach my $award (@$awardref) {
                    984: 	if ($awards->{$award} < $best) {
                    985: 	    $best  = $awards->{$award};
                    986: 	    $which = $j;
                    987: 	}
                    988: 	$j++;
                    989:     }
1.232     albertel  990: 
1.207     albertel  991:     if (defined($which)) {
                    992: 	if (ref($nameref)) {
                    993: 	    return ($$awardref[$which],$$msgref[$which],$$nameref[$which]);
                    994: 	} else {
                    995: 	    return ($$awardref[$which],$$msgref[$which]);
                    996: 	}
1.135     albertel  997:     }
1.136     albertel  998:     return ('ERROR',undef);
1.9       albertel  999: }
1.207     albertel 1000: }
1.9       albertel 1001: 
1.10      albertel 1002: sub decideoutput {
1.325     raeburn  1003:     my ($award,$awarded,$awardmsg,$solved,$previous,$target,$nocorrect,$tdclass)=@_;
1.251     www      1004: 
1.135     albertel 1005:     my $message='';
                   1006:     my $button=0;
                   1007:     my $previousmsg;
1.221     albertel 1008:     my $css_class='orange';
1.148     albertel 1009:     my $added_computer_text=0;
1.221     albertel 1010:     my %possible_class =
                   1011: 	( 'correct'         => 'LC_answer_correct',
                   1012: 	  'charged_try'     => 'LC_answer_charged_try',
                   1013: 	  'not_charged_try' => 'LC_answer_not_charged_try',
                   1014: 	  'no_grade'        => 'LC_answer_no_grade',
                   1015: 	  'no_message'      => 'LC_no_message',
1.135     albertel 1016: 	  );
1.169     albertel 1017: 
1.180     albertel 1018:     my $part = $Apache::inputtags::part;
1.236     raeburn  1019:     my $tohandgrade = &Apache::lonnet::EXT("resource.$part.handgrade");
                   1020:     my $handgrade = ('yes' eq lc($tohandgrade)); 
1.282     www      1021: #
                   1022: # Should "Computer's Answer" be displayed?
                   1023: # Should not be displayed if still answerable,
                   1024: # if the problem is handgraded,
                   1025: # or if the problem does not give a correct answer
                   1026: #
1.180     albertel 1027:     
1.282     www      1028:     my $computer = ($handgrade || $nocorrect)? ''
1.203     www      1029: 	                       : " ".&mt("Computer's answer now shown above.");
1.180     albertel 1030:     &Apache::lonxml::debug("handgrade has :$handgrade:");
                   1031: 
1.135     albertel 1032:     if ($previous) { $previousmsg=&mt('You have entered that answer before'); }
                   1033:     
1.194     banghart 1034:     if ($solved =~ /^correct/) {
1.221     albertel 1035:         $css_class=$possible_class{'correct'};
1.170     albertel 1036: 	$message=&mt('You are correct.');
                   1037: 	if ($awarded < 1 && $awarded > 0) {
                   1038: 	    $message=&mt('You are partially correct.');
1.221     albertel 1039: 	    $css_class=$possible_class{'not_charged_try'};
1.170     albertel 1040: 	} elsif ($awarded < 1) {
                   1041: 	    $message=&mt('Incorrect.');
1.221     albertel 1042: 	    $css_class=$possible_class{'charged_try'};
1.170     albertel 1043: 	}
1.291     www      1044: 	if ($handgrade || 
                   1045:             ($env{'request.filename'}=~/\/res\/lib\/templates\/(examupload|DropBox).problem$/)) {
1.172     albertel 1046: 	    $message = &mt("A score has been assigned.");
                   1047: 	    $added_computer_text=1;
1.135     albertel 1048: 	} else {
1.172     albertel 1049: 	    if ($target eq 'tex') {
                   1050: 		$message = '\textbf{'.$message.'}';
                   1051: 	    } else {
                   1052: 		$message = "<b>".$message."</b>";
1.180     albertel 1053: 		$message.= $computer;
1.135     albertel 1054: 	    }
1.172     albertel 1055: 	    $added_computer_text=1;
1.235     albertel 1056: 	    if ($awarded > 0) {
                   1057: 		my ($symb) = &Apache::lonnet::whichuser();
                   1058: 		if (($symb ne '') 
                   1059: 		    &&
                   1060: 		    ($env{'course.'.$env{'request.course.id'}.
1.237     www      1061: 			      '.disable_receipt_display'} ne 'yes') &&
                   1062:                     ($Apache::lonhomework::type ne 'practice')) { 
1.235     albertel 1063: 		    $message.=(($target eq 'web')?'<br />':' ').
1.256     biermanm 1064: 			&mt('Your receipt no. is [_1]',
1.235     albertel 1065: 			    (&Apache::lonnet::receipt($Apache::inputtags::part).
                   1066: 			     (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
                   1067: 		}
1.135     albertel 1068: 	    }
                   1069: 	}
1.299     raeburn  1070:         if ($awarded >= 1) {
1.296     raeburn  1071:             $button=0;
1.299     raeburn  1072:         } elsif (&Apache::lonnet::EXT("resource.$part.retrypartial") !~/^1|on|yes$/i) {
1.296     raeburn  1073:             $button=0;
1.299     raeburn  1074:         } else {
1.296     raeburn  1075:             $button=1;
                   1076:         }
1.135     albertel 1077: 	$previousmsg='';
                   1078:     } elsif ($solved =~ /^excused/) {
                   1079: 	if ($target eq 'tex') {
                   1080: 	    $message = ' \textbf{'.&mt('You are excused from the problem.').'} ';
                   1081: 	} else {
                   1082: 	    $message = "<b>".&mt('You are excused from the problem.')."</b>";
                   1083: 	}
1.221     albertel 1084: 	$css_class=$possible_class{'charged_try'};
1.135     albertel 1085: 	$button=0;
                   1086: 	$previousmsg='';
                   1087:     } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {
                   1088: 	if ($solved =~ /^incorrect/ || $solved eq '') {
1.144     albertel 1089: 	    $message = &mt("Incorrect").".";
1.221     albertel 1090: 	    $css_class=$possible_class{'charged_try'};
1.135     albertel 1091: 	    $button=1;
                   1092: 	} else {
1.144     albertel 1093: 	    if ($target eq 'tex') {
                   1094: 		$message = '\textbf{'.&mt('You are correct.').'}';
                   1095: 	    } else {
                   1096: 		$message = "<b>".&mt('You are correct.')."</b>";
1.180     albertel 1097: 		$message.= $computer;
1.144     albertel 1098: 	    }
1.148     albertel 1099: 	    $added_computer_text=1;
1.235     albertel 1100: 	    if  ($awarded > 0 
                   1101: 		 && $env{'course.'.
1.165     albertel 1102: 			     $env{'request.course.id'}.
1.235     albertel 1103: 			     '.disable_receipt_display'} ne 'yes') { 
1.135     albertel 1104: 		$message.=(($target eq 'web')?'<br />':' ').
1.235     albertel 1105: 		    &mt('Your receipt is [_1]',
                   1106: 			(&Apache::lonnet::receipt($Apache::inputtags::part).
                   1107: 			 (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
1.135     albertel 1108: 	    }
1.221     albertel 1109: 	    $css_class=$possible_class{'correct'};
1.135     albertel 1110: 	    $button=0;
                   1111: 	    $previousmsg='';
                   1112: 	}
                   1113:     } elsif ($award eq 'NO_RESPONSE') {
                   1114: 	$message = '';
1.221     albertel 1115: 	$css_class=$possible_class{'no_feedback'};
1.135     albertel 1116: 	$button=1;
1.182     albertel 1117:     } elsif ($award eq 'EXTRA_ANSWER') {
                   1118: 	$message = &mt('Some extra items were submitted.');
1.221     albertel 1119: 	$css_class=$possible_class{'not_charged_try'};
1.182     albertel 1120: 	$button = 1;
1.135     albertel 1121:     } elsif ($award eq 'MISSING_ANSWER') {
1.245     bisitz   1122: 	$message = &mt('Some items were not submitted.');
                   1123:         if ($target ne 'tex') {
                   1124:            $message .= &Apache::loncommon::help_open_topic('Some_Items_Were_Not_Submitted');
                   1125:         }
1.221     albertel 1126: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1127: 	$button = 1;
1.328   ! raeburn  1128:     } elsif ($award eq 'WRONG_NUMBOXESCHECKED') {
        !          1129:         $message = &mt('Number of boxes checked outside permissible range (either too few or too many).');
        !          1130:         if ($target ne 'tex') {
        !          1131:            $message .= &Apache::loncommon::help_open_topic('Wrong_Num_Boxes_Checked');
        !          1132:         }
        !          1133:         $css_class=$possible_class{'not_charged_try'};
        !          1134:         $button = 1;
1.135     albertel 1135:     } elsif ($award eq 'ERROR') {
1.247     bisitz   1136: 	$message = &mt('An error occurred while grading your answer.');
1.221     albertel 1137: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1138: 	$button = 1;
                   1139:     } elsif ($award eq 'TOO_LONG') {
                   1140: 	$message = &mt("The submitted answer was too long.");
1.221     albertel 1141: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1142: 	$button=1;
                   1143:     } elsif ($award eq 'WANTED_NUMERIC') {
                   1144: 	$message = &mt("This question expects a numeric answer.");
1.221     albertel 1145: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1146: 	$button=1;
                   1147:     } elsif ($award eq 'MISORDERED_RANK') {
1.242     bisitz   1148:         $message = &mt('You have provided an invalid ranking.');
                   1149:         if ($target ne 'tex') {
                   1150:             $message.=' '.&mt('Please refer to [_1]',&Apache::loncommon::help_open_topic('Ranking_Problems',&mt('help on ranking problems')));
                   1151:         }
1.221     albertel 1152: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1153: 	$button=1;
1.248     raeburn  1154:     } elsif ($award eq 'EXCESS_FILESIZE') {
1.321     raeburn  1155:         $message = &mt("Submission won't be graded. The combined size of submitted files exceeded the amount allowed.");
1.248     raeburn  1156:         $css_class=$possible_class{'not_charged_try'};
                   1157:         $button=1;
1.264     raeburn  1158:     } elsif ($award eq 'FILENAME_INUSE') {
                   1159:         $message = &mt('You have already uploaded a file with that filename.');
                   1160:         if ($target eq 'tex') {
                   1161:             $message.= "\\\\\n";
                   1162:         } else {
                   1163:             $message .= '<br />';
                   1164:         }
1.315     bisitz   1165:         $message .= &mt('Please use a different filename.');
1.264     raeburn  1166:         $css_class=$possible_class{'not_charged_try'};
                   1167:         $button=1;
1.135     albertel 1168:     } elsif ($award eq 'INVALID_FILETYPE') {
1.255     bisitz   1169: 	$message = &mt("Submission won't be graded. The type of file submitted is not allowed.");
1.221     albertel 1170: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1171: 	$button=1;
                   1172:     } elsif ($award eq 'SIG_FAIL') {
1.145     albertel 1173: 	my ($used,$min,$max)=split(':',$awardmsg);
1.212     albertel 1174: 	my $word = ($used < $min) ? 'more' : 'fewer';
1.250     bisitz   1175: 	$message = &mt("Submission not graded. Use $word digits.",$used);
1.221     albertel 1176: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1177: 	$button=1;
1.137     albertel 1178:     } elsif ($award eq 'UNIT_INVALID_INSTRUCTOR') {
                   1179: 	$message = &mt('Error in instructor specifed unit. This error has been reported to the instructor.', $awardmsg);
                   1180: 	if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
1.221     albertel 1181: 	$css_class=$possible_class{'not_charged_try'};
1.137     albertel 1182: 	$button=1;
                   1183:     } elsif ($award eq 'UNIT_INVALID_STUDENT') {
1.155     albertel 1184: 	$message = &mt('Unable to interpret units. Computer reads units as "[_1]".',&markup_unit($awardmsg,$target));
1.137     albertel 1185: 	if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
1.221     albertel 1186: 	$css_class=$possible_class{'not_charged_try'};
1.137     albertel 1187: 	$button=1;
1.140     matthew  1188:     } elsif ($award eq 'UNIT_FAIL' || $award eq 'UNIT_IRRECONCIBLE') {
1.155     albertel 1189: 	$message = &mt('Incompatible units. No conversion found between "[_1]" and the required units.',&markup_unit($awardmsg,$target));
1.136     albertel 1190: 	if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
1.221     albertel 1191: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1192: 	$button=1;
                   1193:     } elsif ($award eq 'UNIT_NOTNEEDED') {
1.155     albertel 1194: 	$message = &mt('Only a number required. Computer reads units of "[_1]".',&markup_unit($awardmsg,$target));
1.221     albertel 1195: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1196: 	$button=1;
                   1197:     } elsif ($award eq 'NO_UNIT') {
1.144     albertel 1198: 	$message = &mt("Units required").'.';
1.135     albertel 1199: 	if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units')};
1.221     albertel 1200: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1201: 	$button=1;
1.153     albertel 1202:     } elsif ($award eq 'COMMA_FAIL') {
                   1203: 	$message = &mt("Proper comma separation is required").'.';
1.221     albertel 1204: 	$css_class=$possible_class{'not_charged_try'};
1.153     albertel 1205: 	$button=1;
1.135     albertel 1206:     } elsif ($award eq 'BAD_FORMULA') {
1.240     www      1207: 	$message = &mt("Unable to understand formula").'.';
                   1208:         if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Formula_Answers')};
1.221     albertel 1209: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1210: 	$button=1;
1.272     www      1211:     } elsif ($award eq 'NOT_FUNCTION') {
                   1212:         $message = &mt("Not a function").'.';
                   1213:         $css_class=$possible_class{'not_charged_try'};
                   1214:         $button=1;
                   1215:     } elsif ($award eq 'WRONG_FORMAT') {
                   1216:         $message = &mt("Wrong format").'.';
                   1217:         $css_class=$possible_class{'not_charged_try'};
                   1218:         $button=1;
                   1219:      } elsif ($award eq 'INTERNAL_ERROR') {
1.251     www      1220:         $message = &mt("An internal error occurred while processing your answer. Please try again later.");
                   1221:         $css_class=$possible_class{'not_charged_try'};
                   1222:         $button=1;
1.135     albertel 1223:     } elsif ($award eq 'INCORRECT') {
1.144     albertel 1224: 	$message = &mt("Incorrect").'.';
1.221     albertel 1225: 	$css_class=$possible_class{'charged_try'};
1.135     albertel 1226: 	$button=1;
                   1227:     } elsif ($award eq 'SUBMITTED') {
                   1228: 	$message = &mt("Your submission has been recorded.");
1.221     albertel 1229: 	$css_class=$possible_class{'no_grade'};
1.135     albertel 1230: 	$button=1;
1.261     raeburn  1231:     } elsif ($award eq 'SUBMITTED_CREDIT') {
                   1232:         $message = &mt("Your submission has been recorded, and credit awarded.");
                   1233:         $css_class=$possible_class{'correct'};
                   1234:         $button=1;
                   1235:     } elsif ($award eq 'ANONYMOUS') {
                   1236:         $message = &mt("Your anonymous submission has been recorded.");
                   1237:         $css_class=$possible_class{'no_grade'};
                   1238:         $button=1;
                   1239:     } elsif ($award eq 'ANONYMOUS_CREDIT') {
                   1240:         $message = &mt("Your anonymous submission has been recorded, and credit awarded.");
                   1241:         $css_class=$possible_class{'correct'};
1.301     raeburn  1242:         $button=1;
1.135     albertel 1243:     } elsif ($award eq 'DRAFT') {
1.258     riegler  1244: 	$message = &mt("Copy saved but not submitted.");
1.221     albertel 1245: 	$css_class=$possible_class{'not_charged_try'};
1.135     albertel 1246: 	$button=1;
                   1247:     } elsif ($award eq 'ASSIGNED_SCORE') {
1.144     albertel 1248: 	$message = &mt("A score has been assigned.");
1.221     albertel 1249: 	$css_class=$possible_class{'correct'};
1.135     albertel 1250: 	$button=0;
1.144     albertel 1251:     } elsif ($award eq '') {
1.186     albertel 1252: 	if ($handgrade && $Apache::inputtags::status[-1] eq 'SHOW_ANSWER') {
                   1253: 	    $message = &mt("Nothing submitted.");
1.221     albertel 1254: 	    $css_class=$possible_class{'charged_try'};
1.186     albertel 1255: 	} else {
1.221     albertel 1256: 	    $css_class=$possible_class{'not_charged_try'};
1.186     albertel 1257: 	}
1.144     albertel 1258: 	$button=1;
1.135     albertel 1259:     } else {
                   1260: 	$message = &mt("Unknown message").": $award";
                   1261: 	$button=1;
                   1262:     }
1.209     albertel 1263:     my (undef,undef,$domain,$user)=&Apache::lonnet::whichuser();
1.194     banghart 1264:     foreach my $resid(@Apache::inputtags::response){
                   1265:         if ($Apache::lonhomework::history{"resource.$part.$resid.handback"}) {
1.254     raeburn  1266:             if ($target eq 'tex') {
                   1267:                 $message.= "\\\\\n";
                   1268:             } else {
                   1269:                 $message.='<br />';
                   1270:             }
1.198     albertel 1271: 	    my @files = split(/\s*,\s*/,
                   1272: 			      $Apache::lonhomework::history{"resource.$part.$resid.handback"});
                   1273: 	    my $file_msg;
                   1274: 	    foreach my $file (@files) {
1.254     raeburn  1275:                 if ($target eq 'tex') {
                   1276:                     $file_msg.= "\\\\\n".$file;
                   1277:                 } else {
                   1278:                     $file_msg.= '<br /><a href="/uploaded/'."$domain/$user".'/'.$file.'">'.$file.'</a>';
                   1279:                 }
1.198     albertel 1280: 	    }
                   1281: 	    $message .= &mt('Returned file(s): [_1]',$file_msg);
1.254     raeburn  1282:             if ($target eq 'tex') {
                   1283:                 $message.= "\\\\\n";
                   1284:             } else {
                   1285:                 $message.='<br />';
                   1286:             }
1.198     albertel 1287: 	}
1.194     banghart 1288:     }
                   1289: 
1.233     albertel 1290:     if (&Apache::lonhomework::hide_problem_status()
                   1291: 	&& $Apache::inputtags::status[-1] ne 'SHOW_ANSWER'
                   1292: 	&& &hide_award($award)) {
1.304     raeburn  1293:         $message = &mt("Answer Submitted: Your final submission will be graded after the due date.");
                   1294:         my @interval= &Apache::lonnet::EXT("resource.$part.interval");
                   1295:         if ($interval[0] =~ /\d+/) {
                   1296:             my $first_access=&Apache::lonnet::get_first_access($interval[1]);
                   1297:             if (defined($first_access)) {
                   1298:                 my $due_date= &Apache::lonnet::EXT("resource.$part.duedate");
                   1299:                 unless (($due_date) && ($due_date < $first_access + $interval[0])) { 
                   1300:                     $message = &mt("Answer Submitted: Your final submission will be graded when the time limit is reached.");
                   1301:                 }
                   1302:             }
                   1303:         }
1.221     albertel 1304: 	$css_class=$possible_class{'no_grade'};
1.135     albertel 1305: 	$button=1;
                   1306:     }
1.148     albertel 1307:     if ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER' && 
1.150     albertel 1308: 	!$added_computer_text && $target ne 'tex') {
1.180     albertel 1309: 	$message.= $computer;
1.148     albertel 1310: 	$added_computer_text=1;
1.144     albertel 1311:     }
1.237     www      1312:     if ($Apache::lonhomework::type eq 'practice') {
1.244     raeburn  1313:        if ($target eq 'web') {
                   1314:            $message .= '<br />';
                   1315:        } else {
                   1316:            $message .= ' ';      
                   1317:        }
                   1318:        $message.=&mt('Submissions to practice problems are not permanently recorded.');
1.237     www      1319:     }
1.221     albertel 1320:     return ($button,$css_class,$message,$previousmsg);
1.12      albertel 1321: }
                   1322: 
1.155     albertel 1323: sub markup_unit {
                   1324:     my ($unit,$target)=@_;
                   1325:     if ($target eq 'tex') {
                   1326: 	return '\texttt{'.&Apache::lonxml::latex_special_symbols($unit).'}'; 
                   1327:     } else {
                   1328: 	return "<tt>".$unit."</tt>";
                   1329:     }
                   1330: }
                   1331: 
1.88      albertel 1332: sub removealldata {
1.87      albertel 1333:     my ($id)=@_;
                   1334:     foreach my $key (keys(%Apache::lonhomework::results)) {
                   1335: 	if (($key =~ /^resource\.\Q$id\E\./) && ($key !~ /\.collaborators$/)) {
                   1336: 	    &Apache::lonxml::debug("Removing $key");
                   1337: 	    delete($Apache::lonhomework::results{$key});
                   1338: 	}
                   1339:     }
                   1340: }
                   1341: 
1.142     albertel 1342: sub hidealldata {
                   1343:     my ($id)=@_;
                   1344:     foreach my $key (keys(%Apache::lonhomework::results)) {
                   1345: 	if (($key =~ /^resource\.\Q$id\E\./) && ($key !~ /\.collaborators$/)) {
                   1346: 	    &Apache::lonxml::debug("Hidding $key");
                   1347: 	    my $newkey=$key;
                   1348: 	    $newkey=~s/^(resource\.\Q$id\E\.[^\.]+\.)(.*)$/${1}hidden${2}/;
                   1349: 	    $Apache::lonhomework::results{$newkey}=
                   1350: 		$Apache::lonhomework::results{$key};
                   1351: 	    delete($Apache::lonhomework::results{$key});
                   1352: 	}
                   1353:     }
                   1354: }
                   1355: 
1.12      albertel 1356: sub setgradedata {
1.136     albertel 1357:     my ($award,$msg,$id,$previously_used) = @_;
1.154     albertel 1358:     if ($Apache::lonhomework::scantronmode && 
1.165     albertel 1359: 	&Apache::lonnet::validCODE($env{'form.CODE'})) {
                   1360: 	$Apache::lonhomework::results{"resource.CODE"}=$env{'form.CODE'};
1.154     albertel 1361:     } elsif ($Apache::lonhomework::scantronmode && 
1.165     albertel 1362: 	     $env{'form.CODE'} eq '' &&
1.154     albertel 1363: 	     $Apache::lonhomework::history{"resource.CODE"} ne '') {
                   1364: 	$Apache::lonhomework::results{"resource.CODE"}='';
1.141     albertel 1365:     }
1.154     albertel 1366: 
1.135     albertel 1367:     if (!$Apache::lonhomework::scantronmode &&
                   1368: 	$Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
                   1369: 	$Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
                   1370: 	$Apache::lonhomework::results{"resource.$id.afterduedate"}=$award;
1.87      albertel 1371: 	return '';
1.284     www      1372:     } elsif ( $Apache::lonhomework::history{"resource.$id.awarded"} < 1
1.233     albertel 1373: 	      || $Apache::lonhomework::scantronmode 
                   1374: 	      || &Apache::lonhomework::hide_problem_status()  ) {
1.154     albertel 1375:         # the student doesn't already have it correct,
                   1376: 	# or we are in a mode (scantron orno problem status) where a correct 
                   1377:         # can become incorrect
                   1378: 	# handle assignment of tries and solved status
1.135     albertel 1379: 	my $solvemsg;
                   1380: 	if ($Apache::lonhomework::scantronmode) {
                   1381: 	    $solvemsg='correct_by_scantron';
                   1382: 	} else {
                   1383: 	    $solvemsg='correct_by_student';
                   1384: 	}
                   1385: 	if ($Apache::lonhomework::history{"resource.$id.afterduedate"}) {
                   1386: 	    $Apache::lonhomework::results{"resource.$id.afterduedate"}='';
                   1387: 	}
                   1388: 	if ( $award eq 'ASSIGNED_SCORE') {
                   1389: 	    $Apache::lonhomework::results{"resource.$id.tries"} =
                   1390: 		$Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1391: 	    $Apache::lonhomework::results{"resource.$id.solved"} =
                   1392: 		$solvemsg;
                   1393: 	    my $numawards=scalar(@Apache::inputtags::response);
                   1394: 	    $Apache::lonhomework::results{"resource.$id.awarded"} = 0;
                   1395: 	    foreach my $res (@Apache::inputtags::response) {
1.232     albertel 1396: 		if (defined($Apache::lonhomework::results{"resource.$id.$res.awarded"})) {
                   1397: 		    $Apache::lonhomework::results{"resource.$id.awarded"}+=
                   1398: 			$Apache::lonhomework::results{"resource.$id.$res.awarded"};
                   1399: 		} else {
                   1400: 		    $Apache::lonhomework::results{"resource.$id.awarded"}+=
                   1401: 			&awarddetail_to_awarded($Apache::lonhomework::results{"resource.$id.$res.awarddetail"});
                   1402: 		}
1.135     albertel 1403: 	    }
                   1404: 	    if ($numawards > 0) {
                   1405: 		$Apache::lonhomework::results{"resource.$id.awarded"}/=
                   1406: 		    $numawards;
                   1407: 	    }
                   1408: 	} elsif ( $award eq 'APPROX_ANS' || $award eq 'EXACT_ANS' ) {
                   1409: 	    $Apache::lonhomework::results{"resource.$id.tries"} =
                   1410: 		$Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1411: 	    $Apache::lonhomework::results{"resource.$id.solved"} =
                   1412: 		$solvemsg;
                   1413: 	    $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
1.261     raeburn  1414:         } elsif ( $award eq 'SUBMITTED_CREDIT' ) {
                   1415:             $Apache::lonhomework::results{"resource.$id.tries"} =
                   1416:                 $Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1417:             $Apache::lonhomework::results{"resource.$id.solved"} =
                   1418:                 'credit_attempted';
                   1419:             $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
                   1420:         }  elsif ( $award eq 'ANONYMOUS_CREDIT' ) {
                   1421:             $Apache::lonhomework::results{"resource.$id.tries"} =
                   1422:                 $Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1423:             $Apache::lonhomework::results{"resource.$id.solved"} =
                   1424:                 'credit_attempted';
                   1425:             $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
1.135     albertel 1426: 	} elsif ( $award eq 'INCORRECT' ) {
                   1427: 	    $Apache::lonhomework::results{"resource.$id.tries"} =
                   1428: 		$Apache::lonhomework::history{"resource.$id.tries"} + 1;
1.233     albertel 1429: 	    if (&Apache::lonhomework::hide_problem_status()
                   1430: 		|| $Apache::lonhomework::scantronmode) {
1.135     albertel 1431: 		$Apache::lonhomework::results{"resource.$id.awarded"} = 0;
                   1432: 	    }
                   1433: 	    $Apache::lonhomework::results{"resource.$id.solved"} =
                   1434: 		'incorrect_attempted';
                   1435: 	} elsif ( $award eq 'SUBMITTED' ) {
                   1436: 	    $Apache::lonhomework::results{"resource.$id.tries"} =
                   1437: 		$Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1438: 	    $Apache::lonhomework::results{"resource.$id.solved"} =
                   1439: 		'ungraded_attempted';
1.261     raeburn  1440:         }  elsif ( $award eq 'ANONYMOUS' ) {
                   1441:             $Apache::lonhomework::results{"resource.$id.tries"} =
                   1442:                 $Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1443:             $Apache::lonhomework::results{"resource.$id.solved"} =
                   1444:                 'ungraded_attempted';
1.135     albertel 1445: 	} elsif ( $award eq 'DRAFT' ) {
                   1446: 	    $Apache::lonhomework::results{"resource.$id.solved"} = '';
                   1447: 	} elsif ( $award eq 'NO_RESPONSE' ) {
                   1448: 	    #no real response so delete any data that got stored
1.129     albertel 1449: 	    &removealldata($id);
                   1450: 	    return '';
                   1451: 	} else {
1.135     albertel 1452: 	    $Apache::lonhomework::results{"resource.$id.solved"} =
                   1453: 		'incorrect_attempted';
1.233     albertel 1454: 	    if (&Apache::lonhomework::show_no_problem_status()
                   1455: 		|| $Apache::lonhomework::scantronmode) {
1.135     albertel 1456: 		$Apache::lonhomework::results{"resource.$id.tries"} =
                   1457: 		    $Apache::lonhomework::history{"resource.$id.tries"} + 1;
                   1458: 		$Apache::lonhomework::results{"resource.$id.awarded"} = 0;
                   1459: 	    }
1.233     albertel 1460: 
                   1461: 	    if (&Apache::lonhomework::show_some_problem_status()) {
                   1462: 		# clear out the awarded if they had gotten it wrong/right
                   1463: 		# and are now in an error mode	
                   1464: 		$Apache::lonhomework::results{"resource.$id.awarded"} = '';
                   1465: 	    }
1.135     albertel 1466: 	}
1.136     albertel 1467: 	if (defined($msg)) {
                   1468: 	    $Apache::lonhomework::results{"resource.$id.awardmsg"} = $msg;
                   1469: 	}
1.135     albertel 1470: 	# did either of the overall awards chage? If so ignore the 
                   1471: 	# previous check
                   1472: 	if (($Apache::lonhomework::results{"resource.$id.awarded"} eq
                   1473: 	     $Apache::lonhomework::history{"resource.$id.awarded"}) &&
                   1474: 	    ($Apache::lonhomework::results{"resource.$id.solved"} eq
                   1475: 	     $Apache::lonhomework::history{"resource.$id.solved"})) {
                   1476: 	    # check if this was a previous submission if it was delete the
                   1477: 	    # unneeded data and update the previously_used attribute
                   1478: 	    if ( $previously_used eq 'PREVIOUSLY_USED') {
1.233     albertel 1479: 		if (&Apache::lonhomework::show_problem_status()) {
1.135     albertel 1480: 		    delete($Apache::lonhomework::results{"resource.$id.tries"});
                   1481: 		    $Apache::lonhomework::results{"resource.$id.previous"} = '1';
                   1482: 		}
                   1483: 	    } elsif ( $previously_used eq 'PREVIOUSLY_LAST') {
                   1484: 		#delete all data as they student didn't do anything, but save
                   1485: 		#the list of collaborators.
                   1486: 		&removealldata($id);
                   1487: 		#and since they didn't do anything we were never here
                   1488: 		return '';
                   1489: 	    } else {
                   1490: 		$Apache::lonhomework::results{"resource.$id.previous"} = '0';
                   1491: 	    }
1.101     albertel 1492: 	}
1.283     www      1493:     } elsif ( $Apache::lonhomework::history{"resource.$id.awarded"} == 1 ) {
1.135     albertel 1494: 	#delete all data as they student already has it correct
                   1495: 	&removealldata($id);
                   1496: 	#and since they didn't do anything we were never here
                   1497: 	return '';
1.40      albertel 1498:     }
1.135     albertel 1499:     $Apache::lonhomework::results{"resource.$id.award"} = $award;
1.184     albertel 1500:     if ($award eq 'SUBMITTED') {
                   1501: 	&Apache::response::add_to_gradingqueue();
                   1502:     }
1.288     www      1503:     $Apache::lonhomework::results{"resource.$id.type"} = $Apache::lonhomework::type;
1.289     www      1504:     $Apache::lonhomework::results{"resource.$id.duedate"} = &Apache::lonnet::EXT("resource.$id.duedate");
                   1505:     $Apache::lonhomework::results{"resource.$id.hinttries"} = &Apache::lonnet::EXT("resource.$id.hinttries");
1.290     www      1506:     $Apache::lonhomework::results{"resourse.$id.version"} = &Apache::lonnet::usedversion(); 
1.10      albertel 1507: }
                   1508: 
1.219     albertel 1509: sub find_which_previous {
                   1510:     my ($version) = @_;
                   1511:     my $part = $Apache::inputtags::part;
                   1512:     my (@previous_version);
                   1513:     foreach my $resp (@Apache::inputtags::response) {
                   1514: 	my $key = "$version:resource.$part.$resp.submission";
                   1515: 	my $submission = $Apache::lonhomework::history{$key};
                   1516: 	my %previous = &Apache::response::check_for_previous($submission,
                   1517: 							     $part,$resp,
                   1518: 							     $version);
                   1519: 	push(@previous_version,$previous{'version'});
                   1520:     }
                   1521:     return &previous_match(\@previous_version,
                   1522: 			   scalar(@Apache::inputtags::response));
                   1523: }
                   1524: 
                   1525: sub previous_match {
                   1526:     my ($previous_array,$count) = @_;
                   1527:     my $match = 0;
                   1528:     my @matches;
                   1529:     foreach my $versionar (@$previous_array) {
                   1530: 	foreach my $version (@$versionar) {
                   1531: 	    $matches[$version]++;
                   1532: 	}
                   1533:     }
                   1534:     my $which=0;
                   1535:     foreach my $elem (@matches) {
                   1536: 	if ($elem eq $count) {
                   1537: 	    $match=1;
                   1538: 	    last;
                   1539: 	}
                   1540: 	$which++;
                   1541:     }
                   1542:     return ($match,$which);
                   1543: }
                   1544: 
1.9       albertel 1545: sub grade {
1.135     albertel 1546:     my ($target) = @_;
                   1547:     my $id = $Apache::inputtags::part;
                   1548:     my $response='';
1.165     albertel 1549:     if ( defined $env{'form.submitted'}) {
1.136     albertel 1550: 	my (@awards,@msgs);
1.135     albertel 1551: 	foreach $response (@Apache::inputtags::response) {
                   1552: 	    &Apache::lonxml::debug("looking for response.$id.$response.awarddetail");
                   1553: 	    my $value=$Apache::lonhomework::results{"resource.$id.$response.awarddetail"};
                   1554: 	    &Apache::lonxml::debug("keeping $value from $response for $id");
                   1555: 	    push (@awards,$value);
1.136     albertel 1556: 	    $value=$Apache::lonhomework::results{"resource.$id.$response.awardmsg"};
                   1557: 	    &Apache::lonxml::debug("got message $value from $response for $id");
                   1558: 	    push (@msgs,$value);
1.135     albertel 1559: 	}
1.232     albertel 1560: 	my ($finalaward,$msg) = 
                   1561: 	    &finalizeawards(\@awards,\@msgs,undef,undef,
                   1562: 			    $Apache::lonhomework::scantronmode);
1.135     albertel 1563: 	my $previously_used;
                   1564: 	if ( $#Apache::inputtags::previous eq $#awards ) {
1.219     albertel 1565: 	    my ($match) =
                   1566: 		&previous_match(\@Apache::inputtags::previous_version,
                   1567: 				scalar(@Apache::inputtags::response));
1.244     raeburn  1568: 
1.135     albertel 1569: 	    if ($match) {
                   1570: 		$previously_used = 'PREVIOUSLY_LAST';
                   1571: 		foreach my $value (@Apache::inputtags::previous) {
                   1572: 		    if ($value eq 'PREVIOUSLY_USED' ) {
                   1573: 			$previously_used = $value;
                   1574: 			last;
                   1575: 		    }
1.75      albertel 1576: 		}
                   1577: 	    }
1.43      albertel 1578: 	}
1.136     albertel 1579: 	&Apache::lonxml::debug("final award $finalaward, $previously_used, message $msg");
                   1580: 	&setgradedata($finalaward,$msg,$id,$previously_used);
1.43      albertel 1581:     }
1.135     albertel 1582:     return '';
1.1       albertel 1583: }
                   1584: 
1.217     albertel 1585: sub get_grade_messages {
1.325     raeburn  1586:     my ($id,$prefix,$target,$status,$nocorrect,$tdclass) = @_;
1.282     www      1587: # nocorrect suppresses "Computer's answer now shown above"
1.217     albertel 1588:     my ($message,$latemessage,$trystr,$previousmsg);
                   1589:     my $showbutton = 1;
                   1590: 
                   1591:     my $award = $Apache::lonhomework::history{"$prefix.award"};
                   1592:     my $awarded = $Apache::lonhomework::history{"$prefix.awarded"};
                   1593:     my $solved = $Apache::lonhomework::history{"$prefix.solved"};
                   1594:     my $previous = $Apache::lonhomework::history{"$prefix.previous"};
                   1595:     my $awardmsg = $Apache::lonhomework::history{"$prefix.awardmsg"};
                   1596:     &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg");
                   1597:     if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {
                   1598: 	&Apache::lonxml::debug('Getting message');
1.221     albertel 1599: 	($showbutton,my $css_class,$message,$previousmsg) =
1.217     albertel 1600: 	    &decideoutput($award,$awarded,$awardmsg,$solved,$previous,
1.325     raeburn  1601: 			  $target,(($status eq 'CAN_ANSWER') || $nocorrect),$tdclass);
1.217     albertel 1602: 	if ($target eq 'tex') {
                   1603: 	    $message='\vskip 2 mm '.$message.' ';
                   1604: 	} else {
1.325     raeburn  1605: 	    $message="<td class=\"$tdclass $css_class\">$message</td>";
1.217     albertel 1606: 	    if ($previousmsg) {
1.325     raeburn  1607: 		$previousmsg="<td class=\"$tdclass LC_answer_previous\">$previousmsg</td>";
1.217     albertel 1608: 	    }
                   1609: 	}
                   1610:     }
                   1611:     my $tries = $Apache::lonhomework::history{"$prefix.tries"};
                   1612:     my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                   1613:     &Apache::lonxml::debug("got maxtries of :$maxtries:");
                   1614:     #if tries are set to negative turn off the Tries/Button and messages
                   1615:     if (defined($maxtries) && $maxtries < 0) { return ''; }
                   1616:     if ( $tries eq '' ) { $tries = '0'; }
                   1617:     if ( $maxtries eq '' ) { $maxtries = '2'; } 
                   1618:     if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; } 
1.292     christia 1619:     my $tries_text= &get_tries_text();
1.217     albertel 1620:     if ($showbutton) {
                   1621: 	if ($target eq 'tex') {
                   1622: 	    if ($env{'request.state'} ne "construct"
                   1623: 		&& $Apache::lonhomework::type ne 'exam'
                   1624: 		&& $env{'form.suppress_tries'} ne 'yes') {
1.292     christia 1625: 		$trystr ='{\vskip 1 mm \small '
                   1626:                         .&mt('[_1]'.$tries_text.'[_2] [_3]'
                   1627: 				,'\textit{','}',$tries.'/'.$maxtries ) 
                   1628:                         .'} \vskip 2 mm';
1.217     albertel 1629: 	    } else {
                   1630: 		$trystr = '\vskip 0 mm ';
                   1631: 	    }
                   1632: 	} else {
1.292     christia 1633: 	    my $trial =$tries;
1.217     albertel 1634: 	    if ($Apache::lonhomework::parsing_a_task) {
                   1635: 	    } elsif($env{'request.state'} ne 'construct') {
1.292     christia 1636: 		$trial.="/".&Apache::lonhtmlcommon::direct_parm_link($maxtries,$env{'request.symb'},'maxtries',$id,$target);
1.217     albertel 1637: 	    } else {
                   1638: 		if (defined($Apache::inputtags::params{'maxtries'})) {
1.292     christia 1639: 		    $trial.="/".$Apache::inputtags::params{'maxtries'};
1.217     albertel 1640: 		}
                   1641: 	    }
1.325     raeburn  1642: 	    $trystr = '<td class="'.$tdclass.'"><span class="LC_nobreak">'.&mt($tries_text.' [_1]',$trial).'</span></td>';
1.217     albertel 1643: 	}
                   1644:     }
1.221     albertel 1645: 
1.217     albertel 1646:     if ($Apache::lonhomework::history{"$prefix.afterduedate"}) {
                   1647: 	#last submissions was after due date
                   1648: 	$latemessage=&mt(' The last submission was after the Due Date ');;
                   1649: 	if ($target eq 'web') {
1.325     raeburn  1650: 	    $latemessage='<td class="'.$tdclass.' LC_answer_late">'.$latemessage.'</td>';
1.217     albertel 1651: 	}
                   1652:     }
                   1653:     return ($previousmsg,$latemessage,$message,$trystr,$showbutton);
                   1654: }
                   1655: 
1.11      albertel 1656: sub gradestatus {
1.223     albertel 1657:     my ($id,$target,$no_previous) = @_;
1.135     albertel 1658:     my $showbutton = 1;
                   1659:     my $message = '';
                   1660:     my $latemessage = '';
                   1661:     my $trystr='';
                   1662:     my $button='';
                   1663:     my $previousmsg='';
1.325     raeburn  1664:     my $tdclass='';
1.135     albertel 1665: 
                   1666:     my $status = $Apache::inputtags::status['-1'];
                   1667:     &Apache::lonxml::debug("gradestatus has :$status:");
1.183     albertel 1668:     if ( $status ne 'CLOSED' 
                   1669: 	 && $status ne 'UNAVAILABLE' 
                   1670: 	 && $status ne 'INVALID_ACCESS' 
                   1671: 	 && $status ne 'NEEDS_CHECKIN' 
1.300     raeburn  1672: 	 && $status ne 'NOT_IN_A_SLOT'
                   1673:          && $status ne 'RESERVABLE'
                   1674:          && $status ne 'RESERVABLE_LATER'
                   1675:          && $status ne 'NOTRESERVABLE') {
1.217     albertel 1676: 
1.305     raeburn  1677: 	if ($status eq 'SHOW_ANSWER') {
                   1678:             $showbutton = 0;
                   1679:         }
                   1680: 
1.325     raeburn  1681:         unless (($status eq 'SHOW_ANSWER') || ($status eq 'CANNOT_ANSWER')) {
                   1682:             if ($target ne 'tex') {
                   1683:                 $tdclass = 'LC_status_submit_'.$id;
                   1684:             }
                   1685:         }
                   1686: 
1.217     albertel 1687: 	($previousmsg,$latemessage,$message,$trystr) =
                   1688: 	    &get_grade_messages($id,"resource.$id",$target,$status,
1.325     raeburn  1689: 				$showbutton,$tdclass);
1.305     raeburn  1690: 	if ($status eq 'CANNOT_ANSWER') {
1.217     albertel 1691: 	    $showbutton = 0;
1.164     albertel 1692: 	}
1.218     albertel 1693: 	if ( $status eq 'SHOW_ANSWER') {
                   1694: 	    undef($previousmsg);
                   1695: 	}
1.325     raeburn  1696: 	if ( $showbutton ) {
1.135     albertel 1697: 	    if ($target ne 'tex') {
1.230     albertel 1698: 		$button = 
1.262     www      1699:             '<input onmouseup="javascript:setSubmittedPart(\''.$id.'\');this.form.action+=\'#'.&escape($id).'\';"
1.325     raeburn  1700:                     type="submit" name="submit_'.$id.'" id="submit_'.$id.'" class="LC_hwk_submit"
                   1701:                     value="'.&mt('Submit Answer').'" />&nbsp;'.
                   1702:                     '<div id="msg_submit_'.$id.'" style="display:none">'.
                   1703:                     &mt('Processing your submission ...').'</div>';
1.135     albertel 1704: 	    }
                   1705: 	}
1.217     albertel 1706: 
1.135     albertel 1707:     }
                   1708:     my $output= $previousmsg.$latemessage.$message.$trystr;
                   1709:     if ($output =~ /^\s*$/) {
                   1710: 	return $button;
1.63      sakharuk 1711:     } else {
1.135     albertel 1712: 	if ($target eq 'tex') {
                   1713: 	    return $button.' \vskip 0 mm '.$output.' ';
                   1714: 	} else {
1.223     albertel 1715: 	    $output =
                   1716: 		'<table><tr><td>'.$button.'</td>'.$output;
                   1717: 	    if (!$no_previous) {
1.325     raeburn  1718: 		$output.='<td class="'.$tdclass.'">'.&previous_tries($id,$target).'</td>';
1.223     albertel 1719: 	    }
                   1720: 	    $output.= '</tr></table>';
                   1721: 	    return $output;
1.135     albertel 1722: 	}
1.63      sakharuk 1723:     }
1.11      albertel 1724: }
1.217     albertel 1725: 
                   1726: sub previous_tries {
                   1727:     my ($id,$target) = @_;
                   1728:     my $output;
                   1729:     my $status = $Apache::inputtags::status['-1'];
1.219     albertel 1730: 
                   1731:     my $count;
                   1732:     my %count_lookup;
1.274     raeburn  1733:     my $lastrndseed;
1.318     raeburn  1734:     my $numstamps = 0;
1.219     albertel 1735: 
1.217     albertel 1736:     foreach my $i (1..$Apache::lonhomework::history{'version'}) {
                   1737: 	my $prefix = $i.":resource.$id";
1.263     raeburn  1738:         my $is_anon; 
                   1739:         if (defined($env{'form.grade_symb'})) {
                   1740:             if (($Apache::lonhomework::history{"$prefix.type"} eq 'anonsurvey') || 
                   1741:                 ($Apache::lonhomework::history{"$prefix.type"} eq 'anonsurveycred')) {
                   1742:                 $is_anon = 1;
                   1743:             }
                   1744:         }
1.217     albertel 1745: 	next if (!exists($Apache::lonhomework::history{"$prefix.award"}));
1.219     albertel 1746: 	$count++;
                   1747: 	$count_lookup{$i} = $count;
1.274     raeburn  1748:         my $curr_rndseed = $Apache::lonhomework::history{"$prefix.rndseed"};
1.217     albertel 1749: 	my ($previousmsg,$latemessage,$message,$trystr);
                   1750: 
                   1751: 	($previousmsg,$latemessage,$message,$trystr) =
                   1752: 	    &get_grade_messages($id,"$prefix",$target,$status);
                   1753: 
1.219     albertel 1754: 	if ($previousmsg ne '') {
                   1755: 	    my ($match,$which) = &find_which_previous($i);
                   1756: 	    $message=$previousmsg;
                   1757: 	    my $previous = $count_lookup{$which};
1.226     albertel 1758: 	    $message =~ s{(</td>)}{ as submission \# $previous $1};
1.221     albertel 1759: 	} elsif ($Apache::lonhomework::history{"$prefix.tries"}) {
1.233     albertel 1760: 	    if (!(&Apache::lonhomework::hide_problem_status()
1.225     albertel 1761: 		  && $Apache::inputtags::status[-1] ne 'SHOW_ANSWER')
                   1762: 		&& $Apache::lonhomework::history{"$prefix.solved"} =~/^correct/
                   1763: 		) {
                   1764: 		
1.238     bisitz   1765:                 my $txt_correct = &mt('Correct');
1.279     raeburn  1766:                 my $awarded = $Apache::lonhomework::history{"$prefix.awarded"};
                   1767:                 if ($awarded < 1 && $awarded > 0) {
1.280     raeburn  1768:                     $txt_correct=&mt('Partially Correct');
1.279     raeburn  1769:                 } elsif ($awarded < 1) {
                   1770:                     if ($awarded eq '') {
                   1771:                         $txt_correct='';
                   1772:                     } else {
                   1773:                         $txt_correct=&mt('Incorrect');
                   1774:                     }
                   1775:                 }
1.221     albertel 1776: 		$message =~ s{(<td.*?>)(.*?)(</td>)}
1.238     bisitz   1777:                              {$1 <strong>$txt_correct</strong>. $3}s;
1.221     albertel 1778: 	    }
1.238     bisitz   1779:             my $trystr = "(".&mt('Try [_1]',$Apache::lonhomework::history{"$prefix.tries"}).")";
1.294     raeburn  1780:             if (($curr_rndseed || $lastrndseed) && ($i > 1)) {
1.274     raeburn  1781:                 if ($curr_rndseed ne $lastrndseed) {
                   1782:                     $trystr .= '<br /><span style="color: green; white-space: nowrap; font-style: italic; font-weight: bold; font-size: 80%;">'.&mt('New problem variation this try.').'</span>';
                   1783:                 }
                   1784:             } 
1.221     albertel 1785: 	    $message =~ s{(</td>)}{ $trystr $1};
1.219     albertel 1786: 	}
1.221     albertel 1787: 	my ($class) = ($message =~ m{<td.*class="([^"]*)"}); #"
                   1788: 	$message =~ s{(<td.*?>)}{<td>};
                   1789: 	
1.219     albertel 1790: 
1.318     raeburn  1791: 	$output .= '<tr class="'.$class.'">'.
                   1792: 	           '<td align="center">'.$count.'</td>'.$message;
                   1793:         if ((!$is_anon) && ($Apache::lonhomework::history{"$prefix.tries"}) &&
                   1794:             ($Apache::lonhomework::history{"$prefix.award"} ne 'ASSIGNED_SCORE') &&
                   1795:             ($Apache::lonhomework::history{$i.':timestamp'})) {
                   1796:             $output .= '<td>'.&Apache::lonlocal::locallocaltime(
                   1797:                              $Apache::lonhomework::history{$i.':timestamp'}).'</td>';
                   1798:             $numstamps ++;
                   1799:         } else {
                   1800:             $output .= '<td></td>';
                   1801:         }
1.217     albertel 1802: 	foreach my $resid (@Apache::inputtags::response) {
                   1803: 	    my $prefix = $prefix.".$resid";
                   1804: 	    if (exists($Apache::lonhomework::history{"$prefix.submission"})) {
                   1805: 		my $submission =
                   1806: 		    $Apache::inputtags::submission_display{"$prefix.submission"};
                   1807: 		if (!defined($submission)) {
                   1808: 		    $submission = 
                   1809: 			$Apache::lonhomework::history{"$prefix.submission"};
                   1810: 		}
1.263     raeburn  1811:                 if ($is_anon) {
                   1812:                     $output.='<td>'.&mt('(only shown to submitter)').'</td>';
                   1813:                 } else {
                   1814: 		    $output.='<td>'.$submission.'</td>';
                   1815:                 }
1.217     albertel 1816: 	    } else {
                   1817: 		$output.='<td></td>';
                   1818: 	    }
                   1819: 	}
1.221     albertel 1820: 	$output.=&Apache::loncommon::end_data_table_row()."\n";
1.274     raeburn  1821:         $lastrndseed = $curr_rndseed;
1.217     albertel 1822:     }
                   1823:     return if ($output eq '');
1.318     raeburn  1824:     my $headers = '<tr>'.
                   1825:                   '<th>'.&mt('Submission #').'</th>'.
                   1826:                   '<th>'.&mt('Try').'</th><th>';
                   1827:     if ($numstamps) {
                   1828:         $headers .= &mt('When');
                   1829:     }
                   1830:     $headers .= '</th>';
                   1831:     my $colspan = scalar(@Apache::inputtags::response);
                   1832:     if ($colspan > 1) {
                   1833:         $headers .= '<th colspan="'.$colspan.'">';
                   1834:     } else {
                   1835:         $headers .= '<th>';
                   1836:     }
                   1837:     $headers .= &mt('Submitted Answer').'</th></tr>';
1.298     www      1838:     $output ='<table class="LC_prior_tries">'.$headers.$output.'</table>';
1.226     albertel 1839: 
1.263     raeburn  1840:     my $tries_text = &get_tries_text('link');
1.231     albertel 1841:     my $prefix = $env{'form.request.prefix'};
                   1842:     $prefix =~ tr{.}{_};
                   1843:     my $function_name = "LONCAPA_previous_tries_".$prefix.
1.234     albertel 1844: 	$Apache::lonxml::curdepth.'_'.$env{'form.counter'};
1.298     www      1845:     my $result = &Apache::loncommon::modal_adhoc_window($function_name,420,410,$output,&mt($tries_text))."<br />";
1.217     albertel 1846:     return $result;
                   1847: }
                   1848: 
1.263     raeburn  1849: sub get_tries_text {
                   1850:     my ($context) = @_;
                   1851:     my $tries_text;
                   1852:     if ($context eq 'link') {
                   1853:         $tries_text = 'Previous Tries';
                   1854:     } else {
                   1855:         $tries_text = 'Tries';
                   1856:     }
                   1857:     if ( $Apache::lonhomework::type eq 'survey' ||
                   1858:          $Apache::lonhomework::type eq 'surveycred' ||
                   1859:          $Apache::lonhomework::type eq 'anonsurvey' ||
                   1860:          $Apache::lonhomework::type eq 'anonsurveycred' ||
                   1861:          $Apache::lonhomework::parsing_a_task) {
                   1862:         if ($context eq 'link') {
                   1863:             $tries_text = 'Previous Submissions';
                   1864:         } else {
                   1865:             $tries_text = 'Submissions';
                   1866:         }
                   1867:     }
                   1868:     return $tries_text;
                   1869: }
                   1870: 
1.314     raeburn  1871: sub spelling_languages {
                   1872:     my %langchoices;
                   1873:     foreach my $id (&Apache::loncommon::languageids()) {
                   1874:         my $code = &Apache::loncommon::supportedlanguagecode($id);
                   1875:         if ($code ne '') {
                   1876:             $langchoices{$code} =  &Apache::loncommon::plainlanguagedescription($id);
                   1877:         }
                   1878:     }
                   1879:     my @spelllangs = ('none');
                   1880:     foreach my $code ('en','de','he','es','fr','pt','tr') {
                   1881:         push(@spelllangs,[$code,$langchoices{$code}]);
                   1882:     }
                   1883:     return \@spelllangs;
                   1884: }
                   1885: 
1.1       albertel 1886: 1;
                   1887: __END__
1.249     jms      1888: 
                   1889: =pod
                   1890: 
                   1891: =back
                   1892: 
                   1893: =cut
1.43      albertel 1894:  

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.