Diff for /loncom/homework/structuretags.pm between versions 1.530 and 1.584

version 1.530, 2015/02/23 10:40:01 version 1.584, 2024/01/13 17:35:19
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;
     
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));      &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','print','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
 }  }
   
   
Line 192  sub end_web { Line 194  sub end_web {
     return '';      return '';
 }  }
   
   sub start_print {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       if ($target ne 'edit' && $target ne 'modified') {
           if ($target ne 'tex') {
               my $skip = &Apache::lonxml::get_all_text("/print",$parser,$style);
               &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
           }
       } elsif ($target eq "edit") {
           my $bodytext = &Apache::lonxml::get_all_text_unbalanced("/print",$parser);
           my $result = &Apache::edit::tag_start($target,$token);
           $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
           return $result;
       } elsif ($target eq "modified") {
           return $token->[4].&Apache::edit::modifiedfield("/print",$parser);
       }
       return '';
   }
   
   sub end_print {
       return '';
   }
   
 sub start_tex {  sub start_tex {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
Line 224  sub end_tex { Line 248  sub end_tex {
 }  }
   
 sub homework_js {  sub homework_js {
       my ($postsubmit,$timeout);
       if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {
           my $crstype = &Apache::loncommon::course_type();
           if ($crstype eq 'Community') {
               $crstype = 'community';
           } elsif ($crstype eq 'Placement') {
               $crstype = 'placement'; 
           } else {
               if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {
                   $crstype = 'official';
               } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) {
                   $crstype = 'textbook';
               } else {
                   $crstype = 'unofficial';
               }
           }
           $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'};
           if ($postsubmit eq '') {
               my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
               $postsubmit = $domdefs{'postsubmit'};
               unless ($postsubmit eq 'off') {
                   $timeout = $domdefs{$crstype.'postsubtimeout'};
               }
           } elsif ($postsubmit eq '0') {
               $postsubmit = 'off';
           } elsif ($postsubmit eq '1') {
               $postsubmit = 'on';
               $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'};
               if ($timeout eq '') {
                   my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                   $timeout = $domdefs{$crstype.'postsubtimeout'};
               }
           }
           if ($timeout eq '') {
               $timeout = 60;
           }
       } else {
           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
           $postsubmit = $domdefs{'postsubmit'};
           unless ($postsubmit eq 'off') {
               $timeout = 60;
           }
       }
       my $jstimeout = 0;
       if ($timeout) {
           $jstimeout = 1000 * $timeout;
       }
     return &Apache::loncommon::resize_textarea_js().      return &Apache::loncommon::resize_textarea_js().
                 &Apache::loncommon::colorfuleditor_js().                  &Apache::loncommon::colorfuleditor_js().
            &setmode_javascript().             &Apache::lonxml::setmode_javascript().
  <<'JS';   <<"JS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function setSubmittedPart (part,prefix) {  function setSubmittedPart (part,prefix) {
Line 242  function setSubmittedPart (part,prefix) Line 313  function setSubmittedPart (part,prefix)
     }      }
 }  }
   
   function disableAutoComplete (id) {
       var field = document.getElementById(id);
       if (field != null && field != undefined){
           if ('autocomplete' in field) {
               field.autocomplete = "off";
           } else {
               field.setAttribute("autocomplete", "off");
           }
       }
   }
   
 function image_response_click (which, e) {  function image_response_click (which, e) {
     init_geometry();      init_geometry();
     if (!e) { e = window.event; } //IE      if (!e) { e = window.event; } //IE
Line 258  function image_response_click (which, e) Line 340  function image_response_click (which, e)
   
 var submithandled = 0;  var submithandled = 0;
 var keypresshandled = 0;  var keypresshandled = 0;
   var postsubmit = '$postsubmit';
   
 $(document).ready(function(){  \$(document).ready(function(){
     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)) {
             if ( $( document.activeElement ).hasClass("LC_textline") ) {              if ( \$( document.activeElement ).hasClass("LC_textline") ) {
                 keypresshandled = 1;                  keypresshandled = 1;
                 var idsArray = $( document.activeElement ).attr("id").split(/HWVAL_/);                  var idsArray = \$( document.activeElement ).attr("id").split(/HWVAL_/);
                 if (idsArray.length) {                  if (idsArray.length) {
                     event.preventDefault();                      event.preventDefault();
                     var itemsArray = idsArray[1].split(/_/);                      var itemsArray = idsArray[1].split(/_/);
                     var buttonId = idsArray[0]+'submit_'+itemsArray[0];                      var buttonId = idsArray[0]+'submit_'+itemsArray[0];
                     $("#"+buttonId).trigger("click");                      \$("#"+buttonId).trigger("click");
                 }                  }
             }              }
         }          }
     });      });
   
     $(document).delegate('form :submit', 'click', function( event ) {      \$(document).delegate('form :submit', 'click', function( event ) {
         if ( $( this ).hasClass( "LC_hwk_submit" ) ) {          if ( \$( this ).hasClass( "LC_hwk_submit" ) ) {
             var buttonId = this.id;              var buttonId = this.id;
               var timeout = $jstimeout;
             if (submithandled == 0) {              if (submithandled == 0) {
                 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).id == "LC_page" ) && ($('input[name="all_submit"]').length )) {                  if (( \$(this.form).attr("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) {                      }
                             $( "#"+buttonId+"_pressed" ).val( "1" );                      if (( "#"+buttonId+"_pressed" ).length) {
                         }                          \$( "#"+buttonId+"_pressed" ).val( "1" );
                     }                      }
                 } else {                  } else {
                     $( ".LC_status_"+buttonId ).hide();                      \$( ".LC_status_"+buttonId ).hide();
                 }                  }
                 $(this.form).submit();                  \$(this.form).submit();
                 $( ".LC_hwk_submit" ).prop( "disabled", true);                  \$( ".LC_hwk_submit" ).prop( "disabled", true);
                 $( ".LC_textline" ).prop( "readonly", "readonly");                  \$( ".LC_textline" ).prop( "readonly", "readonly");
                 event.preventDefault();                  event.preventDefault();
   
                   if (timeout > 0) {
                       setTimeout(function(){
                                          \$( "#msg_"+buttonId ).css({"display": "none"});
                                          if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
                                              if (( "#"+buttonId+"_pressed" ).length) {
                                                  \$( "#"+buttonId+"_pressed" ).val( "" );
                                              }
                                          }
                                          \$( ".LC_hwk_submit" ).prop( "disabled", false);
                                          \$( ".LC_textline" ).prop( "readonly", false);
                                          submithandled = 0;
                                          keypresshandled = 0;
                                        }, timeout);
                   }
                 return true;                  return true;
             }              }
         }          }
     });      });
     }
 });  });
   
 // ]]>  // ]]>
Line 309  $(document).ready(function(){ Line 409  $(document).ready(function(){
 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 341  sub page_start { Line 428  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 414  sub page_start { Line 505  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" 
                                   src="/res/adm/includes/file_upload.js"></script>';
         }          }
     }      }
   
Line 445  sub page_start { Line 538  sub page_start {
     } elsif (!defined($found{'body'})       } elsif (!defined($found{'body'}) 
      && $env{'request.state'} eq 'construct') {       && $env{'request.state'} eq 'construct') {
  if ($target eq 'web' || $target eq 'edit') {   if ($target eq 'web' || $target eq 'edit') {
         # Breadcrumbs for Authoring Space              unless ($env{'form.inhibitmenu'} eq 'yes') {
         &Apache::lonhtmlcommon::clear_breadcrumbs();                  my $text = 'Authoring Space';
         &Apache::lonhtmlcommon::add_breadcrumb({                  my $href = &Apache::loncommon::authorspace($env{'request.uri'});
             'text'  => 'Authoring Space',                  if ($env{'request.course.id'}) {
             'href'  => &Apache::loncommon::authorspace($env{'request.uri'}),                      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         });                      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         # breadcrumbs (and tools) will be created                       if ($href eq "/priv/$cdom/$cnum/") {
         # in start_page->bodytag->innerregister                          $text = &mt('Course Authoring Space');
                       }
                   }
                   # Breadcrumbs for Authoring Space
                   &Apache::lonhtmlcommon::clear_breadcrumbs();
                   &Apache::lonhtmlcommon::add_breadcrumb({
                       'text'  => $text,
                       'href'  => $href,
                   });
                   # breadcrumbs (and tools) will be created 
                   # in start_page->bodytag->innerregister
   
 # FIXME Where are we?  # FIXME Where are we?
 #        &Apache::lonhtmlcommon::add_breadcrumb({  #                &Apache::lonhtmlcommon::add_breadcrumb({
 #            'text'  => 'Problem Editing', # 'Problem Testing'  #                    'text'  => 'Problem Editing', # 'Problem Testing'
 #            'href'  => '',  #                    'href'  => '',
 #        });  #               });
         $pageheader =&Apache::loncommon::head_subbox(                  $pageheader = &Apache::loncommon::head_subbox(
                 &Apache::loncommon::CSTR_pageheader());                                   &Apache::loncommon::CSTR_pageheader());
  }      }
           }
     } elsif (!defined($found{'body'})) {      } elsif (!defined($found{'body'})) {
  my %add_entries;   my %add_entries;
  my $background=&Apache::lonxml::get_param('background',$parstack,   my $background=&Apache::lonxml::get_param('background',$parstack,
Line 516  sub page_start { Line 620  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 (($is_task) || ($needs_upload)) {          if ($env{'request.user_in_effect'}) {
               $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 559  sub get_resource_name { Line 665  sub get_resource_name {
 }  }
   
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target,$probpartlist)=@_;      my ($safeeval,$target,$probpartlist,$prevparttype)=@_;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed);      my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);
     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 ($env{'request.state'} eq "construct"       if ($Apache::lonhomework::type eq 'randomizetry') {
  || $symb eq ''           my $partfortries = $Apache::inputtags::part;
  || $Apache::lonhomework::type eq 'practice'  #
  || $Apache::lonhomework::history{'resource.CODE'}) {  # Where question type is "randomizetry" for a problem containing
   # 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 580  sub setup_rndseed { Line 712  sub setup_rndseed {
     if (!$rndseed) {      if (!$rndseed) {
  $rndseed=time;   $rndseed=time;
     }      }
     $env{'form.rndseed'}=$rndseed;              unless ($env{'form.code_for_randomlist'}) {
                   $env{'form.rndseed'}=$rndseed;
               }
  }   }
         if (($env{'request.state'} eq "construct") &&           if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&
             ($Apache::lonhomework::type eq 'randomizetry')) {              ($Apache::lonhomework::type eq 'randomizetry')) {
             my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};              if ($numtries) {
             if ($tries) {                  if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                 $rndseed += $tries;                      my $inc = int($numtries/$reqtries);
                       $rndseed += $inc;
                   } else {
                       $rndseed += $numtries;
                   }
             }              }
             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;              $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
         }          }
  if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')   if ( ($env{'form.resetdata'} eq '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 608  sub setup_rndseed { Line 746  sub setup_rndseed {
        $rndseed=join(':',&Apache::lonnet::digest($rndseed));         $rndseed=join(':',&Apache::lonnet::digest($rndseed));
             }              }
         }          }
         if ($Apache::lonhomework::history{'resource.CODE'}) {          if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) {
               $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 620  sub setup_rndseed { Line 762  sub setup_rndseed {
         }          }
         unless (($target eq 'analyze') && (defined($rndseed))) {          unless (($target eq 'analyze') && (defined($rndseed))) {
             $rndseed=&Apache::lonnet::rndseed();              $rndseed=&Apache::lonnet::rndseed();
             my $partfortries = $Apache::inputtags::part;              my $curr_try = $numtries;
             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 634  sub setup_rndseed { Line 770  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 647  sub setup_rndseed { Line 782  sub setup_rndseed {
         if ($target eq 'grade') {          if ($target eq 'grade') {
             $Apache::lonhomework::rawrndseed = $rndseed;              $Apache::lonhomework::rawrndseed = $rndseed;
         }          }
       } elsif ($prevparttype eq 'randomizetry') {
           if ($env{'form.0.rndseed'} ne '') {
               $set_safespace = 1;
               $rndseed = $env{'form.0.rndseed'};
           }
     }      }
     if ($set_safespace) {      if ($set_safespace) {
         if ($safeeval) {          if ($safeeval) {
             &Apache::lonxml::debug("Setting rndseed to $rndseed");              &Apache::lonxml::debug("Setting rndseed to $rndseed");
             &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);              &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
               if (($Apache::lonhomework::type eq 'randomizetry') || ($prevparttype eq 'randomizetry')) {
                   &Apache::lonxml::debug("Setting randomizetrypart to $Apache::inputtags::part");
                   &Apache::run::run('$external::randomizetrypart="'.$Apache::inputtags::part.'";',$safeeval);
               }
         }          }
     }      }
     unless (($env{'request.state'} eq "construct") || ($symb eq '')) {      unless (($env{'request.state'} eq "construct") || ($symb eq '')) {
Line 676  sub problem_edit_action_button { Line 820  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
      my $result = '<div style="float:right">';
      if ($mode eq 'editxml') {
          if ($editors{'xml'}) {
              $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');
          }
          $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');
      } else {
          if ($editors{'edit'}) {
              $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');
          }
          $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');
      }
      $result.="\n</div>\n";
 # Buttons that do not save  # Buttons that do not save
    my $result='<div class="LC_edit_problem_discards">'.     $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') {
        $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);         if ($editors{'edit'}) {
              $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);
        $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);         if (&Apache::loncommon::nocodemirror()) {
              $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
          }
    } else {     } else {
        $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);         if ($editors{'xml'}) {
              $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>";
 # Buttons that save  
    $result.='<div class="LC_edit_problem_saves">';  
    if ($mode eq 'editxml') {  
        $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');  
        $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');  
    } else {  
        $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');  
        $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');  
    }  
    $result.="\n</div>\n";  
    return $result;     return $result;
 }  }
   
 sub insert_menu_datastructure {  
   
  my $template_menu = &template_dropdown_datastructure();  
  my $responseblock_menu = &responseblock_dropdown_datastructure();  
  my $conditional_scripting = &conditional_scripting_datastructure();  
  my $misc = &misc_datastructure();  
   
  my @menu = ($template_menu, $responseblock_menu, $conditional_scripting, $misc);  
  return \@menu;  
   
 }  
   
 sub template_dropdown_datastructure {  
     # gathering the all templates and their path, title, category and help topic  
     my @templates = &Apache::lonhomework::get_template_list('problem');  
     # template category => title  
     my %tmplthash = ();  
     # template title => path  
     my %tmpltcontent = ();  
   
     foreach my $template (@templates){  
         # put in hash if the template is not empty  
         unless ($template->[1] eq ''){  
             push(@{$tmplthash{$template->[2]}}, $template->[1]);  
             push(@{$tmpltcontent{$template->[1]}},$template->[0]);  
         }  
     }  
   
  my $catList = [];  
     foreach my $cat (sort keys %tmplthash) {  
  my $catItems = [];  
         foreach my $title (sort @{$tmplthash{$cat}}) {  
             my $path = $tmpltcontent{$title}->[0];  
             my $code;  
             open(FH, "<$path");  
             while(<FH>){  
                 $code.= $_ unless $_ =~ /(<problem>)|(<\/problem>)/;  
             }  
             close(FH);  
   
  if ($code ne '') {  
  my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code)) . '\')';  
  my $currItem = [$href, $title, undef];  
  push @{$catItems}, $currItem;  
  }  
         }  
  push @{$catList}, [$catItems, $cat, undef];  
     }  
   
  my $templDropdown = [$catList, &mt("Complete Problem Templates"), undef];  
     return $templDropdown;  
 }  
   
 sub responseblock_dropdown_datastructure {  
   
  my $mathCat = [  
  [  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef]  
  ],   
  &mt("Math"),   
  undef  
  ];  
   
  my $miscCat = [  
  [  
             ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef],  
             ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef],  
             ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef],  
             ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_matchresponse())) . "\')", &mt("Match Response"), undef],  
             ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N Statement"), undef],  
             ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Optionresponse"), undef],   
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef]  
  ],  
  &mt("Misc"),  
  undef  
  ];  
   
  my $chemCat = [  
  [  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Structure"), undef]  
  ],  
  &mt("Chemical"),  
  undef  
  ];  
   
  my $textCat = [  
  [  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef]  
  ],  
  &mt("Text"),  
  undef  
  ];  
   
  my $cats = [[$mathCat, $miscCat, $chemCat, $textCat], &mt("Response Types"), undef];  
  return $cats;  
 }  
   
   
 sub conditional_scripting_datastructure {  
 # TODO: corresponding routines should be used for the javascript:insertText parts  
 # instead of the placeholder routine default_xml_tag with the tags  
 # e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which  
 # returns the corresponding content for this case  
   
 #TODO translated is currently temporarily here, another solution should be found where the  
 # needed string can be retrieved  
   
  my $translatedTag = '  
 <translated>  
     <lang which="en"></lang>  
     <lang which="default"></lang>  
 </translated>';  
   
  my $cat = [  
  [  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Tag"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Block"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef]  
  ],  
  &mt("Contitional Scripting"),  
  undef  
  ];  
   
  return $cat;  
 }  
   
 sub misc_datastructure {  
   
  my $graphicalCat = [  
  [  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef]  
  ],  
  "Graphical",  
  undef  
  ];  
   
  my $advancedCat = [  
  [  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef],  
  ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef]  
  ],  
  "advanced",  
  undef  
  ];  
   
  my $cats = [[$graphicalCat, $advancedCat], &mt("misc"), undef];  
  return $cats;  
 }  
   
 # helper routine for the datastructure building subroutines  
 sub default_xml_tag {  
  my ($tag) = @_;  
  return "\n<$tag></$tag>";  
 }  
   
   
 sub helpmenu_datastructure {  
   
  my $width = 500;  
  my $height = 600;  
   
  my $helpers = [  
  ['Problem_LON-CAPA_Functions', &mt('Script Functions')],  
  ['Greek_Symbols', &mt('Greek Symbols')],  
   ['Other_Symbols', &mt('Other Symbols')],  
  ['Authoring_Output_Tags', &mt('Output Tags')],  
  ['Authoring_Multilingual_Problems',   
  &mt('How to create problems in different languages')]  
  ];  
   
  my $help_structure = [];  
   
  foreach my $count (0..(scalar(@{$helpers})-1)) {  
  my $filename = $helpers->[$count]->[0];  
  my $title = $helpers->[$count]->[1];  
  my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');");  
  push @{$help_structure}, [$href, $title, undef];  
  }  
   
  return $help_structure;  
 }  
   
 # we need substitution to not break javascript code  
 sub convert_for_js {  
     my $return = shift;  
         $return =~ s|script|ESCAPEDSCRIPT|g;  
         $return =~ s|\\|\\\\|g;  
         $return =~ s|\n|\\r\\n|g;  
         $return =~ s|'|\\'|g;  
  $return =~ s|&#39;|\\&#39;|g;  
     return $return;  
 }  
   
 sub problem_edit_header {  sub problem_edit_header {
     my ($mode)=@_;      my ($mode)=@_;
     my $return = '<input type="hidden" name="submitted" value="edit" />'.      my $return = '<input type="hidden" name="submitted" value="edit" />'.
Line 917  sub problem_edit_header { Line 873  sub problem_edit_header {
         '<input type="hidden" name="problemmode" value="saveedit" />'.          '<input type="hidden" name="problemmode" value="saveedit" />'.
         &problem_edit_buttons();          &problem_edit_buttons();
   
     $return.='<hr style="clear:both;visibility:hidden;" />      $return .= '</div></div>' . &Apache::lonxml::message_location();
     </div></div>'  
     .&Apache::lonxml::message_location();  
     $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />      $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />
     <script type="text/javascript" src="/adm/codemirror/codemirror-compressed-colorful.js"></script>';      <script type="text/javascript" src="/adm/codemirror/codemirror-compressed-colorful.js"></script>';
   
Line 932  sub problem_edit_header { Line 886  sub problem_edit_header {
                         $(\'.LC_edit_actionbar\').scrollToFixed(                          $(\'.LC_edit_actionbar\').scrollToFixed(
                             {                              {
                                 fixed: function(){                                  fixed: function(){
                                     $(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');                                      //$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');
                                       $(this).find(\'.LC_edit_actionbar\');
                                 }                                  }
                             }                              }
                         );                          );
Line 972  sub option { Line 927  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 1071  $show_all Line 1027  $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').'" />
      <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />       <button type="submit" name="resetdata" accesskey="r" value="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 1100  $show_all Line 1057  $show_all
    <hr />     <hr />
    <div>';     <div>';
     $result.='<input type="hidden" name="problemmode" value="view" />';      $result.='<input type="hidden" name="problemmode" value="view" />';
     $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.      if ($editors{'edit'}) {
                'onclick="javascript:setmode(this.form,'."'edit'".')" />';          $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
     $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.                     'onclick="javascript:setmode(this.form,'."'edit'".')" />';
                'onclick="javascript:setmode(this.form,'."'editxml'".')" />';      }
       if ($editors{'xml'}) {
           $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 $daxeurl = '/daxepage'.$uri;
           $result .= '<input type="button" accesskey="w" value="'.&mt('Edit with Daxe').'" '.
                      'onclick="javascript:setmode(this.form,'."'daxe'".')" />';
       }
     $result.='      $result.='
    </div>     </div>
    <hr />     <hr />
Line 1130  sub initialize_storage { Line 1098  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 &mt('Reset Submissions') ||   if ($env{'form.resetdata'} eq 'reset_submissions' ||
     ($env{'form.resetdata'} eq &mt('New Problem Variation')      ($env{'form.resetdata'} eq '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 1139  sub initialize_storage { Line 1107  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 1162  sub initialize_storage { Line 1130  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 1178  sub initialize_storage { Line 1146  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 1197  sub finalize_storage { Line 1165  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 1206  sub finalize_storage { Line 1176  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);              my ($laststore,$checkedparts,@parts,%postcorrect,%record);
             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';
                 }                  }
                 my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);                  %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 1292  sub finalize_storage { Line 1273  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 1301  sub finalize_storage { Line 1372  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 1406  sub store_aggregates { Line 1575  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 1435  sub store_aggregates { Line 1604  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.');
           } 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.');
               }
           }
           $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.').'\vskip 0 mm ';
           } else {
               $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg \\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 $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: $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',
Line 1480  sub firstaccess_msg { Line 1750  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 1518  sub init_problem_globals { Line 1790  sub init_problem_globals {
     @Apache::inputtags::importlist = ();      @Apache::inputtags::importlist = ();
     @Apache::inputtags::previous=();      @Apache::inputtags::previous=();
     @Apache::inputtags::previous_version=();      @Apache::inputtags::previous_version=();
       $Apache::inputtags::leniency='';
     $Apache::structuretags::printanswer='No';      $Apache::structuretags::printanswer='No';
     @Apache::structuretags::whileconds=();      @Apache::structuretags::whileconds=();
     @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 1533  sub reset_problem_globals { Line 1807  sub reset_problem_globals {
     undef(%Apache::lonhomework::history);      undef(%Apache::lonhomework::history);
     undef(%Apache::lonhomework::results);      undef(%Apache::lonhomework::results);
     undef($Apache::inputtags::part);      undef($Apache::inputtags::part);
       undef($Apache::inputtags::leniency);
     if ($type eq 'Task') {      if ($type eq 'Task') {
         undef($Apache::inputtags::slot_name);          undef($Apache::inputtags::slot_name);
     } elsif ($type eq 'problem') {      } elsif ($type eq 'problem') {
Line 1545  sub reset_problem_globals { Line 1820  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 1636  sub start_problem { Line 1912  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);      my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres);
   
     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");
             &Apache::lonnet::set_first_access($interval[1],$interval[0]);              my ($timelimit) = split(/_/,$interval[0]);
               my $is_set = &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) =  
             &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 1657  sub start_problem { Line 1934  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();
         my $navmap = Apache::lonnavmaps::navmap->new();          if ($symb ne '') {
         if (ref($navmap)) {              my $navmap = Apache::lonnavmaps::navmap->new();
             my $res = $navmap->getBySymb($symb);              if (ref($navmap)) {
             if (ref($res)) {                  my $res = $navmap->getBySymb($symb);
                 $probpartlist = $res->parts();                  if (ref($res)) {
                       $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,$ipused) =
               &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 1689  sub start_problem { Line 1990  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="'.
  $rndseed.'" />'.   $rndseedval.'" />'.
     '<input type="submit" name="resetdata"      '<button type="submit" name="resetdata"
                              value="'.&mt('New Problem Variation').'" />';                          value="new_problem_variation">'.&mt('New Problem Variation').'</button>';
     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 1716  sub start_problem { Line 2020  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") &&          }
                  ($Apache::lonhomework::type eq 'randomizetry') &&          if (($env{'request.state'} ne "construct") &&
                  ($status eq 'CAN_ANSWER')) {              ($Apache::lonhomework::type eq 'randomizetry') &&
             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");              ($status eq 'CAN_ANSWER') &&
             my $problemstatus = &get_problem_status($Apache::inputtags::part);              ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') &&
             $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);              (!$env{'request.role.adv'})) {
   # "New Problem Variation Each Try" header suppressed for Placement Tests, unless course personnel. 
               my @parts;
               if (ref($probpartlist) eq 'ARRAY') {
                   @parts = @{$probpartlist};
               }
               unless (@parts) {
                   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 1738  sub start_problem { Line 2052  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 ( $target eq "web" ) {              if (($status eq 'NOT_YET_VIEWED') && ($firstaccres)) {
  my $msg;                  $result .= '<p class="LC_error">'.
  if ($status eq 'UNAVAILABLE') {                             &mt('A problem occurred when trying to start the timer.').'</p>';
     $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') {              $result .= &access_status_msg('problem',$status,$symb,$target,$ipused,$accessmsg);
                     $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.');    
  }  
  $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);
     if ($target eq 'web') {              $result .= &checkin_prompt($target,$slot_name,$slot,'problem');
  $result .=   
     &Apache::bridgetask::proctor_validation_screen($slot);  
     } elsif ($target eq 'grade') {  
  &Apache::bridgetask::proctor_check_auth($slot_name,$slot,  
  'problem');  
     }  
  } 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 '') {
                     my $checked_in =                      $resource_due = &selfcheckin_resource($resource_due,$slot_name,$slot,
                         $Apache::lonhomework::history{'resource.0.checkedin'};                                                            $env{'request.symb'});
                     if ($checked_in eq '') {  
                         # unproctored slot access, self checkin  
                         &Apache::bridgetask::check_in('problem',undef,undef,  
                                                       $slot_name);  
                         $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 1828  sub start_problem { Line 2083  sub start_problem {
       '<input type="hidden" name="submitted" value="yes" />';        '<input type="hidden" name="submitted" value="yes" />';
     # create a page header and exit      # create a page header and exit
     if ($env{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  $result.= &problem_web_to_edit_header($env{'form.rndseed'});                  if ($env{'form.inhibitmenu'} eq 'yes') {
                       # error messages can be useful in any case
                       $result.= &Apache::lonxml::message_location();
                   } else {
       $result.= &problem_web_to_edit_header($env{'form.rndseed'});
                   }
                 if ($Apache::lonhomework::type eq 'practice') {                  if ($Apache::lonhomework::type eq 'practice') {
                     $result.= '<input type="submit" name="resetdata" '.                      $result.= '<button type="submit" name="resetdata" '.
                               'value="'.&mt('New Problem Variation').'" />'.                          'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                               &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 1854  sub start_problem { Line 2118  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 1975  sub end_problem { Line 2237  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 2014  sub end_problem { Line 2282  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 2034  sub end_problem { Line 2334  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 2051  sub end_problem { Line 2368  sub end_problem {
     @Apache::inputtags::response=();      @Apache::inputtags::response=();
     $result=&Apache::response::mandatory_part_meta;      $result=&Apache::response::mandatory_part_meta;
  }   }
  $result.=&Apache::response::meta_part_order();   $result.=&Apache::response::meta_part_order('problem');
  $result.=&Apache::response::meta_response_order();   $result.=&Apache::response::meta_response_order();
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  &Apache::lonxml::debug("in end_problem with $target, edit");   &Apache::lonxml::debug("in end_problem with $target, edit");
Line 2072  sub end_problem { Line 2389  sub end_problem {
     # computation:      # computation:
     #      #
     if ($target eq 'web') {      if ($target eq 'web') {
         $result .= &Apache::lonhtmlcommon::set_compute_end_time();          $result .= &Apache::lonhtmlcommon::dash_to_minus_js().
                      &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 2111  sub start_library { Line 2429  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.= '<input type="submit" name="resetdata" '.              $result.= '<button type="submit" name="resetdata" '.
                       'value="'.&mt('New Problem Variation').'" />'.                  'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                       &practice_problem_header().'<hr />';                  &practice_problem_header().'<hr />';
         }          }
     }      }
     return $result;      return $result;
Line 2128  sub end_library { Line 2446  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_part_order('library');
           $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 2610  sub start_randomlist { Line 2931  sub start_randomlist {
  }   }
  if (@randomlist) {   if (@randomlist) {
     my @idx_arr = (0 .. $#randomlist);      my @idx_arr = (0 .. $#randomlist);
     &Apache::structuretags::shuffle(\@idx_arr);              if ($env{'form.code_for_randomlist'}) {
                   &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 2649  sub start_randomlist { Line 2975  sub start_randomlist {
 }  }
   
 sub shuffle {  sub shuffle {
     my $a=shift;      my ($a,$target) = @_;
     my $i;      my $i;
     if (ref($a) eq 'ARRAY' && @$a) {      if (ref($a) eq 'ARRAY' && @$a) {
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber(undef,$target);
  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 2736  sub start_part { Line 3062  sub start_part {
     my $id= &Apache::lonxml::get_id($parstack,$safeeval);      my $id= &Apache::lonxml::get_id($parstack,$safeeval);
     $Apache::inputtags::part=$id;      $Apache::inputtags::part=$id;
     push(@Apache::inputtags::partlist,$id);      push(@Apache::inputtags::partlist,$id);
       $Apache::inputtags::leniency='';
     @Apache::inputtags::response=();      @Apache::inputtags::response=();
     @Apache::inputtags::previous=();      @Apache::inputtags::previous=();
     @Apache::inputtags::previous_version=();      @Apache::inputtags::previous_version=();
Line 2750  sub start_part { Line 3077  sub start_part {
         if (($target eq 'grade') && &Apache::response::submitted()) {          if (($target eq 'grade') && &Apache::response::submitted()) {
             $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;              $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;
         }          }
       } elsif (@Apache::inputtags::partlist > 1) {
           my $prevparttype = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[-2].type");
           if ($prevparttype eq 'randomizetry') {
               my $rndseed=&setup_rndseed($safeeval,$target,'',$prevparttype);
               if (($target eq 'grade') && &Apache::response::submitted()) {
                   $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;
               }
           }
     } elsif (($target eq 'grade') && &Apache::response::submitted()) {      } elsif (($target eq 'grade') && &Apache::response::submitted()) {
         $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed;          $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed;
     }      }
Line 2825  sub start_part { Line 3160  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 ($probrandomize eq 'randomizetry') {                          if ((($Apache::lonhomework::default_type eq 'randomizetry') || 
                             if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {                              ($Apache::lonhomework::randomizetrypart)) &&
                                 $result .= &randomizetry_part_header($problemstatus,'none',$num);                              ($Apache::lonhomework::type ne 'randomizetry')) {
                             } else {                              $result .= &randomizetry_part_header($problemstatus,'none',$num);
                                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");                          } elsif ($Apache::lonhomework::type eq 'randomizetry') {
                                 if ($probrandtries ne $reqtries) {                              $Apache::lonhomework::randomizetrypart = 1;
                                     $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);                              my $reqtries = &Apache::lonnet::EXT("resource.$id.randomizeontries");
                                 }  
                             }  
                         } 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 2893  sub end_part { Line 3222  sub end_part {
     $gradestatus='';      $gradestatus='';
  }   }
  $result.=$gradestatus;   $result.=$gradestatus;
  if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';}    if ($$tagstack[-2] eq 'td' and $target eq 'tex') {
               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 2901  sub end_part { Line 3234  sub end_part {
     }      }
     pop @Apache::inputtags::status;      pop @Apache::inputtags::status;
     $Apache::inputtags::part='';      $Apache::inputtags::part='';
       $Apache::inputtags::leniency='';
     $Apache::lonhomework::type = $Apache::lonhomework::default_type;      $Apache::lonhomework::type = $Apache::lonhomework::default_type;
     return $result;      return $result;
 }  }
Line 3056  sub end_startouttext { Line 3390  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.'">';
  .&Apache::lonhtmlcommon::dragmath_button($areaid,1)   if (&Apache::loncommon::nocodemirror()) {
  .'</span></td>'      $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);
    } else {
       $result.='&nbsp;';
    }
    $result.='</span></td>'
  .'<td>'   .'<td>'
  .&Apache::edit::insertlist($target,$token)   .&Apache::edit::insertlist($target,$token)
  .'</td>'   .'</td>'
Line 3147  sub end_simpleeditbutton { Line 3485  sub end_simpleeditbutton {
 }  }
   
 sub practice_problem_header {  sub practice_problem_header {
     return '<span class="LC_info"><h3>'.&mt('Practice Problem').'</h3></span>'.      return '<h3 class="LC_info">'.&mt('Practice Problem').'</h3>'.
            '<span class="LC_info">'.&mt('Submissions are not permanently recorded').             '<span class="LC_info">'.&mt('Submissions are not permanently recorded').
            '</span>';             '</span>';
 }  }
   
 sub randomizetry_problem_header {  sub randomizetry_problem_header {
     my ($problemstatus,$reqtries) = @_;      my ($problemstatus,$reqtries,$symb) = @_;
     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 3173  sub randomizetry_problem_header { Line 3511  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.');
         }          }
     }      }
     return '<span class="LC_info"><h3>'.$header.'</h3></span>'.      if (($env{'request.state'} eq "construct") || ($symb eq '')) {
            '<span class="LC_info">'.$text.'</span><hr />';          return '<div class="LC_info" id="LC_randomizetry_header" style="display:none">'.
                  '<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 3182  sub randomizetry_part_header { Line 3525  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 no new variation after a try.');          $text = &mt('For this question there will be 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') ||
Line 3204  sub randomizetry_part_header { Line 3547  sub randomizetry_part_header {
     if ($num > 1) {      if ($num > 1) {
         $output .= '<hr />';          $output .= '<hr />';
     }      }
     $output .=  '<span class="LC_info"><h4>'.$header.'</h4></span>'.      $output .=  '<h4 class="LC_info">'.$header.'</h4>'.
                   '<span class="LC_info">'.$text.'</span><br /><br />';                    '<span class="LC_info">'.$text.'</span><br /><br />';
     return $output;      return $output;
 }  }

Removed from v.1.530  
changed lines
  Added in v.1.584


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