﻿TRAILS.utils.MessageManager = function($messageElement, configuration){
	var isTransparent = false;
	var settings = jQuery.extend(new Object(), this._defaults, configuration);
	
	this._timeoutId = null;
	this._currentMessage = $messageElement.text();
	this._currentMessageImportance = 0;
	this._$messageElement = $messageElement;
	this.settings = settings;
	
	this._fadeMessageElement = function(){
		isTransparent = true;
		
		$messageElement.fadeTo(settings.animationDuration, 0.33);
	};
	this.isTransparent = function(){
		return isTransparent;
	};

	if(configuration && (typeof configuration.defaultClassName !== String.type || configuration.defaultClassName.length == 0))
		this.settings.defaultClassName = $messageElement[0].className;
};
TRAILS.utils.MessageManager.prototype._defaults = {
	classNames: ['note', 'important', 'success', 'critical'],
	animationDuration: 200,
	defaultClassName: String.empty,
	timeToLive: null
};
TRAILS.utils.MessageManager.prototype.getMessage = function(){
	return this._currentMessage;
};
TRAILS.utils.MessageManager.prototype.setMessage = function(message, importance){
	clearTimeout(this._timeoutId);
	
	if(this.settings.timeToLive !== null)
		this._timeoutId = setTimeout(this._fadeMessageElement, this.settings.timeToLive);
	if(isNaN(importance))
		importance = 0;
	if(importance < this._currentMessageImportance)
		return message;
	
	this._currentMessage = message;
	this._currentMessageImportance = importance;
	this._$messageElement[0].className = this.settings.defaultClassName;

	this._$messageElement.html(message).addClass(this.getClassName(this._currentMessageImportance));
	
	if(this.isTransparent())
		this._$messageElement.fadeTo(this.settings.animationDuration, 1);

	return message;
};
TRAILS.utils.MessageManager.prototype.getClassName = function(value){
	return this.settings.classNames[value] || typeof value === String.type ? value : String.empty;
};
TRAILS.utils.MessageManager.prototype.dispose = function(){
	clearTimeout(this._timeoutId);
	
	for(var property in this)
		delete this[property];
};