(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) {

								if (!e.charCode) k = String.fromCharCode(e.which);
								else k = String.fromCharCode(e.charCode);

								if (ch.indexOf(k) != -1) e.preventDefault();
								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);

