Diff for /loncom/homework/structuretags.pm between versions 1.512.2.24.2.1 and 1.513

version 1.512.2.24.2.1, 2022/01/01 16:09:10 version 1.513, 2013/06/04 22:20:24
Line 63  use Apache::londefdef; Line 63  use Apache::londefdef;
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::loncommon();  use Apache::loncommon();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use HTML::Entities();  
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
Line 225  sub end_tex { Line 224  sub end_tex {
 }  }
   
 sub homework_js {  sub homework_js {
     my ($postsubmit,$timeout);  
     if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {  
         my $crstype;  
         if (&Apache::loncommon::course_type() eq 'Community') {  
             $crstype = 'community';  
         } 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().  
            &setmode_javascript().             &setmode_javascript().
  <<"JS";   <<'JS';
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function setSubmittedPart (part,prefix) {  function setSubmittedPart (part,prefix) {
Line 288  function setSubmittedPart (part,prefix) Line 241  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 312  function image_response_click (which, e) Line 254  function image_response_click (which, e)
     input_element.value = click;      input_element.value = click;
     img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;      img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;
 }  }
   
 var submithandled = 0;  
 var keypresshandled = 0;  
 var postsubmit = '$postsubmit';  
   
 \$(document).ready(function(){  
   if (postsubmit != 'off') {  
     \$(document).keypress(function(event){  
         var keycode = (event.keyCode ? event.keyCode : event.which);  
         if ((keycode == '13') && (keypresshandled == 0)) {  
             if ( \$( document.activeElement ).hasClass("LC_textline") ) {  
                 keypresshandled = 1;  
                 var idsArray = \$( document.activeElement ).attr("id").split(/HWVAL_/);  
                 if (idsArray.length) {  
                     event.preventDefault();  
                     var itemsArray = idsArray[1].split(/_/);  
                     var buttonId = idsArray[0]+'submit_'+itemsArray[0];  
                     \$("#"+buttonId).trigger("click");  
                 }  
             }  
         }  
     });  
   
     \$(document).delegate('form :submit', 'click', function( event ) {  
         if ( \$( this ).hasClass( "LC_hwk_submit" ) ) {  
             var buttonId = this.id;  
             var timeout = $jstimeout;  
             if (submithandled == 0) {  
                 submithandled = 1;  
                 \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",  
                                            "color": "black","padding": "2px"}) ;  
                 if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {  
                     if (buttonId != "all_submit") {  
                         \$( ".LC_status_"+buttonId ).hide();  
                     }  
                     if (( "#"+buttonId+"_pressed" ).length) {  
                         \$( "#"+buttonId+"_pressed" ).val( "1" );  
                     }  
                 } else {  
                     \$( ".LC_status_"+buttonId ).hide();  
                 }  
                 \$(this.form).submit();  
                 \$( ".LC_hwk_submit" ).prop( "disabled", true);  
                 \$( ".LC_textline" ).prop( "readonly", "readonly");  
                 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;  
             }  
         }  
     });  
   }  
 });  
   
 // ]]>  // ]]>
 </script>  </script>
 JS  JS
Line 389  sub setmode_javascript { Line 264  sub setmode_javascript {
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function setmode(form,probmode) {  function setmode(form,probmode) {
     var initial = form.problemmode.value;  
     form.problemmode.value = probmode;      form.problemmode.value = probmode;
     form.submit();      form.submit();
     form.problemmode.value = initial;  
 }  }
 // ]]>  // ]]>
 </script>  </script>
Line 418  sub page_start { Line 291  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') ||  
             ($env{'environment.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$/);
     my ($needs_upload,$partlist);      my $needs_upload;
     my ($symb)= &Apache::lonnet::whichuser();      my ($symb)= &Apache::lonnet::whichuser();
     my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);      my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
     if ($is_task) {      if ($is_task) {
Line 446  sub page_start { Line 315  sub page_start {
                     unless ($is_page) {                      unless ($is_page) {
                         $needs_upload = 1;                          $needs_upload = 1;
                     }                      }
                     if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) {  
                         my $res = $navmap->getBySymb($symb);  
                         if (ref($res)) {  
                             $partlist = $res->parts();  
                         }  
                     }  
                 }                  }
             }              }
         } else {          } else {
Line 463  sub page_start { Line 326  sub page_start {
                     if (ref($mapres)) {                      if (ref($mapres)) {
                         $is_page = $mapres->is_page();                          $is_page = $mapres->is_page();
                     }                      }
                     if ($is_page) {                      unless ($is_page) {
                         if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) {  
                             my $res = $navmap->getBySymb($symb);  
                             if (ref($res)) {  
                                 $partlist = $res->parts();  
                             }  
                         }  
                     } else {  
                         my $res = $navmap->getBySymb($symb);                          my $res = $navmap->getBySymb($symb);
                         if (ref($res)) {                          if (ref($res)) {
                             $partlist = $res->parts();                              my $partlist = $res->parts();
                             if (ref($partlist) eq 'ARRAY') {                              if (ref($partlist) eq 'ARRAY') {
                                 foreach my $part (@{$partlist}) {                                  foreach my $part (@{$partlist}) {
                                     my @types = $res->responseType($part);                                      my @types = $res->responseType($part);
Line 495  sub page_start { Line 351  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 516  sub page_start { Line 370  sub page_start {
  "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".   "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
  &Apache::loncommon::browser_and_searcher_javascript().   &Apache::loncommon::browser_and_searcher_javascript().
                 "\n</script>\n";                  "\n</script>\n";
             if ($target eq 'edit') {  
                 $extra_head .= &Apache::edit::js_update_linknum();  
             }  
  }   }
     }      }
   
Line 563  sub page_start { Line 414  sub page_start {
         $body_args{'add_entries'}    = \%add_entries;          $body_args{'add_entries'}    = \%add_entries;
         if ( $env{'request.state'} eq   'construct') {          if ( $env{'request.state'} eq   'construct') {
             $body_args{'only_body'}  = 1;              $body_args{'only_body'}  = 1;
         } elsif ($target eq 'web') {  
             $body_args{'print_suppress'} = 1;  
         }          }
     }      }
     $body_args{'no_auto_mt_title'} = 1;      $body_args{'no_auto_mt_title'} = 1;
Line 611  sub page_start { Line 460  sub page_start {
  "\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";   "\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";
  }   }
     }      }
     return ($page_start,$form_tag_start,$partlist);      return ($page_start,$form_tag_start);
 }  }
   
 #use Time::HiRes();  #use Time::HiRes();
Line 642  sub get_resource_name { Line 491  sub get_resource_name {
 }  }
   
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target,$probpartlist)=@_;      my ($safeeval,$target)=@_;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);      my ($questiontype,$set_safespace,$rndseed);
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
         $questiontype = $env{'form.grade_questiontype'};          $questiontype = $env{'form.grade_questiontype'};
     }      }
     unless (defined($questiontype)) {      unless (defined($questiontype)) {
         $questiontype = $Apache::lonhomework::type;          $questiontype = $Apache::lonhomework::type;
     }      }
     if ($Apache::lonhomework::type eq 'randomizetry') {      if ($env{'request.state'} eq "construct" 
         my $partfortries = $Apache::inputtags::part;   || $symb eq '' 
 #   || $Apache::lonhomework::type eq 'practice'
 # Where question type is "randomizetry" for a problem containing   || $Apache::lonhomework::history{'resource.CODE'}) {
 # a single part (and unless type is explicitly set to not be  
 # "randomizetry" for that part), the number of tries used to  
 # determine randomization will be for that part, and randomization  
 # from calls to &random() in a perl script block before the part tag,  
 # will change based on the number of tries, and value of the  
 # "randomizeontries" parameter in effect for the single part.  
 #  
         if (ref($probpartlist) eq 'ARRAY') {  
             if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) {  
                 if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') {  
                     $partfortries = $probpartlist->[0];  
                 } else {  
                     $partfortries = '';  
                 }  
             }  
         }  
         if ($partfortries ne '') {  
             $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"};  
             $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");  
         }  
     }  
     if (($env{'request.state'} eq "construct")   
         || ($symb eq '')  
         || ($Apache::lonhomework::type eq 'practice')  
         || ($Apache::lonhomework::history{'resource.CODE'})   
         || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) {  
  &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
  ['rndseed']);   ['rndseed']);
  $rndseed=$env{'form.rndseed'};   $rndseed=$env{'form.rndseed'};
Line 689  sub setup_rndseed { Line 512  sub setup_rndseed {
     if (!$rndseed) {      if (!$rndseed) {
  $rndseed=time;   $rndseed=time;
     }      }
             unless ($env{'form.code_for_randomlist'}) {      $env{'form.rndseed'}=$rndseed;
                 $env{'form.rndseed'}=$rndseed;  
             }  
  }   }
         if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&          if (($env{'request.state'} eq "construct") && 
             ($Apache::lonhomework::type eq 'randomizetry')) {              ($Apache::lonhomework::type eq 'randomizetry')) {
             if ($numtries) {              my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {              if ($tries) {
                     my $inc = int($numtries/$reqtries);                  $rndseed += $tries;
                     $rndseed += $inc;  
                 } else {  
                     $rndseed += $numtries;  
                 }  
             }              }
             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;              $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
         }          }
Line 723  sub setup_rndseed { Line 540  sub setup_rndseed {
        $rndseed=join(':',&Apache::lonnet::digest($rndseed));         $rndseed=join(':',&Apache::lonnet::digest($rndseed));
             }              }
         }          }
         if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) {          if ($Apache::lonhomework::history{'resource.CODE'}) {
             $env{'form.CODE'} = $env{'form.code_for_randomlist'};  
             $rndseed=&Apache::lonnet::rndseed();  
             undef($env{'form.CODE'});  
         } elsif ($Apache::lonhomework::history{'resource.CODE'}) {  
    $rndseed=&Apache::lonnet::rndseed();     $rndseed=&Apache::lonnet::rndseed();
  }   }
         $set_safespace = 1;          $set_safespace = 1;
Line 739  sub setup_rndseed { Line 552  sub setup_rndseed {
         }          }
         unless (($target eq 'analyze') && (defined($rndseed))) {          unless (($target eq 'analyze') && (defined($rndseed))) {
             $rndseed=&Apache::lonnet::rndseed();              $rndseed=&Apache::lonnet::rndseed();
             my $curr_try = $numtries;              my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {              if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                 $curr_try ++;                  $curr_try ++;
             }              }
Line 747  sub setup_rndseed { Line 560  sub setup_rndseed {
                 $rndseed = $1;                  $rndseed = $1;
             }              }
             if ($curr_try) {              if ($curr_try) {
                   my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.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 756  sub setup_rndseed { Line 570  sub setup_rndseed {
             }              }
         }          }
         $set_safespace = 1;          $set_safespace = 1;
         if ($target eq 'grade') {  
             $Apache::lonhomework::rawrndseed = $rndseed;  
         }  
     }      }
     if ($set_safespace) {      if ($set_safespace) {
         if ($safeeval) {          if ($safeeval) {
Line 788  sub problem_edit_action_button { Line 599  sub problem_edit_action_button {
   
 sub problem_edit_buttons {  sub problem_edit_buttons {
    my ($mode)=@_;     my ($mode)=@_;
 # Buttons that save  
    my $result = '<div style="float:right">';  
    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";  
 # Buttons that do not save  # Buttons that do not save
    $result .= '<div>'.     my $result='<div class="LC_edit_problem_discards">'.
               &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);         $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
        $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);
        if ($env{'environment.nocodemirror'}) {         $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
            $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);  
        }  
    } else {     } else {
        $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);         $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',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 problem_edit_header {  sub problem_edit_header {
     my ($mode)=@_;      return '<input type="hidden" name="submitted" value="edit" />'.
     my $return = '<input type="hidden" name="submitted" value="edit" />'.  
  &remember_problem_state('edit').'   &remember_problem_state('edit').'
         <div class="LC_edit_problem_header">  <div class="LC_edit_problem_header">
         <div class="LC_edit_problem_header_title">  <div class="LC_edit_problem_header_title">
         '.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'  '.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
          </div><div class="LC_edit_actionbar" id="actionbar">'.  </div>'.
          '<input type="hidden" name="problemmode" value="saveedit" />'.  '<input type="hidden" name="problemmode" value="saveedit" />'.
          &problem_edit_buttons();  &problem_edit_buttons().'
   <hr style="clear:both;" />
     $return .= '</div></div>' . &Apache::lonxml::message_location();  '.&Apache::lonxml::message_location().'
     $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />  </div>
     <script type="text/javascript" src="/adm/codemirror/codemirror-compressed-colorful.js"></script>';  '.
          '<table border="0" width="100%"><tr><td bgcolor="#F8F8F8">';
     $return .= '<script type="text/javascript" src="/adm/jQuery/addons/jquery-scrolltofixed.js"></script>  
         <script type="text/javascript">  
             // unless internet explorer  
             if (!(window.navigator.appName == "Microsoft Internet Explorer" && (document.documentMode || document.compatMode))){  
                 $(document).ready(  
                     function() {  
                         $(\'.LC_edit_actionbar\').scrollToFixed(  
                             {  
                                 fixed: function(){  
                                     //$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');  
                                     $(this).find(\'.LC_edit_actionbar\');  
                                 }  
                             }  
                         );  
                     }  
                 );  
             }  
         </script>  
         <table id="LC_edit_problem_colorful" border="0" width="100%"><tr><td bgcolor="#F8F8F8">';  
     return $return;  
 }  }
   
   
 sub problem_edit_footer {  sub problem_edit_footer {
     my $resource = $env{'request.ambiguous'};  
     return '</td></tr></table><br />      return '</td></tr></table><br />
 <div class="LC_edit_problem_footer">  <div class="LC_edit_problem_footer">
   <hr />'.    <hr />'.
 &problem_edit_buttons().'  &problem_edit_buttons().'
   <hr style="clear:both;" />    <hr style="clear:both;" />
   <script type="text/javascript">  
       restoreState("'.$resource.'");  
       restoreScrollPosition("'.$resource.'");  
   </script>  
 </div>  </div>
 '.  '.
     "\n</form>\n".&Apache::loncommon::end_page();      "\n</form>\n".&Apache::loncommon::end_page();
Line 928  sub problem_web_to_edit_header { Line 710  sub problem_web_to_edit_header {
 ".&mt("Problem Type:")."  ".&mt("Problem Type:")."
 <select name='problemtype'>  <select name='problemtype'>
   <option value=''></option>    <option value=''></option>
   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>    ".&option('exam'   ,'problemtype').&mt("Bubblesheet Exam Problem")."</option>
   ".&option('problem','problemtype').&mt("Homework Problem")."</option>    ".&option('problem','problemtype').&mt("Homework Problem")."</option>
   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>    ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
   ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>    ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>
Line 946  $show_all Line 728  $show_all
 <select name='problemstatus'>  <select name='problemstatus'>
   <option value=''></option>    <option value=''></option>
   ".&option('yes','problemstatus').&mt("Show Feedback")."</option>    ".&option('yes','problemstatus').&mt("Show Feedback")."</option>
   ".&option('no', 'problemstatus').&mt("Don't Show Incorrect/Correct Feedback")."</option>    ".&option('no', 'problemstatus').&mt("Don't Show Incorect/Correct Feedback")."</option>
   ".&option('no_feedback_ever', 'problemstatus').&mt("Don't Show Any Feedback")."</option>    ".&option('no_feedback_ever', 'problemstatus').&mt("Don't Show Any Feedback")."</option>
 </select>  </select>
 </span>  </span>
Line 1048  sub initialize_storage { Line 830  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 1056  sub initialize_storage { Line 838  sub initialize_storage {
     }      }
   
     #ignore error conditions      #ignore error conditions
     my ($temp)=keys(%Apache::lonhomework::history);      my ($temp)=keys %Apache::lonhomework::history ;
     if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }      if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
 }  }
   
Line 1064  sub initialize_storage { Line 846  sub initialize_storage {
   
 =item finalize_storage()  =item finalize_storage()
   
  Stores away the result hash to a student's environment;   Stores away the result has to a student's environment
  checks form.grade_ for specific values, otherwise stores   checks form.grade_ for specific values, other wises stores
  to the running user's environment.   to the running users environment
    Will increment totals for attempts, students, and corrects
         &check_correctness_changes() is called in two circumstances   if running user has student role.
         in which the results hash is to be stored permanently, for  
         grading triggered by a student's submission, where feedback on  
         correctness is to be provided to the student.  
   
         1. Immediately prior to storing the results hash  
   
         To handle the case where a student's submission (and award) were  
         stored after history was retrieved in &initialize_storage(), e.g.,  
         if a student submitted answers in quick succession (e.g., from  
         multiple tabs).  &Apache::inputtags::hidealldata() is called for  
         any parts with out-of-order storage (i.e., correct then incorrect,  
         where awarded >= 1 when correct).  
   
         2. Immediately after storing the results hash  
   
         To handle the case where lond on the student's homeserver returns  
         delay:N -- where N is the number of transactions between the last  
         retrieved in &initialize_storage() and the last stored immediately  
         before permanent storage of the current transaction via  
         lond::store_handler().  &Apache::grades::makehidden() is called  
         for any parts with out-of-order storage (i.e., correct then incorrect,  
         where awarded >= 1 when correct).  
   
  Will call &store_aggregates() to increment totals for attempts,   
  students, and corrects, if running user has student role.  
   
 =cut  =cut
   
Line 1115  sub finalize_storage { Line 872  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);  
             if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&  
                 (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&  
                 (!defined($env{'form.grade_courseid'}))) {  
                 if ($Apache::lonhomework::history{'version'}) {  
                     $laststore = $Apache::lonhomework::history{'version'}.'='.  
                                  $Apache::lonhomework::history{'timestamp'};  
                 } else {  
                     $laststore = '0=0';  
                 }  
                 my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);  
                 if ($record{'version'}) {  
                     my ($newversion,$oldversion,$oldtimestamp);  
                     if ($Apache::lonhomework::history{'version'}) {  
                         $oldversion = $Apache::lonhomework::history{'version'};  
                         $oldtimestamp = $Apache::lonhomework::history{'timestamp'};  
                     } else {  
                         $oldversion = 0;  
                         $oldtimestamp = 0;  
                     }  
                     if ($record{'version'} > $oldversion) {  
                         if ($record{'timestamp'} >= $oldtimestamp) {  
                             $laststore = $record{'version'}.'='.$record{'timestamp'};  
                             $newversion = $record{'version'} + 1;  
                             $checkedparts = 1;  
                             foreach my $key (keys(%Apache::lonhomework::results)) {  
                                 if ($key =~ /^resource\.([^\.]+)\.solved$/) {  
                                     my $part = $1;  
                                     if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') {  
                                         push(@parts,$part);  
                                     }  
                                 }  
                             }  
                             if (@parts) {  
                                 my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name,  
                                                                                \%record,\@parts,$newversion,  
                                                                                $oldversion);  
                                 if (@parts_to_hide) {  
                                     foreach my $part (@parts_to_hide) {  
                                         $postcorrect{$part} = 1;  
                                         &Apache::inputtags::hidealldata($part);  
                                     }  
                                 }  
                             }  
                         }  
                     }  
                 }  
             }  
     $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,      $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
     $symb,$courseid,$domain,$name,$laststore);      $symb,$courseid,$domain,$name);
             if ($result =~ /^delay\:(\d+)$/) {  
                 my $numtrans = $1;  
                 my ($oldversion) = split(/=/,$laststore);  
                 if ($numtrans) {  
                     my $newversion = $oldversion + 1 + $numtrans;  
                     my @possparts;  
                     if ($checkedparts) {  
                         foreach my $part (@parts) {  
                             unless ($postcorrect{$part}) {  
                                 push(@possparts,$part);  
                             }  
                         }  
                     } else {  
                         foreach my $key (keys(%Apache::lonhomework::results)) {  
                             if ($key =~ /^resource\.([^\.]+)\.solved$/) {  
                                 my $part = $1;  
                                 unless ($postcorrect{$part}) {  
                                     if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') {  
                                         push(@possparts,$part);  
                                     }  
                                 }  
                             }  
                         }  
                     }  
                     if (@possparts) {  
                         my %newrecord = &Apache::lonnet::restore($symb,$courseid,$domain,$name);  
                         my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name,  
                                                                        \%newrecord,\@possparts,$newversion,  
                                                                        $oldversion);  
                         if (@parts_to_hide) {  
                             my $partslist = join(',',@parts_to_hide);  
                             &Apache::grades::makehidden($newversion,$partslist,\%newrecord,$symb,$domain,$name,1);  
                         }  
                     }  
                 }  
             }  
     &Apache::lonxml::debug('Store return message:'.$result);      &Apache::lonxml::debug('Store return message:'.$result);
             &store_aggregates($symb,$courseid);              &store_aggregates($symb,$courseid);
  }   }
Line 1212  sub finalize_storage { Line 885  sub finalize_storage {
   
 =pod  =pod
   
 =item check_correctness_changes()  
   
         For all parts for which current results contain a solved status  
         of "incorrect_attempted", check if there was a transaction in which  
         solved was set to "correct_by_student" in the time since the last  
         transaction (retrieved when &initialize_storage() was called i.e.,  
         when &start_problem() was called), unless:  
         (a) questiontype parameter is set to survey or anonymous survey (+/- credit)  
         (b) problemstatus is set to no or no_feedback_ever  
         If such a transaction exists, and did not occur after "reset status"  
         by a user with grading privileges, then the current transaction is an  
         example of an out-of-order transaction (i.e., incorrect occurring after  
         correct).  Accordingly, the current transaction should be hidden.  
   
 =cut  
   
   
 sub check_correctness_changes {  
     my ($symb,$courseid,$domain,$name,$record,$parts,$newversion,$oldversion) = @_;  
     my @parts_to_hide;  
     unless ((ref($record) eq 'HASH') && (ref($parts) eq 'ARRAY')) {  
         return @parts_to_hide;  
     }  
     if (@{$parts}) {  
         my $usec;  
         if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&  
             ($env{'request.course.id'} eq $courseid)) {  
             $usec = $env{'request.course.sec'};  
         } else {  
             $usec = &Apache::lonnet::getsection($domain,$name,$courseid);  
         }  
         foreach my $id (@{$parts}) {  
             next if (($Apache::lonhomework::results{'resource.'.$id.'.type'} =~ /survey/) ||  
                      (&Apache::lonnet::EXT("resource.$id.problemstatus",$symb,  
                                            $domain,$name,$usec,undef,$courseid) =~ /^no/));  
             my $reset;  
             for (my $i=$newversion-1; $i>=$oldversion; $i--) {  
                 if (($record->{$i.':resource.'.$id.'.regrader'}) &&  
                     ($record->{$i.':resource.'.$id.'.tries'} eq '') &&  
                     ($record->{$i.':resource.'.$id.'.award'} eq '')) {  
                     $reset = 1;  
                 } elsif (($record->{$i.":resource.$id.solved"} eq 'correct_by_student') &&  
                          ($record->{$i.":resource.$id.awarded"} >= 1)) {  
                     unless ($reset) {  
                         push(@parts_to_hide,$id);  
                         last;  
                     }  
                 }  
             }  
         }  
     }  
     return @parts_to_hide;  
 }  
   
 =pod  
   
 item store_aggregates()  item store_aggregates()
   
  Sends hash of values to be incremented in nohist_resourcetracker.db   Sends hash of values to be incremented in nohist_resourcetracker.db
Line 1330  sub store_aggregates { Line 947  sub store_aggregates {
             }              }
         }          }
     }      }
     if (keys(%aggregate) > 0) {      if (keys (%aggregate) > 0) {
  &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,   &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
                             $cdomain,$cname);                              $cdomain,$cname);
     }      }
Line 1349  sub checkout_msg { Line 966  sub checkout_msg {
  'resource'=>'The resource needs to be checked out',   'resource'=>'The resource needs to be checked out',
  'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',   'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',
                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',                  'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                 'checkout'=>'Check out Exam for Viewing',                  'checkout'=>'Check out Bubblesheet Exam for Viewing',
  'checkout?'=>'Check out Exam?');   'checkout?'=>'Check out Bubblesheet Exam?');
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     return (<<ENDCHECKOUT);      return (<<ENDCHECKOUT);
 <h2>$lt{'resource'}</h2>  <h2>$lt{'resource'}</h2>
Line 1358  sub checkout_msg { Line 975  sub checkout_msg {
 <p class="LC_warning">$lt{'warning'}</p>  <p class="LC_warning">$lt{'warning'}</p>
 <form name="checkout" method="post" action="$uri">  <form name="checkout" method="post" action="$uri">
 <input type="hidden" name="doescheckout" value="yes" />  <input type="hidden" name="doescheckout" value="yes" />
 <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onclick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />  <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
 }  }
Line 1389  sub firstaccess_msg { Line 1006  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
     return $result;      return $result;
Line 1429  sub init_problem_globals { Line 1044  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 1446  sub reset_problem_globals { Line 1059  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') {  
         undef($Apache::lonhomework::rawrndseed);  
     }      }
 #don't undef this, lonhomework.pm takes care of this, we use this to   #don't undef this, lonhomework.pm takes care of this, we use this to 
 #detect if we try to do 2 problems in one file  #detect if we try to do 2 problems in one file
Line 1459  sub reset_problem_globals { Line 1069  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 1553  sub start_problem { Line 1162  sub start_problem {
     my $resource_due;      my $resource_due;
   
     my $name= &get_resource_name($parstack,$safeeval);      my $name= &get_resource_name($parstack,$safeeval);
     my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres);      my ($result,$form_tag_start,$slot_name,$slot);
   
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
         $target eq 'tex') {          $target eq 'tex') {
         if ($env{'form.markaccess'}) {          if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");              my @interval=&Apache::lonnet::EXT("resource.0.interval");
             my ($timelimit) = ($interval[0] =~ /^(\d+)/);              &Apache::lonnet::set_first_access($interval[1]);
             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) =          ($status,$accessmsg,$slot_name,$slot) =
Line 1573  sub start_problem { Line 1178  sub start_problem {
   
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
  || $target eq 'edit') {   || $target eq 'edit') {
  ($result,$form_tag_start,$probpartlist) =   ($result,$form_tag_start) =
     &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')) {  
         my ($symb)= &Apache::lonnet::whichuser();  
         if ($symb ne '') {  
             my $navmap = Apache::lonnavmaps::navmap->new();  
             if (ref($navmap)) {  
                 my $res = $navmap->getBySymb($symb);  
                 if (ref($res)) {  
                     $probpartlist = $res->parts();  
                 }  
             }  
         }  
     }      }
   
     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}      if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
Line 1595  sub start_problem { Line 1189  sub start_problem {
     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 $rndseed=&setup_rndseed($safeeval,$target);
             my $partorder=&Apache::lonnet::metadata($env{'request.uri'},'partorder');   my ($symb)=&Apache::lonnet::whichuser();
             if ($partorder ne '') {  
                 @{$probpartlist} = split(/,/,$partorder);  
             }  
         }  
  my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);  
         if (($target eq 'grade') && &Apache::response::submitted()) {  
             if ($Apache::lonhomework::type eq 'randomizetry') {  
                 $Apache::lonhomework::results{'resource.0.rndseed'}=$rndseed;  
             } else {  
                 my @parts;  
                 if (ref($probpartlist) eq 'ARRAY') {  
                     @parts = @{$probpartlist};  
                 }  
                 unless (@parts) {  
                     $Apache::lonhomework::results{'resource.0.rndseed'}=$Apache::lonhomework::rawrndseed;  
                 }  
             }  
         }  
   
  if ($env{'request.state'} ne "construct" &&    if ($env{'request.state'} ne "construct" && 
     ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {      ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
             my $rndseedval = $rndseed;  
             if (($symb eq '') && ($Apache::lonhomework::type eq 'randomizetry')) {  
                 $rndseedval = $env{'form.rndseed'};  
             }  
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
  $rndseedval.'" />'.   $rndseed.'" />'.
     '<input type="submit" name="resetdata"      '<input type="submit" name="resetdata"
                              value="'.&mt('New Problem Variation').'" />';                               value="'.&mt('New Problem Variation').'" />';
     if (exists($env{'form.username'})) {      if (exists($env{'form.username'})) {
Line 1647  sub start_problem { Line 1218  sub start_problem {
                 $form_tag_start.=&practice_problem_header();                  $form_tag_start.=&practice_problem_header();
             }              }
     $form_tag_start.='<hr />';      $form_tag_start.='<hr />';
         }          } elsif (($env{'request.state'} ne "construct") &&
         if (($env{'request.state'} ne "construct") &&                   ($Apache::lonhomework::type eq 'randomizetry') &&
             ($Apache::lonhomework::type eq 'randomizetry') &&                   ($status eq 'CAN_ANSWER')) {
             ($status eq 'CAN_ANSWER')) {              my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
             my @parts;              my $problemstatus = &get_problem_status($Apache::inputtags::part);
             if (ref($probpartlist) eq 'ARRAY') {              $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);
                 @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 1696  sub start_problem { Line 1260  sub start_problem {
  } elsif ($status eq 'UNCHECKEDOUT') {   } elsif ($status eq 'UNCHECKEDOUT') {
     $msg.=&checkout_msg();      $msg.=&checkout_msg();
  } elsif ($status eq 'NOT_YET_VIEWED') {   } elsif ($status eq 'NOT_YET_VIEWED') {
                     if ($firstaccres) {  
                         $msg .= '<p class="LC_error">'.  
                                 &mt('A problem occurred when trying to start the timer.').'</p>';  
                     }  
     $msg.=&firstaccess_msg($accessmsg,$symb);      $msg.=&firstaccess_msg($accessmsg,$symb);
  } elsif ($status eq 'NOT_IN_A_SLOT') {   } elsif ($status eq 'NOT_IN_A_SLOT') {
     $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");      $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
Line 1775  sub start_problem { Line 1335  sub start_problem {
                     $result.= '<input type="submit" name="resetdata" '.                      $result.= '<input type="submit" name="resetdata" '.
                               'value="'.&mt('New Problem Variation').'" />'.                                'value="'.&mt('New Problem Variation').'" />'.
                               &practice_problem_header().'<hr />';                                &practice_problem_header().'<hr />';
                 } elsif ($Apache::lonhomework::type eq 'randomizetry') {  
                     my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                     my $problemstatus = &get_problem_status($Apache::inputtags::part);  
                     $result.=&randomizetry_problem_header($problemstatus,$reqtries);  
                 }                  }
     }      }
     # if we are viewing someone else preserve that info      # if we are viewing someone else preserve that info
Line 1842  sub end_problem { Line 1398  sub end_problem {
  my $id = $Apache::inputtags::part;   my $id = $Apache::inputtags::part;
  my $weight = &Apache::lonnet::EXT("resource.$id.weight");   my $weight = &Apache::lonnet::EXT("resource.$id.weight");
  my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');   my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
  my @packages = split(/,/,$packages);   my @packages = split /,/,$packages;
  my $allow_print_points = 0;   my $allow_print_points = 0;
  foreach my $partial_key (@packages) {   foreach my $partial_key (@packages) {
     if ($partial_key=~m/^part_0$/) {      if ($partial_key=~m/^part_0$/) {
Line 1980  sub end_problem { Line 1536  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 2091  sub end_library { Line 1630  sub end_library {
      && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')        && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') 
      && $env{'request.state'} eq "construct") {       && $env{'request.state'} eq "construct") {
  $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});   $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
     } elsif ($target eq 'meta') {  
         $result.=&Apache::response::meta_response_order();  
     }      }
     if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {      if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
  &reset_problem_globals('library');   &reset_problem_globals('library');
Line 2520  sub end_while { Line 2057  sub end_while {
     }      }
     $return = &Apache::run::run($code,$safeeval);      $return = &Apache::run::run($code,$safeeval);
  }   }
         if ($error) {   if ($error) {
             &Apache::lonxml::error(      &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occurred while running &lt;while&gt; on line').' '.$line.'</pre>');
                 '<pre>'   }
                .&mt('Code ran too long. It ran for more than [_1] seconds.',  
                         $Apache::lonnet::perlvar{'lonScriptTimeout'})  
                .&mt('This occurred while running &lt;while&gt; on line [_1].',  
                         $line)  
                .'</pre>');  
         }  
     } elsif ($target eq "edit") {      } elsif ($target eq "edit") {
  $result.= &Apache::edit::tag_end($target,$token,'');   $result.= &Apache::edit::tag_end($target,$token,'');
     }      }
Line 2575  sub start_randomlist { Line 2106  sub start_randomlist {
  }   }
  if (@randomlist) {   if (@randomlist) {
     my @idx_arr = (0 .. $#randomlist);      my @idx_arr = (0 .. $#randomlist);
             if ($env{'form.code_for_randomlist'}) {      &Apache::structuretags::shuffle(\@idx_arr);
                 &Apache::structuretags::shuffle(\@idx_arr,$target);  
                 undef($env{'form.code_for_randomlist'});  
             } else {  
                 &Apache::structuretags::shuffle(\@idx_arr);  
             }  
     my $bodytext = '';      my $bodytext = '';
     my $show=$#randomlist;      my $show=$#randomlist;
     my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);      my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
Line 2600  sub start_randomlist { Line 2126  sub start_randomlist {
                     }                      }
                 }                  }
             }              }
     for my $i (0 .. $show) {      for(0 .. $show) {
  $bodytext .= "$randomlist[ $idx_arr[$i] ]";   $bodytext .= "$randomlist[ $idx_arr[$_] ]";
     }      }
     &Apache::lonxml::newparser($parser,\$bodytext);      &Apache::lonxml::newparser($parser,\$bodytext);
  }   }
Line 2619  sub start_randomlist { Line 2145  sub start_randomlist {
 }  }
   
 sub shuffle {  sub shuffle {
     my ($a,$target) = @_;      my $a=shift;
     my $i;      my $i;
     if (ref($a) eq 'ARRAY' && @$a) {      if (ref($a) eq 'ARRAY' && @$a) {
  &Apache::response::pushrandomnumber(undef,$target);   &Apache::response::pushrandomnumber();
  for($i=@$a;--$i;) {   for($i=@$a;--$i;) {
     my $j=int(&Math::Random::random_uniform() * ($i+1));      my $j=int(&Math::Random::random_uniform() * ($i+1));
     next if $i == $j;      next if $i == $j;
Line 2706  sub start_part { Line 2232  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 2716  sub start_part { Line 2241  sub start_part {
     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);      my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
     my $newtype=&Apache::lonnet::EXT("resource.$id.type");      my $newtype=&Apache::lonnet::EXT("resource.$id.type");
     if ($newtype) { $Apache::lonhomework::type=$newtype; }      if ($newtype) { $Apache::lonhomework::type=$newtype; }
     if ($Apache::lonhomework::type eq 'randomizetry') {  
         my $rndseed=&setup_rndseed($safeeval,$target);  
         if (($target eq 'grade') && &Apache::response::submitted()) {  
             $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;  
         }  
     } elsif (($target eq 'grade') && &Apache::response::submitted()) {  
         $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed;  
     }  
     my $in_order_show=&ordered_show_check();      my $in_order_show=&ordered_show_check();
     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';      my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';      $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
Line 2774  sub start_part { Line 2291  sub start_part {
     }      }
     my $weight = &Apache::lonnet::EXT("resource.$id.weight");      my $weight = &Apache::lonnet::EXT("resource.$id.weight");
     my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');      my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
     my @allkeys = split(/,/,$allkeys);      my @allkeys = split /,/,$allkeys;
     my $allow_print_points = 0;      my $allow_print_points = 0;
     foreach my $partial_key (@allkeys) {      foreach my $partial_key (@allkeys) {
  if ($partial_key=~m/^part_(.*)$/) {   if ($partial_key=~m/^part_(.*)$/) {
Line 2796  sub start_part { Line 2313  sub start_part {
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
                     if ($status eq 'CAN_ANSWER') {                      if ($status eq 'CAN_ANSWER') {
                         my $problemstatus = &get_problem_status($Apache::inputtags::part);                           my $problemstatus = &get_problem_status($Apache::inputtags::part); 
                           my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type");
                           my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries");
                         my $num = scalar(@Apache::inputtags::partlist)-1;                          my $num = scalar(@Apache::inputtags::partlist)-1;
                         if ((($Apache::lonhomework::default_type eq 'randomizetry') ||                          if ($probrandomize eq 'randomizetry') {
                              ($Apache::lonhomework::randomizetrypart)) &&                              if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {
                             ($Apache::lonhomework::type ne 'randomizetry')) {                                  $result .= &randomizetry_part_header($problemstatus,'none',$num);
                             $result .= &randomizetry_part_header($problemstatus,'none',$num);                              } else {
                         } elsif ($Apache::lonhomework::type eq 'randomizetry') {                                  my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                             $Apache::lonhomework::randomizetrypart = 1;                                  if ($probrandtries ne $reqtries) {
                             my $reqtries = &Apache::lonnet::EXT("resource.$id.randomizeontries");                                      $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                                   }
                               }
                           } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') {
                               my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                             $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);                              $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                         }                          }
                     }                      }
Line 2866  sub end_part { Line 2389  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 2974  sub start_problemtype { Line 2496  sub start_problemtype {
     ['hide','Hide']]      ['hide','Hide']]
    ,$token);     ,$token);
  $result .=&Apache::edit::checked_arg('When used as type(s):','for',   $result .=&Apache::edit::checked_arg('When used as type(s):','for',
      [ ['exam','Exam/Quiz Problem'],       [ ['exam','Bubblesheet Exam/Quiz Problem'],
        ['survey','Survey'],         ['survey','Survey'],
                                                ['surveycred','Survey (with credit)'],                                                 ['surveycred','Survey (with credit)'],
                                                ['anonsurvey','Anonymous Survey'],                                                 ['anonsurvey','Anonymous Survey'],
Line 3017  sub end_startouttext { Line 2539  sub end_startouttext {
     if ($target eq 'edit') {      if ($target eq 'edit') {
  my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth;   my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth;
  $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);   $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
         $result.=&Apache::edit::start_table($token)."<tr><td>".&Apache::loncommon::insert_folding_button()   $result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>"
                  ." ".&mt('Text Block')."</td>"  
                  .'<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 align="left"><span id="math_'.$areaid.'">'
  if ($env{'environment.nocodemirror'}) {   .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
     $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);   .'</span></td>'
  } else {  
     $result.='&nbsp;';  
  }  
  $result.='</span></td>'  
  .'<td>'   .'<td>'
  .&Apache::edit::insertlist($target,$token)   .&Apache::edit::insertlist($target,$token)
  .'</td>'   .'</td>'
          .'<td class="LC_edit_problem_latexhelper">' .           .'<td align="right" valign="top">' .
          &Apache::loncommon::helpLatexCheatsheet().           &Apache::loncommon::helpLatexCheatsheet().
  &Apache::edit::end_row().   &Apache::edit::end_row().
                  &Apache::edit::start_spanning_row()."\n".                   &Apache::edit::start_spanning_row()."\n".
Line 3123  sub practice_problem_header { Line 2640  sub practice_problem_header {
 }  }
   
 sub randomizetry_problem_header {  sub randomizetry_problem_header {
     my ($problemstatus,$reqtries,$symb) = @_;      my ($problemstatus,$reqtries) = @_;
     my ($header,$text);      my ($header,$text);
     if ($reqtries > 1) {      if ($reqtries > 1) {
         $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);
Line 3143  sub randomizetry_problem_header { Line 2660  sub randomizetry_problem_header {
             $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');              $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');
         }          }
     }      }
     if (($env{'request.state'} eq "construct") || ($symb eq '')) {      return '<span class="LC_info"><h3>'.$header.'</h3></span>'.
         return '<div class="LC_info" id="LC_randomizetry_header" style="display:none">'.             '<span class="LC_info">'.$text.'</span><hr />';
                '<h3>'.$header.'</h3><span class="LC_info">'.$text.'</span><hr /></div>';  
     } else {  
         return '<h3 class="LC_info">'.$header.'</h3>'.  
                '<span class="LC_info">'.$text.'</span><hr />';  
     }  
 }  }
   
 sub randomizetry_part_header {  sub randomizetry_part_header {
Line 3157  sub randomizetry_part_header { Line 2669  sub randomizetry_part_header {
     my ($header,$text);      my ($header,$text);
     if ($reqtries eq 'none') {      if ($reqtries eq 'none') {
         $header = &mt('No Question Variation');          $header = &mt('No Question Variation');
         $text = &mt('For this question there will be no new variation after a try.');          $text = &mt('For this question there will no new variation after a try.');
     } elsif ($reqtries > 1) {      } elsif ($reqtries > 1) {
         $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);
         if (($problemstatus eq 'no') ||          if (($problemstatus eq 'no') ||

Removed from v.1.512.2.24.2.1  
changed lines
  Added in v.1.513


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