Diff for /loncom/homework/inputtags.pm between versions 1.206 and 1.291

version 1.206, 2006/09/29 20:55:33 version 1.291, 2011/06/10 17:10:17
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
   
   =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::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use lib '/home/httpd/lib/perl/';  
 use LONCAPA;  use LONCAPA;
     
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline'));      &Apache::lonxml::register('Apache::inputtags',('hiddensubmission','hiddenline','textfield','textline'));
 }  }
   
 #   Initializes a set of global variables used during the parse of the problem.  =pod
 #  
 #  @Apache::inputtags::input        - List of current input ids.  =item initialize_inputtags()
 #  @Apache::inputtags::inputlist    - List of all input ids seen this problem.  
 #  @Apache::inputtags::response     - List of all current resopnse ids.  Initializes a set of global variables used during the parse of the problem.
 #  @Apache::inputtags::responselist - List of all response ids seen this   
 #                                       problem.  @Apache::inputtags::input        - List of current input ids.
 #  @Apache::inputtags::hint         - List of all hint ids.  @Apache::inputtags::inputlist    - List of all input ids seen this problem.
 #  @Apache::inputtags::hintlist     - List of all hint ids seen this problem.  @Apache::inputtags::response     - List of all current resopnse ids.
 #  @Apache::inputtags::previous     - List describing if specific responseds  @Apache::inputtags::responselist - List of all response ids seen this 
 #                                       have been used                                       problem.
 #  @Apache::inputtags::previous_version - Submission responses were used in.  @Apache::inputtags::hint         - List of all hint ids.
 #  $Apache::inputtags::part         - Current part id (valid only in   @Apache::inputtags::hintlist     - List of all hint ids seen this problem.
 #                                       <problem>)  @Apache::inputtags::previous     - List describing if specific responseds
 #                                     0 if not in a part.                                       have been used
 #  @Apache::inputtags::partlist     - List of part ids seen in the current  @Apache::inputtags::previous_version - Submission responses were used in.
 #                                       <problem>  $Apache::inputtags::part         - Current part id (valid only in 
 #  @Apache::inputtags::status       - List of problem  statuses. First                                        <problem>)
 #                                     element is the status of the <problem>                                     0 if not in a part.
 #                                     the remainder are for individual <part>s.  @Apache::inputtags::partlist     - List of part ids seen in the current
 #  %Apache::inputtags::params       - Hash of defined parameters for the                                       <problem>
 #                                     current response.  @Apache::inputtags::status       - List of problem  statuses. First 
 #  @Apache::inputtags::import       - List of all ids for <import> thes get                                     element is the status of the <problem>
 #                                     join()ed and prepended.                                     the remainder are for individual <part>s.
 #  @Apache::inputtags::importlist   - List of all import ids seen.  %Apache::inputtags::params       - Hash of defined parameters for the
 #  $Apache::inputtags::response_with_no_part                                     current response.
 #                                   - Flag set true if we have seen a response  @Apache::inputtags::import       - List of all ids for <import> thes get
 #                                     that is not inside a <part>                                     join()ed and prepended.
 #  %Apache::inputtags::answertxt    - <*response> tags store correct  @Apache::inputtags::importlist   - List of all import ids seen.
 #                                     answer strings for display by <textline/>  $Apache::inputtags::response_with_no_part
 #                                     in this hash.                                   - 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 {
     @Apache::inputtags::input=();      @Apache::inputtags::input=();
Line 88  sub initialize_inputtags { Line 122  sub initialize_inputtags {
     @Apache::inputtags::importlist=();      @Apache::inputtags::importlist=();
     $Apache::inputtags::response_with_no_part=0;      $Apache::inputtags::response_with_no_part=0;
     %Apache::inputtags::answertxt=();      %Apache::inputtags::answertxt=();
       %Apache::inputtags::submission_display=();
 }  }
   
 sub check_for_duplicate_ids {  sub check_for_duplicate_ids {
Line 111  sub check_for_duplicate_ids { Line 146  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;
Line 141  sub start_textfield { Line 175  sub start_textfield {
     if ($target eq 'web') {      if ($target eq 'web') {
  $Apache::lonxml::evaluate--;   $Apache::lonxml::evaluate--;
  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);
           if ((($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry') ||
                ($Apache::lonhomework::type eq 'randomizetry')) &&
                ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
               if ($env{'form.'.$partid.'.rndseed'} ne
                   $Apache::lonhomework::history{"resource.$partid.rndseed"}) {
                   $newvariation = 1;
               }
           }
           unless ($newvariation) {
       $oldresponse = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$partid.$resid.submission"},'<>&"');
           }
  if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {   if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
     my $cols = &Apache::lonxml::get_param('cols',$parstack,$safeeval);      my $cols = &Apache::lonxml::get_param('cols',$parstack,$safeeval);
     if ( $cols eq '') { $cols = 80; }      if ( $cols eq '') { $cols = 80; }
Line 152  sub start_textfield { Line 197  sub start_textfield {
     if ($addchars) {      if ($addchars) {
  $result.=&addchars('HWVAL_'.$resid,$addchars);   $result.=&addchars('HWVAL_'.$resid,$addchars);
     }      }
     &Apache::lonhtmlcommon::add_htmlareafields('HWVAL_'.$resid);              my $textareaclass = 'class="LC_richDetectHtml"';
     $result.= '<textarea wrap="hard" name="HWVAL_'.$resid.'" id="HWVAL_'.$resid.'" '.      $result.= '<textarea wrap="hard" name="HWVAL_'.$resid.'" id="HWVAL_'.$resid.'" '.
  "rows=\"$rows\" cols=\"$cols\">".$oldresponse;        'rows="'.$rows.'" cols="'.$cols.'" '.$textareaclass.'>'.
                         $oldresponse;
     if ($oldresponse ne '') {      if ($oldresponse ne '') {
   
  #get rid of any startup text if the user has already responded   #get rid of any startup text if the user has already responded
Line 283  sub needs_exam_box { Line 329  sub needs_exam_box {
 sub start_textline {  sub start_textline {
     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--;
  my $partid=$Apache::inputtags::part;   my $partid=$Apache::inputtags::part;
Line 291  sub start_textline { Line 338  sub start_textline {
     my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);      my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
     my $maxlength;      my $maxlength;
     if ($size eq '') { $size=20; } else {      if ($size eq '') { $size=20; } else {
  if ($size < 20) { $maxlength=$size; }   if ($size < 20) {
       $maxlength = ' maxlength="'.$size.'"';
    }
     }      }
     my $oldresponse = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$partid.$id.submission"},'<>&"');              my ($oldresponse,$newvariation);
               if ((($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry') ||
                    ($Apache::lonhomework::type eq 'randomizetry')) &&
                    ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
                   if ($env{'form.'.$partid.'.rndseed'} ne
                       $Apache::lonhomework::history{"resource.$partid.rndseed"}) {
                       $newvariation = 1;
                   }
               }
               unless ($newvariation) {
           $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') {      if ($Apache::lonhomework::type ne 'exam') {
  my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval);   my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval);
  $result='';   $result='';
Line 312  sub start_textline { Line 380  sub start_textline {
  if ($Apache::inputtags::status[-1] eq 'CANNOT_ANSWER') {   if ($Apache::inputtags::status[-1] eq 'CANNOT_ANSWER') {
     $name = "none";      $name = "none";
  }   }
  $result.= '<input type="text" '.$readonly.' name="'.$name.'" value="'.   $result.= '<input onkeydown="javascript:setSubmittedPart(\''.$partid.'\');" type="text" '.$readonly.' name="'.$name.'" value="'.
     $oldresponse.'" size="'.$size.'" maxlength="'.$maxlength.'" />';      $oldresponse.'" size="'.$size.'"'.$maxlength.' />';
     }      }
     if ($Apache::lonhomework::type eq 'exam'      if ($Apache::lonhomework::type eq 'exam'
  && &needs_exam_box($tagstack)) {   && &needs_exam_box($tagstack)) {
Line 321  sub start_textline { Line 389  sub start_textline {
     }      }
  } else {   } else {
     #right or wrong don't show what was last typed in.      #right or wrong don't show what was last typed in.
     $result='<b>'.$Apache::inputtags::answertxt{$id}.'</b>';      my $count = scalar(@Apache::inputtags::inputlist)-1;
       $result='<b>'.$Apache::inputtags::answertxt{$id}[$count].'</b>';
     #$result='';      #$result='';
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
Line 342  sub start_textline { Line 411  sub start_textline {
      && $Apache::lonhomework::type ne 'exam') {       && $Apache::lonhomework::type ne 'exam') {
  my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);   my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
  if ($size != 0) {$size=$size*2; $size.=' mm';} else {$size='40 mm';}   if ($size != 0) {$size=$size*2; $size.=' mm';} else {$size='40 mm';}
  $result='\framebox['.$size.'][s]{\tiny\strut}';   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'       } elsif ($target eq 'tex' 
      && $Apache::lonhomework::type eq 'exam'       && $Apache::lonhomework::type eq 'exam'
      && &needs_exam_box($tagstack)) {       && &needs_exam_box($tagstack)) {
Line 356  sub end_textline { Line 433  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'); }
       &end_input();
     return "";      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 390  sub end_hiddenline { Line 474  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'); }
       &end_input();
     return "";      return "";
 }  }
   
 # $part -> partid  
 # $id -> responseid  sub start_hiddensubmission {
 # $uploadefiletypes -> comma seperated list of extensions allowed or * for any      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
 # $which -> 'uploadedonly'  -> only newly uploaded files      my $result = "";
 #           'portfolioonly' -> only allow files from portfolio      my $input_id = &start_input($parstack,$safeeval);
 #           'both' -> allow files from either location      if ($target eq 'web') {
 # $extratext -> additional text to go between the link and the input box          $Apache::lonxml::evaluate--;
 # returns a table row <tr>           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 {  sub file_selector {
     my ($part,$id,$uploadedfiletypes,$which,$extratext)=@_;      my ($part,$id,$uploadedfiletypes,$which,$extratext,$maxfilesize)=@_;
     if (!$uploadedfiletypes) { return ''; }      if (!$uploadedfiletypes) { return ''; }
   
     my $jspart=$part;      my $jspart=$part;
     $jspart=~s/\./_/g;      $jspart=~s/\./_/g;
   
     my $result;      my $result;
           my $current_files_display = &current_file_submissions($part,$id);
     $result.='<tr><td>';      my $addfiles;
       if ($current_files_display) {
           $result .= &Apache::lonhtmlcommon::row_title(&mt('Currently submitted files')).
                      $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 '*') {      if ($uploadedfiletypes ne '*') {
  $result.=   $constraints =
     &mt('Allowed filetypes: <b>[_1]</b>',$uploadedfiletypes).'<br />';      &mt('Allowed filetypes: [_1]','<b>'.$uploadedfiletypes.'</b>').'<br />';
       }
       if ($maxfilesize) {
           $constraints .= &mt('Combined size of all files not to exceed: [_1] MB[_2].',
                           '<b>'.$maxfilesize.'</b>').'<br />';
       }
       if ($constraints) {
           $result .= $constraints.'<br />';
     }      }
     if ($which eq 'uploadonly' || $which eq 'both') {       if ($which eq 'uploadonly' || $which eq 'both') { 
  $result.=&mt('Submit a file: (only one file can be uploaded)').   $result.=&mt('Submit a file: (only one file per submission)').
     ' <br /><input type="file" size="50" name="HWFILE'.      ' <br /><input type="file" size="50" name="HWFILE'.
     $jspart.'_'.$id.'" /><br />';      $jspart.'_'.$id.'" /><br />';
  $result .= &show_past_file_submission($part,$id);  
     }      }
     if ( $which eq 'both') {       if ( $which eq 'both') {
  $result.='<br />'.'<strong>'.&mt('OR:').'</strong><br />';   $result.='<br />'.'<strong>'.&mt('OR:').'</strong><br />';
     }      }
     if ($which eq 'portfolioonly' || $which eq 'both') {       if ($which eq 'portfolioonly' || $which eq 'both') { 
  $result.=$extratext.'<a href='."'".'javascript:void(window.open("/adm/portfolio?mode=selectfile&amp;fieldname=HWPORT'.$jspart.'_'.$id.'","cat","height=600,width=800,scrollbars=1,resizable=1,menubar=2,location=1"))'."'".'>'.   $result.=$extratext.'<a href='."'".'javascript:void(window.open("/adm/portfolio?mode=selectfile&amp;fieldname='.$env{'form.request.prefix'}.'HWPORT'.$jspart.'_'.$id.'","cat","height=600,width=800,scrollbars=1,resizable=1,menubar=2,location=1"))'."'".'>'.
     &mt('Select Portfolio Files').'</a><br />'.      &mt('Select Portfolio Files: (one or more files per submission)').'</a><br />'.
     '<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'.      '<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'.
     '<br />';      '<br />';
  $result .= &show_past_portfile_submission($part,$id);  
   
     }      }
     $result.='</td></tr>';       $result.=&Apache::lonhtmlcommon::row_closure(1);
     return $result;      return $result;
 }  }
   
 sub show_past_file_submission {  sub current_file_submissions {
     my ($part,$id) = @_;  
     my $uploadedfile= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.uploadedfile"},'<>&"');  
   
     return if (!$uploadedfile);  
   
     my $url=$Apache::lonhomework::history{"resource.$part.$id.uploadedurl"};  
     &Apache::lonxml::extlink($url);  
     &Apache::lonnet::allowuploaded('/adm/essayresponse',$url);  
     my $icon=&Apache::loncommon::icon($url);  
     my $curfile='<a href="'.$url.'"><img src="'.$icon.  
  '" border="0" />'.$uploadedfile.'</a>';  
     return &mt('Currently submitted: <tt>[_1]</tt>',$curfile);  
   
 }  
   
 sub show_past_portfile_submission {  
     my ($part,$id) = @_;      my ($part,$id) = @_;
     if ($Apache::lonhomework::history{"resource.$part.$id.portfiles"}!~/[^\s]/){      my $jspart=$part;
  return;      $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 $header = &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 (undef,$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 ($portfiles =~ /[^\s]/) {
           my $prefix = "/uploaded/$udom/$uname/portfolio";
           foreach my $file (split(/\s*,\s*/,&unescape($portfiles))) {
               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 $showname = $rows{$url}{path}.$name;
                           if ($legacy{$url}) {
                               $showname = $name.' '.&mt('not in portfolio');
                           }
                           $result .= 
                               '<td><a href="'.$link.'"><img src="'.$icon.
                               '" border="0" alt="" />'.$showname.'</a></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().
                      '<br /><span class="LC_warning">'.
                      &mt('Exclude existing file(s) from grading by checking the "Delete?" checkbox(es) and clicking "Submit Answer"').'</span>';
     }      }
     my (@file_list,@bad_file_list);  
     foreach my $file (split(/\s*,\s*/,&unescape($Apache::lonhomework::history{"resource.$part.$id.portfiles"}))) {  
  my (undef,undef,$domain,$user)=&Apache::lonxml::whichuser();  
  my $url="/uploaded/$domain/$user/portfolio$file";  
  my $icon=&Apache::loncommon::icon($url);  
  push(@file_list,'<a href="'.$url.'"><img src="'.$icon.  
      '" border="0" />'.$file.'</a>');  
  if (! &Apache::lonnet::stat_file($url)) {  
     &Apache::lonnet::logthis("bad file is $url");  
     push(@bad_file_list,'<a href="'.$url.'"><img src="'.$icon.  
  '" border="0" />'.$file.'</a>');  
  }  
     }  
     my $files = '<span class="LC_filename">'.  
  join('</span>, <span class="LC_filename">',@file_list).  
  '</span>';  
     my $result = &mt("Portfolio files previously selected: [_1]",$files);  
     if (@bad_file_list) {      if (@bad_file_list) {
  my $bad_files = '<span class="LC_filename">'.          my $bad_files = '<span class="LC_filename">'.
     join('</span>, <span class="LC_filename">',@bad_file_list).              join('</span>, <span class="LC_filename">',@bad_file_list).
     '</span>';              '</span>';
  $result.='<br />'.&mt('<span class="LC_error">These file(s) don\'t exist:</span> [_1]',$bad_files);          $result.='<p class="LC_error">'.
                    &mt("These file(s) don't exist: [_1]",$bad_files).
                    '</p>';
     }      }
     return $result;      return $result;
   
 }  }
   
 sub checkstatus {  sub current_file_info {
     my ($value,$awardref,$msgref,$nameref)=@_;      my ($url,$uploadedfile,$name,$path) = @_;
     for (my $i=0;$i<=$#$awardref;$i++) {      my ($status,$error,%info);
  if ($$awardref[$i] eq $value) {      my @stat = &Apache::lonnet::stat_file($url);
     if (ref($nameref)) {      if ((@stat) && ($stat[0] ne 'no_such_dir')) {
  return ($$awardref[$i],$$msgref[$i],$$nameref[$i]);          my ($lastmod,$size);
     } else {          if ($stat[9] =~ /^\d+$/) {
  return ($$awardref[$i],$$msgref[$i]);              $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(undef,undef);      return ($status,\%info,$error);
 }  }
   
 sub valid_award {  sub valid_award {
Line 506  sub valid_award { Line 727  sub valid_award {
        'UNIT_INVALID_STUDENT', 'UNIT_IRRECONCIBLE',         'UNIT_INVALID_STUDENT', 'UNIT_IRRECONCIBLE',
        'UNIT_FAIL', 'NO_UNIT',         'UNIT_FAIL', 'NO_UNIT',
        'UNIT_NOTNEEDED', 'WANTED_NUMERIC',         'UNIT_NOTNEEDED', 'WANTED_NUMERIC',
        'BAD_FORMULA', 'SIG_FAIL', 'INCORRECT',          'BAD_FORMULA', 'NOT_FUNCTION', 'WRONG_FORMAT', 
                                  'INTERNAL_ERROR', 'SIG_FAIL', 'INCORRECT', 
        'MISORDERED_RANK', 'INVALID_FILETYPE',         'MISORDERED_RANK', 'INVALID_FILETYPE',
        'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE',                                 'EXCESS_FILESIZE', 'FILENAME_INUSE', 
        'APPROX_ANS', 'EXACT_ANS','COMMA_FAIL') {         'DRAFT', 'SUBMITTED', 'SUBMITTED_CREDIT', 
                                  'ANONYMOUS', 'ANONYMOUS_CREDIT',
                                  'ASSIGNED_SCORE', 'APPROX_ANS',
          'EXACT_ANS','COMMA_FAIL') {
  if ($award eq $possibleaward) { return 1; }   if ($award eq $possibleaward) { return 1; }
     }      }
     return 0;      return 0;
 }  }
   
   {
       my @awards = ('EXTRA_ANSWER', 'MISSING_ANSWER', 'ERROR', 'NO_RESPONSE',
     '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 ($awardref,$msgref,$nameref,$reverse)=@_;      my ($awardref,$msgref,$nameref,$reverse,$final_scantron)=@_;
     my ($result,$award,$msg,$name);      my $result;
     if ($#$awardref == -1) { $result = "NO_RESPONSE"; }      if ($#$awardref == -1) { $result = "NO_RESPONSE"; }
     if ($result eq '' ) {      if ($result eq '' ) {
  my $blankcount;   my $blankcount;
  foreach $award (@$awardref) {   foreach my $award (@$awardref) {
     if ($award eq '') {      if ($award eq '') {
  $result='MISSING_ANSWER';   $result='MISSING_ANSWER';
  $blankcount++;   $blankcount++;
     }      }
  }   }
  if ($blankcount == ($#$awardref + 1)) { $result = 'NO_RESPONSE'; }   if ($blankcount == ($#$awardref + 1)) {
       return ('NO_RESPONSE');
    }
       }
   
       if ($Apache::lonxml::internal_error) { $result='INTERNAL_ERROR'; }
   
       if (!$final_scantron && defined($result)) { return ($result); }
   
       # if in scantron mode, if the award for any response is 
       # assigned score, then the part gets an assigned score
       if ($final_scantron 
    && grep {$_ eq 'ASSIGNED_SCORE'} (@$awardref)) {
    return ('ASSIGNED_SCORE');
     }      }
     if (defined($result)) { return ($result,$msg); }  
   
       # if in scantron mode, if the award for any response is 
       # correct and there are non-correct responses,
       # then the part gets an assigned score
       if ($final_scantron 
    && (grep { $_ eq 'EXACT_ANS' ||
      $_ eq 'APPROX_ANS'  } (@$awardref))
    && (grep { $_ ne 'EXACT_ANS' &&
      $_ ne 'APPROX_ANS'  } (@$awardref))) {
    return ('ASSIGNED_SCORE');
       }
     # these awards are ordered from most important error through best correct      # these awards are ordered from most important error through best correct
           my $awards = (!$reverse) ? \%fwd_awards : \%rev_awards ;
     my @awards = ('EXTRA_ANSWER', 'MISSING_ANSWER', 'ERROR', 'NO_RESPONSE',  
   'TOO_LONG',      my $best = $max;
   'UNIT_INVALID_INSTRUCTOR', 'UNIT_INVALID_STUDENT',      my $j=0;
   'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT',      my $which;
   'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA',      foreach my $award (@$awardref) {
   'COMMA_FAIL', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK',   if ($awards->{$award} < $best) {
   'INVALID_FILETYPE', 'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE',      $best  = $awards->{$award};
   'APPROX_ANS', 'EXACT_ANS');      $which = $j;
     if ($reverse) { @awards=reverse(@awards); }   }
     foreach my $possibleaward (@awards) {   $j++;
  ($result,$msg,$name)=&checkstatus($possibleaward,$awardref,$msgref,      }
   $nameref);  
  if (defined($result)) { return ($result,$msg,$name); }      if (defined($which)) {
    if (ref($nameref)) {
       return ($$awardref[$which],$$msgref[$which],$$nameref[$which]);
    } else {
       return ($$awardref[$which],$$msgref[$which]);
    }
     }      }
     return ('ERROR',undef);      return ('ERROR',undef);
 }  }
   }
   
 sub decideoutput {  sub decideoutput {
     my ($award,$awarded,$awardmsg,$solved,$previous,$target)=@_;      my ($award,$awarded,$awardmsg,$solved,$previous,$target,$nocorrect)=@_;
   
     my $message='';      my $message='';
     my $button=0;      my $button=0;
     my $previousmsg;      my $previousmsg;
     my $bgcolor='orange';      my $css_class='orange';
     my $added_computer_text=0;      my $added_computer_text=0;
     my %possiblecolors =      my %possible_class =
  ( 'correct'         => '#aaffaa',   ( 'correct'         => 'LC_answer_correct',
   'charged_try'     => '#ffaaaa',    'charged_try'     => 'LC_answer_charged_try',
   'not_charged_try' => '#ffffaa',    'not_charged_try' => 'LC_answer_not_charged_try',
   'no_grade'        => '#ffffaa',    'no_grade'        => 'LC_answer_no_grade',
   'no_message'      => '#ffffff',    'no_message'      => 'LC_no_message',
   );    );
   
     my $part = $Apache::inputtags::part;      my $part = $Apache::inputtags::part;
     my $handgrade =       my $tohandgrade = &Apache::lonnet::EXT("resource.$part.handgrade");
  ('yes' eq lc(&Apache::lonnet::EXT("resource.$part.handgrade")));      my $handgrade = ('yes' eq lc($tohandgrade)); 
   #
   # Should "Computer's Answer" be displayed?
   # Should not be displayed if still answerable,
   # if the problem is handgraded,
   # or if the problem does not give a correct answer
   #
           
     my $computer = ($handgrade)? ''      my $computer = ($handgrade || $nocorrect)? ''
                        : " ".&mt("Computer's answer now shown above.");                         : " ".&mt("Computer's answer now shown above.");
     &Apache::lonxml::debug("handgrade has :$handgrade:");      &Apache::lonxml::debug("handgrade has :$handgrade:");
   
     if ($previous) { $previousmsg=&mt('You have entered that answer before'); }      if ($previous) { $previousmsg=&mt('You have entered that answer before'); }
           
     if ($solved =~ /^correct/) {      if ($solved =~ /^correct/) {
         $bgcolor=$possiblecolors{'correct'};          $css_class=$possible_class{'correct'};
  $message=&mt('You are correct.');   $message=&mt('You are correct.');
  if ($awarded < 1 && $awarded > 0) {   if ($awarded < 1 && $awarded > 0) {
     $message=&mt('You are partially correct.');      $message=&mt('You are partially correct.');
     $bgcolor=$possiblecolors{'not_charged_try'};      $css_class=$possible_class{'not_charged_try'};
  } elsif ($awarded < 1) {   } elsif ($awarded < 1) {
     $message=&mt('Incorrect.');      $message=&mt('Incorrect.');
     $bgcolor=$possiblecolors{'charged_try'};      $css_class=$possible_class{'charged_try'};
  }   }
  if ($env{'request.filename'} =~    if ($handgrade || 
     m|/res/lib/templates/examupload.problem$|) {              ($env{'request.filename'}=~/\/res\/lib\/templates\/(examupload|DropBox).problem$/)) {
     $message = &mt("A score has been assigned.");      $message = &mt("A score has been assigned.");
     $added_computer_text=1;      $added_computer_text=1;
  } else {   } else {
Line 597  sub decideoutput { Line 897  sub decideoutput {
  $message.= $computer;   $message.= $computer;
     }      }
     $added_computer_text=1;      $added_computer_text=1;
     unless ($env{'course.'.      if ($awarded > 0) {
      $env{'request.course.id'}.   my ($symb) = &Apache::lonnet::whichuser();
      '.disable_receipt_display'} eq 'yes') {    if (($symb ne '') 
  $message.=(($target eq 'web')?'<br />':' ').      &&
     &mt('Your receipt is').' '.&Apache::lonnet::receipt($Apache::inputtags::part).      ($env{'course.'.$env{'request.course.id'}.
     (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'');        '.disable_receipt_display'} ne 'yes') &&
                       ($Apache::lonhomework::type ne 'practice')) { 
       $message.=(($target eq 'web')?'<br />':' ').
    &mt('Your receipt no. is [_1]',
       (&Apache::lonnet::receipt($Apache::inputtags::part).
        (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
    }
     }      }
  }   }
  $button=0;          if ($awarded==1) { $button=0; } else { $button=1; }
  $previousmsg='';   $previousmsg='';
     } elsif ($solved =~ /^excused/) {      } elsif ($solved =~ /^excused/) {
  if ($target eq 'tex') {   if ($target eq 'tex') {
Line 613  sub decideoutput { Line 919  sub decideoutput {
  } else {   } else {
     $message = "<b>".&mt('You are excused from the problem.')."</b>";      $message = "<b>".&mt('You are excused from the problem.')."</b>";
  }   }
  $bgcolor=$possiblecolors{'charged_try'};   $css_class=$possible_class{'charged_try'};
  $button=0;   $button=0;
  $previousmsg='';   $previousmsg='';
     } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {      } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {
  if ($solved =~ /^incorrect/ || $solved eq '') {   if ($solved =~ /^incorrect/ || $solved eq '') {
     $message = &mt("Incorrect").".";      $message = &mt("Incorrect").".";
     $bgcolor=$possiblecolors{'charged_try'};      $css_class=$possible_class{'charged_try'};
     $button=1;      $button=1;
  } else {   } else {
     if ($target eq 'tex') {      if ($target eq 'tex') {
Line 629  sub decideoutput { Line 935  sub decideoutput {
  $message.= $computer;   $message.= $computer;
     }      }
     $added_computer_text=1;      $added_computer_text=1;
     unless ($env{'course.'.      if  ($awarded > 0 
    && $env{'course.'.
      $env{'request.course.id'}.       $env{'request.course.id'}.
      '.disable_receipt_display'} eq 'yes') {        '.disable_receipt_display'} ne 'yes') { 
  $message.=(($target eq 'web')?'<br />':' ').   $message.=(($target eq 'web')?'<br />':' ').
     'Your receipt is '.&Apache::lonnet::receipt($Apache::inputtags::part).      &mt('Your receipt is [_1]',
     (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'');   (&Apache::lonnet::receipt($Apache::inputtags::part).
    (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
     }      }
     $bgcolor=$possiblecolors{'correct'};      $css_class=$possible_class{'correct'};
     $button=0;      $button=0;
     $previousmsg='';      $previousmsg='';
  }   }
     } elsif ($award eq 'NO_RESPONSE') {      } elsif ($award eq 'NO_RESPONSE') {
  $message = '';   $message = '';
  $bgcolor=$possiblecolors{'no_feedback'};   $css_class=$possible_class{'no_feedback'};
  $button=1;   $button=1;
     } elsif ($award eq 'EXTRA_ANSWER') {      } elsif ($award eq 'EXTRA_ANSWER') {
  $message = &mt('Some extra items were submitted.');   $message = &mt('Some extra items were submitted.');
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button = 1;   $button = 1;
     } elsif ($award eq 'MISSING_ANSWER') {      } elsif ($award eq 'MISSING_ANSWER') {
  $message = &mt('Some items were not submitted.');   $message = &mt('Some items were not submitted.');
  $bgcolor=$possiblecolors{'not_charged_try'};          if ($target ne 'tex') {
              $message .= &Apache::loncommon::help_open_topic('Some_Items_Were_Not_Submitted');
           }
    $css_class=$possible_class{'not_charged_try'};
  $button = 1;   $button = 1;
     } elsif ($award eq 'ERROR') {      } elsif ($award eq 'ERROR') {
  $message = &mt('An error occured while grading your answer.');   $message = &mt('An error occurred while grading your answer.');
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button = 1;   $button = 1;
     } elsif ($award eq 'TOO_LONG') {      } elsif ($award eq 'TOO_LONG') {
  $message = &mt("The submitted answer was too long.");   $message = &mt("The submitted answer was too long.");
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'WANTED_NUMERIC') {      } elsif ($award eq 'WANTED_NUMERIC') {
  $message = &mt("This question expects a numeric answer.");   $message = &mt("This question expects a numeric answer.");
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'MISORDERED_RANK') {      } elsif ($award eq 'MISORDERED_RANK') {
  $message = &mt('You have provided an invalid ranking');          $message = &mt('You have provided an invalid ranking.');
  if ($target ne 'tex') {          if ($target ne 'tex') {
     $message.=', '.&mt('please refer to').' '.&Apache::loncommon::help_open_topic('Ranking_Problems','help on ranking problems');              $message.=' '.&mt('Please refer to [_1]',&Apache::loncommon::help_open_topic('Ranking_Problems',&mt('help on ranking problems')));
  }          }
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $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 file name.');
           $css_class=$possible_class{'not_charged_try'};
           $button=1;
     } elsif ($award eq 'INVALID_FILETYPE') {      } elsif ($award eq 'INVALID_FILETYPE') {
  $message = &mt('Submission won\'t be graded. The type of file submitted is not allowed.');   $message = &mt("Submission won't be graded. The type of file submitted is not allowed.");
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'SIG_FAIL') {      } elsif ($award eq 'SIG_FAIL') {
  my ($used,$min,$max)=split(':',$awardmsg);   my ($used,$min,$max)=split(':',$awardmsg);
  my $word;   my $word = ($used < $min) ? 'more' : 'fewer';
  if ($used < $min) { $word=&mt('more'); }   $message = &mt("Submission not graded. Use $word digits.",$used);
  if ($used > $max) { $word=&mt('fewer'); }   $css_class=$possible_class{'not_charged_try'};
  $message = &mt("Submission not graded.  Use [_2] digits.",$used,$word);  
  $bgcolor=$possiblecolors{'not_charged_try'};  
  $button=1;   $button=1;
     } elsif ($award eq 'UNIT_INVALID_INSTRUCTOR') {      } elsif ($award eq 'UNIT_INVALID_INSTRUCTOR') {
  $message = &mt('Error in instructor specifed unit. This error has been reported to the instructor.', $awardmsg);   $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');}    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'UNIT_INVALID_STUDENT') {      } elsif ($award eq 'UNIT_INVALID_STUDENT') {
  $message = &mt('Unable to interpret units. Computer reads units as "[_1]".',&markup_unit($awardmsg,$target));   $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');}    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'UNIT_FAIL' || $award eq 'UNIT_IRRECONCIBLE') {      } 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));   $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');}    if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} 
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'UNIT_NOTNEEDED') {      } elsif ($award eq 'UNIT_NOTNEEDED') {
  $message = &mt('Only a number required. Computer reads units of "[_1]".',&markup_unit($awardmsg,$target));   $message = &mt('Only a number required. Computer reads units of "[_1]".',&markup_unit($awardmsg,$target));
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'NO_UNIT') {      } elsif ($award eq 'NO_UNIT') {
  $message = &mt("Units required").'.';   $message = &mt("Units required").'.';
  if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units')};   if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units')};
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'COMMA_FAIL') {      } elsif ($award eq 'COMMA_FAIL') {
  $message = &mt("Proper comma separation is required").'.';   $message = &mt("Proper comma separation is required").'.';
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'BAD_FORMULA') {      } elsif ($award eq 'BAD_FORMULA') {
  $message = &mt("Unable to understand formula");   $message = &mt("Unable to understand formula").'.';
  $bgcolor=$possiblecolors{'not_charged_try'};          if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Formula_Answers')};
    $css_class=$possible_class{'not_charged_try'};
  $button=1;   $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') {      } elsif ($award eq 'INCORRECT') {
  $message = &mt("Incorrect").'.';   $message = &mt("Incorrect").'.';
  $bgcolor=$possiblecolors{'charged_try'};   $css_class=$possible_class{'charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'SUBMITTED') {      } elsif ($award eq 'SUBMITTED') {
  $message = &mt("Your submission has been recorded.");   $message = &mt("Your submission has been recorded.");
  $bgcolor=$possiblecolors{'no_grade'};   $css_class=$possible_class{'no_grade'};
  $button=1;   $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'};
     } elsif ($award eq 'DRAFT') {      } elsif ($award eq 'DRAFT') {
  $message = &mt("A draft copy has been saved.");   $message = &mt("Copy saved but not submitted.");
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'not_charged_try'};
  $button=1;   $button=1;
     } elsif ($award eq 'ASSIGNED_SCORE') {      } elsif ($award eq 'ASSIGNED_SCORE') {
  $message = &mt("A score has been assigned.");   $message = &mt("A score has been assigned.");
  $bgcolor=$possiblecolors{'correct'};   $css_class=$possible_class{'correct'};
  $button=0;   $button=0;
     } elsif ($award eq '') {      } elsif ($award eq '') {
  if ($handgrade && $Apache::inputtags::status[-1] eq 'SHOW_ANSWER') {   if ($handgrade && $Apache::inputtags::status[-1] eq 'SHOW_ANSWER') {
     $message = &mt("Nothing submitted.");      $message = &mt("Nothing submitted.");
     $bgcolor=$possiblecolors{'charged_try'};      $css_class=$possible_class{'charged_try'};
  } else {   } else {
     $bgcolor=$possiblecolors{'not_charged_try'};      $css_class=$possible_class{'not_charged_try'};
  }   }
  $button=1;   $button=1;
     } else {      } else {
  $message = &mt("Unknown message").": $award";   $message = &mt("Unknown message").": $award";
  $button=1;   $button=1;
     }      }
     my (undef,undef,$domain,$user)=&Apache::lonxml::whichuser();      my (undef,undef,$domain,$user)=&Apache::lonnet::whichuser();
     foreach my $resid(@Apache::inputtags::response){      foreach my $resid(@Apache::inputtags::response){
         if ($Apache::lonhomework::history{"resource.$part.$resid.handback"}) {          if ($Apache::lonhomework::history{"resource.$part.$resid.handback"}) {
     $message.='<br />';              if ($target eq 'tex') {
                   $message.= "\\\\\n";
               } else {
                   $message.='<br />';
               }
     my @files = split(/\s*,\s*/,      my @files = split(/\s*,\s*/,
       $Apache::lonhomework::history{"resource.$part.$resid.handback"});        $Apache::lonhomework::history{"resource.$part.$resid.handback"});
     my $file_msg;      my $file_msg;
     foreach my $file (@files) {      foreach my $file (@files) {
  $file_msg.= '<br /><a href="/uploaded/'."$domain/$user".'/'.$file.'">'.$file.'</a>';                  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);      $message .= &mt('Returned file(s): [_1]',$file_msg);
               if ($target eq 'tex') {
                   $message.= "\\\\\n";
               } else {
                   $message.='<br />';
               }
  }   }
     }      }
   
     if (lc($Apache::lonhomework::problemstatus) eq 'no'  &&       if (&Apache::lonhomework::hide_problem_status()
  $Apache::inputtags::status[-1] ne 'SHOW_ANSWER') {   && $Apache::inputtags::status[-1] ne 'SHOW_ANSWER'
    && &hide_award($award)) {
  $message = &mt("Answer Submitted: Your final submission will be graded after the due date.");   $message = &mt("Answer Submitted: Your final submission will be graded after the due date.");
  $bgcolor=$possiblecolors{'no_grade'};   $css_class=$possible_class{'no_grade'};
  $button=1;   $button=1;
     }      }
     if ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER' &&       if ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER' && 
Line 768  sub decideoutput { Line 1129  sub decideoutput {
  $message.= $computer;   $message.= $computer;
  $added_computer_text=1;   $added_computer_text=1;
     }      }
     return ($button,$bgcolor,$message,$previousmsg);      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 {  sub markup_unit {
Line 820  sub setgradedata { Line 1189  sub setgradedata {
  $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {   $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
  $Apache::lonhomework::results{"resource.$id.afterduedate"}=$award;   $Apache::lonhomework::results{"resource.$id.afterduedate"}=$award;
  return '';   return '';
     } elsif ( $Apache::lonhomework::history{"resource.$id.solved"} !~      } elsif ( $Apache::lonhomework::history{"resource.$id.awarded"} < 1
       /^correct/ || $Apache::lonhomework::scantronmode ||        || $Apache::lonhomework::scantronmode 
       lc($Apache::lonhomework::problemstatus) eq 'no') {        || &Apache::lonhomework::hide_problem_status()  ) {
         # the student doesn't already have it correct,          # the student doesn't already have it correct,
  # or we are in a mode (scantron orno problem status) where a correct    # or we are in a mode (scantron orno problem status) where a correct 
         # can become incorrect          # can become incorrect
Line 844  sub setgradedata { Line 1213  sub setgradedata {
     my $numawards=scalar(@Apache::inputtags::response);      my $numawards=scalar(@Apache::inputtags::response);
     $Apache::lonhomework::results{"resource.$id.awarded"} = 0;      $Apache::lonhomework::results{"resource.$id.awarded"} = 0;
     foreach my $res (@Apache::inputtags::response) {      foreach my $res (@Apache::inputtags::response) {
  $Apache::lonhomework::results{"resource.$id.awarded"}+=   if (defined($Apache::lonhomework::results{"resource.$id.$res.awarded"})) {
     $Apache::lonhomework::results{"resource.$id.$res.awarded"};      $Apache::lonhomework::results{"resource.$id.awarded"}+=
    $Apache::lonhomework::results{"resource.$id.$res.awarded"};
    } else {
       $Apache::lonhomework::results{"resource.$id.awarded"}+=
    &awarddetail_to_awarded($Apache::lonhomework::results{"resource.$id.$res.awarddetail"});
    }
     }      }
     if ($numawards > 0) {      if ($numawards > 0) {
  $Apache::lonhomework::results{"resource.$id.awarded"}/=   $Apache::lonhomework::results{"resource.$id.awarded"}/=
Line 857  sub setgradedata { Line 1231  sub setgradedata {
     $Apache::lonhomework::results{"resource.$id.solved"} =      $Apache::lonhomework::results{"resource.$id.solved"} =
  $solvemsg;   $solvemsg;
     $Apache::lonhomework::results{"resource.$id.awarded"} = '1';      $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' ) {   } elsif ( $award eq 'INCORRECT' ) {
     $Apache::lonhomework::results{"resource.$id.tries"} =      $Apache::lonhomework::results{"resource.$id.tries"} =
  $Apache::lonhomework::history{"resource.$id.tries"} + 1;   $Apache::lonhomework::history{"resource.$id.tries"} + 1;
     if (lc($Apache::lonhomework::problemstatus) eq 'no' ||      if (&Apache::lonhomework::hide_problem_status()
  $Apache::lonhomework::scantronmode) {   || $Apache::lonhomework::scantronmode) {
  $Apache::lonhomework::results{"resource.$id.awarded"} = 0;   $Apache::lonhomework::results{"resource.$id.awarded"} = 0;
     }      }
     $Apache::lonhomework::results{"resource.$id.solved"} =      $Apache::lonhomework::results{"resource.$id.solved"} =
Line 871  sub setgradedata { Line 1257  sub setgradedata {
  $Apache::lonhomework::history{"resource.$id.tries"} + 1;   $Apache::lonhomework::history{"resource.$id.tries"} + 1;
     $Apache::lonhomework::results{"resource.$id.solved"} =      $Apache::lonhomework::results{"resource.$id.solved"} =
  'ungraded_attempted';   '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' ) {   } elsif ( $award eq 'DRAFT' ) {
     $Apache::lonhomework::results{"resource.$id.solved"} = '';      $Apache::lonhomework::results{"resource.$id.solved"} = '';
  } elsif ( $award eq 'NO_RESPONSE' ) {   } elsif ( $award eq 'NO_RESPONSE' ) {
Line 880  sub setgradedata { Line 1271  sub setgradedata {
  } else {   } else {
     $Apache::lonhomework::results{"resource.$id.solved"} =      $Apache::lonhomework::results{"resource.$id.solved"} =
  'incorrect_attempted';   'incorrect_attempted';
     if (lc($Apache::lonhomework::problemstatus) eq 'no' ||      if (&Apache::lonhomework::show_no_problem_status()
  $Apache::lonhomework::scantronmode) {   || $Apache::lonhomework::scantronmode) {
  $Apache::lonhomework::results{"resource.$id.tries"} =   $Apache::lonhomework::results{"resource.$id.tries"} =
     $Apache::lonhomework::history{"resource.$id.tries"} + 1;      $Apache::lonhomework::history{"resource.$id.tries"} + 1;
  $Apache::lonhomework::results{"resource.$id.awarded"} = 0;   $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)) {   if (defined($msg)) {
     $Apache::lonhomework::results{"resource.$id.awardmsg"} = $msg;      $Apache::lonhomework::results{"resource.$id.awardmsg"} = $msg;
Line 899  sub setgradedata { Line 1296  sub setgradedata {
     # check if this was a previous submission if it was delete the      # check if this was a previous submission if it was delete the
     # unneeded data and update the previously_used attribute      # unneeded data and update the previously_used attribute
     if ( $previously_used eq 'PREVIOUSLY_USED') {      if ( $previously_used eq 'PREVIOUSLY_USED') {
  if (lc($Apache::lonhomework::problemstatus) ne 'no') {   if (&Apache::lonhomework::show_problem_status()) {
     delete($Apache::lonhomework::results{"resource.$id.tries"});      delete($Apache::lonhomework::results{"resource.$id.tries"});
     $Apache::lonhomework::results{"resource.$id.previous"} = '1';      $Apache::lonhomework::results{"resource.$id.previous"} = '1';
  }   }
Line 913  sub setgradedata { Line 1310  sub setgradedata {
  $Apache::lonhomework::results{"resource.$id.previous"} = '0';   $Apache::lonhomework::results{"resource.$id.previous"} = '0';
     }      }
  }   }
     } elsif ( $Apache::lonhomework::history{"resource.$id.solved"} =~      } elsif ( $Apache::lonhomework::history{"resource.$id.awarded"} == 1 ) {
       /^correct/ ) {  
  #delete all data as they student already has it correct   #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   #and since they didn't do anything we were never here
Line 924  sub setgradedata { Line 1320  sub setgradedata {
     if ($award eq 'SUBMITTED') {      if ($award eq 'SUBMITTED') {
  &Apache::response::add_to_gradingqueue();   &Apache::response::add_to_gradingqueue();
     }      }
       $Apache::lonhomework::results{"resource.$id.type"} = $Apache::lonhomework::type;
       $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{"resourse.$id.version"} = &Apache::lonnet::usedversion(); 
   }
   
   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 {
Line 941  sub grade { Line 1377  sub grade {
     &Apache::lonxml::debug("got message $value from $response for $id");      &Apache::lonxml::debug("got message $value from $response for $id");
     push (@msgs,$value);      push (@msgs,$value);
  }   }
  my ($finalaward,$msg) = &finalizeawards(\@awards,\@msgs);   my ($finalaward,$msg) = 
       &finalizeawards(\@awards,\@msgs,undef,undef,
       $Apache::lonhomework::scantronmode);
  my $previously_used;   my $previously_used;
  if ( $#Apache::inputtags::previous eq $#awards ) {   if ( $#Apache::inputtags::previous eq $#awards ) {
     my $match=0;      my ($match) =
     my @matches;   &previous_match(\@Apache::inputtags::previous_version,
     foreach my $versionar (@Apache::inputtags::previous_version) {   scalar(@Apache::inputtags::response));
  foreach my $version (@$versionar) {  
     $matches[$version]++;  
  }  
     }  
     foreach my $elem (@matches) {if ($elem eq ($#awards+1)) {$match=1;}}  
     if ($match) {      if ($match) {
  $previously_used = 'PREVIOUSLY_LAST';   $previously_used = 'PREVIOUSLY_LAST';
  foreach my $value (@Apache::inputtags::previous) {   foreach my $value (@Apache::inputtags::previous) {
Line 968  sub grade { Line 1402  sub grade {
     return '';      return '';
 }  }
   
   sub get_grade_messages {
       my ($id,$prefix,$target,$status,$nocorrect) = @_;
   # nocorrect suppresses "Computer's answer now shown above"
       my ($message,$latemessage,$trystr,$previousmsg);
       my $showbutton = 1;
   
       my $award = $Apache::lonhomework::history{"$prefix.award"};
       my $awarded = $Apache::lonhomework::history{"$prefix.awarded"};
       my $solved = $Apache::lonhomework::history{"$prefix.solved"};
       my $previous = $Apache::lonhomework::history{"$prefix.previous"};
       my $awardmsg = $Apache::lonhomework::history{"$prefix.awardmsg"};
       &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg");
       if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {
    &Apache::lonxml::debug('Getting message');
    ($showbutton,my $css_class,$message,$previousmsg) =
       &decideoutput($award,$awarded,$awardmsg,$solved,$previous,
     $target,(($status eq 'CAN_ANSWER') || $nocorrect));
    if ($target eq 'tex') {
       $message='\vskip 2 mm '.$message.' ';
    } else {
       $message="<td class=\"$css_class\">$message</td>";
       if ($previousmsg) {
    $previousmsg="<td class=\"LC_answer_previous\">$previousmsg</td>";
       }
    }
       }
       my $tries = $Apache::lonhomework::history{"$prefix.tries"};
       my $maxtries = &Apache::lonnet::EXT("resource.$id.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 ( $maxtries eq '' ) { $maxtries = '2'; } 
       if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; } 
       my $tries_text= &get_tries_text();;
       if ($showbutton) {
    if ($target eq 'tex') {
       if ($env{'request.state'} ne "construct"
    && $Apache::lonhomework::type ne 'exam'
    && $env{'form.suppress_tries'} ne 'yes') {
    $trystr = ' {\vskip 1 mm \small \textit{'.$tries_text.'} '.
       $tries.'/'.$maxtries.'} \vskip 2 mm ';
       } else {
    $trystr = '\vskip 0 mm ';
       }
    } else {
       $trystr = '<td><span class="LC_nobreak">'.&mt($tries_text)." $tries";
       if ($Apache::lonhomework::parsing_a_task) {
       } elsif($env{'request.state'} ne 'construct') {
    $trystr.="/".&Apache::lonhtmlcommon::direct_parm_link($maxtries,$env{'request.symb'},'maxtries',$id,$target);
       } else {
    if (defined($Apache::inputtags::params{'maxtries'})) {
       $trystr.="/".$Apache::inputtags::params{'maxtries'};
    }
       }
       $trystr.="</span></td>";
    }
       }
   
       if ($Apache::lonhomework::history{"$prefix.afterduedate"}) {
    #last submissions was after due date
    $latemessage=&mt(' The last submission was after the Due Date ');;
    if ($target eq 'web') {
       $latemessage='<td class="LC_answer_late">'.$latemessage.'</td>';
    }
       }
       return ($previousmsg,$latemessage,$message,$trystr,$showbutton);
   }
   
 sub gradestatus {  sub gradestatus {
     my ($id,$target) = @_;      my ($id,$target,$no_previous) = @_;
     my $showbutton = 1;      my $showbutton = 1;
     my $bgcolor = '';  
     my $message = '';      my $message = '';
     my $latemessage = '';      my $latemessage = '';
     my $trystr='';      my $trystr='';
Line 985  sub gradestatus { Line 1487  sub gradestatus {
  && $status ne 'INVALID_ACCESS'    && $status ne 'INVALID_ACCESS' 
  && $status ne 'NEEDS_CHECKIN'    && $status ne 'NEEDS_CHECKIN' 
  && $status ne 'NOT_IN_A_SLOT') {     && $status ne 'NOT_IN_A_SLOT') {  
  my $award = $Apache::lonhomework::history{"resource.$id.award"};  
  my $awarded = $Apache::lonhomework::history{"resource.$id.awarded"};   ($previousmsg,$latemessage,$message,$trystr) =
  my $solved = $Apache::lonhomework::history{"resource.$id.solved"};      &get_grade_messages($id,"resource.$id",$target,$status,
  my $previous = $Apache::lonhomework::history{"resource.$id.previous"};   $showbutton);
  my $awardmsg = $Apache::lonhomework::history{"resource.$id.awardmsg"};   if ( $status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {
  &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg");      $showbutton = 0;
  if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {  
     &Apache::lonxml::debug('Getting message');  
     ($showbutton,$bgcolor,$message,$previousmsg) =  
  &decideoutput($award,$awarded,$awardmsg,$solved,$previous,  
       $target);  
     if ($target eq 'tex') {  
  $message='\vskip 2 mm '.$message.' ';  
     } else {  
  $message="<td bgcolor=\"$bgcolor\">$message</td>";  
  if ($previousmsg) {  
     $previousmsg="<td bgcolor=\"#aaaaff\">$previousmsg</td>";  
  }  
     }  
  }  
  my $tries = $Apache::lonhomework::history{"resource.$id.tries"};  
  my $maxtries = &Apache::lonnet::EXT("resource.$id.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 ( $maxtries eq '' ) { $maxtries = '2'; }   
  if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; }   
  my $tries_text=&mt('Tries');  
  if ( $Apache::lonhomework::type eq 'survey' ||  
      $Apache::lonhomework::parsing_a_task) {  
     $tries_text=&mt('Submissions');  
  }   }
  if ( $showbutton ) {   if ( $status eq 'SHOW_ANSWER') {
     if ($target eq 'tex') {      undef($previousmsg);
  if ($env{'request.state'} ne "construct" && $Apache::lonhomework::type ne 'exam' && $env{'form.suppress_tries'} ne 'yes') {  
     $trystr = ' {\vskip 1 mm \small \textit{'.$tries_text.'} '.$tries.'/'.$maxtries.'} \vskip 2 mm ';  
  } else {  
     $trystr = '\vskip 0 mm ';  
  }  
     } else {  
  $trystr = "<td><nobr>".$tries_text." $tries";  
  if ($Apache::lonhomework::parsing_a_task) {  
  } elsif($env{'request.state'} ne 'construct') {  
     $trystr.="/$maxtries";  
  } else {  
     if (defined($Apache::inputtags::params{'maxtries'})) {  
  $trystr.="/".$Apache::inputtags::params{'maxtries'};  
     }  
  }  
  $trystr.="</nobr></td>";  
     }  
  }   }
  if ( $status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {$showbutton = 0;}  
  if ( $showbutton ) {    if ( $showbutton ) { 
     if ($target ne 'tex') {      if ($target ne 'tex') {
  $button = '<input type="submit" name="submit_'.$id.'" value="'.&mt('Submit Answer').'" />';   $button = 
     }              '<input onmouseup="javascript:setSubmittedPart(\''.$id.'\');this.form.action+=\'#'.&escape($id).'\';"
  }                      type="submit" name="submit_'.$id.'"
  if ($Apache::lonhomework::history{"resource.$id.afterduedate"}) {                      value="'.&mt('Submit Answer').'" />';
     #last submissions was after due date  
     $latemessage=&mt(' The last submission was after the Due Date ');;  
     if ($target eq 'web') {  
  $latemessage='<td bgcolor="#ffaaaa">'.$latemessage.'</td>';  
     }      }
  }   }
   
     }      }
     my $output= $previousmsg.$latemessage.$message.$trystr;      my $output= $previousmsg.$latemessage.$message.$trystr;
     if ($output =~ /^\s*$/) {      if ($output =~ /^\s*$/) {
Line 1059  sub gradestatus { Line 1514  sub gradestatus {
  if ($target eq 'tex') {   if ($target eq 'tex') {
     return $button.' \vskip 0 mm '.$output.' ';      return $button.' \vskip 0 mm '.$output.' ';
  } else {   } else {
     return '<table><tr><td>'.$button.'</td>'.$output.'</tr></table>';      $output =
    '<table><tr><td>'.$button.'</td>'.$output;
       if (!$no_previous) {
    $output.='<td>'.&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;
   
       foreach my $i (1..$Apache::lonhomework::history{'version'}) {
    my $prefix = $i.":resource.$id";
           my $is_anon; 
           if (defined($env{'form.grade_symb'})) {
               if (($Apache::lonhomework::history{"$prefix.type"} eq 'anonsurvey') || 
                   ($Apache::lonhomework::history{"$prefix.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 || $lastrndseed) {
                   if ($curr_rndseed ne $lastrndseed) {
                       $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.'">';
    $output.='<td align="center">'.$count.'</td>';
    $output.=$message;
   
    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;
       }
       return if ($output eq '');
       my $headers = 
    '<tr>'.'<th>'.&mt('Submission #').'</th><th>'.&mt('Try').
    '</th><th colspan="'.scalar(@Apache::inputtags::response).'">'.
    &mt('Submitted Answer').'</th>';
       $output ='<table class="LC_prior_tries">'.$headers.$output.'</table>';
       #return $output;
       $output = &Apache::loncommon::js_ready($output); 
       $output.='<br /><form action=""><center><input type="button" name="close" value="'.&mt('Close Window').'" onClick="window.close()" /></center></form>';
   
       my $windowopen=&Apache::lonhtmlcommon::javascript_docopen();
       my $tries_text = &get_tries_text('link');
       my $start_page =
    &Apache::loncommon::start_page($tries_text, undef,
          {'only_body'      => 1,
    'bgcolor'        => '#FFFFFF',
    'js_ready'       => 1,
           'inherit_jsmath' => 1, });
       my $end_page =
    &Apache::loncommon::end_page({'js_ready' => 1,});
       my $prefix = $env{'form.request.prefix'};
       $prefix =~ tr{.}{_};
       my $function_name = "LONCAPA_previous_tries_".$prefix.
    $Apache::lonxml::curdepth.'_'.$env{'form.counter'};
       my $result ="<script type=\"text/javascript\">
   // <![CDATA[
       function $function_name() {newWindow=open('','new_W','width=500,height=500,scrollbars=1,resizable=yes');newWindow.$windowopen;newWindow.document.writeln('$start_page $output $end_page');newWindow.document.close();newWindow.focus()}
   // ]]>
   </script><a href=\"javascript:$function_name();void(0);\">".&mt($tries_text)."</a><br />";
       #use Data::Dumper;
       #&Apache::lonnet::logthis(&Dumper(\%Apache::inputtags::submission_display));
       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;
   }
   
 1;  1;
 __END__  __END__
   
   =pod
   
   =back
   
   =cut
     

Removed from v.1.206  
changed lines
  Added in v.1.291


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.