--- loncom/homework/imageresponse.pm 2007/08/29 10:07:42 1.84 +++ loncom/homework/imageresponse.pm 2007/09/25 23:16:13 1.85 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # image click response style # -# $Id: imageresponse.pm,v 1.84 2007/08/29 10:07:42 foxr Exp $ +# $Id: imageresponse.pm,v 1.85 2007/09/25 23:16:13 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -132,9 +132,9 @@ sub whichfoils { sub prep_image { my ($image,$mode,$name)=@_; - my $part=$Apache::inputtags::part; - my $respid=$Apache::inputtags::response['-1']; - my ($x,$y)=split(/:/,$Apache::lonhomework::history{"resource.$part.$respid.submission"}); + + my ($x,$y)= &get_submission($name); + &Apache::lonxml::debug("for $name drawing click at $x and $y"); &draw_image($mode,$image,$x,$y,$Apache::response::foilgroup{"$name.area"}); } @@ -211,10 +211,9 @@ sub draw_image { sub displayfoils { my ($target,@whichopt) = @_; my $result =''; - my $name; my $temp=1; my @images; - foreach $name (@whichopt) { + foreach my $name (@whichopt) { $result.=$Apache::response::foilgroup{"$name.text"}; &Apache::lonxml::debug("Text is $result"); if ($target eq 'tex') {$result.="\\vskip 0 mm \n";} else {$result.="
\n";} @@ -236,31 +235,45 @@ sub displayfoils { if ($target eq 'tex') { $result.=$Apache::response::foilgroup{"$name.image"}."\\vskip 0 mm \n"; } else { - my $id=$Apache::inputtags::response['-1']; - my $token=&prep_image($image); - my $temp=1; - $result.="
\n"; + my $respid=$Apache::inputtags::response['-1']; + my $token=&prep_image($image,'submission',$name); + my $id = "HWVAL_$respid:$temp"; + $result.=''. + '
'. + ''. + ''; } } $temp++; } if ($target eq 'web') { &Apache::response::setup_prior_tries_hash(\&format_prior_response, - [\@images]); + [\@images,\@whichopt]); } return $result; } sub format_prior_response { my ($mode,$answer,$other_data) = @_; - my ($x,$y)=split(/:/,$answer); - my $images = $other_data->[0]; - - my $token = &draw_image('submission',$images->[0],$x,$y); - - return ""; + my $result; + + # make a copy of the data in the refs + my @images = @{ $other_data->[0] }; + my @foils = @{ $other_data->[1] }; + foreach my $name (@foils) { + my $image = pop(@images); + my ($x,$y) = &get_submission($name,$answer); + my $token = &draw_image('submission',$image,$x,$y); + $result .= + '
'; + } + return $result; } sub display_answers { @@ -313,13 +326,12 @@ sub gradefoils { return; } - my $x; - my $y; - my $result; + my @results; my $temp=1; + my %response; foreach my $name (@whichopt) { - $x=$env{"form.HWVAL_$id:$temp.x"}; - $y=$env{"form.HWVAL_$id:$temp.y"}; + my ($x,$y) = split(':',$env{"form.HWVAL_$id:$temp"}); + $response{$name} = $env{"form.HWVAL_$id:$temp"}; &Apache::lonxml::debug("Got a x of $x and a y of $y for $name"); if (defined($x) && defined($y) && defined(@{ $Apache::response::foilgroup{"$name.area"} })) { @@ -340,23 +352,53 @@ sub gradefoils { if ($grade eq 'APPROX_ANS') { last; } } &Apache::lonxml::debug("Foil was $grade"); - if ($grade eq 'INCORRECT') { $result= 'INCORRECT'; } - if (($grade eq 'APPROX_ANS') && ($result ne 'APPROX_ANS')) { $result=$grade; } - &Apache::lonxml::debug("Question is $result"); - $temp++; + push(@results, $grade) + } else { + push(@results, 'MISSING_ANSWER') } + $temp++; } - my $responsestr="$x:$y"; + my ($result) = &Apache::inputtags::finalizeawards(\@results,[]); + &Apache::lonxml::debug("Question is $result"); + my $part=$Apache::inputtags::part; - my %previous=&Apache::response::check_for_previous($responsestr,$part,$id); + my %previous= + &Apache::response::check_for_previous(&stringify_submission(\%response), + $part,$id); if ($result && $Apache::lonhomework::type eq 'survey') { $result='SUBMITTED'; } &Apache::response::handle_previous(\%previous,$result); - $Apache::lonhomework::results{"resource.$part.$id.submission"}=$responsestr; + $Apache::lonhomework::results{"resource.$part.$id.submission"}= + &stringify_submission(\%response); $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$result; return; } +sub stringify_submission { + my ($response) = @_; + return + join("\0",map {$_."\1".$response->{$_}} (sort(keys(%{ $response })))); + +} + +sub get_submission { + my ($name,$string) = @_; + + if (!defined($string)) { + my $part=$Apache::inputtags::part; + my $respid=$Apache::inputtags::response['-1']; + $string = + $Apache::lonhomework::history{"resource.$part.$respid.submission"}; + } + + if ($string !~ /\0/) { + return split(':',$string); + } else { + my %response = map { split("\1",$_,2) } (split("\0",$string)); + return split(':',$response{$name}); + } +} + sub end_foilgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result='';