//**************************************************************************************
// evalMyAS :(ActionScriptでの自作の eval() 関数)
// All rights reserved. Copyright (C) 2006 YokahiYokatoki
//**************************************************************************************

// 自作の eval関数---------------------------------------------------------------------
function evalMyAS(x, equation)
{
	var equ="("+equation+")"; // ( )でくくる
	equ=(equ.split("Math.PI")).join(Math.PI); // πを数値に置換
	equ=(equ.split("Math.E")).join(MAth.E); // eを数値に置換
	equ=(equ.split("exp")).join("ezp"); // exp を ezp に置換しておく
	equ=(equ.split("x")).join(x); // 文字xを数値に置換
	equ=(equ.split("ezp")).join("exp"); // ezp を exp に戻す

	var m0=0; // -- の処理-------(注釈:x を数値に置換したので、x が負値のとき  --3.1 のようになっている)
	while(true)
	{
		var m1=equ.indexOf("--", m0); if(m1<0){break;}
		if(m1==0 || equ.charAt(m1-1)=="(" || equ.charAt(m1-1)=="*" || equ.charAt(m1-1)=="/" || equ.charAt(m1-1)=="+" || equ.charAt(m1-1)==",")
		{
			equ=equ.substring(0, m1) + equ.substr(m1+2); // -- を 取る
		}
		else
		{
			equ=equ.substring(0, m1) + "+" + equ.substr(m1+2); // -- を + に置換
		}
		m0=m1; if(m0>equ.length-1){break;}
	}

	m0=0; // - の処理-------
	while(true)
	{
		var m1=equ.indexOf("-", m0); if(m1<0){break;}
		if(m1==0 || equ.charAt(m1-1)=="(" || equ.charAt(m1-1)=="*" || equ.charAt(m1-1)=="/" || equ.charAt(m1-1)=="+" || equ.charAt(m1-1)==",")
		{
			m0=m1+1;
		}
		else
		{
			equ=equ.substring(0, m1) + "+(-1)*" + equ.substr(m1+1); // -a、-Math.sin(A) などを +(-1)*a、 +(-1)*Math.sin(A) などに置き換える
			m0=m1+6;
		}
		if(m0>equ.length-1){break;}
	}
	equResult=evalMy0(x, equ);
	return equResult; 
}

//----------------------------------------------------------------------------------
function evalMy0(x, equation)
{
	var equ=equation;
	while(true) // 最内側の( ) から計算する(注釈:最内側( )内には、Math.…() のようなものはない)
	{
		var n1=equ.indexOf(")"); if(n1<0){break;} // ) の検索
		var n2=equ.lastIndexOf("(", n1-1); // ( に対応する ) の検索
		if(n2<0){break;}
		var str=equ.substring(n2+1, n1); // ( )内の文字
		var ne0=str.indexOf(","); // ( )内の , の検索
		if(ne0>=0) // ( )内に , があるので、 Math.log(A,B) or Math.pow(A,B) の処理
		{
			if(equ.substring(n2-3, n2)=="log") // Math.log(A,B) のとき
			{
				var strA=str.substring(0, ne0); // Math.log(A,B)の A の文字
				var valA=evalMy0(x, "("+strA+")"); // (注:再帰である)
				var strB=str.substring(ne0+1); // Math.log(A,B)の B の文字
				var valB=evalMy0(x, "("+strB+")"); //(注:再帰である)
				val=Math.log(valB)/Math.log(valA);
				equ=(equ.split("Math.log("+strA+","+strB+")")).join(val);
			}
			else if(equ.substring(n2-3, n2)=="pow") // Math.pow(A,B) のとき
			{
				var strA=str.substring(0, ne0); // Math.pow(A,B)の A の文字
				var valA=evalMy0(x, "("+strA+")"); // (注:再帰である)
				var strB=str.substring(ne0+1); // Math.pow(A,B)の B の文字
				var valB=evalMy0(x, "("+strB+")"); //(注:再帰である)
				val=Math.pow(valA,valB);
				equ=(equ.split("Math.pow("+strA+","+strB+")")).join(val);
			}
		}
		else
		{
			if(isNaN(str)) // strが数値(数字)のみではないとき(str="-3.7" なら 数値なので false となる)
			{
				var val=evalMy1(str); // ( ) の処理をし数値をもとめる
			}
			else
			{
				var val=parseFloat(str);
			}
			var str1=equ.substring(n2-8, n2);
				 if(str1=="Math.sin"){val=Math.sin(val); equ=(equ.split("Math.sin("+str+")")).join(val); n2-=8;}
			else if(str1=="Math.cos"){val=Math.cos(val); equ=(equ.split("Math.cos("+str+")")).join(val); n2-=8;}
			else if(str1=="Math.tan"){val=Math.tan(val); equ=(equ.split("Math.tan("+str+")")).join(val); n2-=8;}
			else if(str1=="ath.asin"){val=Math.asin(val); equ=(equ.split("Math.asin("+str+")")).join(val); n2-=9;}
			else if(str1=="ath.acos"){val=Math.acos(val); equ=(equ.split("Math.acos("+str+")")).join(val); n2-=9;}
			else if(str1=="ath.atan"){val=Math.atan(val); equ=(equ.split("Math.atan("+str+")")).join(val); n2-=9;}
			else if(str1=="Math.log"){val=Math.log(val); equ=(equ.split("Math.log("+str+")")).join(val); n2-=8;}
			else if(str1=="Math.exp"){val=Math.exp(val); equ=(equ.split("Math.exp("+str+")")).join(val); n2-=8;}
			else if(str1=="Math.abs"){val=Math.abs(val); equ=(equ.split("Math.abs("+str+")")).join(val); n2-=8;}
			else if(str1=="ath.sqrt"){val=Math.sqrt(val); equ=(equ.split("Math.sqrt("+str+")")).join(val); n2-=9;}
			else {equ=(equ.split("("+str+")")).join(val);} // ( ) を置き換える(注:このstrと同じものが他にあっても置き換えてよい)
		}
	}
	return equ;
}

// * と / のみからなる数式の いくつかの和、差からなる式の処理----------------
function evalMy1(equation)
{
	var str=equation.split("+"); // + で分割
	var val=0;
	for(var i=0; i< str.length; i++)
	{
		val+=evalMy2(str[i]);
	}
	return val;
}

// * と / のみからなる数式についての処理-----------------------------------
function evalMy2(equation)
{
	var val0=1;
	var str0=equation.split("*"); // * で分割
	for(var i=0; i< str0.length; i++)
	{
		var str1=str0[i].split("/"); // / で分割
		var val1=parseFloat(str1[0]);
		for(var j=1; j< str1.length; j++) // / を含んだ項の計算
		{
			val1/=parseFloat(str1[j]);
		}
		val0*=val1;
	}
	return val0;
}