Diff for /loncom/homework/inputtags.pm between versions 1.109 and 1.337

version 1.109, 2003/07/15 21:26:23 version 1.337, 2015/10/05 02:35:40
Line 24 Line 24
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  
 # 2/19 Guy   =pod
   
   =head1 NAME
   
   Apache::inputtags
   
   =head1 SYNOPSIS
   
   
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   
   =head1 NOTABLE SUBROUTINES
   
   =over
   
   =item 
   
   =back
   
   =cut
   
 package Apache::inputtags;  package Apache::inputtags;
 use HTML::Entities();  use HTML::Entities();
 use strict;  use strict;
 use Apache::loncommon;  use Apache::loncommon;
   use Apache::lonhtmlcommon;
   use Apache::lonlocal;
   use Apache::lonnet;
   use LONCAPA;
    
   
 BEGIN {  BEGIN {
   &Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline'));      &Apache::lonxml::register('Apache::inputtags',('hiddensubmission','hiddenline','textfield','textline'));
 }  }
   
   =pod
   
   =item initialize_inputtags()
   
   Initializes a set of global variables used during the parse of the problem.
   
   @Apache::inputtags::input        - List of current input ids.
   @Apache::inputtags::inputlist    - List of all input ids seen this problem.
   @Apache::inputtags::response     - List of all current resopnse ids.
   @Apache::inputtags::responselist - List of all response ids seen this 
                                        problem.
   @Apache::inputtags::hint         - List of all hint ids.
   @Apache::inputtags::hintlist     - List of all hint ids seen this problem.
   @Apache::inputtags::previous     - List describing if specific responseds
                                        have been used
   @Apache::inputtags::previous_version - Submission responses were used in.
   $Apache::inputtags::part         - Current part id (valid only in 
                                        <problem>)
                                      0 if not in a part.
   @Apache::inputtags::partlist     - List of part ids seen in the current
                                        <problem>
   @Apache::inputtags::status       - List of problem  statuses. First 
                                      element is the status of the <problem>
                                      the remainder are for individual <part>s.
   %Apache::inputtags::params       - Hash of defined parameters for the
                                      current response.
   @Apache::inputtags::import       - List of all ids for <import> thes get
                                      join()ed and prepended.
   @Apache::inputtags::importlist   - List of all import ids seen.
   $Apache::inputtags::response_with_no_part
                                    - Flag set true if we have seen a response
                                      that is not inside a <part>
   %Apache::inputtags::answertxt    - <*response> tags store correct
                                      answer strings for display by <textline/>
                                      in this hash.
   %Apache::inputtags::submission_display
                                    - <*response> tags store improved display
                                      of submission strings for display by part
                                      end.
   
   =cut
   
 sub initialize_inputtags {  sub initialize_inputtags {
   # list of current input ids      @Apache::inputtags::input=();
   @Apache::inputtags::input=();      @Apache::inputtags::inputlist=();
   # list of all input ids seen in this problem      @Apache::inputtags::response=();
   @Apache::inputtags::inputlist=();      @Apache::inputtags::responselist=();
   # list of all current response ids      @Apache::inputtags::hint=();
   @Apache::inputtags::response=();      @Apache::inputtags::hintlist=();
   # list of all response ids seen in this problem      @Apache::inputtags::previous=();
   @Apache::inputtags::responselist=();      @Apache::inputtags::previous_version=();
   # list of whether or not a specific response was previously used      $Apache::inputtags::part='';
   @Apache::inputtags::previous=();      @Apache::inputtags::partlist=();
   # submission it was used in      @Apache::inputtags::status=();
   @Apache::inputtags::previous_version=();      %Apache::inputtags::params=();
   # id of current part, 0 means that no part is current (inside <problem> only      @Apache::inputtags::import=();
   $Apache::inputtags::part='';      @Apache::inputtags::importlist=();
   # list of all part ids seen      $Apache::inputtags::response_with_no_part=0;
   @Apache::inputtags::partlist=();      %Apache::inputtags::answertxt=();
   # list of problem date statuses, the first element is for <problem>      %Apache::inputtags::submission_display=();
   # if there is a second element it is for the current <part>  }
   @Apache::inputtags::status=();  
   # hash of defined params for the current response  #
   %Apache::inputtags::params=();  #  provides the onblur binding for spellchecking.  This could be an
   # list of all ids, for <import>, these get join()ed and prepended  #  empty string if spellchecking was not enabled.
   @Apache::inputtags::import=();  #  Jquery selector binding is done rather than setting an onblur
   # list of all import ids seen  #  attribute because we'll need to set the element's spellcheck language
   @Apache::inputtags::importlist=();  #  option dynamically so we need $(this) to be defined.
   #
   # @param id   - The element id to bind.
   # @param lang - Language in which spellchecking is desired.
   #               if undef, nothing is generated.  
   # @return string - onblur specification to do the requested spellchecking.
   #
   sub spellcheck_onblur {
       my ($id, $lang) = @_;
       my $result = '';
       if ($lang) {
   
    $result = <<JAVASCRIPT;
   <script type="text/javascript">
   \$('\#$id').blur(function() {
       doSpellcheck('\#$id', '$lang');
    });
   </script>
   
   JAVASCRIPT
   
   
       }
       return $result;
 }  }
   
 sub check_for_duplicate_ids {  sub check_for_duplicate_ids {
     my %check;      my %check;
     foreach my $id (@Apache::inputtags::partlist,      foreach my $id (@Apache::inputtags::partlist,
     @Apache::inputtags::responselist,      @Apache::inputtags::responselist,
       @Apache::inputtags::hintlist,
     @Apache::inputtags::importlist) {      @Apache::inputtags::importlist) {
  $check{$id}++;   $check{$id}++;
     }      }
Line 84  sub check_for_duplicate_ids { Line 176  sub check_for_duplicate_ids {
 }  }
   
 sub start_input {  sub start_input {
   my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval)=@_;
   my $id = &Apache::lonxml::get_param('id',$parstack,$safeeval);      my $id = &Apache::lonxml::get_id($parstack,$safeeval);
   if ($id eq '') { $id = $Apache::lonxml::curdepth; }      push (@Apache::inputtags::input,$id);
   push (@Apache::inputtags::input,$id);      push (@Apache::inputtags::inputlist,$id);
   push (@Apache::inputtags::inputlist,$id);      return $id;
   return $id;  
 }  }
   
 sub end_input {  sub end_input {
   pop @Apache::inputtags::input;      pop @Apache::inputtags::input;
   return '';      return '';
   }
   
   sub addchars {
       my ($fieldid,$addchars)=@_;
       my $output='';
       foreach (split(/\,/,$addchars)) {
    $output.='<a href="javascript:void(document.forms.lonhomework.'.
       $fieldid.'.value+=\''.$_.'\')">'.$_.'</a> ';
       }
       return $output;
 }  }
   
 sub start_textfield {  sub start_textfield {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result = "";      my $result = "";
   my $id = &start_input($parstack,$safeeval);      my $id = &start_input($parstack,$safeeval);
   my $resid=$Apache::inputtags::response[-1];      my $resid=$Apache::inputtags::response[-1];
   if ($target eq 'web') {      if ($target eq 'web') {
     $Apache::lonxml::evaluate--;   $Apache::lonxml::evaluate--;
     if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {  
  my $partid=$Apache::inputtags::part;   my $partid=$Apache::inputtags::part;
  my $oldresponse = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$partid.$resid.submission"});          my ($oldresponse,$newvariation);
  my $cols = &Apache::lonxml::get_param('cols',$parstack,$safeeval);          if ((($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry') ||
  if ( $cols eq '') { $cols = 80; }               ($Apache::lonhomework::type eq 'randomizetry')) &&
  my $rows = &Apache::lonxml::get_param('rows',$parstack,$safeeval);               ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
  if ( $rows eq '') { $rows = 10; }              if ($env{'form.'.$partid.'.rndseed'} ne
  $result= '<textarea name="HWVAL_'.$resid.'" '.                  $Apache::lonhomework::history{"resource.$partid.rndseed"}) {
     "rows=\"$rows\" cols=\"$cols\">".$oldresponse;                  $newvariation = 1;
  if ($oldresponse ne '') {              }
     #get rid of any startup text if the user has already responded          }
     &Apache::lonxml::get_all_text("/textfield",$parser);          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'}))) {
                   $oldresponse = $Apache::lonhomework::history{"resource.$partid.$resid.submission"};
               } elsif (($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurvey') ||
                       ($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurveycred')) {
                   $oldresponse = '* '.&mt('(only shown to submitter)').' *';
               } else {
                   $oldresponse = $Apache::lonhomework::history{"resource.$partid.$resid.submission"};
               }
           }
    if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
       my $cols = &Apache::lonxml::get_param('cols',$parstack,$safeeval);
       if ( $cols eq '') { $cols = 80; }
       my $rows = &Apache::lonxml::get_param('rows',$parstack,$safeeval);
       if ( $rows eq '') { $rows = 16; }
       my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval);
       $result='';
       my $tagident = 'HWVAL_' . $resid;
               my $itemid = 'HWVAL_'.$partid.'_'.$resid;
       if ($addchars) {
    $result.=&addchars($tagident, $addchars);
       }
               my $textareaclass;
               unless (&Apache::londefdef::is_inside_of($tagstack,
                                                       'externalresponse')) {
                   $textareaclass = 'class="LC_richDetectHtml spellchecked"';
               }
       $result.= '<textarea wrap="hard" name="'.$tagident.'" id="'.$itemid.'" ' .
         'rows="'.$rows.'" cols="'.$cols.'" '.$textareaclass
         .'>'.
                         &HTML::Entities::encode($oldresponse,'<>&"');
       if ($oldresponse ne '') {
   
    #get rid of any startup text if the user has already responded
    &Apache::lonxml::get_all_text("/textfield",$parser,$style);
       }
    } else {
       #show past answer in the essayresponse case
       if ($oldresponse =~ /\S/
    && &Apache::londefdef::is_inside_of($tagstack,
       'essayresponse') ) {
    $result='<table class="LC_pastsubmission"><tr><td>'.
       &HTML::Entities::encode($oldresponse,'"<>&').
                       '</td></tr></table>';
       }
       #get rid of any startup text
       &Apache::lonxml::get_all_text("/textfield",$parser,$style);
    }
       } elsif ($target eq 'grade') {
    my $seedtext=&Apache::lonxml::get_all_text("/textfield",$parser,
      $style);
    if ($seedtext eq $env{'form.HWVAL_'.$resid}) {
       # if the seed text is still there it wasn't a real submission
       $env{'form.HWVAL_'.$resid}='';
    }
       } elsif ($target eq 'edit') {
    $result.=&Apache::edit::tag_start($target,$token);
    $result.=&Apache::edit::text_arg('Rows:','rows',$token,4);
    $result.=&Apache::edit::text_arg('Columns:','cols',$token,4);
    $result.=&Apache::edit::text_arg
       ('Click-On Texts (comma sep):','addchars',$token,10);
    my $bodytext=&Apache::lonxml::get_all_text("/textfield",$parser,
      $style);
    $result.=&Apache::edit::editfield($token->[1],$bodytext,'Text you want to appear by default:',80,2);
           my $spell_langs = &spelling_languages();
    $result .= &Apache::edit::select_arg('Spellcheck for:', 'spellcheck',
        $spell_langs, $token);
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
        $safeeval,'rows','cols',
        'addchars', 'spellcheck');
    if ($constructtag) {
       $result = &Apache::edit::rebuild_tag($token);
    } else {
       $result=$token->[4];
    }
    $result.=&Apache::edit::modifiedfield("/textfield",$parser);
       } elsif ($target eq 'tex') {
    my $number_of_lines = &Apache::lonxml::get_param('rows',$parstack,$safeeval);
    my $width_of_box = &Apache::lonxml::get_param('cols',$parstack,$safeeval);
    if ($$tagstack[-2] eq 'essayresponse' and $Apache::lonhomework::type eq 'exam') {
       $result = '\fbox{\fbox{\parbox{\textwidth-5mm}{';
       for (my $i=0;$i<int $number_of_lines*2;$i++) {$result.='\strut \\\\ ';}
       $result.='\strut \\\\\strut \\\\\strut \\\\\strut \\\\}}}';
    } else {
               if ($env{'form.pdfFormFields'} eq 'yes') {
                   my $fieldname = $env{'request.symb'}.
                                   '&part_'. $Apache::inputtags::part.
                                   '&textresponse'.
                                   '&HWVAL_' . $Apache::inputtags::response['-1'];
                   $result.='\TextField[name='.$fieldname.',multiline=true,height=6\baselineskip,width=270,borderwidth=0,backgroundcolor={.85 .85 .85}]\\';
               } else {
                   my $TeXwidth=$width_of_box/80;
                   $result = '\vskip 1 mm \fbox{\fbox{\parbox{'.$TeXwidth.'\textwidth-5mm}{';
                   for (my $i=0;$i<int $number_of_lines*2;$i++) {$result.='\strut \\\\ ';}
                   $result.='}}}\vskip 2 mm ';
               }
  }   }
     } else {  
  #right or wrong don't show it  
  #$result='<table border="1"><tr><td><i>'.$oldresponse.'</i></td></tr></table>';  
  $result='';  
  #get rid of any startup text  
  &Apache::lonxml::get_all_text("/textfield",$parser);  
     }  
   } elsif ($target eq 'grade') {  
     my $seedtext=&Apache::lonxml::get_all_text("/textfield",$parser);  
     if ($seedtext eq $ENV{'form.HWVAL_'.$resid}) {  
       # if the seed text is still there it wasn't a real submission  
       $ENV{'form.HWVAL_'.$resid}='';  
     }  
   } elsif ($target eq 'edit') {  
     $result.=&Apache::edit::tag_start($target,$token);  
     $result.=&Apache::edit::text_arg('Rows:','rows',$token,4);  
     $result.=&Apache::edit::text_arg('Columns:','cols',$token,4);  
     my $bodytext=&Apache::lonxml::get_all_text("/textfield",$parser);  
     $result.=&Apache::edit::editfield($token->[1],$bodytext,'Text you want to appear by default:',80,2);  
   } elsif ($target eq 'modified') {  
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,  
  $safeeval,'rows','cols');  
     if ($constructtag) {  
       $result = &Apache::edit::rebuild_tag($token);  
     } else {  
       $result=$token->[4];  
     }      }
     my $bodytext=&Apache::lonxml::get_all_text("/textfield",$parser);      return $result;
     $result.=&Apache::edit::modifiedfield();  
   } elsif ($target eq 'tex') {  
       my $number_of_lines = &Apache::lonxml::get_param('rows',$parstack,$safeeval);  
       my $width_of_box = &Apache::lonxml::get_param('cols',$parstack,$safeeval);  
       if ($$tagstack[-2] eq 'essayresponse' and $Apache::lonhomework::type eq 'exam') {  
   $result = '\fbox{\fbox{\parbox{\textwidth-5mm}{';  
   for (my $i=0;$i<int $number_of_lines*2;$i++) {$result.='\strut \\\\ ';}  
   $result.='\strut \\\\\strut \\\\\strut \\\\\strut \\\\}}}';  
       } else {  
   my $TeXwidth=$width_of_box/80;  
   $result = '\vskip 1 mm \fbox{\fbox{\parbox{'.$TeXwidth.'\textwidth-5mm}{';  
   for (my $i=0;$i<int $number_of_lines*2;$i++) {$result.='\strut \\\\ ';}  
   $result.='}}}\vskip 2 mm ';  
       }  
   }  
   return $result;  
 }  }
   
 sub end_textfield {  sub end_textfield {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   my $result;      my $result;
   if ($target eq 'web') {      if ($target eq 'web') {
     $Apache::lonxml::evaluate++;   my $spellcheck = &Apache::lonxml::get_param('spellcheck', $parstack, $safeeval);
     if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {   $Apache::lonxml::evaluate++;
       return "</textarea>";   if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
               my $partid=$Apache::inputtags::part;
       my $resid = $Apache::inputtags::response[-1];
       my $itemid = 'HWVAL_' . $partid . '_' . $resid;
       my $result =  "</textarea>";
       $result .= &spellcheck_onblur($itemid, $spellcheck);
       return $result;
    }
       } elsif ($target eq 'edit') {
    $result=&Apache::edit::end_table();
       }
       &end_input;
       return $result;
   }
   
   sub exam_score_line {
       my ($target) = @_;
   
       my $result;
       if ($target eq 'tex') {
    my $repetition = &Apache::response::repetition();
    $result.='\begin{enumerate}';
    if ($env{'request.state'} eq "construct" ) {$result.='\item[\strut]';}
    foreach my $i (0..$repetition-1) {
       $result.='\item[\textbf{'.
    ($Apache::lonxml::counter+$i).
    '}.]\textit{Leave blank on scoring form}\vskip 0 mm';
    }
    $result.= '\end{enumerate}';
     }      }
   } elsif ($target eq 'edit') {  
     $result=&Apache::edit::end_table();      return $result;
   }  }
   &end_input;  
   return $result;  sub exam_box {
       my ($target) = @_;
       my $result;
   
       if ($target eq 'tex') {
    $result .= '\fbox{\fbox{\parbox{\textwidth-5mm}{\strut\\\\\strut\\\\\strut\\\\\strut\\\\}}}';
    $result .= &exam_score_line($target);
       } elsif ($target eq 'web') {
    my $id=$Apache::inputtags::response[-1];
    $result.= '<br /><br />
                      <textarea name="HWVAL_'.$id.'" rows="4" cols="50">
                      </textarea> <br /><br />';
       }
       return $result;
   }
   
   sub needs_exam_box {
       my ($tagstack) = @_;
       my @tags = ('formularesponse',
    'stringresponse',
    'reactionresponse',
    'organicresponse',
    );
   
       foreach my $tag (@tags) {
    if (grep(/\Q$tag\E/,@$tagstack)) {
       return 1;
    }
       }
       return 0;
 }  }
   
 sub start_textline {  sub start_textline {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   my $result = "";      my $result = "";
   if ($target eq 'web') {      my $input_id = &start_input($parstack,$safeeval);
     $Apache::lonxml::evaluate--;  
     my $partid=$Apache::inputtags::part;      # The spellcheck attribute 
     my $id=$Apache::inputtags::response[-1];      # 1. enables spellchecking.
     if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {      # 2. Provides the language code in which the spellchecking will be performed.
       my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);  
       my $maxlength;      my $spellcheck = &Apache::lonxml::get_param('spellcheck', $parstack, $safeeval);
       if ($size eq '') { $size=20; } else {      if ($target eq 'web') {
  if ($size < 20) { $maxlength=$size; }   $Apache::lonxml::evaluate--;
       }   my $partid=$Apache::inputtags::part;
       my $oldresponse = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$partid.$id.submission"});   my $id=$Apache::inputtags::response[-1];
       if ($Apache::lonhomework::type ne 'exam') {   if (!&Apache::response::show_answer()) {
         $result= '<input type="text" name="HWVAL_'.$id.'" value="'.      my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
     $oldresponse.'" size="'.$size.'" maxlength="'.$maxlength.'" />';      my $maxlength;
       }      if ($size eq '') { $size=20; } else {
     } else {   if ($size < 20) {
       #right or wrong don't show what was last typed in.      $maxlength = ' maxlength="'.$size.'"';
       #$result='<i>'.$oldresponse.'</i>';   }
       $result='';      }
     }              my ($oldresponse,$newvariation);
   } elsif ($target eq 'edit') {              if ((($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry') ||
     $result=&Apache::edit::tag_start($target,$token);                   ($Apache::lonhomework::type eq 'randomizetry')) &&
     $result.=&Apache::edit::text_arg('Size:','size',$token,'5')."</td></tr>";                   ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
     $result.=&Apache::edit::end_table;                  if ($env{'form.'.$partid.'.rndseed'} ne
   } elsif ($target eq 'modified') {                      $Apache::lonhomework::history{"resource.$partid.rndseed"}) {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'size');                      $newvariation = 1;
     if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }                  }
   } elsif ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {              }
       my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);              unless ($newvariation) {
       if ($size != 0) {$size=$size*2; $size.=' mm';} else {$size='40 mm';}                  if ((($env{'form.grade_username'} eq '') && ($env{'form.grade_domain'} eq '')) ||
       $result='\framebox['.$size.'][s]{\tiny\strut}';                      (($env{'form.grade_username'} eq $env{'user.name'}) &&
   }                       ($env{'form.grade_domain'} eq $env{'user.domain'}))) {
   return $result;                      $oldresponse = $Apache::lonhomework::history{"resource.$partid.$id.submission"};
                   } elsif (($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurvey') ||
                           ($Apache::lonhomework::history{"resource.$partid.type"} eq 'anonsurveycred') ||
                           ($Apache::lonhomework::type eq 'anonsurvey') ||
                           ($Apache::lonhomework::type eq 'anonsurveycred')) {
                           $oldresponse = '* '.&mt('(only shown to submitter)').' *';
                   } else {
                       $oldresponse = $Apache::lonhomework::history{"resource.$partid.$id.submission"};
                   }
           &Apache::lonxml::debug("oldresponse $oldresponse is ".ref($oldresponse));
           if (ref($oldresponse) eq 'ARRAY') {
       $oldresponse = $oldresponse->[$#Apache::inputtags::inputlist];
           }
           $oldresponse = &HTML::Entities::encode($oldresponse,'<>&"');
                   $oldresponse =~ s/^\s+//;
                   $oldresponse =~ s/\s+$//;
                   $oldresponse =~ s/\s+/ /g;
               }
       if ($Apache::lonhomework::type ne 'exam') {
    my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval);
    $result='';
    if ($addchars) {
       $result.=&addchars('HWVAL_'.$id,$addchars);
    }
    my $readonly=&Apache::lonxml::get_param('readonly',$parstack,
    $safeeval);
    if (lc($readonly) eq 'yes' 
       || $Apache::inputtags::status[-1] eq 'CANNOT_ANSWER') {
       $readonly=' readonly="readonly" ';
    } else {
       $readonly='';
    }
    my $name = 'HWVAL_'.$id;
                   my $itemid = 'HWVAL_'.$partid.'_'.$id;
    if ($Apache::inputtags::status[-1] eq 'CANNOT_ANSWER') {
       $name = "none";
    }
    $result.= '<input onkeydown="javascript:setSubmittedPart(\''.$partid.'\');"'
        . ' onfocus="javascript:disableAutoComplete(\''.$itemid.'\');"'
        . ' type="text" '.$readonly.' name="'. $name . '"'
        . ' id="' . $itemid . '"'
        . ' value="'.  $oldresponse.'"'
        . ' class="LC_textline spellchecked"  size="'.$size.'"'.$maxlength.' />';
   
    $result .= &spellcheck_onblur($itemid, $spellcheck);
       }
       if ($Apache::lonhomework::type eq 'exam'
    && &needs_exam_box($tagstack)) {
    $result.=&exam_box($target);
       }
    } else {
       #right or wrong don't show what was last typed in.
       my $count = scalar(@Apache::inputtags::inputlist)-1;
       $result='<b>'.$Apache::inputtags::answertxt{$id}[$count].'</b>';
       #$result='';
    }
       } elsif ($target eq 'edit') {
    $result=&Apache::edit::tag_start($target,$token);
    $result.=&Apache::edit::text_arg('Size:','size',$token,'5').
       &Apache::edit::text_arg('Click-On Texts (comma sep):',
       'addchars',$token,10);
           $result.=&Apache::edit::select_arg('Readonly:','readonly',
      ['no','yes'],$token);
           my $spell_langs = &spelling_languages();
    $result.=&Apache::edit::select_arg('Spellcheck for:', 'spellcheck',
      $spell_langs, $token);
    $result.=&Apache::edit::end_row();
    $result.=&Apache::edit::end_table();
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
        $safeeval,'size',
        'addchars','readonly', 'spellcheck');
    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       } elsif ($target eq 'tex' 
        && $Apache::lonhomework::type ne 'exam') {
    my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
    if ($size != 0) {$size=$size*2; $size.=' mm';} else {$size='40 mm';}
    if ($env{'form.pdfFormFields'} eq 'yes'
               && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
               my $fieldname = $env{'request.symb'}.
                                    '&part_'. $Apache::inputtags::part.
                                    '&textresponse'.
                                    '&HWVAL_' . $Apache::inputtags::response['-1'];
               $result='\textField{'.$fieldname.'}{'.$size.'}{12 bp}';
           } else {
               $result='\framebox['.$size.'][s]{\tiny\strut}';
           }
       } elsif ($target eq 'tex' 
        && $Apache::lonhomework::type eq 'exam'
        && &needs_exam_box($tagstack)) {
    $result.=&exam_box($target);
       }
       return $result;
 }  }
   
 sub end_textline {  sub end_textline {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   if    ($target eq 'web') { $Apache::lonxml::evaluate++; }      if    ($target eq 'web') { $Apache::lonxml::evaluate++; }
   elsif ($target eq 'edit') { return ('','no'); }      elsif ($target eq 'edit') { return ('','no'); }
   return "";      &end_input();
       return "";
 }  }
   
 sub start_hiddenline {  sub start_hiddenline {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result = "";      my $result = "";
       my $input_id = &start_input($parstack,$safeeval);
     if ($target eq 'web') {      if ($target eq 'web') {
  $Apache::lonxml::evaluate--;   $Apache::lonxml::evaluate--;
  if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {   if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
     my $partid=$Apache::inputtags::part;      my $partid=$Apache::inputtags::part;
     my $id=$Apache::inputtags::response[-1];      my $id=$Apache::inputtags::response[-1];
     my $oldresponse = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$partid.$id.submission"});      my $oldresponse = $Apache::lonhomework::history{"resource.$partid.$id.submission"};
       if (ref($oldresponse) eq 'ARRAY') {
    $oldresponse = $oldresponse->[$#Apache::inputtags::inputlist];
       }
       $oldresponse = &HTML::Entities::encode($oldresponse,'<>&"');
   
     if ($Apache::lonhomework::type ne 'exam') {      if ($Apache::lonhomework::type ne 'exam') {
  $result= '<input type="hidden" name="HWVAL_'.$id.'" value="'.   $result= '<input type="hidden" name="HWVAL_'.$id.'" value="'.
     $oldresponse.'" />';      $oldresponse.'" />';
Line 241  sub start_hiddenline { Line 553  sub start_hiddenline {
  $result=&Apache::edit::tag_start($target,$token);   $result=&Apache::edit::tag_start($target,$token);
  $result.=&Apache::edit::end_table;   $result.=&Apache::edit::end_table;
     }      }
   
       if ( ($target eq 'web' || $target eq 'tex')
    && $Apache::lonhomework::type eq 'exam'
    && &needs_exam_box($tagstack)) {
    $result.=&exam_box($target);
       }
     return $result;      return $result;
 }  }
   
 sub end_hiddenline {  sub end_hiddenline {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   if    ($target eq 'web') { $Apache::lonxml::evaluate++; }      if    ($target eq 'web') { $Apache::lonxml::evaluate++; }
   elsif ($target eq 'edit') { return ('','no'); }      elsif ($target eq 'edit') { return ('','no'); }
   return "";      &end_input();
       return "";
   }
   
   
   sub start_hiddensubmission {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $result = "";
       my $input_id = &start_input($parstack,$safeeval);
       if ($target eq 'web') {
           $Apache::lonxml::evaluate--;
           if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
               my $partid=$Apache::inputtags::part;
               my $id=$Apache::inputtags::response[-1];
               if ($Apache::lonhomework::type ne 'exam') {
                   my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
                   $value = &HTML::Entities::encode($value,'<>&"');
                   $result= '<input type="hidden" name="HWVAL_'.$id.'" value="'.$value.'" />';
               }
           }
       } elsif ($target eq 'edit') {
           $result=&Apache::edit::tag_start($target,$token);
           $result.=&Apache::edit::text_arg('Value:','value',$token,'15');
           $result.=&Apache::edit::end_row();
           $result.=&Apache::edit::end_table();
       } elsif ($target eq 'modified') {
           my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                                                        $safeeval,'value');
           if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       }
   
       if ( ($target eq 'web' || $target eq 'tex')
            && $Apache::lonhomework::type eq 'exam'
            && &needs_exam_box($tagstack)) {
           $result.=&exam_box($target);
       }
       return $result;
   }
   
   sub end_hiddensubmission {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       if    ($target eq 'web') { $Apache::lonxml::evaluate++; }
       elsif ($target eq 'edit') { return ('','no'); }
       &end_input();
       return "";
   }
   
   =pod
   
   =item file_selector()
   
   $part -> partid
   $id -> responseid
   $uploadefiletypes -> comma seperated list of extensions allowed or * for any
   $which -> 'uploadonly'  -> only newly uploaded files
             'portfolioonly' -> only allow files from portfolio
             'both' -> allow files from either location
   $extratext -> additional text to go between the link and the input box
   $maxfilesize -> maximum cumulative filesize for submitted files (in MB).
   returns a table row <tr> 
   
   =cut
   
   sub file_selector {
       my ($part,$id,$uploadedfiletypes,$which,$extratext,$maxfilesize)=@_;
       if (!$uploadedfiletypes) { return ''; }
   
       my $jspart=$part;
       $jspart=~s/\./_/g;
   
       my $result;
       my $current_files_display = &current_file_submissions($part,$id);
       my $addfiles;
       if ($current_files_display) {
           $result .= &Apache::lonhtmlcommon::row_title(&mt('Files currently selected for submission')).
                      $current_files_display.
                      &Apache::lonhtmlcommon::row_closure();
           $addfiles = &mt('Submit other file(s)');
       } else {
           $addfiles = &mt('Choose file(s) to submit');
       }
       $result .= &Apache::lonhtmlcommon::row_title($addfiles);
       my $constraints;
       if ($uploadedfiletypes ne '*') {
    $constraints =
       &mt('Allowed filetypes: [_1]','<b>'.$uploadedfiletypes.'</b>').'<br />';
       }
       if ($maxfilesize) {
           $constraints .= &mt('Combined size of all files not to exceed: [_1] MB.',
                           '<b>'.$maxfilesize.'</b>').'<br />';
       }
       if ($constraints) {
           $result .= $constraints.'<br />';
       }
       if ($which eq 'uploadonly' || $which eq 'both') { 
           my $free_space = $maxfilesize * 1048576;
           $result .= &mt('Submit a file: (only one file per submission)').
               ' <br /><input type="file" size="50" name="HWFILE'.$jspart.'_'.$id.
               '" id="HWFILE'.$jspart.'_'.$id.'" class="flUpload" /><br />'.
               '<input type="hidden" id="free_space" value="'.$free_space.'" /><br />'
           }
       if ( $which eq 'both') {
    $result.='<br />'.'<strong>'.&mt('OR:').'</strong><br />';
       }
       if ($which eq 'portfolioonly' || $which eq 'both') {
           my $symb = $env{'request.symb'};
           (undef,undef,my $res)=&Apache::lonnet::decode_symb($symb);
           my $showsymb;
           # If resource is a .task and URL is unencrypted, include symb in query string
           # for url opened in portfolio file selection window. Can be used to override
           # blocking of portfolio access resulting from an exam event in a different course. 
           if ($res =~ /\.task$/i) {
               my $encsymb = &Apache::lonenc::check_encrypt($symb);
               if ($symb eq $encsymb) {
                   $showsymb = $symb;
               }
           }
    $result.=$extratext.'<a href='."'".'javascript:void(window.open("/adm/portfolio?mode=selectfile&amp;fieldname='.$env{'form.request.prefix'}.'HWPORT'.$jspart.'_'.$id.'&amp;symb='.$showsymb.'","cat","height=600,width=800,scrollbars=1,resizable=1,menubar=2,location=1"))'."'".'>'.
       &mt('Select Portfolio Files: (one or more files per submission)').'</a><br />'.
       '<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'.
       '<br />';
   
       }
       $result.=&Apache::lonhtmlcommon::row_closure(1);
       return $result;
   }
   
   sub current_file_submissions {
       my ($part,$id) = @_;
       my $jspart=$part;
       $jspart=~s/\./_/g;
       my $uploadedfile=$Apache::lonhomework::history{"resource.$part.$id.uploadedfile"};
       my $portfiles=$Apache::lonhomework::history{"resource.$part.$id.portfiles"};
       return if (($uploadedfile eq '') && ($portfiles !~/[^\s]/));
       my @unversioned;
       foreach my $file (split(/\s*,\s*/,&unescape($portfiles))) {
           my ($path,$name) = ($file =~ m{^(.*/)([^/]+)$});
           my ($origname,$version,$ext) = &Apache::lonnet::file_name_version_ext($name);
           unless ($version) {
               push(@unversioned,$file);
           }    
       }
       return if (!@unversioned);
       my $header = &portpath_popup_js().
                    &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row();
       if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
           $header .= '<th>'.&mt('Delete?').'</th>';
       }
       $header .=   '<th>'.&mt('File').'</th>'.
                    '<th>'.&mt('Size (MB)').'</th>'.
                    '<th>'.&mt('Last Modified').'</th>'.
                    &Apache::loncommon::end_data_table_header_row();
       my ($symb,$crsid,$udom,$uname)=&Apache::lonnet::whichuser();
       my ($cdom,$cnum) = ($crsid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/);
       my ($result,$header_shown,%okfiles,%rows,%legacy,@bad_file_list);
       if ($uploadedfile) {
           my $url=$Apache::lonhomework::history{"resource.$part.$id.uploadedurl"};
           my $link = &HTML::Entities::encode($url,'<>&"');
           my ($path,$name) = ($url =~ m{^(/uploaded/\Q$udom\E/\Q$uname\E/essayresponse.*/)([^/]+)$});
           my ($status,$hashref,$error) =
               &current_file_info($url,$link,$name,$path);
           if ($status eq 'ok') {
               push(@{$okfiles{$name}},$url);
               $rows{$url} = $hashref;
               $legacy{$url} = 1;
               &Apache::lonxml::extlink($url);
               &Apache::lonnet::allowuploaded('/adm/essayresponse',$url);
           } else {
               push(@bad_file_list,$error);
           }
       }
       if (@unversioned > 0) {
           my $prefix = "/uploaded/$udom/$uname/portfolio";
           foreach my $file (@unversioned) {
               my ($path,$name) = ($file =~ m{^(.*/)([^/]+)$});
               my $url = $prefix.$path.$name;
               my $uploadedfile = &HTML::Entities::encode($url,'<>&"');
               my ($status,$hashref,$error) =
                   &current_file_info($url,$uploadedfile,$name,$path);
               if ($status eq 'ok') {
                   push(@{$okfiles{$name}},$url);
                   $rows{$url} = $hashref;
               } else {
                   push(@bad_file_list,$error);
               }
           }
       }
       my $num = 0;
       foreach my $name (sort(keys(%okfiles))) {
           if (ref($okfiles{$name}) eq 'ARRAY') {
               foreach my $url (@{$okfiles{$name}}) {
                   if (ref($rows{$url}) eq 'HASH') {
                       my $link = $rows{$url}{link};
                       my $portfile = $rows{$url}{path}.$rows{$url}{name};
                       $portfile = &HTML::Entities::encode($portfile,'<>&"');
                       if ($link) {
                           my $icon=&Apache::loncommon::icon($url);
                           unless ($header_shown) {
                               $result .= $header;
                               $header_shown = 1;
                           }
                           $result.=
                               &Apache::loncommon::start_data_table_row()."\n";
                           if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                               $result .=
                                    '<td valign="bottom"><input type="checkbox" name="HWFILE'.$jspart.'_'.$id.'_delete"'.
                                    ' value="'.$portfile.'" id="HWFILE'.$jspart.'_'.$id.'_'.$num.'_delete" /></td>'."\n";
                               $num ++;
                           }
                           my $pathid = 'HWFILE'.$jspart.'_'.$id.'_'.$num.'_path';
                           my $pathidtext = $pathid.'text';
                           my ($showname,$showpath);
                           if ($legacy{$url}) {
                               $showname = $name.' '.&mt('not in portfolio');
                           } else {
                               $showname = $name;
                               $showpath = '<br />'. 
                                           '<span id="'.$pathidtext.'" class="LC_cusr_subheading">'.
                                           '<a href="javascript:showPortPath('."'$pathid','$pathidtext'".');" '.
                                           'class="LC_menubuttons_link">'.
                                           &mt('(Show path)').'</a></span>'.
                                           '<div id="'.$pathid.'" class="LC_dccid">'.$rows{$url}{path}.$name.
   '</div>';
                           }
                           $result .= 
                               '<td><a href="'.$link.'"><img src="'.$icon.
                               '" border="0" alt="" />'.$showname.'</a>'.$showpath.'</td>'."\n".
                               '<td align="right" valign="bottom">'.$rows{$url}{size}.'</td>'."\n".
                               '<td align="right" valign="bottom">'.$rows{$url}{lastmodified}.'</td>'."\n".
                               &Apache::loncommon::end_data_table_row();
                       }
                   }
               }
           }
       }
       if ($header_shown) {
           $result .= &Apache::loncommon::end_data_table();
           if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
               $result .= '<br /><span class="LC_warning">'.
                          &mt('Exclude existing file(s) from grading by checking the "Delete?" checkbox(es) and clicking "Submit Answer"').'</span>';
           }
       }
       if (@bad_file_list) {
           my $bad_files = '<span class="LC_filename">'.
               join('</span>, <span class="LC_filename">',@bad_file_list).
               '</span>';
           $result.='<p class="LC_error">'.
                    &mt("These file(s) don't exist: [_1]",$bad_files).
                    '</p>';
       }
       return $result;
   }
   
   sub current_file_info {
       my ($url,$uploadedfile,$name,$path) = @_;
       my ($status,$error,%info);
       my @stat = &Apache::lonnet::stat_file($url);
       if ((@stat) && ($stat[0] ne 'no_such_dir')) {
           my ($lastmod,$size);
           if ($stat[9] =~ /^\d+$/) {
               $lastmod = &Apache::lonlocal::locallocaltime($stat[9]);
           }
           $size = $stat[7]/(1024*1024);
           $size = sprintf("%.3f",$size);
           %info = (
                       link         => $uploadedfile,
                       name         => $name,
                       path         => $path,
                       size         => $size,
                       lastmodified => $lastmod,
                   );
           $status = 'ok';
       } else {
           &Apache::lonnet::logthis("bad file is $url");
           my $icon=&Apache::loncommon::icon($url);
           $error = '<a href="'.$url.'"><img src="'.$icon.
                    '" border="0" />'.$uploadedfile.'</a>';
       }
       return ($status,\%info,$error);
   }
   
   sub portpath_popup_js {
       my %lt = &Apache::lonlocal::texthash(
                                             show => '(Show path)',
                                             hide => '(Hide)',
                                           );
       return <<"END";
   <script type="text/javascript"> 
   // <![CDATA[
   
   function showPortPath(id,idtext) {
       document.getElementById(id).style.display='block';
       document.getElementById(id).style.textAlign='left';
       document.getElementById(id).style.textFace='normal';
       if (document.getElementById(idtext)) {
           document.getElementById(idtext).innerHTML ='<a href="javascript:hidePortPath(\\''+id+'\\',\\''+idtext+'\\'); '+
                                                      '"class="LC_menubuttons_link">$lt{'hide'}</a>&nbsp;';
       }
       return;
   }
   
   function hidePortPath(id,idtext) {
       if (document.getElementById(id)) {
           document.getElementById(id).style.display='none';
       }
       if (document.getElementById(idtext)) {
           document.getElementById(idtext).innerHTML ='<a href="javascript:showPortPath(\\''+id+'\\',\\''+idtext+'\\');" '+
                                                      'class="LC_menubuttons_link">$lt{'show'}</a>';
       }
       return;
   }
   
   // ]]>
   </script>
   
   END
   }
   
   sub valid_award {
       my ($award) =@_;
       foreach my $possibleaward ('EXTRA_ANSWER','MISSING_ANSWER', 'ERROR',
          'NO_RESPONSE','WRONG_NUMBOXESCHECKED',
          'TOO_LONG', 'UNIT_INVALID_INSTRUCTOR',
          'UNIT_INVALID_STUDENT', 'UNIT_IRRECONCIBLE',
          'UNIT_FAIL', 'NO_UNIT',
          'UNIT_NOTNEEDED', 'WANTED_NUMERIC',
          'BAD_FORMULA', 'NOT_FUNCTION', 'WRONG_FORMAT', 
                                  'INTERNAL_ERROR', 'SIG_FAIL', 'INCORRECT', 
          'MISORDERED_RANK', 'INVALID_FILETYPE',
                                  'EXCESS_FILESIZE', 'FILENAME_INUSE', 
          'DRAFT', 'SUBMITTED', 'SUBMITTED_CREDIT', 
                                  'ANONYMOUS', 'ANONYMOUS_CREDIT',
                                  'ASSIGNED_SCORE', 'APPROX_ANS',
          'EXACT_ANS','COMMA_FAIL') {
    if ($award eq $possibleaward) { return 1; }
       }
       return 0;
   }
   
   {
       my @awards = ('EXTRA_ANSWER', 'MISSING_ANSWER', 'ERROR', 'NO_RESPONSE',
     'WRONG_NUMBOXESCHECKED','TOO_LONG',
     'UNIT_INVALID_INSTRUCTOR', 'UNIT_INVALID_STUDENT',
     'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT',
     'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA',  'NOT_FUNCTION', 
                     'WRONG_FORMAT', 'INTERNAL_ERROR',
     'COMMA_FAIL', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK',
     'INVALID_FILETYPE', 'EXCESS_FILESIZE', 'FILENAME_INUSE', 
                     'DRAFT', 'SUBMITTED',
                     'SUBMITTED_CREDIT', 'ANONYMOUS', 'ANONYMOUS_CREDIT',
                     'ASSIGNED_SCORE', 'APPROX_ANS', 'EXACT_ANS');
       my $i=0;
       my %fwd_awards = map { ($_,$i++) } @awards;
       my $max=scalar(@awards);
       @awards=reverse(@awards);
       $i=0;
       my %rev_awards = map { ($_,$i++) } @awards;
   
   sub awarddetail_to_awarded {
       my ($awarddetail) = @_;
       if ($awarddetail eq 'EXACT_ANS'
    || $awarddetail eq 'APPROX_ANS') {
    return 1;
       }
       return 0;
   }
   
   sub hide_award {
       my ($award) = @_;
       if (&Apache::lonhomework::show_no_problem_status()) {
    return 1;
       }
       if ($award =~
    /^(?:EXACT_ANS|APPROX_ANS|SUBMITTED|SUBMITTED_CREDIT|ANONYMOUS|ANONYMOUS_CREDIT|ASSIGNED_SCORE|INCORRECT)/) {
    return 1;
       }
       return 0;
 }  }
   
 sub finalizeawards {  sub finalizeawards {
   my $result='';      my ($awardref,$msgref,$nameref,$reverse,$final_scantron)=@_;
   my $award;      my $result;
   if ($#_ == '-1') { $result = "NO_RESPONSE"; }      if ($#$awardref == -1) { $result = "NO_RESPONSE"; }
   if ($result eq '' ) {      if ($result eq '' ) {
     my $blankcount;   my $blankcount;
     foreach $award (@_) {   foreach my $award (@$awardref) {
       if ($award eq '') {      if ($award eq '') {
  $result='MISSING_ANSWER';   $result='MISSING_ANSWER';
  $blankcount++;   $blankcount++;
       }      }
     }   }
     if ($blankcount == ($#_ + 1)) { $result = 'NO_RESPONSE'; }   if ($blankcount == ($#$awardref + 1)) {
   }      return ('NO_RESPONSE');
   if ($result eq '' ) {   }
     foreach $award (@_) { if ($award eq 'MISSING_ANSWER') {$result='MISSING_ANSWER'; last;}}      }
   }  
   if ($result eq '' ) {      if ($Apache::lonxml::internal_error) { $result='INTERNAL_ERROR'; }
     foreach $award (@_) { if ($award eq 'ERROR') {$result='ERROR'; last;}}  
   }      if (!$final_scantron && defined($result)) { return ($result); }
   if ($result eq '' ) {  
     foreach $award (@_) { if ($award eq 'NO_RESPONSE') {$result='NO_RESPONSE'; last;} }      # if in scantron mode, if the award for any response is 
   }      # assigned score, then the part gets an assigned score
   if ($result eq '' ) {      if ($final_scantron 
     foreach $award (@_) { if ($award eq 'TOO_LONG') {$result='TOO_LONG'; last;}}   && grep {$_ eq 'ASSIGNED_SCORE'} (@$awardref)) {
   }   return ('ASSIGNED_SCORE');
   if ($result eq '' ) {      }
     foreach $award (@_) {   
       if ($award eq 'UNIT_FAIL' ||      # if in scantron mode, if the award for any response is 
   $award eq 'NO_UNIT' ||      # correct and there are non-correct responses,
   $award eq 'UNIT_NOTNEEDED') {      # then the part gets an assigned score
  $result=$award; last;      if ($final_scantron 
       }   && (grep { $_ eq 'EXACT_ANS' ||
     }     $_ eq 'APPROX_ANS'  } (@$awardref))
   }   && (grep { $_ ne 'EXACT_ANS' &&
   if ($result eq '' ) {     $_ ne 'APPROX_ANS'  } (@$awardref))) {
     foreach $award (@_) {    return ('ASSIGNED_SCORE');
       if ($award eq 'WANTED_NUMERIC' ||       }
   $award eq 'BAD_FORMULA') {$result=$award; last;}      # these awards are ordered from most important error through best correct
     }      my $awards = (!$reverse) ? \%fwd_awards : \%rev_awards ;
   }  
   if ($result eq '' ) {      my $best = $max;
     foreach $award (@_) { if ($award eq 'SIG_FAIL') {$result=$award; last;} }      my $j=0;
   }      my $which;
   if ($result eq '' ) {      foreach my $award (@$awardref) {
     foreach $award (@_) { if ($award eq 'INCORRECT') {$result=$award; last;} }   if ($awards->{$award} < $best) {
   }      $best  = $awards->{$award};
   if ($result eq '' ) {      $which = $j;
       foreach $award (@_) { if ($award eq 'MISORDERED_RANK') {$result=$award; last;} }   }
   }   $j++;
   if ($result eq '' ) {      }
       foreach $award (@_) { if ($award eq 'INVALID_FILETYPE') {$result=$award; last;} }  
   }      # if at least one response item is set to include lenient grading
   if ($result eq '' ) {      # and that item is partially correct then overall award reflects
     foreach $award (@_) { if ($award eq 'DRAFT') {$result=$award; last;} }      # that, unless an award for one of the other response items does
   }      # not fall within the basic awards for correct or incorrect.
   if ($result eq '' ) {      if ($Apache::inputtags::leniency) {
     foreach $award (@_) { if ($award eq 'SUBMITTED') {$result=$award; last;} }          if (($$awardref[$which] eq 'INCORRECT')
   }              && (grep { $_ eq 'EXACT_ANS' ||
   if ($result eq '' ) {                         $_ eq 'APPROX_ANS' ||
     foreach $award (@_) { if ($award eq 'ASSIGNED_SCORE') {$result=$award; last;} }                         $_ eq 'ASSIGNED_SCORE' } (@$awardref))
   }              && !((grep { $_ ne 'INCORRECT' &&
   if ($result eq '' ) {                           $_ ne 'EXACT_ANS' &&
     foreach $award (@_) { if ($award eq 'APPROX_ANS') {$result=$award; last;} }                           $_ ne 'APPROX_ANS' &&
   }                           $_ ne 'ASSIGNED_SCORE' } (@$awardref)))) {
   if ($result eq '' ) { $result='EXACT_ANS'; }              return ('ASSIGNED_SCORE');
   return $result          }
       }
   
       if (defined($which)) {
    if (ref($nameref)) {
       return ($$awardref[$which],$$msgref[$which],$$nameref[$which]);
    } else {
       return ($$awardref[$which],$$msgref[$which]);
    }
       }
       return ('ERROR',undef);
   }
 }  }
   
 sub decideoutput {  sub decideoutput {
   my ($award,$solved,$previous,$target)=@_;      my ($award,$awarded,$awardmsg,$solved,$previous,$target,$nocorrect,$tdclass)=@_;
   my $message='';  
   my $button=0;      my $message='';
   my $previousmsg;      my $button=0;
   my $bgcolor='orange';      my $previousmsg;
   my %possiblecolors =      my $css_class='orange';
       ( 'correct' => '#aaffaa',      my $added_computer_text=0;
  'charged_try' => '#ffaaaa',      my %possible_class =
  'not_charged_try' => '#ffffaa',   ( 'correct'         => 'LC_answer_correct',
  'no_message' => '#fffff',    'charged_try'     => 'LC_answer_charged_try',
       );    'not_charged_try' => 'LC_answer_not_charged_try',
   if ($previous) { $previousmsg='You have entered that answer before'; }    'no_grade'        => 'LC_answer_no_grade',
     'no_message'      => 'LC_no_message',
   if      ($solved =~ /^correct/) {    );
       if ($award eq 'ASSIGNED_SCORE') {  
   $message = "A score has been assigned.";      my $part = $Apache::inputtags::part;
       } else {      my $tohandgrade = &Apache::lonnet::EXT("resource.$part.handgrade");
   if ($target eq 'tex') {      my $handgrade = ('yes' eq lc($tohandgrade)); 
       $message = '\textbf{You are correct}.';  #
   } else {  # Should "Computer's Answer" be displayed?
       $message = "<b>You are correct.</b>";  # Should not be displayed if still answerable,
   }  # if the problem is handgraded,
           unless ($ENV{'course.'.  # or if the problem does not give a correct answer
    $ENV{'request.course.id'}.  #
    '.disable_receipt_display'} eq 'yes') {       
       $message.='<br />Your receipt is '.&Apache::lonnet::receipt().      my $computer = ($handgrade || $nocorrect)? ''
   &Apache::loncommon::help_open_topic('Receipt');                         : " ".&mt("Computer's answer now shown above.");
   }      &Apache::lonxml::debug("handgrade has :$handgrade:");
       }  
       $bgcolor=$possiblecolors{'correct'};      if ($previous) { $previousmsg=&mt('You have entered that answer before'); }
       $button=0;      
       $previousmsg='';      if ($solved =~ /^correct/) {
   } elsif ($solved =~ /^excused/) {          $css_class=$possible_class{'correct'};
       $message = "<b>You are excused from the problem.</b>";   $message=&mt('You are correct.');
       $bgcolor=$possiblecolors{'charged_try'};   if ($awarded < 1 && $awarded > 0) {
       $button=0;      $message=&mt('You are partially correct.');
       $previousmsg='';      $css_class=$possible_class{'not_charged_try'};
   } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {   } elsif ($awarded < 1) {
       if ($solved =~ /^incorrect/ || $solved eq '') {      $message=&mt('Incorrect.');
   $message = "Incorrect";      $css_class=$possible_class{'charged_try'};
   $bgcolor=$possiblecolors{'charged_try'};   }
   $button=1;   if ($handgrade || 
       } else {              ($env{'request.filename'}=~/\/res\/lib\/templates\/(examupload|DropBox).problem$/)) {
   $message = "<b>You are correct.</b>";      $message = &mt("A score has been assigned.");
           unless ($ENV{'course.'.      $added_computer_text=1;
    $ENV{'request.course.id'}.   } else {
    '.disable_receipt_display'} eq 'yes') {       if ($target eq 'tex') {
               $message.='<br />Your receipt is '.&Apache::lonnet::receipt().   $message = '\textbf{'.$message.'}';
   &Apache::loncommon::help_open_topic('Receipt');      } else {
   }   $message = "<b>".$message."</b>";
   $bgcolor=$possiblecolors{'correct'};   $message.= $computer;
   $button=0;      }
   $previousmsg='';      $added_computer_text=1;
       }      if ($awarded > 0) {
   } elsif ($award eq 'NO_RESPONSE') {   my ($symb) = &Apache::lonnet::whichuser();
       $message = '';   if (($symb ne '') 
       $bgcolor=$possiblecolors{'no_feedback'};      &&
       $button=1;      ($env{'course.'.$env{'request.course.id'}.
   } elsif ($award eq 'MISSING_ANSWER') {        '.disable_receipt_display'} ne 'yes') &&
       $message = 'Some parts were not submitted';                      ($Apache::lonhomework::type ne 'practice')) { 
       $bgcolor=$possiblecolors{'not_charged_try'};      $message.=(($target eq 'web')?'<br />':' ').
       $button = 1;   &mt('Your receipt no. is [_1]',
   } elsif ($award eq 'ERROR') {      (&Apache::lonnet::receipt($Apache::inputtags::part).
       $message = 'An error occured while grading your answer.';       (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
       $bgcolor=$possiblecolors{'not_charged_try'};   }
       $button = 1;      }
   } elsif ($award eq 'TOO_LONG') {   }
       $message = "The submitted answer was too long.";          if ($awarded >= 1) {
       $bgcolor=$possiblecolors{'not_charged_try'};              $button=0;
       $button=1;          } elsif (&Apache::lonnet::EXT("resource.$part.retrypartial") !~/^1|on|yes$/i) {
   } elsif ($award eq 'WANTED_NUMERIC') {              $button=0;
       $message = "This question expects a numeric answer";          } else {
       $bgcolor=$possiblecolors{'not_charged_try'};              $button=1;
       $button=1;          }
   } elsif ($award eq 'MISORDERED_RANK') {   $previousmsg='';
       $message = 'You have provided an invalid ranking, please refer to '.      } elsif ($solved =~ /^excused/) {
   &Apache::loncommon::help_open_topic('Ranking_Problems','help on ranking problems').'.';   if ($target eq 'tex') {
       $bgcolor=$possiblecolors{'not_charged_try'};      $message = ' \textbf{'.&mt('You are excused from the problem.').'} ';
       $button=1;   } else {
   } elsif ($award eq 'INVALID_FILETYPE') {      $message = "<b>".&mt('You are excused from the problem.')."</b>";
       $message = 'The filetype extension of the file you uploaded is not allowed.';   }
       $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'charged_try'};
       $button=1;   $button=0;
   } elsif ($award eq 'SIG_FAIL') {   $previousmsg='';
       $message = "Please adjust significant figures.";# you provided %s significant figures";      } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {
       $bgcolor=$possiblecolors{'not_charged_try'};   if ($solved =~ /^incorrect/ || $solved eq '') {
       $button=1;      $message = &mt("Incorrect").".";
   } elsif ($award eq 'UNIT_FAIL') {      $css_class=$possible_class{'charged_try'};
       $message = "Units incorrect. ".      $button=1;
        &Apache::loncommon::help_open_topic('Physical_Units'); #Computer reads units as %s";   } else {
       $bgcolor=$possiblecolors{'not_charged_try'};      if ($target eq 'tex') {
       $button=1;   $message = '\textbf{'.&mt('You are correct.').'}';
   } elsif ($award eq 'UNIT_NOTNEEDED') {      } else {
       $message = "Only a number required.";# Computer reads units of %s";   $message = "<b>".&mt('You are correct.')."</b>";
       $bgcolor=$possiblecolors{'not_charged_try'};   $message.= $computer;
       $button=1;      }
   } elsif ($award eq 'NO_UNIT') {      $added_computer_text=1;
       $message = "Units required".      if  ($awarded > 0 
   &Apache::loncommon::help_open_topic('Physical_Units');   && $env{'course.'.
       $bgcolor=$possiblecolors{'not_charged_try'};       $env{'request.course.id'}.
       $button=1;       '.disable_receipt_display'} ne 'yes') { 
   } elsif ($award eq 'BAD_FORMULA') {   $message.=(($target eq 'web')?'<br />':' ').
       $message = "Unable to understand formula";      &mt('Your receipt is [_1]',
       $bgcolor=$possiblecolors{'not_charged_try'};   (&Apache::lonnet::receipt($Apache::inputtags::part).
       $button=1;   (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
   } elsif ($award eq 'INCORRECT') {      }
       $message = "Incorrect";      $css_class=$possible_class{'correct'};
       $bgcolor=$possiblecolors{'charged_try'};      $button=0;
       $button=1;      $previousmsg='';
   } elsif ($award eq 'SUBMITTED') {   }
       $message = "Your submission has been recorded.";      } elsif ($award eq 'NO_RESPONSE') {
       $bgcolor=$possiblecolors{'correct'};   $message = '';
       $button=1;   $css_class=$possible_class{'no_feedback'};
   } elsif ($award eq 'DRAFT') {   $button=1;
       $message = "A draft copy has been saved.";      } elsif ($award eq 'EXTRA_ANSWER') {
       $bgcolor=$possiblecolors{'not_charged_try'};   $message = &mt('Some extra items were submitted.');
       $button=1;   $css_class=$possible_class{'not_charged_try'};
   } elsif ($award eq 'ASSIGNED_SCORE') {   $button = 1;
       $message = "A score has been assigned.";      } elsif ($award eq 'MISSING_ANSWER') {
       $bgcolor=$possiblecolors{'correct'};   $message = &mt('Some items were not submitted.');
       $button=0;          if ($target ne 'tex') {
   } else {             $message .= &Apache::loncommon::help_open_topic('Some_Items_Were_Not_Submitted');
       $message = "Unknown message: $award";          }
       $button=1;   $css_class=$possible_class{'not_charged_try'};
   }   $button = 1;
   if (lc($Apache::lonhomework::problemstatus) eq 'no') {      } elsif ($award eq 'WRONG_NUMBOXESCHECKED') {
       $message = "Answer Submitted";          $message = &mt('Number of boxes checked outside permissible range (either too few or too many).');
       $bgcolor=$possiblecolors{'correct'};          if ($target ne 'tex') {
       $button=1;             $message .= &Apache::loncommon::help_open_topic('Wrong_Num_Boxes_Checked');
   }          }
   return ($button,$bgcolor,$message,$previousmsg);          $css_class=$possible_class{'not_charged_try'};
           $button = 1;
       } elsif ($award eq 'ERROR') {
    $message = &mt('An error occurred while grading your answer.');
    $css_class=$possible_class{'not_charged_try'};
    $button = 1;
       } elsif ($award eq 'TOO_LONG') {
    $message = &mt("The submitted answer was too long.");
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'WANTED_NUMERIC') {
    $message = &mt("This question expects a numeric answer.");
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'MISORDERED_RANK') {
           $message = &mt('You have provided an invalid ranking.');
           if ($target ne 'tex') {
               $message.=' '.&mt('Please refer to [_1]',&Apache::loncommon::help_open_topic('Ranking_Problems',&mt('help on ranking problems')));
           }
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'EXCESS_FILESIZE') {
           $message = &mt("Submission won't be graded. The combined size of submitted files exceeded the amount allowed.");
           $css_class=$possible_class{'not_charged_try'};
           $button=1;
       } elsif ($award eq 'FILENAME_INUSE') {
           $message = &mt('You have already uploaded a file with that filename.');
           if ($target eq 'tex') {
               $message.= "\\\\\n";
           } else {
               $message .= '<br />';
           }
           $message .= &mt('Please use a different filename.');
           $css_class=$possible_class{'not_charged_try'};
           $button=1;
       } elsif ($award eq 'INVALID_FILETYPE') {
    $message = &mt("Submission won't be graded. The type of file submitted is not allowed.");
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'SIG_FAIL') {
    my ($used,$min,$max)=split(':',$awardmsg);
    my $word = ($used < $min) ? 'more' : 'fewer';
    $message = &mt("Submission not graded. Use $word digits.",$used);
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'UNIT_INVALID_INSTRUCTOR') {
    $message = &mt('Error in instructor specifed unit. This error has been reported to the instructor.', $awardmsg);
    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'UNIT_INVALID_STUDENT') {
    $message = &mt('Unable to interpret units. Computer reads units as "[_1]".',&markup_unit($awardmsg,$target));
    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'UNIT_FAIL' || $award eq 'UNIT_IRRECONCIBLE') {
    $message = &mt('Incompatible units. No conversion found between "[_1]" and the required units.',&markup_unit($awardmsg,$target));
    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'UNIT_NOTNEEDED') {
    $message = &mt('Only a number required. Computer reads units of "[_1]".',&markup_unit($awardmsg,$target));
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'NO_UNIT') {
    $message = &mt("Units required").'.';
    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units')};
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'COMMA_FAIL') {
    $message = &mt("Proper comma separation is required").'.';
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'BAD_FORMULA') {
    $message = &mt("Unable to understand formula").'.';
           if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Formula_Answers')};
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'NOT_FUNCTION') {
           $message = &mt("Not a function").'.';
           $css_class=$possible_class{'not_charged_try'};
           $button=1;
       } elsif ($award eq 'WRONG_FORMAT') {
           $message = &mt("Wrong format").'.';
           $css_class=$possible_class{'not_charged_try'};
           $button=1;
        } elsif ($award eq 'INTERNAL_ERROR') {
           $message = &mt("An internal error occurred while processing your answer. Please try again later.");
           $css_class=$possible_class{'not_charged_try'};
           $button=1;
       } elsif ($award eq 'INCORRECT') {
    $message = &mt("Incorrect").'.';
    $css_class=$possible_class{'charged_try'};
    $button=1;
       } elsif ($award eq 'SUBMITTED') {
    $message = &mt("Your submission has been recorded.");
    $css_class=$possible_class{'no_grade'};
    $button=1;
       } elsif ($award eq 'SUBMITTED_CREDIT') {
           $message = &mt("Your submission has been recorded, and credit awarded.");
           $css_class=$possible_class{'correct'};
           $button=1;
       } elsif ($award eq 'ANONYMOUS') {
           $message = &mt("Your anonymous submission has been recorded.");
           $css_class=$possible_class{'no_grade'};
           $button=1;
       } elsif ($award eq 'ANONYMOUS_CREDIT') {
           $message = &mt("Your anonymous submission has been recorded, and credit awarded.");
           $css_class=$possible_class{'correct'};
           $button=1;
       } elsif ($award eq 'DRAFT') {
    $message = &mt("Copy saved but not submitted.");
    $css_class=$possible_class{'not_charged_try'};
    $button=1;
       } elsif ($award eq 'ASSIGNED_SCORE') {
    $message = &mt("A score has been assigned.");
    $css_class=$possible_class{'correct'};
    $button=0;
       } elsif ($award eq '') {
    if ($handgrade && $Apache::inputtags::status[-1] eq 'SHOW_ANSWER') {
       $message = &mt("Nothing submitted.");
       $css_class=$possible_class{'charged_try'};
    } else {
       $css_class=$possible_class{'not_charged_try'};
    }
    $button=1;
       } else {
    $message = &mt("Unknown message").": $award";
    $button=1;
       }
       my (undef,undef,$domain,$user)=&Apache::lonnet::whichuser();
       foreach my $resid(@Apache::inputtags::response){
           if ($Apache::lonhomework::history{"resource.$part.$resid.handback"}) {
               if ($target eq 'tex') {
                   $message.= "\\\\\n";
               } else {
                   $message.='<br />';
               }
       my @files = split(/\s*,\s*/,
         $Apache::lonhomework::history{"resource.$part.$resid.handback"});
       my $file_msg;
       foreach my $file (@files) {
                   if ($target eq 'tex') {
                       $file_msg.= "\\\\\n".$file;
                   } else {
                       $file_msg.= '<br /><a href="/uploaded/'."$domain/$user".'/'.$file.'">'.$file.'</a>';
                   }
       }
       $message .= &mt('Returned file(s): [_1]',$file_msg);
               if ($target eq 'tex') {
                   $message.= "\\\\\n";
               } else {
                   $message.='<br />';
               }
    }
       }
   
       if (&Apache::lonhomework::hide_problem_status()
    && $Apache::inputtags::status[-1] ne 'SHOW_ANSWER'
    && &hide_award($award)) {
           $message = &mt("Answer Submitted: Your final submission will be graded after the due date.");
           my @interval= &Apache::lonnet::EXT("resource.$part.interval");
           if ($interval[0] =~ /\d+/) {
               my $first_access=&Apache::lonnet::get_first_access($interval[1]);
               if (defined($first_access)) {
                   my $due_date= &Apache::lonnet::EXT("resource.$part.duedate");
                   unless (($due_date) && ($due_date < $first_access + $interval[0])) { 
                       $message = &mt("Answer Submitted: Your final submission will be graded when the time limit is reached.");
                   }
               }
           }
    $css_class=$possible_class{'no_grade'};
    $button=1;
       }
       if ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER' && 
    !$added_computer_text && $target ne 'tex') {
    $message.= $computer;
    $added_computer_text=1;
       }
       if ($Apache::lonhomework::type eq 'practice') {
          if ($target eq 'web') {
              $message .= '<br />';
          } else {
              $message .= ' ';      
          }
          $message.=&mt('Submissions to practice problems are not permanently recorded.');
       }
       return ($button,$css_class,$message,$previousmsg);
   }
   
   sub markup_unit {
       my ($unit,$target)=@_;
       if ($target eq 'tex') {
    return '\texttt{'.&Apache::lonxml::latex_special_symbols($unit).'}'; 
       } else {
    return "<tt>".$unit."</tt>";
       }
 }  }
   
 sub removealldata {  sub removealldata {
Line 464  sub removealldata { Line 1366  sub removealldata {
     }      }
 }  }
   
 sub setgradedata {  sub hidealldata {
   my ($award,$id,$previously_used) = @_;      my ($id)=@_;
   # if the student already has it correct, don't modify the status      foreach my $key (keys(%Apache::lonhomework::results)) {
   if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&   if (($key =~ /^resource\.\Q$id\E\./) && ($key !~ /\.collaborators$/)) {
       $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {      &Apache::lonxml::debug("Hidding $key");
     $Apache::lonhomework::results{"resource.$id.afterduedate"}=$award;      my $newkey=$key;
     return '';      $newkey=~s/^(resource\.\Q$id\E\.[^\.]+\.)(.*)$/${1}hidden${2}/;
   } elsif ( $Apache::lonhomework::history{"resource.$id.solved"} !~      $Apache::lonhomework::results{$newkey}=
        /^correct/ || $Apache::lonhomework::scantronmode ||   $Apache::lonhomework::results{$key};
     lc($Apache::lonhomework::problemstatus) eq 'no') {      delete($Apache::lonhomework::results{$key});
     #handle assignment of tries and solved status   }
     my $solvemsg;  
     if ($Apache::lonhomework::scantronmode) {  
  $solvemsg='correct_by_scantron';  
     } else {  
  $solvemsg='correct_by_student';  
     }      }
     if ($Apache::lonhomework::history{"resource.$id.afterduedate"}) {  }
       $Apache::lonhomework::results{"resource.$id.afterduedate"}='';  
   sub setgradedata {
       my ($award,$msg,$id,$previously_used) = @_;
       if ($Apache::lonhomework::scantronmode && 
    &Apache::lonnet::validCODE($env{'form.CODE'})) {
    $Apache::lonhomework::results{"resource.CODE"}=$env{'form.CODE'};
       } elsif ($Apache::lonhomework::scantronmode && 
        $env{'form.CODE'} eq '' &&
        $Apache::lonhomework::history{"resource.CODE"} ne '') {
    $Apache::lonhomework::results{"resource.CODE"}='';
     }      }
     if ( $award eq 'ASSIGNED_SCORE') {  
  $Apache::lonhomework::results{"resource.$id.tries"} =      if (!$Apache::lonhomework::scantronmode &&
     $Apache::lonhomework::history{"resource.$id.tries"} + 1;   $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
  $Apache::lonhomework::results{"resource.$id.solved"} =   $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
     $solvemsg;   $Apache::lonhomework::results{"resource.$id.afterduedate"}=$award;
  my $numawards=scalar(@Apache::inputtags::response);   return '';
  $Apache::lonhomework::results{"resource.$id.awarded"} = 0;      } elsif ( $Apache::lonhomework::history{"resource.$id.awarded"} < 1
  foreach my $res (@Apache::inputtags::response) {        || $Apache::lonhomework::scantronmode 
     $Apache::lonhomework::results{"resource.$id.awarded"}+=        || &Apache::lonhomework::hide_problem_status()  ) {
        $Apache::lonhomework::results{"resource.$id.$res.awarded"};          # the student doesn't already have it correct,
  }   # or we are in a mode (scantron orno problem status) where a correct 
  if ($numawards > 0) {          # can become incorrect
     $Apache::lonhomework::results{"resource.$id.awarded"}/=   # handle assignment of tries and solved status
  $numawards;   my $solvemsg;
  }   if ($Apache::lonhomework::scantronmode) {
     } elsif ( $award eq 'APPROX_ANS' || $award eq 'EXACT_ANS' ) {      $solvemsg='correct_by_scantron';
       $Apache::lonhomework::results{"resource.$id.tries"} =   } else {
  $Apache::lonhomework::history{"resource.$id.tries"} + 1;      $solvemsg='correct_by_student';
       $Apache::lonhomework::results{"resource.$id.solved"} =   }
  $solvemsg;   if ($Apache::lonhomework::history{"resource.$id.afterduedate"}) {
       $Apache::lonhomework::results{"resource.$id.awarded"} = '1';      $Apache::lonhomework::results{"resource.$id.afterduedate"}='';
     } elsif ( $award eq 'INCORRECT' ) {   }
       $Apache::lonhomework::results{"resource.$id.tries"} =   if ( $award eq 'ASSIGNED_SCORE') {
  $Apache::lonhomework::history{"resource.$id.tries"} + 1;      $Apache::lonhomework::results{"resource.$id.tries"} =
       $Apache::lonhomework::results{"resource.$id.solved"} =   $Apache::lonhomework::history{"resource.$id.tries"} + 1;
  'incorrect_attempted'      $Apache::lonhomework::results{"resource.$id.solved"} =
     } elsif ( $award eq 'SUBMITTED' ) {   $solvemsg;
       $Apache::lonhomework::results{"resource.$id.tries"} =      my $numawards=scalar(@Apache::inputtags::response);
  $Apache::lonhomework::history{"resource.$id.tries"} + 1;      $Apache::lonhomework::results{"resource.$id.awarded"} = 0;
       $Apache::lonhomework::results{"resource.$id.solved"} =      foreach my $res (@Apache::inputtags::response) {
  'ungraded_attempted';   if (defined($Apache::lonhomework::results{"resource.$id.$res.awarded"})) {
     } elsif ( $award eq 'DRAFT' ) {      $Apache::lonhomework::results{"resource.$id.awarded"}+=
       $Apache::lonhomework::results{"resource.$id.solved"} = '';   $Apache::lonhomework::results{"resource.$id.$res.awarded"};
     } elsif ( $award eq 'NO_RESPONSE' ) {   } else {
  #no real response so delete any data that got stored      $Apache::lonhomework::results{"resource.$id.awarded"}+=
    &awarddetail_to_awarded($Apache::lonhomework::results{"resource.$id.$res.awarddetail"});
    }
       }
       if ($numawards > 0) {
    $Apache::lonhomework::results{"resource.$id.awarded"}/=
       $numawards;
       }
    } elsif ( $award eq 'APPROX_ANS' || $award eq 'EXACT_ANS' ) {
       $Apache::lonhomework::results{"resource.$id.tries"} =
    $Apache::lonhomework::history{"resource.$id.tries"} + 1;
       $Apache::lonhomework::results{"resource.$id.solved"} =
    $solvemsg;
       $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
           } elsif ( $award eq 'SUBMITTED_CREDIT' ) {
               $Apache::lonhomework::results{"resource.$id.tries"} =
                   $Apache::lonhomework::history{"resource.$id.tries"} + 1;
               $Apache::lonhomework::results{"resource.$id.solved"} =
                   'credit_attempted';
               $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
           }  elsif ( $award eq 'ANONYMOUS_CREDIT' ) {
               $Apache::lonhomework::results{"resource.$id.tries"} =
                   $Apache::lonhomework::history{"resource.$id.tries"} + 1;
               $Apache::lonhomework::results{"resource.$id.solved"} =
                   'credit_attempted';
               $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
    } elsif ( $award eq 'INCORRECT' ) {
       $Apache::lonhomework::results{"resource.$id.tries"} =
    $Apache::lonhomework::history{"resource.$id.tries"} + 1;
       if (&Apache::lonhomework::hide_problem_status()
    || $Apache::lonhomework::scantronmode) {
    $Apache::lonhomework::results{"resource.$id.awarded"} = 0;
       }
       $Apache::lonhomework::results{"resource.$id.solved"} =
    'incorrect_attempted';
    } elsif ( $award eq 'SUBMITTED' ) {
       $Apache::lonhomework::results{"resource.$id.tries"} =
    $Apache::lonhomework::history{"resource.$id.tries"} + 1;
       $Apache::lonhomework::results{"resource.$id.solved"} =
    'ungraded_attempted';
           }  elsif ( $award eq 'ANONYMOUS' ) {
               $Apache::lonhomework::results{"resource.$id.tries"} =
                   $Apache::lonhomework::history{"resource.$id.tries"} + 1;
               $Apache::lonhomework::results{"resource.$id.solved"} =
                   'ungraded_attempted';
    } elsif ( $award eq 'DRAFT' ) {
       $Apache::lonhomework::results{"resource.$id.solved"} = '';
    } elsif ( $award eq 'NO_RESPONSE' ) {
       #no real response so delete any data that got stored
       &removealldata($id);
       return '';
    } else {
       $Apache::lonhomework::results{"resource.$id.solved"} =
    'incorrect_attempted';
       if (&Apache::lonhomework::show_no_problem_status()
    || $Apache::lonhomework::scantronmode) {
    $Apache::lonhomework::results{"resource.$id.tries"} =
       $Apache::lonhomework::history{"resource.$id.tries"} + 1;
    $Apache::lonhomework::results{"resource.$id.awarded"} = 0;
       }
   
       if (&Apache::lonhomework::show_some_problem_status()) {
    # clear out the awarded if they had gotten it wrong/right
    # and are now in an error mode
    $Apache::lonhomework::results{"resource.$id.awarded"} = '';
       }
    }
    if (defined($msg)) {
       $Apache::lonhomework::results{"resource.$id.awardmsg"} = $msg;
    }
    # did either of the overall awards chage? If so ignore the 
    # previous check
    if (($Apache::lonhomework::results{"resource.$id.awarded"} eq
        $Apache::lonhomework::history{"resource.$id.awarded"}) &&
       ($Apache::lonhomework::results{"resource.$id.solved"} eq
        $Apache::lonhomework::history{"resource.$id.solved"})) {
       # check if this was a previous submission if it was delete the
       # unneeded data and update the previously_used attribute
       if ( $previously_used eq 'PREVIOUSLY_USED') {
    if (&Apache::lonhomework::show_problem_status()) {
       delete($Apache::lonhomework::results{"resource.$id.tries"});
       $Apache::lonhomework::results{"resource.$id.previous"} = '1';
    }
       } elsif ( $previously_used eq 'PREVIOUSLY_LAST') {
    #delete all data as they student didn't do anything, but save
    #the list of collaborators.
    &removealldata($id);
    #and since they didn't do anything we were never here
    return '';
       } else {
    $Apache::lonhomework::results{"resource.$id.previous"} = '0';
       }
    }
       } elsif ( $Apache::lonhomework::history{"resource.$id.awarded"} == 1 ) {
    #delete all data as they student already has it correct
  &removealldata($id);   &removealldata($id);
    #and since they didn't do anything we were never here
  return '';   return '';
     } else {  
       $Apache::lonhomework::results{"resource.$id.solved"} =  
  'incorrect_attempted';  
       if (lc($Apache::lonhomework::problemstatus) eq 'no') {  
   $Apache::lonhomework::results{"resource.$id.tries"} =  
       $Apache::lonhomework::history{"resource.$id.tries"} + 1;  
       }  
     }  
   
     # check if this was a previous submission if it was delete the  
     # unneeded data and update the previously_used attribute  
     if ( $previously_used eq 'PREVIOUSLY_USED') {  
  if (lc($Apache::lonhomework::problemstatus) ne 'no') {  
     delete($Apache::lonhomework::results{"resource.$id.tries"});  
     $Apache::lonhomework::results{"resource.$id.previous"} = '1';  
  }  
     } elsif ( $previously_used eq 'PREVIOUSLY_LAST') {  
       #delete all data as they student didn't do anything, but save  
       #the list of collaborators.  
       &removealldata($id);  
       #and since they didn't do anything we were never here  
       return '';  
     } else {  
       $Apache::lonhomework::results{"resource.$id.previous"} = '0';  
     }      }
   } elsif ( $Apache::lonhomework::history{"resource.$id.solved"} =~      $Apache::lonhomework::results{"resource.$id.award"} = $award;
     /^correct/ ) {      if ($award eq 'SUBMITTED') {
       #delete all data as they student already has it correct   &Apache::response::add_to_gradingqueue();
       &removealldata($id);      }
       #and since they didn't do anything we were never here      $Apache::lonhomework::results{"resource.$id.type"} = $Apache::lonhomework::type;
       return '';      $Apache::lonhomework::results{"resource.$id.duedate"} = &Apache::lonnet::EXT("resource.$id.duedate");
   }      $Apache::lonhomework::results{"resource.$id.hinttries"} = &Apache::lonnet::EXT("resource.$id.hinttries");
   $Apache::lonhomework::results{"resource.$id.award"} = $award;      $Apache::lonhomework::results{"resource.$id.version"} = &Apache::lonnet::usedversion();
       $Apache::lonhomework::results{"resource.$id.maxtries"} = &Apache::lonnet::EXT("resource.$id.maxtries");
   }
   
   sub find_which_previous {
       my ($version) = @_;
       my $part = $Apache::inputtags::part;
       my (@previous_version);
       foreach my $resp (@Apache::inputtags::response) {
    my $key = "$version:resource.$part.$resp.submission";
    my $submission = $Apache::lonhomework::history{$key};
    my %previous = &Apache::response::check_for_previous($submission,
        $part,$resp,
        $version);
    push(@previous_version,$previous{'version'});
       }
       return &previous_match(\@previous_version,
      scalar(@Apache::inputtags::response));
   }
   
   sub previous_match {
       my ($previous_array,$count) = @_;
       my $match = 0;
       my @matches;
       foreach my $versionar (@$previous_array) {
    foreach my $version (@$versionar) {
       $matches[$version]++;
    }
       }
       my $which=0;
       foreach my $elem (@matches) {
    if ($elem eq $count) {
       $match=1;
       last;
    }
    $which++;
       }
       return ($match,$which);
 }  }
   
 sub grade {  sub grade {
   my ($target) = @_;      my ($target) = @_;
   my $id = $Apache::inputtags::part;      my $id = $Apache::inputtags::part;
   my $response='';      my $response='';
   if ( defined $ENV{'form.submitted'}) {      if ( defined $env{'form.submitted'}) {
     my @awards = ();   my (@awards,@msgs);
     foreach $response (@Apache::inputtags::response) {   foreach $response (@Apache::inputtags::response) {
       &Apache::lonxml::debug("looking for response.$id.$response.awarddetail");      &Apache::lonxml::debug("looking for response.$id.$response.awarddetail");
       my $value=$Apache::lonhomework::results{"resource.$id.$response.awarddetail"};      my $value=$Apache::lonhomework::results{"resource.$id.$response.awarddetail"};
       &Apache::lonxml::debug("keeping $value from $response for $id");      &Apache::lonxml::debug("keeping $value from $response for $id");
       push (@awards,$value);      push (@awards,$value);
     }      $value=$Apache::lonhomework::results{"resource.$id.$response.awardmsg"};
     my $finalaward = &finalizeawards(@awards);      &Apache::lonxml::debug("got message $value from $response for $id");
     my $previously_used;      push (@msgs,$value);
     if ( $#Apache::inputtags::previous eq $#awards ) {   }
  my $match=0;   my ($finalaward,$msg) = 
  my @matches;      &finalizeawards(\@awards,\@msgs,undef,undef,
  foreach my $versionar (@Apache::inputtags::previous_version) {      $Apache::lonhomework::scantronmode);
     foreach my $version (@$versionar) {   my $previously_used;
  $matches[$version]++;   if ( $#Apache::inputtags::previous eq $#awards ) {
     }      my ($match) =
  }   &previous_match(\@Apache::inputtags::previous_version,
  foreach my $elem (@matches) {if ($elem eq ($#awards+1)) {$match=1;}}   scalar(@Apache::inputtags::response));
  if ($match) {  
     $previously_used = 'PREVIOUSLY_LAST';      if ($match) {
     foreach my $value (@Apache::inputtags::previous) {   $previously_used = 'PREVIOUSLY_LAST';
  if ($value eq 'PREVIOUSLY_USED' ) {   foreach my $value (@Apache::inputtags::previous) {
     $previously_used = $value;      if ($value eq 'PREVIOUSLY_USED' ) {
     last;   $previously_used = $value;
    last;
       }
  }   }
     }      }
  }   }
    &Apache::lonxml::debug("final award $finalaward, $previously_used, message $msg");
    &setgradedata($finalaward,$msg,$id,$previously_used);
     }      }
     &Apache::lonxml::debug("final award $finalaward, $previously_used");      return '';
     &setgradedata($finalaward,$id,$previously_used);  
   }  
   return '';  
 }  }
   
 sub gradestatus {  sub get_grade_messages {
   my ($id,$target) = @_;      my ($id,$prefix,$target,$status,$nocorrect,$tdclass) = @_;
   my $showbutton = 1;  # nocorrect suppresses "Computer's answer now shown above"
   my $bgcolor = '';      my ($message,$latemessage,$trystr,$previousmsg);
   my $message = '';      my $showbutton = 1;
   my $latemessage = '';  
   my $trystr='';      my $award = $Apache::lonhomework::history{"$prefix.award"};
   my $button='';      my $awarded = $Apache::lonhomework::history{"$prefix.awarded"};
   my $previousmsg='';      my $solved = $Apache::lonhomework::history{"$prefix.solved"};
       my $previous = $Apache::lonhomework::history{"$prefix.previous"};
   my $status = $Apache::inputtags::status['-1'];      my $awardmsg = $Apache::lonhomework::history{"$prefix.awardmsg"};
   &Apache::lonxml::debug("gradestatus has :$status:");      &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg");
   if ( $status ne 'CLOSED' && $status ne 'UNAVAILABLE') {        if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {
     my $award = $Apache::lonhomework::history{"resource.$id.award"};   &Apache::lonxml::debug('Getting message');
     my $solved = $Apache::lonhomework::history{"resource.$id.solved"};   ($showbutton,my $css_class,$message,$previousmsg) =
     my $previous = $Apache::lonhomework::history{"resource.$id.previous"};      &decideoutput($award,$awarded,$awardmsg,$solved,$previous,
     &Apache::lonxml::debug("Found Award |$award|$solved|");    $target,(($status eq 'CAN_ANSWER') || $nocorrect),$tdclass);
     if ( $award ne '' ) {   if ($target eq 'tex') {
       &Apache::lonxml::debug('Getting message');      $message='\vskip 2 mm '.$message.' ';
       ($showbutton,$bgcolor,$message,$previousmsg) =   } else {
  &decideoutput($award,$solved,$previous,$target);      $message="<td class=\"$tdclass $css_class\">$message</td>";
       if ($target eq 'tex') {      if ($previousmsg) {
  $message=' '.$message.' ';   $previousmsg="<td class=\"$tdclass LC_answer_previous\">$previousmsg</td>";
       } else {      }
  $message="<td bgcolor=\"$bgcolor\">$message</td>";  
  if ($previousmsg) {  
   $previousmsg="<td bgcolor=\"#aaaaff\">$previousmsg</td>";  
  }   }
       }  
     }      }
     my $tries = $Apache::lonhomework::history{"resource.$id.tries"};      my $tries = $Apache::lonhomework::history{"$prefix.tries"};
     my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");      my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
     &Apache::lonxml::debug("got maxtries of :$maxtries:");      &Apache::lonxml::debug("got maxtries of :$maxtries:");
       #if tries are set to negative turn off the Tries/Button and messages
       if (defined($maxtries) && $maxtries < 0) { return ''; }
     if ( $tries eq '' ) { $tries = '0'; }      if ( $tries eq '' ) { $tries = '0'; }
     if ( $maxtries eq '' ) { $maxtries = '2'; }       if ( $maxtries eq '' ) { $maxtries = '2'; } 
     if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; }       if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; } 
     if ( $showbutton ) {      my $tries_text= &get_tries_text();
       if ($target eq 'tex') {      if ($showbutton) {
   if ($ENV{'request.state'} ne "construct" && $Apache::lonhomework::type ne 'exam') {   if ($target eq 'tex') {
       $trystr = ' {\vskip 1 mm \small \textit{Tries} '.$tries.'/'.$maxtries.'} \vskip 2 mm ';      if ($env{'request.state'} ne "construct"
   } else {   && $Apache::lonhomework::type ne 'exam'
       $trystr = '\vskip 0 mm ';   && $env{'form.suppress_tries'} ne 'yes') {
   }   $trystr ='{\vskip 1 mm \small '
       } else {                          .&mt('[_1]'.$tries_text.'[_2] [_3]'
          $trystr = "<td>Tries $tries/$maxtries</td>";   ,'\textit{','}',$tries.'/'.$maxtries ) 
       }                          .'} \vskip 2 mm';
     }      } else {
     if ( $status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {$showbutton = 0;}   $trystr = '\vskip 0 mm ';
     if ( $showbutton ) {       }
       if ($target ne 'tex') {   } else {
         $button = '<br /><input type="submit" name="submit" value="Submit Answer" />';      my $trial =$tries;
       }      if ($Apache::lonhomework::parsing_a_task) {
     }      } elsif($env{'request.state'} ne 'construct') {
     if ($Apache::lonhomework::history{"resource.$id.afterduedate"}) {   $trial.="/".&Apache::lonhtmlcommon::direct_parm_link($maxtries,$env{'request.symb'},'maxtries',$id,$target);
       #last submissions was after due date      } else {
       if ($target eq 'tex') {   if (defined($Apache::inputtags::params{'maxtries'})) {
   $latemessage=' The last submission was after the Due Date ';      $trial.="/".$Apache::inputtags::params{'maxtries'};
       } else {   }
         $latemessage="<td bgcolor=\"#ffaaaa\">The last submission was after the Due Date</td>";      }
       }      $trystr = '<td class="'.$tdclass.'"><span class="LC_nobreak">'.&mt($tries_text.' [_1]',$trial).'</span></td>';
     }   }
   }      }
   my $output= $previousmsg.$latemessage.$message.$trystr;  
   if ($output =~ /^\s*$/) {      if ($Apache::lonhomework::history{"$prefix.afterduedate"}) {
     return $button;   #last submissions was after due date
   } else {   $latemessage=&mt(' The last submission was after the Due Date ');;
     if ($target eq 'tex') {   if ($target eq 'web') {
       return $button.' \vskip 0 mm '.$output.' ';      $latemessage='<td class="'.$tdclass.' LC_answer_late">'.$latemessage.'</td>';
    }
       }
       return ($previousmsg,$latemessage,$message,$trystr,$showbutton);
   }
   
   sub gradestatus {
       my ($id,$target,$no_previous) = @_;
       my $showbutton = 1;
       my $message = '';
       my $latemessage = '';
       my $trystr='';
       my $button='';
       my $previousmsg='';
       my $tdclass='';
   
       my $status = $Apache::inputtags::status['-1'];
       &Apache::lonxml::debug("gradestatus has :$status:");
       if ( $status ne 'CLOSED' 
    && $status ne 'UNAVAILABLE' 
    && $status ne 'INVALID_ACCESS' 
    && $status ne 'NEEDS_CHECKIN' 
    && $status ne 'NOT_IN_A_SLOT'
            && $status ne 'RESERVABLE'
            && $status ne 'RESERVABLE_LATER'
            && $status ne 'NOTRESERVABLE'
            && $status ne 'NEED_DIFFERENT_IP') {
   
    if ($status eq 'SHOW_ANSWER') {
               $showbutton = 0;
           }
   
           unless (($status eq 'SHOW_ANSWER') || ($status eq 'CANNOT_ANSWER')) {
               if ($target ne 'tex') {
                   $tdclass = 'LC_status_submit_'.$id;
               }
           }
   
    ($previousmsg,$latemessage,$message,$trystr) =
       &get_grade_messages($id,"resource.$id",$target,$status,
    $showbutton,$tdclass);
    if ($status eq 'CANNOT_ANSWER') {
       $showbutton = 0;
    }
    if ( $status eq 'SHOW_ANSWER') {
       undef($previousmsg);
    }
    if ( $showbutton ) {
       if ($target ne 'tex') {
    $button = 
               '<input onmouseup="javascript:setSubmittedPart(\''.$id.'\');this.form.action+=\'#'.&escape($id).'\';"
                       type="submit" name="submit_'.$id.'" id="submit_'.$id.'" class="LC_hwk_submit"
                       value="'.&mt('Submit Answer').'" />&nbsp;'.
                       '<div id="msg_submit_'.$id.'" style="display:none">'.
                       &mt('Processing your submission ...').'</div>';
       }
    }
   
       }
       my $output= $previousmsg.$latemessage.$message.$trystr;
       if ($output =~ /^\s*$/) {
    return $button;
       } else {
    if ($target eq 'tex') {
       return $button.' \vskip 0 mm '.$output.' ';
    } else {
       $output =
    '<table><tr><td>'.$button.'</td>'.$output;
       if (!$no_previous) {
    $output.='<td class="'.$tdclass.'">'.&previous_tries($id,$target).'</td>';
       }
       $output.= '</tr></table>';
       return $output;
    }
       }
   }
   
   sub previous_tries {
       my ($id,$target) = @_;
       my $output;
       my $status = $Apache::inputtags::status['-1'];
   
       my $count;
       my %count_lookup;
       my ($lastrndseed,$lasttype);
       my $numstamps = 0;
   
       foreach my $i (1..$Apache::lonhomework::history{'version'}) {
    my $prefix = $i.":resource.$id";
           my $is_anon;
           my $curr_type = $Apache::lonhomework::history{"$prefix.type"};    
           if (defined($env{'form.grade_symb'})) {
               if (($curr_type eq 'anonsurvey') || ($curr_type eq 'anonsurveycred')) {
                   $is_anon = 1;
               }
           }
    next if (!exists($Apache::lonhomework::history{"$prefix.award"}));
    $count++;
    $count_lookup{$i} = $count;
           my $curr_rndseed = $Apache::lonhomework::history{"$prefix.rndseed"};
    my ($previousmsg,$latemessage,$message,$trystr);
   
    ($previousmsg,$latemessage,$message,$trystr) =
       &get_grade_messages($id,"$prefix",$target,$status);
   
    if ($previousmsg ne '') {
       my ($match,$which) = &find_which_previous($i);
       $message=$previousmsg;
       my $previous = $count_lookup{$which};
       $message =~ s{(</td>)}{ as submission \# $previous $1};
    } elsif ($Apache::lonhomework::history{"$prefix.tries"}) {
       if (!(&Apache::lonhomework::hide_problem_status()
     && $Apache::inputtags::status[-1] ne 'SHOW_ANSWER')
    && $Apache::lonhomework::history{"$prefix.solved"} =~/^correct/
    ) {
   
                   my $txt_correct = &mt('Correct');
                   my $awarded = $Apache::lonhomework::history{"$prefix.awarded"};
                   if ($awarded < 1 && $awarded > 0) {
                       $txt_correct=&mt('Partially Correct');
                   } elsif ($awarded < 1) {
                       if ($awarded eq '') {
                           $txt_correct='';
                       } else {
                           $txt_correct=&mt('Incorrect');
                       }
                   }
    $message =~ s{(<td.*?>)(.*?)(</td>)}
                                {$1 <strong>$txt_correct</strong>. $3}s;
       }
               my $trystr = "(".&mt('Try [_1]',$Apache::lonhomework::history{"$prefix.tries"}).")";
               if (($curr_rndseed ne '') &&  ($lastrndseed ne '')) {
                   if (($curr_rndseed ne $lastrndseed) && 
                       (($curr_type eq 'randomizetry') || ($lasttype eq 'randomizetry'))) {
                       $trystr .= '<br /><span style="color: green; white-space: nowrap; font-style: italic; font-weight: bold; font-size: 80%;">'.&mt('New problem variation this try.').'</span>';
                   }
               } 
       $message =~ s{(</td>)}{ $trystr $1};
    }
    my ($class) = ($message =~ m{<td.*class="([^"]*)"}); #"
    $message =~ s{(<td.*?>)}{<td>};
   
   
    $output .= '<tr class="'.$class.'">'.
              '<td align="center">'.$count.'</td>'.$message;
           if ((!$is_anon) && ($Apache::lonhomework::history{"$prefix.tries"}) &&
               ($Apache::lonhomework::history{"$prefix.award"} ne 'ASSIGNED_SCORE') &&
               ($Apache::lonhomework::history{$i.':timestamp'})) {
               $output .= '<td>'.&Apache::lonlocal::locallocaltime(
                                $Apache::lonhomework::history{$i.':timestamp'}).'</td>';
               $numstamps ++;
           } else {
               $output .= '<td></td>';
           }
    foreach my $resid (@Apache::inputtags::response) {
       my $prefix = $prefix.".$resid";
       if (exists($Apache::lonhomework::history{"$prefix.submission"})) {
    my $submission =
       $Apache::inputtags::submission_display{"$prefix.submission"};
    if (!defined($submission)) {
       $submission = 
    $Apache::lonhomework::history{"$prefix.submission"};
    }
                   if ($is_anon) {
                       $output.='<td>'.&mt('(only shown to submitter)').'</td>';
                   } else {
       $output.='<td>'.$submission.'</td>';
                   }
       } else {
    $output.='<td></td>';
       }
    }
    $output.=&Apache::loncommon::end_data_table_row()."\n";
           $lastrndseed = $curr_rndseed;
           $lasttype = $curr_type;
       }
       return if ($output eq '');
       my $headers = '<tr>'.
                     '<th>'.&mt('Submission #').'</th>'.
                     '<th>'.&mt('Try').'</th><th>';
       if ($numstamps) {
           $headers .= &mt('When');
       }
       $headers .= '</th>';
       my $colspan = scalar(@Apache::inputtags::response);
       if ($colspan > 1) {
           $headers .= '<th colspan="'.$colspan.'">';
     } else {      } else {
       return $button.'<table><tr>'.$output.'</tr></table>';          $headers .= '<th>';
     }      }
   }      $headers .= &mt('Submitted Answer').'</th></tr>';
       $output ='<table class="LC_prior_tries">'.$headers.$output.'</table>';
   
       my $tries_text = &get_tries_text('link');
       my $prefix = $env{'form.request.prefix'};
       $prefix =~ tr{.}{_};
       my $function_name = "LONCAPA_previous_tries_".$prefix.
    $Apache::lonxml::curdepth.'_'.$env{'form.counter'};
       my $result = &Apache::loncommon::modal_adhoc_window($function_name,420,410,$output,&mt($tries_text))."<br />";
       return $result;
 }  }
   
   sub get_tries_text {
       my ($context) = @_;
       my $tries_text;
       if ($context eq 'link') {
           $tries_text = 'Previous Tries';
       } else {
           $tries_text = 'Tries';
       }
       if ( $Apache::lonhomework::type eq 'survey' ||
            $Apache::lonhomework::type eq 'surveycred' ||
            $Apache::lonhomework::type eq 'anonsurvey' ||
            $Apache::lonhomework::type eq 'anonsurveycred' ||
            $Apache::lonhomework::parsing_a_task) {
           if ($context eq 'link') {
               $tries_text = 'Previous Submissions';
           } else {
               $tries_text = 'Submissions';
           }
       }
       return $tries_text;
   }
   
   sub spelling_languages {
       my %langchoices;
       foreach my $id (&Apache::loncommon::languageids()) {
           my $code = &Apache::loncommon::supportedlanguagecode($id);
           if ($code ne '') {
               $langchoices{$code} =  &Apache::loncommon::plainlanguagedescription($id);
           }
       }
       my @spelllangs = ('none');
       foreach my $code ('en','de','he','es','fr','pt','tr') {
           push(@spelllangs,[$code,$langchoices{$code}]);
       }
       return \@spelllangs;
   }
   
 1;  1;
 __END__  __END__
   
   =pod
   
   =back
   
   =cut
     

Removed from v.1.109  
changed lines
  Added in v.1.337


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.