YAHOO.namespace('metk.newsletter.subscription');
YAHOO.namespace('metk.newsletter.subscription.formStates');

YAHOO.metk.newsletter.subscription.onFormTriggerClicked = new YAHOO.util.CustomEvent('onFormTriggerClicked');
YAHOO.metk.newsletter.subscription.onFormSubmit = new YAHOO.util.CustomEvent('onFormSubmit');

YAHOO.metk.newsletter.subscription.formStates.displayForm = (function() {
	function display(lightbox, jsonData) {
		lightbox.replaceContent(jsonData.formHtml, 'newsletterSubscriptionLightboxClose');

		var submitTrigger = document.getElementById('newsletterSubscriptionForm-submitTrigger');
		YAHOO.util.Event.addListener(submitTrigger, "click", submitForm);

		new metkFocusBlurInputs('focusBlur');
	}


	function removeDefaultFormValues() {
		var elements = document.getElementById('newsletterSubscriptionForm-form').getElementsByTagName('input');

		for(var key in elements) {
			var element = elements[key];

			if(element.value == element.defaultValue) {
				element.value = '';
			}
		}
	}

	function hideForm() {
		var region = YAHOO.util.Dom.getRegion('newsletterSubscriptionForm-form');
		var height = region.bottom - region.top;

		document.getElementById('newsletterSubscriptionForm-loading').style.height = height + 'px';

		document.getElementById('newsletterSubscriptionForm-form').style.display = 'none';
		document.getElementById('newsletterSubscriptionForm-loading').style.display = '';
	}

	function submitForm() {
		hideForm();
		removeDefaultFormValues();


		YAHOO.metk.newsletter.subscription.onFormSubmit.fire();
	}

	return {
		display: display
	};
});

YAHOO.metk.newsletter.subscription.formStates.formSubmitted = (function() {
	function reenterDefaultFormValues() {
		var elements = document.getElementById('newsletterSubscriptionForm-form').getElementsByTagName('input');

		for(var key in elements) {
			var element = elements[key];

			if(element.value == '') {
				element.value = element.defaultValue;
			}
		}
	}

	function showForm() {
		document.getElementById('newsletterSubscriptionForm-loading').style.display = 'none';
		document.getElementById('newsletterSubscriptionForm-form').style.display = '';
	}

	function display(lightbox, jsonData) {
		reenterDefaultFormValues();
		showForm();

		if(jsonData.success) {
			lightbox.replaceContent(jsonData.responseHtml, 'newsletterSubscriptionForm-backTrigger');
		}
		else {
			document.getElementById('newsletterSubscriptionForm-errors').style.display = '';
			document.getElementById('newsletterSubscriptionForm-errors').innerHTML = jsonData.errors.join('<br />');
		}
	}

	return {
		display: display
	};
});

YAHOO.metk.newsletter.subscription.form = (function() {
	var currentState = new YAHOO.metk.newsletter.subscription.formStates.displayForm();
	var lightbox = new metkLightbox('', 'newsletterSubscriptionLightbox', '');

	function display(jsonData) {
		currentState.display(lightbox, jsonData);
	}

	function changeState(newState) {
		currentState = newState;
	}

	function doesExist() {
		return lightbox.doesExist();
	}

	YAHOO.metk.newsletter.subscription.onFormSubmit.subscribe(function() {
		changeState(new YAHOO.metk.newsletter.subscription.formStates.formSubmitted());
	});

	return {
		doesExist: doesExist,
		display: display
	};
});

YAHOO.metk.newsletter.subscription.formController = (function() {
	var form = null;
	var subscribePid = YAHOO.metk.newsletter.subscription.subscribePid;
	var callback = {
		success: requestComplete
	};

	//
	function loadForm(type, args) {
		YAHOO.util.Connect.initHeader('X-AJAX_METHOD_CALL', 'loadNewsletterSubscriptionForm');
		YAHOO.util.Connect.asyncRequest('POST', 'index.php?id=' + subscribePid, callback);
	}

	function submitForm() {
		YAHOO.util.Connect.setForm('newsletterSubscriptionForm-form');
		YAHOO.util.Connect.initHeader('X-AJAX_METHOD_CALL', 'subscribeToNewsletter');
		YAHOO.util.Connect.asyncRequest('POST', 'index.php?id=' + subscribePid, callback);
	}

	//
	function requestComplete(response) {
		var jsonData = YAHOO.lang.JSON.parse(response.responseText);

		if(form == null || !form.doesExist()) form = new YAHOO.metk.newsletter.subscription.form();
		form.display(jsonData);
	}

	YAHOO.metk.newsletter.subscription.onFormTriggerClicked.subscribe(loadForm);
	YAHOO.metk.newsletter.subscription.onFormSubmit.subscribe(submitForm);

	return {
	};
})();

YAHOO.metk.newsletter.subscription.showForm = function() {
	YAHOO.metk.newsletter.subscription.onFormTriggerClicked.fire();
};
