--- loncom/homework/radiobuttonresponse.pm	2005/01/10 19:21:57	1.98
+++ loncom/homework/radiobuttonresponse.pm	2006/11/27 11:42:40	1.107
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # mutliple choice style responses
 #
-# $Id: radiobuttonresponse.pm,v 1.98 2005/01/10 19:21:57 albertel Exp $
+# $Id: radiobuttonresponse.pm,v 1.107 2006/11/27 11:42:40 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -30,6 +30,9 @@ package Apache::radiobuttonresponse;
 use strict;
 use HTML::Entities();
 use Apache::lonlocal;
+use Apache::lonnet;
+
+my $exam_max_bubbles = 10;
 
 BEGIN {
     &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse'));
@@ -59,12 +62,14 @@ sub start_radiobuttonresponse {
 				    $token,'4').
 	    &Apache::edit::select_arg('Randomize Foil Order','randomize',
 				      ['yes','no'],$token).
+	    &Apache::edit::select_arg('Display Direction','direction',
+				      ['vertical','horizontal'],$token).
 				      &Apache::edit::end_row().
 				      &Apache::edit::start_spanning_row()."\n";
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
 						     $safeeval,'max',
-						     'randomize');
+						     'randomize','direction');
 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
     } elsif ($target eq 'tex') {
 	my $type=&Apache::lonxml::get_param('TeXtype',$parstack,$safeeval,
@@ -114,8 +119,8 @@ sub start_foilgroup {
 }
 
 sub storesurvey {
-    if ( !defined($ENV{'form.submitted'})) { return ''; }
-    my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1']};
+    if ( !&Apache::response::submitted() ) { return ''; }
+    my $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']};
     &Apache::lonxml::debug("Here I am!:$response:");
     if ( $response !~ /[0-9]+/) { return ''; }
     my $part = $Apache::inputtags::part;
@@ -137,12 +142,12 @@ sub grade_response {
     my ($max,$randomize)=@_;
     #keep the random numbers the same must always call this
     my ($answer,@whichfoils)=&whichfoils($max,$randomize);
-    if (!defined($ENV{'form.submitted'})) { return; }
+    if ( !&Apache::response::submitted() ) { return; }
     my $response;
-    if ($ENV{'form.submitted'} eq 'scantron') {
+    if ($env{'form.submitted'} eq 'scantron') {
 	$response=&Apache::response::getresponse();
     } else {
-	$response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1']};
+	$response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']};
     }
     if ( $response !~ /[0-9]+/) { return; }
     my $part=$Apache::inputtags::part;
@@ -231,7 +236,10 @@ sub displayallfoils {
     my ($direction)=@_;
     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 $id=$Apache::inputtags::response['-1'];
     my $part=$Apache::inputtags::part;
@@ -288,7 +296,7 @@ sub whichfoils {
     my ($truecnt,$falsecnt) = &getfoilcounts();
     my $count=0;
     # we will add in 1 of the true statements
-    if (($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; }
+    if ( $max>0 && ($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; $max=$count; }
     my $answer=int(&Math::Random::random_uniform() * ($count));
     &Apache::lonxml::debug("Count is $count, $answer is $answer");
     my @names;
@@ -484,8 +492,19 @@ sub displayfoils {
 		$result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</label>";
 	    } else {
 		if ($Apache::lonhomework::type eq 'exam') {
+		    
+		    # If necessary, start a new group of bubbles
+		    # in the next row on the scantron sheet:
+		    #
+		    if ($i >= $exam_max_bubbles) {
+			$i = 0;	# Back to A.
+			$Apache::lonxml::counter++; # Next row of bubbles...
+			$result .= '\item[\textbf{'.$Apache::lonxml::counter.'}.]';
+		    }
+
 		    $result .= '{\small \textbf{'.$alphabet[$i].'}}$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\';  #' stupid emacs
 		    $i++;
+
 		} else {
 		    $result .= '\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'};
 		}
@@ -504,7 +523,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) {
@@ -519,10 +541,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;
 }
@@ -606,8 +633,8 @@ sub end_foil {
 	my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
 	if ($value ne 'unused') {
 	    my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
-	    if (!$name) {
-		&Apache::lonxml::error("Foils without names exist. This can cause problems to malfunction.");
+	    if ($name eq "") {
+		&Apache::lonxml::warning("Foils without names exist. This can cause problems to malfunction.");
 		$name=$Apache::lonxml::curdepth;
 	    }
 	    if (defined($Apache::response::foilnames{$name})) {