var newsletterSignup = {

	selectors : {
		'form' : 'form.newsletterSignUp',
		'fakeSubmitButton' : 'a.fakeSubmit'
	},
	$j : {},
	errorClass : 'newsletterError',
	validation : {
		email : {
			regex : /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/,
			message : '<div class="newsletterError">Please enter a valid email address</div>',
			defaultValue : 'Your Email'
		}
	},
	thankYou : '<div class="newsletterThankyou">Thank you for subscribing</div>',
	settings : {
		'animationSpeed' : 200
	},
	ajaxInProgress : false,

	init : function() {
		for(i in this.selectors) {
			this.$j[i] = $j(this.selectors[i]);
		}
		this.$j.textInput = this.$j.form.find('input[type=text]');
		this.$j.textInput.filter('*[name=email]').val(this.validation.email.defaultValue);
		this.$j.textInput.each(function(){
			$j(this).data('originalVal',$j(this).val())
		});
		this.bind();
	},

	resetInput : function($input) {
		$input.val($input.data('originalVal'));
	},

	validate : function($form) {
		isValid = true;
		var obj = this;
		this.$j.textInput.each(function(){
			$current = $j(this);
			if(
				$current.val() == $current.data('originalVal') ||
				!obj.validation.email.regex.test($current.val())
			) {
				isValid = false;
				obj.displayError($current, 'email')
			}
		});
		return isValid;
	},

	displayError : function($input, type) {
		$message = $j(this.validation[type].message).hide();
		$input.addClass('error');
		$input.before($message);
		$message.slideDown(this.settings.animationSpeed);
	},

	disabledForm : function($form) {
		$form.addClass('disabled');
		$form.find('input,select,textarea').removeClass('error').attr('readonly','readonly');
	},

	submit : function($form) {
		$j('.' + this.errorClass).slideUp(this.settings.animationSpeed, function(){$j(this).remove()});
		if(!this.ajaxInProgress && this.validate($form)) {
			this.ajaxInProgress = true;
			this.disabledForm($form);
			var obj = this;
			$j.post(this.$j.form.attr('action'),this.$j.form.serialize(),function(){
				obj.ajaxInProgress = false;
				$form.fadeOut(obj.settings.animationSpeed,function(){
					var $thankYou = $j(obj.thankYou).hide();
					$j(this).replaceWith($thankYou);
					$thankYou.fadeIn(obj.settings.animationSpeed);
					$form.remove();
				})
			});
		}
	},

	bind : function() {
		var obj = this;
		this.$j.form.submit(function(){
			obj.submit($j(this));
			return false;
		});
		this.$j.fakeSubmitButton.click(function(){
			obj.$j.form.submit();
			return false;
		});
		this.$j.textInput.focus(function(){
			$current = $j(this);
			if($current.val() == $current.data('originalVal'))
				$current.val('')
		}).blur(function(){
			if($j(this).val() == '')
				obj.resetInput($current);
		});
	}

}

$j(document).ready(function(){
	newsletterSignup.init();
});

