Diff for /loncom/homework/structuretags.pm between versions 1.242 and 1.304

version 1.242, 2004/02/16 20:30:34 version 1.304, 2005/10/07 13:56:19
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # 2/19 Guy  ###
 # 6/26/2001 fixed extra web display at end of <web></web> tags  
 # 8/17,8/18,8/20 Gerd Kortemeyer  
   
   
 package Apache::structuretags;   package Apache::structuretags; 
Line 38  use Apache::File(); Line 36  use Apache::File();
 use Apache::lonmenu;  use Apache::lonmenu;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonxml;  use Apache::lonxml;
   use Time::HiRes qw( gettimeofday tv_interval );
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','startouttext','endouttext',      &Apache::lonxml::register('Apache::structuretags',('block','languageblock','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag'));
 'simpleeditbutton','definetag'));  
 }  }
   
 sub start_web {  sub start_web {
Line 71  sub end_tex { Line 68  sub end_tex {
     return '';      return '';
 }  }
   
   sub body_tag_start {
       my ($target,$background,$bgcolor)=@_;
       my $body_tag_start='<body onload="'.&Apache::lonmenu::loadevents().'" '.
    'onunload="'.&Apache::lonmenu::unloadevents().'" ';
       if ($env{'browser.imagesuppress'} eq 'on') { $background=''; }
       if ($background) {
    $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
       $background;
    $body_tag_start.='background="'.$background.'" ';
       } else {
    if (($bgcolor) && ($env{'browser.blackwhite'} ne 'on')) {
       $body_tag_start.='bgcolor="'.$bgcolor.'" ';
    } else {
       $body_tag_start.='bgcolor="#ffffff"';
    }
       }
       if ($env{'browser.fontenhance'} eq 'on') {
    $body_tag_start.=' style="font-size: x-large;" ';
       }
       $body_tag_start.='>'.&Apache::lonmenu::menubuttons(undef,$target,1);
       
       &Apache::lontexconvert::jsMath_reset();
       if ($env{'environment.texengine'} eq 'jsMath') {
    $body_tag_start.=&Apache::lontexconvert::jsMath_header();
       }
       return $body_tag_start;
   }
   
 sub page_start {  sub page_start {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my %found;      my %found;
Line 85  sub page_start { Line 110  sub page_start {
     if (!defined($found{'html'})) {      if (!defined($found{'html'})) {
  $result=&Apache::londefdef::start_html($target,$token,$tagstack,   $result=&Apache::londefdef::start_html($target,$token,$tagstack,
        $parstack,$parser,$safeeval);         $parstack,$parser,$safeeval);
  $head_tag_start='<head>'.&Apache::lonmenu::registerurl(undef,$target);   $head_tag_start='<head>'.&Apache::lonmenu::registerurl(undef,$target).
       &Apache::lonhtmlcommon::htmlareaheaders().
       &Apache::lonhtmlcommon::spellheader().
       &Apache::lonxml::fontsettings();     
     }      }
     my $body_tag_start;      my $body_tag_start;
     if (!defined($found{'body'})) {      if (!defined($found{'body'}) && $env{'request.state'} eq 'construct'
  $body_tag_start='<body onLoad="'.&Apache::lonmenu::loadevents().'" '.   && $env{'environment.remote'} eq 'off') {
     'onUnload="'.&Apache::lonmenu::unloadevents().'" ';   if ($target eq 'web' || $target eq 'edit') {
       $body_tag_start=&Apache::loncommon::bodytag();
       $body_tag_start.=&Apache::lonxml::message_location();
    }
       } elsif (!defined($found{'body'})) {
  my $background=&Apache::lonxml::get_param('background',$parstack,   my $background=&Apache::lonxml::get_param('background',$parstack,
   $safeeval);    $safeeval);
  if ($ENV{'browser.imagesuppress'} eq 'on') { $background=''; }   my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
  if ($background) {         $safeeval);
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=   $body_tag_start=&body_tag_start($target,$background,$bgcolor);
  $background;   if ( ($target eq 'web' || $target eq 'webgrade')
     $body_tag_start.='background="'.$background.'" ';       && $env{'request.state'} ne 'construct') {
  } else {  
     my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,  
    $safeeval);  
     if (($bgcolor) && ($ENV{'browser.blackwhite'} ne 'on')) {  
  $body_tag_start.='bgcolor="'.$bgcolor.'" ';  
     } else {  
  $body_tag_start.='bgcolor="#ffffff"';  
     }  
  }  
  if ($ENV{'browser.fontenhance'} eq 'on') {  
     $body_tag_start.=' style="font-size: x-large;" ';  
  }  
  $body_tag_start.='>'.&Apache::lonmenu::menubuttons(undef,$target,1);  
  if ($target eq 'web' && $ENV{'request.state'} ne 'construct') {  
     my ($symb,undef,undef,undef,$publicuser)=      my ($symb,undef,undef,undef,$publicuser)=
  &Apache::lonxml::whichuser();   &Apache::lonxml::whichuser();
     if ($symb eq '' && !$publicuser) {      if ($symb eq '' && !$publicuser) {
Line 120  sub page_start { Line 138  sub page_start {
  $body_tag_start.=$help;   $body_tag_start.=$help;
     }      }
  }   }
    $body_tag_start.=&Apache::lonxml::message_location();
     }      }
     my $form_tag_start;      my $form_tag_start;
     if (!defined($found{'form'})) {      if (!defined($found{'form'})) {
  $form_tag_start='<form name="lonhomework" method="POST" action="'.   $form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="POST" action="';
     $ENV{'request.uri'}.'">';   my $uri=$env{'request.uri'};
    if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
    $form_tag_start.=$uri.'">';
     }      }
     return ($result,$head_tag_start,$body_tag_start,$form_tag_start);      return ($result,$head_tag_start,$body_tag_start,$form_tag_start);
 }  }
Line 135  sub get_resource_name { Line 156  sub get_resource_name {
     if (defined($Apache::lonhomework::name)) {      if (defined($Apache::lonhomework::name)) {
  return $Apache::lonhomework::name;   return $Apache::lonhomework::name;
     }      }
     my $name=&Apache::lonnet::gettitle();      my ($symb)=&Apache::lonxml::whichuser();
       my $name=&Apache::lonnet::gettitle($symb);
     if ($name eq '') {      if ($name eq '') {
  $name=&Apache::lonnet::EXT('resource.title');   $name=&Apache::lonnet::EXT('resource.title');
  if ($name eq 'con_lost') { $name = ''; }   if ($name eq 'con_lost') { $name = ''; }
     }      }
     if ($name!~/\S+/) {      if ($name!~/\S+/) {
  $name=$ENV{'request.uri'};   $name=$env{'request.uri'};
  $name=~s-.*/([^/]+)$-$1-;   $name=~s-.*/([^/]+)$-$1-;
     }      }
     $Apache::lonhomework::name=$name;      $Apache::lonhomework::name=$name;
Line 152  sub setup_rndseed { Line 174  sub setup_rndseed {
     my ($safeeval)=@_;      my ($safeeval)=@_;
     my $rndseed;      my $rndseed;
     my ($symb)=&Apache::lonxml::whichuser();      my ($symb)=&Apache::lonxml::whichuser();
     if ($ENV{'request.state'} eq "construct" || $symb eq '') {      if ($env{'request.state'} eq "construct" || $symb eq '' ||
  $rndseed=$ENV{'form.rndseed'};            $Apache::lonhomework::history{'resource.CODE'}) {
    $rndseed=$env{'form.rndseed'};
  if (!$rndseed) {   if (!$rndseed) {
     $rndseed=$Apache::lonhomework::history{'rndseed'};      $rndseed=$Apache::lonhomework::history{'rndseed'};
     if (!$rndseed) {      if (!$rndseed) {
  $rndseed=time;   $rndseed=time;
     }      }
     $ENV{'form.rndseed'}=$rndseed;      $env{'form.rndseed'}=$rndseed;
  }   }
  if ($ENV{'form.resetdata'} eq &mt('New Problem Variation') ||   if ($env{'form.resetdata'} eq &mt('New Problem Variation') ||
     $ENV{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     srand(time);      srand(time);
     $rndseed=int(rand(2100000000));      $rndseed=int(rand(2100000000));
     $ENV{'form.rndseed'}=$rndseed;      $env{'form.rndseed'}=$rndseed;
     delete($ENV{'form.resetdata'});      delete($env{'form.resetdata'});
     delete($ENV{'form.newrandomization'});      delete($env{'form.newrandomization'});
  }   }
  if (defined($rndseed) && $rndseed ne int($rndseed)) {   if (defined($rndseed) && $rndseed ne int($rndseed)) {
    $rndseed=join(',',&Math::Random::random_seed_from_phrase($rndseed));     $rndseed=join(',',&Math::Random::random_seed_from_phrase($rndseed));
         }          }
           if ($Apache::lonhomework::history{'resource.CODE'}) {
      $rndseed=&Apache::lonnet::rndseed();
    }
  if ($safeeval) {   if ($safeeval) {
     &Apache::lonxml::debug("Setting rndseed to $rndseed");      &Apache::lonxml::debug("Setting rndseed to $rndseed");
     &Apache::run::run('$external::randomseed='.$rndseed.';',$safeeval);      &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
  }   }
     }      }
     return $rndseed;      return $rndseed;
 }  }
   
   sub remember_problem_state {
       return '
          <input type="hidden" name="problemstate" value="'.$env{'form.problemstate'}.'" />
          <input type="hidden" name="problemtype" value="'.$env{'form.problemtype'}.'" />
          <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';
   }
   
 sub problem_edit_header {  sub problem_edit_header {
     return '<input type="hidden" name="submitted" value="edit" />      return '<input type="hidden" name="submitted" value="edit" />'.
    &Apache::structuretags::remember_problem_state().'
        <input type="hidden" name="problemmode" value="'.&mt('Edit').'" />         <input type="hidden" name="problemmode" value="'.&mt('Edit').'" />
        <input type="submit" name="problemmode" value="'.&mt('Discard Edits and View').'" />         <input type="submit" name="problemmode" accesskey="d" value="'.&mt('Discard Edits and View').'" />
        <input type="submit" name="problemmode" value="'.&mt('EditXML').'" />         <input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
        <input type="submit" name="Undo" value="'.&mt('undo').'" /> <hr />         <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" /> <hr />
        <input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />         <input type="submit" name="submit" accesskey="s" value="'.&mt('Submit Changes and Edit').'" />
        <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" /><table><tr><td>'.         <input type="submit" name="submit" accesskey="v" value="'.&mt('Submit Changes and View').'" /><table><tr><td>'.
        &Apache::loncommon::help_open_topic('Problem_Editor_XML_Index',         &Apache::loncommon::help_open_menu('','Problem Editing Help','Problem_Editor_XML_Index','',5,'Authoring',undef,undef,undef,'Problem Editing Help')
    'Problem Editing Help').'</td><td>'.         .'</td></tr></table>'.
        &Apache::loncommon::help_open_faq(5).         '<table border="0" width="100%"><tr><td bgcolor="#DDDDDD">';
        &Apache::loncommon::help_open_bug('Authoring').'</td></tr></table>'.  
        '<table border="0"><tr><td bgcolor="#DDDDDD">';  
 }  }
   
 sub problem_edit_footer {  sub problem_edit_footer {
     return '</td></tr></table><br /><input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />      return '</td></tr></table><br /><input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />
     <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />';      <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />'.
       &Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields).
       "\n</form>\n".&Apache::loncommon::endbodytag()."\n</html>";
 }  }
   
 sub option {  sub option {
     my ($value,$name) = @_;      my ($value,$name) = @_;
     my $result ="<option value='".$value."' ";      my $result ="<option value='".$value."' ";
     if ($ENV{'form.'.$name} eq $value) {      if ($env{'form.'.$name} eq $value) {
  $result.=" selected='on' ";   $result.=" selected='on' ";
     }      }
     $result.='>';      $result.='>';
Line 213  sub option { Line 247  sub option {
 sub problem_web_to_edit_header {  sub problem_web_to_edit_header {
     my ($rndseed)=@_;      my ($rndseed)=@_;
     my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />      my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />
              <input type="submit" name="problemmode" value="'.&mt('Edit').'" />               <input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />
              <input type="submit" name="problemmode" value="'.&mt('EditXML').'" />               <input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
              <input type="submit" name="newrandomization" value="'.&mt('New Randomization').'" />               <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
              <input type="submit" name="resetdata" value="'.&mt('Reset Submissions').'" />               <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
              <nobr><input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />               <nobr><input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
               <input type="text" name="rndseed" width="10" value="'.                <input type="text" name="rndseed" size="10" value="'.
        $rndseed.'"         $rndseed.'"
            onChange="javascript:document.lonhomework.changerandseed.click()" /></nobr>             onchange="javascript:document.lonhomework.changerandseed.click()" /></nobr>
              <input type="checkbox" name="showallfoils" ';               <label><input type="checkbox" name="showallfoils" ';
     if (defined($ENV{'form.showallfoils'})) { $result.='checked="on"'; }      if (defined($env{'form.showallfoils'})) { $result.='checked="on"'; }
     $result.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').      $result.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').
  &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems').   &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems').
  '<hr />';   '</label><hr />';
     $result.="      $result.="
 <nobr>  <nobr>
 Problem Status:  Problem Status:
 <select name='problemstate'>  <select name='problemstate'>
   <option name=''></option>    <option value=''></option>
   ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>    ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
   ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>    ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
   ".&option('CANNOT_ANSWER_tries'  ,'problemstate').&mt("Open with full tries")."</option>    ".&option('CANNOT_ANSWER_tries'  ,'problemstate').&mt("Open with full tries")."</option>
Line 241  Problem Status: Line 275  Problem Status:
 <nobr>  <nobr>
 Problem Type:  Problem Type:
 <select name='problemtype'>  <select name='problemtype'>
   <option name=''></option>    <option value=''></option>
   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>    ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>
   ".&option('problem','problemtype').&mt("Homework problem")."</option>    ".&option('problem','problemtype').&mt("Homework problem")."</option>
   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>    ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
Line 257  Feedback Mode: Line 291  Feedback Mode:
 </nobr>  </nobr>
 <input type='submit' name='changeproblemmode' value='".&mt("Change")."' />  <input type='submit' name='changeproblemmode' value='".&mt("Change")."' />
 <hr />";  <hr />";
     my $numtoanalyze=$ENV{'form.numtoanalyze'};      my $numtoanalyze=$env{'form.numtoanalyze'};
     if (!$numtoanalyze) { $numtoanalyze=20; }      if (!$numtoanalyze) { $numtoanalyze=20; }
     $result.= '<input type="submit" name="problemmode" value='.      $result.= '<input type="submit" name="problemmode" value='.
  &mt('"Calculate answers').'" /> for   &mt('"Calculate answers').'" /> for
Line 273  sub initialize_storage { Line 307  sub initialize_storage {
     %Apache::lonhomework::results=();      %Apache::lonhomework::results=();
     %Apache::lonhomework::history=();      %Apache::lonhomework::history=();
     my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();      my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
     if ($ENV{'request.state'} eq 'construct' || $symb eq '') {      if ($env{'request.state'} eq 'construct' || $symb eq '') {
  %Apache::lonhomework::history=   %Apache::lonhomework::history=
     &Apache::lonnet::tmprestore($ENV{'request.uri'},'',$domain,$name);      &Apache::lonnet::tmprestore($env{'request.uri'},'',$domain,$name);
  my ($temp)=keys %Apache::lonhomework::history ;   my ($temp)=keys %Apache::lonhomework::history ;
  &Apache::lonxml::debug("Return message of $temp");   &Apache::lonxml::debug("Return message of $temp");
     } else {      } else {
Line 291  sub initialize_storage { Line 325  sub initialize_storage {
 # Stores away the result has to a student's environment  # Stores away the result has to a student's environment
 # checks form.grade_ for specific values, other wises stores  # checks form.grade_ for specific values, other wises stores
 # to the running users environment  # to the running users environment
   # Will increment totals for attempts, students, and corrects
   # if running user has student role.  
 sub finalize_storage {  sub finalize_storage {
     my $result;      my $result;
     my ($temp) = keys %Apache::lonhomework::results;      if (%Apache::lonhomework::results) {
     if ( $temp ne '' ) {  
  my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();   my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
  if ($ENV{'request.state'} eq 'construct' || $symb eq '') {   if ($env{'request.state'} eq 'construct' || $symb eq '') {
     $Apache::lonhomework::results{'rndseed'}=$ENV{'form.rndseed'};      $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'};
     $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,      $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
  $ENV{'request.uri'},'',$domain,$name);   $env{'request.uri'},'',$domain,$name);
     &Apache::lonxml::debug('Construct Store return message:'.$result);      &Apache::lonxml::debug('Construct Store return message:'.$result);
  } else {   } else {
     $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);
               if ($env{'request.role'} =~/^st/) {
                   &store_aggregates($symb,$courseid);
               }
  }   }
     }      }
     return $result;      return $result;
 }  }
   use Data::Dumper;
   
   # -------------------------------------------------------------store_aggregates
   # Sends hash of values to be incremented in nohist_resourcetracker.db
   # for the course. Increments total number of attempts, unique students 
   # and corrects for each part for an instance of a problem, as appropriate.
   sub store_aggregates {
       my ($symb,$courseid) = @_;
       my %aggregate;
       my @parts;
       my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
       foreach my $key (keys(%Apache::lonhomework::results)) {
           if ($key =~ /resource\.([^\.]+)\.tries/) {
               push(@parts, $1);
           }
       }
       foreach my $part (@parts) {
           if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
       eq 'APPROX_ANS' ||
       $Apache::lonhomework::results{'resource.'.$part.'.award'}
       eq 'EXACT_ANS') {
               $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 (keys (%aggregate) > 0) {
    &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
                               $cdomain,$cname);
       }
   }
   
 sub checkout_msg {  sub checkout_msg {
     my %lt=&Apache::lonlocal::texthash(       my %lt=&Apache::lonlocal::texthash( 
Line 323  sub checkout_msg { Line 402  sub checkout_msg {
 <font color="red">  <font color="red">
 <p>$lt{'warning'}</p>  <p>$lt{'warning'}</p>
 </font>  </font>
 <form name="checkout" method="POST" action="$ENV{'request.uri'}">  <form name="checkout" method="POST" action="$env{'request.uri'}">
 <input type="hidden" name="doescheckout" value="yes" />  <input type="hidden" name="doescheckout" value="yes" />
 <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />  <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
 }  }
   
   sub firstaccess_msg {
       my ($time,$symb)=@_;
       my ($map)=&Apache::lonnet::decode_symb($symb);
       my $foldertitle=&Apache::lonnet::gettitle($map);
       &Apache::lonxml::debug("map is $map title is $foldertitle");
       return (<<ENDCHECKOUT);
   <h2>The resources in "$foldertitle" are open for a limited time. Once you click the 'Show Resource' button below you have $time to complete all resources "$foldertitle".</h2>
   <form name="markaccess" method="POST" action="$env{'request.uri'}">
   <input type="hidden" name="markaccess" value="yes" />
   <input type="button" name="accessbutton" value="Show Resource" onClick="javascript:if (confirm('Start Timer?')) { document.markaccess.submit(); }" />
   </form>
   ENDCHECKOUT
   }
   
 sub init_problem_globals {  sub init_problem_globals {
     my ($type)=@_;      my ($type)=@_;
     #initialize globals      #initialize globals
     if ($type eq 'problem') {      if ($type eq 'problem') {
  $Apache::inputtags::part='0';   $Apache::inputtags::part='0';
  @Apache::inputtags::partlist=('0');   @Apache::inputtags::partlist=('0');
    $Apache::lonhomework::problemstatus=&get_problem_status('0');
  $Apache::lonhomework::problemstatus=&get_problem_status('0')   $Apache::lonhomework::ignore_response_errors=0;
     } else {      } elsif ($type eq 'library') {
  $Apache::inputtags::part='';   $Apache::inputtags::part='';
  @Apache::inputtags::partlist=();   @Apache::inputtags::partlist=();
  $Apache::lonhomework::problemstatus='';   $Apache::lonhomework::problemstatus='';
    $Apache::lonhomework::ignore_response_errors=1;
       } elsif ($type eq 'Task') {
    $Apache::inputtags::part='0';
    @Apache::inputtags::partlist=('0');
    $Apache::lonhomework::problemstatus='';
    $Apache::lonhomework::ignore_response_errors=1;
     }      }
     @Apache::inputtags::responselist = ();      @Apache::inputtags::responselist = ();
     @Apache::inputtags::importlist = ();      @Apache::inputtags::importlist = ();
Line 369  sub reset_problem_globals { Line 468  sub reset_problem_globals {
   
 sub set_problem_state {  sub set_problem_state {
     my ($part)=@_;      my ($part)=@_;
     if ($ENV{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {      if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
  $Apache::lonhomework::history{"resource.$part.solved"}=   $Apache::lonhomework::history{"resource.$part.solved"}=
     'correct_by_student';      'correct_by_student';
     }      }
Line 377  sub set_problem_state { Line 476  sub set_problem_state {
   
 sub get_problem_status {  sub get_problem_status {
     my ($part)=@_;      my ($part)=@_;
     my $problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");      my $problem_status;
     &Apache::lonxml::debug("problem status for $part is $problem_status");      if ($env{'request.state'} eq 'construct' &&
     &Apache::lonxml::debug("env probstat is ".$ENV{'form.problemstatus'});   defined($env{'form.problemstatus'})) {
     if ($ENV{'request.state'} eq 'construct' &&   $problem_status=$env{'form.problemstatus'};
  defined($ENV{'form.problemstatus'})) {      } else {
  $problem_status=$ENV{'form.problemstatus'};   $problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
    &Apache::lonxml::debug("problem status for $part is $problem_status");
    &Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
     }      }
     return $problem_status;      return $problem_status;
 }  }
Line 400  sub start_problem { Line 501  sub start_problem {
     $Apache::lonhomework::parsing_a_problem=1;      $Apache::lonhomework::parsing_a_problem=1;
     &init_problem_globals('problem');      &init_problem_globals('problem');
   
     if (defined($ENV{'scantron.maxquest'})) {      if (defined($env{'scantron.maxquest'})) {
  $Apache::lonhomework::scantronmode=1;   $Apache::lonhomework::scantronmode=1;
     }      }
   
       &initialize_storage();
     if ($target ne 'analyze') {      if ($target ne 'analyze') {
  &initialize_storage();  
  if ($target eq 'web') {   if ($target eq 'web') {
     &Apache::lonhomework::showhash(%Apache::lonhomework::history);      &Apache::lonhomework::showhash(%Apache::lonhomework::history);
  }   }
         if ($ENV{'request.state'} eq 'construct') { &set_problem_state('0'); }          if ($env{'request.state'} eq 'construct') { &set_problem_state('0'); }
  $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');   $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
  if (($ENV{'request.state'} eq 'construct') &&   if (($env{'request.state'} eq 'construct') &&
     defined($ENV{'form.problemtype'})) {      defined($env{'form.problemtype'})) {
     $Apache::lonhomework::type=$ENV{'form.problemtype'};      $Apache::lonhomework::type=$env{'form.problemtype'};
  }   }
  &Apache::lonxml::debug("Found this to be of type :$Apache::ltonhomework::type:");   &Apache::lonxml::debug("Found this to be of type :$Apache::ltonhomework::type:");
     }      }
     if ($Apache::lonhomework::type eq '' ) {      if ($Apache::lonhomework::type eq '' ) {
  my $uri=$ENV{'request.uri'};   my $uri=$env{'request.uri'};
  if ($uri=~/\.(\w+)$/) {   if ($uri=~/\.(\w+)$/) {
     $Apache::lonhomework::type=$1;      $Apache::lonhomework::type=$1;
     &Apache::lonxml::debug("Using type of $1");      &Apache::lonxml::debug("Using type of $1");
Line 427  sub start_problem { Line 528  sub start_problem {
     &Apache::lonxml::debug("Using default type, problem, :$uri:");      &Apache::lonxml::debug("Using default type, problem, :$uri:");
  }   }
     }      }
       $Apache::lonhomework::default_type = $Apache::lonhomework::type;
   
     #added vars to the scripting enviroment      #added vars to the scripting enviroment
     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';      my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
       $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
     &Apache::run::run($expression,$safeeval);      &Apache::run::run($expression,$safeeval);
     my $status;      my $status;
     my $accessmsg;      my $accessmsg;
Line 437  sub start_problem { Line 540  sub start_problem {
     #should get back a <html> or the neccesary stuff to start XML/MathML      #should get back a <html> or the neccesary stuff to start XML/MathML
     my ($result,$head_tag_start,$body_tag_start,$form_tag_start)=      my ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
  &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);   &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
     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); }      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' ||
Line 446  sub start_problem { Line 549  sub start_problem {
  if ($Apache::lonhomework::type eq 'exam') {   if ($Apache::lonhomework::type eq 'exam') {
     my $token=      my $token=
  $Apache::lonhomework::history{"resource.0.outtoken"};   $Apache::lonhomework::history{"resource.0.outtoken"};
     if (($ENV{'form.doescheckout'}) && (!$token)) {      if (($env{'form.doescheckout'}) && (!$token)) {
  $token=&Apache::lonxml::maketoken();   $token=&Apache::lonxml::maketoken();
  $Apache::lonhomework::history{"resource.0.outtoken"}=   $Apache::lonhomework::history{"resource.0.outtoken"}=
     $token;      $token;
     }      }
     $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);      $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);
  }   }
    if ($env{'form.markaccess'}) {
       &Apache::lonnet::set_first_access('map');
    }
  #handle rand seed in construction space   #handle rand seed in construction space
  my $rndseed=&setup_rndseed($safeeval);   my $rndseed=&setup_rndseed($safeeval);
  my ($symb)=&Apache::lonxml::whichuser();   my ($symb)=&Apache::lonxml::whichuser();
  if ($ENV{'request.state'} ne "construct" && $symb eq '') {   if ($env{'request.state'} ne "construct" && $symb eq '') {
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
  $rndseed.'" />'.   $rndseed.'" />'.
     '<input type="submit" name="resetdata"      '<input type="submit" name="resetdata"
                              value="'.&mt('New Problem Variation').'" />'.                               value="'.&mt('New Problem Variation').'" />'.
     '<input type="hidden" name="username"      '<input type="hidden" name="username"
                              value="'.$ENV{'form.username'}.'" /> <br />';                               value="'.$env{'form.username'}.'" />';
       if ($env{'user.adv'}) {
    $form_tag_start.=
       ' <label><input type="checkbox" name="showallfoils" ';
    if (defined($env{'form.showallfoils'})) {
       $form_tag_start.='checked="on"';
    }
    $form_tag_start.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').
       '</label>';
       }
       $form_tag_start.='<hr />';
  }   }
  ($status,$accessmsg) = &Apache::lonhomework::check_access('0');   ($status,$accessmsg) = &Apache::lonhomework::check_access('0');
  push (@Apache::inputtags::status,$status);   push (@Apache::inputtags::status,$status);
Line 473  sub start_problem { Line 588  sub start_problem {
  &Apache::lonxml::debug("Got $status");   &Apache::lonxml::debug("Got $status");
  if (( $status eq 'CLOSED' ) ||   if (( $status eq 'CLOSED' ) ||
     ( $status eq 'UNCHECKEDOUT') ||      ( $status eq 'UNCHECKEDOUT') ||
       ( $status eq 'NOT_YET_VIEWED') ||
     ( $status eq 'BANNED') ||      ( $status eq 'BANNED') ||
     ( $status eq 'UNAVAILABLE') ||      ( $status eq 'UNAVAILABLE') ||
     ( $status eq 'INVALID_ACCESS')) {      ( $status eq 'INVALID_ACCESS')) {
Line 481  sub start_problem { Line 597  sub start_problem {
  $result.= $head_tag_start.'</head>';   $result.= $head_tag_start.'</head>';
  my $msg=$body_tag_start;   my $msg=$body_tag_start;
  if ($status eq 'UNAVAILABLE') {   if ($status eq 'UNAVAILABLE') {
     $result.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';      $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
  } else {   } elsif ($status ne 'NOT_YET_VIEWED') {
     $result.='<h1>'.&mt('Not open to be viewed').'</h1>';      $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
  }   }
  if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {   if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
     $msg.='The problem '.$accessmsg;      $msg.='The problem '.$accessmsg;
  } elsif ($status eq 'UNCHECKEDOUT') {   } elsif ($status eq 'UNCHECKEDOUT') {
     $msg.=&checkout_msg;      $msg.=&checkout_msg;
    } elsif ($status eq 'NOT_YET_VIEWED') {
       $msg.=&firstaccess_msg($accessmsg,$symb);
  }   }
  $result.=$msg.'<br />';   $result.=$msg.'<br />';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
Line 505  sub start_problem { Line 623  sub start_problem {
               $body_tag_start \n $form_tag_start".                $body_tag_start \n $form_tag_start".
       '<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'});   $result.= &problem_web_to_edit_header($env{'form.rndseed'});
     }      }
     # if we are viewing someone else preserve that info      # if we are viewing someone else preserve that info
     if (defined $ENV{'form.grade_symb'}) {      if (defined $env{'form.grade_symb'}) {
  foreach my $field ('symb','courseid','domain','username') {   foreach my $field ('symb','courseid','domain','username') {
     $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";
  }   }
     }      }
  } elsif ($target eq 'tex') {   } elsif ($target eq 'tex') {
     my $startminipage = '';      my $startminipage = '';
     if (not $ENV{'form.problem_split'}=~/yes/) {      if (not $env{'form.problem_split'}=~/yes/) {
  $startminipage = '\begin{minipage}{\textwidth}';   $startminipage = '\begin{minipage}{\textwidth}';
     }      }
     my $id = $Apache::inputtags::part;      my $id = $Apache::inputtags::part;
     my $weight = &Apache::lonnet::EXT("resource.$id.weight");      my $weight = &Apache::lonnet::EXT("resource.$id.weight");
     my $packages=&Apache::lonnet::metadata($ENV{'request.uri'},'packages');      my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
     my @packages = split /,/,$packages;      my @packages = split /,/,$packages;
     my $allow_print_points = 0;      my $allow_print_points = 0;
     foreach my $partial_key (@packages) {      foreach my $partial_key (@packages) {
Line 530  sub start_problem { Line 648  sub start_problem {
     $allow_print_points=1;      $allow_print_points=1;
  }   }
     }      }
       my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
       if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
       if (lc($env{'course.'.$env{'request.course.id'}.
       '.disableexampointprint'}) eq 'yes') {
    $allow_print_points=0;
       }
     my $duedate = &Apache::lonnet::EXT("resource.$id.duedate");       my $duedate = &Apache::lonnet::EXT("resource.$id.duedate"); 
     $duedate = POSIX::strftime("%c",localtime($duedate));      $duedate = POSIX::strftime("%c",localtime($duedate));
     my $temp_file;      my $temp_file;
     my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
     if (-e $filename) {      if (-e $filename) {
  $temp_file = Apache::File->new($filename);   $temp_file = Apache::File->new($filename);
     } else {      } else {
Line 542  sub start_problem { Line 666  sub start_problem {
     my @due_file_content = <$temp_file>;      my @due_file_content = <$temp_file>;
     my $due_file_content = $due_file_content[$#due_file_content];      my $due_file_content = $due_file_content[$#due_file_content];
     chomp $due_file_content;      chomp $due_file_content;
     my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval));      my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
       my $begin_doc='\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$env{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent ';
       my $toc_line='\vskip 1 mm\noindent '.$startminipage.
    '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
     if ($due_file_content ne $duedate) {      if ($due_file_content ne $duedate) {
  $temp_file = Apache::File->new('>'.$filename);   $temp_file = Apache::File->new('>'.$filename);
  print $temp_file "$duedate\n";   print $temp_file "$duedate\n";
  if (not $ENV{'request.symb'} =~ m/\.page_/) {   if (not $env{'request.symb'} =~ m/\.page_/) {
     if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {      if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
  $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent\textit{Due date: '.$duedate.'} \vskip 1 mm\noindent '.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';   $result .= $begin_doc.
       '\textit{Due date: '.$duedate.'} '.$toc_line;
     } else {      } else {
  $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm \noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';   $result .= $begin_doc.$toc_line;
  if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}   if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
     }      }
  } else {   } else {
     $result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';      $result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';
  }   }
     } else {      } else {
  if (not $ENV{'request.symb'} =~ m/\.page_/) {   if (not $env{'request.symb'} =~ m/\.page_/) {
     $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm\noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';      $result .= $begin_doc.$toc_line;
     if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}      if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
  } else {   } else {
     $result .= '\vskip 1mm \\\\\\\\';      $result .= '\vskip 1mm \\\\\\\\';
Line 588  sub end_problem { Line 716  sub end_problem {
     my $status=$Apache::inputtags::status['-1'];      my $status=$Apache::inputtags::status['-1'];
     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||      if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
  $target eq 'tex') {   $target eq 'tex') {
  if ( $target eq 'grade' && $Apache::inputtags::part eq '0' &&   if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
      ($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode)) {  
     # if part is zero, no <part>s existed, so we need to the grading      # if part is zero, no <part>s existed, so we need to the grading
     &Apache::inputtags::grade;      if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
    &Apache::inputtags::grade;
       } else {
    # move any submission data to .hidden
    &Apache::inputtags::hidealldata($Apache::inputtags::part);
       }
  } 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 '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);
     $result.= $gradestatus;      $result.= $gradestatus;
  }   }
  if (   if (
     (($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></body>\n";   $result.="</form>";
    $result.=&Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields);
     }      }
     if ($target eq 'web') {      if ($target eq 'web') {
  $result.=&Apache::lonxml::xmlend();   $result.=&Apache::lonxml::xmlend().'</html>';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $endminipage = '';   my $endminipage = '';
  if (not $ENV{'form.problem_split'}=~/yes/) {   if (not $env{'form.problem_split'}=~/yes/) {
     $endminipage = '\end{minipage}';      $endminipage = '\end{minipage}';
  }   }
  $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';                  if ($env{'form.print_discussions'} eq 'yes') {
  if (not $ENV{'request.symb'} =~ m/\.page_/) {      $result.=&Apache::lonxml::xmlend($target,$parser);
     $result .= $endminipage.'\end{document} ';      $result=~s/<\/html>//;
  } else {   } else {
     $result .= '';      $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
       if (not $env{'request.symb'} =~ m/\.page_/) {
    $result .= $endminipage.'\end{document} ';
       } else {
    $result .= '';
       }
  }   }
     }      }
  }   }
Line 627  sub end_problem { Line 765  sub end_problem {
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     &finalize_storage();      &finalize_storage();
  }   }
  if ($target eq 'answer' && ($ENV{'request.state'} eq 'construct')   if ($target eq 'answer' && ($env{'request.state'} eq 'construct')
     && $ENV{'form.answer_output_mode'} ne 'tex') {      && $env{'form.answer_output_mode'} ne 'tex') {
     $result.='</html>'; # normally we get it from xmlend, but in CSTR      $result.=&Apache::lonxml::xmlend().'</html>';
                           # normally we get it from above, but in CSTR
                         # we always show answer mode too.                          # we always show answer mode too.
  }   }
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
Line 638  sub end_problem { Line 777  sub end_problem {
     $result=&Apache::response::mandatory_part_meta;      $result=&Apache::response::mandatory_part_meta;
  }   }
  $result.=&Apache::response::meta_part_order();   $result.=&Apache::response::meta_part_order();
    $result.=&Apache::response::meta_response_order();
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  &Apache::lonxml::debug("in end_problem with $target, edit");   &Apache::lonxml::debug("in end_problem with $target, edit");
  $result = &problem_edit_footer();   $result = &problem_edit_footer();
     }      }
   
     if ($ENV{'request.state'} eq 'construct' && $target eq 'web') {      if ($env{'request.state'} eq 'construct' && $target eq 'web') {
  &Apache::inputtags::check_for_duplicate_ids();   &Apache::inputtags::check_for_duplicate_ids();
     }      }
   
Line 656  sub end_problem { Line 796  sub end_problem {
 sub start_library {  sub start_library {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my ($result,$head_tag_start,$body_tag_start,$form_tag_start);      my ($result,$head_tag_start,$body_tag_start,$form_tag_start);
     if ($$tagstack[0] eq 'library') { &init_problem_globals('library') };      if ($$tagstack[0] eq 'library') {
    &init_problem_globals('library');
    $Apache::lonhomework::type='problem';
       }
     if ($target eq 'edit') {      if ($target eq 'edit') {
  ($result,$head_tag_start,$body_tag_start,$form_tag_start)=   ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
Line 668  sub start_library { Line 811  sub start_library {
  $result=$token->[4];   $result=$token->[4];
  $result.=&Apache::edit::handle_insert();   $result.=&Apache::edit::handle_insert();
     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&      } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
      $ENV{'request.state'} eq "construct" ) {       $env{'request.state'} eq "construct" ) {
  ($result,$head_tag_start,$body_tag_start,$form_tag_start)=   ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
  my $name=&get_resource_name($parstack,$safeeval);   my $name=&get_resource_name($parstack,$safeeval);
Line 687  sub end_library { Line 830  sub end_library {
     if ($target eq 'edit') {      if ($target eq 'edit') {
  $result=&problem_edit_footer();   $result=&problem_edit_footer();
     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&      } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
      $ENV{'request.state'} eq "construct") {       $env{'request.state'} eq "construct") {
  $result.='</form></body>'.&Apache::lonxml::xmlend();   $result.='</form>'.&Apache::loncommon::endbodytag().
       &Apache::lonxml::xmlend();
     }      }
     if ($$tagstack[0] eq 'library') { &reset_problem_globals('library') };      if ($$tagstack[0] eq 'library') { &reset_problem_globals('library') };
     return $result;      return $result;
Line 822  sub start_instructorcomment { Line 966  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 'tex' || $target eq 'analyze') {
         $result=($ENV{'request.role'}=~/^(in|cc|au|ca|li)/);          $result=($env{'request.role'}=~/^(in|cc|au|ca|li)/);
  if ( ! $result ) {   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);
     &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");      &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
Line 893  sub end_while { Line 1037  sub end_while {
  while ($return) {   while ($return) {
     if (time-$starttime >      if (time-$starttime >
  $Apache::lonnet::perlvar{'lonScriptTimeout'}) {   $Apache::lonnet::perlvar{'lonScriptTimeout'}) {
  $return = 0; $error=1; next;   #$return = 0; $error=1; next;
     }      }
     $result.=&Apache::scripttag::xmlparse($bodytext);      $result.=&Apache::scripttag::xmlparse($bodytext);
     $return = &Apache::run::run($code,$safeeval);      $return = &Apache::run::run($code,$safeeval);
  }   }
  if ($error) {   if ($error) {
     &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running &lt;while$gt; on line').' '.$line.'</pre>');      &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running &lt;while&gt; on line').' '.$line.'</pre>');
  }   }
     } elsif ($target eq "edit") {      } elsif ($target eq "edit") {
  $result.= &Apache::edit::tag_end($target,$token,'');   $result.= &Apache::edit::tag_end($target,$token,'');
Line 943  sub start_randomlist { Line 1087  sub start_randomlist {
     #  print "<b>END-TAG $b_tok->[1]</b><br />";      #  print "<b>END-TAG $b_tok->[1]</b><br />";
     # }      # }
  }   }
  my @idx_arr = (0 .. $#randomlist);   if (@randomlist) {
  &Apache::structuretags::shuffle(\@idx_arr);      my @idx_arr = (0 .. $#randomlist);
  my $bodytext = '';      &Apache::structuretags::shuffle(\@idx_arr);
  my $show=$#randomlist;      my $bodytext = '';
  my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);      my $show=$#randomlist;
  $showarg--;      my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
  if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }      $showarg--;
  for(0 .. $show) {      if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
     $bodytext .= "$randomlist[ $idx_arr[$_] ]";      for(0 .. $show) {
    $bodytext .= "$randomlist[ $idx_arr[$_] ]";
       }
       &Apache::lonxml::newparser($parser,\$bodytext);
  }   }
  &Apache::lonxml::newparser($parser,\$bodytext);  
     } elsif ($target eq 'edit' ) {      } elsif ($target eq 'edit' ) {
  $result .=&Apache::edit::tag_start($target,$token);   $result .=&Apache::edit::tag_start($target,$token);
  $result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',   $result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
Line 970  sub start_randomlist { Line 1116  sub start_randomlist {
 sub shuffle {  sub shuffle {
     my $a=shift;      my $a=shift;
     my $i;      my $i;
     if (defined(@$a)) {      if (ref($a) eq 'ARRAY' && @$a) {
  &Apache::response::setrandomnumber();   &Apache::response::pushrandomnumber();
  for($i=@$a;--$i;) {   for($i=@$a;--$i;) {
     my $j=int(&Math::Random::random_uniform() * ($i+1));      my $j=int(&Math::Random::random_uniform() * ($i+1));
     next if $i == $j;      next if $i == $j;
     @$a[$i,$j] = @$a[$j,$i];      @$a[$i,$j] = @$a[$j,$i];
  }   }
    &Apache::response::poprandomnumber();
     }      }
 }  }
   
Line 990  sub end_randomlist { Line 1137  sub end_randomlist {
     return $result;      return $result;
 }  }
   
   sub ordered_show_check {
       my $last_part=$Apache::inputtags::partlist[-2];
       my $in_order=
    &Apache::lonnet::EXT('resource.'.$Apache::inputtags::part.'.ordered');
       my $in_order_show=1;
       if ($last_part ne '0' && lc($in_order) eq 'yes') {
    $in_order_show=&Apache::response::check_status($last_part);
       }
       return $in_order_show;
   }
   
 sub start_part {  sub start_part {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result='';      my $result='';
     my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);      my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
     if ($id eq '') { $id = $Apache::lonxml::curdepth; }      if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; }
     $Apache::inputtags::part=$id;      $Apache::inputtags::part=$id;
     push(@Apache::inputtags::partlist,$id);      push(@Apache::inputtags::partlist,$id);
     @Apache::inputtags::response=();      @Apache::inputtags::response=();
Line 1002  sub start_part { Line 1160  sub start_part {
     @Apache::inputtags::previous_version=();      @Apache::inputtags::previous_version=();
     $Apache::lonhomework::problemstatus=&get_problem_status($id);      $Apache::lonhomework::problemstatus=&get_problem_status($id);
     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);      my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
       my $newtype=&Apache::lonnet::EXT("resource.$id.type");
       if ($newtype) { $Apache::lonhomework::type=$newtype; }
       my $in_order_show=&ordered_show_check();
     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';      my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
       $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
     &Apache::run::run($expression,$safeeval);      &Apache::run::run($expression,$safeeval);
   
     if ($target eq 'meta') {      if ($target eq 'meta') {
Line 1011  sub start_part { Line 1173  sub start_part {
        &Apache::response::meta_parameter_write('display','string',$display,'Part Description');         &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
     } elsif ($target eq 'web' || $target eq 'grade' ||      } elsif ($target eq 'web' || $target eq 'grade' ||
      $target eq 'answer' || $target eq 'tex') {       $target eq 'answer' || $target eq 'tex') {
  if ($hidden) {   if ($hidden || !$in_order_show) {
     my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);      my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
  } else {   } else {
     my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);      my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
Line 1019  sub start_part { Line 1181  sub start_part {
     my $expression='$external::datestatus="'.$status.'";';      my $expression='$external::datestatus="'.$status.'";';
     $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';      $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
     &Apache::run::run($expression,$safeeval);      &Apache::run::run($expression,$safeeval);
     if ($ENV{'request.state'} eq 'construct') {      if ($env{'request.state'} eq 'construct') {
  &set_problem_state($Apache::inputtags::part);    &set_problem_state($Apache::inputtags::part); 
     }      }
     if (( $status eq 'CLOSED' ) ||      if (( $status eq 'CLOSED' ) ||
  ( $status eq 'UNCHECKEDOUT') ||   ( $status eq 'UNCHECKEDOUT') ||
    ( $status eq 'NOT_YET_VIEWED') ||
  ( $status eq 'BANNED') ||   ( $status eq 'BANNED') ||
  ( $status eq 'UNAVAILABLE') ||   ( $status eq 'UNAVAILABLE') ||
  ( $status eq 'INVALID_ACCESS')) {   ( $status eq 'INVALID_ACCESS')) {
Line 1031  sub start_part { Line 1194  sub start_part {
  if ( $target eq "web" ) {   if ( $target eq "web" ) {
     $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";      $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
  } elsif ( $target eq 'tex' ) {   } elsif ( $target eq 'tex' ) {
     if (not $ENV{'form.problem_split'}=~/yes/) {      if (not $env{'form.problem_split'}=~/yes/) {
  $result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";   $result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
     } else {      } else {
  $result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";   $result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
Line 1039  sub start_part { Line 1202  sub start_part {
  }   }
     } else {      } else {
  if ($target eq 'tex') {   if ($target eq 'tex') {
     if (not $ENV{'form.problem_split'}=~/yes/) {      if (not $env{'form.problem_split'}=~/yes/) {
  $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';   if ($$tagstack[-2] eq 'td') {
       $result.='\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
    } else {
       $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
    }
     }      }
     my $weight = &Apache::lonnet::EXT("resource.$id.weight");      my $weight = &Apache::lonnet::EXT("resource.$id.weight");
     my $allkeys=&Apache::lonnet::metadata($ENV{'request.uri'},'packages');      my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
     my @allkeys = split /,/,$allkeys;      my @allkeys = split /,/,$allkeys;
     my $allow_print_points = 0;      my $allow_print_points = 0;
     foreach my $partial_key (@allkeys) {      foreach my $partial_key (@allkeys) {
Line 1051  sub start_part { Line 1218  sub start_part {
     if ($1 ne '0') {$allow_print_points=1;}      if ($1 ne '0') {$allow_print_points=1;}
  }   }
     }      }
       my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
       if (defined($maxtries) && $maxtries < 0) {
    $allow_print_points=0;
       }
       if (lc($env{'course.'.$env{'request.course.id'}.
       '.disableexampointprint'}) eq 'yes') {
    $allow_print_points=0;
       }
     if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}      if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     $result.='<a name="'.&Apache::lonnet::escape($Apache::inputtags::part).'" />';      $result.='<a name="'.&Apache::lonnet::escape($Apache::inputtags::part).'" />';
Line 1082  sub end_part { Line 1257  sub end_part {
     &Apache::lonxml::debug("in end_part $target ");      &Apache::lonxml::debug("in end_part $target ");
     my $status=$Apache::inputtags::status['-1'];      my $status=$Apache::inputtags::status['-1'];
     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);      my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
       my $in_order_show=&ordered_show_check();
     my $result='';      my $result='';
     if ( $target eq 'meta' ) {      if ( $target eq 'meta' ) {
  $result='';   $result='';
     } elsif ($target eq 'grade' &&       } elsif ($target eq 'grade') {
      ($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&   if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
      !$hidden) {      !$hidden && $in_order_show) {
  $result=&Apache::inputtags::grade;      $result=&Apache::inputtags::grade;
     } elsif (($target eq 'web' || $target eq 'tex') && !$hidden ) {   } else {
       # move any submission data to .hidden
       &Apache::inputtags::hidealldata($Apache::inputtags::part);
    }
       } elsif (($target eq 'web' || $target eq 'tex') &&
        !$hidden && $in_order_show) {
  my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,   my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
  $target);   $target);
  if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {   if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
     $gradestatus='';      $gradestatus='';
  }   }
  $result=$gradestatus;   $result=$gradestatus;
    if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} 
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result=&Apache::edit::end_table();   $result=&Apache::edit::end_table();
     }      }
     pop @Apache::inputtags::status;      pop @Apache::inputtags::status;
     $Apache::inputtags::part='';      $Apache::inputtags::part='';
       $Apache::lonhomework::type = $Apache::lonhomework::default_type;
     return $result;      return $result;
 }  }
   
Line 1108  sub start_preduedate { Line 1291  sub start_preduedate {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
  &Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);   &Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
  if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&   if (!$Apache::lonhomework::scantronmode &&
       $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
     $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {      $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
     &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));      &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
     &Apache::lonxml::get_all_text("/preduedate",$parser);      &Apache::lonxml::get_all_text("/preduedate",$parser);
Line 1124  sub end_preduedate { Line 1308  sub end_preduedate {
 sub start_postanswerdate {  sub start_postanswerdate {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     if ($target eq 'web' || $target eq 'grade') {      if ($target eq 'web' || $target eq 'grade') {
  if ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {   if ($Apache::lonhomework::scantronmode ||
       $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
     &Apache::lonxml::get_all_text("/postanswerdate",$parser);      &Apache::lonxml::get_all_text("/postanswerdate",$parser);
  }   }
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
Line 1173  sub end_solved { Line 1358  sub end_solved {
     return '';      return '';
 }  }
   
   sub start_problemtype {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $result;
       if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
    $target eq 'tex' || $target eq 'analyze') {
    my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
    if (!defined($mode)) { $mode='show'; }
    my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
    my $found=0;
    foreach my $type (split(',',$for)) {
       if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
    }
    if ($mode eq 'show' && !$found) {
       &Apache::lonxml::get_all_text("/problemtype",$parser);
    }
    if ($mode eq 'hide' && $found) {
       &Apache::lonxml::get_all_text("/problemtype",$parser);
    }
       } elsif ($target eq 'edit') {
    $result .=&Apache::edit::tag_start($target,$token);
    $result.=&Apache::edit::select_arg('Mode:','mode',
      [['show','Show'],
       ['hide','Hide']]
      ,$token);
    $result .=&Apache::edit::checked_arg('When used as type(s):','for',
        [ ['exam','Exam/Quiz Problem'],
          ['survey','Survey'],
          ['problem','Homework Problem'] ]
        ,$token);
    $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
        $safeeval,'mode','for');
    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       }
       return $result;
   }
   
   sub end_problemtype {
       return '';
   }
   
 sub start_startouttext {  sub start_startouttext {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my @result=(''.'');      my @result=(''.'');
Line 1196  sub end_startouttext { Line 1423  sub end_startouttext {
  &Apache::edit::end_row().   &Apache::edit::end_row().
                  &Apache::edit::start_spanning_row()."\n"                   &Apache::edit::start_spanning_row()."\n"
  . &Apache::loncommon::helpLatexCheatsheet () .   . &Apache::loncommon::helpLatexCheatsheet () .
  &Apache::edit::editfield($token->[1],$text,"",80,4);   &Apache::edit::editfield($token->[1],$text,"",80,8,1);
     }      }
     if ($target eq 'modified') {      if ($target eq 'modified') {
  $result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);   $result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
Line 1241  sub delete_startouttext { Line 1468  sub delete_startouttext {
 sub start_simpleeditbutton {  sub start_simpleeditbutton {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result='';      my $result='';
     if (($target eq 'web') &&      if (($env{'form.simple_edit_button'} ne 'off') &&
         (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {   ($target eq 'web') &&
         my $url=$ENV{'request.noversionuri'};          (&Apache::lonnet::allowed('srm',$env{'request.course.id'}))) {
           my $url=$env{'request.noversionuri'};
         $url=~s/\?.*$//;          $url=~s/\?.*$//;
    my ($symb) = &Apache::lonxml::whichuser();
  $result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.   $result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.
                 '<a href="'.$url.'/smpedit">'.&mt('Simple Problem Editor').'</a> - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.').                  '<a href="'.$url.'/smpedit?symb='.&Apache::lonnet::escape($symb).'">'.&mt('Edit').'</a> - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.').
 &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';  &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';
     }      }
     return $result;      return $result;

Removed from v.1.242  
changed lines
  Added in v.1.304


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