(function($)
{
	
$.fn.ajaxForm = function(options)
{
	$(this).submit(function(e)
	{
		e.preventDefault();
		
		// Form validation.
		var invalidCount = 0;
		var currFields = $(':input', this);
		currFields.removeClass('invalid');
		
		// Required Fields.
		var requiredFields = currFields.filter('.required').filter(function()
		{
			return $(this).val().length == 0;
		});
		
		// Number Fields.
		var numberFields = currFields.filter('.number').filter(function()
		{
			var regexp = /^[+-]?\d+$/;
			return !regexp.test($(this).val());
		});
		
		// Email Fields.
		var emailFields = currFields.filter('.email').filter(function()
		{
			var regexp = /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,5}$/;
			return !regexp.test($(this).val());
		});
		
		// Merge results.
		var invalidFields = $.merge(requiredFields, numberFields, emailFields);
		invalidCount = invalidFields.length;
		if(invalidCount > 0)
		{
			invalidFields.addClass('invalid');
			alert('You have misentered one or more fields.');
			return false;
		}
		
		// Collect data.
		var postData = new Object();
		$(':input:not([type=radio])', this).filter(function(index)
		{
			postData[$(this).attr('name')] = $(this).val();
		});
		$(':input[type=radio]:checked', this).filter(function(index)
		{
			postData[$(this).attr('name')] = $(this).val();
		});
		
		// Send data.
		$.ajax(
		{
			url:      options.url || $(this).attr('action') || window.location.toString(), 
			type:     options.type || $(this).attr('method') || 'GET', 
			dataType: options.dataType || 'html', 
			data:     postData, // To be based on the form data.
			
			success:  options.success
		});
	});
	return this;
};
	
})(jQuery);
