Diff for /loncom/homework/structuretags.pm between versions 1.512.2.22 and 1.524

version 1.512.2.22, 2019/11/05 18:14:39 version 1.524, 2014/11/24 02:36:26
Line 224  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 287  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 314  function image_response_click (which, e) Line 257  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).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {                  if (( $(this.form).id == "LC_page" ) && ($('input[name="all_submit"]').length )) {
                     if (buttonId != "all_submit") {                      if (buttonId != "all_submit") {
                         \$( ".LC_status_"+buttonId ).hide();                          $( ".LC_status_"+buttonId ).hide();
                     }                          if (( "#"+buttonId+"_pressed" ).length) {
                     if (( "#"+buttonId+"_pressed" ).length) {                              $( "#"+buttonId+"_pressed" ).val( "1" );
                         \$( "#"+buttonId+"_pressed" ).val( "1" );                          }
                     }                      }
                 } else {                  } else {
                     \$( ".LC_status_"+buttonId ).hide();                      $( ".LC_status_"+buttonId ).hide();
                 }                  }
                 \$(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 388  sub setmode_javascript { Line 313  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 417  sub page_start { Line 340  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 445  sub page_start { Line 364  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 462  sub page_start { Line 375  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 494  sub page_start { Line 400  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 515  sub page_start { Line 419  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 610  sub page_start { Line 511  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 641  sub get_resource_name { Line 542  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 688  sub setup_rndseed { Line 563  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 722  sub setup_rndseed { Line 591  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 738  sub setup_rndseed { Line 603  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 746  sub setup_rndseed { Line 611  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 755  sub setup_rndseed { Line 621  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 787  sub problem_edit_action_button { Line 650  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 id="LC_edit_problem_colorful" 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 927  sub problem_web_to_edit_header { Line 761  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 1047  sub initialize_storage { Line 881  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 1055  sub initialize_storage { Line 889  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 1070  sub initialize_storage { Line 904  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 1086  sub initialize_storage { Line 920  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 1214  sub finalize_storage { Line 1048  sub finalize_storage {
 =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 1329  sub store_aggregates { Line 1163  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 1348  sub checkout_msg { Line 1182  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 1426  sub init_problem_globals { Line 1260  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 1443  sub reset_problem_globals { Line 1275  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 1456  sub reset_problem_globals { Line 1285  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 1550  sub start_problem { Line 1378  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 $is_set = &Apache::lonnet::set_first_access($interval[1],$interval[0]);              &Apache::lonnet::set_first_access($interval[1],$interval[0]);
             unless (($is_set eq 'ok') || ($is_set eq 'already_set')) {  
                 $firstaccres = $is_set;  
             }  
         }          }
   
         ($status,$accessmsg,$slot_name,$slot) =          ($status,$accessmsg,$slot_name,$slot) =
Line 1569  sub start_problem { Line 1394  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 1591  sub start_problem { Line 1405  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 1643  sub start_problem { Line 1434  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 1692  sub start_problem { Line 1476  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 1771  sub start_problem { Line 1551  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 1838  sub end_problem { Line 1614  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 1976  sub end_problem { Line 1752  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 2087  sub end_library { Line 1846  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 2571  sub start_randomlist { Line 2328  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 2596  sub start_randomlist { Line 2348  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 2615  sub start_randomlist { Line 2367  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 2702  sub start_part { Line 2454  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 2712  sub start_part { Line 2463  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 2770  sub start_part { Line 2513  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 2792  sub start_part { Line 2535  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 2862  sub end_part { Line 2611  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 2970  sub start_problemtype { Line 2718  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 3013  sub end_startouttext { Line 2761  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><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>'
Line 3119  sub practice_problem_header { Line 2862  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 3139  sub randomizetry_problem_header { Line 2882  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 {

Removed from v.1.512.2.22  
changed lines
  Added in v.1.524


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