var Razsor = Razsor || {};
Razsor.Utils = Razsor.Utils || {};
Razsor.SendEmail = Razsor.SendEmail || {};

Razsor.Browser = {

	getElement : function(elementSelector) {
		return $(elementSelector);
	},
	getValue : function(elementSelector) {
		return $(elementSelector).val();
	},
	setValue : function(elementSelector, value) {
		return $(elementSelector).val(value);
	},
	hideElement : function(elementSelector) {
		$(elementSelector).hide();
	},
	showElement : function(elementSelector) {
		$(elementSelector).show();
	},
	addSubmitHandler : function(selector, submitHandler) {
		$(selector).submit(function(event) {
			submitHandler(event);
		});
	}
};

Razsor.Colorbox = Razsor.Colorbox || {};

Razsor.Colorbox = {
	close : function(colorBoxElement) {
		$(colorBoxElement).colorbox.close();
	},
	resize : function(colorBoxElement) {
		$(colorBoxElement).colorbox.resize();
	}
};

Razsor.Form = {};
Razsor.Form.Model = function(shouldOutputTrackingTag) {
	var external = {};
	external = {
		formSubmitted : function(action, data) {
			Razsor.Network.post({
				url : action,
				data : data + '&javascript=true',
				successHandler : function(data, textStatus, request) {
					external.successHandler(data, textStatus, request);
				},
				failHandler : function(response, textStatus, error) {
					external.onEmailSentError(response, textStatus, error);
				}
			}

			);
		},

		successHandler : function(data, textStatus, request) {
			try {
				if (request.statusText === 'OK') {
					external.onEmailSentSuccess();
				}
			} catch (e) {
				external.onEmailSentError();
			}
		},

		shouldOutputTrackingTag : function() {
			return shouldOutputTrackingTag;
		},

		onEmailSentSuccess : function() {/* abstract */
		},
		onEmailSentError : function() {/* abstract */
		}
	};

	return external;
};

Razsor.SendEmail.View = function(form) {
	var formSelector = form;
	var okButton = $(form).find("input[name='mainok']");
	var okInlineButton = $(form).find("input[name='inlineok']");
	var cancelButton = $(form).find("input[value='Cancel']");
	var backButton = $(form).find("input[value='Back']");
	var fromInput = $(form).find("input[name='from']");
	var subjectInput = $(form).find("input[name='subject']");
	var messageBodyInput = $(form).find("textArea");
	var internal = {};
	internal = {
		bindEventsToButtons : function() {
			Razsor.Browser.addSubmitHandler(formSelector, function(event) {
				event.preventDefault();
				external.onFormSubmitted(internal.getAction(), internal
						.getData());
			});
			okButton.click(function() {
				external.onWindowClosed();
			});
			okInlineButton.click(function() {
				external.onInlineReset();
			});
			cancelButton.click(function() {
				external.onWindowClosed();
			});
			backButton.click(function() {
				external.onReturnToForm();
			});
		},
		showSpecificError : function(errorType) {
			var browser = Razsor.Browser;
			browser.hideElement(".email-sorry div[id^='error']");
			switch (errorType) {
			case "invalid content":
				browser.showElement(".email-sorry #error-invalid-content");
				break;
			default:
				browser.showElement(".email-sorry #error-technical-problem");
			}
		},

		getAction : function() {
			return internal.getForm().attr("action");
		},

		getData : function() {
			return internal.getForm().serialize();
		},

		getForm : function() {
			return Razsor.Browser.getElement(formSelector);
		}
	};

	var external = {
		onFormSubmitted : function() {/* abstract */
		},
		onWindowClosed : function() {/* abstract */
		},
		onInlineReset : function() {/* abstract */
		},
		onReturnToForm : function() {/* abstract */
		},

		initialise : function() {
			Razsor.Browser.showElement("fieldset.email-form");
			Razsor.Browser.hideElement(".email-sorry");
			Razsor.Browser.hideElement(".email-thankyou");
			$('#cboxClose').css('display', 'none');
			razsor.commonfunctions.CommonFunctions.setClassToColorbox('email-popup');
			fromInput.val('');
			subjectInput.val('');
			messageBodyInput.val('');
		},

		displayMailForm : function() {
			Razsor.Browser.showElement("fieldset.email-form");
			Razsor.Browser.hideElement(".email-sorry");
			Razsor.Browser.hideElement(".email-thankyou");
			Razsor.Colorbox.resize("a.email");
		},
		displaySuccessMessage : function() {
			Razsor.Browser.hideElement("fieldset.email-form");
			Razsor.Browser.hideElement(".email-sorry");
			Razsor.Browser.showElement(".email-thankyou");
			Razsor.Colorbox.resize("a.email");
		},
		displayErrorMessage : function(errorType) {
			Razsor.Browser.hideElement("fieldset.email-form");
			internal.showSpecificError(errorType);
			Razsor.Browser.showElement(".email-sorry");
			Razsor.Colorbox.resize("a.email");
		},
		closeWindow : function() {
			Razsor.Browser.hideElement("fieldset.email-form");
			Razsor.Browser.hideElement(".email-sorry");
			Razsor.Browser.hideElement(".email-thankyou");
			Razsor.Colorbox.close("a.email");
		},
		resetInline : function() {
			Razsor.Browser.hideElement("fieldset.email-form");
			Razsor.Browser.hideElement(".email-sorry");
			Razsor.Browser.hideElement(".email-thankyou");
		}
	};

	internal.bindEventsToButtons();
	return external;
};

Razsor.SendEmail.Controller = function(sendEmailView, sendEmailModel) {
	sendEmailView.onFormSubmitted = function(action, data) {
		sendEmailModel.formSubmitted(action, data);
	};

	sendEmailView.onWindowClosed = function() {
		sendEmailView.closeWindow();
	};

	sendEmailView.onInlineReset = function() {
		sendEmailView.resetInline();
	};

	sendEmailView.onReturnToForm = function() {
		sendEmailView.displayMailForm();
	};

	sendEmailModel.onEmailSentSuccess = function() {
		sendEmailView.displaySuccessMessage();
		if (sendEmailModel.shouldOutputTrackingTag()) {
			Razsor.WebTracker.Utils.recordSendEmailVisit();
		}
	};

	sendEmailModel.onEmailSentError = function(result, textStatus, error) {
		sendEmailView.displayErrorMessage(result.responseText);
	};
};

Razsor.SendEmail.Init = function(formSelector, shouldOutputTrackingTag) {
	var razsorSendEmailView = Razsor.SendEmail.View(formSelector);
	var razsorSendEmailModel = Razsor.Form.Model(shouldOutputTrackingTag);
	Razsor.SendEmail.Controller(razsorSendEmailView, razsorSendEmailModel);

	return razsorSendEmailView;
};

