// No built-in trim() in javascript.  Lame!
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

// String validation "constants". To be used with the validation method below.
String.prototype.VALIDATION_EMAIL = "email";
String.prototype.EMPTY = "empty";

// Attaches a custom valid() method to all strings.
String.prototype.valid = function(type) {
	switch (type) {
		case String.prototype.VALIDATION_EMAIL:
			if (!this.match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/)) {
				return false;
			}
			break;
		
		case String.prototype.EMPTY:
			return (this.length == 0);
			break;
	}
	
	return true;
}

$(document).ready(function() {
	var url = "contact-action.cfm";

	var timeout = (30 * 1000);
	
	var isValid = function(input) {
		if ($(input).hasClass("validate-required") 
			&& $(input).val().valid(String.prototype.EMPTY)) {
			return false;
		} else if ($(input).hasClass("validate-email")
			&& !$(input).val().valid(String.prototype.VALIDATION_EMAIL)) {
			return false;
		} else {
			return true;
		}
	};

	var showError = function(input) {
		// Stop any active animations
		$(input).parent().find("div.error-label-overlay").stop(true);
		$(input).parent().find("div.error-label-overlay").remove();

		$(input).parent().addClass("error");

		// Setup error overlay
		var errorLabel = $(input).parent().find("label.error");
		var overlay = $("<div class=\"error-label-overlay\"></div>");
		errorLabel.before(overlay);
		overlay.click(function() {
			$(this).css("display","none");
			$(this).parent().find(":text").focus();
			return true;
		});

		// Show error
		overlay.css("display","block");
		errorLabel.css("display","block");

		// Flash error label
		overlay.fadeOut(800,function() {
			setTimeout(function() {
				overlay.fadeIn(1500,function() {
					errorLabel.parent().find("label").css("display","none");
					overlay.remove();					
				});
			},500);
		});
	};

	// Initialize inputs
	$("form#ContactMe").find(":text").focus(function() {
		$(this).parent().find("div.error-label-overlay").stop(true);

		// Reset to default class
		$(this).parent().removeClass("error");

		// Hide any error labels
		$(this).parent().find("div.error-label-overlay").remove();
		$(this).parent().find("label.error").css("display","none");
		$(this).parent().find("label").css("display","none");

		return true;
	});

	$("form#ContactMe").find(":text").blur(function() {
		if (isValid($(this))) {
			$(this).parent().find("div.error-label-overlay").stop(true);

			// Reset to default class
			$(this).parent().removeClass("error");

			// Hide any error labels
			$(this).parent().find("div.error-label-overlay").remove();
			$(this).parent().find("label.error").css("display","none");
			$(this).parent().find("label").css("display","none");
		} else {
			showError($(this));
		}

		return true;
	});
	
	$("form#ContactMe").find(":text").each(function() {
		if (!$(this).val().valid(String.prototype.EMPTY)) {
			$(this).parent().find("label").css("display","none");
		}
	});

	// Send the email
	$("a#send-email").click(function() {
		$("form#ContactMe").find("div.error-label-overlay").each(function() {
			$(this).stop(true);
			$(this).css("display","none");
			$(this).parent().find("label").css("display","none");
		});

		// Collect form data
		var data = {
			name:		$("form#ContactMe").find("input#Name").val(),
			email:		$("form#ContactMe").find("input#Email").val(),
			message:	$("form#ContactMe").find("textarea#Message").val()
		};

		var errors = 0;

		// Validate data
		if (!data.name || data.name.length == 0) {
			showError($("form#ContactMe").find("input#Name"));
			errors++;
		}
		
		if (!data.email || !data.email.valid(String.prototype.VALIDATION_EMAIL)) {
			showError($("form#ContactMe").find("input#Email"));
			errors++;
		}

		if (errors == 0) {
			$(this).parent().css("display","none");
			$(this).parent().parent().find("div#sending").css("display","block");
		
			$.ajax({
				cache:		false,
				data:		data,
				dataType:	"text",
				error: function(XMLHttpRequest, textStatus, errorThrow) {
					// Unexpected error
					$("form#ContactMe").css("display","block");
					$("form#ContactMe").find("div#sending").css("display","none");

					alert("Your message could not be sent.\n\nPlease try again later.");
				},

				success: function(data, textStatus) {
					if (data == "ok") {
						$("form#ContactMe").find("div#sending").css("display","none");
						$("form#ContactMe").find("div#sent").css("display","block");
					} else {
						if (data.indexOf("spam") > -1)
							alert("The message looks like spam.");

						if (data.indexOf("name") > -1)
							showError($("form#ContactMe").find("input#Name"));

						if (data.indexOf("email") > -1)
							showError($("form#ContactMe").find("input#Email"));

						$("form#ContactMe").find("div#sending").css("display","none");
						$("form#ContactMe").find("fieldset").css("display","");
					}
				},
				
				timeout:	timeout,
				type:		"POST",
				url:		url
			});
		}

		return false;
	});
});