Object.extend(Math, {
    numberFormat: function(number, options) {
        options = Object.extend({
            decimals: 2,
            decimalDelimiter: ",",
            wholeDelimiter: ""
        }, options || {});

        var i = 0;
        var nArr = String(number).split(".");

        var whole = (typeof nArr[0] != "undefined") ? nArr[0] : "0";
        if (options.wholeDelimiter) {
            var exp = /(\d+)(\d{3})/;
            while (exp.test(whole)) {
                whole = whole.replace(exp, "$1" + options.wholeDelimiter + "$2");
            }
        }

        var remainder = "";
        if (typeof nArr[1] != "undefined") {
            remainder = nArr[1];
        } else {
            for (i = 0; i < options.decimals; i++){
                remainder += "0";
            }
        }

        if (options.decimals <= 0) {
            return whole;
        }

        var a = new Array();
        for (i = 0; i < options.decimals; i++) {
            if (remainder.charAt(i) != "") {
                a[i] = remainder.charAt(i);
            }
            else a[i] = "0";
        }

        return whole + options.decimalDelimiter + a.join("");
    }
});

Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
    function (callOriginal, options) {
        var csrfName, csrfToken, parameters;
        
        try {
            csrfName = $$("head meta[name=csrf-name]")[0].content;
            csrfToken = $$("head meta[name=csrf-token]")[0].content;
        } catch (e) {
            return callOriginal(options);
        }
        
        parameters = options.parameters || {};
        
        if (Object.isString(parameters)) {
            if (parameters.indexOf(csrfName + "=") == -1) {
                parameters += "&" + csrfName + "=" + csrfToken;
            }
        } else if (Object.isHash(parameters)) {
            if (!parameters.get(csrfName)) {
                parameters.set(csrfName, csrfToken);
            }
        }
        options.parameters = parameters;
        
        return callOriginal(options);
    }
);
