var FormErrorMessage = new Class({
	Implements: [Options, Events, Log],
	Extends: FormMessage,
	
	options: {
		allowClose: true,
		heading: null
	},
	
	// Variables

	/*
	 * Initialize
	 */
	initialize: function(form, container, options)
	{
		//this.enableLog();
		this.log("FormErrorMessage::initialize(" + form + ", " + container + ", " + options + ")");
		
		// Set options
		this.setOptions(options);
		
		this.parent(form, container, options);
	},
	
	/*
	 * Build
	 */
	build: function()
	{
		this.log("FormErrorMessage::build()");
		
		if(!this.element)
		{
			var element = new Element('div', {'class': 'form-message'});
			element.addClass('error');
			
			var closeButton = new Element('a', {
				'href': '#',
				'class': 'close-button',
				'events': {
					'click': function(event) 
					{
						event.preventDefault();
						this.hide();
					}.bind(this)
				}
			});
			
			var heading = new Element('h4', {'text': this.options.heading});
			var text = new Element('p', {'text': this.options.text});
			
			if(this.options.allowClose)
			{
				element.adopt(closeButton);
			}
			
			if(this.options.heading)
			{
				element.adopt(heading);
			}
			
			if(this.options.text)
			{
				element.adopt(text);
			}
			
			// Add element to DOM
			element.inject(this.container, 'top');	
			
			this.element = element;

			// Create animation
			this.element.fx = new Fx.Reveal(this.element, {
				duration: 500,
				link: 'cancel',
				transitionOpacity: false
			});
			this.element.fx.addEvent('show', function() {
				//this.log("element.fx show");
				this.isShown = true;
			}.bind(this));

			this.element.fx.addEvent('hide', function() {
				//this.log("element.fx hide");
				this.isShown = false;
			}.bind(this));

			this.element.fx.addEvent('start', function() {
				//this.log("element.fx start");
				this.isAnimating = true;
			}.bind(this));

			this.element.fx.addEvent('complete', function() {
				//this.log("element.fx complete");
				this.isAnimating = false;
			}.bind(this));

			this.element.hide();
		}
	},
	
	/*
	 * Clear
	 */
	clear: function()
	{
		this.log("FormErrorMessage::clear()");
		
		if(this.element.getElement('ul'))
		{
			this.element.getElement('ul').empty();
		}
	},
	
	/*
	 * Add message
	 */
	addMessage: function(name, position, message)
	{
		this.log("FormErrorMessage::addMessage(" + name + ", " + position + ", " + message + ")");
		
		var messages;
		if(this.element.getElement('ul'))
		{
			messages = this.element.getElement('ul');
		}
		else
		{
			messages = new Element('ul');
			this.element.adopt(messages);
		}
		
		message = new Element('li', {
			'class': name,
			'text': message
		});
		message.store('position', position);
		
		var elements = messages.getElements('li');
		if(elements.length > 0)
		{
			var lowestPosition = elements.length;
			var injectElement = null;
			
			elements.each(function(element) {
				var messagePosition = message.retrieve('position');
				var elementPosition = element.retrieve('position');
				
				if(messagePosition > elementPosition)
				{
					if(elementPosition < lowestPosition)
					{
						lowestPosition = messagePosition;
						injectElement = element;
					}
				}
			}, this);

			if(injectElement)
			{
				message.inject(injectElement, 'after');
			}
			else
			{
				injectElement = messages.getElement('li:first-child');
				message.inject(injectElement, 'before');
			}
		}
		else
		{
			messages.adopt(message);
		}
		
		// Check if messages is shown
		if(this.isShown)
		{
			var height = message.getStyle('height');
			
			message.setStyle('height', 0);
			message.setStyle('opacity', 0);
				
			var fadeFx = new Fx.Tween(message, {
				duration: 500, 
				transition: 'linear'
			});
			
			var slideFx = new Fx.Tween(message, {
					duration: 250, 
					transition: 'linear',
					onComplete: function()
					{
						fadeFx.start('opacity', 1);
					}.bind(this)
				});
			
			// Start animation
			slideFx.start('height', height);
		}
	},
	
	/*
	 * Remove message
	 */
	removeMessage: function(name)
	{
		this.log("FormErrorMessage::removeMessage(" + name + ")");
		
		if(this.element.getElement('ul'))
		{
			var messages = this.element.getElement('ul');
			
			var message = messages.getElement('.' + name);
			
			// Check if messages is shown
			if(this.isShown)
			{
				//message.setStyle('opacity', 1);
			
				var fadeFx = new Fx.Tween(message, {
					duration: 250, 
					transition: 'linear',
					onComplete: function()
					{
						slideFx.start('height', 0);
					}.bind(this)
				});
	
				var slideFx = new Fx.Tween(message, {
					duration: 250, 
					transition: 'linear',
					onComplete: function()
					{
						message.dispose();
					}.bind(this)
				});
				
				// Start animation
				fadeFx.start('opacity', 0);
			}
			else
			{
				message.dispose();
			}
		}
	},

	/*
	 * Check if message exists
	 */
	hasMessage: function(name)
	{
		this.log("FormErrorMessage::hasMessage(" + name + ")");

		var hasMessage = false;

		if(this.element.getElement('ul'))
		{
			var messages = this.element.getElement('ul');
			var message = messages.getElement('.' + name);

			if(message) hasMessage = true;
		}

		return hasMessage;
	}
	
});
