--- loncom/xml/lonxml.pm	2007/11/13 22:16:10	1.469
+++ loncom/xml/lonxml.pm	2008/05/02 22:00:12	1.477
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.469 2007/11/13 22:16:10 albertel Exp $
+# $Id: lonxml.pm,v 1.477 2008/05/02 22:00:12 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -379,6 +379,10 @@ sub xmlparse {
  }
  &init_state();
  if ($env{'form.return_only_error_and_warning_counts'}) {
+     if ($env{'request.filename'}=~/\.(html|htm|xml)$/i) { 
+        my $error=&verify_html($content_file_string);
+        if ($error) { $errorcount++; }
+     }
      return "$errorcount:$warningcount";
  }
  return $finaloutput;
@@ -723,6 +727,7 @@ sub init_safespace {
   $safehole->wrap(\&Apache::chemresponse::chem_standard_order,$safeeval,
 		  '&chem_standard_order');
   $safehole->wrap(\&Apache::response::check_status,$safeeval,'&check_status');
+  $safehole->wrap(\&Apache::response::implicit_multiplication,$safeeval,'&implicit_multiplication');
 
   $safehole->wrap(\&Apache::lonmaxima::maxima_eval,$safeeval,'&maxima_eval');
   $safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check');
@@ -1075,6 +1080,7 @@ Optional Arguments:
 
 sub increment_counter {
     my ($increment, $part_response) = @_;
+    if ($env{'form.grade_target'} eq 'analyze') { return; }
     if (!defined($increment) || $increment le 0) {
 	$increment = 1;
     }
@@ -1083,7 +1089,7 @@ sub increment_counter {
     # If the caller supplied the response_id parameter, 
     # Maintain its counter.. creating if necessary.
 
-    if(defined($part_response)) {
+    if (defined($part_response)) {
 	if (!defined($Apache::lonxml::counters_per_part{$part_response})) {
 	    $Apache::lonxml::counters_per_part{$part_response} = 0;
 	}
@@ -1116,7 +1122,7 @@ sub init_counter {
 }
 
 sub store_counter {
-    &Apache::lonnet::appenv(('form.counter' => $Apache::lonxml::counter));
+    &Apache::lonnet::appenv({'form.counter' => $Apache::lonxml::counter});
     $Apache::lonxml::counter_changed=0;
     return '';
 }
@@ -1137,7 +1143,7 @@ sub store_counter {
 
     sub restore_problem_counter {
 	if (defined($state)) {
-	    &Apache::lonnet::appenv(('form.counter' => $state));
+	    &Apache::lonnet::appenv({'form.counter' => $state});
 	}
     }
     sub get_problem_counter {
@@ -1164,7 +1170,6 @@ sub bubble_lines_for_part {
     } else {
 	return $Apache::lonxml::counters_per_part{$part_response};
     }
-
 }
 
 =pod
@@ -1375,7 +1380,7 @@ sub writeallows {
  	        &Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl;
     }
     @extlinks=();
-    &Apache::lonnet::appenv(%httpref);
+    &Apache::lonnet::appenv(\%httpref);
 }
 
 sub register_ssi {
@@ -1475,11 +1480,26 @@ SIMPLECONTENT
   return $filecontents;
 }
 
+sub verify_html {
+    my ($filecontents)=@_;
+    if ($filecontents!~/(?:\<|\&lt\;)(?:html|xml)[^\<]*(?:\>|\&gt\;)/is) {
+       return &mt('File does not have [_1] or [_2] starting tag','&lt;html&gt;','&lt;xml&gt;');
+    }
+    if ($filecontents!~/(?:\<|\&lt\;)\/(?:html|xml)(?:\>|\&gt\;)/is) {
+       return &mt('File does not have [_1] or [_2] ending tag','&lt;html&gt;','&lt;xml&gt;');
+    }
+    if ($filecontents!~/(?:\<|\&lt\;)(?:body|frameset)[^\<]*(?:\>|\&gt\;)/is) {
+       return &mt('File does not have [_1] or [_2] starting tag','&lt;body&gt;','&lt;frameset&gt;');
+    }
+    if ($filecontents!~/(?:\<|\&lt\;)\/(?:body|frameset)[^\<]*(?:\>|\&gt\;)/is) {
+       return &mt('File does not have [_1] or [_2] ending tag','&lt;body&gt;','&lt;frameset&gt;');
+    }
+    return '';
+}
 
 sub inserteditinfo {
-      my ($filecontents,$filetype)=@_;
+      my ($filecontents, $filetype, $filename)=@_;
       $filecontents = &HTML::Entities::encode($filecontents,'<>&"');
-#      my $editheader='<a href="#editsection">Edit below</a><hr />';
       my $xml_help = '';
       my $initialize='';
       my $textarea_id = 'filecont';
@@ -1529,38 +1549,45 @@ FULLPAGE
 	  $xml_help=&Apache::loncommon::helpLatexCheatsheet();
       }
 
-      my $cleanbut = '';
-
       my $titledisplay=&display_title();
       my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit',
 					 'vi' => 'Save and View',
 					 'dv' => 'Discard Edits and View',
 					 'un' => 'undo',
 					 'ed' => 'Edit');
-      my $buttons=(<<BUTTONS);
-$cleanbut
-<input type="submit" name="discardview" accesskey="d"  value="$lt{'dv'}" />
-<input type="submit" name="Undo" accesskey="u"  value="$lt{'un'}" /><hr />
-<input type="submit" name="savethisfile" accesskey="s"  value="$lt{'st'}" />
-<input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" />
-BUTTONS
-      $buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont');
+      my $spelllink .=&Apache::lonhtmlcommon::spelllink('xmledit','filecont');
       my $textarea_events = &Apache::edit::element_change_detection();
       my $form_events     = &Apache::edit::form_change_detection();
+      my $htmlerror=&verify_html($filecontents);
+      if ($htmlerror) {
+         $htmlerror='<span class="LC_error">'.$htmlerror.'</span>';
+      }
       my $editfooter=(<<ENDFOOTER);
 $initialize
-<hr />
 <a name="editsection" />
 <form $form_events method="post" name="xmledit">
-$xml_help
-<input type="hidden" name="editmode" value="$lt{'ed'}" />
-$buttons<br />
-<textarea $textarea_events style="width:100%" cols="80" rows="44" name="filecont" id="filecont">$filecontents</textarea>
-<div id="LC_aftertextarea">
-<br />$buttons
-<br />
-$titledisplay
-</div>
+  <div class="LC_edit_problem_editxml_header">
+    <table class="LC_edit_problem_header_title"><tr><td>
+        $filename
+      </td><td align="right">
+        $xml_help
+      </td></tr>
+    </table>
+    <div class="LC_edit_problem_discards">
+      <input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" />
+      <input type="submit" name="Undo" accesskey="u" value="$lt{'un'}" />
+      $spelllink $htmlerror
+    </div>
+    <div class="LC_edit_problem_saves">
+      <input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" />
+      <input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" />
+    </div>
+  </div>
+  <textarea $textarea_events style="width:100%" cols="80" rows="44" name="filecont" id="filecont">$filecontents</textarea>
+  <div id="LC_aftertextarea">
+    <br />
+    $titledisplay
+  </div>
 </form>
 </body>
 ENDFOOTER
@@ -1626,6 +1653,9 @@ sub handler {
 	if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) {
 	    my $html_file=&Apache::lonnet::getfile($file);
 	    my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'});
+            if ($env{'form.savethisfile'}) {
+                $env{'form.editmode'}='Edit'; #force edit mode
+            }
 	}
     }
     my %mystyle;
@@ -1690,11 +1720,12 @@ ENDNOTFOUND
     unless ($env{'request.state'} eq 'published') {
 	if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'})))
 	{
-	    my ($edit_info, $add_to_onload, $add_to_onresize)=
-		&inserteditinfo($filecontents,$filetype);
-
 	    my $displayfile=$request->uri;
 	    $displayfile=~s/^\/[^\/]*//;
+
+	    my ($edit_info, $add_to_onload, $add_to_onresize)=
+		&inserteditinfo($filecontents,$filetype,$displayfile);
+
 	    my %options = 
 		('add_entries' =>
                    {'onresize' => $add_to_onresize,
@@ -1710,9 +1741,7 @@ ENDNOTFOUND
 	    my $start_page = &Apache::loncommon::start_page(undef,$js,
 							    \%options);
 	    $result=$start_page.
-		&Apache::lonxml::message_location().'<h3>'.
-		$displayfile.
-		'</h3>'.
+		&Apache::lonxml::message_location().
 		$edit_info.
 		&Apache::loncommon::end_page();
 	}
@@ -1733,7 +1762,8 @@ sub display_title {
 	    $title = $env{'request.filename'};
 	    $title = substr($title, rindex($title, '/') + 1);
 	}
-	$result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA Construction Space';</script>";
+        $result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA "
+                  .&mt('Construction Space')."';</script>";
     }
     return $result;
 }
@@ -1787,7 +1817,7 @@ sub error {
 	# If printing in construction space, put the error inside <pre></pre>
 	push(@Apache::lonxml::error_messages,
 	     $Apache::lonxml::warnings_error_header.
-	     "<b>ERROR:</b>".join("<br />\n",@errors)."<br />\n");
+             "<b>".&mt('ERROR:')."</b>".join("<br />\n",@errors)."<br />\n");
 	$Apache::lonxml::warnings_error_header='';
     } else {
 	my $errormsg;
@@ -1797,7 +1827,9 @@ sub error {
 	    $errormsg=&mt("An error occured while processing this resource. The author has been notified.");
 	}
 	my $host=$Apache::lonnet::perlvar{'lonHostID'};
-	push(@errors, "The error occurred on host <tt>$host</tt>");
+	push(@errors,
+        &mt("The error occurred on host [_1]",
+             "<tt>$host</tt>"));
 
 	my $msg = join('<br />', @errors);