var emailErrorTimeout, phoneErrorTimeout;

$(function() {
	// focus on first field
	$('#name').focus();
	$('form').submit(function() {
		var errors = false;
		var firstError = null;
		var fields = [ 'name', 'email', 'phone_number', 'message' ];
		
		trimFormValues();
		
		for (var i = 0; i < fields.length; i++) {
			if (!checkField(fields[i])) {
				errors = true;
				firstError = (!firstError) ? fields[i] : firstError;
			}
		}
		
		if (errors && firstError) {
			$('#' + firstError).focus();
			return false;
		}
	});
	
	$('#name').blur(function() {
		checkField('name');
	});
	
	$('#email').blur(function() {
		checkField('email');
	});
	
	$('#phone_number').blur(function() {
		$(this).val(formatPhoneNumber($(this).val()));
		checkField('phone_number');
	});
	
	$('#message').blur(function() {
		checkField('message');
	});
	
	$('#email').keyup(function() {
		if ($('#email').hasClass('error')) {
			checkField('email');
		}
	})
	
	$('#phone_number').keyup(function() {
		if ($('#phone_number').hasClass('error')) {
			$(this).val(formatPhoneNumber($(this).val()));
			checkField('phone_number');
		}
	})
	
	$('#message').keyup(function() {
		if ($('#message').hasClass('error')) {
			checkField('message');
		}
	})
});

function trim(str) {
	return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

function trimFormValues() {
	$('#name').val(trim($('#name').val()));
	$('#email').val(trim($('#email').val()));
	$('#phone_number').val(trim($('#phone_number').val()));
	$('#company').val(trim($('#company').val()));
	$('#message').val(trim($('#message').val()));
}

function isEmpty(val) {
	return (val == '') ? true : false;
}

function isInvalidEmail(val) {
	return (!val.match(/^[a-z0-9_\-\.\+']+@(?:[a-z0-9\-]+){1,3}\.[a-z]{2,6}$/i)) ? true : false;
}

function isInvalidPhone(val) {
	return ((val.substr(0, 1) == 1 && val.replace('/^\d/g', '').length < 11) || (val.substr(0, 1) != 1 && val.replace('/^\d/g', '').length < 10));
}

function checkField(field) {
	var ok = true;
	
	switch (field) {
		case 'name':
			if (isEmpty($('#name').val())) {
				$('#name').addClass('error');
				ok = false;
			} else {
				$('#name').removeClass('error');
			}
			break;
		
		case 'email':
			if (isEmpty($('#email').val()) || isInvalidEmail($('#email').val())) {
				$('#email').addClass('error');
			
				if (!isEmpty($('#email').val())) {
					clearTimeout(emailErrorTimeout);
					$('#email_error').removeClass('ok').html('Hmm&hellip; are you <em>sure</em> that&rsquo;s an email address?').slideDown('normal');
				}
			
				ok = false;
			} else {
				$('#email').removeClass('error');
				if ($('#email_error').css('display' != 'none')) {
					$('#email_error').addClass('ok').html('Ooo, much better. Thank you. :)');
					emailErrorTimeout = setTimeout(function() {
						$('#email_error').slideUp('fast');
					}, 2000);
				}
			}
			break;
		
		case 'phone_number':
			if (isEmpty($('#phone_number').val()) || isInvalidPhone($('#phone_number').val())) {
				$('#phone_number').addClass('error');
		
				if (!isEmpty($('#phone_number').val())) {
					clearTimeout(phoneErrorTimeout);
					$('#phone_error').removeClass('ok').html('Hmm&hellip; is that your <em>full</em> phone number?').slideDown('normal');
				}
		
				ok = false;
			} else {
				$('#phone_number').removeClass('error');
				if ($('#phone_error').css('display' != 'none')) {
					$('#phone_error').addClass('ok').html('Nice, we can dig that.');
					phoneErrorTimeout = setTimeout(function() {
						$('#phone_error').slideUp('fast');
					}, 2000);
				}
			}
			break;
			
		case 'message':
			if (isEmpty($('#message').val())) {
				$('#message').addClass('error');
				ok = false;
			} else {
				$('#message').removeClass('error');
			}
			break;
	}
	
	return ok;
}