TH = {
	// @private
	$ : {},

	// @private
	inputIds : ['name', 'contact', 'subject', 'message'],

	// @private
	validator : new Validator(),

	// @private
	requiredMessages : ['Your name is required.',
								'Your contact info is required.',
								'A subject is required for this message.',
								'Did you forget your message?'],

	// @private
	init : function() {
		var self = TH;
		for (var i in self.inputIds) {
			var id = self.inputIds[i];
			self.$[id + 'Msg'] = $('#' + id + '-message').click(self.hideMessage);
			self.$[id] = $('#' + id);
		}

		self.$.form = $('#contactform').bind('reset', self.discardMessage).
													submit(self.validateForm);
	},

	// @private
	hideMessage : function() {
		this.style.display = 'none';
	},

	// @private
	clearMessages : function() {
		var self = TH;
		for (var i in self.inputIds)
			self.hideMessage.call(self.$[self.inputIds[i] + 'Msg'][0]);
	},

	// @private
	discardMessage : function() {
		var self = TH;
		if (confirm('Do you really want to discard the message?')) {
			self.clearMessages();
			return true;
		}

		return false;
	},

	// @private
	validateForm : function() {
		var self = TH;
		self.clearMessages();
		var result = true;
		Assert.contains('\\S');

		for (var i in self.inputIds) {
			var id = self.inputIds[i];

			try {
				self.validator.push(self.$[id][0].value).
																	assert(Assert.Contains);
			} catch (e) {
				self.$[id + 'Msg'].html(self.requiredMessages[i]).show();
				result = false;
			}
		}

		return result;
	}
};

$(TH.init);
