jQuery.fn.extend({
	
	//Call this by an element selector $('#elementID').mfValidate('error message', regex, boolean - allow mulitple);
	mfValidate	:	function(){
						
						//Global rules and message for clones
						//if(typeof(Validate) == 'undefined'){
						//	Validate = new Array();
						//}
						//if(!Validate[group+'regex']){
						//	Validate[group+'regex'] = regex;
						//	Validate[group+'message'] = message;
						//}

						//Add our valid/invalid message spans
						var myClass = $(this).attr('valid') == 'valid' ? "message valid" : "message";
						$(this).parents('li').find('span.message').remove();
						$(this).after("<span class='"+myClass+"'></span>");
						
						//A little extra padding for a highlight effect.
						$(this).parents('li').find('.element').css('padding','2px');
												
						//Set our variables after we add our span and buttons, so we can target them
						var el = {};
						el.me = this;
						el.li = $(this).parents('li');
						el.ol = $(this).parents('ol');
						el.label = $(this).parents('li').find('.ac_input');
						el.regex = $(this).attr('regex');
						el.regex = el.regex ? new RegExp(el.regex) : '';
						el.group = $(this).attr('group'); 
						el.message = $(this).attr('message'); 
						
						//Add our events for the element
						this.events(el, el.regex, el.message);
						
						//Return the element, so we can continue chaining it $(element).mfValidate().fadeOut();
						return this;
					},
	
	addSpan		:	function(valid){
						var myClass = valid == 'valid' ? "message valid" : "message";
						$(this).parents('li').find('div').prepend("<span class='"+myClass+"'></span>");
					},
					
	validateMe	:	function(regex, message){
						if(checkInvalid($(this).attr('valid'))){
							//The element validates
							if(validateElement(this, regex)){
								$(this).attr('valid','valid');
								$(this).parents('li').find('.message').removeClass('invalid').addClass('valid').text('');
								
								if($(this).parents('ol').find("li input[valid='invalid']").size() < 1){
									$('.submitButton').removeAttr('disabled').parents('li').find('.message').remove();
									//$('form').submit(function(){return true;});
									$(this).parents('fieldset').find('.addButton').removeClass('disabled');
								}
							}
							
							//The element doesn't validate
							else{
								$(this).attr('valid','invalid');
								if($(this).parents('li').find('.message').hasClass('valid')){
									$(this).parents('li').find('.message').removeClass('valid').addClass('invalid').text(message);
								}
								else{
									$(this).parents('li').find('.message').removeClass('valid');
								}
								
								//$('form').submit(function(){ return false; });
								$('.submitButton').parents('li').find('.message').remove();
								$('.submitButton').attr('disabled','disabled').parents('li').append("<span class='message invalid'>Can't save until you correct the problems</span>");
								$(this).parents('fieldset').find('.addButton').addClass('disabled');
							}
						}
					},
	
	events		:	function(el, regex, message){
												
						//Form submit
						$('form').submit(function(){
							if($("*[valid='invalid']", this).size() > 0){
								return false;
							}
							else{
								return true;
							}
						});
						
						//Focus
						$('*', el.li).focus(function(){
							if(checkInvalid($(this).parents('fieldset'))){
								$(this).parents('fieldset').find('.addButton').addClass('disabled');
							}
						});
						
						//Blur
						$('input', el.li).each(function(){
							$(this).blur(function(){
								$(this).parents('li').find('.message').addClass('valid');
								$(this).parents('li').find('input[valid]').each(function(){
									$(this).validateMe(regex, message);
								});
							});
						});
						
						//Keyup
						$(el.me).keyup(function(){
							$(this).validateMe(regex, message);
						});
					}
});

function checkInvalid(el){
	if($(el).find("*[valid='invalid']").size() > 0){
		return false;
	}
	else{
		return true;
	}
}

function validateElement(el, regex){
	if(regex){
		if($(el).val().match(regex)){
			return true;
		}
		else{
			return false;
		}
	}
	else{
		return true;
	}
}
