(function($) {
	$.fn.Form = function(options) {
		// build main options before element iteration
		var settings = $.extend($.fn.Form.defaults, options);
		// iterate and reformat each matched element
		var $this = $(this);
		
		debug("Building jq Form object, id = "+this.id);
		
		$this.find("input, textarea, select, button").each(function(){
			$(this).attr('id',$this.attr('id')+"-"+$(this).attr('name'));
		});
		
		$this.find("input.entry-required").each(function(){
			validFieldLength(this, 1, settings.hideErrors);
		});
		
		$this.find("textarea.entry-required").each(function(){
			validFieldLength(this, 3, settings.hideErrors);
		});
		
		$this.find("select.entry-required").each(function(){
			validFieldLength(this, 1, settings.hideErrors);
		});
		
		var $submitButton = null;
		if(settings.submitButtonId == '')
			$submitButton = $this.find("input[type=submit]");
		else
			$submitButton = $("#"+settings.submitButtonId);
			
		$submitButton.click(function(){
			debug("Submit Button Clicked, id = "+this.id);
			$this.find("*.entry-required").change();
			if($this.find("span.error").size())
			{
				errorList = '';
				$this.find("span.error").each(function(){
					errorList += $(this).html()+"\n";
				});
				alert("Please correct or fill in the following required fields:\n"+errorList);
			}
			else
				document.getElementById($this.attr('id')).submit();
			return false;
		});
				
		return this;
	};

	//
	// plugin defaults
	//
	$.fn.Form.defaults = {
		submitButtonId: '',
		hideErrors: true
	};
	
	function validFieldLength(obj, breakCondition, hidden)
	{	
		//debug("Building - validFieldLength for id = "+obj.id+" with break on: "+breakCondition);
		$(obj).change(function(){ _validFieldLengthError(this,'length',breakCondition, hidden); });
		$(obj).blur(function(){ _validFieldLengthError(this,'length',breakCondition, hidden); });
	}
	
	// Add a validation check to an inputs label.  This visual messages for users
	function _validFieldLengthError(obj, type, breakCondition, hidden)
	{	
		//debug("Running - validFieldLength for id = "+obj.id+", type as: "+type+" with break on: "+breakCondition);
		$("#"+obj.id+"_error").remove();
		
		var errorSpan = '';
		if((obj.tagName == "INPUT" || obj.tagName == "TEXTAREA") && type == 'length' && $(obj).val().length < breakCondition)
			errorSpan = "<span id='"+obj.id+"_error' class='error' style='color: #ee2e24;'> - Enter a value with "+breakCondition+($(obj).attr('maxlength') > 0 ? "-"+$(obj).attr('maxlength') : "+")+" characters</span>";
		else if(obj.tagName == "SELECT" && type == 'length' && !$(obj).val().length)
			errorSpan = "<span id='"+obj.id+"_error' class='error' style='color: #ee2e24;'> - Select an option</span>";
		else if($(obj).hasClass('email') && !validEmail($(obj).val()))
			errorSpan = "<span id='"+obj.id+"_error' class='error' style='color: #ee2e24;'> - Enter a valid email</span>";
			
		if(hidden)
		{
			$(obj).after(errorSpan);
			$("#"+obj.id+"_error").html("- "+$(obj).attr('name').capitalize()).css('display','none');
		}
		else
		{
			$("label[for$="+obj.name+"]").append(errorSpan);
		}
	}
	
	function validEmail(str) {
		var showAlerts = false;
		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		
		if (str.indexOf(at)==-1){
		   if(showAlerts) alert("Please use a valid email address.");
		   return false;
		}
	
		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   if(showAlerts) alert("Please use a valid email address.");
		   return false;
		}
	
		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
			if(showAlerts) alert("Please use a valid email address.");
		   return false;
		}
	
		 if (str.indexOf(at,(lat+1))!=-1){
			if(showAlerts) alert("Please use a valid email address.");
		   return false;
		 }
	
		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
			if(showAlerts) alert("Please use a valid email address.");
		   return false;
		 }
	
		 if (str.indexOf(dot,(lat+2))==-1){
			if(showAlerts) alert("Please use a valid email address.");
		   return false;
		 }
		
		 if (str.indexOf(" ")!=-1){
			if(showAlerts) alert("Please use a valid email address.");
		   return false;
		 }
	
		 return true					
	}
	
	//+ Jonas Raoni Soares Silva
	//@ http://jsfromhell.com/string/capitalize [v1.0]
	String.prototype.capitalize = function(){ //v1.0
		return this.replace(/\w+/g, function(a){
			return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
		});
	};

})(jQuery);