Diff for /loncom/homework/structuretags.pm between versions 1.465.2.15 and 1.466

version 1.465.2.15, 2011/12/10 18:23:13 version 1.466, 2010/03/10 21:25:36
Line 66  use lib '/home/httpd/lib/perl/'; Line 66  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));      &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag'));
 }  }
   
 sub start_web {  sub start_web {
Line 128  sub homework_js { Line 128  sub homework_js {
            &setmode_javascript().             &setmode_javascript().
  <<'JS';   <<'JS';
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  function setSubmittedPart (part) {
 function setSubmittedPart (part,prefix) {     this.document.lonhomework.submitted.value="part_"+part;
     if (typeof(prefix) == 'undefined') {  
         this.document.lonhomework.submitted.value="part_"+part;  
     } else {  
         for (var i=0;i<this.document.lonhomework.elements.length;i++) {  
             if (this.document.lonhomework.elements[i].name == prefix+'submitted') {  
                 this.document.lonhomework.elements[i].value="part_"+part;  
             }  
         }  
     }  
 }  }
   
 function image_response_click (which, e) {  function image_response_click (which, e) {
Line 154  function image_response_click (which, e) Line 145  function image_response_click (which, e)
     input_element.value = click;      input_element.value = click;
     img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;      img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;
 }  }
 // ]]>  
 </script>  </script>
 JS  JS
 }  }
Line 162  JS Line 153  JS
 sub setmode_javascript {  sub setmode_javascript {
     return <<"ENDSCRIPT";      return <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  
 function setmode(form,probmode) {  function setmode(form,probmode) {
     form.problemmode.value = probmode;      form.problemmode.value = probmode;
     form.submit();      form.submit();
 }  }
 // ]]>  
 </script>  
 ENDSCRIPT  
 }  
   
 sub file_delchk_js {  
     my $delfilewarn = &mt('You have indicated you wish to remove some files previously included in your submission.').'\\n'.  
                       &mt('Continue submission with these files removed?');  
     return <<"ENDSCRIPT";  
 <script type="text/javascript">  
 // <![CDATA[  
 function file_deletion_check(formname) {  
     var elemnum = formname.elements.length;  
     if (elemnum == 0) {  
         return true;  
     }  
     var str = new RegExp("^HWFILE.+_delete\$");  
     var delboxes = new Array();  
     for (i=0; i<formname.elements.length; i++) {  
         var id = formname.elements[i].id;  
         if (id != '') {  
             if (str.test(id)) {  
                 if (formname.elements[i].type == 'checkbox') {  
                     if (formname.elements[i].checked) {  
                         delboxes.push(id);  
                     }  
                 }  
             }  
         }  
     }  
     if (delboxes.length > 0) {  
         if (confirm("$delfilewarn")) {  
             return true;  
         } else {  
             for (var j=0; j<delboxes.length; j++) {  
                 formname.elements[delboxes[j]].checked = false;  
             }  
             return false;  
         }  
     } else {  
         return true;  
     }  
 }  
 // ]]>  
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
 }  }
Line 231  sub page_start { Line 177  sub page_start {
    $parstack,$parser,$safeeval);     $parstack,$parser,$safeeval);
     }      }
   
     $extra_head .= &homework_js().      $extra_head .= &homework_js();
                    &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");  
     if (&Apache::lonhtmlcommon::htmlareabrowser()) {      if ($env{'environment.wysiwygeditor'} eq 'on') {
         my %textarea_args = (   $extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup");
                                 dragmath => 'math',      } else {
                               );          $extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
         $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);  
     }  
     my $is_task = ($env{'request.uri'} =~ /\.task$/);  
     if ($is_task) {  
         $extra_head .= &file_delchk_js();  
     }      }
   
     my %body_args;      my %body_args;
Line 268  sub page_start { Line 209  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') {
     if ($env{'environment.remote'} ne 'off') {  
  $body_args{'only_body'}  = 1;  
     }  
         # Breadcrumbs for Construction Space          # Breadcrumbs for Construction Space
         &Apache::lonhtmlcommon::clear_breadcrumbs();          &Apache::lonhtmlcommon::clear_breadcrumbs();
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
Line 304  sub page_start { Line 242  sub page_start {
         # $body_args{'no_title'}       = 1;          # $body_args{'no_title'}       = 1;
         $body_args{'force_register'} = 1;          $body_args{'force_register'} = 1;
         $body_args{'add_entries'}    = \%add_entries;          $body_args{'add_entries'}    = \%add_entries;
         if ($env{'environment.remote'} eq 'off'          if ( $env{'request.state'} eq   'construct') {
             && $env{'request.state'} eq   'construct') {  
             $body_args{'only_body'}  = 1;              $body_args{'only_body'}  = 1;
         }          }
     }      }
Line 339  sub page_start { Line 276  sub page_start {
  if ($target eq 'edit') {   if ($target eq 'edit') {
     $form_tag_start.=&Apache::edit::form_change_detection();      $form_tag_start.=&Apache::edit::form_change_detection();
  }   }
         if ($is_task) {  
             $form_tag_start .= ' onsubmit="return file_deletion_check(this);"';  
         }  
  $form_tag_start.='>'."\n";   $form_tag_start.='>'."\n";
   
  my $symb=&Apache::lonnet::symbread();   my $symb=&Apache::lonnet::symbread();
Line 383  sub get_resource_name { Line 317  sub get_resource_name {
 }  }
   
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target)=@_;      my ($safeeval)=@_;
       my $rndseed;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed);  
     if ($target eq 'analyze') {  
         $questiontype = $env{'form.grade_questiontype'};  
     }  
     unless (defined($questiontype)) {  
         $questiontype = $Apache::lonhomework::type;  
     }  
     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 406  sub setup_rndseed { Line 334  sub setup_rndseed {
     }      }
     $env{'form.rndseed'}=$rndseed;      $env{'form.rndseed'}=$rndseed;
  }   }
         if (($env{'request.state'} eq "construct") &&  
             ($Apache::lonhomework::type eq 'randomizetry')) {  
             my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};  
             if ($tries) {  
                 $rndseed += $tries;  
             }  
             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;  
         }  
  if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')   if ( ($env{'form.resetdata'} eq &mt('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')) {
Line 429  sub setup_rndseed { Line 349  sub setup_rndseed {
         if ($Apache::lonhomework::history{'resource.CODE'}) {          if ($Apache::lonhomework::history{'resource.CODE'}) {
    $rndseed=&Apache::lonnet::rndseed();     $rndseed=&Apache::lonnet::rndseed();
  }   }
         $set_safespace = 1;   if ($safeeval) {
     } elsif ($questiontype eq 'randomizetry') {      &Apache::lonxml::debug("Setting rndseed to $rndseed");
         if ($target eq 'analyze') {      &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
             if (defined($env{'form.grade_rndseed'})) {   }
                 $rndseed = $env{'form.grade_rndseed'};  
             }  
         }  
         unless (($target eq 'analyze') && (defined($rndseed))) {  
             $rndseed=&Apache::lonnet::rndseed();  
             my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};  
             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {  
                 $curr_try ++;  
             }  
             if ($rndseed =~/^(\d+)[,:](\d+)$/) {  
                 $rndseed = $1;  
             }  
             if ($curr_try) {  
                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {  
                     my $inc = int(($curr_try-1)/$reqtries);  
                     $rndseed += $inc;  
                 } else {  
                     $rndseed += $curr_try;  
                 }  
             }  
         }  
         $set_safespace = 1;  
     }  
     if ($set_safespace) {  
         if ($safeeval) {  
             &Apache::lonxml::debug("Setting rndseed to $rndseed");  
             &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);  
         }  
     }  
     unless (($env{'request.state'} eq "construct") || ($symb eq '')) {  
         $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;  
     }      }
     return $rndseed;      return $rndseed;
 }  }
Line 476  sub remember_problem_state { Line 364  sub remember_problem_state {
        <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';         <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';
 }  }
   
 sub problem_edit_action_button {  
     my ($name,$action,$accesskey,$text,$flag)=@_;  
     my $actionscript="setmode(this.form,'$action')";  
     return "\n<input type='button' name='$name' accesskey='$accesskey' value='".&mt($text)."'".  
            ($flag?&Apache::edit::submit_ask_anyway($actionscript):&Apache::edit::submit_dont_ask($actionscript))." />";  
 }  
   
 sub problem_edit_buttons {  sub problem_edit_buttons {
     my ($mode)=@_;     return  '
 # Buttons that do not save  <div class="LC_edit_problem_discards">
     my $result='<div class="LC_edit_problem_discards">'.         <input type="button" name="submitmode" accesskey="d" value="'.&mt('Discard Edits and View').'" '.
               &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);         ' onclick="javscript:setmode(this.form,'."'discard'".')"  />
     if ($mode eq 'editxml') {         <input '.&Apache::edit::submit_ask_anyway('setmode(this.form,'."'editxml'".')').' type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" />
         $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);         <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />
         $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);  </div>
         $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);  <div class="LC_edit_problem_saves">
     } else {         <input type="submit" name="submitbutton" accesskey="s" value="'.&mt('Save and Edit').'" />
         $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);         <input type="submit" name="submitbutton" accesskey="v" value="'.&mt('Save and View').'" />
         $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);  </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;  
 }  }
   
 sub problem_edit_header {  sub problem_edit_header {
     return '<input type="hidden" name="submitted" value="edit" />'.      return '<input type="hidden" name="submitted" value="edit" /><input type="hidden" name="problemmode" value="edit" />'.
  &remember_problem_state('edit').'   &Apache::structuretags::remember_problem_state().'
 <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').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
 </div>'.  </div>'.
 '<input type="hidden" name="problemmode" value="saveedit" />'.  
 &problem_edit_buttons().'  &problem_edit_buttons().'
 <hr style="clear:both;" />  <hr style="clear:both;" />
 '.&Apache::lonxml::message_location().'  '.&Apache::lonxml::message_location().'
Line 534  sub problem_edit_footer { Line 401  sub problem_edit_footer {
   <hr style="clear:both;" />    <hr style="clear:both;" />
 </div>  </div>
 '.  '.
   
       &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()).
     "\n</form>\n".&Apache::loncommon::end_page();      "\n</form>\n".&Apache::loncommon::end_page();
 }  }
   
Line 603  sub problem_web_to_edit_header { Line 472  sub problem_web_to_edit_header {
   ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option>    ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option>
   ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option>    ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option>
   ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>    ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>
   ".&option('randomizetry' ,'problemtype').&mt("New Randomization Each Try")."</option>  
 </select>  </select>
 </span>  </span>
 $show_all  $show_all
Line 761  sub finalize_storage { Line 629  sub finalize_storage {
     $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,      $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
     $symb,$courseid,$domain,$name);      $symb,$courseid,$domain,$name);
     &Apache::lonxml::debug('Store return message:'.$result);      &Apache::lonxml::debug('Store return message:'.$result);
             &store_aggregates($symb,$courseid);              if ($env{'request.role'} =~/^st/) {
                   &store_aggregates($symb,$courseid);
               }
  }   }
     } else {      } else {
  &Apache::lonxml::debug('Nothing to store');   &Apache::lonxml::debug('Nothing to store');
Line 781  item store_aggregates() Line 651  item store_aggregates()
   
 sub store_aggregates {  sub store_aggregates {
     my ($symb,$courseid) = @_;      my ($symb,$courseid) = @_;
     my (%aggregate,%anoncounter,%randtrycounter);      my %aggregate;
     my @parts;      my @parts;
     my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
Line 791  sub store_aggregates { Line 661  sub store_aggregates {
         }          }
     }      }
     foreach my $part (@parts) {      foreach my $part (@parts) {
         if ($env{'request.role'} =~/^st/) {          if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
             if ($Apache::lonhomework::results{'resource.'.$part.'.award'}      eq 'APPROX_ANS' ||
                 eq 'APPROX_ANS' ||      $Apache::lonhomework::results{'resource.'.$part.'.award'}
                 $Apache::lonhomework::results{'resource.'.$part.'.award'}      eq 'EXACT_ANS') {
                 eq 'EXACT_ANS') {              $aggregate{$symb."\0".$part."\0correct"} = 1;
                 $aggregate{$symb."\0".$part."\0correct"} = 1;  
             }  
             if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {  
                 $aggregate{$symb."\0".$part."\0users"} = 1;  
             } else {  
                 my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]);  
                 if ($last_reset) {  
                     if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {  
                         $aggregate{$symb."\0".$part."\0users"} = 1;  
                     }  
                 }  
             }  
             $aggregate{$symb."\0".$part."\0attempts"} = 1;  
         }          }
         if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') ||          if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
             ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred') ||              $aggregate{$symb."\0".$part."\0users"} = 1;
             ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry')) {          } else {
             if ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry') {              my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); 
                 $randtrycounter{$symb."\0".$part} = 1;              if ($last_reset) {
             } else {                  if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {
                 $anoncounter{$symb."\0".$part} = 1;                      $aggregate{$symb."\0".$part."\0users"} = 1;
             }  
             my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};  
             if ($needsrelease) {  
                 my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};  
                 if ($curr_required eq '') {  
                     &Apache::lonnet::update_released_required($needsrelease);  
                 } else {  
                     my ($currmajor,$currminor) = split(/\./,$curr_required);  
                     my ($needsmajor,$needsminor) = split(/\./,$needsrelease);  
                     if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) {  
                         &Apache::lonnet::update_released_required($needsrelease);  
                     }  
                 }                  }
             }              }
         }          }
           $aggregate{$symb."\0".$part."\0attempts"} = 1;
     }      }
     if (keys (%aggregate) > 0) {      if (keys (%aggregate) > 0) {
  &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,   &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
                             $cdomain,$cname);                              $cdomain,$cname);
     }      }
     if (keys(%anoncounter) > 0) {  
         &Apache::lonnet::cput('nohist_anonsurveys',\%anoncounter,  
                               $cdomain,$cname);  
     }  
     if (keys(%randtrycounter) > 0) {  
         &Apache::lonnet::cput('nohist_randomizetry',\%randtrycounter,  
                               $cdomain,$cname);  
     }  
 }  }
   
 sub checkout_msg {  sub checkout_msg {
Line 925  sub init_problem_globals { Line 763  sub init_problem_globals {
  &Apache::lonhomework::reset_show_problem_status();   &Apache::lonhomework::reset_show_problem_status();
  $Apache::lonhomework::ignore_response_errors=1;   $Apache::lonhomework::ignore_response_errors=1;
     }      }
     @Apache::functionplotresponse::callscripts=();  
     @Apache::inputtags::responselist = ();      @Apache::inputtags::responselist = ();
     @Apache::inputtags::importlist = ();      @Apache::inputtags::importlist = ();
     @Apache::inputtags::previous=();      @Apache::inputtags::previous=();
Line 945  sub reset_problem_globals { Line 782  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);
     if ($type eq 'Task') {  
         undef($Apache::inputtags::slot_name);  
     }  
 #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
 #   undef($Apache::lonhomework::parsing_a_problem);  #   undef($Apache::lonhomework::parsing_a_problem);
Line 956  sub reset_problem_globals { Line 790  sub reset_problem_globals {
     undef($Apache::lonhomework::type);      undef($Apache::lonhomework::type);
     undef($Apache::lonhomework::scantronmode);      undef($Apache::lonhomework::scantronmode);
     undef($Apache::lonhomework::ignore_response_errors);      undef($Apache::lonhomework::ignore_response_errors);
     undef(@Apache::functionplotresponse::callscripts);  
     &Apache::lonhomework::reset_show_problem_status();      &Apache::lonhomework::reset_show_problem_status();
 }  }
   
Line 1057  sub start_problem { Line 890  sub start_problem {
   
     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); }
     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') {
  #handle exam checkout   #handle exam checkout
Line 1075  sub start_problem { Line 908  sub start_problem {
     my @interval=&Apache::lonnet::EXT("resource.0.interval");      my @interval=&Apache::lonnet::EXT("resource.0.interval");
     &Apache::lonnet::set_first_access($interval[1]);      &Apache::lonnet::set_first_access($interval[1]);
  }   }
   
         ($status,$accessmsg,my $slot_name,my $slot) =  
             &Apache::lonhomework::check_slot_access('0','problem');  
         push (@Apache::inputtags::status,$status);  
   
  #handle rand seed in construction space   #handle rand seed in construction space
  my $rndseed=&setup_rndseed($safeeval,$target);   my $rndseed=&setup_rndseed($safeeval);
  my ($symb)=&Apache::lonnet::whichuser();   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')) {
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
Line 1109  sub start_problem { Line 936  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') &&  
                  ($status eq 'CAN_ANSWER')) {   ($status,$accessmsg,my $slot_name,my $slot) = 
             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");      &Apache::lonhomework::check_slot_access('0','problem');
             my $problemstatus = &get_problem_status($Apache::inputtags::part);   push (@Apache::inputtags::status,$status);
             $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);  
         }  
   
  my $expression='$external::datestatus="'.$status.'";';   my $expression='$external::datestatus="'.$status.'";';
  $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';   $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
Line 1196  sub start_problem { Line 1021  sub start_problem {
     $result .= '<input type="hidden" name="grade_'.$field.      $result .= '<input type="hidden" name="grade_'.$field.
  '" value="'.$env{"form.grade_$field"}.'" />'."\n";   '" value="'.$env{"form.grade_$field"}.'" />'."\n";
  }   }
                 foreach my $field ('questiontype','rndseed') {  
                     if ($env{"form.grade_$field"} ne '') {  
                         $result .= '<input type="hidden" name="grade_'.$field.  
                             '" value="'.$env{"form.grade_$field"}.'" />'."\n";  
                     }  
                 }  
   
     }      }
  } elsif ($target eq 'tex') {   } elsif ($target eq 'tex') {
     $result .= 'INSERTTEXFRONTMATTERHERE';      $result .= 'INSERTTEXFRONTMATTERHERE';
Line 1308  sub end_problem { Line 1126  sub end_problem {
  } else {   } else {
     $frontmatter.= $begin_doc.$toc_line;      $frontmatter.= $begin_doc.$toc_line;
     if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) {       if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { 
  $frontmatter .= '\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}';   $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
     }      }
  }   }
     } else {      } else {
Line 1318  sub end_problem { Line 1136  sub end_problem {
     if (not $env{'request.symb'} =~ m/\.page_/) {      if (not $env{'request.symb'} =~ m/\.page_/) {
  $frontmatter .= $begin_doc.$toc_line;   $frontmatter .= $begin_doc.$toc_line;
  if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) {    if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { 
     $frontmatter .= '\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}';      $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
  }   }
     } else {      } else {
  $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;   $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
Line 1342  sub end_problem { Line 1160  sub end_problem {
     }      }
  } elsif ( ($target eq 'web' || $target eq 'tex') &&   } elsif ( ($target eq 'web' || $target eq 'tex') &&
   $Apache::inputtags::part eq '0' &&    $Apache::inputtags::part eq '0' &&
   $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {     $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
     # if part is zero, no <part>s existed, so we need show the current      # if part is zero, no <part>s existed, so we need show the current
     # grading status      # grading status
     my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);      my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
Line 1352  sub end_problem { Line 1170  sub end_problem {
     (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||      (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
     ($target eq 'answer') || ($target eq 'tex')      ($target eq 'answer') || ($target eq 'tex')
    ) {     ) {
     if (($target ne 'tex') &&      if ($target ne 'tex' &&
  ($env{'form.answer_output_mode'} ne 'tex')) {   $env{'form.answer_output_mode'} ne 'tex') {
  $result.="</form>";   $result.="</form>";
    $result.= &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields());
     }      }
     if ($target eq 'web') {      if ($target eq 'web') {
  $result.= &Apache::loncommon::end_page({'discussion' => 1});   $result.= &Apache::loncommon::end_page({'discussion' => 1});
Line 1375  sub end_problem { Line 1194  sub end_problem {
  }   }
     }      }
  }   }
         if ($target eq 'web') {  
            $result.=&Apache::functionplotresponse::init_script();  
         }  
  if ($target eq 'grade') {   if ($target eq 'grade') {
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     &finalize_storage();      &finalize_storage();
Line 1435  sub start_library { Line 1251  sub start_library {
  ($result,$form_tag_start)=   ($result,$form_tag_start)=
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
  $name);   $name);
  my $rndseed=&setup_rndseed($safeeval,$target);   my $rndseed=&setup_rndseed($safeeval);
  $result.=" \n $form_tag_start".   $result.=" \n $form_tag_start".
   '<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);
Line 1674  sub start_instructorcomment { Line 1490  sub start_instructorcomment {
   
     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 'analyze' || $target eq 'webgrade') {   $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
         $result=($env{'request.role'}=~/^(in|cc|co|au|ca|li)/);          $result=($env{'request.role'}=~/^(in|cc|au|ca|li)/);
  if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {   if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
     my $skip=&Apache::lonxml::get_all_text("/instructorcomment",      my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
    $parser,$style);     $parser,$style);
Line 1879  sub ordered_show_check { Line 1695  sub ordered_show_check {
     return $in_order_show;      return $in_order_show;
 }  }
   
 sub start_startpartmarker {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;  
     my $result='';  
     if ($target eq 'edit') {  
         $result=&Apache::edit::tag_start($target,$token);  
         $result.=&mt('Marker for the start of a part. Place end marker below to wrap in-between tags into a new part.').'</td></tr>';  
         $result.=&Apache::edit::end_table();  
   
     }  
     return $result;  
 }  
   
 sub end_startpartmarker {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;  
     my @result;  
     if ($target eq 'edit') { $result[1]='no'; }  
     return @result;  
 }  
   
 sub start_endpartmarker {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;  
     my $result='';  
     if ($target eq 'edit') {  
         $result=&Apache::edit::tag_start($target,$token);  
         $result.=&mt('Marker for the end of a part. Place start marker above to wrap in-between tags into a new part.').'</td></tr>';  
         $result.=&Apache::edit::end_table();  
   
     }  
     return $result;  
 }  
   
 sub end_endpartmarker {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;  
     my @result;  
     if ($target eq 'edit') { $result[1]='no'; }  
     return @result;  
 }  
   
 sub start_part {  sub start_part {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     if (!$Apache::lonxml::metamode) {      if (!$Apache::lonxml::metamode) {
Line 2002  sub start_part { Line 1780  sub start_part {
  $allow_print_points=0;   $allow_print_points=0;
     }      }
     if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) {       if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { 
  $result .= '\vskip 10mm\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}';   $result .= '\vskip 10mm\fbox{\textit{'.$weight.' pt}}';
   
     }      }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
                     if ($status eq 'CAN_ANSWER') {      $result.='<a name="'.&escape($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;  
                         if ($probrandomize eq 'randomizetry') {  
                             if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {  
                                 $result .= &randomizetry_part_header($problemstatus,'none',$num);  
                             } else {  
                                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                                 if ($probrandtries ne $reqtries) {  
                                     $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);  
                                 }  
                             }  
                         } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') {  
                             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");  
                             $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);  
                         }  
                     }  
     $result.='<a name="'.&escape($Apache::inputtags::part).'"></a>';  
  }   }
     }      }
  }   }
Line 2196  sub start_problemtype { Line 1955  sub start_problemtype {
                                                ['anonsurvey','Anonymous Survey'],                                                 ['anonsurvey','Anonymous Survey'],
                                                ['anonsurveycred','Anonymous Survey (with credit)'],                                                 ['anonsurveycred','Anonymous Survey (with credit)'],
        ['problem','Homework Problem'],         ['problem','Homework Problem'],
                                                ['practice','Practice Problem'],                                                 ['practice','Practice Problem'] ]
                                                ['randomizetry','New Randomization Each Try'] ]  
      ,$token);       ,$token);
  $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
Line 2236  sub end_startouttext { Line 1994  sub end_startouttext {
  $result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>"   $result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>"
                  .'<td><span class="LC_nobreak">'.&mt('Delete?').' '                   .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
                  .&Apache::edit::deletelist($target,$token)                   .&Apache::edit::deletelist($target,$token)
                  .'</span></td>'                   .'</span></td>';
          .'<td align="left"><span id="math_'.$areaid.'" />'          unless ($env{'environment.wysiwygeditor'} eq 'on') {
  .&Apache::lonhtmlcommon::dragmath_button($areaid,1)      $result .= '<td align="left">'
  .'</td>'   .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
  .'<td>'   .'</td>'
  .&Apache::edit::insertlist($target,$token)   .'<td>'
  .'</td>'   .&Apache::edit::insertlist($target,$token)
          .'<td align="right" valign="top">' .   .'</td>';
          &Apache::loncommon::helpLatexCheatsheet().   }
    $result.='<td align="right" valign="top">' .
       &Apache::loncommon::helpLatexCheatsheet().
  &Apache::edit::end_row().   &Apache::edit::end_row().
                  &Apache::edit::start_spanning_row()."\n".                   &Apache::edit::start_spanning_row()."\n".
  &Apache::edit::editfield($token->[1],$text,"",80,8,1);   &Apache::edit::editfield($token->[1],$text,"",80,8,1);
Line 2312  sub start_simpleeditbutton { Line 2072  sub start_simpleeditbutton {
 #              .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.')  #              .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.')
 #              .&Apache::loncommon::help_open_topic('Caching')  #              .&Apache::loncommon::help_open_topic('Caching')
 #              .'</p>';  #              .'</p>';
         $result.=&Apache::loncommon::head_subbox(          $result.=&Apache::lonhtmlcommon::start_funclist()
                  &Apache::lonhtmlcommon::start_funclist()  
                 .&Apache::lonhtmlcommon::add_item_funclist(                  .&Apache::lonhtmlcommon::add_item_funclist(
                      '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'                       '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'
                     .&mt('Edit').'</a>')                      .&mt('Edit').'</a>')
                 .&Apache::lonhtmlcommon::end_funclist());                  .&Apache::lonhtmlcommon::end_funclist();
   
     }      }
     return $result;      return $result;
Line 2333  sub practice_problem_header { Line 2092  sub practice_problem_header {
            '</span>';             '</span>';
 }  }
   
 sub randomizetry_problem_header {  
     my ($problemstatus,$reqtries) = @_;  
     my ($header,$text);  
     if ($reqtries > 1) {  
         $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);  
         if (($problemstatus eq 'no') ||  
             ($problemstatus eq 'no_feedback_ever')) {  
             $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries);  
         } else {  
             $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries);  
         }  
     } else {  
         $header = &mt('New Problem Variation Each Try');  
         if (($problemstatus eq 'no') ||  
             ($problemstatus eq 'no_feedback_ever')) {  
             $text = &mt('A new variation will be generated after each try until the tries limit is reached.');  
   
         } else {  
             $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>'.  
            '<span class="LC_info">'.$text.'</span><hr />';  
 }  
   
 sub randomizetry_part_header {  
     my ($problemstatus,$reqtries,$num) = @_;  
     my ($header,$text);  
     if ($reqtries eq 'none') {  
         $header = &mt('No Question Variation');  
         $text = &mt('For this question there will no new variation after a try.');  
     } elsif ($reqtries > 1) {  
         $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);  
         if (($problemstatus eq 'no') ||  
             ($problemstatus eq 'no_feedback_ever')) {  
             $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries);  
         } else {  
             $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries);  
         }  
     } else {  
         $header = &mt('New Question Variation For Each Try');  
         if (($problemstatus eq 'no') ||  
             ($problemstatus eq 'no_feedback_ever')) {  
             $text =  &mt('For this question a new variation will be generated after each try until the tries limit is reached.');  
         } else {  
             $text = &mt('For this question a new variation will be generated after each try until correct or tries limit is reached.');  
         }  
     }  
     my $output;  
     if ($num > 1) {  
         $output .= '<hr />';  
     }  
     $output .=  '<span class="LC_info"><h4>'.$header.'</h4></span>'.  
                   '<span class="LC_info">'.$text.'</span><br /><br />';  
     return $output;  
 }  
   
 1;  1;
 __END__  __END__
   

Removed from v.1.465.2.15  
changed lines
  Added in v.1.466


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