Diff for /loncom/homework/optionresponse.pm between versions 1.164 and 1.201

version 1.164, 2010/04/27 14:11:17 version 1.201, 2018/02/28 13:20:50
Line 51  sub start_optionresponse { Line 51  sub start_optionresponse {
   undef(%Apache::response::foilnames);    undef(%Apache::response::foilnames);
   if ($target eq 'edit') {    if ($target eq 'edit') {
     $result.=&Apache::edit::start_table($token)      $result.=&Apache::edit::start_table($token)
        .'<tr><td><span class="LC_nobreak">'.&mt('Multiple Option Response Question').'</span> '         .'<tr><td><span class="LC_nobreak">'.&Apache::loncommon::insert_folding_button().' '
          .&mt('Multiple Option Response Question').'</span> '
        .&Apache::loncommon::help_open_topic('Option_Response_Problems')."</td>"         .&Apache::loncommon::help_open_topic('Option_Response_Problems')."</td>"
        .'<td><span class="LC_nobreak">'.&mt('Delete?').' '         .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
        .&Apache::edit::deletelist($target,$token)         .&Apache::edit::deletelist($target,$token)
Line 64  sub start_optionresponse { Line 65  sub start_optionresponse {
      $token,'4').       $token,'4').
         &Apache::edit::select_arg('Randomize Foil Order:','randomize',          &Apache::edit::select_arg('Randomize Foil Order:','randomize',
   ['yes','no'],$token).    ['yes','no'],$token).
         &Apache::edit::select_arg(&mt('Display of options when printed'),'TeXlayout',          &Apache::edit::select_arg('Display of options when printed','TeXlayout',
   [['horizontal','Normal list'],    [['horizontal','Normal list'],
    ['vertical','Listed in a vertical column']],$token).     ['vertical','Listed in a vertical column']],$token).
         &Apache::edit::end_row().&Apache::edit::start_spanning_row();          &Apache::edit::end_row().&Apache::edit::start_spanning_row();
Line 103  sub start_foilgroup { Line 104  sub start_foilgroup {
   my $result='';    my $result='';
   %Apache::response::foilgroup=();    %Apache::response::foilgroup=();
   $Apache::optionresponse::conceptgroup=0;    $Apache::optionresponse::conceptgroup=0;
   &Apache::response::pushrandomnumber();    &Apache::response::pushrandomnumber(undef,$target);
   if ($target eq 'edit') {    if ($target eq 'edit') {
     my $optionlist="<option></option>\n";      my $optionlist="<option></option>\n";
     my $option;      my $option;
     my @opt;      my @opt;
     eval '@opt ='. &Apache::lonxml::get_param('options',$parstack,$safeeval);      my @raw_options = &Apache::lonxml::get_param('options', $parstack, $safeeval, 0,  0, 1);
   
   
       eval '@opt ='. &Apache::lonxml::get_param('options',$parstack,$safeeval, 0, 0, 1);
   
     my $count=1;      my $count=1;
     foreach $option (@opt) {      foreach $option (@opt) {
       $optionlist.="<option value=\"$count\">$option</option>\n";        $optionlist.="<option value=\"$count\">$option</option>\n";
Line 116  sub start_foilgroup { Line 121  sub start_foilgroup {
     }      }
     my $insertlist=&Apache::edit::insertlist($target,$token);      my $insertlist=&Apache::edit::insertlist($target,$token);
     $result.=&Apache::edit::start_table($token);      $result.=&Apache::edit::start_table($token);
     $result.= (<<ENDTABLE);      my %lt = &Apache::lonlocal::texthash(
       <tr><td>Select Options</td>          sel => 'Select Options',
           add => 'Add new Option:',
           del => 'Delete an Option:',
           maxcheck => 'Enter maximum number students may check (e.g., 3)',
           mincheck => 'Enter minimum number students need to check (e.g., 1)',
       );
       $result.= sprintf(<<ENDTABLE, &Apache::loncommon::insert_folding_button());
         <tr><td>%s $lt{'sel'}</td>
         <td>          <td>
   Add new Option: <input type="text" name="$Apache::lonxml::curdepth.options" />    $lt{'add'} <input type="text" name="$Apache::lonxml::curdepth.options" />
         </td>          </td>
         <td>Delete an Option:          <td>$lt{'del'}
   <select name="$Apache::lonxml::curdepth.deleteopt">$optionlist</select>    <select name="$Apache::lonxml::curdepth.deleteopt">$optionlist</select>
         </td>          </td>
 ENDTABLE  ENDTABLE
     $result.= '<td>'.&Apache::edit::checked_arg('Print options:','texoptions',      $result.= '<td>'.&Apache::edit::checked_arg('Print options:','texoptions',
  [ ['nochoice','Don\'t show option list'] ]   [ ['nochoice',"Don't show option list"] ]
  ,$token).'</td>';   ,$token).'</td>';
     $result.= '<td><label>'.&mt('Two-option checkboxes for:').      $result.= '<td><label>'.&mt('Two-option checkboxes for:').
               '<select name="checkboxvalue_'.$Apache::lonxml::curdepth.'">';                '<select name="checkboxvalue_'.$Apache::lonxml::curdepth.'">';
Line 137  ENDTABLE Line 149  ENDTABLE
        }         }
        $result.='>'.$option.'</option>';         $result.='>'.$option.'</option>';
     }      }
     $result.='</select></label>';        $result.='</select></label> ';
       my %checknumtxt = (
                           maxcheck => 'Max. boxes permitted to check',
                           mincheck => 'Min. boxes required to check',
       );
       my (%onclicknum,%checknum);
       foreach my $item ('maxcheck','mincheck') {
           $onclicknum{$item} = 'onclick="'."updateNumber('$item','$Apache::lonxml::curdepth','check','$lt{$item}');".'"';
           $checknum{$item} = &Apache::lonxml::get_param($item,$parstack,$safeeval);
       }
       $result.=&Apache::edit::checked_arg('Checkbox options:','checkboxoptions',
                                            [ ['nochoice',"Don't show option list"] ]
                                            ,$token).' '.
                &Apache::edit::checked_arg('','noprompt',
                                            [ ['nochoice','Omit "Select all that are ... "' ] ]
                                            ,$token);
       foreach my $item ('maxcheck','mincheck') {
           my $currnum = $checknum{$item};
           unless ($currnum =~ /^\d+$/) {
               $currnum = 'nochoice';
           } 
           $result.= ' <span class="LC_nobreak">'.
                     &Apache::edit::checked_arg('',$item,[ [$currnum,$checknumtxt{$item}] ],
                                           $token,$onclicknum{$item},1).' '.
                     '<span id="'.$item.'_numtext_'.$Apache::lonxml::curdepth.'">';
           if ($checknum{$item} ne '') {
               $result .= ':&nbsp;<a href="javascript:updateNumber('."'$item','$Apache::lonxml::curdepth','link','$lt{$item}'".')">'.
                          $checknum{$item}.'</a>';
           }
           $result .= '</span></span>';
       } 
       $result.= '</td>';
     $result.= &Apache::edit::end_row();      $result.= &Apache::edit::end_row();
     $result.= &Apache::edit::start_spanning_row();      $result.= &Apache::edit::start_spanning_row();
     $result.= $insertlist.'<br />';      $result.= $insertlist.'<br />';
Line 145  ENDTABLE Line 188  ENDTABLE
   if ($target eq 'modified') {    if ($target eq 'modified') {
     my @options;      my @options;
     my $optchanged=0;      my $optchanged=0;
     eval '@options ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);  
   
       eval '@options ='.&Apache::lonxml::get_param('options',$parstack,$safeeval, 0, 0, 1);
   
     if ($env{"form.$Apache::lonxml::curdepth.deleteopt"}) {      if ($env{"form.$Apache::lonxml::curdepth.deleteopt"}) {
       my $delopt=$env{"form.$Apache::lonxml::curdepth.deleteopt"};        my $delopt=$env{"form.$Apache::lonxml::curdepth.deleteopt"};
       &Apache::lonxml::debug("Deleting :$delopt:");        &Apache::lonxml::debug("Deleting :$delopt:");
       splice(@options,$delopt-1,1);        splice(@options,$delopt-1,1);
       $optchanged=1;        $optchanged=1;
     }      }
     if ($env{"form.$Apache::lonxml::curdepth.options"}) {      if ($env{"form.$Apache::lonxml::curdepth.options"} ne '') {
       my $newopt = $env{"form.$Apache::lonxml::curdepth.options"};        my $newopt = $env{"form.$Apache::lonxml::curdepth.options"};
       if ($options[0]) {        push(@options,$newopt);
  push(@options,$newopt);  
       } else {  
  $options[0]=$newopt;  
       }  
       $optchanged=1;        $optchanged=1;
     }      }
     my $rebuildtag = &Apache::edit::get_new_args($token,$parstack,$safeeval,      my $rebuildtag = &Apache::edit::get_new_args($token,$parstack,$safeeval,
  'texoptions','checkboxvalue');   'texoptions','checkboxvalue','checkboxoptions',
                                                    'noprompt','maxcheck','mincheck');
       if ($rebuildtag) {
           my $maxcheck = $token->[2]->{'maxcheck'};
           my $mincheck = $token->[2]->{'mincheck'};
           if ($mincheck =~ /D/) {
               $token->[2]->{'mincheck'}='';
           }
           if ($maxcheck =~ /D/) {
               $token->[2]->{'maxcheck'}='';
           }
           if (($mincheck ne '') && ($maxcheck ne '')) {
               if ($mincheck > $maxcheck) {
                   $token->[2]->{'mincheck'}=$maxcheck; 
               }
           }
       }
     if ($optchanged || $rebuildtag ) {      if ($optchanged || $rebuildtag ) {
       $result = "<foilgroup options=\"(";        $result = "<foilgroup options=\"(";
       foreach my $option (@options) {        foreach my $option (@options) {
Line 173  ENDTABLE Line 231  ENDTABLE
       chop $result;        chop $result;
       $result.=')" ';        $result.=')" ';
       $result .= 'texoptions="'.$token->[2]{'texoptions'}.'" ';        $result .= 'texoptions="'.$token->[2]{'texoptions'}.'" ';
       $result .= 'checkboxvalue="'.$token->[2]{'checkboxvalue'}.'"';        $result .= 'checkboxoptions="'.$token->[2]{'checkboxoptions'}.'" ';
         $result .= 'checkboxvalue="'.$token->[2]{'checkboxvalue'}.'" ';
         $result .= 'noprompt="'.$token->[2]{'noprompt'}.'" ';
         $result .= 'maxcheck="'.$token->[2]{'maxcheck'}.'" ';
         $result .= 'mincheck="'.$token->[2]{'mincheck'}.'"';
       $result .= '>';        $result .= '>';
     } # else nothing changed so just use the default mechanism      } # else nothing changed so just use the default mechanism
   }    }
   if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {    if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
     if($env{'form.pdfFormFields'} ne 'yes') {      if($env{'form.pdfFormFields'} ne 'yes') {
       $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}        $result .= ' \begin{itemize} ';
                    \begin{enumerate} ';  
     } else {      } else {
       $result .= "\\\\";        $result .= "\\\\";
     }      }
Line 203  sub end_foilgroup { Line 264  sub end_foilgroup {
     my $TeXlayout=&Apache::lonxml::get_param('TeXlayout',$parstack,$safeeval,      my $TeXlayout=&Apache::lonxml::get_param('TeXlayout',$parstack,$safeeval,
      -2,0);       -2,0);
     my $checkboxvalue=&Apache::lonxml::get_param('checkboxvalue',$parstack,$safeeval);      my $checkboxvalue=&Apache::lonxml::get_param('checkboxvalue',$parstack,$safeeval);
       my $checkboxchoices=(&Apache::lonxml::get_param('checkboxoptions',$parstack,$safeeval) ne 'nochoice');
       my $maxcheck=&Apache::lonxml::get_param('maxcheck', $parstack, $safeeval);
       $maxcheck =~ s/\D+//g;
       my $mincheck=&Apache::lonxml::get_param('mincheck', $parstack, $safeeval);
       $mincheck =~ s/\D+//g;
       my $noprompt=&Apache::lonxml::get_param('noprompt', $parstack, $safeeval);
   
     if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}      if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}
     &Apache::lonxml::debug("Options are $#opt");      &Apache::lonxml::debug("Options are $#opt");
     my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');      my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
     my $randomize = &Apache::lonxml::get_param('randomize',$parstack,      my $randomize = &Apache::lonxml::get_param('randomize',$parstack,
        $safeeval,'-2');         $safeeval,'-2');
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
       $result.=&displayfoils($target,$max,$randomize,$TeXlayout,$checkboxvalue,@opt);        $result.=&displayfoils($target,$max,$randomize,$TeXlayout,$checkboxvalue,$checkboxchoices,$tex_option_switch, $noprompt,$maxcheck,$mincheck, @opt);
       $Apache::lonxml::post_evaluate=0;        $Apache::lonxml::post_evaluate=0;
     } elsif ( $target eq 'answer') {      } elsif ( $target eq 'answer') {
       $result.=&displayanswers($max,$randomize,@opt);        $result.=&displayanswers($max,$randomize,@opt);
Line 221  sub end_foilgroup { Line 289  sub end_foilgroup {
  my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";   my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
  push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt);   push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt);
     } elsif ( $target eq 'grade') {      } elsif ( $target eq 'grade') {
   
       if ( &Apache::response::submitted()) {        if ( &Apache::response::submitted()) {
   
  my @whichopt = &whichfoils($max,$randomize);   my @whichopt = &whichfoils($max,$randomize);
  my $temp=1;my $name;   my $temp=1;my $name;
  my %responsehash;   my %responsehash;
Line 229  sub end_foilgroup { Line 299  sub end_foilgroup {
  my $right=0;   my $right=0;
  my $wrong=0;   my $wrong=0;
  my $ignored=0;   my $ignored=0;
           my $checked=0;
           my $corrchkd=0;
           my $corrunchkd=0;
           my $incorrchkd=0;
           my $incorrunchkd=0;
           my ($numrows,$bubbles_per_row);
           if ($Apache::lonhomework::scantronmode) {
               my $numitems = scalar(@opt);
               ($numrows,$bubbles_per_row) =
                   &Apache::optionresponse::getnumrows($numitems);
           }
           if ($numrows < 1) {
               $numrows = 1;
           }
           my $checkboxopt;
           if ($checkboxvalue) {
               $checkboxopt = &check_box_opt($target,$checkboxvalue,@opt);
               if (($checkboxopt) && ($Apache::lonhomework::type !~ /survey/)) {
                   my $corrnumcheck = 0;
                   if (($maxcheck ne '') || ($mincheck ne '')) {
                       foreach $name (@whichopt) {
                           if ($Apache::response::foilgroup{$name.'.value'} eq $checkboxopt) {
                               $corrnumcheck ++; 
                           }
                       }
                       if (($maxcheck ne '') && ($corrnumcheck > $maxcheck)) {
                           $maxcheck = $corrnumcheck;
                       }
                       if (($mincheck ne '') && ($corrnumcheck < $mincheck)) {
                           $mincheck = $corrnumcheck;
                       }
                   }
               }
           }
           my $part=$Apache::inputtags::part;
           my $id = $Apache::inputtags::response['-1'];
           my @relweights;
           my $nonlenient=&grading_is_nonlenient($part,$id,\@relweights);
  foreach $name (@whichopt) {   foreach $name (@whichopt) {
   my $response=&Apache::response::getresponse($temp);    my $response;
   if ($env{'form.submitted'} eq 'scantron' && $response=~/\S/) {            if ($env{'form.submitted'} eq 'scantron') {
       $response = $opt[$response];                if ($numrows > 1) {
   }                    my $num = $temp;
                     my $totalnum;
                     for (my $i=0; $i<$numrows; $i++) {
                         my $item = &Apache::response::getresponse($num);
                         if ($item =~ /^\d+$/) {
                             $totalnum = $i*$bubbles_per_row + $item;
                         }
                         $num ++;
                     }
                     if ($totalnum =~ /^\d+$/) {
                         $response = $opt[$totalnum];
                     }
                     $temp += $numrows;
                 } else {
                     $response=&Apache::response::getresponse($temp);
                     if ($response=~/\S/) {
                         $response = $opt[$response];
                     }
                     $temp ++;
                 }
     } else {
                 $response=&Apache::response::getresponse($temp);
                 $temp ++;
             }
   if ( $response =~ /[^\s]/) {    if ( $response =~ /[^\s]/) {
     $responsehash{$name}=$response;      $responsehash{$name}=$response;
     my $value=$Apache::response::foilgroup{$name.'.value'};      my $value=$Apache::response::foilgroup{$name.'.value'};
Line 243  sub end_foilgroup { Line 374  sub end_foilgroup {
     } else {      } else {
  $grade{$name}='0'; $wrong++;   $grade{$name}='0'; $wrong++;
     }      }
               if ($checkboxopt) {
                   if ($response eq $checkboxopt) {
                       $checked++;
                       if ($grade{$name}) {
                           $corrchkd ++;
                       } else {
                           $incorrchkd ++;
                       }
                   } else {
                       if ($grade{$name}) {
                           $corrunchkd ++;
                       } else {
                           $incorrunchkd ++;
                       }
                   }
               }
   } else {    } else {
     $ignored++;      $ignored++;
   }    }
   $temp++;  
  }   }
  my $part=$Apache::inputtags::part;  
  my $id = $Apache::inputtags::response['-1'];  
  my $responsestr=&Apache::lonnet::hash2str(%responsehash);   my $responsestr=&Apache::lonnet::hash2str(%responsehash);
  my $gradestr   =&Apache::lonnet::hash2str(%grade);   my $gradestr   =&Apache::lonnet::hash2str(%grade);
  my %previous=&Apache::response::check_for_previous($responsestr,   my %previous=&Apache::response::check_for_previous($responsestr,
Line 258  sub end_foilgroup { Line 402  sub end_foilgroup {
  $Apache::lonhomework::results{"resource.$part.$id.submission"}=   $Apache::lonhomework::results{"resource.$part.$id.submission"}=
     $responsestr;      $responsestr;
  $Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}=$gradestr;   $Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}=$gradestr;
           if ($Apache::lonhomework::type eq 'randomizetry') {
  if (($Apache::lonhomework::type eq 'survey') ||              $Apache::lonhomework::results{"resource.$part.$id.foilorder"} = &Apache::lonnet::array2str(@whichopt);
             ($Apache::lonhomework::type eq 'surveycred') ||          }
             ($Apache::lonhomework::type eq 'anonsurvey') ||          my $skipaward;
             ($Apache::lonhomework::type eq 'anonsurveycred')) {          if ($checkboxvalue) {
     if ($ignored == 0) {              if ((($maxcheck ne '') && ($checked > $maxcheck)) ||
                 my $ad;                  (($mincheck ne '') && ($checked < $mincheck))) {
                 if ($Apache::lonhomework::type eq 'anonsurveycred') {                  my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='WRONG_NUMBOXESCHECKED';
                     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS_CREDIT';                  &Apache::response::handle_previous(\%previous,$ad);
                 } elsif ($Apache::lonhomework::type eq 'anonsurvey') {                  $skipaward = 1;
                     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS';              }
                 } elsif ($Apache::lonhomework::type eq 'surveycred') {          }
                     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED_CREDIT';          unless ($skipaward) {
       if (($Apache::lonhomework::type eq 'survey') ||
                   ($Apache::lonhomework::type eq 'surveycred') ||
                   ($Apache::lonhomework::type eq 'anonsurvey') ||
                   ($Apache::lonhomework::type eq 'anonsurveycred')) {
           if ($ignored == 0) {
                       my $ad;
                       if ($Apache::lonhomework::type eq 'anonsurveycred') {
                           $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS_CREDIT';
                       } elsif ($Apache::lonhomework::type eq 'anonsurvey') {
                           $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS';
                       } elsif ($Apache::lonhomework::type eq 'surveycred') {
                           $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED_CREDIT';
                       } else {
           $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED';
                       }
       &Apache::response::handle_previous(\%previous,$ad);
           } elsif ($wrong==0 && $right==0) {
           } else {
       my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='MISSING_ANSWER';
       &Apache::response::handle_previous(\%previous,$ad);
           }
       } elsif ($nonlenient) {
   #
   # Non-lenient mode. All right or all wrong
   #
           my $ad;
           if ($wrong==0 && $ignored==0) {
       $ad='EXACT_ANS';
           } elsif ($wrong==0 && $right==0) {
       #nothing submitted
           } else {
       if ($ignored==0) {
           $ad='INCORRECT';
       } else {
           $ad='MISSING_ANSWER';
       }
           }
           $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
           &Apache::response::handle_previous(\%previous,$ad);
        } else {
   #
   # This is lenient mode
   #
           my $ad;
           if ($wrong==0 && $right==0) {
       #nothing submitted only assign a score if we 
       #need to override a previous grade
       if (defined($Apache::lonhomework::history{"resource.$part.$id.awarddetail"})) {
           $ad='ASSIGNED_SCORE';
       }
           } else {
       $ad='ASSIGNED_SCORE';
           }
           $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
                   my $awarded;
                   my $totalfoils = $#{ $Apache::response::foilgroup{'names'} }+1;
                   if (($checkboxopt) && ($max >= $totalfoils) && (@relweights > 0)) {
                       if ($right == scalar(@whichopt)) {
                           $awarded = 1;
                       } else {
                           $awarded = ($corrchkd*$relweights[0] + $corrunchkd*$relweights[1] +
                                       $incorrchkd*$relweights[2] + $incorrunchkd*$relweights[3])/(scalar(@whichopt));
                           $awarded = 1 if ($awarded > 1);
                           $awarded = 0 if ($awarded < 0);
                       }
                 } else {                  } else {
     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED';                      $awarded = $right/(scalar(@whichopt));
                 }                  }
  &Apache::response::handle_previous(\%previous,$ad);          $Apache::lonhomework::results{"resource.$part.$id.awarded"}=
     } elsif ($wrong==0 && $right==0) {      $awarded;
     } else {          $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=
  my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='MISSING_ANSWER';      scalar(@whichopt);
  &Apache::response::handle_previous(\%previous,$ad);       }
     }         }
  } elsif (!$Apache::lonhomework::scantronmode) {  
     my $ad;  
     if ($wrong==0 && $ignored==0) {  
  $ad='EXACT_ANS';  
     } elsif ($wrong==0 && $right==0) {  
  #nothing submitted  
     } else {  
  if ($ignored==0) {  
     $ad='INCORRECT';  
  } else {  
     $ad='MISSING_ANSWER';  
  }  
     }  
     $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;  
     &Apache::response::handle_previous(\%previous,$ad);  
  } else {  
     my $ad;  
     if ($wrong==0 && $right==0) {  
  #nothing submitted only assign a score if we   
  #need to override a previous grade  
  if (defined($Apache::lonhomework::history{"resource.$part.$id.awarddetail"})) {  
     $ad='ASSIGNED_SCORE';  
  }  
     } else {  
  $ad='ASSIGNED_SCORE';  
     }  
     $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;  
     $Apache::lonhomework::results{"resource.$part.$id.awarded"}=  
  $right/(scalar(@whichopt));  
     $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=  
  scalar(@whichopt);  
  }  
       }        }
     }      }
     my $part_id     = $Apache::inputtags::part;      my $part_id     = $Apache::inputtags::part;
     my $response_id = $Apache::inputtags::response[-1];      my $response_id = $Apache::inputtags::response[-1];
     &Apache::lonxml::increment_counter(&getfoilcounts($max),      my ($numrows,$bubbles_per_row);
        "$part_id.$response_id");      if (($target eq 'tex') && ($Apache::lonhomework::type eq 'exam')) {
           ($numrows,$bubbles_per_row) =
               &Apache::optionresponse::getnumrows(scalar(@opt));
       }
       if ($numrows < 1) {
           $numrows = 1;
       }
       my $increment = &getfoilcounts($max) * $numrows;
       &Apache::lonxml::increment_counter($increment,"$part_id.$response_id");
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
  &Apache::lonhomework::set_bubble_lines();   &Apache::lonhomework::set_bubble_lines();
     }      }
Line 327  sub end_foilgroup { Line 512  sub end_foilgroup {
   }    }
   if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {    if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
     if($env{'form.pdfFormFields'} ne 'yes') {      if($env{'form.pdfFormFields'} ne 'yes') {
       $result .= '\end{enumerate}';        $result .= '\end{itemize}'; 
     } else {      } else {
       $result .= "\\\\";        $result .= "\\\\";
     }      }
Line 336  sub end_foilgroup { Line 521  sub end_foilgroup {
   return $result;    return $result;
 }  }
   
   sub grading_is_nonlenient {
       my ($part,$id,$relweights) = @_;
   # Web mode: we are non-lenient unless told otherwise
       my $defaultparm = 'off';
       my $nonlenient = 1;
   # Grading a bubblesheet exam: we are grading lenient unless told otherwise
       if ($Apache::lonhomework::scantronmode) {
           $defaultparm = 'on';
           $nonlenient = 0;
       }
       my $lenientparm =
           &Apache::response::get_response_param($part,'lenient',$defaultparm);
       if ($lenientparm eq 'default') {
           $lenientparm = $defaultparm;
       }
       $lenientparm =
           &Apache::response::get_response_param($part.'_'.$id,'lenient',$lenientparm);
       if ($lenientparm eq 'default') {
           $lenientparm = $defaultparm;
       }
       if ($lenientparm=~/^(?:0|off|no)$/i) {
           $nonlenient = 1;
       } elsif ($lenientparm=~/^(?:1|on|yes)$/i) {
           $nonlenient = 0;
       } elsif ($lenientparm =~ /^\-?[.\d]+,\-?[.\d]+,\-?[.\d]+,\-?[.\d]+$/) {
           if (ref($relweights) eq 'ARRAY') {
               @{$relweights} = split(/,/,$lenientparm);
           }
           $nonlenient = 0;
       }
       if (!$nonlenient) {
           $Apache::inputtags::leniency=1;
       }
       return $nonlenient;
   }
   
 sub getfoilcounts {  sub getfoilcounts {
   my ($max)=@_;    my ($max)=@_;
   # +1 since instructors will count from 1    # +1 since instructors will count from 1
Line 355  sub whichfoils { Line 576  sub whichfoils {
   
 sub displayanswers {  sub displayanswers {
     my ($max,$randomize,@opt)=@_;      my ($max,$randomize,@opt)=@_;
     if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}      my @names;
     my @names = @{ $Apache::response::foilgroup{'names'} };      if (ref($Apache::response::foilgroup{'names'}) eq 'ARRAY') {
           @names = @{ $Apache::response::foilgroup{'names'} };
       }
       return if (!@names);
     my @whichopt = &whichfoils($max,$randomize);      my @whichopt = &whichfoils($max,$randomize);
     my $result;      my $result;
     if ($Apache::lonhomework::type eq 'exam') {      if ($Apache::lonhomework::type eq 'exam') {
Line 389  sub check_box_opt { Line 613  sub check_box_opt {
 # Check if we are in checkbox mode: checkboxvalue specified, on web, only two options.  # Check if we are in checkbox mode: checkboxvalue specified, on web, only two options.
 # If so, return "checked" value  # If so, return "checked" value
     if ($#opt!=1) { return ''; }      if ($#opt!=1) { return ''; }
     if ($target ne 'web') { return ''; }      unless (($target eq 'web') || ($target eq 'grade')) { return ''; }
     return $checkboxvalue;      return $checkboxvalue;
 }  }
   
Line 415  sub check_for_invalid { Line 639  sub check_for_invalid {
 }  }
   
 sub displayfoils {  sub displayfoils {
   my ($target,$max,$randomize,$TeXlayout,$checkboxvalue,@opt)=@_;    my ($target,$max,$randomize,$TeXlayout,$checkboxvalue,$checkboxchoices,
   if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}        $tex_option_switch, $no_tfprompt, $maxcheck, $mincheck, @opt)=@_;
   my @names = @{ $Apache::response::foilgroup{'names'} };    my @names; 
     if (ref($Apache::response::foilgroup{'names'}) eq 'ARRAY') {
         @names = @{ $Apache::response::foilgroup{'names'} };
     }
     unless (@names > 0) { return;}
   my @truelist;    my @truelist;
   my @falselist;    my @falselist;
   my $result;      my $result;  
Line 425  sub displayfoils { Line 653  sub displayfoils {
   my $displayoptionintex=1;    my $displayoptionintex=1;
   my @alphabet = ('A'..'Z');    my @alphabet = ('A'..'Z');
   my @whichopt = &whichfoils($max,$randomize);    my @whichopt = &whichfoils($max,$randomize);
   &check_for_invalid(\@whichopt,\@opt);    unless (($target eq 'tex') && ($tex_option_switch eq 'nochoice')) {
         &check_for_invalid(\@whichopt,\@opt);
     }
   my $part=$Apache::inputtags::part;    my $part=$Apache::inputtags::part;
   my $id=$Apache::inputtags::response[-1];    my $id=$Apache::inputtags::response[-1];
   my $break;    my $break;
   my $solved=$Apache::lonhomework::history{"resource.$part.solved"};  
   if ( ($target ne 'tex') &&    if ( ($target ne 'tex') &&
        &Apache::response::show_answer() ) {         &Apache::response::show_answer() ) {
     my $temp=1;      my $temp=1;
     foreach $name (@whichopt) {      foreach $name (@whichopt) {
  my $text=$Apache::response::foilgroup{$name.'.text'};   my $text=$Apache::response::foilgroup{$name.'.text'};
         my $lastresp;          my $lastresp;
         unless ((($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurvey') || ($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurveycred')) && (defined($env{'form.grade_symb'}))) {          if ((($env{'form.grade_username'} eq '') && ($env{'form.grade_domain'} eq '')) ||
               (($env{'form.grade_username'} eq $env{'user.name'}) &&
                ($env{'form.grade_domain'} eq $env{'user.domain'}))) {
             $lastresp = $Apache::lonhomework::history{"resource.$part.$id.submission"};              $lastresp = $Apache::lonhomework::history{"resource.$part.$id.submission"};
           } else {
               unless (($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurvey') ||
                       ($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurveycred')) {
                   $lastresp = $Apache::lonhomework::history{"resource.$part.$id.submission"};
               }
         }          }
  my %lastresponse=&Apache::lonnet::str2hash($lastresp);   my %lastresponse=&Apache::lonnet::str2hash($lastresp);
  my $lastopt=$lastresponse{$name};   my $lastopt=$lastresponse{$name};
Line 452  sub displayfoils { Line 688  sub displayfoils {
     $text='<b>'.$value.':</b> '.$text;      $text='<b>'.$value.':</b> '.$text;
  }   }
     } else {      } else {
  $text='&#149;'.$text;                  if (@whichopt > 1) {
                       $text='&#149;'.$text;
                   }
     }      }
     $result.=$text."\n";      $result.=$text."\n";
  }   }
Line 463  sub displayfoils { Line 701  sub displayfoils {
     }      }
   } else {    } else {
     my $temp=1;      my $temp=1;
     my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});      my %lastresponse;
       my $newvariation;
       if ((($Apache::lonhomework::history{"resource.$part.type"} eq 'randomizetry') ||
           ($Apache::lonhomework::type eq 'randomizetry')) &&
           ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
           if ($env{'form.'.$part.'.rndseed'} ne
               $Apache::lonhomework::history{"resource.$part.rndseed"}) {
               $newvariation = 1;
           }
       }
       unless ($newvariation) {
           if ((($env{'form.grade_username'} eq '') && ($env{'form.grade_domain'} eq '')) ||
               (($env{'form.grade_username'} eq $env{'user.name'}) &&
                ($env{'form.grade_domain'} eq $env{'user.domain'}))) {
                    %lastresponse =
                        &Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
           } else {
               unless (($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurvey') ||
                       ($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurveycred')) {
                   %lastresponse =
                       &Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"});
               }
           }
       }
     my $internal_counter=$Apache::lonxml::counter;      my $internal_counter=$Apache::lonxml::counter;
     my $checkboxopt=&check_box_opt($target,$checkboxvalue,@opt);      my $checkboxopt;
     if ($checkboxopt) {      if ($target eq 'web') {
        $result.='<br />'.&mt('Choices: ').'<b>'.$opt[0].','.$opt[1].'</b>. '.          $checkboxopt=&check_box_opt($target,$checkboxvalue,@opt);
                 &mt('Select all that are <b>[_1]</b>.',$checkboxopt);      }
       if ($checkboxopt && (!$no_tfprompt)) {
          $result.='<br />'.
                   ($checkboxchoices?&mt('Choices: ').'<b>'.$opt[0].','.$opt[1].'</b>. ':'').
                    &mt('Select all that are [_1].','<b>'.$checkboxopt.'</b>');
     }      }
     foreach $name (@whichopt) {      foreach $name (@whichopt) {
       my $text=$Apache::response::foilgroup{$name.'.text'};        my $text=$Apache::response::foilgroup{$name.'.text'};
Line 530  sub displayfoils { Line 795  sub displayfoils {
 # fieldname is this input field's name after HWVAL_  # fieldname is this input field's name after HWVAL_
                   $optionlist='<input type="hidden" name="HWVAL_'.$fieldname.'" value="'.$escdefopt.'" />'.                    $optionlist='<input type="hidden" name="HWVAL_'.$fieldname.'" value="'.$escdefopt.'" />'.
                   '<input type="checkbox" name="HWCHK_'.$fieldname.'" onclick="javascript:if (this.form.elements[\'HWCHK_'.                    '<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";                    $fieldname.'\'].checked) { this.form.elements[\'HWVAL_'.$fieldname.'\'].value=\''.$esccheckboxopt.'\'; } else { this.form.elements[\'HWVAL_'.$fieldname.'\'].value=\''.$escaltopt.'\'; };javascript:setSubmittedPart(\''.$part.'\');"'.($defopt eq $checkboxopt?' checked="checked"':'')." />\n";
               } else {                } else {
 # classic selection list  # classic selection list
           $optionlist='<select onchange="javascript:setSubmittedPart(\''.            $optionlist='<select onchange="javascript:setSubmittedPart(\''.
Line 543  sub displayfoils { Line 808  sub displayfoils {
   }    }
   if ($text=~s|<drawoptionlist\s*/>|$optionlist|) {    if ($text=~s|<drawoptionlist\s*/>|$optionlist|) {
       if ($Apache::lonhomework::type ne 'exam') {        if ($Apache::lonhomework::type ne 'exam') {
   $text='&#149;'.$text;                    if (@whichopt > 1) {  
                         $text='&#149;'.$text;
                     }
       }        }
   } else {    } else {
       if ($Apache::lonhomework::type ne 'exam') {        if ($Apache::lonhomework::type ne 'exam') {
Line 583  sub displayfoils { Line 850  sub displayfoils {
       }        }
   }    }
   if ($Apache::lonhomework::type eq 'exam') {    if ($Apache::lonhomework::type eq 'exam') {
       $result.='\vskip -1 mm\noindent\begin{enumerate}\item[\textbf{'.        $result.='\vskip -1 mm\noindent';
   $internal_counter.'}.]'.&bubbles(\@alphabet,\@opt).                my ($numrows,$bubbles_per_row) = &getnumrows(scalar(@opt)); 
   '\end{enumerate} \vskip -8 mm \strut ';                if ($numrows == 1) {  
       $internal_counter++;                    $result .= '\textbf{'.$internal_counter.'}. \vskip -3mm';
                 } else {
                     my $linetext;
                     for (my $i=0; $i<$numrows; $i++) {
                         $linetext .= $internal_counter+$i.', ';
                     }
                     $linetext =~ s/,\s$//;
                     $result .= '\small {\textbf{'.$linetext.'}} '.
                                '\hskip 2 mm {\footnotesize '.
                                &mt('(Bubble once in [_1] lines)',$numrows).
                                '} \vskip 1 mm';
                 }
                 $result.= &bubbles(\@alphabet,\@opt,undef,undef,$numrows,
                                    $bubbles_per_row,$internal_counter).
                           ' \strut ';
         $internal_counter += $numrows;
   }    }
           if ($target eq 'tex' && $env{'form.pdfFormFields'} eq 'yes'            if ($target eq 'tex' && $env{'form.pdfFormFields'} eq 'yes'
               && $Apache::inputtags::status[-1] eq 'CAN_ANSWER'                && $Apache::inputtags::status[-1] eq 'CAN_ANSWER'
Line 601  sub displayfoils { Line 883  sub displayfoils {
   }    }
   
   if ($target eq 'web') {    if ($target eq 'web') {
       &Apache::response::setup_prior_tries_hash(\&Apache::rankresponse::format_prior_answer,        my $data = [\@whichopt,'submissiongrading'];
  [\@whichopt,        my $questiontype;
  'submissiongrading']);        if ($Apache::lonhomework::type eq 'randomizetry') {
             $questiontype = $Apache::lonhomework::type,
         }
         &Apache::response::setup_prior_tries_hash(\&Apache::rankresponse::format_prior_answer,$data,$questiontype);
   }    }
   
   if ($target ne 'tex') {    if ($target ne 'tex') {
Line 664  sub webbubbles { Line 949  sub webbubbles {
   
   
 sub bubbles {  sub bubbles {
     my ($ralphabet,$ropt,$response, $max_width) = @_;      my ($ralphabet,$ropt,$response,$max_width,$numrows,$bubbles_per_row,
           $internal_counter) = @_;
     my @alphabet = @$ralphabet;      my @alphabet = @$ralphabet;
     my @opt = @$ropt;      my @opt = @$ropt;
     my ($result,$head,$line) =('','','');      my ($result,$head,$line) =('','','');
Line 685  sub bubbles { Line 971  sub bubbles {
     }      }
     &Apache::lonxml::debug("Final maxwidth: $textwidth");      &Apache::lonxml::debug("Final maxwidth: $textwidth");
     for (my $ind=0;$ind<=$number_of_bubbles;$ind++) {      for (my $ind=0;$ind<=$number_of_bubbles;$ind++) {
           my $item;
           if ($numrows > 1) {
               my $num = $internal_counter+int($ind/$bubbles_per_row);
               my $idx = int($ind % $bubbles_per_row);
               $item = $num.$alphabet[$idx];
           } else {
               $item = $alphabet[$ind];
           }
  my $leftmargin;   my $leftmargin;
  $opt[$ind]=&Apache::lonxml::latex_special_symbols($opt[$ind]);   $opt[$ind]=&Apache::lonxml::latex_special_symbols($opt[$ind]);
  if ($response eq 'rankresponse') {$opt[$ind]='Rank '.$opt[$ind];}   if ($response eq 'rankresponse') {$opt[$ind]='Rank '.$opt[$ind];}
  if ($ind==0) {$leftmargin=6;} else {$leftmargin=10;}   if ($ind==0) {$leftmargin=6;} else {$leftmargin=10;}
   
  $current_length += (length($opt[$ind])+length($alphabet[$ind])+4)*2;   $current_length += (length($opt[$ind])+length($item)+5)*2;
           
  if ($current_length<($textwidth-$leftmargin) and $ind!=$number_of_bubbles) {   if ($current_length<($textwidth-$leftmargin) and $ind!=$number_of_bubbles) {
     $line.='\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';              
       $line.='\hskip 4 mm {\small \textbf{'.$item.'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';
     $head.='lr';      $head.='lr';
  } else {   } else {
     $line=~s/\&\s*$//;      $line=~s/\&\s*$//;
     $result.='\vskip -2 mm\noindent\setlength{\tabcolsep}{2 mm}\begin{tabular}{'.$head.'}'.$line.'\\\\\end{tabular}\vskip 0 mm';      $result.='\vskip -1 mm\noindent\setlength{\tabcolsep}{2 mm}\renewcommand{\arraystretch}{1.25}\begin{tabular}{'.$head.'}'.$line.'\\\\\end{tabular}\vskip 0 mm';
     $line = '\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';;      $line = '\hskip 4 mm {\small \textbf{'.$item.'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';
     $head ='lr';      $head ='lr';
     $current_length = (length($opt[$ind])+length($alphabet[$ind]))*2;      $current_length = (length($opt[$ind])+length($item))*2;
  }   }
   
     }      }
     return $result;      return $result;
 }  }
   
   
 sub start_conceptgroup {  sub start_conceptgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   $Apache::optionresponse::conceptgroup=1;    $Apache::optionresponse::conceptgroup=1;
Line 851  sub insert_foil { Line 1146  sub insert_foil {
 sub insert_drawoptionlist {  sub insert_drawoptionlist {
     return '<drawoptionlist />';      return '<drawoptionlist />';
 }  }
   
   sub getnumrows {
       my ($numitems) = @_;
       my $bubbles_per_row;
       my $default_numbubbles = 10;
       if (($env{'form.bubbles_per_row'} =~ /^\d+$/) &&
           ($env{'form.bubbles_per_row'} > 0)) {
           $bubbles_per_row = $env{'form.bubbles_per_row'};
       } else {
           $bubbles_per_row = $default_numbubbles;
       }
       my $numrows = int ($numitems/$bubbles_per_row);
       if (($numitems % $bubbles_per_row) != 0) {
           $numrows ++;
       }
       return ($numrows,$bubbles_per_row);
   }
   
 1;  1;
 __END__  __END__
     

Removed from v.1.164  
changed lines
  Added in v.1.201


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