(function($){
	$.fn.validate = function(options) {
		var defaults = {
			valid: function(){},
			invalid: function(){},
			focus: function(){}
		};
		var options = $.extend(defaults, options);
		
		return this.each(function() {
			var obj = $(this);
			var actionUrl = obj.attr("action");
			var currentErrorField = '';			
			
			$("input[type=text], textarea", obj).bind('blur keyup', function(){
				var field = $(this);
				var fieldName = field.attr('name');
				var fieldValue = field.val();
                var urlComponents = '';
                if(actionUrl.indexOf("?") >=0)
				{
                    urlComponents = '&mode=validate&field='
                } 
				else 
				{
                    urlComponents = '?mode=validate&field='
                }
				
				$.post(
					actionUrl + urlComponents + fieldName, 
					fieldName + "=" + escape(fieldValue), 
					function(data){
						if(data[1])
						{ 
							// invalid
							if(!field.hasClass("invalid"))
							{
								field.addClass("invalid");
							}
							options.invalid(field, data[1]);
							if(currentErrorField.length == 0)
							{
								currentErrorField = fieldName;
								options.focus(field);
							}
						} 
						else 
						{       
							// valid
							options.valid(field);
						}
					}, 
					"json"
				);
			}).focus(function(){
				if($(this).hasClass("invalid"))
				{
					options.focus($(this));
					currentErrorField = $(this).attr("name");
				}
			});
		});
	};

	$.fn.reverse = function() { 
		return this.pushStack(this.get().reverse(), arguments); 
	}; 
	 
	$.each( ['prev', 'next'], function(unusedIndex, name) { 
		$.fn[ name + 'ALL' ] = function(matchExpr) { 
			// get all the elements in the body, including the body. 
			var $all = $('body').find('*').andSelf(); 
	 
			// slice the $all object according to which way we're looking 
			$all = (name == 'prev') 
				 ? $all.slice(0, $all.index(this)).reverse() 
				 : $all.slice($all.index(this) + 1) 
			; 
			// filter the matches if specified 
			if (matchExpr) $all = $all.filter(matchExpr); 
			return $all; 
		}; 
	}); 

})(jQuery);
