/**
 * The WAWLogger class helps developpers to keep an eye at the events raised from the kernel
 */

// The WAWLogger is a facade to the real factored logger
var WAWLogger = function(){};

// By setting this value, you choose the real logger to use.
// null provides an empty logger...
WAWLogger.logger = null;

// Facade methods to log anything
WAWLogger.debug = function(who, evt) {
	WAWLogger.log("debug", who, evt);
};
WAWLogger.info = function(who, evt) {
	WAWLogger.log("info", who, evt);
};
WAWLogger.warning = function(who, evt) {
	WAWLogger.log("warning", who, evt);
};
WAWLogger.trace = function(who, evt) {
	WAWLogger.log("trace", who, evt);
};
WAWLogger.fatal = function(who, evt) {
	WAWLogger.log("fatal", who, evt);
};
// The main facade methods... Delegates to the real logger
WAWLogger.log = function(level, who, evt) {
	if (WAWLogger.logger && WAWLogger.log) {
		WAWLogger.logger.log(level, who, evt);
	}
};
 
/** 
 * The WAWEmptyLogger class doesn't make anything... 
 * But it may be used as base for all other logger classes
 */
var WAWEmptyLogger = Class.create({
	debug: function(who, evt) {},
	info: function(who, evt) {},
	warning: function(who, evt) {},
	fatal: function(who, evt) {},
	trace: function(who, evt) {},
	
	log: function(level, who, evt) {
		switch (level) {
			case "debug":
				this.debug(who, evt); break;
			case "info":
				this.info(who, evt); break;
			case "warning":
				this.warning(who, evt); break;
			case "fatal":
				this.fatal(who, evt); break;
			case "trace":
			default:
				this.trace(who, evt); break;
		}
	}
}); 
 
/**
 * The WAWDevLogger uses the table provided by the waw.webdev
 * contrib to log the client-side events
 */
var WAWDevLogger = Class.create();

// The effect used to prevent the developper that an event is raised
WAWDevLogger.effect = null;
WAWDevLogger.colors = $H({
	info: '#90EE90',
	debug: '#FFFF00',
	trace: '#FFFFFF',
	fatal: '#DE4242',
	warning: '#FFA500' 
});
// The methods
Object.extend(Object.extend(WAWDevLogger.prototype, WAWEmptyLogger.prototype),{
	log: function(level, who, evt) {
		if ($('waw_webdev_logger')){
			this.insert(level, who, evt);
			if (WAWDevLogger.effect != null) {
				WAWDevLogger.effect.cancel();
			}
			WAWDevLogger.effect = new Effect.Highlight('DeveloperBar', {
				startcolor: WAWDevLogger.colors.get(level),
				restorecolor: '#F6F6F6'
			});
		}
	},
	
	insert : function(level, who, evt) {
		table = $('waw_webdev_logger').getElementsByTagName("table")[0].getElementsByTagName("tbody")[0];
		newrow = table.insertRow(0);
		newrow.className = level;
		
		_time = newrow.insertCell(0);
		_time.className = "time";
		today = new Date();
		_time.innerHTML = today.getHours()+":"+today.getMinutes()+":"+today.getSeconds();
		
		_ms = newrow.insertCell(1);
		_diff = newrow.insertCell(2);
		
		_level = newrow.insertCell(3);
		_level.className = "level";
		_level.innerHTML = level;
		
		_who = newrow.insertCell(4);
		_who.className = "who";
		_who.innerHTML = who;

		_msg = newrow.insertCell(5);
		_msg.className = "message";
		_msg.innerHTML = evt;
	}
});

WAWLogger.logger = new WAWDevLogger();