﻿(function($) {
    $.formatCurrency = {}; $.formatCurrency.regions = []; $.formatCurrency.regions[""] = { symbol: "$", positiveFormat: "%s%n", negativeFormat: "(%s%n)", decimalSymbol: ".", digitGroupSymbol: ",", groupDigits: true };
    $.fn.formatCurrency = function(destination, settings) {
        if (arguments.length == 1 && typeof destination !== "string") {
            settings = destination; destination = false
        } var defaults = { name: "formatCurrency", colorize: false, region: "", global: true }; defaults = $.extend(defaults, $.formatCurrency.regions[""]); settings = $.extend(defaults, settings);
        if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)) } return this.each(function() {
            $this = $(this); var num = "0";
            num = $this[$this.is("input, select, textarea") ? "val" : "html"](); var trimRegex = new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g"); num = num.replace(trimRegex, "");
            if (settings.decimalSymbol != ".") { num = num.replace(settings.decimalSymbol, ".") } if (isNaN(num)) { num = "0" } var isPositive = (num == (num = Math.abs(num)));
            num = Math.floor(num * 100); var cents = num % 100; num = Math.floor(num / 100).toString(); if (cents < 10) { cents = "0" + cents } if (settings.groupDigits) {
                for (var i = 0;
i < Math.floor((num.length - (1 + i)) / 3); i++) { num = num.substring(0, num.length - (4 * i + 3)) + settings.digitGroupSymbol + num.substring(num.length - (4 * i + 3)) } 
            } num = num + settings.decimalSymbol + cents;
            var format = isPositive ? settings.positiveFormat : settings.negativeFormat; var money = format.replace(/%s/g, settings.symbol); money = money.replace(/%n/g, num);
            if (!destination) { destination = $this } else { destination = $(destination) } destination[destination.is("input, select, textarea") ? "val" : "html"](money);
            if (settings.colorize) { destination.css("color", isPositive ? "black" : "red") } 
        })
    }; $.fn.toNumber = function(settings) {
        var defaults = $.extend({ name: "toNumber", region: "", global: true }, $.formatCurrency.regions[""]);
        settings = jQuery.extend(defaults, settings); if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)) } return this.each(function() {
            var method = $(this).is("input, select, textarea") ? "val" : "html";
            var trimRegex = new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g"); $(this)[method]($(this)[method]().replace(trimRegex, ""))
        })
    }; $.fn.asNumber = function(settings) {
        var defaults = $.extend({ name: "asNumber", region: "", parse: true, parseType: "Float", global: true }, $.formatCurrency.regions[""]);
        settings = jQuery.extend(defaults, settings); if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)) } settings.parseType = validateParseType(settings.parseType);
        var method = $(this).is("input, select, textarea") ? "val" : "html"; var trimRegex = new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g"); var num = $(this)[method]().replace(trimRegex, "");
        if (!settings.parse) { return num } if (num.length == 0) { num = "0" } if (settings.decimalSymbol != ".") { num = num.replace(settings.decimalSymbol, ".") } return window["parse" + settings.parseType](num)
    }; function getRegionOrCulture(region) {
        var regionInfo = $.formatCurrency.regions[region]; if (regionInfo) { return regionInfo } else {
            if (/(\w+)-(\w+)/g.test(region)) {
                var culture = region.replace(/(\w+)-(\w+)/g, "$1");
                return $.formatCurrency.regions[culture]
            } 
        } return null
    } function validateParseType(parseType) {
        switch (parseType.toLowerCase()) {
            case "int": return "Int";
            case "float": return "Float"; default: throw "invalid parseType"
        } 
    } 
})(jQuery);
