jQuery.fn.ajaxValidate = function() {
	var form = $(this);
	form.bind('ajaxValidate', function(){
		var inputs = $(this).find('input:not(.validated)[name*="data"], select:not(.validated)[name*="data"], textarea:not(.validated)[name*="data"]');
		if (inputs.size() == 0) {
			form.trigger('form.ajaxValidateComplete');
		}
		var validated = 0;
		inputs.trigger('blur').bind('ajaxValidateComplete', function(){
			validated++;
			if (validated == inputs.size()) {
				$(this).parents('form').trigger('form.ajaxValidateComplete');
				inputs.unbind('ajaxValidateComplete');
			}
		});
	}).find('input, select, textarea').blur(function(){
		if ($(this).hasClass('no-ajax-validate')) { return null; }
		var element = $(this);
		// remove any existing displayed error message
		element.removeClass('validated error').siblings('div.error-message').remove();
		$.post(window.location.href+'/ajax_validate:1/field:'+element.attr('name'), form.serialize(), function(data){
			if (!data.validates) {
				element.addClass('error').parent().append('<div class="error-message ui-state-error ui-corner-all">'+data.message+'</div>');
			}	
			// trigger event for the form
			element.trigger('ajaxValidateComplete').addClass('validated');		
		}, 'json');
		element.addClass('validated');
	});
	return this;
}
