﻿var KeyType = {
    KEY_NAVIGATION: 0,
    KEY_NUMBER: 1,
    KEY_UNKNOWN: 2,
    KEY_EDIT: 3
};
(function ($) {
    $.fn.thousand = function (sep) {
        this.keydown(function (e) {
            var type = getKeyType(e.keyCode);

            if ((type == KeyType.KEY_UNKNOWN) && !e.ctrlKey ){
                e.preventDefault();
            }
            else if ((e.shiftKey || e.ctrlKey || e.altKey) && type == KeyType.KEY_NUMBER)
                e.preventDefault();
            
        });
        this.keyup(function (e) {
            var type = getKeyType(e.keyCode);
            var value = $(this).val();

            if ((type == KeyType.KEY_EDIT || type == KeyType.KEY_NUMBER) && value.length > 0)
                setChangeValue($(this), value, sep);
        });
        //this.bind("paste", function () { return false; });
        this.focus(function () {
            $.data(this, "oldValue", $(this).val());
        });
        this.blur(function () {
            if ($.data(this, "oldValue") != $(this).val())
                $(this).trigger("change");
        });

        this.each(function () {
            var value = $(this).val();

            if (value.length > 0)
                setChangeValue($(this), value, sep);
        });
    };
})(jQuery);
function setChangeValue(element, value, sep) {
    var newValue = formatNumber(value, sep);

    element.val(newValue);
}
function formatNumber(input, sep) {
    var formatStr = "";
    var c = 0;

    for (var i = input.length - 1; i >= 0; i--) {
        var schar = input.substring(i, i + 1);

        if (schar != sep) {
            if (c > 0 & c++ % 3 == 0)
                formatStr = sep + formatStr;

            formatStr = schar + formatStr;
        }
    }

    return formatStr;
}
function getKeyType(keyCode) {
    if (keyCode == 46 || keyCode == 8)
        return KeyType.KEY_EDIT;
    else if (keyCode == 9 || keyCode == 13 || (keyCode >= 33 && keyCode <= 39))
        return KeyType.KEY_NAVIGATION;
    else if ((keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105))
        return KeyType.KEY_NUMBER;

    return KeyType.KEY_UNKNOWN;
}
