/*
oMathML.js
==============
This file contains JavaScript functions to convert math notation
to Presentation MathML.

Authors: WeiZhong
Date: 2005/11/15
*/

// RegExp
var oSymbolsReg = [
	/<math/ig,	/<\/math/ig,
	/<mtext/ig,	/<\/mtext/ig,
	/<mspace/ig,/<\/mspace/ig,
	/<mglyph/ig,/<\/mglyph/ig,
	/<mrow/ig,	/<\/mrow/ig,
	/<mfrac/ig,	/<\/mfrac/ig,
	/<msqrt/ig,	/<\/msqrt/ig,
	/<mroot/ig,	/<\/mroot/ig,
	/<mstyle/ig,/<\/mstyle/ig,
	/<merror/ig,/<\/merror/ig,
	/<mpadded/ig,	/<\/mpadded/ig,
	/<mphantom/ig,	/<\/mphantom/ig,
	/<mfenced/ig,	/<\/mfenced/ig,
	/<menclose/ig,	/<\/menclose/ig,
	/<msubsup/ig,	/<\/msubsup/ig,
	/<munder/ig,	/<\/munder/ig,
	/<mover/ig,		/<\/mover/ig,
	/<munderover/ig,/<\/munderover/ig,
	/<mmultiscripts/ig,	/<\/mmultiscripts/ig,
	/<mtable/ig,		/<\/mtable/ig,
	/<mlabeledtr/ig,	/<\/mlabeledtr/ig,
	/<maligngroup/ig,	/<\/maligngroup/ig,
	/<malignmark/ig,	/<\/malignmark/ig,
	/<mlabeledtr/ig,	/<\/mlabeledtr/ig,
	/<maction/ig,		/<\/maction/ig,
	/<msub/ig,	/<\/msub/ig,
	/<msup/ig,	/<\/msup/ig,
	/<mtr/ig,	/<\/mtr/ig,
	/<mtd/ig,	/<\/mtd/ig,
	/<mi/ig,	/<\/mi/ig,
	/<mn/ig,	/<\/mn/ig,
	/<mo/ig,	/<\/mo/ig,
	/<ms/ig,	/<\/ms/ig
  ];

// for IE's Tags
var nSymbols = [
	'<m:math',	'</m:math',
	'<m:mtext',	'</m:mtext',
	'<m:mspace','</m:mspace',
	'<m:mglyph','</m:mglyph',
	'<m:mrow',	'</m:mrow',
	'<m:mfrac',	'</m:mfrac',
	'<m:msqrt',	'</m:msqrt',
	'<m:mroot',	'</m:mroot',
	'<m:mstyle','</m:mstyle',
	'<m:merror','</m:merror',
	'<m:mpadded',	'</m:mpadded',
	'<m:mphantom',	'</m:mphantom',
	'<m:mfenced',	'</m:mfenced',
	'<m:menclose',	'</m:menclose',
	'<m:msubsup',	'</m:msubsup',
	'<m:munder',	'</m:munder',
	'<m:mover',		'</m:mover',
	'<m:munderover','</m:munderover',
	'<m:mmultiscripts',	'</m:mmultiscripts',
	'<m:mtable',		'</m:mtable',
	'<m:mlabeledtr',	'</m:mlabeledtr',
	'<m:maligngroup',	'</m:maligngroup',
	'<m:malignmark',	'</m:malignmark',
	'<m:mlabeledtr',	'</m:mlabeledtr',
	'<m:maction',		'</m:maction',
	'<m:msub',	'</m:msub',
	'<m:msup',	'</m:msup',
	'<m:mtr',	'</m:mtr',
	'<m:mtd',	'</m:mtd',
	'<m:mi',	'</m:mi',
	'<m:mn',	'</m:mn',
	'<m:mo',	'</m:mo',
	'<m:ms',	'</m:ms'
  ];

var symbols =[];
var isIE = document.createElementNS==null;

function isMathMLavailable() {
  if (navigator.appName.slice(0,8)=="Netscape") 
    if (navigator.appVersion.slice(0,1)>="5") return true;
    else return false;
  else if (navigator.appName.slice(0,9)=="Microsoft")
    try {
        var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
        return true;
    } catch (e) {
        return false;
    }
  else return false;
}

var hasDisplay = isMathMLavailable();

var oMmathml = "http://www.w3.org/1998/Math/MathML";

function translateMathML(t,str) { //convert MathML
  for (var i=0;i<oSymbolsReg.length ;i++ )
  {
	str = str.replace(oSymbolsReg[i],nSymbols[i]);
  }

  t.innerHTML = str;
}

function oMprocessNode(n) {
  // is IE, to do
  if (isIE)  {
	var frag;
	frag = document.getElementsByTagName('span');
	if (frag.length >0)	{
		for (var i=0;i<frag.length ;i++ ) {
			var cn = frag[i];
			var ntext = cn.innerHTML;
			var oClassAtt = cn.attributes.getNamedItem('class');
			if (oClassAtt.nodeValue == 'oMath') {
				if (hasDisplay == false) {
					//alert("友情提醒: \n你使用的浏览器不支持 MathML 公式.\n显示 MathML 公式需要 IE 6 + MathPlayer 或 Netscape7.1/Mozilla/Firefox.\n详细情况请看首页的说明.");
					ntext = "<font color ='#ff6600'>[公式无法显示:" + ntext + "]</font>"; 
				}
				translateMathML(cn,ntext);
			}
		}
	}
  }
}

var oMbody;
var oHasMathML = false, oMtranslated = false;

function translate() {
  if (!oMtranslated) { // run this only once
    oMtranslated = true;
    oMbody = document.getElementsByTagName("body")[0];
	//alert(oMbody);
	oMprocessNode(oMbody);
  }
}

if (isIE && hasDisplay == true) { // 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\"?>");
}
//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);
  //alert("运行至此");
}
//** 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;
  }
}
