/******************************************
 * The Message Class, for display session-stored message
 * on the front-end.
 ******************************************/

onepica.Message = Class.create({
	initialize: function (messageContainer) {
		this._container = $(messageContainer);
		this._errorClass = 'error-msg';
		this._successClass = 'success-msg';
	},

	/**
	 * Display an error message in the container.
	 */
	showErrorMessage: function (content) {
		this._setMessage(content, 'error');
		this._showMessage();
	},

	/**
	 * Display an success message in the container.
	 */
	showSuccessMessage: function (content) {
		this._setMessage(content, 'success');
		this._showMessage();
	},

	/**
	 * Shows a generic form validation failure message.
	 */
	showValidationFailMessage: function () {
		this.showErrorMessage('Please fill out all the required fields before proceeding.');
	},

	/**
	 * Set the message type; either 'error' or 'success'
	 */
	setType: function (type) {
		if (typeof type != 'undefined') {
			if (type.toString() == 'success') {
				this._type = 'success';
			}
			else {
				this._type = 'error';
			}
		}
		else {
			this._type = 'error';
		}
	},

	getType: function () {
		if (this._type) {
			return this._type;
		}
		return 'error';
	},

	isError: function () {
		return this.getType() == 'error';
	},

	/**
	 * Creates the markup necessary for message display.
	 */
	_showMessage: function () {
		var ul = this._container.down('ul.messages');
		if (!ul) {
			ul = $(document.createElement('ul'));
			ul.addClassName('messages');
			this._container.appendChild(ul);
		}
		var li = ul.down('li.' + this._getClass());
		if (li) {
			li.remove();
		}
		li = $(document.createElement('li'));
		li.addClassName(this._getClass());
		li.appendChild(document.createElement('ul'));
		ul.appendChild(li);

		var subUl = li.down('ul');
		var message = document.createElement('li');
		message.innerHTML = this.getMessage();
		subUl.appendChild(message);
		this._container.show();		
	},

	/**
	 * Returns the HTML class based on the message type.
	 */
	_getClass: function () {
		if (this.isError()) {
			return this._errorClass;
		}
		return this._successClass;
	},

	/**
	 * Assigns the message and type.
	 */
	_setMessage: function (message, type) {
		this._message = message;
		this.setType(type);
		this._used = false;
	},

	/**
	 * Shows a message that is already marked up.  
	 */
	showStyledMessage: function (message) {
		this._container.innerHTML = message;
	},

	getMessage: function () {
		if (!this._used) {
			this._used = true;
			return this._message;
		}
		return '';
	},

	hasMessage: function () {
		return !this._used;
	},

	hideMessage: function () {
		this._container.innerHTML = '';
	}
});

