if(typeof LoggerUtil == "undefined") { 
var LoggerUtil = new Object();
LoggerUtil.configArray = [];
LoggerUtil.appenderPool = {};
LoggerUtil.loggerPool = {};
LoggerUtil.levels = {debug:1, info:2, warn:3, error:4, fatal:5};
}

LoggerUtil.config = function (classType, level, appenderName) {
	LoggerUtil.configArray.push(new Config(classType, level, appenderName));
};

LoggerUtil.showAppenders = function () {
	var buffer = new StringBuffer();
	for (var i=0; i<LoggerUtil.configArray.length; i++) {
			var appender = LoggerUtil.configArray[i].getAppender();
			buffer.append("====================================================================\n");
			buffer.append("output of Appender [");
			buffer.append(appender.name);
			buffer.append("]\n");
			buffer.append(appender.toString());
	}
	return buffer.toString();
}

LoggerUtil.getConfig = function(classType) {
	var configs = [];
	for (var i=0; i<LoggerUtil.configArray.length; i++) {
		var config = LoggerUtil.configArray[i];
		if (classType.indexOf(config.classType) == 0) {
			configs.push(config);
		}
	}
	return configs;
}

LoggerUtil.getLogger = function(classType) {
	var logger = LoggerUtil.loggerPool[classType];
	if (!logger) {
		logger = new Logger(classType);
		LoggerUtil.loggerPool[classType] = logger;
	}
	return logger;
}

function Config (classType, level, appenderName) {
	var self = null;
	function Config () {
		self = this;
		self.classType = classType;
		self.level = level;
		self.appenderName = appenderName; 
	}
	with (Config) {
		prototype.getAppender = function() {
			var appender = LoggerUtil.appenderPool[appenderName];

			if (!appender) {
				appender = new Appender(appenderName);
				LoggerUtil.appenderPool[appenderName] = appender;
			}
			return appender;
		}
	}
	return new Config();
}

function Appender (appenderName) {
	var self = null;
	var loggerBuffer = new StringBuffer();
	function Appender() {
		self = this;
		self.name = appenderName;
	}

	function appendMsg(level, msg, ex) {
		level = level.toUpperCase();

		loggerBuffer.append("[");
		loggerBuffer.append(level);
		if (level.length < 5) {
			loggerBuffer.append(" ] [");
		}
		else {
			loggerBuffer.append("] [");
		}
			
		loggerBuffer.append(new Date().format("yyyy-MM-dd hh:mm:ss,S"));
		loggerBuffer.append("] - ");
		loggerBuffer.append(msg);
		loggerBuffer.append("\n");
		
		if (ex) {
			loggerBuffer.append(", Error:" + (ex.description || ", "));
			loggerBuffer.append(ex.toString());
			loggerBuffer.append("\n");
		}
	}

	with (Appender) {
		prototype.write = function(level, msg, ex) {
			appendMsg(level, msg, ex);
		}
		prototype.toString = function() {
			return loggerBuffer.toString();
		}
	}
	return new Appender();
}

function Logger (classType) {		
	var self = null;
	function Logger() {
		self = this;
		self.classType = classType;
	}
	
	function appendMsg(outputLevel, msg, ex) {

		var configs = LoggerUtil.getConfig(classType);
		outputLevel = outputLevel.toLowerCase();
		var outputLevelNo = LoggerUtil.levels[outputLevel];
				
		for (var i=0; i<configs.length; i++) {
			var config = configs[i];
			var configLevel = config.level.toLowerCase();
			var configLevelNo = LoggerUtil.levels[configLevel];
			var appender = config.getAppender();

			
			if (outputLevelNo >= configLevelNo) {
				appender.write(outputLevel, msg, ex);
			}
		}
	}
	
	with (Logger) {
		prototype.debug = function(msg, ex) {
			appendMsg("debug", msg, ex);
		}
		prototype.info = function(msg, ex) {
			appendMsg("info", msg, ex);
		}
		prototype.warn = function(msg, ex) {
			appendMsg("warn", msg, ex);
		}
		prototype.error = function(msg, ex) {
			appendMsg("error", msg, ex);
		}
		prototype.fatal = function(msg, ex) {
			appendMsg("fatal", msg, ex);
		}
	}
	return new Logger();		
}

document.onkeydown = function () {
	var event = window.event;
	if (event.ctrlKey && event.keyCode == 113) {
		var openWin = window.open();
		openWin.document.write("<PRE>\n");
		
		openWin.document.write(LoggerUtil.showAppenders());
		
		if (top.templateLog4jsMsg) {
			openWin.document.write("\n");
			openWin.document.write("\n");
			openWin.document.write(top.templateLog4jsMsg);
			openWin.document.write("\n");
			openWin.document.write("\n");
		}
		
		openWin.document.write("\n</PRE>");
	}
}

LoggerUtil.config("com.henry.table", "info", "tableAppender");

