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

version 1.512.2.13, 2017/03/14 12:20:57 version 1.512.2.24.2.14, 2024/03/01 17:05:45
Line 62  use Apache::lonxml; Line 62  use Apache::lonxml;
 use Apache::londefdef;  use Apache::londefdef;
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonnavmaps;
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   use HTML::Entities();
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
Line 271  sub homework_js { Line 273  sub homework_js {
     }      }
     return &Apache::loncommon::resize_textarea_js().      return &Apache::loncommon::resize_textarea_js().
            &Apache::loncommon::colorfuleditor_js().             &Apache::loncommon::colorfuleditor_js().
            &setmode_javascript().             &Apache::lonxml::setmode_javascript().
  <<"JS";   <<"JS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 342  var postsubmit = '$postsubmit'; Line 344  var postsubmit = '$postsubmit';
                 submithandled = 1;                  submithandled = 1;
                 \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",                  \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",
                                            "color": "black","padding": "2px"}) ;                                             "color": "black","padding": "2px"}) ;
                 if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {                  if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
                     if (buttonId != "all_submit") {                      if (buttonId != "all_submit") {
                         \$( ".LC_status_"+buttonId ).hide();                          \$( ".LC_status_"+buttonId ).hide();
                         if (( "#"+buttonId+"_pressed" ).length) {                      }
                             \$( "#"+buttonId+"_pressed" ).val( "1" );                      if (( "#"+buttonId+"_pressed" ).length) {
                         }                          \$( "#"+buttonId+"_pressed" ).val( "1" );
                     }                      }
                 } else {                  } else {
                     \$( ".LC_status_"+buttonId ).hide();                      \$( ".LC_status_"+buttonId ).hide();
Line 360  var postsubmit = '$postsubmit'; Line 362  var postsubmit = '$postsubmit';
                 if (timeout > 0) {                  if (timeout > 0) {
                     setTimeout(function(){                      setTimeout(function(){
                                        \$( "#msg_"+buttonId ).css({"display": "none"});                                         \$( "#msg_"+buttonId ).css({"display": "none"});
                                        if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {                                         if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
                                            if (buttonId != "all_submit") {                                             if (( "#"+buttonId+"_pressed" ).length) {
                                                if (( "#"+buttonId+"_pressed" ).length) {                                                 \$( "#"+buttonId+"_pressed" ).val( "" );
                                                    \$( "#"+buttonId+"_pressed" ).val( "" );  
                                                }  
                                            }                                             }
                                        }                                         }
                                        \$( ".LC_hwk_submit" ).prop( "disabled", false);                                         \$( ".LC_hwk_submit" ).prop( "disabled", false);
Line 385  var postsubmit = '$postsubmit'; Line 385  var postsubmit = '$postsubmit';
 JS  JS
 }  }
   
 sub setmode_javascript {  
     return <<"ENDSCRIPT";  
 <script type="text/javascript">  
 // <![CDATA[  
 function setmode(form,probmode) {  
     var initial = form.problemmode.value;  
     form.problemmode.value = probmode;  
     form.submit();  
     form.problemmode.value = initial;  
 }  
 // ]]>  
 </script>  
 ENDSCRIPT  
 }  
   
 sub page_start {  sub page_start {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
  $extra_head)=@_;   $extra_head)=@_;
Line 421  sub page_start { Line 406  sub page_start {
     if (&Apache::lonhtmlcommon::htmlareabrowser()) {      if (&Apache::lonhtmlcommon::htmlareabrowser()) {
         my %textarea_args;          my %textarea_args;
         if (($env{'request.state'} ne 'construct') ||          if (($env{'request.state'} ne 'construct') ||
             ($env{'environment.nocodemirror'})) {              (&Apache::loncommon::nocodemirror())) {
             %textarea_args = (              %textarea_args = (
                                 dragmath => 'math',                                  dragmath => 'math',
                               );                                );
Line 496  sub page_start { Line 481  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 527  sub page_start { Line 514  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 598  sub page_start { Line 587  sub page_start {
         my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();          my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
         my ($path,$multiresp) =           my ($path,$multiresp) = 
             &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);              &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);
         if (($is_task) || ($needs_upload)) {          if ($env{'request.user_in_effect'}) {
               $form_tag_start .= ' onsubmit="preventDefault();"';
           } elsif (($is_task) || ($needs_upload)) {
             $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';              $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';
         }          }
  $form_tag_start.='>'."\n";   $form_tag_start.='>'."\n";
Line 643  sub get_resource_name { Line 634  sub get_resource_name {
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target,$probpartlist)=@_;      my ($safeeval,$target,$probpartlist)=@_;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed);      my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
         $questiontype = $env{'form.grade_questiontype'};          $questiontype = $env{'form.grade_questiontype'};
     }      }
     unless (defined($questiontype)) {      unless (defined($questiontype)) {
         $questiontype = $Apache::lonhomework::type;          $questiontype = $Apache::lonhomework::type;
     }      }
     if ($env{'request.state'} eq "construct"       if ($Apache::lonhomework::type eq 'randomizetry') {
  || $symb eq ''           my $partfortries = $Apache::inputtags::part;
  || $Apache::lonhomework::type eq 'practice'  #
  || $Apache::lonhomework::history{'resource.CODE'}) {  # Where question type is "randomizetry" for a problem containing
   # a single part (and unless type is explicitly set to not be
   # "randomizetry" for that part), the number of tries used to
   # determine randomization will be for that part, and randomization
   # from calls to &random() in a perl script block before the part tag,
   # will change based on the number of tries, and value of the
   # "randomizeontries" parameter in effect for the single part.
   #
           if (ref($probpartlist) eq 'ARRAY') {
               if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) {
                   if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') {
                       $partfortries = $probpartlist->[0];
                   } else {
                       $partfortries = '';
                   }
               }
           }
           if ($partfortries ne '') {
               $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"};
               $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
           }
       }
       if (($env{'request.state'} eq "construct")
           || ($symb eq '')
           || ($Apache::lonhomework::type eq 'practice')
           || ($Apache::lonhomework::history{'resource.CODE'})
           || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) {
  &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
  ['rndseed']);   ['rndseed']);
  $rndseed=$env{'form.rndseed'};   $rndseed=$env{'form.rndseed'};
Line 662  sub setup_rndseed { Line 679  sub setup_rndseed {
     if (!$rndseed) {      if (!$rndseed) {
  $rndseed=time;   $rndseed=time;
     }      }
     $env{'form.rndseed'}=$rndseed;              unless ($env{'form.code_for_randomlist'}) {
                   $env{'form.rndseed'}=$rndseed;
               }
  }   }
         if (($env{'request.state'} eq "construct") &&           if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&
             ($Apache::lonhomework::type eq 'randomizetry')) {              ($Apache::lonhomework::type eq 'randomizetry')) {
             my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};              if ($numtries) {
             if ($tries) {                  if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                 $rndseed += $tries;                      my $inc = int($numtries/$reqtries);
                       $rndseed += $inc;
                   } else {
                       $rndseed += $numtries;
                   }
             }              }
             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;              $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
         }          }
  if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')   if ( ($env{'form.resetdata'} eq 'new_problem_variation'
       && $env{'form.submitted'} eq 'yes')  ||        && $env{'form.submitted'} eq 'yes')  ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     srand(time);      srand(time);
Line 690  sub setup_rndseed { Line 713  sub setup_rndseed {
        $rndseed=join(':',&Apache::lonnet::digest($rndseed));         $rndseed=join(':',&Apache::lonnet::digest($rndseed));
             }              }
         }          }
         if ($Apache::lonhomework::history{'resource.CODE'}) {          if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) {
               $env{'form.CODE'} = $env{'form.code_for_randomlist'};
               $rndseed=&Apache::lonnet::rndseed();
               undef($env{'form.CODE'});
           } elsif ($Apache::lonhomework::history{'resource.CODE'}) {
    $rndseed=&Apache::lonnet::rndseed();     $rndseed=&Apache::lonnet::rndseed();
  }   }
         $set_safespace = 1;          $set_safespace = 1;
Line 702  sub setup_rndseed { Line 729  sub setup_rndseed {
         }          }
         unless (($target eq 'analyze') && (defined($rndseed))) {          unless (($target eq 'analyze') && (defined($rndseed))) {
             $rndseed=&Apache::lonnet::rndseed();              $rndseed=&Apache::lonnet::rndseed();
             my $partfortries = $Apache::inputtags::part;              my $curr_try = $numtries;
             if (ref($probpartlist) eq 'ARRAY') {  
                 if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) {  
                     $partfortries = $probpartlist->[0];  
                 }  
             }  
             my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"};  
             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {              if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                 $curr_try ++;                  $curr_try ++;
             }              }
Line 716  sub setup_rndseed { Line 737  sub setup_rndseed {
                 $rndseed = $1;                  $rndseed = $1;
             }              }
             if ($curr_try) {              if ($curr_try) {
                 my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");  
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {                  if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                     my $inc = int(($curr_try-1)/$reqtries);                      my $inc = int(($curr_try-1)/$reqtries);
                     $rndseed += $inc;                      $rndseed += $inc;
Line 758  sub problem_edit_action_button { Line 778  sub problem_edit_action_button {
   
 sub problem_edit_buttons {  sub problem_edit_buttons {
    my ($mode)=@_;     my ($mode)=@_;
      my %editors = &Apache::loncommon::permitted_editors();
 # Buttons that save  # Buttons that save
    my $result = '<div style="float:right">';     my $result = '<div style="float:right">';
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');         if ($editors{'xml'}) {
              $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');
          }
        $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');         $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');
    } else {     } else {
        $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');         if ($editors{'edit'}) {
              $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');
          }
        $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');         $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');
    }     }
    $result.="\n</div>\n";     $result.="\n</div>\n";
Line 772  sub problem_edit_buttons { Line 797  sub problem_edit_buttons {
    $result .= '<div>'.     $result .= '<div>'.
               &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);                &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);         if ($editors{'edit'}) {
              $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
          }
          if ($editors{'daxe'}) {
              $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);
          }
        $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);
        if ($env{'environment.nocodemirror'}) {         if (&Apache::loncommon::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);         if ($editors{'xml'}) {
              $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);
          }
          if ($editors{'daxe'}) {
              $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);
          }
        $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);
    }     }
    $result.="\n</div>";     $result.="\n</div>";
Line 792  sub problem_edit_header { Line 827  sub problem_edit_header {
         <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').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
          </div><div class="LC_edit_actionbar" id="actionbar">'.          </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();
   
     $return .= '</div></div>' . &Apache::lonxml::message_location();      $return .= '</div></div>' . &Apache::lonxml::message_location();
     $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />      $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />
Line 851  sub option { Line 886  sub option {
   
 sub problem_web_to_edit_header {  sub problem_web_to_edit_header {
     my ($rndseed)=@_;      my ($rndseed)=@_;
       my %editors = &Apache::loncommon::permitted_editors();
     my $result .= '<div class="LC_edit_problem_header">';      my $result .= '<div class="LC_edit_problem_header">';
   
     if (!$Apache::lonhomework::parsing_a_task) {      if (!$Apache::lonhomework::parsing_a_task) {
Line 950  $show_all Line 986  $show_all
      </div>       </div>
      <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />       <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />
      <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />       <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />
      <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />       <button type="submit" name="resetdata" accesskey="r" value="reset_submissions">
        '.&mt('Reset Submissions').'</button>
    </div>     </div>
    <hr />     <hr />
    <div class="LC_edit_problem_header_randomize_row">     <div class="LC_edit_problem_header_randomize_row">
Line 979  $show_all Line 1016  $show_all
    <hr />     <hr />
    <div>';     <div>';
     $result.='<input type="hidden" name="problemmode" value="view" />';      $result.='<input type="hidden" name="problemmode" value="view" />';
     $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.      if ($editors{'edit'}) {
                'onclick="javascript:setmode(this.form,'."'edit'".')" />';          $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
     $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.                     'onclick="javascript:setmode(this.form,'."'edit'".')" />';
                'onclick="javascript:setmode(this.form,'."'editxml'".')" />';      }
       if ($editors{'xml'}) {
           $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
                      'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
       }
       if (($editors{'daxe'}) &&
           ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9)) {
           my $uri = $env{'request.uri'};
           my $daxeurl = '/daxepage'.$uri;
           $result .= '<input type="button" accesskey="w" value="'.&mt('Edit with Daxe').'" '.
                      'onclick="javascript:setmode(this.form,'."'daxe'".')" />';
       }
     $result.='      $result.='
    </div>     </div>
    <hr />     <hr />
Line 1009  sub initialize_storage { Line 1057  sub initialize_storage {
  || $Apache::lonhomework::type eq 'practice') {   || $Apache::lonhomework::type eq 'practice') {
   
  my $namespace = $symb || $env{'request.uri'};   my $namespace = $symb || $env{'request.uri'};
  if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||          if ($env{'form.resetdata'} eq 'reset_submissions' ||
     ($env{'form.resetdata'} eq &mt('New Problem Variation')              ($env{'form.resetdata'} eq 'new_problem_variation'
      && $env{'form.submitted'} eq 'yes') ||       && $env{'form.submitted'} eq 'yes') ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     &Apache::lonnet::tmpreset($namespace,'',$domain,$name);      &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
Line 1062  sub initialize_storage { Line 1110  sub initialize_storage {
         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 1076  sub finalize_storage { Line 1124  sub finalize_storage {
  delete(@Apache::lonhomework::results{@remove});   delete(@Apache::lonhomework::results{@remove});
  my ($symb,$courseid,$domain,$name) =    my ($symb,$courseid,$domain,$name) = 
     &Apache::lonnet::whichuser($given_symb);      &Apache::lonnet::whichuser($given_symb);
           my ($passback,$pbscope,$pbmap,$pbsymb,$pbtype,$crsdef,$ltinum,
               $ltiref,$total,$possible,$dopassback);
  if ($env{'request.state'} eq 'construct'    if ($env{'request.state'} eq 'construct' 
     || $symb eq ''      || $symb eq ''
     || $Apache::lonhomework::type eq 'practice') {      || $Apache::lonhomework::type eq 'practice') {
Line 1085  sub finalize_storage { Line 1135  sub finalize_storage {
       $namespace,'',$domain,$name);        $namespace,'',$domain,$name);
     &Apache::lonxml::debug('Construct Store return message:'.$result);      &Apache::lonxml::debug('Construct Store return message:'.$result);
  } else {   } else {
             my ($laststore,$checkedparts,@parts,%postcorrect);              my ($laststore,$checkedparts,@parts,%postcorrect,%record);
             if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&              if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
                 (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&                  (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&
                 (!defined($env{'form.grade_courseid'}))) {                  (!defined($env{'form.grade_courseid'}))) {
                   if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
                       my ($map)=&Apache::lonnet::decode_symb($symb);
                       $map = &Apache::lonnet::clutter($map);
                       if ($env{'request.lti.login'}) {
                           ($passback,$pbscope,$pbmap,$pbsymb,$ltinum,$ltiref) =
                               &needs_lti_passback($courseid,$symb,$map);
                       } elsif ($env{'request.deeplink.login'}) {
                           ($passback,$pbscope,$pbmap,$pbsymb,$crsdef,$ltinum,$ltiref) =
                               &needs_linkprot_passback($courseid,$symb,$map);
                       }
                   }
                 if ($Apache::lonhomework::history{'version'}) {                  if ($Apache::lonhomework::history{'version'}) {
                     $laststore = $Apache::lonhomework::history{'version'}.'='.                      $laststore = $Apache::lonhomework::history{'version'}.'='.
                                  $Apache::lonhomework::history{'timestamp'};                                   $Apache::lonhomework::history{'timestamp'};
                 } else {                  } else {
                     $laststore = '0=0';                      $laststore = '0=0';
                 }                  }
                 my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);                  %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                 if ($record{'version'}) {                  if ($record{'version'}) {
                     my ($newversion,$oldversion,$oldtimestamp);                      my ($newversion,$oldversion,$oldtimestamp);
                     if ($Apache::lonhomework::history{'version'}) {                      if ($Apache::lonhomework::history{'version'}) {
Line 1171  sub finalize_storage { Line 1232  sub finalize_storage {
                     }                      }
                 }                  }
             }              }
               if ($passback) {
                   foreach my $key (keys(%Apache::lonhomework::results)) {
                       if ($key =~ /^resource\.([^\.]+)\.solved$/) {
                           my $part = $1;
                           if ((($Apache::lonhomework::results{$key} =~ /^correct_/) ||
                               ($Apache::lonhomework::results{$key} eq 'incorrect_attempted')) &&
                               ($Apache::lonhomework::results{"resource.$part.tries"})) {
                               $dopassback = 1;
                               last;
                           }
                       }
                   }
               }
               if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) {
                   $total = 0;
                   $possible = 0;
                   my $navmap = Apache::lonnavmaps::navmap->new();
                   if (ref($navmap)) {
                       my $res = $navmap->getBySymb($symb);
                       if (ref($res)) {
                           my $partlist = $res->parts();
                           if (ref($partlist) eq 'ARRAY') {
                               foreach my $part (@{$partlist}) {
                                   unless (exists($Apache::lonhomework::results{"resource.$part.solved"})) {
                                       next if ($Apache::lonhomework::record{"resource.$part.solved"} =~/^excused/);
                                       my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);
                                       $possible += $weight;
                                       if (($record{'version'}) && (exists($record{"resource.$part.awarded"}))) {
                                           my $awarded = $record{"resource.$part.awarded"};
                                           if ($awarded) {
                                               $total += $weight * $awarded;
                                           }
                                       }
                                   }
                               }
                           }
                       }
                   }
                   foreach my $key (keys(%Apache::lonhomework::results)) {
                       if ($key =~ /^resource\.([^\.]+)\.awarded$/) {
                           my $part = $1;
                           my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);
                           $possible += $weight;
                           my $awarded = $Apache::lonhomework::results{$key};
                           if ($awarded) {
                               $total += $weight * $awarded;
                           }
                       }
                   }
               }
     &Apache::lonxml::debug('Store return message:'.$result);      &Apache::lonxml::debug('Store return message:'.$result);
             &store_aggregates($symb,$courseid);              &store_aggregates($symb,$courseid);
               if ($dopassback) {
                   my $scoreformat = 'decimal';
                   if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
                       if (ref($ltiref) eq 'HASH') {
                           if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) {
                               $scoreformat = $1;
                           }
                       }
                   }
                   my ($pbid,$pburl,$pbtype);
                   if ($env{'request.lti.login'}) {
                       $pbid = $env{'request.lti.passbackid'};
                       $pburl = $env{'request.lti.passbackurl'};
                       $pbtype = 'lti';
                   } elsif ($env{'request.deeplink.login'}) {
                       $pbid = $env{'request.linkprotpbid'};
                       $pburl = $env{'request.linkprotpburl'};
                       $pbtype = 'linkprot';
                   }
                   my $ltigrade = {
                                    'ltinum'   => $ltinum,
                                    'lti'      => $ltiref,
                                    'crsdef'   => $crsdef,
                                    'cid'      => $courseid,
                                    'uname'    => $env{'user.name'},
                                    'udom'     => $env{'user.domain'},
                                    'pbid'     => $pbid,
                                    'pburl'    => $pburl,
                                    'pbtype'   => $pbtype,
                                    'scope'    => $pbscope,
                                    'pbmap'    => $pbmap,
                                    'pbsymb'   => $pbsymb,
                                    'format'   => $scoreformat,
                                  };
                   if ($pbscope eq 'resource') {
                       $ltigrade->{'total'} = $total;
                       $ltigrade->{'possible'} = $possible;
                   }
                   push(@Apache::lonhomework::ltipassback,$ltigrade);
               }
  }   }
     } else {      } else {
  &Apache::lonxml::debug('Nothing to store');   &Apache::lonxml::debug('Nothing to store');
Line 1180  sub finalize_storage { Line 1331  sub finalize_storage {
     return $result;      return $result;
 }  }
   
   sub needs_lti_passback {
       my ($courseid,$symb,$map) = @_;
       if (($env{'request.lti.passbackid'}) && ($env{'request.lti.passbackurl'})) {
           if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {
               my ($cdom,$cnum) = ($1,$2);
               my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');
               if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
                   if ($lti{$env{'request.lti.login'}}{'passback'}) {
                       my $itemnum = $env{'request.lti.login'};
                       my ($ltiscope,$ltiuri,$ltisymb) =
                           &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},
                                                                  $cdom,$cnum,1);
                       my ($passback,$ltimap);
                       if ($ltiscope eq 'resource') {
                           if ($ltisymb eq $symb) {
                               $passback = 1;
                           }
                       } elsif ($ltiscope eq 'map') {
                           if ($ltiuri eq $map) {
                               $passback = 1;
                               $ltimap = $map;
                           }
                       } elsif ($ltiscope eq 'course') {
                           if (($env{'request.lti.uri'} eq "/$cdom/$cnum") || ($env{'request.lti.uri'} eq '')) {
                               $passback = 1;
                           }
                       }
                       return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum});
                   }
               }
           }
       }
       return;
   }
   
   sub needs_linkprot_passback {
       my ($courseid,$symb,$map) = @_;
       if (($env{'request.linkprotpbid'}) && ($env{'request.linkprotpburl'})) {
           if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {
               my ($cdom,$cnum) = ($1,$2);
               my ($deeplink_symb,$deeplink_map,$deeplink,$passback);
               $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
               if ($deeplink_symb) {
                   if ($deeplink_symb =~ /\.(page|sequence)$/) {
                       $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
                       my $navmap = Apache::lonnavmaps::navmap->new();
                       if (ref($navmap)) {
                           $deeplink = $navmap->get_mapparam(undef,$deeplink_map,'0.deeplink');
                       }
                   } else {
                       $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$deeplink_symb);
                       $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[0]);
                   }
                   if (($deeplink ne '') && ($env{'request.linkprot'} ne '')) {
                       my ($itemid,$tinyurl) = split(/:/,$env{'request.linkprot'});
                       if ($itemid =~ /^(\d+)(c|d)$/) {
                           my ($itemnum,$itemtype) = ($1,$2);
                           my ($crsdef,$lti_in_use);
                           if ($itemtype eq 'c') {
                               $crsdef = 1;
                               my %crslti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');
                               $lti_in_use = $crslti{$itemnum};
                           } else {
                               my %domlti = &Apache::lonnet::get_domain_lti($cdom,'linkprot');
                               $lti_in_use = $domlti{$itemnum};
                           }
                           my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);
                           my ($passback,$pbscope);
                           if ($scope eq 'res') {
                               if ($deeplink_symb eq $symb) {
                                   $passback = 1;
                                   $pbscope = 'resource';
                               }
                           } elsif ($scope eq 'map') {
                               if (&Apache::lonnet::clutter($deeplink_map) eq $map) {
                                   $passback = 1;
                                   $pbscope = 'nonrec';
                               }
                           } elsif ($scope eq 'rec') {
                               if (&Apache::lonnet::clutter($deeplink_map) eq $map) {
                                   $passback = 1;
                                   $pbscope = 'map';
                               } else {
                                   my @recurseup = &Apache::lonnet::get_map_hierarchy($map,$env{'request.course.id'});
                                   if (grep(/^\Q$deeplink_map\E$/,@recurseup)) {
                                       $passback = 1;
                                       $pbscope = 'map';
                                   }
                               }
                           }
                           return ($passback,$pbscope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);
                       }
                   }
               }
           }
       }
   }
   
 =pod  =pod
   
 =item check_correctness_changes()  =item check_correctness_changes()
Line 1314  sub store_aggregates { Line 1563  sub store_aggregates {
     }      }
 }  }
   
   sub access_status_msg {
       my ($mode,$status,$symb,$target,$ipused,$accessmsg) = @_;
       my $msg;
       if ($target eq 'web') {
           if ($status eq 'UNAVAILABLE') {
               $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';
           } elsif ($status eq 'NOT_IN_A_SLOT') {
               $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';
           } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||
                    ($status eq 'NOTRESERVABLE')) {
               $msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>';
           } elsif ($status ne 'NOT_YET_VIEWED') {
               $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';
           }
           if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
               $msg.=&mt('The problem ').$accessmsg;
           } elsif ($status eq 'UNCHECKEDOUT') {
               $msg.=&checkout_msg();
           } elsif ($status eq 'NOT_YET_VIEWED') {
               $msg.=&firstaccess_msg($accessmsg,$symb);
           } elsif ($status eq 'NOT_IN_A_SLOT') {
               $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
           } elsif ($status eq 'RESERVABLE') {
               $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',
                         &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).
                         '<br />'.
                         &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
           } elsif ($status eq 'RESERVABLE_LATER') {
               $msg.=&mt('Window to make a reservation will open [_1].',
                         &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
           } elsif ($status eq 'NOTRESERVABLE') {
               $msg.=&mt('Not available to make a reservation.');
           }
           $msg.='<br />';
       } elsif ($target eq 'tex') {
           my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
                                : '\begin{minipage}{\textwidth}';
   
           $msg ='\noindent \vskip 1 mm '.
                 $startminipage.'\vskip 0 mm';
           if ($status eq 'UNAVAILABLE') {
               $msg.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.');
           } elsif ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
               $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg";
           } else {
               $msg.=&mt('Problem is not open to be viewed.');
           }
           $msg .= " \\vskip 0 mm ";
       }
       return $msg;
   }
   
   sub checkin_prompt {
       my ($target,$slot_name,$slot,$type) = @_;
       my $result;
       if ($target eq 'web') {
           $result = &Apache::bridgetask::proctor_validation_screen($slot);
       } elsif ($target eq 'grade') {
           if (!&Apache::bridgetask::proctor_check_auth($slot_name,$slot,$type)) {
               $result = &mt('An error occurred during check-in');
           }
       }
       return $result;
   }
   
   sub selfcheckin_resource {
       my ($resource_due,$slot_name,$slot,$symb) = @_;
       if ($slot_name ne '') {
           my $checked_in =
               $Apache::lonhomework::history{'resource.0.checkedin'};
           if ($checked_in eq '') {
               # unproctored slot access, self checkin
               my $check = &Apache::bridgetask::check_in('problem',undef,undef,
                                                         $slot_name);
               if ($check =~ /^error: /) {
                   &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $symb) using slot: $slot_name");
               } else {
                   $checked_in = $Apache::lonhomework::results{"resource.0.checkedin"};
               }
           }
           if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {
               if ($slot->{'starttime'} < time()) {
                   if (!$resource_due) {
                       $resource_due = $slot->{'endtime'};
                   } elsif ($slot->{'endtime'} < $resource_due) {
                       $resource_due = $slot->{'endtime'};
                   }
               }
           }
       }
       return $resource_due;
   }
   
 sub checkout_msg {  sub checkout_msg {
     my %lt=&Apache::lonlocal::texthash(       my %lt=&Apache::lonlocal::texthash( 
  'resource'=>'The resource needs to be checked out',   'resource'=>'The resource needs to be checked out',
Line 1359  sub firstaccess_msg { Line 1701  sub firstaccess_msg {
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     my $buttontext = &mt('Show Resource');      my $buttontext = &mt('Show Resource');
     my $timertext = &mt('Start Timer?');      my $timertext = &mt('Start Timer?');
       my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'\'"<>&');
     $result .= (<<ENDCHECKOUT);      $result .= (<<ENDCHECKOUT);
 <form name="markaccess" method="post" action="$uri">  <form name="markaccess" method="post" action="$uri">
 <input type="hidden" name="markaccess" value="yes" />  <input type="hidden" name="markaccess" value="yes" />
   <input type="hidden" name="symb" value="$shownsymb" />
 <input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />  <input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
Line 1403  sub init_problem_globals { Line 1747  sub init_problem_globals {
     @Apache::structuretags::whilebody=();      @Apache::structuretags::whilebody=();
     @Apache::structuretags::whileline=();      @Apache::structuretags::whileline=();
     $Apache::lonhomework::scantronmode=0;      $Apache::lonhomework::scantronmode=0;
       $Apache::lonhomework::randomizetrypart=0;
     undef($Apache::lonhomework::name);      undef($Apache::lonhomework::name);
     undef($Apache::lonhomework::default_type);      undef($Apache::lonhomework::default_type);
     undef($Apache::lonhomework::type);      undef($Apache::lonhomework::type);
Line 1426  sub reset_problem_globals { Line 1771  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 1519  sub start_problem { Line 1865  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);      my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres);
   
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
         $target eq 'tex') {          $target eq 'tex') {
         if ($env{'form.markaccess'}) {          if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");              my @interval=&Apache::lonnet::EXT("resource.0.interval");
             &Apache::lonnet::set_first_access($interval[1],$interval[0]);              my ($timelimit) = ($interval[0] =~ /^(\d+)/);
               my $is_set = &Apache::lonnet::set_first_access($interval[1],$timelimit);
               unless (($is_set eq 'ok') || ($is_set eq 'already_set')) {
                   $firstaccres = $is_set;
               }
         }          }
   
         ($status,$accessmsg,$slot_name,$slot) =  
             &Apache::lonhomework::check_slot_access('0','problem');  
         push (@Apache::inputtags::status,$status);  
     }      }
   
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
Line 1538  sub start_problem { Line 1884  sub start_problem {
  ($result,$form_tag_start,$probpartlist) =   ($result,$form_tag_start,$probpartlist) =
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
  $name);   $name);
     } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) {      } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) ||
                ($target eq 'answer')) {
         my ($symb)= &Apache::lonnet::whichuser();          my ($symb)= &Apache::lonnet::whichuser();
         my $navmap = Apache::lonnavmaps::navmap->new();          if ($symb ne '') {
         if (ref($navmap)) {              my $navmap = Apache::lonnavmaps::navmap->new();
             my $res = $navmap->getBySymb($symb);              if (ref($navmap)) {
             if (ref($res)) {                  my $res = $navmap->getBySymb($symb);
                 $probpartlist = $res->parts();                  if (ref($res)) {
                       $probpartlist = $res->parts();
                   }
             }              }
         }          }
     }      }
   
       if (($target eq 'web') && ($env{'request.user_in_effect'})) {
           &Apache::lonxml::get_all_text("/problem",$parser,$style);
           return $result;
       }
   
       if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
           $target eq 'tex') {
   
           my ($symb)= &Apache::lonnet::whichuser();
           ($status,$accessmsg,$slot_name,$slot) =
               &Apache::lonhomework::check_slot_access('0','problem',$symb,$probpartlist);
           push (@Apache::inputtags::status,$status);
       } 
   
     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}      if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
   
     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }      if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
  $target eq 'tex') {   $target eq 'tex') {
   
           my ($symb) = &Apache::lonnet::whichuser();
  #handle rand seed in construction space   #handle rand seed in construction space
           if (($env{'request.state'} eq 'construct') || ($symb eq '')) {
               my $partorder=&Apache::lonnet::metadata($env{'request.uri'},'partorder');
               if ($partorder ne '') {
                   @{$probpartlist} = split(/,/,$partorder);
               }
           }
  my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);   my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);
         if (($target eq 'grade') && &Apache::response::submitted()) {          if (($target eq 'grade') && &Apache::response::submitted()) {
             if ($Apache::lonhomework::type eq 'randomizetry') {              if ($Apache::lonhomework::type eq 'randomizetry') {
Line 1570  sub start_problem { Line 1940  sub start_problem {
                 }                  }
             }              }
         }          }
  my ($symb)=&Apache::lonnet::whichuser();  
   
  if ($env{'request.state'} ne "construct" &&    if ($env{'request.state'} ne "construct" && 
     ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {      ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
               my $rndseedval = $rndseed;
               if (($symb eq '') && ($Apache::lonhomework::type eq 'randomizetry')) {
                   $rndseedval = $env{'form.rndseed'};
               }
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
  $rndseed.'" />'.   $rndseedval.'" />'.
     '<input type="submit" name="resetdata"      '<button type="submit" name="resetdata"
                              value="'.&mt('New Problem Variation').'" />';                          value="new_problem_variation">'.&mt('New Problem Variation').'</button>';
     if (exists($env{'form.username'})) {      if (exists($env{'form.username'})) {
  $form_tag_start.=   $form_tag_start.=
     '<input type="hidden" name="username"      '<input type="hidden" name="username"
Line 1597  sub start_problem { Line 1970  sub start_problem {
                 $form_tag_start.=&practice_problem_header();                  $form_tag_start.=&practice_problem_header();
             }              }
     $form_tag_start.='<hr />';      $form_tag_start.='<hr />';
         } elsif (($env{'request.state'} ne "construct") &&          }
                  ($Apache::lonhomework::type eq 'randomizetry') &&          if (($env{'request.state'} ne "construct") &&
                  ($status eq 'CAN_ANSWER')) {              ($Apache::lonhomework::type eq 'randomizetry') &&
             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");              ($status eq 'CAN_ANSWER')) {
             my $problemstatus = &get_problem_status($Apache::inputtags::part);              my @parts;
             $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);              if (ref($probpartlist) eq 'ARRAY') {
                   @parts = @{$probpartlist};
               }
               unless (@parts) {
                   my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                   my $problemstatus = &get_problem_status($Apache::inputtags::part);
                   $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries,$symb);
               }
         }          }
   
  my $expression='$external::datestatus="'.$status.'";';   my $expression='$external::datestatus="'.$status.'";';
Line 1622  sub start_problem { Line 2002  sub start_problem {
     ( $status eq 'INVALID_ACCESS')) {      ( $status eq 'INVALID_ACCESS')) {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
     if ( $target eq "web" ) {              if (($status eq 'NOT_YET_VIEWED') && ($firstaccres)) {
  my $msg;                  $result .= '<p class="LC_error">'.
  if ($status eq 'UNAVAILABLE') {                             &mt('A problem occurred when trying to start the timer.').'</p>';
     $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';              }
                 } elsif ($status eq 'NOT_IN_A_SLOT') {              $result .= &access_status_msg('problem',$status,$symb,$target,'',$accessmsg);
                     $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';  
                 } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||  
                          ($status eq 'NOTRESERVABLE')) {  
                     $msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>';  
  } elsif ($status ne 'NOT_YET_VIEWED') {  
     $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';  
                 }  
  if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {  
     $msg.=&mt('The problem ').$accessmsg;  
  } elsif ($status eq 'UNCHECKEDOUT') {  
     $msg.=&checkout_msg();  
  } elsif ($status eq 'NOT_YET_VIEWED') {  
     $msg.=&firstaccess_msg($accessmsg,$symb);  
  } elsif ($status eq 'NOT_IN_A_SLOT') {  
     $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");  
                 } elsif ($status eq 'RESERVABLE') {  
                     $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',  
                               &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).  
                           '<br />'.  
                           &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");  
                 } elsif ($status eq 'RESERVABLE_LATER') {  
                     $msg.=&mt('Window to make a reservation will open [_1].',  
                               &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));  
                 } elsif ($status eq 'NOTRESERVABLE') {  
                     $msg.=&mt('Not available to make a reservation.');    
  }  
  $result.=$msg.'<br />';  
     } elsif ($target eq 'tex') {  
  my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''  
                     : '\begin{minipage}{\textwidth}';  
  $result.='\noindent \vskip 1 mm '.  
     $startminipage.'\vskip 0 mm';  
  if ($status eq 'UNAVAILABLE') {  
     $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';  
  } else {  
     $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";  
  }  
     }  
  } elsif ($status eq 'NEEDS_CHECKIN') {   } elsif ($status eq 'NEEDS_CHECKIN') {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
     if ($target eq 'web') {              $result .= &checkin_prompt($target,$slot_name,$slot,'problem');
  $result .=   
     &Apache::bridgetask::proctor_validation_screen($slot);  
     } elsif ($target eq 'grade') {  
  &Apache::bridgetask::proctor_check_auth($slot_name,$slot,  
  'problem');  
     }  
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER') {
                 $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'});                  $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'});
                 if ($slot_name ne '') {                  if ($slot_name ne '') {
                     my $checked_in =                      $resource_due = &selfcheckin_resource($resource_due,$slot_name,$slot,
                         $Apache::lonhomework::history{'resource.0.checkedin'};                                                            $env{'request.symb'});
                     if ($checked_in eq '') {  
                         # unproctored slot access, self checkin  
                         &Apache::bridgetask::check_in('problem',undef,undef,  
                                                       $slot_name);  
                         $checked_in =  
                             $Apache::lonhomework::results{"resource.0.checkedin"};  
                     }  
                     if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {  
                         if ($slot->{'starttime'} < time()) {  
                             if (!$resource_due) {  
                                 $resource_due = $slot->{'endtime'};  
                             } elsif ($slot->{'endtime'} < $resource_due) {  
                                 $resource_due = $slot->{'endtime'};  
                             }  
                         }  
                     }  
                 }                  }
                 if ($resource_due) {                  if ($resource_due) {
                     my $time_left = $resource_due - time();                      my $time_left = $resource_due - time();
Line 1709  sub start_problem { Line 2029  sub start_problem {
       '<input type="hidden" name="submitted" value="yes" />';        '<input type="hidden" name="submitted" value="yes" />';
     # create a page header and exit      # create a page header and exit
     if ($env{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  $result.= &problem_web_to_edit_header($env{'form.rndseed'});                  if ($env{'form.inhibitmenu'} eq 'yes') {
                       # error messages can be useful in any case
                       $result.= &Apache::lonxml::message_location();
                   } else {
       $result.= &problem_web_to_edit_header($env{'form.rndseed'});
                   }
                 if ($Apache::lonhomework::type eq 'practice') {                  if ($Apache::lonhomework::type eq 'practice') {
                     $result.= '<input type="submit" name="resetdata" '.                      $result.= '<button type="submit" name="resetdata" '.
                               'value="'.&mt('New Problem Variation').'" />'.                                'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                               &practice_problem_header().'<hr />';                                &practice_problem_header().'<hr />';
                   } elsif ($Apache::lonhomework::type eq 'randomizetry') {
                       my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                       my $problemstatus = &get_problem_status($Apache::inputtags::part);
                       $result.=&randomizetry_problem_header($problemstatus,$reqtries);
                 }                  }
     }      }
     # if we are viewing someone else preserve that info      # if we are viewing someone else preserve that info
Line 1735  sub start_problem { Line 2064  sub start_problem {
  } elsif ($target eq 'tex') {   } elsif ($target eq 'tex') {
     $result .= 'INSERTTEXFRONTMATTERHERE';      $result .= 'INSERTTEXFRONTMATTERHERE';
     $result .= &select_metadata_hyphenation();      $result .= &select_metadata_hyphenation();
       
   
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= $form_tag_start.&problem_edit_header();   $result .= $form_tag_start.&problem_edit_header();
Line 1856  sub end_problem { Line 2183  sub end_problem {
     }      }
  }   }
  $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;   $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
       } elsif ($target eq 'web') {
           if ($env{'request.user_in_effect'}) {
               &reset_problem_globals('problem');
               $result .= &Apache::lonhtmlcommon::set_compute_end_time();
               return $result;
           }
     }      }
   
     my $status=$Apache::inputtags::status['-1'];      my $status=$Apache::inputtags::status['-1'];
Line 1915  sub end_problem { Line 2248  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 1953  sub end_problem { Line 2303  sub end_problem {
     # computation:      # computation:
     #      #
     if ($target eq 'web') {      if ($target eq 'web') {
         $result .= &Apache::lonhtmlcommon::set_compute_end_time();          $result .= &Apache::lonhtmlcommon::dash_to_minus_js().
                      &Apache::lonhtmlcommon::set_compute_end_time();
         #          #
         # Closing tags delayed so any <script></script> tags           # Closing tags delayed so any <script></script> tags 
         # not in head can appear inside body, for valid xhtml.          # not in head can appear inside body, for valid xhtml.
Line 1992  sub start_library { Line 2343  sub start_library {
   '<input type="hidden" name="submitted" value="yes" />';    '<input type="hidden" name="submitted" value="yes" />';
  $result.=&problem_web_to_edit_header($rndseed);   $result.=&problem_web_to_edit_header($rndseed);
         if ($Apache::lonhomework::type eq 'practice') {          if ($Apache::lonhomework::type eq 'practice') {
             $result.= '<input type="submit" name="resetdata" '.              $result.= '<button type="submit" name="resetdata" '.
                       'value="'.&mt('New Problem Variation').'" />'.                        'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                       &practice_problem_header().'<hr />';                        &practice_problem_header().'<hr />';
         }          }
     }      }
Line 2009  sub end_library { Line 2360  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 2491  sub start_randomlist { Line 2844  sub start_randomlist {
  }   }
  if (@randomlist) {   if (@randomlist) {
     my @idx_arr = (0 .. $#randomlist);      my @idx_arr = (0 .. $#randomlist);
     &Apache::structuretags::shuffle(\@idx_arr);              if ($env{'form.code_for_randomlist'}) {
                   &Apache::structuretags::shuffle(\@idx_arr,$target);
                   undef($env{'form.code_for_randomlist'});
               } else {
                   &Apache::structuretags::shuffle(\@idx_arr);
               }
     my $bodytext = '';      my $bodytext = '';
     my $show=$#randomlist;      my $show=$#randomlist;
     my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);      my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
Line 2530  sub start_randomlist { Line 2888  sub start_randomlist {
 }  }
   
 sub shuffle {  sub shuffle {
     my $a=shift;      my ($a,$target) = @_;
     my $i;      my $i;
     if (ref($a) eq 'ARRAY' && @$a) {      if (ref($a) eq 'ARRAY' && @$a) {
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber(undef,$target);
  for($i=@$a;--$i;) {   for($i=@$a;--$i;) {
     my $j=int(&Math::Random::random_uniform() * ($i+1));      my $j=int(&Math::Random::random_uniform() * ($i+1));
     next if $i == $j;      next if $i == $j;
Line 2707  sub start_part { Line 3065  sub start_part {
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
                     if ($status eq 'CAN_ANSWER') {                      if ($status eq 'CAN_ANSWER') {
                         my $problemstatus = &get_problem_status($Apache::inputtags::part);                           my $problemstatus = &get_problem_status($Apache::inputtags::part); 
                         my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type");  
                         my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries");  
                         my $num = scalar(@Apache::inputtags::partlist)-1;                          my $num = scalar(@Apache::inputtags::partlist)-1;
                         if ($probrandomize eq 'randomizetry') {                          if ((($Apache::lonhomework::default_type eq 'randomizetry') ||
                             if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {                               ($Apache::lonhomework::randomizetrypart)) &&
                                 $result .= &randomizetry_part_header($problemstatus,'none',$num);                              ($Apache::lonhomework::type ne 'randomizetry')) {
                             } else {                              $result .= &randomizetry_part_header($problemstatus,'none',$num);
                                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");                          } elsif ($Apache::lonhomework::type eq 'randomizetry') {
                                 if ($probrandtries ne $reqtries) {                              $Apache::lonhomework::randomizetrypart = 1;
                                     $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);                              my $reqtries = &Apache::lonnet::EXT("resource.$id.randomizeontries");
                                 }  
                             }  
                         } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') {  
                             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                             $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);                              $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                         }                          }
                     }                      }
Line 2775  sub end_part { Line 3127  sub end_part {
     $gradestatus='';      $gradestatus='';
  }   }
  $result.=$gradestatus;   $result.=$gradestatus;
  if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';}           if ($$tagstack[-2] eq 'td' and $target eq 'tex') {
               if (not $env{'form.problem_split'}=~/yes/) {
                   $result.='\end{minipage}';
               }
           }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::end_table();   $result.=&Apache::edit::end_table();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
Line 2940  sub end_startouttext { Line 3296  sub end_startouttext {
                  .&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'}) {   if (&Apache::loncommon::nocodemirror()) {
     $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);      $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);
  } else {   } else {
     $result.='&nbsp;';      $result.='&nbsp;';
Line 3040  sub practice_problem_header { Line 3396  sub practice_problem_header {
 }  }
   
 sub randomizetry_problem_header {  sub randomizetry_problem_header {
     my ($problemstatus,$reqtries) = @_;      my ($problemstatus,$reqtries,$symb) = @_;
     my ($header,$text);      my ($header,$text);
     if ($reqtries > 1) {      if ($reqtries > 1) {
         $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);
Line 3060  sub randomizetry_problem_header { Line 3416  sub randomizetry_problem_header {
             $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');              $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');
         }          }
     }      }
     return '<span class="LC_info"><h3>'.$header.'</h3></span>'.      if (($env{'request.state'} eq "construct") || ($symb eq '')) {
            '<span class="LC_info">'.$text.'</span><hr />';          return '<div class="LC_info" id="LC_randomizetry_header" style="display:none">'.
                  '<h3>'.$header.'</h3><span class="LC_info">'.$text.'</span><hr /></div>';
       } else {
           return '<h3 class="LC_info">'.$header.'</h3>'.
                  '<span class="LC_info">'.$text.'</span><hr />';
       }
 }  }
   
 sub randomizetry_part_header {  sub randomizetry_part_header {
Line 3069  sub randomizetry_part_header { Line 3430  sub randomizetry_part_header {
     my ($header,$text);      my ($header,$text);
     if ($reqtries eq 'none') {      if ($reqtries eq 'none') {
         $header = &mt('No Question Variation');          $header = &mt('No Question Variation');
         $text = &mt('For this question there will no new variation after a try.');          $text = &mt('For this question there will be no new variation after a try.');
     } elsif ($reqtries > 1) {      } elsif ($reqtries > 1) {
         $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);
         if (($problemstatus eq 'no') ||          if (($problemstatus eq 'no') ||

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


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