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

version 1.524, 2014/11/24 02:36:26 version 1.550, 2016/09/14 02:42:43
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 = &Apache::loncommon::course_type();
           if ($crstype eq 'Community') {
               $crstype = 'community';
           } elsif ($crstype eq 'Placement') {
               $crstype = 'placement'; 
           } else {
               if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {
                   $crstype = 'official';
               } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) {
                   $crstype = 'textbook';
               } else {
                   $crstype = 'unofficial';
               }
           }
           $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'};
           if ($postsubmit eq '') {
               my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
               $postsubmit = $domdefs{'postsubmit'};
               unless ($postsubmit eq 'off') {
                   $timeout = $domdefs{$crstype.'postsubtimeout'};
               }
           } elsif ($postsubmit eq '0') {
               $postsubmit = 'off';
           } elsif ($postsubmit eq '1') {
               $postsubmit = 'on';
               $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'};
               if ($timeout eq '') {
                   my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                   $timeout = $domdefs{$crstype.'postsubtimeout'};
               }
           }
           if ($timeout eq '') {
               $timeout = 60;
           }
       } else {
           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
           $postsubmit = $domdefs{'postsubmit'};
           unless ($postsubmit eq 'off') {
               $timeout = 60;
           }
       }
       my $jstimeout = 0;
       if ($timeout) {
           $jstimeout = 1000 * $timeout;
       }
     return &Apache::loncommon::resize_textarea_js().      return &Apache::loncommon::resize_textarea_js().
                   &Apache::loncommon::colorfuleditor_js().
            &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 241  function setSubmittedPart (part,prefix) Line 289  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 257  function image_response_click (which, e) Line 316  function image_response_click (which, e)
   
 var submithandled = 0;  var submithandled = 0;
 var keypresshandled = 0;  var keypresshandled = 0;
   var postsubmit = '$postsubmit';
   
 $(document).ready(function(){  \$(document).ready(function(){
     if (postsubmit != 'off') {    
     $(document).keypress(function(event){      \$(document).keypress(function(event){
         var keycode = (event.keyCode ? event.keyCode : event.which);          var keycode = (event.keyCode ? event.keyCode : event.which);
         if ((keycode == '13') && (keypresshandled == 0)) {          if ((keycode == '13') && (keypresshandled == 0)) {
             if ( $( document.activeElement ).hasClass("LC_textline") ) {              if ( \$( document.activeElement ).hasClass("LC_textline") ) {
                 keypresshandled = 1;                  keypresshandled = 1;
                 var idsArray = $( document.activeElement ).attr("id").split(/HWVAL_/);                  var idsArray = \$( document.activeElement ).attr("id").split(/HWVAL_/);
                 if (idsArray.length) {                  if (idsArray.length) {
                     event.preventDefault();                      event.preventDefault();
                     var itemsArray = idsArray[1].split(/_/);                      var itemsArray = idsArray[1].split(/_/);
                     var buttonId = idsArray[0]+'submit_'+itemsArray[0];                      var buttonId = idsArray[0]+'submit_'+itemsArray[0];
                     $("#"+buttonId).trigger("click");                      \$("#"+buttonId).trigger("click");
                 }                  }
             }              }
         }          }
     });      });
   
     $(document).delegate('form :submit', 'click', function( event ) {      \$(document).delegate('form :submit', 'click', function( event ) {
         if ( $( this ).hasClass( "LC_hwk_submit" ) ) {          if ( \$( this ).hasClass( "LC_hwk_submit" ) ) {
             var buttonId = this.id;              var buttonId = this.id;
               var timeout = $jstimeout;
             if (submithandled == 0) {              if (submithandled == 0) {
                 submithandled = 1;                  submithandled = 1;
                 $( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",                  \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",
                                            "color": "black","padding": "2px"}) ;                                             "color": "black","padding": "2px"}) ;
                 if (( $(this.form).id == "LC_page" ) && ($('input[name="all_submit"]').length )) {                  if (( \$(this.form).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).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
                                              if (buttonId != "all_submit") {
                                                  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 340  sub page_start { Line 419  sub page_start {
     $extra_head .= &homework_js().      $extra_head .= &homework_js().
                    &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");                     &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
     if (&Apache::lonhtmlcommon::htmlareabrowser()) {      if (&Apache::lonhtmlcommon::htmlareabrowser()) {
         my %textarea_args = (          my %textarea_args;
           if (($env{'request.state'} ne 'construct') ||
               ($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;      my ($needs_upload,$partlist);
     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 364  sub page_start { Line 447  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 375  sub page_start { Line 464  sub page_start {
                     if (ref($mapres)) {                      if (ref($mapres)) {
                         $is_page = $mapres->is_page();                          $is_page = $mapres->is_page();
                     }                      }
                     unless ($is_page) {                      if ($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)) {
                             my $partlist = $res->parts();                              $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 400  sub page_start { Line 496  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 419  sub page_start { Line 517  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 428  sub page_start { Line 529  sub page_start {
     } elsif (!defined($found{'body'})       } elsif (!defined($found{'body'}) 
      && $env{'request.state'} eq 'construct') {       && $env{'request.state'} eq 'construct') {
  if ($target eq 'web' || $target eq 'edit') {   if ($target eq 'web' || $target eq 'edit') {
         # Breadcrumbs for Authoring Space              unless ($env{'form.inhibitmenu'} eq 'yes') {
         &Apache::lonhtmlcommon::clear_breadcrumbs();                  # Breadcrumbs for Authoring Space
         &Apache::lonhtmlcommon::add_breadcrumb({                  &Apache::lonhtmlcommon::clear_breadcrumbs();
             'text'  => 'Authoring Space',                  &Apache::lonhtmlcommon::add_breadcrumb({
             'href'  => &Apache::loncommon::authorspace($env{'request.uri'}),                      'text'  => 'Authoring Space',
         });                      'href'  => &Apache::loncommon::authorspace($env{'request.uri'}),
         # breadcrumbs (and tools) will be created                   });
         # in start_page->bodytag->innerregister                  # breadcrumbs (and tools) will be created 
                   # in start_page->bodytag->innerregister
   
 # FIXME Where are we?  # FIXME Where are we?
 #        &Apache::lonhtmlcommon::add_breadcrumb({  #                &Apache::lonhtmlcommon::add_breadcrumb({
 #            'text'  => 'Problem Editing', # 'Problem Testing'  #                    'text'  => 'Problem Editing', # 'Problem Testing'
 #            'href'  => '',  #                    'href'  => '',
 #        });  #               });
         $pageheader =&Apache::loncommon::head_subbox(                  $pageheader = &Apache::loncommon::head_subbox(
                 &Apache::loncommon::CSTR_pageheader());                                   &Apache::loncommon::CSTR_pageheader());
  }      }
           }
     } elsif (!defined($found{'body'})) {      } elsif (!defined($found{'body'})) {
  my %add_entries;   my %add_entries;
  my $background=&Apache::lonxml::get_param('background',$parstack,   my $background=&Apache::lonxml::get_param('background',$parstack,
Line 511  sub page_start { Line 614  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);      return ($page_start,$form_tag_start,$partlist);
 }  }
   
 #use Time::HiRes();  #use Time::HiRes();
Line 542  sub get_resource_name { Line 645  sub get_resource_name {
 }  }
   
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target)=@_;      my ($safeeval,$target,$probpartlist)=@_;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed);      my ($questiontype,$set_safespace,$rndseed);
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
Line 603  sub setup_rndseed { Line 706  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 = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};              my $partfortries = $Apache::inputtags::part;
               if (ref($probpartlist) eq 'ARRAY') {
                   if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) {
                       $partfortries = $probpartlist->[0];
                   }
               }
               my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"};
             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {              if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                 $curr_try ++;                  $curr_try ++;
             }              }
Line 611  sub setup_rndseed { Line 720  sub setup_rndseed {
                 $rndseed = $1;                  $rndseed = $1;
             }              }
             if ($curr_try) {              if ($curr_try) {
                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");                  my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {                  if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                     my $inc = int(($curr_try-1)/$reqtries);                      my $inc = int(($curr_try-1)/$reqtries);
                     $rndseed += $inc;                      $rndseed += $inc;
Line 621  sub setup_rndseed { Line 730  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 650  sub problem_edit_action_button { Line 762  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
    my $result='<div class="LC_edit_problem_discards">'.     $result .= '<div>'.
               &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);                &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);         $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);
        $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);         if ($env{'environment.nocodemirror'}) {
              $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 {
     return '<input type="hidden" name="submitted" value="edit" />'.      my ($mode)=@_;
       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').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'          '.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
 </div>'.          </div><div class="LC_edit_actionbar" id="actionbar">'.
 '<input type="hidden" name="problemmode" value="saveedit" />'.          '<input type="hidden" name="problemmode" value="saveedit" />'.
 &problem_edit_buttons().'          &problem_edit_buttons();
 <hr style="clear:both;" />  
 '.&Apache::lonxml::message_location().'      $return .= '</div></div>' . &Apache::lonxml::message_location();
 </div>      $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />
 '.      <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 846  $show_all Line 986  $show_all
                'onclick="javascript:setmode(this.form,'."'edit'".')" />';                 'onclick="javascript:setmode(this.form,'."'edit'".')" />';
     $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.      $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
                'onclick="javascript:setmode(this.form,'."'editxml'".')" />';                 'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
       if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
           my $uri = $env{'request.uri'};
           my $daxeurl = '/daxepage'.$uri;
           $result .= '<input type="button" value="'.&mt('Edit with Daxe').'" '.
                     'onclick="window.open(\''.$daxeurl.'\',\'_blank\');" />';
       }
     $result.='      $result.='
    </div>     </div>
    <hr />     <hr />
Line 881  sub initialize_storage { Line 1027  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 889  sub initialize_storage { Line 1035  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 1148  sub store_aggregates { Line 1294  sub store_aggregates {
             } else {              } else {
                 $anoncounter{$symb."\0".$part} = 1;                  $anoncounter{$symb."\0".$part} = 1;
             }              }
             my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};              my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}.'::'};
             if ($needsrelease) {                 if ($needsrelease) {
                 my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};                  my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
                 if ($curr_required eq '') {                  if ($curr_required eq '') {
                     &Apache::lonnet::update_released_required($needsrelease);                      &Apache::lonnet::update_released_required($needsrelease);
Line 1163  sub store_aggregates { Line 1309  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 1260  sub init_problem_globals { Line 1406  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=();
Line 1275  sub reset_problem_globals { Line 1422  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 1376  sub start_problem { Line 1526  sub start_problem {
     my $status;      my $status;
     my $accessmsg;      my $accessmsg;
     my $resource_due;      my $resource_due;
       my $ipused;
   
     my $name= &get_resource_name($parstack,$safeeval);      my $name= &get_resource_name($parstack,$safeeval);
     my ($result,$form_tag_start,$slot_name,$slot);      my ($result,$form_tag_start,$slot_name,$slot,$probpartlist);
   
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
         $target eq 'tex') {          $target eq 'tex') {
         if ($env{'form.markaccess'}) {          if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");              my @interval=&Apache::lonnet::EXT("resource.0.interval");
             &Apache::lonnet::set_first_access($interval[1],$interval[0]);              my ($timelimit) = split(/_/,$interval[0]);
               &Apache::lonnet::set_first_access($interval[1],$timelimit);
         }          }
   
         ($status,$accessmsg,$slot_name,$slot) =          ($status,$accessmsg,$slot_name,$slot,$ipused) =
             &Apache::lonhomework::check_slot_access('0','problem');              &Apache::lonhomework::check_slot_access('0','problem');
         push (@Apache::inputtags::status,$status);          push (@Apache::inputtags::status,$status);
     }      }
   
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
  || $target eq 'edit') {   || $target eq 'edit') {
  ($result,$form_tag_start) =   ($result,$form_tag_start,$probpartlist) =
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
  $name);   $name);
       } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) {
           my ($symb)= &Apache::lonnet::whichuser();
           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 1406  sub start_problem { Line 1567  sub start_problem {
  $target eq 'tex') {   $target eq 'tex') {
   
  #handle rand seed in construction space   #handle rand seed in construction space
  my $rndseed=&setup_rndseed($safeeval,$target);   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;
                   }
               }
           }
  my ($symb)=&Apache::lonnet::whichuser();   my ($symb)=&Apache::lonnet::whichuser();
   
  if ($env{'request.state'} ne "construct" &&    if ($env{'request.state'} ne "construct" && 
Line 1436  sub start_problem { Line 1610  sub start_problem {
     $form_tag_start.='<hr />';      $form_tag_start.='<hr />';
         } elsif (($env{'request.state'} ne "construct") &&          } elsif (($env{'request.state'} ne "construct") &&
                  ($Apache::lonhomework::type eq 'randomizetry') &&                   ($Apache::lonhomework::type eq 'randomizetry') &&
                  ($status eq 'CAN_ANSWER')) {                   ($status eq 'CAN_ANSWER') &&
                    ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') &&
                    (!$env{'request.role.adv'})) {
   # "New Problem Variation Each Try" header suppressed for Placement Tests, unless course personnel. 
             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");              my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
             my $problemstatus = &get_problem_status($Apache::inputtags::part);              my $problemstatus = &get_problem_status($Apache::inputtags::part);
             $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);              $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);
Line 1456  sub start_problem { Line 1633  sub start_problem {
             ( $status eq 'NOTRESERVABLE') ||              ( $status eq 'NOTRESERVABLE') ||
             ( $status eq 'RESERVABLE') ||              ( $status eq 'RESERVABLE') ||
             ( $status eq 'RESERVABLE_LATER') ||              ( $status eq 'RESERVABLE_LATER') ||
     ( $status eq 'INVALID_ACCESS')) {      ( $status eq 'INVALID_ACCESS') ||
               ( $status eq 'NEED_DIFFERENT_IP')) {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
     if ( $target eq "web" ) {      if ( $target eq "web" ) {
Line 1489  sub start_problem { Line 1667  sub start_problem {
                               &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));                                &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
                 } elsif ($status eq 'NOTRESERVABLE') {                  } elsif ($status eq 'NOTRESERVABLE') {
                     $msg.=&mt('Not available to make a reservation.');                        $msg.=&mt('Not available to make a reservation.');  
  }   } elsif ($status eq 'NEED_DIFFERENT_IP') {
                       if ($ipused) {
                           $msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused");
                       } else {
                           $msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'<br />'.
                                 &mt('Somebody else has already used this particular computer for that purpose.');
                       }
                   }
  $result.=$msg.'<br />';   $result.=$msg.'<br />';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''   my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
Line 1509  sub start_problem { Line 1694  sub start_problem {
  $result .=    $result .= 
     &Apache::bridgetask::proctor_validation_screen($slot);      &Apache::bridgetask::proctor_validation_screen($slot);
     } elsif ($target eq 'grade') {      } elsif ($target eq 'grade') {
  &Apache::bridgetask::proctor_check_auth($slot_name,$slot,   my $checkinresult = &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
  'problem');                      'problem');
                   if ($checkinresult = /^error:/) {
                       $result .= 'error';
                   }
     }      }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER') {
Line 1520  sub start_problem { Line 1708  sub start_problem {
                         $Apache::lonhomework::history{'resource.0.checkedin'};                          $Apache::lonhomework::history{'resource.0.checkedin'};
                     if ($checked_in eq '') {                      if ($checked_in eq '') {
                         # unproctored slot access, self checkin                          # unproctored slot access, self checkin
                         &Apache::bridgetask::check_in('problem',undef,undef,                          my $needsiptied;
                                                       $slot_name);                          if (ref($slot)) {
                         $checked_in =                              $needsiptied = $slot->{'iptied'};
                             $Apache::lonhomework::results{"resource.0.checkedin"};                          }
                           my $check = &Apache::bridgetask::check_in('problem',undef,undef,
                                                                     $slot_name,$needsiptied);
                           if ($check =~ /^error: /) {
                               &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $env{'request.symb'}) using slot: $slot_name");
                           } else {
                               $checked_in =
                                   $Apache::lonhomework::results{"resource.0.checkedin"};
                           }
                     }                      }
                     if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {                      if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {
                         if ($slot->{'starttime'} < time()) {                          if ($slot->{'starttime'} < time()) {
Line 1546  sub start_problem { Line 1742  sub start_problem {
       '<input type="hidden" name="submitted" value="yes" />';        '<input type="hidden" name="submitted" value="yes" />';
     # create a page header and exit      # create a page header and exit
     if ($env{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  $result.= &problem_web_to_edit_header($env{'form.rndseed'});                  if ($env{'form.inhibitmenu'} eq 'yes') {
                       # error messages can be useful in any case
                       $result.= &Apache::lonxml::message_location();
                   } else {
       $result.= &problem_web_to_edit_header($env{'form.rndseed'});
                   }
                 if ($Apache::lonhomework::type eq 'practice') {                  if ($Apache::lonhomework::type eq 'practice') {
                     $result.= '<input type="submit" name="resetdata" '.                      $result.= '<input type="submit" name="resetdata" '.
                               'value="'.&mt('New Problem Variation').'" />'.                                'value="'.&mt('New Problem Variation').'" />'.
Line 1614  sub end_problem { Line 1815  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 1732  sub end_problem { Line 1933  sub end_problem {
                 # Added separately at end of this routine, after added                  # Added separately at end of this routine, after added
                 # <script></script> so document will be valid xhtml.                  # <script></script> so document will be valid xhtml.
                 #                  #
  $result.= &Apache::loncommon::end_page({'discussion' => 1,                  my $showdisc = 1;
                   if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
                       (!$env{'request.role.adv'})) { 
   # For Placement Tests footer with "Post Discussion" and "Send Feedback" links is suppressed.
                       $showdisc = 0;
                       my ($symb)= &Apache::lonnet::whichuser();
                       if ($symb) {
                           my $navmap = Apache::lonnavmaps::navmap->new();
                           if (ref($navmap)) {
                               my $hastries = &Apache::lonplacementtest::has_tries($symb,$navmap);  
   # For Placement Tests test status is displayed if this is the last resource in the course
   # and there are no tries left
                               unless ($hastries) {
                                   if (&Apache::lonplacementtest::is_lastres($symb,$navmap)) {
                                       my ($score,$incomplete) = 
                                           &Apache::lonplacementtest::check_completion(undef,undef,1);
                                       if (!$incomplete) {
                                           $result .= &Apache::lonplacementtest::showresult(1,1);
                                       } elsif ($incomplete < 100) { 
                                           $result.= &Apache::lonplacementtest::showincomplete($incomplete,1);
                                       }
                                   } else {
   # For Placement Tests score is displayed if test has just been completed
                                       my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1);
                                       if (!$incomplete) {
                                           $result.= &Apache::lonplacementtest::showresult(1,1);
                                       }
                                   }
                               }
                           }
                       }
                   }
    $result.= &Apache::loncommon::end_page({'discussion' => $showdisc,
  'notbody'    => 1});   'notbody'    => 1});
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $endminipage = '';   my $endminipage = '';
Line 2348  sub start_randomlist { Line 2581  sub start_randomlist {
                     }                      }
                 }                  }
             }              }
     for(0 .. $show) {      for my $i (0 .. $show) {
  $bodytext .= "$randomlist[ $idx_arr[$_] ]";   $bodytext .= "$randomlist[ $idx_arr[$i] ]";
     }      }
     &Apache::lonxml::newparser($parser,\$bodytext);      &Apache::lonxml::newparser($parser,\$bodytext);
  }   }
Line 2454  sub start_part { Line 2687  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 2463  sub start_part { Line 2697  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 2513  sub start_part { Line 2755  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 2611  sub end_part { Line 2853  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 2761  sub end_startouttext { Line 3004  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>".&mt('Text Block')."</td>"          $result.=&Apache::edit::start_table($token)."<tr><td>".&Apache::loncommon::insert_folding_button()
                    ." ".&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.'">';
  .&Apache::lonhtmlcommon::dragmath_button($areaid,1)   if ($env{'environment.nocodemirror'}) {
  .'</span></td>'      $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);
    } else {
       $result.='&nbsp;';
    }
    $result.='</span></td>'
  .'<td>'   .'<td>'
  .&Apache::edit::insertlist($target,$token)   .&Apache::edit::insertlist($target,$token)
  .'</td>'   .'</td>'

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


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