/*f***********/
function representFunction(sFE,xf,iCheckOnErrors)
{
	var	oRes;
	var	iCh;
	var	oE;

	oRes=new Object();
	oRes.yRes=NaN;
	oRes.iErr=0;

	sFE=deleteSym(' ',sFE);
	
	xf*=1;

	oE=new Object();
	oE.arE=toArray(sFE,xf,oRes);
//	alert(oE.arE);

	if(iCheckOnErrors)
		oRes.iErr=checkOnErrors(oE.arE);

	for(;oRes.iErr==0;)
	{
		iCh=calcFEs(oE);
		if(oE.arE.length==1)
			break;
		else
		{
			if(!iCh)
				break;
		}
	}

	if(oRes.iErr==0)
		oRes.yRes=Number(oE.arE[0]);

	return oRes;
}
/*f**********/
function toArray(sFE,xf,oRes)
{
	var	jc,jcEE;
	var	sTrm;

	arE=new Array();
	arE.push('(');
	for(jc=0;jc<sFE.length;jc++)
	{
		if('0'<=sFE.charAt(jc)&&sFE.charAt(jc)<='9'||sFE.charAt(jc)=='.')
		{
			for(jcEE=sFE.length;jcEE>jc;jcEE--)
			{
				sTrm=sFE.substring(jc,jcEE);
				if(isFinite(Number(sTrm)))
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Number(sTrm);
						else
							arE[arE.length-1]=Number(sTrm);
					}
					else
						arE.push(Number(sTrm));
					jc=jcEE-1;
				}
			}
		}
		else
		{
			if(
			 sFE.charAt(jc)=='('||sFE.charAt(jc)==')'||
			 sFE.charAt(jc)=='*'||sFE.charAt(jc)=='/'||sFE.charAt(jc)=='%'||
			 sFE.charAt(jc)=='+'||sFE.charAt(jc)=='-'||
			 sFE.charAt(jc)==','
			 )
				arE.push(sFE.substring(jc,jc+1));
			else
			{
				if(sFE.charAt(jc)=='x')
				{
					arE.push(xf);
					continue;
				}
				if(sFE.substring(jc,jc+3)=='tan')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+5)=='SQRT2')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.SQRT2;
						else
							arE[arE.length-1]=Math.SQRT2;
					}
					else
						arE.push(Math.SQRT2);
					jc+=4;
					continue;
				}
				if(sFE.substring(jc,jc+7)=='SQRT1_2')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.SQRT1_2;
						else
							arE[arE.length-1]=Math.SQRT1_2;
					}
					else
						arE.push(Math.SQRT1_2);
					jc+=6;
					continue;
				}
				if(sFE.substring(jc,jc+4)=='sqrt')
				{
					arE.push(sFE.substring(jc,jc+4));
					jc+=3;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='sin')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+5)=='round')
				{
					arE.push(sFE.substring(jc,jc+5));
					jc+=4;
					continue;
				}
				if(sFE.substring(jc,jc+6)=='random')
				{
					arE.push(sFE.substring(jc,jc+6));
					jc+=5;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='pow')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+2)=='PI')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.PI;
						else
							arE[arE.length-1]=Math.PI;
					}
					else
						arE.push(Math.PI);
					jc++;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='min')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='max')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+6)=='LOG10E')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.LOG10E;
						else
							arE[arE.length-1]=Math.LOG10E;
					}
					else
						arE.push(Math.LOG10E);
					jc+=5;
					continue;
				}
				if(sFE.substring(jc,jc+5)=='LOG2E')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.LOG2E;
						else
							arE[arE.length-1]=Math.LOG2E;
					}
					else
						arE.push(Math.LOG2E);
					jc+=4;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='log')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+4)=='LN10')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.LN10;
						else
							arE[arE.length-1]=Math.LN10;
					}
					else
						arE.push(Math.LN10);
					jc+=3;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='LN2')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.LN2;
						else
							arE[arE.length-1]=Math.LN2;
					}
					else
						arE.push(Math.LN2);
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+5)=='floor')
				{
					arE.push(sFE.substring(jc,jc+5));
					jc+=4;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='exp')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.charAt(jc)=='E')
				{
					if((arE[arE.length-1]=='-'||arE[arE.length-1]=='+')&&arE[arE.length-2]=='(')
					{
						if(arE[arE.length-1]=='-')
							arE[arE.length-1]=-Math.E;
						else
							arE[arE.length-1]=Math.E;
					}
					else
						arE.push(Math.E);
					continue;
				}
				if(sFE.substring(jc,jc+3)=='cos')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				if(sFE.substring(jc,jc+4)=='ceil')
				{
					arE.push(sFE.substring(jc,jc+4));
					jc+=3;
					continue;
				}
				if(sFE.substring(jc,jc+5)=='atan2')
				{
					arE.push(sFE.substring(jc,jc+5));
					jc+=4;
					continue;
				}
				if(sFE.substring(jc,jc+4)=='atan')
				{
					arE.push(sFE.substring(jc,jc+4));
					jc+=3;
					continue;
				}
				if(sFE.substring(jc,jc+4)=='asin')
				{
					arE.push(sFE.substring(jc,jc+4));
					jc+=3;
					continue;
				}
				if(sFE.substring(jc,jc+4)=='acos')
				{
					arE.push(sFE.substring(jc,jc+4));
					jc+=3;
					continue;
				}
				if(sFE.substring(jc,jc+3)=='abs')
				{
					arE.push(sFE.substring(jc,jc+3));
					jc+=2;
					continue;
				}
				oRes.iErr=1;
			}
		}
	}
	arE.push(')');
	
	return arE;
}
/*f**********/
function calcFEs(oE)
{
	var	iCh;
	var	ja,jaEE,jaCm;
	var	nx,nxTwo;
	var	arEE;
	var	arB,arA;
	var	arN,arNTwo;

	iCh=0;

	arEE=new Array();

	arB=new Array();
	arA=new Array();

	arN=new Array();
	arNTwo=new Array();

	for(ja=0;ja<oE.arE.length;ja++)
	{
		if(oE.arE[ja]=='(')
		{
			for(jaEE=ja+1;jaEE<oE.arE.length;jaEE++)
			{
				if(oE.arE[jaEE]=='(')
				{
					ja=jaEE-1;
					break;
				}
				if(oE.arE[jaEE]==')')
				{
					arEE=oE.arE.slice(ja+1,jaEE);

					for(jaCm=0;jaCm<arEE.length;jaCm++)
					{
						if(arEE[jaCm]==',')
							break;
					}
					if(jaCm>=arEE.length)
					{
						nx=calcEE(arEE);

						arB=oE.arE.slice(0,ja+1);
						arB[ja]=nx;
						arA=oE.arE.slice(jaEE+1,oE.arE.length);
						oE.arE=arB.concat(arA);
					}
					else
					{
						arN=arEE.slice(0,jaCm);
						arNTwo=arEE.slice(jaCm+1,arEE.length);
						nx=calcEE(arN);
						nxTwo=calcEE(arNTwo);

						arB=oE.arE.slice(0,ja+2);
						arB[ja]=nx;
						arB[ja+1]=nxTwo;
						arA=oE.arE.slice(jaEE+1,oE.arE.length);
						oE.arE=arB.concat(arA);
					}
					iCh=1;

					if(ja)
					{
						if(!(oE.arE[ja-1]=='*'||oE.arE[ja-1]=='/'||oE.arE[ja-1]=='%'||oE.arE[ja-1]=='+'||oE.arE[ja-1]=='-'))
						{
							if(oE.arE[ja-1]=='tan')
							{
								oE.arE[ja-1]=Math.tan(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='sqrt')
							{
								oE.arE[ja-1]=Math.sqrt(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='sin')
							{
								oE.arE[ja-1]=Math.sin(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='round')
							{
								oE.arE[ja-1]=Math.round(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='random')
							{
								oE.arE[ja-1]=Math.random();
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='pow')
							{
								oE.arE[ja-1]=Math.pow(oE.arE[ja],oE.arE[ja+1]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+2,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='min')
							{
								oE.arE[ja-1]=Math.min(oE.arE[ja],oE.arE[ja+1]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+2,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='max')
							{
								oE.arE[ja-1]=Math.max(oE.arE[ja],oE.arE[ja+1]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+2,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='log')
							{
								oE.arE[ja-1]=Math.log(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='floor')
							{
								oE.arE[ja-1]=Math.floor(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='exp')
							{
								oE.arE[ja-1]=Math.exp(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='cos')
							{
								oE.arE[ja-1]=Math.cos(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='ceil')
							{
								oE.arE[ja-1]=Math.ceil(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='atan2')
							{
								oE.arE[ja-1]=Math.atan2(oE.arE[ja],oE.arE[ja+1]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+2,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='atan')
							{
								oE.arE[ja-1]=Math.atan(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='asin')
							{
								oE.arE[ja-1]=Math.asin(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='acos')
							{
								oE.arE[ja-1]=Math.acos(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
							if(oE.arE[ja-1]=='abs')
							{
								oE.arE[ja-1]=Math.abs(oE.arE[ja]);
								arB=oE.arE.slice(0,ja);
								arA=oE.arE.slice(ja+1,oE.arE.length);
								oE.arE=arB.concat(arA);
							}
						}
					}

					break;
				}
			}
		}
	}

	return iCh;
}
/*f**********/
function calcEE(arEE)
{
	var	nx;
	var	ja;
	var	arB,arA;

	arB=new Array();
	arA=new Array();

	if(arEE[0]=='-')
	{
		arEE[1]*=-1;
		arEE.shift();
	}
	for(ja=0;ja<arEE.length;ja++)
	{
		if(arEE[ja]=='*'||arEE[ja]=='/'||arEE[ja]=='%')
		{
			if(arEE[ja]=='*')
				arEE[ja-1]=arEE[ja-1]*arEE[ja+1];
			if(arEE[ja]=='/')
				arEE[ja-1]=arEE[ja-1]/arEE[ja+1];
			if(arEE[ja]=='%')
				arEE[ja-1]=arEE[ja-1]%arEE[ja+1];
			arB=arEE.slice(0,ja);
			arA=arEE.slice(ja+2,arEE.length);
			arEE=arB.concat(arA);
			ja--;
		}
	}

	for(ja=0;ja<arEE.length;ja++)
	{
		if(arEE[ja]=='+'||arEE[ja]=='-')
		{
			if(arEE[ja]=='+')
				arEE[ja-1]=arEE[ja-1]+arEE[ja+1];
			if(arEE[ja]=='-')
				arEE[ja-1]=arEE[ja-1]-arEE[ja+1];
			arB=arEE.slice(0,ja);
			arA=arEE.slice(ja+2,arEE.length);
			arEE=arB.concat(arA);
			ja--;
		}
	}

	nx=arEE[0];

	return nx;
}
/*f***********/
function deleteSym(cK,sK)
{
	var	jc;

	for(jc=0;jc<sK.length;jc++)
	{
		if(sK.charAt(jc)==' ')
		{
			sK=sK.substring(0,jc)+sK.substring(jc+1,sK.length);
			jc--;
		}
	}

	return sK;
}
/*f***********/
function checkOnErrors(arE)
{
	var	ja,jaF;
	var	qPO,qPC;
	var	iInP;
	var	qComma;
	var	iErr;
	
	iErr=0;
	for(ja=0,qPC=qPO=0;ja<arE.length&&iErr==0;ja++)
	{
		if(ja+1<arE.length)
		{
			if(arE[ja]=='(')
			{
				if(arE[ja+1]!=')')
				{
					if(arE[ja+1]!='(')
					{
						if(!(isFinite(Number(arE[ja+1]))||arE[ja+1]=='-'))
						{
							if(!estFunctionOrConst(arE[ja+1]))
								iErr=1;
						}
					}
				}
				qPO++;
				continue;
			}
			if(isFinite(Number(arE[ja])))
			{
				if(!(arE[ja+1]=='*'||arE[ja+1]=='/'||arE[ja+1]=='%'||arE[ja+1]=='+'||arE[ja+1]=='-'||arE[ja+1]==','||arE[ja+1]==')'))
					iErr=1;
				continue;
			}
			if(estFunctionOrConst(arE[ja]))
			{
				if(arE[ja+1]=='(')
				{
					if(estFunctionOrConst(arE[ja])==1.5)
					{
						for(jaF=ja+2,iInP=0,qComma=0;jaF<arE.length;jaF++)
						{
							if(arE[jaF]=='(')
								iInP++;
							if(arE[jaF]==')')
							{
								if(--iInP<0)
									break;
							}
							if(!iInP)
							{
								if(arE[jaF]!=' ')
									qComma++;
							}
							else
								qComma++;
						}
						if(qComma)
							iErr=2;
					}
					if(estFunctionOrConst(arE[ja])==2)
					{
						for(jaF=ja+2,iInP=0,qComma=0;jaF<arE.length;jaF++)
						{
							if(arE[jaF]=='(')
								iInP++;
							if(arE[jaF]==')')
							{
								if(--iInP<0)
									break;
							}
							if(!iInP)
							{
								if(arE[jaF]==',')
									qComma++;
							}
						}
						if(qComma)
							iErr=2;
					}
					if(estFunctionOrConst(arE[ja])==3)
					{
						for(jaF=ja+2,iInP=0,qComma=0;jaF<arE.length;jaF++)
						{
							if(arE[jaF]=='(')
								iInP++;
							if(arE[jaF]==')')
							{
								if(--iInP<0)
									break;
							}
							if(!iInP)
							{
								if(arE[jaF]==',')
									qComma++;
							}
						}
						if(qComma!=1)
							iErr=2;
					}
				}
				else
					iErr=1;
				continue;
			}
			if(arE[ja]=='*'||arE[ja]=='/'||arE[ja]=='%'||arE[ja]=='+'||arE[ja]=='-'||arE[ja]==',')
			{
				if(arE[ja+1]!='(')
				{
					if(!isFinite(Number(arE[ja+1])))
					{
						if(!estFunctionOrConst(arE[ja+1]))
							iErr=1;
					}
				}
				continue;
			}
			if(arE[ja]==')')
			{
				if(!(arE[ja+1]=='*'||arE[ja+1]=='/'||arE[ja+1]=='%'||arE[ja+1]=='+'||arE[ja+1]=='-'||arE[ja+1]==','||arE[ja+1]==')'))
					iErr=1;
				qPC++;
				continue;
			}
		}
		else
		{
			if(arE[ja]!=')')
				iErr=1;
			qPC++;
		}
	}

	if(qPO-qPC)
	{
		if(iErr==0)
			iErr=1;
	}
	
	return iErr;
}
/*f**********/
function estFunctionOrConst(arES)
{
	var	iRes;

	iRes=0;
	if(
	 arES=='SQRT2'||
	 arES=='SQRT1_2'||
	 arES=='PI'||
	 arES=='LOG10E'||
	 arES=='LOG2E'||
	 arES=='LN10'||
	 arES=='LN2'||
	 arES=='E'
	)
		iRes=1;
	if(
	 arES=='random'
	)
		iRes=1.5;
	if(
	 arES=='tan'||
	 arES=='sqrt'||
	 arES=='sin'||
	 arES=='round'||
	 arES=='log'||
	 arES=='floor'||
	 arES=='exp'||
	 arES=='cos'||
	 arES=='ceil'||
	 arES=='atan'||
	 arES=='asin'||
	 arES=='acos'||
	 arES=='abs'
	)
		iRes=2;
	if(
	 arES=='pow'||
	 arES=='min'||
	 arES=='max'||
	 arES=='atan2'
	)
		iRes=3;

	return iRes;
}