var $wr = function() {
    return {
    
        format : function (t, o) {
            return t.replace(/{([^{}]*)}/g,
                function (a, b) {
                    var tmp = b.split(':');
                    var fieldName = tmp[0];
                    var frmt = (tmp.length == 2 ? frmt = tmp[1] : 'g');
                    var r = o[fieldName];
                    if(typeof r === 'string')
                    {
                        return r;
                    }
                    else if (typeof r === 'number')
                    {
                        switch(frmt)
                        {
                            case "g":
                                return r;
                                break;
                            case "$":
                                return $wr.toCurrency(r);
                                break;
                            case "%":
                                return $wr.toPercent(r);
                                break;
                            default:
                                return r;
                        }
                    }
                    else
                    { 
                        return a;
                    }
                }
            );
        },


        isNumeric : function(aString)
        {
            return (! isNaN(aString));
        },
        
        paymentAmountFutureValue : function(fv, n, i){
        /// calculates the payment needed to reach a predetermined future amount
        /// given the future value (fv), the interest rate (i) and the number
        /// of periods (n)
            return fv/((Math.pow((1+i), n))/i);
        },
        
        pmt : function(P,r,n,Y)
        {
            // P = Principle
            // r = rate
            // n = payments per year
            //(A3*(A1/12))/(1-(1+A1/12)^(-(12*A2)))
            
            var tolPmts = n*Y;
            var effRate = r/12.0;
            return P/((((Math.pow((1+effRate),tolPmts))) -1)/effRate);
            
        
        },
        
        round : function(aNumber, places)
        {
            var factor = 1;
            var result = 0;
            if (places > 0)
                factor = places * 10;
                
            result = Math.round(aNumber*factor)/factor;
            
            if (places < 0)
            {
                var aString = result.toString();
                
                var whole = aString.substr(
                    0, (aString.length + places)
                );
                
                result = whole * Math.pow(10,-places);
            }
                
            return result;
        },
                
        roundUp : function(aNumber) {
            var aString = Math.round(aNumber).toString();
            
            var num = parseFloat(
                aString.substr(0, 2)
            );
            
            var result = (num + 1) * Math.pow(10, aString.length - 2);
            
            return result;
        },
        
        
        sum : function(arrayToSum) {
            var tot = 0.0; 
            for (var i = 0; i <= arrayToSum.length - 1; i++)
            {
                tot = tot + arrayToSum[i];
            }
            return tot;
            
        },

        
        toCurrency : function(number) {
            if (number == 0)
            {
                return 0;
            }
            var arr = Math.round(number).toString().split('');
            var temp = [""];
            for(var i = arr.length -1; i >= 0; i--)
            {
                if ((temp.length > 0) && ((temp.length % 4) == 0))
                {
                    temp.push(',');
                }
               
               temp.push(arr[i]);
            }
            temp.push("$");
            
            return temp.reverse().join("");
        },
        
        
        toNumber : function (aString)
        {
            if(aString.length === 0) {
                return 0;
            }
            
            if($wr.isNumeric(aString)) {
                return parseFloat(aString);
            }
                
            return 0;
        },
        
        toPercent : function(number)
        {
            return Math.round((number * 100)).toString() + "%";
        },
        
        validateIsDecimal : function (e)
        {
            var keynum;
            
            if(window.event) {// IE
                keynum = $wr.toNumber(e.keyCode);
            }
            else if(e.which) { // Netscape/Firefox/Opera
                keynum = $wr.toNumber(e.which);
            }
                
            // allow any non char keys
            if (keynum <= 46) {
                return true;
            }
                
            // decimal point
            if((keynum === 190) || (keynum === 110)) {
                return true;
            }
                
            // number keys top of keyboard
            if((keynum >= 48) && (keynum <= 57)) {
                return true;
            }
                
            // number keys top of keyboard
            if((keynum >= 96) && (keynum <= 105)) {
                return true;
            }
            // no matches, return false
            return false;
        }
        
    }

}();

