File:  [LON-CAPA] / loncom / homework / radiobuttonresponse.pm
Revision 1.21: download - view: text, annotated - select for diffs
Mon Aug 6 19:36:27 2001 UTC (22 years, 7 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
beautify/optimize

# 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'));
}

# ================================================= Start radio button response
sub start_radiobuttonresponse {
  my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  #when in a radiobutton response use these
  &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::foilgroup = {};
# ============================================================ Start foil group
sub start_foilgroup {
    %Apache::response::foilgroup = {};
    $Apache::radiobuttonresponse::conceptgroup = 0;
    &Apache::response::setrandomnumber();
    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,$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;
}

# ==================================== Get foil counts (return 3 element array)
sub getfoilcounts {
    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);
}

# ==================================== 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 $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);
    }
    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 />";
}

# ========================================================= 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::startredirection;
    return '';
}

# ==================================================================== End foil
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') {
    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__
 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>