--- loncom/homework/radiobuttonresponse.pm	2001/02/05 18:19:28	1.11
+++ loncom/homework/radiobuttonresponse.pm	2001/08/06 19:36:27	1.21
@@ -1,171 +1,281 @@
-# The LearningOnline Network with CAPA
-# mutliple choice style responses
+# The LON-CAPA radio button response handler
+#
+# Multiple choice style responses
+#
+# YEAR=2001
+# 1/8,1/11,1/12,1/15,1/19,2/5,2/19,2/21,2/22,3/1,4/23,5/4,5/31 Guy Albertelli
+# 6/1,6/2 Guy Albertelli
+# 8/6 Scott Harrison
 
 package Apache::radiobuttonresponse;
 use strict;
 
+# ======================================================================= BEGIN
 sub BEGIN {
-  &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse'));
+  &Apache::lonxml::register('Apache::radiobuttonresponse',
+			    ('radiobuttonresponse'));
 }
 
+# ================================================= Start radio button response
 sub start_radiobuttonresponse {
-  my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
+  my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   #when in a radiobutton response use these
-  &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil'));
+  &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil',
+							   'conceptgroup'));
   my $id = &Apache::response::start_response($parstack,$safeeval);
   return '';
 }
 
+# =================================================== End radio button response
 sub end_radiobuttonresponse {
-  &Apache::response::end_response;
-  return '';
+    &Apache::response::end_response;
+    return '';
 }
 
-%Apache::response::foilgroup={};
+%Apache::response::foilgroup = {};
+# ============================================================ Start foil group
 sub start_foilgroup {
-  %Apache::response::foilgroup={};
-  return '';
+    %Apache::response::foilgroup = {};
+    $Apache::radiobuttonresponse::conceptgroup = 0;
+    &Apache::response::setrandomnumber();
+    return '';
 }
 
-sub setrandomnumber {
-  my $rndseed=&Apache::lonnet::rndseed();
-  $rndseed=unpack("%32i",$rndseed);
-  $rndseed=$rndseed
-    +&Apache::lonnet::numval($Apache::inputtags::part)
-      +&Apache::lonnet::numval($Apache::inputtags::response['-1']);
-  srand($rndseed);
-  return '';
+# ================================================================ Store survey
+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");
+	}
+    }
+    return '';
 }
 
+# ======================================= End foil group (return scalar string)
 sub end_foilgroup {
-  my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
-  
-  my $result;
-  if ($target ne 'meta') {
-    my $name;
-    &setrandomnumber();
-    my ($truecnt,$falsecnt,$max) = &getfoilcounts($parstack,$safeeval);
-    my $count=0;
-    # we will add in 1 of the true statements
-    if (($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; }
-    my $answer = int(rand ($count));
-    &Apache::lonxml::debug("Answer is $answer, $count from $max, $falsecnt");
-    if ($target eq 'web') {
-      $result=&displayfoils($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';
-	  }
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
+    my $result;
+    if ($target ne 'meta') {
+	my $style = &Apache::lonxml::get_param('style',$parstack,$safeeval,
+					       '-2');
+	if ( $style eq 'survey' ) {
+	    if ($target eq 'web') {
+		$result = &displayallfoils();
+	    } elsif ( $target eq 'grade' ) {
+		$result = &storesurvey();
+	    }
+	} else {
+	    my $name;
+	    my ($truecnt,$falsecnt,$max) = &getfoilcounts($parstack,$safeeval);
+	    my $count = 0;
+	    # we will add in 1 of the true statements
+	    if (($falsecnt+1) > $max) { $count = $max } else {
+		$count = $falsecnt+1; }
+	    my $answer = int(rand ($count));
+	    &Apache::lonxml::debug("Answer is $answer, $count from $max, $falsecnt");
+	    if ($target eq 'web') {
+		$result=&displayfoils($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';
+ 			}
+		    }
+		}
+	    }
 	}
-      }
     }
-  }
-  return $result;
+    return $result;
 }
 
+# ==================================== Get foil counts (return 3 element array)
 sub getfoilcounts {
-  my ($parstack,$safeeval)=@_;
-  my $rrargs ='';
-  if ( $#$parstack > 0 ) { $rrargs=$$parstack['-2']; }
-  my $max = &Apache::run::run("{$rrargs;".'return $max}',$safeeval);
-  my @names = @{ $Apache::response::foilgroup{'names'} };
-  my $truecnt=0;
-  my $falsecnt=0;
-  my $name;
-
-  foreach $name (@names) {
-    if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
-      $truecnt++;
-    } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') {
-      $falsecnt++;
+    my ($parstack,$safeeval)=@_;
+    my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
+    my @names = @{ $Apache::response::foilgroup{'names'} };
+    my $truecnt = 0;
+    my $falsecnt = 0;
+    my $name;
+    foreach $name (@names) {
+	if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
+	    $truecnt++;
+	} elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') {
+	    $falsecnt++;
+	}
     }
-  }
-  return ($truecnt,$falsecnt,$max);
+    return ($truecnt,$falsecnt,$max);
+}
+
+# ==================================== Display all foils (return scalar string)
+sub displayallfoils {
+    my $result;
+    &Apache::lonxml::debug("survey style display");
+    my @names = @{ $Apache::response::foilgroup{'names'} };
+    my $temp = 0;
+    my $id = $Apache::inputtags::response['-1'];
+    my $part = $Apache::inputtags::part;
+    my $lastresponse = $Apache::lonhomework::history{"resource.$part.$id.".
+						   "submission"};
+    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"'; }
+	    $result .= '>'.$Apache::response::foilgroup{$name.'.text'}.
+		       "</input>\n";
+	    $temp++;
+	}
+    }
+    return $result;
 }
 
+# ======================================== Display foils (return scalar string)
 sub displayfoils {
-  my ($max,$answer)=@_;
-  my @names = @{ $Apache::response::foilgroup{'names'} };
-  my @truelist;
-  my @falselist;
-  my $result;
-  my $name;
-
-  foreach $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);
-    } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') {
-      push (@falselist,$name);
-    } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'unused') {
-    } else {
-      &Apache::lonxml::error("Unknown state $Apache::response::foilgroup{$name.'.value'} for $name in <foilgroup>");
+    my ($max,$answer) = @_;
+    my @names = @{ $Apache::response::foilgroup{'names'} };
+    my @truelist;
+    my @falselist;
+    my $result;
+    my $name;
+    foreach $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);
+	} elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') {
+	    push (@falselist,$name);
+	} elsif ($Apache::response::foilgroup{$name.'.value'} eq 'unused') {
+	} else {
+	    &Apache::lonxml::error("Unknown state ".
+				  $Apache::response::foilgroup{$name.'.value'}.
+				  " for $name in <foilgroup>");
+	}
     }
-  }
-  my $whichtrue = rand $#truelist;
-  &Apache::lonxml::debug("Max is $max, From $#truelist elms, picking $whichtrue");
-  my @whichfalse =();
-  while ((($#whichfalse+2) < $max) && ($#falselist > -1)) {
-    my $afalse=rand $#falselist;
-    &Apache::lonxml::debug("From $#falselist elms, picking $afalse");
-    $afalse=splice(@falselist,$afalse,1);
-    &Apache::lonxml::debug("Picked $afalse");
-    push (@whichfalse,$afalse);
-  }
-  splice(@whichfalse,$answer,0,$truelist[$whichtrue]);
-  &Apache::lonxml::debug("the true statement is $answer");
-  if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
-    foreach $name (@whichfalse) {
-      $result.="<br />";
-      if ($Apache::response::foilgroup{$name.'.value'} eq 'true') { 
-	$result.='Correct';
-      } else {
-	$result.='Incorrect';
-      }
-      $result.=":".$Apache::response::foilgroup{$name.'.text'}."</input>\n";
+    my $whichtrue = int(rand($#truelist+1));
+    &Apache::lonxml::debug("Max is $max, From $#truelist elms, picking ".
+			   $whichtrue);
+    my @whichfalse = ();
+    while ((($#whichfalse+1) < $max) && ($#falselist > -1)) {
+	&Apache::lonxml::debug("Have $#whichfalse max is $max");
+	my $afalse = int(rand($#falselist+1));
+	&Apache::lonxml::debug("From $#falselist elms, picking $afalse");
+	$afalse = splice(@falselist,$afalse,1);
+	&Apache::lonxml::debug("Picked $afalse");
+	push (@whichfalse,$afalse);
     }
-  } else {
-    my $temp=0;
-    foreach $name (@whichfalse) {
-      $result.="<br /><input type=\"radio\" name=\"HWVAL$Apache::inputtags::response['-1']\" value=\"$temp\">".$Apache::response::foilgroup{$name.'.text'}."</input>\n";
-      $temp++;
+    splice(@whichfalse,$answer,0,$truelist[$whichtrue]);
+    &Apache::lonxml::debug("the true statement is $answer");
+    if ($Apache::lonhomework::history{
+	"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
+	foreach $name (@whichfalse) {
+	    $result .= "<br />";
+	    if ($Apache::response::foilgroup{$name.'.value'} eq 'true') { 
+		$result .= 'Correct';
+	    } else {
+		$result.='Incorrect';
+	    }
+	    $result .= ":".$Apache::response::foilgroup{$name.'.text'}.
+		       "</input>\n";
+	}
+    } else {
+	my $temp=0;
+	my $id=$Apache::inputtags::response['-1'];
+	my $part=$Apache::inputtags::part;
+	my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.".
+						       "submission"};
+	foreach $name (@whichfalse) {
+	    $result.="<br /><input type=\"radio\" name=\"HWVAL".
+		     $Apache::inputtags::response['-1'].
+		     "\" value=\"$temp\" ";
+	    if ($lastresponse eq $temp) { $result .= 'checked="on"'; }
+	    $result .= '>'.$Apache::response::foilgroup{$name.'.text'}.
+		"</input>\n";
+	    $temp++;
+	}
     }
-  }
-  return $result."<br />";
+    return $result."<br />";
+}
+
+# ========================================================= Start concept group
+sub start_conceptgroup {
+    $Apache::radiobuttonresponse::conceptgroup = 1;
+    %Apache::response::conceptgroup = {};
+    return '';
 }
 
+# =========================================================== End concept group
+sub end_conceptgroup {
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
+    $Apache::radiobuttonresponse::conceptgroup = 0;
+    if ($target eq 'web' || $target eq 'grade') {
+	my @names = @{ $Apache::response::conceptgroup{'names'} };
+	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"};
+	$Apache::response::foilgroup{"$name.value"} =
+	    $Apache::response::conceptgroup{"$name.value"};
+	my $concept = 
+	    &Apache::lonxml::get_param('concept',$parstack,$safeeval);
+	$Apache::response::foilgroup{"$name.concept"} = $concept;
+	&Apache::lonxml::debug("Selecting $name in $concept");
+    }
+    return '';
+}
+
+# ================================================================== Start foil
 sub start_foil {
-  $Apache::lonxml::redirection--;
-  return '';
+    &Apache::lonxml::startredirection;
+    return '';
 }
 
+# ==================================================================== End foil
 sub end_foil {
-  my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
-  if ($target eq 'web' || $target eq 'grade') {
-    my $args ='';
-    if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
-    my $name = &Apache::run::run("{$args;".'return $name}',$safeeval);
-    push @{ $Apache::response::foilgroup{'names'} }, $name;
-    my $value = &Apache::run::run("{$args;".'return $value}',$safeeval);
-    $Apache::response::foilgroup{"$name.value"} = $value;
-    $Apache::response::foilgroup{"$name.text"} = $Apache::lonxml::outputstack;
-  }
-  
-  $Apache::lonxml::redirection++;
-  if ($Apache::lonxml::redirection == 1) { 
-    $Apache::lonxml::outputstack=''; 
+    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') {
+    my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
+    if ($value ne 'unused') {
+      my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
+      if ( $Apache::radiobuttonresponse::conceptgroup ) {
+	push @{ $Apache::response::conceptgroup{'names'} }, $name;
+	$Apache::response::conceptgroup{"$name.value"} = $value;
+	$Apache::response::conceptgroup{"$name.text"} = $text;	
+      } else {
+	push @{ $Apache::response::foilgroup{'names'} }, $name;
+	$Apache::response::foilgroup{"$name.value"} = $value;
+	$Apache::response::foilgroup{"$name.text"} = $text;
+      }
+    }
   }
   return '';
 }
 
 1;
+
 __END__