/**
 * @author		Maarten Molenschot
 * @version		0.1 for Mootools 1.11
 * @modified	2010-03-09
**/

var messages = new Class({
	
	options: {
		messageBoxClass: 'mbox',
		messageClassError: 'error',
		messageClassInfo: 'info',
		messageClassOk: 'ok',
		useFx: true,
		useClose: true,
		onShowMessages: Class.empty,
		onClose: Class.empty,
		stayAtPrintPoint: true
	},
	
	initialize: function(container, options){
		this.setOptions(options);
		this.container = container;
		
		this.messagesError	= [];
		this.messagesInfo	= [];
		this.messagesOk		= [];
		
		if($('php_messages')){
			this.getPhpMessages();
			this.showMessages();
		}
	},
	
	buildBox: function(type){
		if(type=='error'){
			mclass = this.options.messageClassError;
			mbox = this.messagesError;
		}else if(type=='info'){
			mclass = this.options.messageClassInfo;
			mbox = this.messagesInfo;
		}else if(type=='ok'){
			mclass = this.options.messageClassOk;
			mbox = this.messagesOk;
		}
		
		if(mbox.length>0){
			var exists = false;
			var tmp = $E('div.mbox');
			if(tmp!=null){
				if(tmp.hasClass(type)){
					exists = true;
				}
			}
			
			var insertPoint = (this.options.stayAtPrintPoint && typeof(this.phpInsertPoint)!='undefined'?this.phpInsertPoint:this.container);
			var insertType = (this.options.stayAtPrintPoint && typeof(this.phpInsertPoint)!='undefined'?'inside':'before');
			
			if(!exists){
				this.box = new Element('div', {
					'class': this.options.messageBoxClass + ' ' + mclass,
					'id': 'messagebox' + type
				});
				if(insertType=='before'){
					this.box.injectBefore(insertPoint);
				}else if(insertType=='inside'){
					this.box.injectInside(insertPoint);
				}
			}
			if(this.options.useFx){
				var fx = new Fx.Slide(this.box);
				if(!exists){
					fx.hide();
				}else{
					fx.toggle();
				}
			}
			
			if(this.options.useClose){
				new Element('div', {
					'class': 'mboxsluiten',
					'events': {
						'click': function(){
							this.clearBox(type);
						}.bind(this)
					},
					'title': 'berichten sluiten'
				}).injectInside(this.box);
			}
			
			this.listUl = new Element('ul', {
				'styles': {
					'list-style': 'none',
					'margin': '0 0 0 0',
					'min-height': '34px',
					'padding': '0 0 0 0'
				}
			}).injectTop(this.box);
			
			this.listLi = new Element('li');
			for(var i=0; i<mbox.length; i++){
				this.listLi.clone().setHTML(mbox[i]).injectInside(this.listUl); 
			}
			
			if(this.options.useFx){
				fx.slideIn();
			}
			
			// style links in mbox
			$ES('a', this.box).each(function(as){
				if(as.getParent().getParent().getParent().hasClass(type)){
					as.setStyle('color', as.getParent().getParent().getParent().getStyle('border-top-color'));
				}
			});
		}
	},
	
	addMessage: function(msg, type){
		if(type=='error'){
			this.messagesError.include(msg);
		}else if(type=='info'){
			this.messagesInfo.include(msg);
		}else if(type=='ok'){
			this.messagesOk.include(msg);
		}
	},
	
	showMessages: function(type){
		if(typeof(type)=='undefined'){
			this.buildBox('error');
			this.buildBox('info');
			this.buildBox('ok');
		}else{
			this.buildBox(type);
		}
		this.fireEvent('onShowMessages');
	},
	
	clearBox: function(type){
		this.clearMessages(type);
		$$('div.mbox').each(function(el){
			if(typeof(type)=='undefined'){
				if(this.options.useFx){
					el = el.getParent('div');
				}
				el.remove();
			}else{
				if(el.hasClass(type)){
					if(this.options.useFx){
						el = el.getParent('div');
					}
					el.remove();
				}
			}
		}.bind(this));
		this.fireEvent('onClose');
	},
	
	clearMessages: function(type){
		if(type=='error' && this.messagesError.length>0){
			this.messagesError	= [];
			
			$$('div.mbox ul').each(function(el){
				if(el.getParent().hasClass(type)){
					el.remove();
				}
			}.bind(this));
		}else if(type=='info' && this.messagesInfo.length>0){
			this.messagesInfo	= [];
			
			$$('div.mbox ul').each(function(el){
				if(el.getParent().hasClass(type)){
					el.remove();
				}
			}.bind(this));
		}else if(type=='ok' && this.messagesOk.length>0){
			this.messagesOk		= [];
			
			$$('div.mbox ul').each(function(el){
				if(el.getParent().hasClass(type)){
					el.remove();
				}
			}.bind(this));
		}else{
			this.messagesError	= [];
			this.messagesInfo	= [];
			this.messagesOk		= [];
			
			$$('div.mbox ul').each(function(el){
				el.remove();
			}.bind(this));
		}
	},
	
	getPhpMessages: function(){
		if($('php_messages')){
			var pmc = new Element('div', {
				'id': 'phpMessagesContainer'
			}).injectBefore($('php_messages'));
			$('php_messages').injectInside(pmc);
			
			this.phpInsertPoint = $('php_messages').getParent('div');
			$$('div#php_messages span.php_error', 'div#php_messages span.php_info', 'div#php_messages span.php_ok').each(function(el){
				this.addMessage(el.innerHTML, el.getProperty('class').replace('php_', ''));
			}.bind(this));
			$('php_messages').remove();
		}
	}
	
});

messages.implement(new Options);
messages.implement(new Events);


window.addEvent('domready', function(){
	var msg = new messages();
});

