--- loncom/homework/optionresponse.pm 2009/05/04 13:42:50 1.158 +++ loncom/homework/optionresponse.pm 2010/02/05 21:38:41 1.161 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # option list style responses # -# $Id: optionresponse.pm,v 1.158 2009/05/04 13:42:50 onken Exp $ +# $Id: optionresponse.pm,v 1.161 2010/02/05 21:38:41 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -190,13 +190,14 @@ sub end_foilgroup { my $TeXlayout=&Apache::lonxml::get_param('TeXlayout',$parstack,$safeeval, -2,0); + my $checkboxvalue=&Apache::lonxml::get_param('checkboxvalue',$parstack,$safeeval); if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();} &Apache::lonxml::debug("Options are $#opt"); my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2'); my $randomize = &Apache::lonxml::get_param('randomize',$parstack, $safeeval,'-2'); if ($target eq 'web' || $target eq 'tex') { - $result.=&displayfoils($target,$max,$randomize,$TeXlayout,@opt); + $result.=&displayfoils($target,$max,$randomize,$TeXlayout,$checkboxvalue,@opt); $Apache::lonxml::post_evaluate=0; } elsif ( $target eq 'answer') { $result.=&displayanswers($max,$randomize,@opt); @@ -359,6 +360,15 @@ sub displayanswers { return $result; } +sub check_box_opt { + my ($target,$checkboxvalue,@opt)=@_; +# Check if we are in checkbox mode: checkboxvalue specified, on web, only two options. +# If so, return "checked" value + if ($#opt!=1) { return ''; } + if ($target ne 'web') { return ''; } + return $checkboxvalue; +} + sub check_for_invalid { my ($names,$options) = @_; my %bad_names; @@ -381,7 +391,7 @@ sub check_for_invalid { } sub displayfoils { - my ($target,$max,$randomize,$TeXlayout,@opt)=@_; + my ($target,$max,$randomize,$TeXlayout,$checkboxvalue,@opt)=@_; if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;} my @names = @{ $Apache::response::foilgroup{'names'} }; my @truelist; @@ -427,6 +437,11 @@ sub displayfoils { my $temp=1; my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"}); my $internal_counter=$Apache::lonxml::counter; + my $checkboxopt=&check_box_opt($target,$checkboxvalue,@opt); + if ($checkboxopt) { + $result.='<br />'.&mt('Choices: ').'<b>'.$opt[0].','.$opt[1].'</b>. '. + &mt('Select all that are <b>[_1]</b>.',$checkboxopt); + } foreach $name (@whichopt) { my $text=$Apache::response::foilgroup{$name.'.text'}; if ($text!~/^\s*$/) { @@ -465,10 +480,34 @@ sub displayfoils { } if ($target ne 'tex') { if ($Apache::lonhomework::type ne 'exam') { - $optionlist='<select onchange="javascript:setSubmittedPart(\''. +# we are on the web, this is not an exam, and the problem can be answered + if ($checkboxopt) { +# generate checkboxes + my $fieldname=$Apache::inputtags::response['-1'].':'.$temp; + my $altopt=$opt[0]; + if ($opt[0] eq $checkboxopt) { + $altopt=$opt[1]; + } + my $defopt=$lastopt; + unless ($defopt) { $defopt=$altopt; } + my $escdefopt=&HTML::Entities::encode($defopt,'\'"&<>'); + my $esccheckboxopt=&HTML::Entities::encode($checkboxopt,'\'"&<>'); + my $escaltopt=&HTML::Entities::encode($altopt,'\'"&<>'); +# checkboxopt is how the box is labelled +# altopt is the alternative option +# lastopt is what the user submitted before +# defopt is what the field is going to start out with: either previous choice or altopt +# fieldname is this input field's name after HWVAL_ + $optionlist='<input type="hidden" name="HWVAL_'.$fieldname.'" value="'.$escdefopt.'" />'. + '<input type="checkbox" name="HWCHK_'.$fieldname.'" onclick="javascript:if (this.form.elements[\'HWCHK_'. + $fieldname.'\'].checked) { this.form.elements[\'HWVAL_'.$fieldname.'\'].value=\''.$esccheckboxopt.'\'; } else { this.form.elements[\'HWVAL_'.$fieldname.'\'].value=\''.$escaltopt.'\'; };setSubmittedPart(\''.$part.'\');"'.($defopt eq $checkboxopt?' checked="checked"':'')." />\n"; + } else { +# classic selection list + $optionlist='<select onchange="javascript:setSubmittedPart(\''. $part.'\');" name="HWVAL_'. $Apache::inputtags::response['-1'].':'.$temp.'">'. $optionlist."</select>\n"; + } } else { $optionlist='<u>'.(' 'x10).'</u>'; }