--- loncom/homework/radiobuttonresponse.pm	2001/11/07 22:28:44	1.27
+++ loncom/homework/radiobuttonresponse.pm	2001/12/14 23:00:52	1.33
@@ -1,5 +1,30 @@
 # The LearningOnline Network with CAPA
 # mutliple choice style responses
+#
+# $Id: radiobuttonresponse.pm,v 1.33 2001/12/14 23:00:52 albertel Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
 # 2/21 Guy
 
 package Apache::radiobuttonresponse;
@@ -40,6 +65,7 @@ sub end_radiobuttonresponse {
   if ($target eq 'edit') { $result=&Apache::edit::end_table(); }
   &Apache::response::end_response;
   pop @Apache::lonxml::namespace;
+  &Apache::lonxml::deregister('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup'));
   return $result;
 }
 
@@ -52,27 +78,54 @@ sub start_foilgroup {
 }
 
 sub storesurvey {
-  if ( defined $ENV{'form.submitted'}) {
-    my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']};
-    &Apache::lonxml::debug("Here I am!:$response:");
-    if ( $response =~ /[^\s]/) {
-      my $id = $Apache::inputtags::response['-1'];
-      $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$response;
-      $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='SUBMITTED';
-      &Apache::lonxml::debug("submitted a $response<br />\n");
-    }
-  }
+  if ( !defined($ENV{'form.submitted'})) { return ''; }
+  my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']};
+  &Apache::lonxml::debug("Here I am!:$response:");
+  if ( $response !~ /[0-9]+/) { return ''; }
+  my $id = $Apache::inputtags::response['-1'];
+  my @whichfoils=@{ $Apache::response::foilgroup{'names'} };
+  my %responsehash;
+  $responsehash{$whichfoils[$response]}=$response;
+  $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=&Apache::lonnet::hash2str(%responsehash);
+  $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='SUBMITTED';
+  &Apache::lonxml::debug("submitted a $response<br />\n");
   return '';
 }
 
+sub grade_response {
+  my ($max,$answer)=@_;
+  if (!defined($ENV{'form.submitted'})) { return; }
+  my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']};
+  if ( $response !~ /[0-9]+/) { return; }
+  my $part=$Apache::inputtags::part;
+  my $id = $Apache::inputtags::response['-1'];
+  my @whichfoils=&whichfoils($max,$answer);
+  my %responsehash;
+  $responsehash{$whichfoils[$response]}=$response;
+  my $responsestr=&Apache::lonnet::hash2str(%responsehash);
+  my %previous=&Apache::response::check_for_previous($responsestr,
+						     $part,$id);
+  $Apache::lonhomework::results{"resource.$part.$id.submission"}=
+    $responsestr;
+  &Apache::lonxml::debug("submitted a $response<br />\n");
+  my $ad;
+  if ($response == $answer) {
+    $ad='EXACT_ANS';
+  } else {
+    $ad='INCORRECT';
+  }
+  $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
+  &Apache::response::handle_previous(\%previous,$ad);
+}
+
 sub end_foilgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
-  
+
   my $result;
-  if ($target eq 'grade' || $target eq 'web') {
-    my $style = &Apache::lonxml::get_param('style',$parstack,$safeeval,'-2');
+  if ($target eq 'grade' || $target eq 'web' || $target eq 'answer') {
+    my $style = $Apache::lonhomework::type;
     if ( $style eq 'survey' ) {
-      if ($target eq 'web') {
+      if ($target eq 'web' || $target eq 'answer') {
 	$result=&displayallfoils();
       } elsif ( $target eq 'grade' ) {
 	$result=&storesurvey();
@@ -87,20 +140,10 @@ sub end_foilgroup {
       &Apache::lonxml::debug("Answer is $answer, $count from $max, $falsecnt");
       if ($target eq 'web') {
 	$result=&displayfoils($max,$answer);
+      } elsif ($target eq 'answer' ) {
+	$result=&displayanswers($max,$answer);
       } elsif ( $target eq 'grade') {
-	if ( defined $ENV{'form.submitted'}) {
-	  my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']};
-	  if ( $response =~ /[^\s]/) {
-	    my $id = $Apache::inputtags::response['-1'];
-	    $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$response;
-	    &Apache::lonxml::debug("submitted a $response<br />\n");
-	    if ($response == $answer) {
-	      $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='EXACT_ANS';
-	    } else {
-	      $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='INCORRECT';
-	    }
-	  }
-	}
+	&grade_response($max,$answer);
       }
     }
   }
@@ -133,10 +176,12 @@ sub displayallfoils {
   my $id=$Apache::inputtags::response['-1'];
   my $part=$Apache::inputtags::part;
   my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
+  my %lastresponse=&Apache::lonnet::str2hash($lastresponse);
+  &Apache::lonhomework::showhash(%lastresponse);
   foreach my $name (@names) {
     if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') {
       $result.="<br /><input type=\"radio\" name=\"HWVAL$Apache::inputtags::response['-1']\" value=\"$temp\" ";
-      if ($lastresponse eq $temp) { $result .= 'checked="on"'; }
+      if (defined($lastresponse{$name})) { $result .= 'checked="on"'; }
       $result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</input>\n";
       $temp++;
     }
@@ -144,15 +189,14 @@ sub displayallfoils {
   return $result;
 }
 
-sub displayfoils {
+sub whichfoils {
   my ($max,$answer)=@_;
-  my @names = @{ $Apache::response::foilgroup{'names'} };
+
   my @truelist;
   my @falselist;
-  my $result;
-  my $name;
 
-  foreach $name (@names) {
+  my @names = @{ $Apache::response::foilgroup{'names'} };
+  foreach my $name (@names) {
     #result.="<br /><b>$name</b> is <i> $Apache::response::foilgroup{$name.'.value'} </i>";
     if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
       push (@truelist,$name);
@@ -176,8 +220,16 @@ sub displayfoils {
   }
   splice(@whichfalse,$answer,0,$truelist[$whichtrue]);
   &Apache::lonxml::debug("the true statement is $answer");
+  return @whichfalse;
+}
+
+sub displayfoils {
+  my ($max,$answer)=@_;
+  my $result;
+
+  my @whichfoils=&whichfoils($max,$answer);
   if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
-    foreach $name (@whichfalse) {
+    foreach my $name (@whichfoils) {
       $result.="<br />";
       if ($Apache::response::foilgroup{$name.'.value'} eq 'true') { 
 	$result.='Correct';
@@ -191,9 +243,10 @@ sub displayfoils {
     my $id=$Apache::inputtags::response['-1'];
     my $part=$Apache::inputtags::part;
     my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
-    foreach $name (@whichfalse) {
+    my %lastresponse=&Apache::lonnet::str2hash($lastresponse);
+    foreach my $name (@whichfoils) {
        $result.="<br /><input type=\"radio\" name=\"HWVAL$Apache::inputtags::response['-1']\" value=\"$temp\" ";
-      if ($lastresponse eq $temp) { $result .= 'checked="on"'; }
+      if (defined($lastresponse{$name})) { $result .= 'checked="on"'; }
       $result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</input>\n";
       $temp++;
     }
@@ -201,6 +254,19 @@ sub displayfoils {
   return $result."<br />";
 }
 
+sub displayanswers {
+  my ($max,$answer)=@_;
+  my @names = @{ $Apache::response::foilgroup{'names'} };
+  my @whichopt = &whichfoils($max,$answer);
+  my $result=&Apache::response::answer_header('radiobuttonresponse');
+  foreach my $name (@whichopt) {
+    $result.=&Apache::response::answer_part('radiobuttonresponse',
+		     $Apache::response::foilgroup{$name.'.value'})
+  }
+  $result.=&Apache::response::answer_footer('radiobuttonresponse');
+  return $result;
+}
+
 sub start_conceptgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   $Apache::radiobuttonresponse::conceptgroup=1;
@@ -222,10 +288,10 @@ sub end_conceptgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   $Apache::radiobuttonresponse::conceptgroup=0;
   my $result;
-  if ($target eq 'web' || $target eq 'grade') {
+  if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ) {
     if (defined(@{ $Apache::response::conceptgroup{'names'} })) {
       my @names = @{ $Apache::response::conceptgroup{'names'} };
-      my $pick=int rand $#names+1;
+      my $pick=int(rand($#names+1));
       my $name=$names[$pick];
       push @{ $Apache::response::foilgroup{'names'} }, $name;
       $Apache::response::foilgroup{"$name.text"} =  $Apache::response::conceptgroup{"$name.text"};
@@ -254,7 +320,7 @@ sub start_foil {
     $result=&Apache::edit::tag_start($target,$token);
     $result.=&Apache::edit::text_arg('Name:','name',$token);
     $result.=&Apache::edit::select_arg('Correct Option:','value',
-				       ['true','false'],$token,'15');
+				       ['unused','true','false'],$token);
   } elsif ($target eq 'modified') {
      my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
 						  'value','name');
@@ -267,7 +333,7 @@ sub end_foil {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $text='';
   if ($target eq 'web') { $text=&Apache::lonxml::endredirection; }
-  if ($target eq 'web' || $target eq 'grade') {
+  if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ) {
     my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
     if ($value ne 'unused') {
       my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);