var Message = {
	Version: '0.3',

	setOptions: function(options) {
		this.options = {
			level:   'info',
			timeout: 0,
			debug:   '',
			before:  null,
			after:   $('MessageArea') || $('content') || document.body
		}
		Object.extend(this.options, options || {});
	},

	message_area: function() {
		var ma = $('MessageArea');
		if (!ma) {
			ma = document.createElement('div');
			ma.setAttribute('id', 'MessageArea');
			document.body.appendChild(ma);
		}
		return ma;
	},

	addCloseButton: function (div) {
		// add "close" hook for the entire message area
		Event.observe(div, 'click', function (ev) {
			var el = Event.element(ev);
			if (el.tagName && el.tagName.toUpperCase() != 'A') {
				Element.hide(
					Element.hasClassName(el, 'message')
						? el
						: Element.findParent(el, 'div', 'message')
				);
			}
		});

		// and a "normal" "close" button
		var a = document.createElement('a');
		Element.addClassName(a, 'close');
		a.setAttribute('href', '#');
		a.setAttribute('title', 'hide this message');
		a.appendChild(document.createTextNode('×'));
		a.onclick = function (ev) {
			var el = Event.element(ev);
			Event.stop(ev);
			Element.hide(el.parentNode);
			return false;
		};
		div.appendChild(a);
	},

	add: function(message, options) {
		this.setOptions(options);

		var div = document.createElement('div');
		Element.addClassName(div, 'message');
		Element.addClassName(div, this.options.level);
		// div.appendChild(document.createTextNode(message));
		div.innerHTML = message;

		if (this.options.debug) {
			var h = document.createElement('h4');
			Element.addClassName(h, 'debug');
			h.appendChild(document.createTextNode('Debug:'));
			div.appendChild(h);
			var deb = document.createElement('div');
			Element.addClassName(deb, 'debug');
			deb.appendChild(document.createTextNode(this.options.debug));
			div.appendChild(deb);
		}

		this.addCloseButton(div);

		/* force insertion into MessageArea when transient? Not for this
		if (this.options.timeout > 0) {
			this.options.before = null;
			this.options.after  = this.message_area();
		} */

		if (this.options.before && $(this.options.before)) {
			var bef = $(this.options.before);
			bef.parentNode.insertBefore(div, bef);
		} else {
			var aft = $(this.options.after);
			aft.insertBefore(div, aft.firstChild);
		}

		if (this.options.timeout > 0) {
			setTimeout(
				function() {Element.remove(div);},
				this.options.timeout * 1000
			);
		}

		if (Effect && Effect.Pulsate) {
			new Effect.Pulsate(div, {duration: 1, from: 0.5});
		}

		return false;
	}
};

Event.observe(window, 'load', function () {
	var messages = document.getElementsByClassName('message');
	if (!messages) return false;
	messages.each(function(msg) {
		Message.addCloseButton(msg);
	});
});
