--- loncom/homework/radiobuttonresponse.pm 2005/10/11 20:02:31 1.104 +++ loncom/homework/radiobuttonresponse.pm 2007/06/20 21:43:59 1.117 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.104 2005/10/11 20:02:31 albertel Exp $ +# $Id: radiobuttonresponse.pm,v 1.117 2007/06/20 21:43:59 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,6 +31,9 @@ use strict; use HTML::Entities(); use Apache::lonlocal; use Apache::lonnet; +use Apache::response; + +my $bubbles_per_line = 10; BEGIN { &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse')); @@ -39,6 +42,7 @@ BEGIN { sub start_radiobuttonresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + #when in a radiobutton response use these &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup')); push (@Apache::lonxml::namespace,'radiobuttonresponse'); @@ -143,7 +147,44 @@ sub grade_response { if ( !&Apache::response::submitted() ) { return; } my $response; if ($env{'form.submitted'} eq 'scantron') { - $response=&Apache::response::getresponse(); + # Need to know how many foils we have so that I know how many + # bubble lines to consume: + + my $numfoils = scalar @whichfoils; + my $bubble_lines = int($numfoils / $bubbles_per_line); + if (($numfoils % $bubbles_per_line) != 0) { + $bubble_lines++; # Partial line of bubbles too. + } + # Get an array of the lines... note offsets seem to go from 1??... + + my @responses; + for (my $i = 1; $i <= $bubble_lines; $i++) { + my $this_line = &Apache::response::getresponse($i); + push(@responses, $this_line); + + } + # Update the lonxml::counter so that the next problem + # Gets the right set of answers: + + &Apache::lonxml::increment_counter($bubble_lines-1); + + # This code assumes that unbubbled lines will be + # give empties. while bubbled lines nonblank. + + my $answer_line; + my $answer_value = ''; # By default no answer given... + my $num_bubbled_lines=0; + for (my $line_number = 0; $line_number < $bubble_lines; $line_number++) { + if ($responses[$line_number] ne "") { + $answer_line = $line_number; + $answer_value = $responses[$line_number]; + last; + } + } + + $response = $answer_line * $bubbles_per_line + $answer_value; + + } else { $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; } @@ -179,7 +220,7 @@ sub end_foilgroup { $safeeval,'-2'); if ( $style eq 'survey' && $target ne 'analyze') { if ($target eq 'web' || $target eq 'tex') { - $result=&displayallfoils($direction); + $result=&displayallfoils($direction, $target); } elsif ( $target eq 'answer' ) { $result=&displayallanswers(); } elsif ( $target eq 'grade' ) { @@ -206,7 +247,13 @@ sub end_foilgroup { ('true','false')); } } + $Apache::lonxml::post_evaluate=0; + } + if ($target eq 'web') { + &Apache::response::setup_prior_tries_hash(\&format_prior_answer, + [\%Apache::response::foilgroup]); } + &Apache::response::poprandomnumber(); &Apache::lonxml::increment_counter(); return $result; @@ -230,12 +277,26 @@ sub getfoilcounts { return ($truecnt,$falsecnt); } +sub format_prior_answer { + my ($mode,$answer,$other_data) = @_; + my $foil_data = $other_data->[0]; + my %response = &Apache::lonnet::str2hash($answer); + my ($name) = keys(%response); + return '<span class="LC_prior_radiobutton">'. + $foil_data->{$name.'.text'}.'</span>'; + +} + sub displayallfoils { - my ($direction)=@_; + my ($direction, $target)=@_; my $result; &Apache::lonxml::debug("survey style display"); - my @names = @{ $Apache::response::foilgroup{'names'} }; + my @names; + if ( $Apache::response::foilgroup{'names'} ) { + @names= @{ $Apache::response::foilgroup{'names'} }; + } my $temp=0; + my $i =0; my $id=$Apache::inputtags::response['-1']; my $part=$Apache::inputtags::part; my $lastresponse= @@ -245,19 +306,27 @@ sub displayallfoils { if (&Apache::response::show_answer() ) { foreach my $name (@names) { if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') { - if ($direction eq 'horizontal') { + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.="<td>"; } else { - $result.="<br />"; + if ($target eq 'tex') { + $result .= '\item \vskip -2mm '; + } else { + $result.="<br />"; + } } if (defined($lastresponse{$name})) { - $result.='<b>'; + if ($target eq 'tex') { + $result .= '}'; + } else { + $result.='<b>'; + } } $result .= $Apache::response::foilgroup{$name.'.text'}; - if (defined($lastresponse{$name})) { + if (defined($lastresponse{$name}) && ($target ne 'tex')) { $result.='</b>'; } - if ($direction eq 'horizontal') { $result.="</td>"; } + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.="</td>"; } } } } else { @@ -266,19 +335,36 @@ sub displayallfoils { if ($direction eq 'horizontal') { $result.="<td>"; } else { - $result.="<br />"; + if ($target eq 'tex') { + $result .= '\item \vskip -2mm '; + } else { + $result.="<br />"; + } + } + if ($target eq 'tex') { + $result .= '$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs + $i++; + } else { + $result .= '<label>'; + $result.="<input + onchange=\"javascript:setSubmittedPart('$part');\" + type=\"radio\" + name=\"HWVAL_$Apache::inputtags::response['-1']\" + value=\"$temp\" "; + if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } + $result .= ' />'.$Apache::response::foilgroup{$name.'.text'}. + '</label>'; } - $result .= '<label>'; - $result.="<input type=\"radio\" name=\"HWVAL_$Apache::inputtags::response['-1']\" value=\"$temp\" "; - if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } - $result .= '>'.$Apache::response::foilgroup{$name.'.text'}. - '</label>'; $temp++; - if ($direction eq 'horizontal') { $result.="</td>"; } + if ($target ne 'tex') { + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.="</td>"; } + } else { + $result.='\vskip 0 mm '; + } } } } - if ($direction eq 'horizontal') { $result.='</tr></table>'; } + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.='</tr></table>'; } return $result; } @@ -464,6 +550,7 @@ sub displayfoils { } else { my @alphabet = ('A'..'Z'); my $i = 0; + my $bubble_number = 0; my $temp=0; my $id=$Apache::inputtags::response['-1']; my $part=$Apache::inputtags::part; @@ -482,13 +569,24 @@ sub displayfoils { } if ($target ne 'tex') { $result.= '<label>'; - $result.="<input type=\"radio\" name=\"HWVAL_$Apache::inputtags::response['-1']\" value=\"$temp\" "; + $result.= + "<input type=\"radio\" + onchange=\"javascript:setSubmittedPart('$part');\" + name=\"HWVAL_$Apache::inputtags::response['-1']\" + value=\"$temp\" "; if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } - $result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</label>"; + $result .= ' />'.$Apache::response::foilgroup{$name.'.text'}."</label>"; } else { if ($Apache::lonhomework::type eq 'exam') { $result .= '{\small \textbf{'.$alphabet[$i].'}}$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs $i++; + $bubble_number++; + if($bubble_number >= $bubbles_per_line) { + $i = 0; + $bubble_number = 0; + &Apache::lonxml::increment_counter(1); + $result.='\item[\textbf{'.$Apache::lonxml::counter.'}.]'; + } } else { $result .= '\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'}; } @@ -507,7 +605,10 @@ sub displayfoils { } sub displayallanswers { - my @names = @{ $Apache::response::foilgroup{'names'} }; + my @names; + if ( $Apache::response::foilgroup{'names'} ) { + @names= @{ $Apache::response::foilgroup{'names'} }; + } my $result=&Apache::response::answer_header('radiobuttonresponse'); foreach my $name (@names) { @@ -522,10 +623,15 @@ sub displayanswers { my ($max,$randomize)=@_; my ($answer,@whichopt) = &whichfoils($max,$randomize); my $result=&Apache::response::answer_header('radiobuttonresponse'); + if ($Apache::lonhomework::type eq 'exam') { + my $correct = ('A'..'Z')[$answer]; + $result.=&Apache::response::answer_part('radiobuttonresponse', + $correct); + } foreach my $name (@whichopt) { $result.=&Apache::response::answer_part('radiobuttonresponse', - $Apache::response::foilgroup{$name.'.value'}) - } + $Apache::response::foilgroup{$name.'.value'}); + } $result.=&Apache::response::answer_footer('radiobuttonresponse'); return $result; }