Diff for /loncom/homework/structuretags.pm between versions 1.512.2.24.2.14 and 1.549

version 1.512.2.24.2.14, 2024/03/01 17:05:45 version 1.549, 2016/04/04 17:34:01
Line 62  use Apache::lonxml; Line 62  use Apache::lonxml;
 use Apache::londefdef;  use Apache::londefdef;
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonnavmaps;  
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use HTML::Entities();  
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
Line 228  sub end_tex { Line 226  sub end_tex {
 sub homework_js {  sub homework_js {
     my ($postsubmit,$timeout);      my ($postsubmit,$timeout);
     if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {      if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {
         my $crstype;          my $crstype = &Apache::loncommon::course_type();
         if (&Apache::loncommon::course_type() eq 'Community') {          if ($crstype eq 'Community') {
             $crstype = 'community';              $crstype = 'community';
           } elsif ($crstype eq 'Placement') {
               $crstype = 'placement'; 
         } else {          } else {
             if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {              if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {
                 $crstype = 'official';                  $crstype = 'official';
Line 272  sub homework_js { Line 272  sub homework_js {
         $jstimeout = 1000 * $timeout;          $jstimeout = 1000 * $timeout;
     }      }
     return &Apache::loncommon::resize_textarea_js().      return &Apache::loncommon::resize_textarea_js().
            &Apache::loncommon::colorfuleditor_js().                  &Apache::loncommon::colorfuleditor_js().
            &Apache::lonxml::setmode_javascript().             &setmode_javascript().
  <<"JS";   <<"JS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 319  var keypresshandled = 0; Line 319  var keypresshandled = 0;
 var postsubmit = '$postsubmit';  var postsubmit = '$postsubmit';
   
 \$(document).ready(function(){  \$(document).ready(function(){
   if (postsubmit != 'off') {    if (postsubmit != 'off') {    
     \$(document).keypress(function(event){      \$(document).keypress(function(event){
         var keycode = (event.keyCode ? event.keyCode : event.which);          var keycode = (event.keyCode ? event.keyCode : event.which);
         if ((keycode == '13') && (keypresshandled == 0)) {          if ((keycode == '13') && (keypresshandled == 0)) {
Line 344  var postsubmit = '$postsubmit'; Line 344  var postsubmit = '$postsubmit';
                 submithandled = 1;                  submithandled = 1;
                 \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",                  \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",
                                            "color": "black","padding": "2px"}) ;                                             "color": "black","padding": "2px"}) ;
                 if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {                  if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
                     if (buttonId != "all_submit") {                      if (buttonId != "all_submit") {
                         \$( ".LC_status_"+buttonId ).hide();                          \$( ".LC_status_"+buttonId ).hide();
                     }                          if (( "#"+buttonId+"_pressed" ).length) {
                     if (( "#"+buttonId+"_pressed" ).length) {                              \$( "#"+buttonId+"_pressed" ).val( "1" );
                         \$( "#"+buttonId+"_pressed" ).val( "1" );                          }
                     }                      }
                 } else {                  } else {
                     \$( ".LC_status_"+buttonId ).hide();                      \$( ".LC_status_"+buttonId ).hide();
Line 362  var postsubmit = '$postsubmit'; Line 362  var postsubmit = '$postsubmit';
                 if (timeout > 0) {                  if (timeout > 0) {
                     setTimeout(function(){                      setTimeout(function(){
                                        \$( "#msg_"+buttonId ).css({"display": "none"});                                         \$( "#msg_"+buttonId ).css({"display": "none"});
                                        if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {                                         if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
                                            if (( "#"+buttonId+"_pressed" ).length) {                                             if (buttonId != "all_submit") {
                                                \$( "#"+buttonId+"_pressed" ).val( "" );                                                 if (( "#"+buttonId+"_pressed" ).length) {
                                                      \$( "#"+buttonId+"_pressed" ).val( "" );
                                                  }
                                            }                                             }
                                        }                                         }
                                        \$( ".LC_hwk_submit" ).prop( "disabled", false);                                         \$( ".LC_hwk_submit" ).prop( "disabled", false);
Line 385  var postsubmit = '$postsubmit'; Line 387  var postsubmit = '$postsubmit';
 JS  JS
 }  }
   
   sub setmode_javascript {
       return <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   function setmode(form,probmode) {
       form.problemmode.value = probmode;
       form.submit();
   }
   // ]]>
   </script>
   ENDSCRIPT
   }
   
 sub page_start {  sub page_start {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
  $extra_head)=@_;   $extra_head)=@_;
Line 404  sub page_start { Line 419  sub page_start {
     $extra_head .= &homework_js().      $extra_head .= &homework_js().
                    &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");                     &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
     if (&Apache::lonhtmlcommon::htmlareabrowser()) {      if (&Apache::lonhtmlcommon::htmlareabrowser()) {
         my %textarea_args;          my %textarea_args = (
         if (($env{'request.state'} ne 'construct') ||  
             (&Apache::loncommon::nocodemirror())) {  
             %textarea_args = (  
                                 dragmath => 'math',                                  dragmath => 'math',
                               );                                );
         }  
         $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);          $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);
     }      }
     my $is_task = ($env{'request.uri'} =~ /\.task$/);      my $is_task = ($env{'request.uri'} =~ /\.task$/);
Line 481  sub page_start { Line 492  sub page_start {
             }              }
         }          }
         if ($needs_upload) {          if ($needs_upload) {
             $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js().              $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js()
                            '<script type="text/javascript" '.                              .'<script type="text/javascript" 
                            'src="/res/adm/includes/file_upload.js"></script>';                                  src="/res/adm/includes/file_upload.js"></script>';
         }          }
     }      }
   
Line 587  sub page_start { Line 598  sub page_start {
         my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();          my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
         my ($path,$multiresp) =           my ($path,$multiresp) = 
             &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);              &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);
         if ($env{'request.user_in_effect'}) {          if (($is_task) || ($needs_upload)) {
             $form_tag_start .= ' onsubmit="preventDefault();"';  
         } elsif (($is_task) || ($needs_upload)) {  
             $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';              $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';
         }          }
  $form_tag_start.='>'."\n";   $form_tag_start.='>'."\n";
Line 634  sub get_resource_name { Line 643  sub get_resource_name {
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target,$probpartlist)=@_;      my ($safeeval,$target,$probpartlist)=@_;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);      my ($questiontype,$set_safespace,$rndseed);
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
         $questiontype = $env{'form.grade_questiontype'};          $questiontype = $env{'form.grade_questiontype'};
     }      }
     unless (defined($questiontype)) {      unless (defined($questiontype)) {
         $questiontype = $Apache::lonhomework::type;          $questiontype = $Apache::lonhomework::type;
     }      }
     if ($Apache::lonhomework::type eq 'randomizetry') {      if ($env{'request.state'} eq "construct" 
         my $partfortries = $Apache::inputtags::part;   || $symb eq '' 
 #   || $Apache::lonhomework::type eq 'practice'
 # Where question type is "randomizetry" for a problem containing   || $Apache::lonhomework::history{'resource.CODE'}) {
 # a single part (and unless type is explicitly set to not be  
 # "randomizetry" for that part), the number of tries used to  
 # determine randomization will be for that part, and randomization  
 # from calls to &random() in a perl script block before the part tag,  
 # will change based on the number of tries, and value of the  
 # "randomizeontries" parameter in effect for the single part.  
 #  
         if (ref($probpartlist) eq 'ARRAY') {  
             if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) {  
                 if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') {  
                     $partfortries = $probpartlist->[0];  
                 } else {  
                     $partfortries = '';  
                 }  
             }  
         }  
         if ($partfortries ne '') {  
             $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"};  
             $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");  
         }  
     }  
     if (($env{'request.state'} eq "construct")  
         || ($symb eq '')  
         || ($Apache::lonhomework::type eq 'practice')  
         || ($Apache::lonhomework::history{'resource.CODE'})  
         || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) {  
  &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
  ['rndseed']);   ['rndseed']);
  $rndseed=$env{'form.rndseed'};   $rndseed=$env{'form.rndseed'};
Line 679  sub setup_rndseed { Line 662  sub setup_rndseed {
     if (!$rndseed) {      if (!$rndseed) {
  $rndseed=time;   $rndseed=time;
     }      }
             unless ($env{'form.code_for_randomlist'}) {      $env{'form.rndseed'}=$rndseed;
                 $env{'form.rndseed'}=$rndseed;  
             }  
  }   }
         if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&          if (($env{'request.state'} eq "construct") && 
             ($Apache::lonhomework::type eq 'randomizetry')) {              ($Apache::lonhomework::type eq 'randomizetry')) {
             if ($numtries) {              my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {              if ($tries) {
                     my $inc = int($numtries/$reqtries);                  $rndseed += $tries;
                     $rndseed += $inc;  
                 } else {  
                     $rndseed += $numtries;  
                 }  
             }              }
             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;              $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
         }          }
  if ( ($env{'form.resetdata'} eq 'new_problem_variation'   if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
       && $env{'form.submitted'} eq 'yes')  ||        && $env{'form.submitted'} eq 'yes')  ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     srand(time);      srand(time);
Line 713  sub setup_rndseed { Line 690  sub setup_rndseed {
        $rndseed=join(':',&Apache::lonnet::digest($rndseed));         $rndseed=join(':',&Apache::lonnet::digest($rndseed));
             }              }
         }          }
         if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) {          if ($Apache::lonhomework::history{'resource.CODE'}) {
             $env{'form.CODE'} = $env{'form.code_for_randomlist'};  
             $rndseed=&Apache::lonnet::rndseed();  
             undef($env{'form.CODE'});  
         } elsif ($Apache::lonhomework::history{'resource.CODE'}) {  
    $rndseed=&Apache::lonnet::rndseed();     $rndseed=&Apache::lonnet::rndseed();
  }   }
         $set_safespace = 1;          $set_safespace = 1;
Line 729  sub setup_rndseed { Line 702  sub setup_rndseed {
         }          }
         unless (($target eq 'analyze') && (defined($rndseed))) {          unless (($target eq 'analyze') && (defined($rndseed))) {
             $rndseed=&Apache::lonnet::rndseed();              $rndseed=&Apache::lonnet::rndseed();
             my $curr_try = $numtries;              my $partfortries = $Apache::inputtags::part;
               if (ref($probpartlist) eq 'ARRAY') {
                   if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) {
                       $partfortries = $probpartlist->[0];
                   }
               }
               my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"};
             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {              if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                 $curr_try ++;                  $curr_try ++;
             }              }
Line 737  sub setup_rndseed { Line 716  sub setup_rndseed {
                 $rndseed = $1;                  $rndseed = $1;
             }              }
             if ($curr_try) {              if ($curr_try) {
                   my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {                  if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                     my $inc = int(($curr_try-1)/$reqtries);                      my $inc = int(($curr_try-1)/$reqtries);
                     $rndseed += $inc;                      $rndseed += $inc;
Line 778  sub problem_edit_action_button { Line 758  sub problem_edit_action_button {
   
 sub problem_edit_buttons {  sub problem_edit_buttons {
    my ($mode)=@_;     my ($mode)=@_;
    my %editors = &Apache::loncommon::permitted_editors();  
 # Buttons that save  # Buttons that save
    my $result = '<div style="float:right">';     my $result = '<div style="float:right">';
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        if ($editors{'xml'}) {         $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');
            $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');  
        }  
        $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');         $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');
    } else {     } else {
        if ($editors{'edit'}) {         $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');
            $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');  
        }  
        $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');         $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');
    }     }
    $result.="\n</div>\n";     $result.="\n</div>\n";
Line 797  sub problem_edit_buttons { Line 772  sub problem_edit_buttons {
    $result .= '<div>'.     $result .= '<div>'.
               &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);                &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        if ($editors{'edit'}) {         $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
            $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);  
        }  
        if ($editors{'daxe'}) {  
            $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);  
        }  
        $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);
        if (&Apache::loncommon::nocodemirror()) {         $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
            $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);  
        }  
    } else {     } else {
        if ($editors{'xml'}) {         $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);
            $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);  
        }  
        if ($editors{'daxe'}) {  
            $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);  
        }  
        $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);
    }     }
    $result.="\n</div>";     $result.="\n</div>";
Line 857  sub problem_edit_header { Line 820  sub problem_edit_header {
     return $return;      return $return;
 }  }
   
   
 sub problem_edit_footer {  sub problem_edit_footer {
     my $resource = $env{'request.ambiguous'};      my $resource = $env{'request.ambiguous'};
     return '</td></tr></table><br />      return '</td></tr></table><br />
Line 886  sub option { Line 848  sub option {
   
 sub problem_web_to_edit_header {  sub problem_web_to_edit_header {
     my ($rndseed)=@_;      my ($rndseed)=@_;
     my %editors = &Apache::loncommon::permitted_editors();  
     my $result .= '<div class="LC_edit_problem_header">';      my $result .= '<div class="LC_edit_problem_header">';
   
     if (!$Apache::lonhomework::parsing_a_task) {      if (!$Apache::lonhomework::parsing_a_task) {
Line 934  sub problem_web_to_edit_header { Line 895  sub problem_web_to_edit_header {
 ".&mt("Problem Type:")."  ".&mt("Problem Type:")."
 <select name='problemtype'>  <select name='problemtype'>
   <option value=''></option>    <option value=''></option>
   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>    ".&option('exam'   ,'problemtype').&mt("Bubblesheet Exam Problem")."</option>
   ".&option('problem','problemtype').&mt("Homework Problem")."</option>    ".&option('problem','problemtype').&mt("Homework Problem")."</option>
   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>    ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
   ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>    ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>
Line 986  $show_all Line 947  $show_all
      </div>       </div>
      <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />       <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />
      <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />       <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />
      <button type="submit" name="resetdata" accesskey="r" value="reset_submissions">       <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
      '.&mt('Reset Submissions').'</button>  
    </div>     </div>
    <hr />     <hr />
    <div class="LC_edit_problem_header_randomize_row">     <div class="LC_edit_problem_header_randomize_row">
Line 1016  $show_all Line 976  $show_all
    <hr />     <hr />
    <div>';     <div>';
     $result.='<input type="hidden" name="problemmode" value="view" />';      $result.='<input type="hidden" name="problemmode" value="view" />';
     if ($editors{'edit'}) {      $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
         $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.                 'onclick="javascript:setmode(this.form,'."'edit'".')" />';
                    'onclick="javascript:setmode(this.form,'."'edit'".')" />';      $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
     }                 'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
     if ($editors{'xml'}) {      if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
         $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.  
                    'onclick="javascript:setmode(this.form,'."'editxml'".')" />';  
     }  
     if (($editors{'daxe'}) &&  
         ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9)) {  
         my $uri = $env{'request.uri'};          my $uri = $env{'request.uri'};
         my $daxeurl = '/daxepage'.$uri;          my $daxeurl = '/daxepage'.$uri;
         $result .= '<input type="button" accesskey="w" value="'.&mt('Edit with Daxe').'" '.          $result .= '<input type="button" value="'.&mt('Edit with Daxe').'" '.
                    'onclick="javascript:setmode(this.form,'."'daxe'".')" />';                    'onclick="window.open(\''.$daxeurl.'\',\'_blank\');" />';
     }      }
     $result.='      $result.='
    </div>     </div>
Line 1057  sub initialize_storage { Line 1012  sub initialize_storage {
  || $Apache::lonhomework::type eq 'practice') {   || $Apache::lonhomework::type eq 'practice') {
   
  my $namespace = $symb || $env{'request.uri'};   my $namespace = $symb || $env{'request.uri'};
         if ($env{'form.resetdata'} eq 'reset_submissions' ||   if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
             ($env{'form.resetdata'} eq 'new_problem_variation'      ($env{'form.resetdata'} eq &mt('New Problem Variation')
      && $env{'form.submitted'} eq 'yes') ||       && $env{'form.submitted'} eq 'yes') ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     &Apache::lonnet::tmpreset($namespace,'',$domain,$name);      &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
Line 1066  sub initialize_storage { Line 1021  sub initialize_storage {
  }   }
  %Apache::lonhomework::history=   %Apache::lonhomework::history=
     &Apache::lonnet::tmprestore($namespace,'',$domain,$name);      &Apache::lonnet::tmprestore($namespace,'',$domain,$name);
  my ($temp)=keys(%Apache::lonhomework::history);   my ($temp)=keys(%Apache::lonhomework::history) ;
  &Apache::lonxml::debug("Return message of $temp");   &Apache::lonxml::debug("Return message of $temp");
     } else {      } else {
  %Apache::lonhomework::history=   %Apache::lonhomework::history=
Line 1089  sub initialize_storage { Line 1044  sub initialize_storage {
         &check_correctness_changes() is called in two circumstances          &check_correctness_changes() is called in two circumstances
         in which the results hash is to be stored permanently, for          in which the results hash is to be stored permanently, for
         grading triggered by a student's submission, where feedback on          grading triggered by a student's submission, where feedback on
         correctness is to be provided to the student.          correctness is to be provided to the student. 
   
         1. Immediately prior to storing the results hash          1. Immediately prior to storing the results hash
   
         To handle the case where a student's submission (and award) were          To handle the case where a student's submission (and award) were 
         stored after history was retrieved in &initialize_storage(), e.g.,          stored after history was retrieved in &initialize_storage(), e.g.,
         if a student submitted answers in quick succession (e.g., from          if a student submitted answers in quick succession (e.g., from 
         multiple tabs).  &Apache::inputtags::hidealldata() is called for          multiple tabs).  &Apache::inputtags::hidealldata() is called for
         any parts with out-of-order storage (i.e., correct then incorrect,          any parts with out-of-order storage (i.e., correct then incorrect,
         where awarded >= 1 when correct).          where awarded >= 1 when correct).
Line 1105  sub initialize_storage { Line 1060  sub initialize_storage {
         To handle the case where lond on the student's homeserver returns          To handle the case where lond on the student's homeserver returns
         delay:N -- where N is the number of transactions between the last          delay:N -- where N is the number of transactions between the last
         retrieved in &initialize_storage() and the last stored immediately          retrieved in &initialize_storage() and the last stored immediately
         before permanent storage of the current transaction via          before permanent storage of the current transaction via 
         lond::store_handler().  &Apache::grades::makehidden() is called          lond::store_handler().  &Apache::grades::makehidden() is called  
         for any parts with out-of-order storage (i.e., correct then incorrect,          for any parts with out-of-order storage (i.e., correct then incorrect,
         where awarded >= 1 when correct).          where awarded >= 1 when correct).
   
  Will call &store_aggregates() to increment totals for attempts,   Will call &store_aggregates() to increment totals for attempts, 
  students, and corrects, if running user has student role.          students, and corrects, if running user has student role.
   
 =cut  =cut
   
Line 1124  sub finalize_storage { Line 1079  sub finalize_storage {
  delete(@Apache::lonhomework::results{@remove});   delete(@Apache::lonhomework::results{@remove});
  my ($symb,$courseid,$domain,$name) =    my ($symb,$courseid,$domain,$name) = 
     &Apache::lonnet::whichuser($given_symb);      &Apache::lonnet::whichuser($given_symb);
         my ($passback,$pbscope,$pbmap,$pbsymb,$pbtype,$crsdef,$ltinum,  
             $ltiref,$total,$possible,$dopassback);  
  if ($env{'request.state'} eq 'construct'    if ($env{'request.state'} eq 'construct' 
     || $symb eq ''      || $symb eq ''
     || $Apache::lonhomework::type eq 'practice') {      || $Apache::lonhomework::type eq 'practice') {
Line 1135  sub finalize_storage { Line 1088  sub finalize_storage {
       $namespace,'',$domain,$name);        $namespace,'',$domain,$name);
     &Apache::lonxml::debug('Construct Store return message:'.$result);      &Apache::lonxml::debug('Construct Store return message:'.$result);
  } else {   } else {
             my ($laststore,$checkedparts,@parts,%postcorrect,%record);              my ($laststore,$checkedparts,@parts,%postcorrect);
             if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&              if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
                 (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&                  (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&
                 (!defined($env{'form.grade_courseid'}))) {                  (!defined($env{'form.grade_courseid'}))) {
                 if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {  
                     my ($map)=&Apache::lonnet::decode_symb($symb);  
                     $map = &Apache::lonnet::clutter($map);  
                     if ($env{'request.lti.login'}) {  
                         ($passback,$pbscope,$pbmap,$pbsymb,$ltinum,$ltiref) =  
                             &needs_lti_passback($courseid,$symb,$map);  
                     } elsif ($env{'request.deeplink.login'}) {  
                         ($passback,$pbscope,$pbmap,$pbsymb,$crsdef,$ltinum,$ltiref) =  
                             &needs_linkprot_passback($courseid,$symb,$map);  
                     }  
                 }  
                 if ($Apache::lonhomework::history{'version'}) {                  if ($Apache::lonhomework::history{'version'}) {
                     $laststore = $Apache::lonhomework::history{'version'}.'='.                      $laststore = $Apache::lonhomework::history{'version'}.'='.
                                  $Apache::lonhomework::history{'timestamp'};                                   $Apache::lonhomework::history{'timestamp'};
                 } else {                  } else {
                     $laststore = '0=0';                      $laststore = '0=0';
                 }                  }
                 %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);                  my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                 if ($record{'version'}) {                  if ($record{'version'}) {
                     my ($newversion,$oldversion,$oldtimestamp);                      my ($newversion,$oldversion,$oldtimestamp);
                     if ($Apache::lonhomework::history{'version'}) {                      if ($Apache::lonhomework::history{'version'}) {
Line 1232  sub finalize_storage { Line 1174  sub finalize_storage {
                     }                      }
                 }                  }
             }              }
             if ($passback) {  
                 foreach my $key (keys(%Apache::lonhomework::results)) {  
                     if ($key =~ /^resource\.([^\.]+)\.solved$/) {  
                         my $part = $1;  
                         if ((($Apache::lonhomework::results{$key} =~ /^correct_/) ||  
                             ($Apache::lonhomework::results{$key} eq 'incorrect_attempted')) &&  
                             ($Apache::lonhomework::results{"resource.$part.tries"})) {  
                             $dopassback = 1;  
                             last;  
                         }  
                     }  
                 }  
             }  
             if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) {  
                 $total = 0;  
                 $possible = 0;  
                 my $navmap = Apache::lonnavmaps::navmap->new();  
                 if (ref($navmap)) {  
                     my $res = $navmap->getBySymb($symb);  
                     if (ref($res)) {  
                         my $partlist = $res->parts();  
                         if (ref($partlist) eq 'ARRAY') {  
                             foreach my $part (@{$partlist}) {  
                                 unless (exists($Apache::lonhomework::results{"resource.$part.solved"})) {  
                                     next if ($Apache::lonhomework::record{"resource.$part.solved"} =~/^excused/);  
                                     my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);  
                                     $possible += $weight;  
                                     if (($record{'version'}) && (exists($record{"resource.$part.awarded"}))) {  
                                         my $awarded = $record{"resource.$part.awarded"};  
                                         if ($awarded) {  
                                             $total += $weight * $awarded;  
                                         }  
                                     }  
                                 }  
                             }  
                         }  
                     }  
                 }  
                 foreach my $key (keys(%Apache::lonhomework::results)) {  
                     if ($key =~ /^resource\.([^\.]+)\.awarded$/) {  
                         my $part = $1;  
                         my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);  
                         $possible += $weight;  
                         my $awarded = $Apache::lonhomework::results{$key};  
                         if ($awarded) {  
                             $total += $weight * $awarded;  
                         }  
                     }  
                 }  
             }  
     &Apache::lonxml::debug('Store return message:'.$result);      &Apache::lonxml::debug('Store return message:'.$result);
             &store_aggregates($symb,$courseid);              &store_aggregates($symb,$courseid);
             if ($dopassback) {  
                 my $scoreformat = 'decimal';  
                 if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {  
                     if (ref($ltiref) eq 'HASH') {  
                         if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) {  
                             $scoreformat = $1;  
                         }  
                     }  
                 }  
                 my ($pbid,$pburl,$pbtype);  
                 if ($env{'request.lti.login'}) {  
                     $pbid = $env{'request.lti.passbackid'};  
                     $pburl = $env{'request.lti.passbackurl'};  
                     $pbtype = 'lti';  
                 } elsif ($env{'request.deeplink.login'}) {  
                     $pbid = $env{'request.linkprotpbid'};  
                     $pburl = $env{'request.linkprotpburl'};  
                     $pbtype = 'linkprot';  
                 }  
                 my $ltigrade = {  
                                  'ltinum'   => $ltinum,  
                                  'lti'      => $ltiref,  
                                  'crsdef'   => $crsdef,  
                                  'cid'      => $courseid,  
                                  'uname'    => $env{'user.name'},  
                                  'udom'     => $env{'user.domain'},  
                                  'pbid'     => $pbid,  
                                  'pburl'    => $pburl,  
                                  'pbtype'   => $pbtype,  
                                  'scope'    => $pbscope,  
                                  'pbmap'    => $pbmap,  
                                  'pbsymb'   => $pbsymb,  
                                  'format'   => $scoreformat,  
                                };  
                 if ($pbscope eq 'resource') {  
                     $ltigrade->{'total'} = $total;  
                     $ltigrade->{'possible'} = $possible;  
                 }  
                 push(@Apache::lonhomework::ltipassback,$ltigrade);  
             }  
  }   }
     } else {      } else {
  &Apache::lonxml::debug('Nothing to store');   &Apache::lonxml::debug('Nothing to store');
Line 1331  sub finalize_storage { Line 1183  sub finalize_storage {
     return $result;      return $result;
 }  }
   
 sub needs_lti_passback {  
     my ($courseid,$symb,$map) = @_;  
     if (($env{'request.lti.passbackid'}) && ($env{'request.lti.passbackurl'})) {  
         if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {  
             my ($cdom,$cnum) = ($1,$2);  
             my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');  
             if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {  
                 if ($lti{$env{'request.lti.login'}}{'passback'}) {  
                     my $itemnum = $env{'request.lti.login'};  
                     my ($ltiscope,$ltiuri,$ltisymb) =  
                         &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},  
                                                                $cdom,$cnum,1);  
                     my ($passback,$ltimap);  
                     if ($ltiscope eq 'resource') {  
                         if ($ltisymb eq $symb) {  
                             $passback = 1;  
                         }  
                     } elsif ($ltiscope eq 'map') {  
                         if ($ltiuri eq $map) {  
                             $passback = 1;  
                             $ltimap = $map;  
                         }  
                     } elsif ($ltiscope eq 'course') {  
                         if (($env{'request.lti.uri'} eq "/$cdom/$cnum") || ($env{'request.lti.uri'} eq '')) {  
                             $passback = 1;  
                         }  
                     }  
                     return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum});  
                 }  
             }  
         }  
     }  
     return;  
 }  
   
 sub needs_linkprot_passback {  
     my ($courseid,$symb,$map) = @_;  
     if (($env{'request.linkprotpbid'}) && ($env{'request.linkprotpburl'})) {  
         if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {  
             my ($cdom,$cnum) = ($1,$2);  
             my ($deeplink_symb,$deeplink_map,$deeplink,$passback);  
             $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);  
             if ($deeplink_symb) {  
                 if ($deeplink_symb =~ /\.(page|sequence)$/) {  
                     $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[2]);  
                     my $navmap = Apache::lonnavmaps::navmap->new();  
                     if (ref($navmap)) {  
                         $deeplink = $navmap->get_mapparam(undef,$deeplink_map,'0.deeplink');  
                     }  
                 } else {  
                     $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$deeplink_symb);  
                     $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[0]);  
                 }  
                 if (($deeplink ne '') && ($env{'request.linkprot'} ne '')) {  
                     my ($itemid,$tinyurl) = split(/:/,$env{'request.linkprot'});  
                     if ($itemid =~ /^(\d+)(c|d)$/) {  
                         my ($itemnum,$itemtype) = ($1,$2);  
                         my ($crsdef,$lti_in_use);  
                         if ($itemtype eq 'c') {  
                             $crsdef = 1;  
                             my %crslti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');  
                             $lti_in_use = $crslti{$itemnum};  
                         } else {  
                             my %domlti = &Apache::lonnet::get_domain_lti($cdom,'linkprot');  
                             $lti_in_use = $domlti{$itemnum};  
                         }  
                         my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);  
                         my ($passback,$pbscope);  
                         if ($scope eq 'res') {  
                             if ($deeplink_symb eq $symb) {  
                                 $passback = 1;  
                                 $pbscope = 'resource';  
                             }  
                         } elsif ($scope eq 'map') {  
                             if (&Apache::lonnet::clutter($deeplink_map) eq $map) {  
                                 $passback = 1;  
                                 $pbscope = 'nonrec';  
                             }  
                         } elsif ($scope eq 'rec') {  
                             if (&Apache::lonnet::clutter($deeplink_map) eq $map) {  
                                 $passback = 1;  
                                 $pbscope = 'map';  
                             } else {  
                                 my @recurseup = &Apache::lonnet::get_map_hierarchy($map,$env{'request.course.id'});  
                                 if (grep(/^\Q$deeplink_map\E$/,@recurseup)) {  
                                     $passback = 1;  
                                     $pbscope = 'map';  
                                 }  
                             }  
                         }  
                         return ($passback,$pbscope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);  
                     }  
                 }  
             }  
         }  
     }  
 }  
   
 =pod  =pod
   
 =item check_correctness_changes()  =item check_correctness_changes()
   
         For all parts for which current results contain a solved status          For all parts for which current results contain a solved status
         of "incorrect_attempted", check if there was a transaction in which          of "incorrect_attempted", check if there was a transaction in which  
         solved was set to "correct_by_student" in the time since the last          solved was set to "correct_by_student" in the time since the last 
         transaction (retrieved when &initialize_storage() was called i.e.,          transaction (retrieved when &initialize_storage() was called i.e., 
         when &start_problem() was called), unless:          when &start_problem() was called), unless:
         (a) questiontype parameter is set to survey or anonymous survey (+/- credit)          (a) questiontype parameter is set to survey or anonymous survey (+/- credit)
         (b) problemstatus is set to no or no_feedback_ever          (b) problemstatus is set to no or no_feedback_ever
         If such a transaction exists, and did not occur after "reset status"          If such a transaction exists, and did not occur after "reset status" 
         by a user with grading privileges, then the current transaction is an          by a user with grading privileges, then the current transaction is an
         example of an out-of-order transaction (i.e., incorrect occurring after          example of an out-of-order transaction (i.e., incorrect occurring after
         correct).  Accordingly, the current transaction should be hidden.          correct).  Accordingly, the current transaction should be hidden.
Line 1534  sub store_aggregates { Line 1288  sub store_aggregates {
             } else {              } else {
                 $anoncounter{$symb."\0".$part} = 1;                  $anoncounter{$symb."\0".$part} = 1;
             }              }
             my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};              my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}.'::'};
             if ($needsrelease) {                 if ($needsrelease) {
                 my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};                  my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
                 if ($curr_required eq '') {                  if ($curr_required eq '') {
                     &Apache::lonnet::update_released_required($needsrelease);                      &Apache::lonnet::update_released_required($needsrelease);
Line 1563  sub store_aggregates { Line 1317  sub store_aggregates {
     }      }
 }  }
   
 sub access_status_msg {  
     my ($mode,$status,$symb,$target,$ipused,$accessmsg) = @_;  
     my $msg;  
     if ($target eq 'web') {  
         if ($status eq 'UNAVAILABLE') {  
             $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';  
         } elsif ($status eq 'NOT_IN_A_SLOT') {  
             $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';  
         } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||  
                  ($status eq 'NOTRESERVABLE')) {  
             $msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>';  
         } elsif ($status ne 'NOT_YET_VIEWED') {  
             $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';  
         }  
         if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {  
             $msg.=&mt('The problem ').$accessmsg;  
         } elsif ($status eq 'UNCHECKEDOUT') {  
             $msg.=&checkout_msg();  
         } elsif ($status eq 'NOT_YET_VIEWED') {  
             $msg.=&firstaccess_msg($accessmsg,$symb);  
         } elsif ($status eq 'NOT_IN_A_SLOT') {  
             $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");  
         } elsif ($status eq 'RESERVABLE') {  
             $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',  
                       &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).  
                       '<br />'.  
                       &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");  
         } elsif ($status eq 'RESERVABLE_LATER') {  
             $msg.=&mt('Window to make a reservation will open [_1].',  
                       &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));  
         } elsif ($status eq 'NOTRESERVABLE') {  
             $msg.=&mt('Not available to make a reservation.');  
         }  
         $msg.='<br />';  
     } elsif ($target eq 'tex') {  
         my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''  
                              : '\begin{minipage}{\textwidth}';  
   
         $msg ='\noindent \vskip 1 mm '.  
               $startminipage.'\vskip 0 mm';  
         if ($status eq 'UNAVAILABLE') {  
             $msg.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.');  
         } elsif ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {  
             $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg";  
         } else {  
             $msg.=&mt('Problem is not open to be viewed.');  
         }  
         $msg .= " \\vskip 0 mm ";  
     }  
     return $msg;  
 }  
   
 sub checkin_prompt {  
     my ($target,$slot_name,$slot,$type) = @_;  
     my $result;  
     if ($target eq 'web') {  
         $result = &Apache::bridgetask::proctor_validation_screen($slot);  
     } elsif ($target eq 'grade') {  
         if (!&Apache::bridgetask::proctor_check_auth($slot_name,$slot,$type)) {  
             $result = &mt('An error occurred during check-in');  
         }  
     }  
     return $result;  
 }  
   
 sub selfcheckin_resource {  
     my ($resource_due,$slot_name,$slot,$symb) = @_;  
     if ($slot_name ne '') {  
         my $checked_in =  
             $Apache::lonhomework::history{'resource.0.checkedin'};  
         if ($checked_in eq '') {  
             # unproctored slot access, self checkin  
             my $check = &Apache::bridgetask::check_in('problem',undef,undef,  
                                                       $slot_name);  
             if ($check =~ /^error: /) {  
                 &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $symb) using slot: $slot_name");  
             } else {  
                 $checked_in = $Apache::lonhomework::results{"resource.0.checkedin"};  
             }  
         }  
         if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {  
             if ($slot->{'starttime'} < time()) {  
                 if (!$resource_due) {  
                     $resource_due = $slot->{'endtime'};  
                 } elsif ($slot->{'endtime'} < $resource_due) {  
                     $resource_due = $slot->{'endtime'};  
                 }  
             }  
         }  
     }  
     return $resource_due;  
 }  
   
 sub checkout_msg {  sub checkout_msg {
     my %lt=&Apache::lonlocal::texthash(       my %lt=&Apache::lonlocal::texthash( 
  'resource'=>'The resource needs to be checked out',   'resource'=>'The resource needs to be checked out',
  'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',   'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',
                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',                  'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                 'checkout'=>'Check out Exam for Viewing',                  'checkout'=>'Check out Bubblesheet Exam for Viewing',
  'checkout?'=>'Check out Exam?');   'checkout?'=>'Check out Bubblesheet Exam?');
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     return (<<ENDCHECKOUT);      return (<<ENDCHECKOUT);
 <h2>$lt{'resource'}</h2>  <h2>$lt{'resource'}</h2>
Line 1701  sub firstaccess_msg { Line 1362  sub firstaccess_msg {
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     my $buttontext = &mt('Show Resource');      my $buttontext = &mt('Show Resource');
     my $timertext = &mt('Start Timer?');      my $timertext = &mt('Start Timer?');
     my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'\'"<>&');  
     $result .= (<<ENDCHECKOUT);      $result .= (<<ENDCHECKOUT);
 <form name="markaccess" method="post" action="$uri">  <form name="markaccess" method="post" action="$uri">
 <input type="hidden" name="markaccess" value="yes" />  <input type="hidden" name="markaccess" value="yes" />
 <input type="hidden" name="symb" value="$shownsymb" />  
 <input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />  <input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
Line 1747  sub init_problem_globals { Line 1406  sub init_problem_globals {
     @Apache::structuretags::whilebody=();      @Apache::structuretags::whilebody=();
     @Apache::structuretags::whileline=();      @Apache::structuretags::whileline=();
     $Apache::lonhomework::scantronmode=0;      $Apache::lonhomework::scantronmode=0;
     $Apache::lonhomework::randomizetrypart=0;  
     undef($Apache::lonhomework::name);      undef($Apache::lonhomework::name);
     undef($Apache::lonhomework::default_type);      undef($Apache::lonhomework::default_type);
     undef($Apache::lonhomework::type);      undef($Apache::lonhomework::type);
Line 1771  sub reset_problem_globals { Line 1429  sub reset_problem_globals {
     undef($Apache::lonhomework::default_type);      undef($Apache::lonhomework::default_type);
     undef($Apache::lonhomework::type);      undef($Apache::lonhomework::type);
     undef($Apache::lonhomework::scantronmode);      undef($Apache::lonhomework::scantronmode);
     undef($Apache::inputtags::randomizetrypart);  
     undef($Apache::lonhomework::ignore_response_errors);      undef($Apache::lonhomework::ignore_response_errors);
     undef(@Apache::functionplotresponse::callscripts);      undef(@Apache::functionplotresponse::callscripts);
     &Apache::lonhomework::reset_show_problem_status();      &Apache::lonhomework::reset_show_problem_status();
Line 1863  sub start_problem { Line 1520  sub start_problem {
     my $status;      my $status;
     my $accessmsg;      my $accessmsg;
     my $resource_due;      my $resource_due;
       my $ipused;
   
     my $name= &get_resource_name($parstack,$safeeval);      my $name= &get_resource_name($parstack,$safeeval);
     my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres);      my ($result,$form_tag_start,$slot_name,$slot,$probpartlist);
   
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
         $target eq 'tex') {          $target eq 'tex') {
         if ($env{'form.markaccess'}) {          if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");              my @interval=&Apache::lonnet::EXT("resource.0.interval");
             my ($timelimit) = ($interval[0] =~ /^(\d+)/);              my ($timelimit) = split(/_/,$interval[0]);
             my $is_set = &Apache::lonnet::set_first_access($interval[1],$timelimit);              &Apache::lonnet::set_first_access($interval[1],$timelimit);
             unless (($is_set eq 'ok') || ($is_set eq 'already_set')) {  
                 $firstaccres = $is_set;  
             }  
         }          }
   
           ($status,$accessmsg,$slot_name,$slot,$ipused) =
               &Apache::lonhomework::check_slot_access('0','problem');
           push (@Apache::inputtags::status,$status);
     }      }
   
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
Line 1884  sub start_problem { Line 1543  sub start_problem {
  ($result,$form_tag_start,$probpartlist) =   ($result,$form_tag_start,$probpartlist) =
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
  $name);   $name);
     } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) ||      } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) {
              ($target eq 'answer')) {  
         my ($symb)= &Apache::lonnet::whichuser();          my ($symb)= &Apache::lonnet::whichuser();
         if ($symb ne '') {          my $navmap = Apache::lonnavmaps::navmap->new();
             my $navmap = Apache::lonnavmaps::navmap->new();          if (ref($navmap)) {
             if (ref($navmap)) {              my $res = $navmap->getBySymb($symb);
                 my $res = $navmap->getBySymb($symb);              if (ref($res)) {
                 if (ref($res)) {                  $probpartlist = $res->parts();
                     $probpartlist = $res->parts();  
                 }  
             }              }
         }          }
     }      }
   
     if (($target eq 'web') && ($env{'request.user_in_effect'})) {  
         &Apache::lonxml::get_all_text("/problem",$parser,$style);  
         return $result;  
     }  
   
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||  
         $target eq 'tex') {  
   
         my ($symb)= &Apache::lonnet::whichuser();  
         ($status,$accessmsg,$slot_name,$slot) =  
             &Apache::lonhomework::check_slot_access('0','problem',$symb,$probpartlist);  
         push (@Apache::inputtags::status,$status);  
     }   
   
     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}      if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
   
     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }      if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
  $target eq 'tex') {   $target eq 'tex') {
   
         my ($symb) = &Apache::lonnet::whichuser();  
  #handle rand seed in construction space   #handle rand seed in construction space
         if (($env{'request.state'} eq 'construct') || ($symb eq '')) {  
             my $partorder=&Apache::lonnet::metadata($env{'request.uri'},'partorder');  
             if ($partorder ne '') {  
                 @{$probpartlist} = split(/,/,$partorder);  
             }  
         }  
  my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);   my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);
         if (($target eq 'grade') && &Apache::response::submitted()) {          if (($target eq 'grade') && &Apache::response::submitted()) {
             if ($Apache::lonhomework::type eq 'randomizetry') {              if ($Apache::lonhomework::type eq 'randomizetry') {
Line 1940  sub start_problem { Line 1575  sub start_problem {
                 }                  }
             }              }
         }          }
    my ($symb)=&Apache::lonnet::whichuser();
   
  if ($env{'request.state'} ne "construct" &&    if ($env{'request.state'} ne "construct" && 
     ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {      ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
             my $rndseedval = $rndseed;  
             if (($symb eq '') && ($Apache::lonhomework::type eq 'randomizetry')) {  
                 $rndseedval = $env{'form.rndseed'};  
             }  
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
  $rndseedval.'" />'.   $rndseed.'" />'.
     '<button type="submit" name="resetdata"      '<input type="submit" name="resetdata"
                         value="new_problem_variation">'.&mt('New Problem Variation').'</button>';                               value="'.&mt('New Problem Variation').'" />';
     if (exists($env{'form.username'})) {      if (exists($env{'form.username'})) {
  $form_tag_start.=   $form_tag_start.=
     '<input type="hidden" name="username"      '<input type="hidden" name="username"
Line 1970  sub start_problem { Line 1602  sub start_problem {
                 $form_tag_start.=&practice_problem_header();                  $form_tag_start.=&practice_problem_header();
             }              }
     $form_tag_start.='<hr />';      $form_tag_start.='<hr />';
         }          } elsif (($env{'request.state'} ne "construct") &&
         if (($env{'request.state'} ne "construct") &&                   ($Apache::lonhomework::type eq 'randomizetry') &&
             ($Apache::lonhomework::type eq 'randomizetry') &&                   ($status eq 'CAN_ANSWER') &&
             ($status eq 'CAN_ANSWER')) {                   ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') &&
             my @parts;                   (!$env{'request.role.adv'})) {
             if (ref($probpartlist) eq 'ARRAY') {  # "New Problem Variation Each Try" header suppressed for Placement Tests, unless course personnel. 
                 @parts = @{$probpartlist};              my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
             }              my $problemstatus = &get_problem_status($Apache::inputtags::part);
             unless (@parts) {              $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);
                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                 my $problemstatus = &get_problem_status($Apache::inputtags::part);  
                 $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries,$symb);  
             }  
         }          }
   
  my $expression='$external::datestatus="'.$status.'";';   my $expression='$external::datestatus="'.$status.'";';
Line 1999  sub start_problem { Line 1627  sub start_problem {
             ( $status eq 'NOTRESERVABLE') ||              ( $status eq 'NOTRESERVABLE') ||
             ( $status eq 'RESERVABLE') ||              ( $status eq 'RESERVABLE') ||
             ( $status eq 'RESERVABLE_LATER') ||              ( $status eq 'RESERVABLE_LATER') ||
     ( $status eq 'INVALID_ACCESS')) {      ( $status eq 'INVALID_ACCESS') ||
               ( $status eq 'NEED_DIFFERENT_IP')) {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
             if (($status eq 'NOT_YET_VIEWED') && ($firstaccres)) {      if ( $target eq "web" ) {
                 $result .= '<p class="LC_error">'.   my $msg;
                            &mt('A problem occurred when trying to start the timer.').'</p>';   if ($status eq 'UNAVAILABLE') {
             }      $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';
             $result .= &access_status_msg('problem',$status,$symb,$target,'',$accessmsg);                  } elsif ($status eq 'NOT_IN_A_SLOT') {
                       $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';
                   } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||
                            ($status eq 'NOTRESERVABLE')) {
                       $msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>';
    } elsif ($status ne 'NOT_YET_VIEWED') {
       $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';
                   }
    if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
       $msg.=&mt('The problem ').$accessmsg;
    } elsif ($status eq 'UNCHECKEDOUT') {
       $msg.=&checkout_msg();
    } elsif ($status eq 'NOT_YET_VIEWED') {
       $msg.=&firstaccess_msg($accessmsg,$symb);
    } elsif ($status eq 'NOT_IN_A_SLOT') {
       $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
                   } elsif ($status eq 'RESERVABLE') {
                       $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',
                                 &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).
                             '<br />'.
                             &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
                   } elsif ($status eq 'RESERVABLE_LATER') {
                       $msg.=&mt('Window to make a reservation will open [_1].',
                                 &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
                   } elsif ($status eq 'NOTRESERVABLE') {
                       $msg.=&mt('Not available to make a reservation.');  
    } elsif ($status eq 'NEED_DIFFERENT_IP') {
                       if ($ipused) {
                           $msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused");
                       } else {
                           $msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'<br />'.
                                 &mt('Somebody else has already used this particular computer for that purpose.');
                       }
                   }
    $result.=$msg.'<br />';
       } elsif ($target eq 'tex') {
    my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
                       : '\begin{minipage}{\textwidth}';
    $result.='\noindent \vskip 1 mm '.
       $startminipage.'\vskip 0 mm';
    if ($status eq 'UNAVAILABLE') {
       $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
    } else {
       $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
    }
       }
  } elsif ($status eq 'NEEDS_CHECKIN') {   } elsif ($status eq 'NEEDS_CHECKIN') {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
             $result .= &checkin_prompt($target,$slot_name,$slot,'problem');      if ($target eq 'web') {
    $result .= 
       &Apache::bridgetask::proctor_validation_screen($slot);
       } elsif ($target eq 'grade') {
    my $checkinresult = &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
                       'problem');
                   if ($checkinresult = /^error:/) {
                       $result .= 'error';
                   }
       }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER') {
                 $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'});                  $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'});
                 if ($slot_name ne '') {                  if ($slot_name ne '') {
                     $resource_due = &selfcheckin_resource($resource_due,$slot_name,$slot,                      my $checked_in =
                                                           $env{'request.symb'});                          $Apache::lonhomework::history{'resource.0.checkedin'};
                       if ($checked_in eq '') {
                           # unproctored slot access, self checkin
                           my $needsiptied;
                           if (ref($slot)) {
                               $needsiptied = $slot->{'iptied'};
                           }
                           my $check = &Apache::bridgetask::check_in('problem',undef,undef,
                                                                     $slot_name,$needsiptied);
                           if ($check =~ /^error: /) {
                               &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $env{'request.symb'}) using slot: $slot_name");
                           } else {
                               $checked_in =
                                   $Apache::lonhomework::results{"resource.0.checkedin"};
                           }
                       }
                       if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {
                           if ($slot->{'starttime'} < time()) {
                               if (!$resource_due) {
                                   $resource_due = $slot->{'endtime'};
                               } elsif ($slot->{'endtime'} < $resource_due) {
                                   $resource_due = $slot->{'endtime'};
                               }
                           }
                       }
                 }                  }
                 if ($resource_due) {                  if ($resource_due) {
                     my $time_left = $resource_due - time();                      my $time_left = $resource_due - time();
Line 2036  sub start_problem { Line 1743  sub start_problem {
     $result.= &problem_web_to_edit_header($env{'form.rndseed'});      $result.= &problem_web_to_edit_header($env{'form.rndseed'});
                 }                  }
                 if ($Apache::lonhomework::type eq 'practice') {                  if ($Apache::lonhomework::type eq 'practice') {
                     $result.= '<button type="submit" name="resetdata" '.                      $result.= '<input type="submit" name="resetdata" '.
                               'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.                                'value="'.&mt('New Problem Variation').'" />'.
                               &practice_problem_header().'<hr />';                                &practice_problem_header().'<hr />';
                 } elsif ($Apache::lonhomework::type eq 'randomizetry') {  
                     my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                     my $problemstatus = &get_problem_status($Apache::inputtags::part);  
                     $result.=&randomizetry_problem_header($problemstatus,$reqtries);  
                 }                  }
     }      }
     # if we are viewing someone else preserve that info      # if we are viewing someone else preserve that info
Line 2064  sub start_problem { Line 1767  sub start_problem {
  } elsif ($target eq 'tex') {   } elsif ($target eq 'tex') {
     $result .= 'INSERTTEXFRONTMATTERHERE';      $result .= 'INSERTTEXFRONTMATTERHERE';
     $result .= &select_metadata_hyphenation();      $result .= &select_metadata_hyphenation();
       
   
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= $form_tag_start.&problem_edit_header();   $result .= $form_tag_start.&problem_edit_header();
Line 2183  sub end_problem { Line 1888  sub end_problem {
     }      }
  }   }
  $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;   $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
     } elsif ($target eq 'web') {  
         if ($env{'request.user_in_effect'}) {  
             &reset_problem_globals('problem');  
             $result .= &Apache::lonhtmlcommon::set_compute_end_time();  
             return $result;  
         }  
     }      }
   
     my $status=$Apache::inputtags::status['-1'];      my $status=$Apache::inputtags::status['-1'];
Line 2228  sub end_problem { Line 1927  sub end_problem {
                 # Added separately at end of this routine, after added                  # Added separately at end of this routine, after added
                 # <script></script> so document will be valid xhtml.                  # <script></script> so document will be valid xhtml.
                 #                  #
  $result.= &Apache::loncommon::end_page({'discussion' => 1,                  my $showdisc = 1;
                   if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
                       (!$env{'request.role.adv'})) { 
   # For Placement Tests footer with "Post Discussion" and "Send Feedback" links is suppressed.
                       $showdisc = 0;
                       my ($symb)= &Apache::lonnet::whichuser();
                       if ($symb) {
                           my $navmap = Apache::lonnavmaps::navmap->new();
                           if (ref($navmap)) {
                               my $hastries = &Apache::lonplacementtest::has_tries($symb,$navmap);  
   # For Placement Tests test status is displayed if this is the last resource in the course
   # and there are no tries left
                               unless ($hastries) {
                                   if (&Apache::lonplacementtest::is_lastres($symb,$navmap)) {
                                       my ($score,$incomplete) = 
                                           &Apache::lonplacementtest::check_completion(undef,undef,1);
                                       if (!$incomplete) {
                                           $result .= &Apache::lonplacementtest::showresult(1,1);
                                       } elsif ($incomplete < 100) { 
                                           $result.= &Apache::lonplacementtest::showincomplete($incomplete,1);
                                       }
                                   } else {
   # For Placement Tests score is displayed if test has just been completed
                                       my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1);
                                       if (!$incomplete) {
                                           $result.= &Apache::lonplacementtest::showresult(1,1);
                                       }
                                   }
                               }
                           }
                       }
                   }
    $result.= &Apache::loncommon::end_page({'discussion' => $showdisc,
  'notbody'    => 1});   'notbody'    => 1});
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $endminipage = '';   my $endminipage = '';
Line 2248  sub end_problem { Line 1979  sub end_problem {
     }      }
  }   }
         if ($target eq 'web') {          if ($target eq 'web') {
             $result.=&Apache::functionplotresponse::init_script();             $result.=&Apache::functionplotresponse::init_script();
             if ($Apache::lonhomework::default_type eq 'randomizetry') {  
                 my ($symb) = &Apache::lonnet::whichuser();  
                 if ((($env{'request.state'} eq 'construct') || ($symb eq '')) &&  
                     ($status eq 'CAN_ANSWER')) {  
                     unless (@Apache::inputtags::partlist > 1) {  
                         $result.= <<"ENDJS";  
 <script type="text/javascript">  
 // <![CDATA[  
     \$(document).ready(function() {  
          \$('#LC_randomizetry_header').css('display','block');  
     });  
 // ]]>  
 </script>  
 ENDJS  
                     }  
                 }  
             }  
         }          }
  if ($target eq 'grade') {   if ($target eq 'grade') {
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
Line 2303  ENDJS Line 2017  ENDJS
     # computation:      # computation:
     #      #
     if ($target eq 'web') {      if ($target eq 'web') {
         $result .= &Apache::lonhtmlcommon::dash_to_minus_js().          $result .= &Apache::lonhtmlcommon::set_compute_end_time();
                    &Apache::lonhtmlcommon::set_compute_end_time();  
         #          #
         # Closing tags delayed so any <script></script> tags           # Closing tags delayed so any <script></script> tags 
         # not in head can appear inside body, for valid xhtml.          # not in head can appear inside body, for valid xhtml.
Line 2343  sub start_library { Line 2056  sub start_library {
   '<input type="hidden" name="submitted" value="yes" />';    '<input type="hidden" name="submitted" value="yes" />';
  $result.=&problem_web_to_edit_header($rndseed);   $result.=&problem_web_to_edit_header($rndseed);
         if ($Apache::lonhomework::type eq 'practice') {          if ($Apache::lonhomework::type eq 'practice') {
             $result.= '<button type="submit" name="resetdata" '.              $result.= '<input type="submit" name="resetdata" '.
                       'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.                        'value="'.&mt('New Problem Variation').'" />'.
                       &practice_problem_header().'<hr />';                        &practice_problem_header().'<hr />';
         }          }
     }      }
Line 2360  sub end_library { Line 2073  sub end_library {
      && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')        && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') 
      && $env{'request.state'} eq "construct") {       && $env{'request.state'} eq "construct") {
  $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});   $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
     } elsif ($target eq 'meta') {  
         $result.=&Apache::response::meta_response_order();  
     }      }
     if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {      if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
  &reset_problem_globals('library');   &reset_problem_globals('library');
Line 2844  sub start_randomlist { Line 2555  sub start_randomlist {
  }   }
  if (@randomlist) {   if (@randomlist) {
     my @idx_arr = (0 .. $#randomlist);      my @idx_arr = (0 .. $#randomlist);
             if ($env{'form.code_for_randomlist'}) {      &Apache::structuretags::shuffle(\@idx_arr);
                 &Apache::structuretags::shuffle(\@idx_arr,$target);  
                 undef($env{'form.code_for_randomlist'});  
             } else {  
                 &Apache::structuretags::shuffle(\@idx_arr);  
             }  
     my $bodytext = '';      my $bodytext = '';
     my $show=$#randomlist;      my $show=$#randomlist;
     my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);      my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
Line 2888  sub start_randomlist { Line 2594  sub start_randomlist {
 }  }
   
 sub shuffle {  sub shuffle {
     my ($a,$target) = @_;      my $a=shift;
     my $i;      my $i;
     if (ref($a) eq 'ARRAY' && @$a) {      if (ref($a) eq 'ARRAY' && @$a) {
  &Apache::response::pushrandomnumber(undef,$target);   &Apache::response::pushrandomnumber();
  for($i=@$a;--$i;) {   for($i=@$a;--$i;) {
     my $j=int(&Math::Random::random_uniform() * ($i+1));      my $j=int(&Math::Random::random_uniform() * ($i+1));
     next if $i == $j;      next if $i == $j;
Line 3065  sub start_part { Line 2771  sub start_part {
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
                     if ($status eq 'CAN_ANSWER') {                      if ($status eq 'CAN_ANSWER') {
                         my $problemstatus = &get_problem_status($Apache::inputtags::part);                           my $problemstatus = &get_problem_status($Apache::inputtags::part); 
                           my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type");
                           my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries");
                         my $num = scalar(@Apache::inputtags::partlist)-1;                          my $num = scalar(@Apache::inputtags::partlist)-1;
                         if ((($Apache::lonhomework::default_type eq 'randomizetry') ||                          if ($probrandomize eq 'randomizetry') {
                              ($Apache::lonhomework::randomizetrypart)) &&                              if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {
                             ($Apache::lonhomework::type ne 'randomizetry')) {                                  $result .= &randomizetry_part_header($problemstatus,'none',$num);
                             $result .= &randomizetry_part_header($problemstatus,'none',$num);                              } else {
                         } elsif ($Apache::lonhomework::type eq 'randomizetry') {                                  my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                             $Apache::lonhomework::randomizetrypart = 1;                                  if ($probrandtries ne $reqtries) {
                             my $reqtries = &Apache::lonnet::EXT("resource.$id.randomizeontries");                                      $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                                   }
                               }
                           } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') {
                               my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                             $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);                              $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                         }                          }
                     }                      }
Line 3127  sub end_part { Line 2839  sub end_part {
     $gradestatus='';      $gradestatus='';
  }   }
  $result.=$gradestatus;   $result.=$gradestatus;
         if ($$tagstack[-2] eq 'td' and $target eq 'tex') {   if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} 
             if (not $env{'form.problem_split'}=~/yes/) {  
                 $result.='\end{minipage}';  
             }  
         }  
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::end_table();   $result.=&Apache::edit::end_table();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
Line 3247  sub start_problemtype { Line 2955  sub start_problemtype {
     ['hide','Hide']]      ['hide','Hide']]
    ,$token);     ,$token);
  $result .=&Apache::edit::checked_arg('When used as type(s):','for',   $result .=&Apache::edit::checked_arg('When used as type(s):','for',
      [ ['exam','Exam/Quiz Problem'],       [ ['exam','Bubblesheet Exam/Quiz Problem'],
        ['survey','Survey'],         ['survey','Survey'],
                                                ['surveycred','Survey (with credit)'],                                                 ['surveycred','Survey (with credit)'],
                                                ['anonsurvey','Anonymous Survey'],                                                 ['anonsurvey','Anonymous Survey'],
Line 3295  sub end_startouttext { Line 3003  sub end_startouttext {
                  .'<td><span class="LC_nobreak">'.&mt('Delete?').' '                   .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
                  .&Apache::edit::deletelist($target,$token)                   .&Apache::edit::deletelist($target,$token)
                  .'</span></td>'                   .'</span></td>'
          .'<td><span id="math_'.$areaid.'">';           .'<td><span id="math_'.$areaid.'">'
  if (&Apache::loncommon::nocodemirror()) {   .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
     $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);   .'</span></td>'
  } else {  
     $result.='&nbsp;';  
  }  
  $result.='</span></td>'  
  .'<td>'   .'<td>'
  .&Apache::edit::insertlist($target,$token)   .&Apache::edit::insertlist($target,$token)
  .'</td>'   .'</td>'
Line 3396  sub practice_problem_header { Line 3100  sub practice_problem_header {
 }  }
   
 sub randomizetry_problem_header {  sub randomizetry_problem_header {
     my ($problemstatus,$reqtries,$symb) = @_;      my ($problemstatus,$reqtries) = @_;
     my ($header,$text);      my ($header,$text);
     if ($reqtries > 1) {      if ($reqtries > 1) {
         $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);
Line 3416  sub randomizetry_problem_header { Line 3120  sub randomizetry_problem_header {
             $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');              $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');
         }          }
     }      }
     if (($env{'request.state'} eq "construct") || ($symb eq '')) {      return '<span class="LC_info"><h3>'.$header.'</h3></span>'.
         return '<div class="LC_info" id="LC_randomizetry_header" style="display:none">'.             '<span class="LC_info">'.$text.'</span><hr />';
                '<h3>'.$header.'</h3><span class="LC_info">'.$text.'</span><hr /></div>';  
     } else {  
         return '<h3 class="LC_info">'.$header.'</h3>'.  
                '<span class="LC_info">'.$text.'</span><hr />';  
     }  
 }  }
   
 sub randomizetry_part_header {  sub randomizetry_part_header {
Line 3430  sub randomizetry_part_header { Line 3129  sub randomizetry_part_header {
     my ($header,$text);      my ($header,$text);
     if ($reqtries eq 'none') {      if ($reqtries eq 'none') {
         $header = &mt('No Question Variation');          $header = &mt('No Question Variation');
         $text = &mt('For this question there will be no new variation after a try.');          $text = &mt('For this question there will no new variation after a try.');
     } elsif ($reqtries > 1) {      } elsif ($reqtries > 1) {
         $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);
         if (($problemstatus eq 'no') ||          if (($problemstatus eq 'no') ||

Removed from v.1.512.2.24.2.14  
changed lines
  Added in v.1.549


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