﻿if (typeof(Tangora) == 'undefined') var Tangora = {};
Tangora.CalculationLibrary = new CalculationLibrary();

function CalculationLibrary()
{
    this._expressions = [];
    
    this._resolvers = [];
    
    this.addResolver = function(name, callback)
    {
        this._resolvers[name] = callback;
    }
    
    this.addExpression = function(name, expr)
    {
        this._expressions[name] = expr;
    }
    
    this.execExpression = function(name, args)
    {        
        var expr = this._expressions[name];
        var re = new RegExp("\{.*?\}", "");
        var mf = null;
        var realExpr = expr;
        mf = re.exec(expr);
        while (mf)
        {
            if (args && typeof(args[mf])!='undefined')
            {
                realExpr = realExpr.replace(mf, args[mf]);            
            }
            else
            {
                var sMf = mf[0];
                var defValue = 0;
                if (mf[0].indexOf(',')>-1)
                {
                    sMf = mf[0].split(',')[0] + '}';
                    defValue = new Number((mf[0].split(',')[1]).replace('}',''));
                }
                var value = 0;
                try
                {
                    var resolver = this._resolvers[sMf];
                    if (resolver) value = resolver();
                    else value = this.execExpression(sMf.replace('{','').replace('}',''));
                    if (isNaN(value)) value = defValue;
                }
                catch(e)
                {
                    value = defValue;
                }
                realExpr = realExpr.replace(mf, value);
            }
            var rc = realExpr;//RegExp.rightContext;            
            mf = re.exec(rc);
        }
        return new Number(eval(realExpr));        
    }
}