function EformExpressionEvaluator()
{window.evaluator=this;this.variables=null;this.functions=null;this.operators=new Array();this.operators["&&"]=/ and /gi;this.operators["||"]=/ or /gi;this.operators["=="]=/ eq /gi;this.operators["!="]=/ ne /gi;this.operators[">"]=/ gt /gi;this.operators[">="]=/ ge /gi;this.operators["<"]=/ lt /gi;this.operators["<="]=/ le /gi;this.operators["!"]=/ not /gi;this.operators["%"]=/ mod /gi;this.setFunctions=function setFunctions(functions)
{if(functions==null)throw(this+" empty or no function resolver was passed!");this.functions=functions;for(var identifier in this.functions)
{window[identifier]=this.functions[identifier];}}
this.setVariables=function setVariables(variables)
{if(variables==null)throw(this+" empty or no variable resolver was passed!");this.variables=variables;}
this.evaluate=function evaluate(text)
{if(text==null)throw(this+" empty or no expression was passed!");if(this.variables==null)throw(this+" empty or no variable set was specified!")
if(text.indexOf('$')==-1)return text;var expressions=text.match(/\$\{.*?\}/g);for(var i=0;i<expressions.length;i++)
{var expression=expressions[i];var substitution=expression.substring(2,expression.length-1);substitution=this._substituteOperators(substitution);substitution=this._substituteVariables(substitution);substitution=eval(substitution);text=text.replace(expression,substitution);}
return text;}
this._substituteVariables=function(expression)
{return expression.replace(/[a-zA-Z_][\w\.\[\]]*/g,function(match)
{return evaluator._resolveVariable(match);});}
this._resolveVariable=function(identifier)
{var variable=this.variables[identifier];if(variable!=null)
{variable=variable.valueOf();return typeof(variable)=='string'?"'"+variable+"'":variable;}
else return identifier;}
this._substituteOperators=function(expression)
{for(var operator in this.operators)
{expression=expression.replace(this.operators[operator],operator);}
return expression;}
this.toString=function()
{return"[evaluator]";}}