--- loncom/xml/lonxml.pm	2001/03/27 17:47:43	1.64
+++ loncom/xml/lonxml.pm	2001/05/04 17:33:35	1.70
@@ -5,6 +5,7 @@
 # 11/6 Gerd Kortemeyer
 # 6/1/1 Gerd Kortemeyer
 # 2/21,3/13 Guy
+# 3/29,5/4 Gerd Kortemeyer
 
 package Apache::lonxml; 
 use vars 
@@ -16,6 +17,64 @@ use Safe::Hole;
 use Opcode;
 use Apache::Constants qw(:common);
 
+
+sub xmlbegin {
+  my $output='';
+  if ($ENV{'browser.mathml'}) {
+      $output='<?xml version="1.0"?>'
+            .'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'
+            .'<!DOCTYPE html SYSTEM "/adm/MathML/mathml.dtd" '
+            .'[<!ENTITY mathns "http://www.w3.org/1998/Math/MathML">]>'
+            .'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' 
+		.'xmlns="http://www.w3.org/TR/REC-html40">';
+  } else {
+      $output='<html>';
+  }
+  return $output;
+}
+
+sub xmlend {
+    return '</html>';
+}
+
+sub fontsettings() {
+    my $headerstring='';
+    if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) { 
+         $headerstring.=
+             '<meta Content-Type="text/html; charset=x-mac-roman">';
+    }
+    return $headerstring;
+}
+
+sub registerurl {
+  return (<<ENDSCRIPT);
+<script language="JavaScript">
+    function LONCAPAreg() {
+       if (window.location.pathname!="/res/adm/pages/menu.html") {
+	  menu=window.open("","LONCAPAmenu");
+	  menu.currentURL=window.location.pathname;
+          menu.currentStale=0;
+       }
+    }
+  
+    function LONCAPAstale() {
+       if (window.location.pathname!="/res/adm/pages/menu.html") {
+	  menu=window.open("","LONCAPAmenu");
+          menu.currentStale=1;
+       }
+    }
+</script>
+ENDSCRIPT
+}
+
+sub loadevents() {
+    return 'LONCAPAreg();';
+}
+
+sub unloadevents() {
+    return 'LONCAPAstale();';
+}
+
 sub register {
   my $space;
   my @taglist;
@@ -33,7 +92,6 @@ sub printalltags {
   }
 }
 use Apache::style;
-use Apache::lontexconvert;
 use Apache::run;
 use Apache::londefdef;
 use Apache::scripttag;
@@ -170,9 +228,15 @@ sub xmlparse {
 # if ($target eq 'meta') {
 #   $finaloutput.=&endredirection;
 # }
+
+  if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
+      $finaloutput=&afterburn($finaloutput);
+  }
+
  return $finaloutput;
 }
 
+
 sub recurse {
   
   my @innerstack = (); 
@@ -248,14 +312,21 @@ sub callsub {
       $currentstring = &Apache::edit::tag_start($target,$token,$parstack,$parser,
 						$safeeval,$style);
     }
-    if (my $space=$Apache::lonxml::alltags{$token->[1]}) {
-#      &Apache::lonxml::debug("Calling sub $sub in $space $metamode<br />\n");
+    my $tag=$token->[1];
+    my $space=$Apache::lonxml::alltags{$tag};
+    if (!$space) {
+	$tag=~tr/A-Z/a-z/;
+	$sub=~tr/A-Z/a-z/;
+	$space=$Apache::lonxml::alltags{$tag}
+    }
+    if ($space) {
+      &Apache::lonxml::debug("Calling sub $sub in $space $metamode<br />\n");
       $sub1="$space\:\:$sub";
       $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
       $currentstring .= &$sub1($target,$token,$parstack,$parser,
 			     $safeeval,$style);
     } else {
-#      &Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode<br />\n");
+      &Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode<br />\n");
       if ($metamode <1) {
 	if (defined($token->[4]) && ($metamode < 1)) {
 	  $currentstring .= $token->[4];
@@ -407,11 +478,59 @@ sub writeallows {
     &Apache::lonnet::appenv(%httpref);
 }
 
+#
+# Afterburner handles anchors, highlights and links
+#
+
+sub afterburn {
+    my $result=shift;
+    map {
+       my ($name, $value) = split(/=/,$_);
+       $value =~ tr/+/ /;
+       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+       if (($name eq 'highlight')||($name eq 'anchor')||($name eq 'link')) {
+           unless ($ENV{'form.'.$name}) {
+              $ENV{'form.'.$name}=$value;
+	   }
+       }
+    } (split(/&/,$ENV{'QUERY_STRING'}));
+    if ($ENV{'form.highlight'}) {
+        map {
+           my $anchorname=$_;
+	   my $matchthis=$anchorname;
+           $matchthis=~s/\_+/\\s\+/g;
+           $result=~s/($matchthis)/\<font color=\"red\"\>$1\<\/font\>/gs;
+       } split(/\,/,$ENV{'form.highlight'});
+    }
+    if ($ENV{'form.link'}) {
+        map {
+           my ($anchorname,$linkurl)=split(/\>/,$_);
+	   my $matchthis=$anchorname;
+           $matchthis=~s/\_+/\\s\+/g;
+           $result=~s/($matchthis)/\<a href=\"$linkurl\"\>$1\<\/a\>/gs;
+       } split(/\,/,$ENV{'form.link'});
+    }
+    if ($ENV{'form.anchor'}) {
+        my $anchorname=$ENV{'form.anchor'};
+	my $matchthis=$anchorname;
+        $matchthis=~s/\_+/\\s\+/g;
+        $result=~s/($matchthis)/\<a name=\"$anchorname\"\>$1\<\/a\>/s;
+        $result.=(<<"ENDSCRIPT");
+<script>
+    document.location.hash='$anchorname';
+</script>
+ENDSCRIPT
+    }
+    return $result;
+}
+
 sub handler {
   my $request=shift;
-  
+
   my $target='web';
-  $Apache::lonxml::debug=1;
+
+  $Apache::lonxml::debug=0;
+
   if ($ENV{'browser.mathml'}) {
     $request->content_type('text/xml');
   } else {
@@ -430,10 +549,6 @@ sub handler {
   
   return OK if $request->header_only;
 
-  if ($target eq 'web') {
-    $request->print(&Apache::lontexconvert::header());
-    $request->print('<body bgcolor="#FFFFFF">'."\n");
-  }
 
   my $file=&Apache::lonnet::filelocation("",$request->uri);
   my %mystyle;
@@ -445,21 +560,13 @@ sub handler {
   } else {
     $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
   }
-  $request->print($result);
-
 
-  if ($target eq 'tex') {
-#    $request->print('\end{document}'."\n");
-  } elsif ($target eq 'web') {
-    $request->print('</body>');
-    $request->print(&Apache::lontexconvert::footer());
-  }
+  $request->print($result);
 
   writeallows($request->uri);
   return OK;
 }
  
-$Apache::lonxml::debug=0;
 sub debug {
   if ($Apache::lonxml::debug eq 1) {
     print "DEBUG:".$_[0]."<br />\n";
@@ -496,3 +603,5 @@ sub warning {
 
 1;
 __END__
+
+