(function($){

	$.fn.alphanumericf = function(p) {

		p = $.extend({
			disallow: "",
			allow: ""
		  }, p);

		return this.each
			(
				function()
				{
					var special = "!@#$%^&*()+=[]\\\';,/{}|\":<>?~`.- ";

					s = p.disallow.split('');
					for ( i=0;i<s.length;i++) if (special.indexOf(s[i]) != -1) s[i] = "\\"+s[i];
					p.disallow = s.join('|');
					var reg = new RegExp(p.disallow,'g');
					p.allow = p.allow.replace(reg, '');

					s = p.allow.split('');
					for ( i=0;i<s.length;i++) if (special.indexOf(s[i]) != -1) s[i] = "\\"+s[i];
					p.allow = "[^"+s.join('')+"]";
					var reg = new RegExp(p.allow,'g');

					$(this).bind
						('input keyup', function (e)
								{
									var pos = 0;

									if (document.selection) {
									this.focus ();
									var sel = document.selection.createRange ();
									sel.moveStart ('character', -$(this).val().length);
									pos = sel.text.length;
									} else if (this.selectionStart >= 0 || this.selectionStart == 0) pos = this.selectionStart;

									var len = $(this).val().length;
									$(this).val($(this).val().replace(reg, ''));
									if (len > $(this).val().length) pos -= len-$(this).val().length;

									if (p.allcaps) $(this).val($(this).val().toUpperCase());
									if (p.nocaps) $(this).val($(this).val().toLowerCase());

									if (document.selection) {
									this.focus ();
										var sel = document.selection.createRange ();
										sel.moveStart ('character', -$(this).val().length);
										sel.moveStart ('character', pos);
										sel.moveEnd ('character', pos-$(this).val().length);
										sel.select ();
									} else if (this.selectionStart || this.selectionStart == '0') {
										this.selectionStart = pos;
										this.selectionEnd = pos;
										this.focus ();
									}
								}
						);
				}
			);

	};

	$.fn.numeric = function(p) {
		p.allow += "0123456789";

		return this.each (function()
			{
				$(this).alphanumericf(p);
			}
		);

	};

	$.fn.alpha = function(p) {
		p.allow += " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
		if (p.special != false) p.allow += "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàááãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ\"'";

		return this.each (function()
			{
				$(this).alphanumericf(p);
			}
		);
	};

	$.fn.alphanumeric = function(p) {
		p.allow += " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		if (p.special != false) p.allow += "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ‘’“”ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİĲĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŰŲŴŶŸŹŻŽāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĳĵķĸĺļľŀłńņňŉŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž°º´¨\"'";

		return this.each (function()
			{
				$(this).alphanumericf(p);
			}
		);
	};

	$.fn.extend({
		//Helper Function for Caret positioning
		caret: function(begin, end) {
			if (this.length == 0) return;
			if (typeof begin == 'number') {
				end = (typeof end == 'number') ? end : begin;
				return this.each(function() {
					if (this.setSelectionRange) {
						this.focus();
						this.setSelectionRange(begin, end);
					} else if (this.createTextRange) {
						var range = this.createTextRange();
						range.collapse(true);
						range.moveEnd('character', end);
						range.moveStart('character', begin);
						range.select();
					}
				});
			} else {
				if (this[0].setSelectionRange) {
					begin = this[0].selectionStart;
					end = this[0].selectionEnd;
				} else if (document.selection && document.selection.createRange) {
					var range = document.selection.createRange();
					begin = 0 - range.duplicate().moveStart('character', -100000);
					end = begin + range.text.length;
				}
				return { begin: begin, end: end };
			}
		}
	});

})(jQuery);