Index: /trunk/plugins/Equation/equation.js
===================================================================
--- /trunk/plugins/Equation/equation.js (revision 491)
+++ /trunk/plugins/Equation/equation.js (revision 613)
@@ -1,16 +1,28 @@
-// Table Operations Plugin for HTMLArea-3.0
-// Implementation by Nazarij Dubnytskyj.  Sponsored by NasCreative
-//
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
-// This notice MUST stay intact for use (see license.txt).
-//
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 1.0 developed by Nazarij Dubnytskyj for NasCreative.
-//
-// $Id: eguation-operations.js,v 1.0 2004/09/07 20:40:00 Exp $
-
-// Object that will encapsulate all the equation operations
+/*------------------------------------------*\
+ AsciiMathML Formula Editor for Xinha
+ _______________________
+ 
+ Based on AsciiMathML by Peter Jipsen http://www.chapman.edu/~jipsen
+ 
+ Including a table with math symbols for easy input modified from CharacterMap for ASCIIMathML by Peter Jipsen
+ HTMLSource based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/) modified by Holger Hees
+ Original Author - Bernhard Pfeifer novocaine@gmx.net
+ 
+ See readme.txt
+ 
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, 
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html) 
+ for more details.
+
+ Raimund Meyer  11/23/2006
+     
+\*------------------------------------------*/
 function Equation(editor) {
 	this.editor = editor;
@@ -18,9 +30,10 @@
 	var cfg = editor.config;
 	var self = this;
+	
 
 	// register the toolbar buttons provided by this plugin
 	cfg.registerButton({
 	id       : "equation",
-	tooltip  : this._lc("Equation Editor"),
+	tooltip  : this._lc("Formula Editor"),
 	image    : editor.imgURL("equation.gif", "Equation"),
 	textMode : false,
@@ -29,118 +42,165 @@
 		}
 	});
-	 cfg.addToolbarElement("equation", "inserthorizontalrule", -1);
+	cfg.addToolbarElement("equation", "inserthorizontalrule", -1);
+	
+	mathcolor = cfg.Equation.mathcolor;       // change it to "" (to inherit) or any other color
+	mathfontfamily = cfg.Equation.mathfontfamily;
+	
+	//if (HTMLArea.is_ie) return;
+	if (!HTMLArea.is_ie)
+	{	
+		editor.notifyOn( 'modechange',
+			function( e, args )
+				{
+					self.onModeChange( args );
+				}
+			);
+    	HTMLArea.prependDom0Event (editor._textArea.form,'submit',function () {self.unParse();self.reParse = true});
+	}
+	
+	if (typeof  AMprocessNode != "function")
+	{
+		HTMLArea._loadback(_editor_url + "plugins/Equation/ASCIIMathML.js", function () { translate(); });
+	}
+}
+
+HTMLArea.Config.prototype.Equation =
+{
+	"mathcolor" : "red",       // change it to "" (to inherit) or any other color
+	"mathfontfamily" : "serif" // change to "" to inherit (works in IE) 
+                               // or another family (e.g. "arial")
 }
 
 Equation._pluginInfo = {
-	name          : "Equation",
-	version       : "1.0",
-	developer     : "Nazarij Dubnytskyj",
-	developer_url : "",
+	name          : "ASCIIMathML Formula Editor",
+	version       : "2.0",
+	developer     : "Raimund Meyer",
+	developer_url : "http://rheinaufCMS.de",
 	c_owner       : "",
-	sponsor       : "Nascreative",
-	sponsor_url   : "",
-	license       : "htmlArea"
-};
-
-Equation.prototype._lc = function(string) {
+	sponsor       : "Rheinauf",
+	sponsor_url   : "http://rheinaufCMS.de",
+	license       : "GNU/LGPL"
+};
+
+Equation.prototype._lc = function(string) 
+{
     return HTMLArea._lc(string, 'Equation');
 };
-
-Equation.prototype.buttonPress = function(editor, id) {
+Equation.prototype.onGenerate = function() 
+{
+	this.parse();
+};
+Equation.prototype.onUpdateToolbar = function() 
+{
+	if (!HTMLArea.is_ie && this.reParse) AMprocessNode(this.editor._doc.body, false);
+};
+
+Equation.prototype.onModeChange = function( args )
+{
+	var doc = this.editor._doc;
+	switch (args.mode)
+	{
+		case 'text':
+			this.unParse();
+		break;
+		case 'wysiwyg':
+			this.parse();
+		break;
+	}
+};
+
+Equation.prototype.parse = function ()
+{
+	if (!HTMLArea.is_ie)
+	{
+		var doc = this.editor._doc;
+		var spans = doc.getElementsByTagName("span");
+		for (var i = 0;i<spans.length;i++)
+		{
+			var node = spans[i];
+			if (node.className != 'AM') continue;
+			node.title = node.innerHTML;
+			AMprocessNode(node, false);
+		}
+	}
+}
+
+Equation.prototype.unParse = function ()
+{
+	var doc = this.editor._doc;
+	var spans = doc.getElementsByTagName("span");
+	for (var i = 0;i<spans.length;i++)
+	{
+		var node = spans[i];
+		if (node.className.indexOf ("AM") == -1) continue;
+		var formula = node.getAttribute("title");
+		node.innerHTML = formula;
+		node.setAttribute("title", null);
+		this.editor.setHTML(this.editor.getHTML());
+	}
+}
+
+Equation.prototype.buttonPress = function() 
+{
 	var self = this;
-	this.editor = editor;
-
-	switch (id) {
-		case "equation":
-			editor._popupDialog("plugin://Equation/operations", function(params) {
-				self.insertOperation(editor,params);
-			}, '');
-		break;
-	}
-};
-
-Equation.prototype.insertOperation = function(editor,params) {
-	var cur_operation=params["op"];
-
-	this.editor = editor;
-
-	switch (cur_operation) {
-		case "less_equal":
-			editor.insertHTML('<img src="' + _editor_url + '/plugins/Equation/img/dsp_less_equal.gif" style="position:relative; top:4px;">');
-		break;
-		case "greater_egual":
-			editor.insertHTML('<img src="' + _editor_url + '/plugins/Equation/img/dsp_greater_equal.gif" style="position:relative; top:4px;">');
-		break;
-		case "notequal":
-			editor.insertHTML('<img src="' + _editor_url + '/plugins/Equation/img/dsp_notequal.gif" style="position:relative; top:4px;">');
-		break;
-		case "mul":
-			editor.insertHTML('&nbsp;*&nbsp;');
-		break;
-		case "divide":
-			editor.insertHTML(' &divide; ');
-		break;
-		case "abs_value":
-			tstr='<table taglabel="ABS" style="display: inline; vertical-align: middle;" border="0" cellpadding="0" cellspacing="0">';
-			tstr+='<tbody>';
-			tstr+=' <tr>';
-			tstr+='   <td style="font-size: 16px; font-family: times new roman,times,serif;"  type="paren" autosize="absVal" noresize="1" nowrap="nowrap" valign="middle"><b>|</b></td>';
-			tstr+='   <td  nowrap="nowrap" valign="bottom"><table  style="display: inline;" border="0" cellpadding="0" cellspacing="0"><tbody ><tr ><td taglabel="CONTENTS" style="vertical-align: middle; padding-top: 0px; text-align: center;" nowrap="nowrap">x</td></tr></tbody></table></td>';
-			tstr+='   <td style="font-size: 16px; font-family: times new roman,times,serif;"  type="paren" autosize="absVal" noresize="1" nowrap="nowrap" valign="middle"><b>|</b></td>';
-			tstr+=' </tr>';
-			tstr+='</tbody></table>';
-			editor.insertHTML(tstr);
-		break;
-		case "parenthesis":
-			tstr='<table taglabel="PARENTHESIS" style="display: inline; vertical-align: middle;" border="0" cellpadding="0" cellspacing="0">';
-			tstr+='<tbody>';
-			tstr+=' <tr>';
-			tstr+='   <td style="font-family: times new roman,times,serif; font-size: 32px;" type="paren" autosize="paren" noresize="1" nowrap="nowrap" valign="middle">(</td>';
-			tstr+='   <td nowrap="nowrap" valign="middle">x</td>';
-			tstr+='   <td style="font-family: times new roman,times,serif; font-size: 32px;" type="paren" autosize="paren" noresize="1" nowrap="nowrap" valign="middle">)</td>';
-			tstr+=' </tr>';
-			tstr+='</tbody></table>';
-			editor.insertHTML(tstr);
-		break;
-		case "hor_fraction":
-			tstr='<table cellpadding="3" cellspacing="0" style="float:left;" taglabel="FRACTION">';
-			tstr+='<tr><td align="center" style="border-bottom:1px solid #000;" type="numerator"> x </td></tr>';
-			tstr+='<tr><td align="center" type="denominator"> y </td></tr>';
-			tstr+='</table>';
-			tstr+='<div style="margin:15px 5px 0px 5px;float:left;"> &nbsp; &nbsp; </div>';
-			tstr+='<div style="clear:both;"></div><br /><br />';
-			editor.insertHTML(tstr);
-		break;
-		case "diag_fraction":
-			tstr='<table taglabel="ABS" style="display: inline; vertical-align: middle;" border="0" cellpadding="0" cellspacing="0">';
-			tstr+='<tbody>';
-			tstr+=' <tr>';
-			tstr+='   <td style="font-size: 16px; font-family: times new roman,times,serif;" type="paren" autosize="diag_fraction" noresize="1" nowrap="nowrap" valign="middle">x</td>';
-			tstr+='   <td nowrap="nowrap" valign="bottom"><table  style="display: inline;" border="0" cellpadding="0" cellspacing="0"><tbody ><tr ><td taglabel="CONTENTS" style="vertical-align: middle; padding-top: 0px; text-align: center; font-size: 24px; font-weight:900;" nowrap="nowrap">&nbsp;/&nbsp;</td></tr></tbody></table></td>';
-			tstr+='   <td style="font-size: 16px; font-family: times new roman,times,serif;" type="paren" autosize="diag_fraction" noresize="1" nowrap="nowrap" valign="middle">y</td>';
-			tstr+=' </tr>';
-			tstr+='</tbody></table>';
-			editor.insertHTML(tstr);
-		break;
-		case "square_root":
-			tstr='<table style="display: inline; vertical-align: middle;" taglabel="RADICAL" border="0" cellpadding="0" cellspacing="0">';
-			tstr+='<tbody>';
-			tstr+=' <tr>';
-			tstr+='   <td style="padding: 0px 0px 0px 2px; font-family: times new roman,times,serif; font-size: 8pt;" align="right" nowrap="nowrap" valign="bottom">&nbsp;<br><strong style="font-weight: 900; font-family: times new roman,times,serif;">\\</strong></td>';
-			tstr+='   <td style="border-top: 2px solid black; border-left: 2px solid black; padding: 2px 3px 1px 5px;" align="center" nowrap="nowrap">&nbsp;x</td>';
-			tstr+=' </tr>';
-			tstr+='</tbody></table>';
-			editor.insertHTML(tstr);
-		break;
-		case "root":
-			tstr='<table style="display: inline; vertical-align: middle;" taglabel="RADICAL" border="0" cellpadding="0" cellspacing="0">';
-			tstr+='<tbody>';
-			tstr+=' <tr>';
-			tstr+='   <td style="padding: 0px 0px 0px 2px; font-family: times new roman,times,serif; font-size: 8pt;" align="right" nowrap="nowrap" valign="bottom">y&nbsp;<br><strong style="font-weight: 900; font-family: times new roman,times,serif;">\\</strong></td>';
-			tstr+='   <td style="border-top: 2px solid black; border-left: 2px solid black; padding: 2px 3px 1px 5px;" align="center" nowrap="nowrap">&nbsp;x</td>';
-			tstr+=' </tr>';
-			tstr+='</tbody></table>';
-			editor.insertHTML(tstr);
-		break;
-	}
-};
+	var editor = this.editor;
+	var args = {};
+	
+	args['editor'] = editor;
+	
+	var parent = editor._getFirstAncestor(editor._getSelection(),['span','math']);
+	if (parent)
+	{
+		args["editedNode"] = parent;
+	}
+	editor._popupDialog("plugin://Equation/dialog", function(params) {
+				self.insert(params);
+			}, args);
+};
+
+Equation.prototype.insert = function (param)
+{
+	if (param["formula"])
+	{
+		var formula = param["formula"].replace(/^`?(.*)`?$/m,"`$1`");
+
+		if (param["editedNode"] && (param["editedNode"].tagName.toLowerCase() == 'math'))
+		{
+			var parent = param["editedNode"].parentNode; 
+			if (parent.tagName.toLowerCase() == 'span')
+			{
+				parent.innerHTML = formula;
+				parent.title = formula;
+				
+			}
+			else
+			{
+				parent.removeChild(param["editedNode"]);
+				param["editedNode"] = null;
+			}
+		}
+		
+		if (param["editedNode"] && (param["editedNode"].tagName.toLowerCase() == 'span')) 
+		{
+			var span = param["editedNode"]; 
+				span.innerHTML = formula;
+				span.title = formula;
+		}
+		else if (!param["editedNode"])
+		{
+			if (!HTMLArea.is_ie)
+			{			
+				var span = document.createElement('span');
+				span.className = 'AM';
+				this.editor.insertNodeAtSelection(span);
+				span.innerHTML = formula;
+				span.title = formula;
+			}
+			else
+			{
+				this.editor.insertHTML('<span class="AM" title="'+formula+'">'+formula+'</span>');
+			}
+		}
+		if (!HTMLArea.is_ie) AMprocessNode(this.editor._doc.body, false);
+	}
+}
Index: /trunk/plugins/Equation/lang/de.js
===================================================================
--- /trunk/plugins/Equation/lang/de.js (revision 383)
+++ /trunk/plugins/Equation/lang/de.js (revision 613)
@@ -1,9 +1,21 @@
-// I18N for the Equation plugin
-// LANG: "de", ENCODING: UTF-8
-// Author: Joe Hobson, jhobson@bcoe.org
+// I18N constants
+//
+//LANG: "base", ENCODING: UTF-8
+//Author: Translator-Name, <email@example.com>
+// FOR TRANSLATORS:
+//
+//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
+//      (at least a valid email address)
+//
+//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
+//      (if this is not possible, please include a comment
+//       that states what encoding is necessary.)
+
 {
-  "Equation Editor": "Gleichungs-Editor",
-  "Select operation": "Auswahl",
-  "Insert": "EinfÃŒgen",
-  "Cancel": "Abbrechen"
-};
+  "AsciiMath Formula Input": "AsciiMath Formeleditor",
+  "Formula Editor": "Formeleditor",
+  "Input":"Eingabe",
+  "Preview":"Vorschau",
+  "Based on ASCIIMathML by": "Basiert auf ASCIIMathML von",
+  "For more information on AsciiMathML visit this page:":"FÃŒr weitere Informationen besuchen Sie bitte diese Seite:"
+}
Index: /unk/plugins/Equation/lang/fr.js
===================================================================
--- /trunk/plugins/Equation/lang/fr.js (revision 187)
+++  (revision )
@@ -1,5 +1,0 @@
-// I18N for the Equation plugin
-// LANG: "fr", ENCODING: UTF-8
-{
-  "Equation Editor": "Editeur d'Ã©quation"
-};
Index: /unk/plugins/Equation/lang/nb.js
===================================================================
--- /trunk/plugins/Equation/lang/nb.js (revision 530)
+++  (revision )
@@ -1,9 +1,0 @@
-// I18N for the Equation plugin
-// LANG: "nb", ENCODING: UTF-8
-// translated: Kim Steinhaug, http://www.steinhaug.com/, kim@steinhaug.com
-{
-  "Equation Editor": "Formeleditor",
-  "Select operation": "Velg formel",
-  "Insert": "Sett inn",
-  "Cancel": "Avbryt"
-};
Index: /trunk/plugins/Equation/ASCIIMathML.js
===================================================================
--- /trunk/plugins/Equation/ASCIIMathML.js (revision 613)
+++ /trunk/plugins/Equation/ASCIIMathML.js (revision 613)
@@ -0,0 +1,935 @@
+/*
+ASCIIMathML.js
+==============
+This file contains JavaScript functions to convert ASCII math notation
+to Presentation MathML. The conversion is done while the (X)HTML page 
+loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet 
+Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/).
+Just add the next line to your (X)HTML page with this file in the same folder:
+<script type="text/javascript" src="ASCIIMathML.js"></script>
+This is a convenient and inexpensive solution for authoring MathML.
+
+Version 1.4.7 Aug 7, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen
+Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
+For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt
+If you use it on a webpage, please send the URL to jipsen@chapman.edu
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, 
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html) 
+ for more details.
+ 
+ NOTE: I have changed the license from GPL to LGPL according to a permission 
+ from the author (see http://xinha.gogo.co.nz/punbb/viewtopic.php?pid=4150#p4150)
+ Raimund Meyer 11-29-2006
+*/
+
+var checkForMathML = true;   // check if browser can display MathML
+var notifyIfNoMathML = true; // put note at top of page if no MathML capability
+var mathcolor = "red";       // change it to "" (to inherit) or any other color
+var mathfontfamily = "serif"; // change to "" to inherit (works in IE) 
+                              // or another family (e.g. "arial")
+var displaystyle = true;      // puts limits above and below large operators
+var showasciiformulaonhover = true; // helps students learn ASCIIMath
+var decimalsign = ".";        // change to "," if you like, beware of `(1,2)`!
+var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters
+var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$";
+var doubleblankmathdelimiter = false; // if true,  x+1  is equal to `x+1`
+                                      // for IE this works only in <!--   -->
+//var separatetokens;// has been removed (email me if this is a problem)
+var isIE = document.createElementNS==null;
+
+if (document.getElementById==null) 
+  alert("This webpage requires a recent browser such as\
+\nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer")
+
+// all further global variables start with "AM"
+
+function AMcreateElementXHTML(t) {
+  if (isIE) return document.createElement(t);
+  else return document.createElementNS("http://www.w3.org/1999/xhtml",t);
+}
+
+function AMnoMathMLNote() {
+  var nd = AMcreateElementXHTML("h3");
+  nd.setAttribute("align","center")
+  nd.appendChild(AMcreateElementXHTML("p"));
+  nd.appendChild(document.createTextNode("To view the "));
+  var an = AMcreateElementXHTML("a");
+  an.appendChild(document.createTextNode("ASCIIMathML"));
+  an.setAttribute("href","http://www.chapman.edu/~jipsen/asciimath.html");
+  nd.appendChild(an);
+  nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+"));  
+  an = AMcreateElementXHTML("a");
+  an.appendChild(document.createTextNode("MathPlayer"));
+  an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm");
+  nd.appendChild(an);
+  nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox"));
+  nd.appendChild(AMcreateElementXHTML("p"));
+  return nd;
+}
+
+function AMisMathMLavailable() {
+  if (navigator.appName.slice(0,8)=="Netscape") 
+    if (navigator.appVersion.slice(0,1)>="5") return null;
+    else return AMnoMathMLNote();
+  else if (navigator.appName.slice(0,9)=="Microsoft")
+    try {
+        var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
+        return null;
+    } catch (e) {
+        return AMnoMathMLNote();
+    }
+  else return AMnoMathMLNote();
+}
+
+// character lists for Mozilla/Netscape fonts
+var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46];
+var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128];
+var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124];
+
+var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4, 
+    RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,
+    LEFTRIGHT = 9, TEXT = 10; // token types
+
+var AMsqrt = {input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY},
+  AMroot  = {input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY},
+  AMfrac  = {input:"frac", tag:"mfrac", output:"/",    tex:null, ttype:BINARY},
+  AMdiv   = {input:"/",    tag:"mfrac", output:"/",    tex:null, ttype:INFIX},
+  AMover  = {input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY},
+  AMsub   = {input:"_",    tag:"msub",  output:"_",    tex:null, ttype:INFIX},
+  AMsup   = {input:"^",    tag:"msup",  output:"^",    tex:null, ttype:INFIX},
+  AMtext  = {input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT},
+  AMmbox  = {input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT},
+  AMquote = {input:"\"",   tag:"mtext", output:"mbox", tex:null, ttype:TEXT};
+
+var AMsymbols = [
+//some greek symbols
+{input:"alpha",  tag:"mi", output:"\u03B1", tex:null, ttype:CONST},
+{input:"beta",   tag:"mi", output:"\u03B2", tex:null, ttype:CONST},
+{input:"chi",    tag:"mi", output:"\u03C7", tex:null, ttype:CONST},
+{input:"delta",  tag:"mi", output:"\u03B4", tex:null, ttype:CONST},
+{input:"Delta",  tag:"mo", output:"\u0394", tex:null, ttype:CONST},
+{input:"epsi",   tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST},
+{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST},
+{input:"eta",    tag:"mi", output:"\u03B7", tex:null, ttype:CONST},
+{input:"gamma",  tag:"mi", output:"\u03B3", tex:null, ttype:CONST},
+{input:"Gamma",  tag:"mo", output:"\u0393", tex:null, ttype:CONST},
+{input:"iota",   tag:"mi", output:"\u03B9", tex:null, ttype:CONST},
+{input:"kappa",  tag:"mi", output:"\u03BA", tex:null, ttype:CONST},
+{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST},
+{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST},
+{input:"mu",     tag:"mi", output:"\u03BC", tex:null, ttype:CONST},
+{input:"nu",     tag:"mi", output:"\u03BD", tex:null, ttype:CONST},
+{input:"omega",  tag:"mi", output:"\u03C9", tex:null, ttype:CONST},
+{input:"Omega",  tag:"mo", output:"\u03A9", tex:null, ttype:CONST},
+{input:"phi",    tag:"mi", output:"\u03C6", tex:null, ttype:CONST},
+{input:"varphi", tag:"mi", output:"\u03D5", tex:null, ttype:CONST},
+{input:"Phi",    tag:"mo", output:"\u03A6", tex:null, ttype:CONST},
+{input:"pi",     tag:"mi", output:"\u03C0", tex:null, ttype:CONST},
+{input:"Pi",     tag:"mo", output:"\u03A0", tex:null, ttype:CONST},
+{input:"psi",    tag:"mi", output:"\u03C8", tex:null, ttype:CONST},
+{input:"Psi",    tag:"mi", output:"\u03A8", tex:null, ttype:CONST},
+{input:"rho",    tag:"mi", output:"\u03C1", tex:null, ttype:CONST},
+{input:"sigma",  tag:"mi", output:"\u03C3", tex:null, ttype:CONST},
+{input:"Sigma",  tag:"mo", output:"\u03A3", tex:null, ttype:CONST},
+{input:"tau",    tag:"mi", output:"\u03C4", tex:null, ttype:CONST},
+{input:"theta",  tag:"mi", output:"\u03B8", tex:null, ttype:CONST},
+{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST},
+{input:"Theta",  tag:"mo", output:"\u0398", tex:null, ttype:CONST},
+{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST},
+{input:"xi",     tag:"mi", output:"\u03BE", tex:null, ttype:CONST},
+{input:"Xi",     tag:"mo", output:"\u039E", tex:null, ttype:CONST},
+{input:"zeta",   tag:"mi", output:"\u03B6", tex:null, ttype:CONST},
+
+//binary operation symbols
+{input:"*",  tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST},
+{input:"**", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST},
+{input:"//", tag:"mo", output:"/",      tex:null, ttype:CONST},
+{input:"\\\\", tag:"mo", output:"\\",   tex:"backslash", ttype:CONST},
+{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST},
+{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST},
+{input:"-:", tag:"mo", output:"\u00F7", tex:"divide", ttype:CONST},
+{input:"@",  tag:"mo", output:"\u2218", tex:"circ", ttype:CONST},
+{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST},
+{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST},
+{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST},
+{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER},
+{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER},
+{input:"^^",  tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST},
+{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER},
+{input:"vv",  tag:"mo", output:"\u2228", tex:"vee", ttype:CONST},
+{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER},
+{input:"nn",  tag:"mo", output:"\u2229", tex:"cap", ttype:CONST},
+{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER},
+{input:"uu",  tag:"mo", output:"\u222A", tex:"cup", ttype:CONST},
+{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER},
+
+//binary relation symbols
+{input:"!=",  tag:"mo", output:"\u2260", tex:"ne", ttype:CONST},
+{input:":=",  tag:"mo", output:":=",     tex:null, ttype:CONST},
+{input:"lt",  tag:"mo", output:"<",      tex:null, ttype:CONST},
+{input:"<=",  tag:"mo", output:"\u2264", tex:"le", ttype:CONST},
+{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST},
+{input:">=",  tag:"mo", output:"\u2265", tex:"ge", ttype:CONST},
+{input:"geq", tag:"mo", output:"\u2265", tex:null, ttype:CONST},
+{input:"-<",  tag:"mo", output:"\u227A", tex:"prec", ttype:CONST},
+{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST},
+{input:">-",  tag:"mo", output:"\u227B", tex:"succ", ttype:CONST},
+{input:"in",  tag:"mo", output:"\u2208", tex:null, ttype:CONST},
+{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST},
+{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST},
+{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST},
+{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST},
+{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST},
+{input:"-=",  tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST},
+{input:"~=",  tag:"mo", output:"\u2245", tex:"cong", ttype:CONST},
+{input:"~~",  tag:"mo", output:"\u2248", tex:"approx", ttype:CONST},
+{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST},
+
+//logical symbols
+{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE},
+{input:"or",  tag:"mtext", output:"or",  tex:null, ttype:SPACE},
+{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST},
+{input:"=>",  tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST},
+{input:"if",  tag:"mo", output:"if",     tex:null, ttype:SPACE},
+{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST},
+{input:"AA",  tag:"mo", output:"\u2200", tex:"forall", ttype:CONST},
+{input:"EE",  tag:"mo", output:"\u2203", tex:"exists", ttype:CONST},
+{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST},
+{input:"TT",  tag:"mo", output:"\u22A4", tex:"top", ttype:CONST},
+{input:"|--",  tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST},
+{input:"|==",  tag:"mo", output:"\u22A8", tex:"models", ttype:CONST},
+
+//grouping brackets
+{input:"(", tag:"mo", output:"(", tex:null, ttype:LEFTBRACKET},
+{input:")", tag:"mo", output:")", tex:null, ttype:RIGHTBRACKET},
+{input:"[", tag:"mo", output:"[", tex:null, ttype:LEFTBRACKET},
+{input:"]", tag:"mo", output:"]", tex:null, ttype:RIGHTBRACKET},
+{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET},
+{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET},
+{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT},
+//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT},
+{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET},
+{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET},
+{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET},
+{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET},
+{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true},
+{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true},
+
+//miscellaneous symbols
+{input:"int",  tag:"mo", output:"\u222B", tex:null, ttype:CONST},
+{input:"dx",   tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION},
+{input:"dy",   tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION},
+{input:"dz",   tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION},
+{input:"dt",   tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION},
+{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST},
+{input:"del",  tag:"mo", output:"\u2202", tex:"partial", ttype:CONST},
+{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST},
+{input:"+-",   tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST},
+{input:"O/",   tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST},
+{input:"oo",   tag:"mo", output:"\u221E", tex:"infty", ttype:CONST},
+{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST},
+{input:"...",  tag:"mo", output:"...",    tex:"ldots", ttype:CONST},
+{input:":.",  tag:"mo", output:"\u2234",  tex:"therefore", ttype:CONST},
+{input:"/_",  tag:"mo", output:"\u2220",  tex:"angle", ttype:CONST},
+{input:"\\ ",  tag:"mo", output:"\u00A0", tex:null, ttype:CONST},
+{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST},
+{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST},
+{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST},
+{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST},
+{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST},
+{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST},
+{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST},
+{input:"|__", tag:"mo", output:"\u230A",  tex:"lfloor", ttype:CONST},
+{input:"__|", tag:"mo", output:"\u230B",  tex:"rfloor", ttype:CONST},
+{input:"|~", tag:"mo", output:"\u2308",  tex:"lceiling", ttype:CONST},
+{input:"~|", tag:"mo", output:"\u2309",  tex:"rceiling", ttype:CONST},
+{input:"CC",  tag:"mo", output:"\u2102", tex:null, ttype:CONST},
+{input:"NN",  tag:"mo", output:"\u2115", tex:null, ttype:CONST},
+{input:"QQ",  tag:"mo", output:"\u211A", tex:null, ttype:CONST},
+{input:"RR",  tag:"mo", output:"\u211D", tex:null, ttype:CONST},
+{input:"ZZ",  tag:"mo", output:"\u2124", tex:null, ttype:CONST},
+{input:"f",   tag:"mi", output:"f",      tex:null, ttype:UNARY, func:true},
+{input:"g",   tag:"mi", output:"g",      tex:null, ttype:UNARY, func:true},
+
+//standard functions
+{input:"lim",  tag:"mo", output:"lim", tex:null, ttype:UNDEROVER},
+{input:"Lim",  tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER},
+{input:"sin",  tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true},
+{input:"cos",  tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true},
+{input:"tan",  tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true},
+{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true},
+{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true},
+{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true},
+{input:"cot",  tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true},
+{input:"sec",  tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true},
+{input:"csc",  tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true},
+{input:"log",  tag:"mo", output:"log", tex:null, ttype:UNARY, func:true},
+{input:"ln",   tag:"mo", output:"ln",  tex:null, ttype:UNARY, func:true},
+{input:"det",  tag:"mo", output:"det", tex:null, ttype:UNARY, func:true},
+{input:"dim",  tag:"mo", output:"dim", tex:null, ttype:CONST},
+{input:"mod",  tag:"mo", output:"mod", tex:null, ttype:CONST},
+{input:"gcd",  tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true},
+{input:"lcm",  tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true},
+{input:"lub",  tag:"mo", output:"lub", tex:null, ttype:CONST},
+{input:"glb",  tag:"mo", output:"glb", tex:null, ttype:CONST},
+{input:"min",  tag:"mo", output:"min", tex:null, ttype:UNDEROVER},
+{input:"max",  tag:"mo", output:"max", tex:null, ttype:UNDEROVER},
+
+//arrows
+{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST},
+{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST},
+{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST},
+{input:"->",   tag:"mo", output:"\u2192", tex:"to", ttype:CONST},
+{input:"|->",  tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST},
+{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST},
+{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST},
+{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST},
+{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST},
+{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST},
+
+//commands with argument
+AMsqrt, AMroot, AMfrac, AMdiv, AMover, AMsub, AMsup,
+{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true},
+{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true},
+{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true},
+{input:"dot", tag:"mover", output:".",      tex:null, ttype:UNARY, acc:true},
+{input:"ddot", tag:"mover", output:"..",    tex:null, ttype:UNARY, acc:true},
+{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true},
+AMtext, AMmbox, AMquote,
+{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY},
+{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY},
+{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY},
+{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY},
+{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb},
+{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
+{input:"cc",  tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal},
+{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal},
+{input:"tt",  tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY},
+{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY},
+{input:"fr",  tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk},
+{input:"mathfrak",  tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk}
+];
+
+function compareNames(s1,s2) {
+  if (s1.input > s2.input) return 1
+  else return -1;
+}
+
+var AMnames = []; //list of input symbols
+
+function AMinitSymbols() {
+  var texsymbols = [], i;
+  for (i=0; i<AMsymbols.length; i++)
+    if (AMsymbols[i].tex) 
+      texsymbols[texsymbols.length] = {input:AMsymbols[i].tex, 
+        tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype};
+  AMsymbols = AMsymbols.concat(texsymbols);
+  AMsymbols.sort(compareNames);
+  for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
+}
+
+var AMmathml = "http://www.w3.org/1998/Math/MathML";
+
+function AMcreateElementMathML(t) {
+  if (isIE) return document.createElement("m:"+t);
+  else return document.createElementNS(AMmathml,t);
+}
+
+function AMcreateMmlNode(t,frag) {
+//  var node = AMcreateElementMathML(name);
+  if (isIE) var node = document.createElement("m:"+t);
+  else var node = document.createElementNS(AMmathml,t);
+  node.appendChild(frag);
+  return node;
+}
+
+function newcommand(oldstr,newstr) {
+  AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr, 
+                                 tex:null, ttype:DEFINITION}]);
+}
+
+function AMremoveCharsAndBlanks(str,n) {
+//remove n characters and any following blanks
+  var st;
+  if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ") 
+    st = str.slice(n+1);
+  else st = str.slice(n);
+  for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
+  return st.slice(i);
+}
+
+function AMposition(arr, str, n) { 
+// return position >=n where str appears or would be inserted
+// assumes arr is sorted
+  if (n==0) {
+    var h,m;
+    n = -1;
+    h = arr.length;
+    while (n+1<h) {
+      m = (n+h) >> 1;
+      if (arr[m]<str) n = m; else h = m;
+    }
+    return h;
+  } else
+    for (var i=n; i<arr.length && arr[i]<str; i++);
+  return i; // i=arr.length || arr[i]>=str
+}
+
+function AMgetSymbol(str) {
+//return maximal initial substring of str that appears in names
+//return null if there is none
+  var k = 0; //new pos
+  var j = 0; //old pos
+  var mk; //match pos
+  var st;
+  var tagst;
+  var match = "";
+  var more = true;
+  for (var i=1; i<=str.length && more; i++) {
+    st = str.slice(0,i); //initial substring of length i
+    j = k;
+    k = AMposition(AMnames, st, j);
+    if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){
+      match = AMnames[k];
+      mk = k;
+      i = match.length;
+    }
+    more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];
+  }
+  AMpreviousSymbol=AMcurrentSymbol;
+  if (match!=""){
+    AMcurrentSymbol=AMsymbols[mk].ttype;
+    return AMsymbols[mk]; 
+  }
+// if str[0] is a digit or - return maxsubstring of digits.digits
+  AMcurrentSymbol=CONST;
+  k = 1;
+  st = str.slice(0,1);
+  var integ = true;
+  while ("0"<=st && st<="9" && k<=str.length) {
+    st = str.slice(k,k+1);
+    k++;
+  }
+  if (st == decimalsign) {
+    st = str.slice(k,k+1);
+    if ("0"<=st && st<="9") {
+      integ = false;
+      k++;
+      while ("0"<=st && st<="9" && k<=str.length) {
+        st = str.slice(k,k+1);
+        k++;
+      }
+    }
+  }
+  if ((integ && k>1) || k>2) {
+    st = str.slice(0,k-1);
+    tagst = "mn";
+  } else {
+    k = 2;
+    st = str.slice(0,1); //take 1 character
+    tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
+  }
+  if (st=="-" && AMpreviousSymbol==INFIX)
+    return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
+  return {input:st, tag:tagst, output:st, ttype:CONST};
+}
+
+function AMremoveBrackets(node) {
+  var st;
+  if (node.nodeName=="mrow") {
+    st = node.firstChild.firstChild.nodeValue;
+    if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild);
+  }
+  if (node.nodeName=="mrow") {
+    st = node.lastChild.firstChild.nodeValue;
+    if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild);
+  }
+}
+
+/*Parsing ASCII math expressions with the following grammar
+v ::= [A-Za-z] | greek letters | numbers | other constant symbols
+u ::= sqrt | text | bb | other unary symbols for font commands
+b ::= frac | root | stackrel         binary symbols
+l ::= ( | [ | { | (: | {:            left brackets
+r ::= ) | ] | } | :) | :}            right brackets
+S ::= v | lEr | uS | bSS             Simple expression
+I ::= S_S | S^S | S_S^S | S          Intermediate expression
+E ::= IE | I/I                       Expression
+Each terminal symbol is translated into a corresponding mathml node.*/
+
+var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol;
+
+function AMparseSexpr(str) { //parses str and returns [node,tailstr]
+  var symbol, node, result, i, st,// rightvert = false,
+    newFrag = document.createDocumentFragment();
+  str = AMremoveCharsAndBlanks(str,0);
+  symbol = AMgetSymbol(str);             //either a token or a bracket or empty
+  if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) {
+    return [null,str];
+  }
+  if (symbol.ttype == DEFINITION) {
+    str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length); 
+    symbol = AMgetSymbol(str);
+  }
+  switch (symbol.ttype) {
+  case UNDEROVER:
+  case CONST:
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    return [AMcreateMmlNode(symbol.tag,        //its a constant
+                             document.createTextNode(symbol.output)),str];
+  case LEFTBRACKET:   //read (expr+)
+    AMnestingDepth++;
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    result = AMparseExpr(str,true);
+    AMnestingDepth--;
+    if (typeof symbol.invisible == "boolean" && symbol.invisible) 
+      node = AMcreateMmlNode("mrow",result[0]);
+    else {
+      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
+      node = AMcreateMmlNode("mrow",node);
+      node.appendChild(result[0]);
+    }
+    return [node,result[1]];
+  case TEXT:
+      if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length);
+      if (str.charAt(0)=="{") i=str.indexOf("}");
+      else if (str.charAt(0)=="(") i=str.indexOf(")");
+      else if (str.charAt(0)=="[") i=str.indexOf("]");
+      else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1;
+      else i = 0;
+      if (i==-1) i = str.length;
+      st = str.slice(1,i);
+      if (st.charAt(0) == " ") {
+        node = AMcreateElementMathML("mspace");
+        node.setAttribute("width","1ex");
+        newFrag.appendChild(node);
+      }
+      newFrag.appendChild(
+        AMcreateMmlNode(symbol.tag,document.createTextNode(st)));
+      if (st.charAt(st.length-1) == " ") {
+        node = AMcreateElementMathML("mspace");
+        node.setAttribute("width","1ex");
+        newFrag.appendChild(node);
+      }
+      str = AMremoveCharsAndBlanks(str,i+1);
+      return [AMcreateMmlNode("mrow",newFrag),str];
+  case UNARY:
+      str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+      result = AMparseSexpr(str);
+      if (result[0]==null) return [AMcreateMmlNode(symbol.tag,
+                             document.createTextNode(symbol.output)),str];
+      if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
+        st = str.charAt(0);
+        if (st=="^" || st=="_" || st=="/" || st=="|") {
+          return [AMcreateMmlNode(symbol.tag,
+                    document.createTextNode(symbol.output)),str];
+        } else {
+          node = AMcreateMmlNode("mrow",
+           AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));
+          node.appendChild(result[0]);
+          return [node,result[1]];
+        }
+      }
+      AMremoveBrackets(result[0]);
+      if (symbol.input == "sqrt") {           // sqrt
+        return [AMcreateMmlNode(symbol.tag,result[0]),result[1]];
+      } else if (typeof symbol.acc == "boolean" && symbol.acc) {   // accent
+        node = AMcreateMmlNode(symbol.tag,result[0]);
+        node.appendChild(AMcreateMmlNode("mo",document.createTextNode(symbol.output)));
+        return [node,result[1]];
+      } else {                        // font change command
+        if (!isIE && typeof symbol.codes != "undefined") {
+          for (i=0; i<result[0].childNodes.length; i++)
+            if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {
+              st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
+                              result[0].childNodes[i].firstChild.nodeValue);
+              var newst = [];
+              for (var j=0; j<st.length; j++)
+                if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst +
+                  String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]);
+                else newst = newst + st.charAt(j);
+              if (result[0].nodeName=="mi")
+                result[0]=AMcreateElementMathML("mo").
+                          appendChild(document.createTextNode(newst));
+              else result[0].replaceChild(AMcreateElementMathML("mo").
+          appendChild(document.createTextNode(newst)),result[0].childNodes[i]);
+            }
+        }
+        node = AMcreateMmlNode(symbol.tag,result[0]);
+        node.setAttribute(symbol.atname,symbol.atval);
+        return [node,result[1]];
+      }
+  case BINARY:
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    result = AMparseSexpr(str);
+    if (result[0]==null) return [AMcreateMmlNode("mo",
+                           document.createTextNode(symbol.input)),str];
+    AMremoveBrackets(result[0]);
+    var result2 = AMparseSexpr(result[1]);
+    if (result2[0]==null) return [AMcreateMmlNode("mo",
+                           document.createTextNode(symbol.input)),str];
+    AMremoveBrackets(result2[0]);
+    if (symbol.input=="root" || symbol.input=="stackrel") 
+      newFrag.appendChild(result2[0]);
+    newFrag.appendChild(result[0]);
+    if (symbol.input=="frac") newFrag.appendChild(result2[0]);
+    return [AMcreateMmlNode(symbol.tag,newFrag),result2[1]];
+  case INFIX:
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),str];
+  case SPACE:
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    node = AMcreateElementMathML("mspace");
+    node.setAttribute("width","1ex");
+    newFrag.appendChild(node);
+    newFrag.appendChild(
+      AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));
+    node = AMcreateElementMathML("mspace");
+    node.setAttribute("width","1ex");
+    newFrag.appendChild(node);
+    return [AMcreateMmlNode("mrow",newFrag),str];
+  case LEFTRIGHT:
+//    if (rightvert) return [null,str]; else rightvert = true;
+    AMnestingDepth++;
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    result = AMparseExpr(str,false);
+    AMnestingDepth--;
+    var st = "";
+    if (result[0].lastChild!=null)
+      st = result[0].lastChild.firstChild.nodeValue;
+//alert(result[0].lastChild+"***"+st);
+    if (st == "|") { // its an absolute value subterm
+      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
+      node = AMcreateMmlNode("mrow",node);
+      node.appendChild(result[0]);
+      return [node,result[1]];
+    } else { // the "|" is a \mid
+      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
+      node = AMcreateMmlNode("mrow",node);
+      return [node,str];
+    }
+  default:
+//alert("default");
+    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
+    return [AMcreateMmlNode(symbol.tag,        //its a constant
+                             document.createTextNode(symbol.output)),str];
+  }
+}
+
+function AMparseIexpr(str) {
+  var symbol, sym1, sym2, node, result, underover;
+  str = AMremoveCharsAndBlanks(str,0);
+  sym1 = AMgetSymbol(str);
+  result = AMparseSexpr(str);
+  node = result[0];
+  str = result[1];
+  symbol = AMgetSymbol(str);
+  if (symbol.ttype == INFIX && symbol.input != "/") {
+    str = AMremoveCharsAndBlanks(str,symbol.input.length);
+//    if (symbol.input == "/") result = AMparseIexpr(str); else ...
+    result = AMparseSexpr(str);
+    if (result[0] == null) // show box in place of missing argument
+      result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));
+    else AMremoveBrackets(result[0]);
+    str = result[1];
+//    if (symbol.input == "/") AMremoveBrackets(node);
+    if (symbol.input == "_") {
+      sym2 = AMgetSymbol(str);
+      underover = (sym1.ttype == UNDEROVER);
+      if (sym2.input == "^") {
+        str = AMremoveCharsAndBlanks(str,sym2.input.length);
+        var res2 = AMparseSexpr(str);
+        AMremoveBrackets(res2[0]);
+        str = res2[1];
+        node = AMcreateMmlNode((underover?"munderover":"msubsup"),node);
+        node.appendChild(result[0]);
+        node.appendChild(res2[0]);
+        node = AMcreateMmlNode("mrow",node); // so sum does not stretch
+      } else {
+        node = AMcreateMmlNode((underover?"munder":"msub"),node);
+        node.appendChild(result[0]);
+      }
+    } else {
+      node = AMcreateMmlNode(symbol.tag,node);
+      node.appendChild(result[0]);
+    }
+  }
+  return [node,str];
+}
+
+function AMparseExpr(str,rightbracket) {
+  var symbol, node, result, i, nodeList = [],
+  newFrag = document.createDocumentFragment();
+  do {
+    str = AMremoveCharsAndBlanks(str,0);
+    result = AMparseIexpr(str);
+    node = result[0];
+    str = result[1];
+    symbol = AMgetSymbol(str);
+    if (symbol.ttype == INFIX && symbol.input == "/") {
+      str = AMremoveCharsAndBlanks(str,symbol.input.length);
+      result = AMparseIexpr(str);
+      if (result[0] == null) // show box in place of missing argument
+        result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));
+      else AMremoveBrackets(result[0]);
+      str = result[1];
+      AMremoveBrackets(node);
+      node = AMcreateMmlNode(symbol.tag,node);
+      node.appendChild(result[0]);
+      newFrag.appendChild(node);
+      symbol = AMgetSymbol(str);
+    } 
+    else if (node!=undefined) newFrag.appendChild(node);
+  } while ((symbol.ttype != RIGHTBRACKET && 
+           (symbol.ttype != LEFTRIGHT || rightbracket)
+           || AMnestingDepth == 0) && symbol!=null && symbol.output!="");
+  if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) {
+//    if (AMnestingDepth > 0) AMnestingDepth--;
+    var len = newFrag.childNodes.length;
+    if (len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&
+      newFrag.childNodes[len-2].nodeName == "mo" &&
+      newFrag.childNodes[len-2].firstChild.nodeValue == ",") { //matrix
+      var right = newFrag.childNodes[len-1].lastChild.firstChild.nodeValue;
+      if (right==")" || right=="]") {
+        var left = newFrag.childNodes[len-1].firstChild.firstChild.nodeValue;
+        if (left=="(" && right==")" && symbol.output != "}" || 
+            left=="[" && right=="]") {
+        var pos = []; // positions of commas
+        var matrix = true;
+        var m = newFrag.childNodes.length;
+        for (i=0; matrix && i<m; i=i+2) {
+          pos[i] = [];
+          node = newFrag.childNodes[i];
+          if (matrix) matrix = node.nodeName=="mrow" && 
+            (i==m-1 || node.nextSibling.nodeName=="mo" && 
+            node.nextSibling.firstChild.nodeValue==",")&&
+            node.firstChild.firstChild.nodeValue==left &&
+            node.lastChild.firstChild.nodeValue==right;
+          if (matrix) 
+            for (var j=0; j<node.childNodes.length; j++)
+              if (node.childNodes[j].firstChild.nodeValue==",")
+                pos[i][pos[i].length]=j;
+          if (matrix && i>1) matrix = pos[i].length == pos[i-2].length;
+        }
+        if (matrix) {
+          var row, frag, n, k, table = document.createDocumentFragment();
+          for (i=0; i<m; i=i+2) {
+            row = document.createDocumentFragment();
+            frag = document.createDocumentFragment();
+            node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow>
+            n = node.childNodes.length;
+            k = 0;
+            node.removeChild(node.firstChild); //remove (
+            for (j=1; j<n-1; j++) {
+              if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
+                node.removeChild(node.firstChild); //remove ,
+                row.appendChild(AMcreateMmlNode("mtd",frag));
+                k++;
+              } else frag.appendChild(node.firstChild);
+            }
+            row.appendChild(AMcreateMmlNode("mtd",frag));
+            if (newFrag.childNodes.length>2) {
+              newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow>
+              newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo>
+            }
+            table.appendChild(AMcreateMmlNode("mtr",row));
+          }
+          node = AMcreateMmlNode("mtable",table);
+          if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left");
+          newFrag.replaceChild(node,newFrag.firstChild);
+        }
+       }
+      }
+    }
+    str = AMremoveCharsAndBlanks(str,symbol.input.length);
+    if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
+      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
+      newFrag.appendChild(node);
+    }
+  }
+  return [newFrag,str];
+}
+
+function AMparseMath(str) {
+  var result, node = AMcreateElementMathML("mstyle");
+  if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);
+  if (displaystyle) node.setAttribute("displaystyle","true");
+  if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily);
+  AMnestingDepth = 0;
+  node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false)[0]);
+  node = AMcreateMmlNode("math",node);
+  if (showasciiformulaonhover) node.setAttribute("title",str);
+  if (mathfontfamily != "" && (isIE || mathfontfamily != "serif")) {
+    var fnode = AMcreateElementXHTML("font");
+    fnode.setAttribute("face",mathfontfamily);
+    fnode.appendChild(node);
+    return fnode;
+  }
+  return node;
+}
+
+function AMstrarr2docFrag(arr, linebreaks) {
+  var newFrag=document.createDocumentFragment();
+  var expr = false;
+  for (var i=0; i<arr.length; i++) {
+    if (expr) newFrag.appendChild(AMparseMath(arr[i]));
+    else {
+      var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);
+      newFrag.appendChild(AMcreateElementXHTML("span").
+      appendChild(document.createTextNode(arri[0])));
+      for (var j=1; j<arri.length; j++) {
+        newFrag.appendChild(AMcreateElementXHTML("p"));
+        newFrag.appendChild(AMcreateElementXHTML("span").
+        appendChild(document.createTextNode(arri[j])));
+      }
+    }
+    expr = !expr;
+  }
+  return newFrag;
+}
+
+function AMprocessNodeR(n, linebreaks) {
+  var mtch, str, arr, frg, i;
+  if (n.childNodes.length == 0) {
+   if ((n.nodeType!=8 || linebreaks) &&
+    n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&
+    n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" &&
+    n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") {
+    str = n.nodeValue;
+    if (!(str == null)) {
+      str = str.replace(/\r\n\r\n/g,"\n\n");
+      if (doubleblankmathdelimiter) {
+        str = str.replace(/\x20\x20\./g," "+AMdelimiter1+".");
+        str = str.replace(/\x20\x20,/g," "+AMdelimiter1+",");
+        str = str.replace(/\x20\x20/g," "+AMdelimiter1+" ");
+      }
+      str = str.replace(/\x20+/g," ");
+      str = str.replace(/\s*\r\n/g," ");
+      mtch = false;
+      str = str.replace(new RegExp(AMescape2, "g"),
+              function(st){mtch=true;return "AMescape2"});
+      str = str.replace(new RegExp(AMescape1, "g"),
+              function(st){mtch=true;return "AMescape1"});
+      str = str.replace(new RegExp(AMdelimiter2regexp, "g"),AMdelimiter1);
+      arr = str.split(AMdelimiter1);
+      for (i=0; i<arr.length; i++)
+        arr[i]=arr[i].replace(/AMescape2/g,AMdelimiter2).
+                      replace(/AMescape1/g,AMdelimiter1);
+      if (arr.length>1 || mtch) {
+        if (checkForMathML) {
+          checkForMathML = false;
+          var nd = AMisMathMLavailable();
+          AMnoMathML = nd != null
+          if (AMnoMathML && notifyIfNoMathML) 
+            AMbody.insertBefore(nd,AMbody.childNodes[0]);
+        }
+        if (!AMnoMathML) {
+          frg = AMstrarr2docFrag(arr,n.nodeType==8);
+          var len = frg.childNodes.length;
+          n.parentNode.replaceChild(frg,n);
+          return len-1;
+        } else return 0;
+      }
+    }
+   } else return 0;
+  } else if (n.nodeName!="math") {
+    for (i=0; i<n.childNodes.length; i++)
+      i += AMprocessNodeR(n.childNodes[i], linebreaks);
+  }
+  return 0;
+}
+
+function AMprocessNode(n, linebreaks, spanclassAM) {
+  var frag,st;
+  if (spanclassAM!=null) {
+    frag = document.getElementsByTagName("span")
+    for (var i=0;i<frag.length;i++)
+      if (frag[i].className == "AM")
+        AMprocessNodeR(frag[i],linebreaks);
+  } else {
+    try {
+      st = n.innerHTML;
+    } catch(err) {}
+    if (st==null || 
+        st.indexOf(AMdelimiter1)!=-1 || st.indexOf(AMdelimiter2)!=-1) 
+      AMprocessNodeR(n,linebreaks);
+  }
+  if (isIE) { //needed to match size and font of formula to surrounding text
+    frag = document.getElementsByTagName('math');
+    for (var i=0;i<frag.length;i++) frag[i].update()
+  }
+}
+
+var AMbody;
+var AMnoMathML = false, AMtranslated = false;
+
+function translate(spanclassAM) {
+  if (!AMtranslated) { // run this only once
+    AMtranslated = true;
+    AMinitSymbols();
+    AMbody = document.getElementsByTagName("body")[0];
+    AMprocessNode(AMbody, false, spanclassAM);
+  }
+}
+
+if (isIE) { // avoid adding MathPlayer info explicitly to each webpage
+  document.write("<object id=\"mathplayer\"\
+  classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");
+  document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");
+}
+
+// GO1.1 Generic onload by Brothercake 
+// http://www.brothercake.com/
+//onload function (replaces the onload="translate()" in the <body> tag)
+function generic()
+{
+  translate();
+};
+//setup onload function
+if(typeof window.addEventListener != 'undefined')
+{
+  //.. gecko, safari, konqueror and standard
+  window.addEventListener('load', generic, false);
+}
+else if(typeof document.addEventListener != 'undefined')
+{
+  //.. opera 7
+  document.addEventListener('load', generic, false);
+}
+else if(typeof window.attachEvent != 'undefined')
+{
+  //.. win/ie
+  window.attachEvent('onload', generic);
+}
+//** remove this condition to degrade older browsers
+else
+{
+  //.. mac/ie5 and anything else that gets this far
+  //if there's an existing onload function
+  if(typeof window.onload == 'function')
+  {
+    //store it
+    var existing = onload;
+    //add new onload handler
+    window.onload = function()
+    {
+      //call existing onload function
+      existing();
+      //call generic onload function
+      generic();
+    };
+  }
+  else
+  {
+    //setup onload function
+    window.onload = generic;
+  }
+}
Index: /trunk/plugins/Equation/popups/dialog.html
===================================================================
--- /trunk/plugins/Equation/popups/dialog.html (revision 613)
+++ /trunk/plugins/Equation/popups/dialog.html (revision 613)
@@ -0,0 +1,305 @@
+<!DOCTYPE html
+     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>AsciiMath Formula Input</title>
+  <script type="text/javascript" src="../../../popups/popup.js"></script>
+  <script type="text/javascript" src="../ASCIIMathML.js"></script>
+  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
+
+  <style type="text/css">
+	#outputNode,#inputText {
+		padding:5px;
+		background-color:white;
+		width:230px;
+		height:200px;
+		font-size:1.3em;
+		border: 1px solid darkgrey;
+	}
+	#clickInput {
+		width:100%;
+		border-collapse:collapse;
+		background-color: white;
+		text-align:center;
+	}
+	#clickInput td {
+		border: thin solid gray;
+		cursor:pointer;
+		font-size:1.1em;
+		
+	}
+	h3 {
+		font-size:1.6em;
+	}
+  </style>
+  <script type="text/javascript">
+   window.resizeTo(500, 300);
+var showasciiformulaonhover = false;
+HTMLArea = window.opener.HTMLArea;
+
+function i18n(str) {
+  return (HTMLArea._lc(str, 'Equation'));
+}
+function set (string)
+{
+	var inputField = document.getElementById("inputText");
+	inputField.value += string;
+	preview();
+	inputField.focus();
+	return false;
+}
+function preview() {
+  if (document.getElementById("inputText") != '') {
+      var str = document.getElementById("inputText").value;
+      var outnode = document.getElementById("outputNode");
+      var newnode = AMcreateElementXHTML("div");
+      newnode.setAttribute("id","outputNode");
+      outnode.parentNode.replaceChild(newnode,outnode);
+      outnode = document.getElementById("outputNode");
+      var n = outnode.childNodes.length;
+      for (var i = 0; i < n; i++)
+        outnode.removeChild(outnode.firstChild);
+      outnode.appendChild(document.createComment("`"+str+"`"));
+      AMprocessNode(outnode,true);
+  }
+}
+function Init() {
+	__dlg_translate('Equation');
+	__dlg_init();
+	var param = window.dialogArguments;
+	var cfg = param["editor"].config;
+	
+	mathcolor = cfg.Equation.mathcolor;
+	mathfontfamily = cfg.Equation.mathfontfamily;
+	
+	var inputField = document.getElementById("inputText"); 
+	if (param["editedNode"] && param["editedNode"].tagName.toLowerCase() == 'math')
+	{
+		var formula = param["editedNode"].getAttribute("title");
+		inputField.value = formula; 
+		preview();
+	}
+	else if (param["editedNode"] && param["editedNode"].tagName.toLowerCase() == 'span')
+	{
+		var formula = param["editedNode"].innerHTML.replace(/^`?(.*?)`?$/m,"$1");;
+		inputField.value = formula;
+	}
+	else inputField.value = '';
+	inputField.focus();
+}
+  
+function onOK() {
+ 	
+ var param = {
+ 	"editedNode":window.dialogArguments.editedNode,
+ 	"formula" : document.getElementById("inputText").value
+ };
+ 
+ __dlg_close(param);
+  return false;
+}
+
+function onCancel() {
+  __dlg_close(null);
+  return false;
+}
+
+function translate() {
+  if (!AMtranslated) { // run this only once
+    AMtranslated = true;
+    AMinitSymbols();
+    AMprocessNode(document.getElementById("clickInput"),true);
+    preview();
+  }
+}
+window.onload = Init;
+</script>
+
+</head>
+
+<body class="dialog">
+<div class="title">AsciiMath Formula Input</div>
+<!--
+Table modified from CharacterMap for ASCIIMathML by Peter Jipsen
+HTMLSource based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/) modified by Holger Hees
+Original Author - Bernhard Pfeifer novocaine@gmx.net
+-->
+<table  id="clickInput">
+<tr>
+<td colspan="3" class="character" title="(x+1)/(x-1)" onclick="set('(x+1)/(x-1)')">`(x+1)/(x-1)`</td>
+<td colspan="2" class="character" title="x^(m+n)" onclick="set('x^(m+n)')">`x^(m+n)`</td>
+<td colspan="2" class="character" title="x_(mn)" onclick="set('x_(mn)')">`x_(mn)`</td>
+<td colspan="2" class="character" title="sqrt(x)" onclick="set('sqrt(x)')">`sqrt(x)`</td>
+<td colspan="3" class="character" title="root(n)(x)" onclick="set('root(n)(x)')">`root(n)(x)`</td>
+<td colspan="2" class="character" title="&quot;text&quot;" onclick="set('&quot;text&quot;')">`&quot;text&quot;`</td>
+<td colspan="2" class="character" style="cursor:default"></td>
+</tr><tr>
+<td colspan="2" class="character" title="dy/dx" onclick="set('dy/dx')">`dy/dx`</td>
+<td colspan="3" class="character" title="lim_(x-&gt;oo)" onclick="set('lim_(x-&gt;oo)')">`lim_(x-&gt;oo)`</td>
+<td colspan="3" class="character" title="sum_(n=1)^oo" onclick="set('sum_(n=1)^oo')">`sum_(n=1)^oo`</td>
+<td colspan="3" class="character" title="int_a^bf(x)dx" onclick="set('int_a^bf(x)dx')">`int_a^bf(x)dx`</td>
+<td colspan="3" class="character" title="[[a,b],[c,d]]" onclick="set('[[a,b],[c,d]]')">`[[a,b],[c,d]]`</td>
+<td colspan="2" class="character" title="((n),(k))" onclick="set('((n),(k))')">`((n),(k))`</td>
+</tr><tr>
+<td class="character" title="*" onclick="set('*')">`*`</td>
+<td class="character" title="**" onclick="set('**')">`**`</td>
+<td class="character" title="//" onclick="set('//')">`//`</td>
+<td class="character" title="\\" onclick="set('\\\\')">`\\`</td>
+<td class="character" title="xx" onclick="set('xx')">`xx`</td>
+<td class="character" title="-:" onclick="set('-:')">`-:`</td>
+<td class="character" title="@" onclick="set('@')">`@`</td>
+<td class="character" title="o+" onclick="set('o+')">`o+`</td>
+<td class="character" title="ox" onclick="set('ox')">`ox`</td>
+<td class="character" title="o." onclick="set('o.')">`o.`</td>
+<td class="character" title="sum" onclick="set('sum')">`sum`</td>
+<td class="character" title="prod" onclick="set('prod')">`prod`</td>
+<td class="character" title="^^" onclick="set('^^')">`^^`</td>
+<td class="character" title="^^^" onclick="set('^^^')"><font size="+1">`&and;`</font></td>
+<td class="character" title="vv" onclick="set('vv')">`vv`</td>
+<td class="character" title="vvv" onclick="set('vvv')"><font size="+1">`&or;`</font></td>
+</tr><tr>
+<td class="character" title="!=" onclick="set('!=')">`!=`</td>
+<td class="character" title="&lt;=" onclick="set('&lt;=')">`&lt;=`</td>
+<td class="character" title="&gt;=" onclick="set('&gt;=')">`&gt;=`</td>
+<td class="character" title="-&lt;" onclick="set('-&lt;')">`-&lt;`</td>
+<td class="character" title="&gt;-" onclick="set('&gt;-')">`&gt;-`</td>
+<td class="character" title="in" onclick="set('in')">`in`</td>
+<td class="character" title="!in" onclick="set('!in')">`!in`</td>
+<td class="character" title="sub" onclick="set('sub')">`sub`</td>
+<td class="character" title="sup" onclick="set('sup')">`sup`</td>
+<td class="character" title="sube" onclick="set('sube')">`sube`</td>
+<td class="character" title="supe" onclick="set('supe')">`supe`</td>
+<td class="character" title="O/" onclick="set('O/')">`O/`</td>
+<td class="character" title="nn" onclick="set('nn')">`nn`</td>
+<td class="character" title="nnn" onclick="set('nnn')"><font size="+1">`&cap;`</font></td>
+<td class="character" title="uu" onclick="set('uu')">`uu`</td>
+<td class="character" title="uuu" onclick="set('uuu')"><font size="+1">`&cup;`</font></td>
+</tr><tr>
+<td class="character" title="and" onclick="set('and')">`and`</td>
+<td class="character" title="or" onclick="set('or')">`or`</td>
+<td class="character" title="not" onclick="set('not')">`not`</td>
+<td class="character" title="=&gt;" onclick="set('==&gt;')">`=&gt;`</td>
+<td class="character" title="if" onclick="set('if')">`if`</td>
+<td class="character" title="&lt;=&gt;" onclick="set('&lt;=&gt;')">`&lt;=&gt;`</td>
+<td class="character" title="AA" onclick="set('AA')">`AA`</td>
+<td class="character" title="EE" onclick="set('EE')">`EE`</td>
+<td class="character" title="_|_" onclick="set('_|_')">`_|_`</td>
+<td class="character" title="TT" onclick="set('TT')">`TT`</td>
+<td class="character" title="|--" onclick="set('|--')">`|--`</td>
+<td class="character" title="|==" onclick="set('|==')">`|==`</td>
+<td class="character" title="-=" onclick="set('-=')">`-=`</td>
+<td class="character" title="~=" onclick="set('~=')">`~=`</td>
+<td class="character" title="~~" onclick="set('~~')">`~~`</td>
+<td class="character" title="prop" onclick="set('prop')">`prop`</td>
+</tr><tr>
+<td class="character" title="int" onclick="set('int')">`int`</td>
+<td class="character" title="oint" onclick="set('oint')">`oint`</td>
+<td class="character" title="del" onclick="set('del')">`del`</td>
+<td class="character" title="grad" onclick="set('grad')">`grad`</td>
+<td class="character" title="+-" onclick="set('+-')">`+-`</td>
+<td class="character" title="oo" onclick="set('oo')">`oo`</td>
+<td class="character" title="aleph" onclick="set('aleph')">`aleph`</td>
+<td class="character" title="quad" onclick="set('quad')">`quad`</td>
+<td class="character" title="diamond" onclick="set('diamond')">`diamond`</td>
+<td class="character" title="square" onclick="set('square')">`square`</td>
+<td class="character" title="|__" onclick="set('|__')">`|__`</td>
+<td class="character" title="__|" onclick="set('__|')">`__|`</td>
+<td class="character" title="|~" onclick="set('|~')">`|~`</td>
+<td class="character" title="~|" onclick="set('~|')">`~|`</td>
+<td class="character" title="&lt;x&gt;" onclick="set('&lt;x&gt;')">`&lt;x&gt;`</td>
+<td class="character" title="/_" onclick="set('/_')">`/_`</td>
+</tr><tr>
+<td class="character" title="uarr" onclick="set('uarr')">`uarr`</td>
+<td class="character" title="darr" onclick="set('darr')">`darr`</td>
+<td class="character" title="larr" onclick="set('larr')">`larr`</td>
+<td class="character" title="-&gt;" onclick="set('-&gt;')">`-&gt;`</td>
+<td class="character" title="|-&gt;" onclick="set('|-&gt;')">`|-&gt;`</td>
+<td class="character" title="harr" onclick="set('harr')">`harr`</td>
+<td class="character" title="lArr" onclick="set('lArr')">`lArr`</td>
+<td class="character" title="rArr" onclick="set('rArr')">`rArr`</td>
+<td class="character" title="hArr" onclick="set('hArr')">`hArr`</td>
+<td class="character" title="hata" onclick="set('hat')">`hata`</td>
+<td class="character" title="ula" onclick="set('ul')">`ula`</td>
+<td class="character" title="dota" onclick="set('dot')">`dota`</td>
+<td class="character" title="ddota" onclick="set('ddot')">`ddota`</td>
+<td class="character" title="veca" onclick="set('vec')">`veca`</td>
+<td class="character" title="bara" onclick="set('bar')">`bara`</td>
+<td class="character" title=":." onclick="set(':.')">`:.`</td>
+</tr><tr>
+<td class="character" title="NN" onclick="set('NN')">`NN`</td>
+<td class="character" title="ZZ" onclick="set('ZZ')">`ZZ`</td>
+<td class="character" title="QQ" onclick="set('QQ')">`QQ`</td>
+<td class="character" title="RR" onclick="set('RR')">`RR`</td>
+<td class="character" title="CC" onclick="set('CC')">`CC`</td>
+<td class="character" title="bba" onclick="set('bb')">`bba`</td>
+<td class="character" title="bbba" onclick="set('bbb')">`bbba`</td>
+<td class="character" title="cca" onclick="set('cc')">`cca`</td>
+<td class="character" title="fra" onclick="set('fr')">`fra`</td>
+<td class="character" title="sfa" onclick="set('sf')">`sfa`</td>
+<td class="character" title="tta" onclick="set('tt')">`tta`</td>
+<td colspan="4" class="character" title="stackrel(-&gt;)(+)" onclick="set('stackrel(-&gt;)(+)')">`stackrel(-&gt;)(+)`</td>
+<td class="character" title="upsilon" onclick="set('upsilon')">`upsilon`</td>
+</tr><tr>
+<td class="character" title="alpha" onclick="set('alpha')">`alpha`</td>
+<td class="character" title="beta" onclick="set('beta')">`beta`</td>
+<td class="character" title="gamma" onclick="set('gamma')">`gamma`</td>
+<td class="character" title="Gamma" onclick="set('Gamma')">`Gamma`</td>
+<td class="character" title="delta" onclick="set('delta')">`delta`</td>
+<td class="character" title="Delta" onclick="set('Delta')">`Delta`</td>
+<td class="character" title="epsi" onclick="set('epsi')">`epsi`</td>
+<td class="character" title="zeta" onclick="set('zeta')">`zeta`</td>
+<td class="character" title="eta" onclick="set('eta')">`eta`</td>
+<td class="character" title="theta" onclick="set('theta')">`theta`</td>
+<td class="character" title="Theta" onclick="set('Theta')">`Theta`</td>
+<td class="character" title="iota" onclick="set('iota')">`iota`</td>
+<td class="character" title="kappa" onclick="set('kappa')">`kappa`</td>
+<td class="character" title="lambda" onclick="set('lambda')">`lambda`</td>
+<td class="character" title="Lambda" onclick="set('Lambda')">`Lambda`</td>
+<td class="character" title="mu" onclick="set('mu')">`mu`</td>
+</tr><tr>
+<td class="character" title="nu" onclick="set('nu')">`nu`</td>
+<td class="character" title="pi" onclick="set('pi')">`pi`</td>
+<td class="character" title="Pi" onclick="set('Pi')">`Pi`</td>
+<td class="character" title="rho" onclick="set('rho')">`rho`</td>
+<td class="character" title="sigma" onclick="set('sigma')">`sigma`</td>
+<td class="character" title="Sigma" onclick="set('Sigma')">`Sigma`</td>
+<td class="character" title="tau" onclick="set('tau')">`tau`</td>
+<td class="character" title="xi" onclick="set('xi')">`xi`</td>
+<td class="character" title="Xi" onclick="set('Xi')">`Xi`</td>
+<td class="character" title="phi" onclick="set('phi')">`phi`</td>
+<td class="character" title="Phi" onclick="set('Phi')">`Phi`</td>
+<td class="character" title="chi" onclick="set('chi')">`chi`</td>
+<td class="character" title="psi" onclick="set('psi')">`psi`</td>
+<td class="character" title="Psi" onclick="set('Psi')">`Psi`</td>
+<td class="character" title="omega" onclick="set('omega')">`omega`</td>
+<td class="character" title="Omega" onclick="set('Omega')">`Omega`</td>
+</tr>
+</table>
+<form action="javascript:void(0);">
+<table style="width: 100%;border:none">
+  <tr>
+    <td>Input</td><td>Preview</td>
+  </tr>
+  <tr>
+    <td>
+    <textarea id="inputText" onkeyup="preview()"></textarea>
+    </td>
+    <td>
+    <div id="outputNode"></div>
+    </td>
+  </tr>
+  <tr><td colspan="2">
+  Based on ASCIIMathML by <a href="http://www.chapman.edu/~jipsen" target="new">Peter Jipsen</a>, 
+<a href="http://www.chapman.edu" target="new">Chapman University</a><br />
+  For more information on AsciiMathML visit this page: <a href="http://www1.chapman.edu/~jipsen/mathml/asciimath.html" onclick="window.open(this.href,'_blank','');return false;">http://www1.chapman.edu/~jipsen/mathml/asciimath.html</a></td></tr>
+</table>
+
+<div id="buttons">
+  <button type="submit" name="ok" onclick="return onOK();">OK</button>
+  <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
+</div>
+</form>
+</body>
+</html>
Index: /unk/plugins/Equation/popups/operations.html
===================================================================
--- /trunk/plugins/Equation/popups/operations.html (revision 419)
+++  (revision )
@@ -1,89 +1,0 @@
-<!--
-Equation Editor plugin for HTMLArea v3.0
-
-brought to you by the Center for Distributed Learning <http://www.cdlonline.org>
-a division of the Butte County Office of Education.
-
-Working sample can be found at
-	http://www.cdlonline.org/works/wysiwyg/examples/eq.html
-
-Questions? Suggestions? email us... webmaster@cdlonline.org
-
-Last Modified : 2004-09-22 19:15:16
--->
-
-<html>
-<head>
-  <title>Equation</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-function Init() {
-  window.resizeTo(190, 225);
-  __dlg_translate('Equation');
-  __dlg_init();
-  var selected_op="none";
-  document.getElementById("cancel").focus();
-}
-
-function SelectOperation(sop,sop_name) {
-   document.getElementById('less_equal').style.backgroundColor='ButtonFace';
-   document.getElementById('greater_egual').style.backgroundColor='ButtonFace';
-   document.getElementById('notequal').style.backgroundColor='ButtonFace';
-   document.getElementById('square_root').style.backgroundColor='ButtonFace';
-   document.getElementById('divide').style.backgroundColor='ButtonFace';
-   document.getElementById('mul').style.backgroundColor='ButtonFace';
-   document.getElementById('parenthesis').style.backgroundColor='ButtonFace';
-   document.getElementById('hor_fraction').style.backgroundColor='ButtonFace';
-   document.getElementById('diag_fraction').style.backgroundColor='ButtonFace';
-   document.getElementById('abs_value').style.backgroundColor='ButtonFace';
-   document.getElementById('root').style.backgroundColor='ButtonFace';
-   sop.style.backgroundColor='blue';
-   selected_op=sop_name;
-}
-
-function onOK() {
-  var param = {};
-  param['op']=selected_op;
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Select operation</div>
-<table align="center" border="1" cellpadding="2" cellspacing="0">
-  <tr>
-    <td id="less_equal" align="center" onclick="SelectOperation(this,'less_equal')"><span><img src="../img/less_equal_than.gif"></span></td>
-    <td id="greater_egual" align="center" onclick="SelectOperation(this,'greater_egual')"><span><img src="../img/greater_equal_than.gif"></span></td>
-    <td id="notequal" align="center" onclick="SelectOperation(this,'notequal')"><span><img src="../img/notequal.gif"></span></td>
-  </tr>
-  <tr>
-    <td id="square_root" align="center" onclick="SelectOperation(this,'square_root')"><span><img src="../img/square_root.gif"></span></td>
-    <td id="root" align="center" onclick="SelectOperation(this,'root')"><span><img src="../img/root.gif"></span></td>
-    <td id="parenthesis" align="center" onclick="SelectOperation(this,'parenthesis')"><span><img src="../img/parenthesis.gif"></span></td>
-  </tr>
-  <tr>
-    <td id="hor_fraction" align="center" onclick="SelectOperation(this,'hor_fraction')"><span><img src="../img/hor_fraction.gif"></span></td>
-    <td id="diag_fraction" align="center" onclick="SelectOperation(this,'diag_fraction')"><span><img src="../img/diag_fraction.gif"></span></td>
-    <td id="abs_value" align="center" onclick="SelectOperation(this,'abs_value')"><span><img src="../img/abs_value.gif"></span></td>
-  </tr>
-  <tr>
-    <td id="divide" align="center" onclick="SelectOperation(this,'divide')"><span><img src="../img/divide.gif"></span></td>
-    <td id="mul" align="center" onclick="SelectOperation(this,'mul')"><span><img src="../img/mul.gif"></span></td>
-    <td ><span>&nbsp;</span></td>
-  </tr>
-</table>
-<div id="buttons">
-  <button type="button" name="ok" onclick="return onOK();"><span>Insert</span></button>
-  <button type="button" name="cancel" id="cancel" onclick="return onCancel();"><span>Cancel</span></button>
-</div>
-</body>
-</html>
Index: /trunk/plugins/Equation/readme.txt
===================================================================
--- /trunk/plugins/Equation/readme.txt (revision 613)
+++ /trunk/plugins/Equation/readme.txt (revision 613)
@@ -0,0 +1,32 @@
+AsciiMathML Formula Editor for Xinha
+ _______________________
+ 
+Based on AsciiMathML by Peter Jipsen (http://www.chapman.edu/~jipsen).
+Plugin by Raimund Meyer (ray) xinha@raimundmeyer.de
+
+AsciiMathML is a JavaScript library for translating ASCII math notation to Presentation MathML.
+
+Usage
+ The formmulae are stored in their ASCII representation, so you have to include the 
+ ASCIIMathML library which can be found in the plugin folder in order render the MathML output in your pages. 
+ Example:
+  <script type="text/javascript" src="/xinha/plugins/AsciiMath/ASCIIMathML.js"
+
+ The recommended browser for using this plugin is Mozilla/Firefox.
+ 
+License information
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, 
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html) 
+ for more details.
+ 
+ NOTE: I have changed the license of AsciiMathML from GPL to LGPL according to a permission 
+ from the author (see http://xinha.gogo.co.nz/punbb/viewtopic.php?pid=4150#p4150)
+ Raimund Meyer 11-29-2006
