Diff for /loncom/homework/inputtags.pm between versions 1.218 and 1.249

version 1.218, 2007/03/13 00:21:28 version 1.249, 2008/11/25 13:16: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::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use lib '/home/httpd/lib/perl/';  
 use LONCAPA;  use LONCAPA;
     
   
Line 39  BEGIN { Line 62  BEGIN {
     &Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline'));      &Apache::lonxml::register('Apache::inputtags',('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
 #  %Apache::inputtags::submission_display                                     that is not inside a <part>
 #                                   - <*response> tags store improved display  %Apache::inputtags::answertxt    - <*response> tags store correct
 #                                     of submission strings for display by part                                     answer strings for display by <textline/>
 #                                     end.                                     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 116  sub check_for_duplicate_ids { Line 145  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 308  sub start_textline { Line 336  sub start_textline {
  $oldresponse = $oldresponse->[$#Apache::inputtags::inputlist];   $oldresponse = $oldresponse->[$#Apache::inputtags::inputlist];
     }      }
     $oldresponse = &HTML::Entities::encode($oldresponse,'<>&"');      $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 358  sub start_textline { Line 388  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') {
               my $fieldname = $env{'request.symb'}.
                                    '&part_'. $Apache::inputtags::part.
                                    '&textresponse'.
                                    '&HWVAL_' . $Apache::inputtags::response['-1'];
               $result="\n\\\\\n".'\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 417  sub end_hiddenline { Line 454  sub end_hiddenline {
     return "";      return "";
 }  }
   
 # $part -> partid  =pod
 # $id -> responseid  
 # $uploadefiletypes -> comma seperated list of extensions allowed or * for any  =item file_selector()
 # $which -> 'uploadedonly'  -> only newly uploaded files  
 #           'portfolioonly' -> only allow files from portfolio  $part -> partid
 #           'both' -> allow files from either location  $id -> responseid
 # $extratext -> additional text to go between the link and the input box  $uploadefiletypes -> comma seperated list of extensions allowed or * for any
 # returns a table row <tr>   $which -> 'uploadedonly'  -> 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
   returns a table row <tr> 
   
   =cut
   
 sub file_selector {  sub file_selector {
     my ($part,$id,$uploadedfiletypes,$which,$extratext)=@_;      my ($part,$id,$uploadedfiletypes,$which,$extratext)=@_;
     if (!$uploadedfiletypes) { return ''; }      if (!$uploadedfiletypes) { return ''; }
Line 449  sub file_selector { Line 493  sub file_selector {
  $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').'</a><br />'.
     '<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'.      '<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'.
     '<br />';      '<br />';
Line 518  sub valid_award { Line 562  sub valid_award {
        'UNIT_NOTNEEDED', 'WANTED_NUMERIC',         'UNIT_NOTNEEDED', 'WANTED_NUMERIC',
        'BAD_FORMULA', 'SIG_FAIL', 'INCORRECT',          'BAD_FORMULA', 'SIG_FAIL', 'INCORRECT', 
        'MISORDERED_RANK', 'INVALID_FILETYPE',         'MISORDERED_RANK', 'INVALID_FILETYPE',
        'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE',                                 'EXCESS_FILESIZE', 'DRAFT',
          'SUBMITTED', 'ASSIGNED_SCORE',
        'APPROX_ANS', 'EXACT_ANS','COMMA_FAIL') {         'APPROX_ANS', 'EXACT_ANS','COMMA_FAIL') {
  if ($award eq $possibleaward) { return 1; }   if ($award eq $possibleaward) { return 1; }
     }      }
Line 532  sub valid_award { Line 577  sub valid_award {
   'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT',    'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT',
   'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA',    'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA',
   'COMMA_FAIL', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK',    'COMMA_FAIL', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK',
   'INVALID_FILETYPE', 'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE',    'INVALID_FILETYPE', 'EXCESS_FILESIZE', 'DRAFT', 'SUBMITTED',
   'APPROX_ANS', 'EXACT_ANS');                    'ASSIGNED_SCORE', 'APPROX_ANS', 'EXACT_ANS');
     my $i=0;      my $i=0;
     my %fwd_awards = map { ($_,$i++) } @awards;      my %fwd_awards = map { ($_,$i++) } @awards;
     my $max=scalar(@awards);      my $max=scalar(@awards);
Line 541  sub valid_award { Line 586  sub valid_award {
     $i=0;      $i=0;
     my %rev_awards = map { ($_,$i++) } @awards;      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|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;      my $result;
     if ($#$awardref == -1) { $result = "NO_RESPONSE"; }      if ($#$awardref == -1) { $result = "NO_RESPONSE"; }
     if ($result eq '' ) {      if ($result eq '' ) {
Line 553  sub finalizeawards { Line 619  sub finalizeawards {
  $blankcount++;   $blankcount++;
     }      }
  }   }
  if ($blankcount == ($#$awardref + 1)) { $result = 'NO_RESPONSE'; }   if ($blankcount == ($#$awardref + 1)) {
       return ('NO_RESPONSE');
    }
     }      }
     if (defined($result)) { return ($result); }      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 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 = (!$reverse) ? \%fwd_awards : \%rev_awards ;
   
Line 570  sub finalizeawards { Line 655  sub finalizeawards {
  }   }
  $j++;   $j++;
     }      }
   
     if (defined($which)) {      if (defined($which)) {
  if (ref($nameref)) {   if (ref($nameref)) {
     return ($$awardref[$which],$$msgref[$which],$$nameref[$which]);      return ($$awardref[$which],$$msgref[$which],$$nameref[$which]);
Line 586  sub decideoutput { Line 672  sub decideoutput {
     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)); 
           
     my $computer = ($handgrade)? ''      my $computer = ($handgrade)? ''
                        : " ".&mt("Computer's answer now shown above.");                         : " ".&mt("Computer's answer now shown above.");
Line 607  sub decideoutput { Line 693  sub decideoutput {
     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 ($env{'request.filename'} =~ 
     m|/res/lib/templates/examupload.problem$|) {      m|/res/lib/templates/examupload.problem$|) {
Line 628  sub decideoutput { Line 714  sub decideoutput {
  $message.= $computer;   $message.= $computer;
     }      }
     $added_computer_text=1;      $added_computer_text=1;
     my ($symb) = &Apache::lonnet::whichuser();      if ($awarded > 0) {
     if ((!$env{'course.'.   my ($symb) = &Apache::lonnet::whichuser();
      $env{'request.course.id'}.   if (($symb ne '') 
      '.disable_receipt_display'} eq 'yes')&&      &&
     $symb) {       ($env{'course.'.$env{'request.course.id'}.
  $message.=(($target eq 'web')?'<br />':' ').        '.disable_receipt_display'} ne 'yes') &&
     &mt('Your receipt is').' '.&Apache::lonnet::receipt($Apache::inputtags::part).                      ($Apache::lonhomework::type ne 'practice')) { 
     (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'');      $message.=(($target eq 'web')?'<br />':' ').
    &mt('Your receipt is [_1]',
       (&Apache::lonnet::receipt($Apache::inputtags::part).
        (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'')));
    }
     }      }
  }   }
  $button=0;   $button=0;
Line 646  sub decideoutput { Line 736  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 662  sub decideoutput { Line 752  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 '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 = ($used < $min) ? 'more' : 'fewer';   my $word = ($used < $min) ? 'more' : 'fewer';
  $message = &mt("Submission not graded.  Use $word digits.",$used);   $message = &mt("Submission not graded.  Use $word digits.",$used);
  $bgcolor=$possiblecolors{'not_charged_try'};   $css_class=$possible_class{'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 '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 'DRAFT') {      } elsif ($award eq 'DRAFT') {
  $message = &mt("A draft copy has been saved.");   $message = &mt("A draft copy has been saved.");
  $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 {
Line 788  sub decideoutput { Line 889  sub decideoutput {
  }   }
     }      }
   
     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 799  sub decideoutput { Line 901  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 852  sub setgradedata { Line 963  sub setgradedata {
  $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.solved"} !~
       /^correct/ || $Apache::lonhomework::scantronmode ||        /^correct/ 
       lc($Apache::lonhomework::problemstatus) eq 'no') {        || $Apache::lonhomework::scantronmode 
         || &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 875  sub setgradedata { Line 987  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 891  sub setgradedata { Line 1008  sub setgradedata {
  } 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 911  sub setgradedata { Line 1028  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 930  sub setgradedata { Line 1053  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 957  sub setgradedata { Line 1080  sub setgradedata {
     }      }
 }  }
   
   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;
Line 972  sub grade { Line 1131  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 1013  sub get_grade_messages { Line 1170  sub get_grade_messages {
     &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg");      &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg");
     if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {      if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {
  &Apache::lonxml::debug('Getting message');   &Apache::lonxml::debug('Getting message');
  ($showbutton,my $bgcolor,$message,$previousmsg) =   ($showbutton,my $css_class,$message,$previousmsg) =
     &decideoutput($award,$awarded,$awardmsg,$solved,$previous,      &decideoutput($award,$awarded,$awardmsg,$solved,$previous,
   $target);    $target);
  if ($target eq 'tex') {   if ($target eq 'tex') {
     $message='\vskip 2 mm '.$message.' ';      $message='\vskip 2 mm '.$message.' ';
  } else {   } else {
     $message="<td bgcolor=\"$bgcolor\">$message</td>";      $message="<td class=\"$css_class\">$message</td>";
     if ($previousmsg) {      if ($previousmsg) {
  $previousmsg="<td bgcolor=\"#aaaaff\">$previousmsg</td>";   $previousmsg="<td class=\"LC_answer_previous\">$previousmsg</td>";
     }      }
  }   }
     }      }
Line 1062  sub get_grade_messages { Line 1219  sub get_grade_messages {
     $trystr.="</nobr></td>";      $trystr.="</nobr></td>";
  }   }
     }      }
   
     if ($Apache::lonhomework::history{"$prefix.afterduedate"}) {      if ($Apache::lonhomework::history{"$prefix.afterduedate"}) {
  #last submissions was after due date   #last submissions was after due date
  $latemessage=&mt(' The last submission was after the Due Date ');;   $latemessage=&mt(' The last submission was after the Due Date ');;
  if ($target eq 'web') {   if ($target eq 'web') {
     $latemessage='<td bgcolor="#ffaaaa">'.$latemessage.'</td>';      $latemessage='<td class="LC_answer_late">'.$latemessage.'</td>';
  }   }
     }      }
     return ($previousmsg,$latemessage,$message,$trystr,$showbutton);      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 $message = '';      my $message = '';
     my $latemessage = '';      my $latemessage = '';
Line 1100  sub gradestatus { Line 1258  sub gradestatus {
  }   }
  if ( $showbutton ) {    if ( $showbutton ) { 
     if ($target ne 'tex') {      if ($target ne 'tex') {
  $button = '<input onsubmit="javascript:setSubmittedPart(\''.$id.'\')" type="submit" name="submit_'.$id.'" value="'.&mt('Submit Answer').'" />';   $button = 
       '<input 
                             onmouseup="javascript:setSubmittedPart(\''.$id.'\')"
                              onsubmit="javascript:setSubmittedPart(\''.$id.'\')"
                           type="submit" name="submit_'.$id.'"
                            value="'.&mt('Submit Answer').'" />';
     }      }
  }   }
   
Line 1112  sub gradestatus { Line 1275  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.'<td>'.&previous_tries($id,$target).'</td></tr></table>';      $output =
    '<table><tr><td>'.$button.'</td>'.$output;
       if (!$no_previous) {
    $output.='<td>'.&previous_tries($id,$target).'</td>';
       }
       $output.= '</tr></table>';
       return $output;
  }   }
     }      }
 }  }
Line 1121  sub previous_tries { Line 1290  sub previous_tries {
     my ($id,$target) = @_;      my ($id,$target) = @_;
     my $output;      my $output;
     my $status = $Apache::inputtags::status['-1'];      my $status = $Apache::inputtags::status['-1'];
       
       my $count;
       my %count_lookup;
   
     foreach my $i (1..$Apache::lonhomework::history{'version'}) {      foreach my $i (1..$Apache::lonhomework::history{'version'}) {
  my $prefix = $i.":resource.$id";   my $prefix = $i.":resource.$id";
   
  next if (!exists($Apache::lonhomework::history{"$prefix.award"}));   next if (!exists($Apache::lonhomework::history{"$prefix.award"}));
    $count++;
    $count_lookup{$i} = $count;
   
  my ($previousmsg,$latemessage,$message,$trystr);   my ($previousmsg,$latemessage,$message,$trystr);
   
  ($previousmsg,$latemessage,$message,$trystr) =   ($previousmsg,$latemessage,$message,$trystr) =
     &get_grade_messages($id,"$prefix",$target,$status);      &get_grade_messages($id,"$prefix",$target,$status);
  if (!exists($Apache::lonhomework::history{"$prefix.tries"})) {  
     undef($trystr);  
  }  
   
  if ($previousmsg eq '') { $previousmsg='<td></td>'; }  
  if ($trystr eq '') { $trystr = '<td></td>'; }  
   
  $output.='<tr>';   if ($previousmsg ne '') {
  $output.=$message.$previousmsg.$trystr;      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');
    $message =~ s{(<td.*?>)(.*?)(</td>)}
                                {$1 <strong>$txt_correct</strong>. $3}s;
       }
               my $trystr = "(".&mt('Try [_1]',$Apache::lonhomework::history{"$prefix.tries"}).")";
       $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) {   foreach my $resid (@Apache::inputtags::response) {
     my $prefix = $prefix.".$resid";      my $prefix = $prefix.".$resid";
Line 1154  sub previous_tries { Line 1346  sub previous_tries {
  $output.='<td></td>';   $output.='<td></td>';
     }      }
  }   }
  $output.='</tr>';   $output.=&Apache::loncommon::end_data_table_row()."\n";
     }      }
     return if ($output eq '');      return if ($output eq '');
       my $headers = 
     $output ='<table class="LC_prior_tries">'.$output.'</table>';   '<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;      #return $output;
     $output=~s/\\/\\\\/g;      $output = &Apache::loncommon::js_ready($output); 
     $output=~s/\'/\\\'/g;      $output.='<br /><form action=""><center><input type="button" name="close" value="'.&mt('Close Window').'" onClick="window.close()" /></center></form>';
     $output=~s/\s+/ /g;  
     my $windowopen=&Apache::lonhtmlcommon::javascript_docopen();      my $windowopen=&Apache::lonhtmlcommon::javascript_docopen();
     my $start_page =      my $start_page =
  &Apache::loncommon::start_page('Previous Tries', undef,   &Apache::loncommon::start_page('Previous Tries', undef,
        {'only_body' => 1,         {'only_body'      => 1,
  'bgcolor'   => '#FFFFFF',   'bgcolor'        => '#FFFFFF',
  'js_ready'  => 1,});   'js_ready'       => 1,
           'inherit_jsmath' => 1, });
     my $end_page =      my $end_page =
  &Apache::loncommon::end_page({'js_ready' => 1,});   &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\">      my $result ="<script type=\"text/javascript\">
 // <![CDATA[  // <![CDATA[
     function LONCAPA_previous_tries_$Apache::lonxml::curdepth() {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()}      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:LONCAPA_previous_tries_$Apache::lonxml::curdepth();void(0);\">".&mt("Previous Tries")."</a><br />";  </script><a href=\"javascript:$function_name();void(0);\">".&mt("Previous Tries")."</a><br />";
     #use Data::Dumper;      #use Data::Dumper;
     #&Apache::lonnet::logthis(&Dumper(\%Apache::inputtags::submission_display));      #&Apache::lonnet::logthis(&Dumper(\%Apache::inputtags::submission_display));
     return $result;      return $result;
Line 1184  sub previous_tries { Line 1383  sub previous_tries {
   
 1;  1;
 __END__  __END__
   
   =pod
   
   =back
   
   =cut
     

Removed from v.1.218  
changed lines
  Added in v.1.249


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