(function($){

    $.fn.alphanumeric = function(p) {

        p = $.extend({
            ichars: "!@#$%^&*()+=[]\\\';,/{}|\":<>?~`.- ",
            nchars: "",
            allow: ""
        }, p);

        return this.each
        (
            function()
            {

                if (p.nocaps) p.nchars += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                if (p.allcaps) p.nchars += "abcdefghijklmnopqrstuvwxyz";

                s = p.allow.split('');
                for ( i=0;i<s.length;i++) if (p.ichars.indexOf(s[i]) != -1) s[i] = "\\" + s[i];
                p.allow = s.join('|');

                var reg = new RegExp(p.allow,'gi');
                var ch = p.ichars + p.nchars;
                ch = ch.replace(reg,'');

                $(this).keypress
                (
                    function (e)
                    {
                        $(this).trigger('legal.alphanumeric', e);
                        if (!e.charCode) k = String.fromCharCode(e.which);
                        else k = String.fromCharCode(e.charCode);

                        if (ch.indexOf(k) != -1){
                            e.preventDefault();
                            $(this).trigger('illegal.alphanumeric', e);
                            return false;
                        }
                        if (e.ctrlKey&&k=='v') e.preventDefault();

                    }

                    );

                $(this).bind('contextmenu',function () {
                    return false
                    });

            }
            );

    };

    $.fn.numeric = function(p) {

        var az = "abcdefghijklmnopqrstuvwxyz";
        az += az.toUpperCase();

        p = $.extend({
            nchars: az
        }, p);

        return this.each (function()
        {
            $(this).alphanumeric(p);
        }
        );

    };

    $.fn.alpha = function(p) {

        var nm = "1234567890";

        p = $.extend({
            nchars: nm
        }, p);

        return this.each (function()
        {
            $(this).alphanumeric(p);
        }
        );

    };

})(jQuery);

