﻿jQuery.fn.inputSetup = function() {
    this.each(function() {
        var ch = $(this);
        var oep = ch.attr('onenterdown');
        if (oep) {
            ch.keydown(function(e) {
                if (window.event) e = window.event;
                var kn = e.keyCode ? e.keyCode : e.which;
                if (kn == 13) {
                    eval(oep);
                    return false;
                }
                else
                    return true;
            });
        }
        var at = ch.attr('autotab');
        if (at) {
            ch.keyup(function(e) {
                var t = $(this);
                if (t.val().length == t.attr('maxlength')) $(at).focus();
            });
        }
        var onkp = ch.attr('onnumerickeydown');
        var onku = ch.attr('onnumerickeyup');
        var num = ch.attr('numeric');
        var numFunc = function(e) {
            var t = $(this);
            var dec = !!t.attr('allowdecimal');
            var neg = !!t.attr('allownegative');
            var val = t.val();
            if (window.event) e = window.event;
            var keynum = (e.keyCode) ? e.keyCode : e.which;
            if (e.ctrlKey)
                return true;
            switch (keynum) {
                case 9: //tab
                case 13: //enter
                case 17: //ctrl
                case 18: //alt
                case 19: //pause/break
                case 20: //capslock
                case 27: //escape
                case 33: //page up
                case 34: //page down
                case 35: //end
                case 36: //home
                case 37: //left arrow
                case 38: //up arrow
                case 39: //right arrow
                case 40: //down arrow
                case 8: //backspace
                case 45: //insert
                case 46: //delete
                    return true;
                case 96: //0 numpad
                case 97: //1 numpad
                case 98: //2 numpad
                case 99: //3 numpad
                case 100: //4 numpad
                case 101: //5 numpad
                case 102: //6 numpad
                case 103: //7 numpad
                case 104: //8 numpad
                case 105: //9 numpad
                case 49: //1
                case 50: //2
                case 51: //3
                case 52: //4
                case 53: //5
                case 54: //6
                case 55: //7
                case 56: //8
                case 57: //9
                case 48: //0
                    if (!e.shiftKey) {
                        if (onkp) eval(onkp);
                        if (onku) eval(onku);
                        return true;
                    }
                    break;
                //NUMPAD                                          
                case 110: //. numpad
                case 190: //.
                    if (!e.shiftKey && dec && val.indexOf('.') == -1) {
                        if (onkp) eval(onkp);
                        if (onku) eval(onku);
                        return true;
                    }
                    break;
                case 109: //- numpad
                case 189: //-
                    if (!e.shiftKey && neg) {
                        if (val.indexOf('-') != 0) val = '-' + val;
                        if (onkp) eval(onkp);
                        if (onku) eval(onku);
                        t.val(val);
                    }
                default:
                    return !num;
            };
        };
        if (num || onkp) {
            ch.keydown(numFunc);
        }
        if (onku) {
            ch.keyup(numFunc);
        }
        var cn = ch.attr('formatnumber');
        if (cn) {
            ch.blur(function(e) {
                try {
                    var $t = $(this);
                    var z = 0;
                    var r = new Number($t.val());
                    if (!isNaN(r))
                        $t.val(r.toFixed(cn));
                    else
                        $t.val(z.toFixed(cn));
                } catch (err) { }
            });
        }
    });
    return this;
}