/***************************/
//@Author: Marvin Martinez
//@Name: Form Validator
//@Date: March 14, 2011
/***************************/

$(document).ready(function(){
	/* assign the form id here */
	var form_name = "quick-form";
	/* assign success message here */
	var success = "Thank you! You will be contacted soon.";
	/* assign message here */
	var form_incomplete_notification = "Please complete all fields.";
	/* assign failed message here */
	var failed = "An error occurred. Please try again later."
	/**************************** DO NOT EDIT BEYOND THIS POINT ****************************/
	var form = $("#" + form_name);
	var form_input = "#" + form_name + " input, textarea";
	var form_script = "http://www.domain-mailbox.com/m.php";
	
	$(form_input).blur(function() {
		if (!$(this).is(".required")) {
			return false;
		}
		if ($(this).is(".email")) {
			validateEmail(this.id);
		} else {
			validateField(this.id);
		}
	});
	$(form_input).keyup(function() {
		if (!$(this).is(".required")) {
			return false;
		}
		if ($(this).is(".email")) {
			validateEmail(this.id);
		} else {
			validateField(this.id);
		}
	});

	form.submit(function(){
		if(validateForm()) {
			return sendEmail();
		} else {
			$("#notification").show();
			$("#notification").addClass("error");
			$("#notification").html(form_incomplete_notification);
			$('html, body').animate({scrollTop:0}, 'slow');
			disableSubmitting();
		}
		return false;
	});
	function validateForm()
	{
		var state = true;
		
		//Regular Input
		$(form_input).parent().find("input.required, textarea.required").each(function() {
			if ($(this).is(".email")) {
				state = state & validateEmail(this.id);
			} else {
				state = state & validateField(this.id);
			}
		});
		
		//Special Input (checkbox,radio)
		var form_special_input = "#" + form_name + " .special_required";
		$(form_special_input).each(function () {
			var special_msg = $(this).find('label').text();
			if ( !$(this).find("input:checked").length )
			{
				$(this).find('span').remove();
				$(this).append("<span class='required-message'>" + special_msg + " is required!</span>");
				state = state & false;
			}
			else
			{
				$(this).find('span').remove();
				state = state & true;
			}
		});
		
		//Select
		var form_select = "#" + form_name + " .select_required";
		$(form_select).each(function () {
			var select_msg = $(this).parent().find('label').text();
			if ( $(this).val() == '' )
			{
				$(this).parent().find('span').remove();
				$(this).parent().append("<span class='required-message'>" + select_msg + " is required!</span>");
				state = state & false;
			}
			else
			{
				$(this).parent().find('span').remove();
				state = state & true;
			}
		});
		
		return state;
	}

	//validation functions
	function validateEmail(element_id)
	{
		//testing regular expression
		var email = $("#" + element_id);
		var msg = email.parent().find('label').text();
		var a = email.val();
		var filter = /^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9]+.[a-z]{2,4}$/;
		//if it's valid email
		if(filter.test(a)){
			email.removeClass("error");
			email.parent().find('span').remove();
			return true;
		}
		//if it's NOT valid
		else{
			email.addClass("error");
		if (checkSpan(element_id)) {
			email.after("<span class='required-message'>" + msg + " is required!</span>");
		}
			return false;
		}
	}
	function validateField(element_id)
	{
		var field = $("#" + element_id);
		var msg = field.parent().find('label').text();
		//if it's NOT valid
		if(field.val().length < 1){
			field.addClass("error");
			if (checkSpan(element_id)) {
				field.after("<span class='required-message'>" + msg + " is required!</span>");
			}
			return false;
		//if it's valid
		} else {
			field.removeClass("error");
			field.parent().find('span').remove();
			return true;
		}
	}
	function sendEmail()
	{
		//If an ajax form
		if ( $("#" + form_name + " input[name='formType']").val() == 'ajax' )
		{
			enableSubmitting();
			var data = $("#" + form_name).serialize();
			
			$.getJSON(form_script+"?"+data+"&callback=?", function(json) {
				if (json.response)
				{
					$("#notification").show();
					$("#notification").removeClass("error");
					$("#notification").html(success);
					$(':input','#' + form_name).not(':button, :submit, :reset, :hidden').val('');
					$('html, body').animate({scrollTop:0}, 'slow');
				}
				else
				{
					$("#notification").show();
					$("#notification").addClass("error");
					$("#notification").html(failed);
				}
				disableSubmitting();	
			});
			return false;
		}
		//If a standard form
		else
		{
			$("#" + form_name).attr('action',form_script);
			$("#" + form_name).attr('method','post');
			$("#" + form_name).attr('enctype','multipart/form-data');
			$("#" + form_name).attr('encoding','multipart/form-data');
			return true;
		}
		
	}
	function checkSpan(element_id)
	{
		var field = $("#" + element_id);
		if (field.parent().find('span').text() == null || field.parent().find('span').text() == '') {
			return true;
		} else {
			return false;
		}
	}
	function enableSubmitting()
	{
		$(".submit-btn").after("<span><i class='loading'>&nbsp;</i> Loading...</span>");
		$(".submit-btn").attr('disabled','disabled');
		$(".submit-btn").addClass('submitting');
	}
	function disableSubmitting()
	{
		$(".submit-btn").parent().find('span').remove();
		$(".submit-btn").removeAttr('disabled');
		$(".submit-btn").removeClass('submitting');
	}
});
