try {
	
	/**
	 * Debugging Assistant
	 */
	var LOG_FATAL 		= 1;
	var LOG_FATAL  		= 1;
	var LOG_ERROR  		= 2;
	var LOG_WARN   		= 3;
	var LOG_INFO  		= 4;
	var LOG_TRACE1 		= 5;
	var LOG_OBJECT		= 5;
	var LOG_TRACE2 		= 6;
	var LOG_METHOD		= 6;
	var LOG_TRACE3 		= 7;
	var LOG_MAJOR		= 7;
	var LOG_TRACE4 		= 8;
	var LOG_MINOR		= 8;
	var LOG_TRACE5 		= 9;
	var LOG_ALL			= 9;
	
	var disableLogging = true;
	
	function Log(alvl) {
		try {
	
			var logger = log4javascript.getLogger("main");
			var appender = new log4javascript.PopUpAppender();
			appender.setThreshold(log4javascript.Level.ALL);
			logger.addAppender(appender);
		
			if( ! disableLogging) { logger.info('Initialize Log :: Level=' + appender.getThreshold()); }
		
			this.alertLevel = (alvl == null) ? LOG_INFO : alvl;
			this.funcStack = new Array();
			this.hiddenFunctions = new Array('parseENFloat', 'getIconNumber', 'mapAddOverlayFunction');
	
	    } catch (e) {
	    	alert('Unexpected error in (): ' + e);
	    }
	
		/**
		 * alerts information depending on parameters
		 */
		this.doLog = function(lvl, msg) {
			try {
		
				var curFunction = this.funcStack[this.funcStack.length-1];
				
				if(lvl <= this.alertLevel && ! this.contains(this.hiddenFunctions, curFunction)) {
					
					var str = '';
		
					for(var i=0; i<this.funcStack.length-1; i++) {
						str += '  ';
					}
		
					str += curFunction;
					str += ' ';
					str += msg;
		
					if( ! disableLogging ) {
					switch(lvl) {
						case LOG_FATAL: 	logger.fatal(str); break;
						case LOG_ERROR: 	logger.fatal(str); break;
						case LOG_WARN: 		logger.fatal(str); break;
						case LOG_INFO: 		logger.fatal(str); break;
						case LOG_TRACE1:
						case LOG_OBJECT:	logger.error('Object - ' + str); break;
						case LOG_TRACE2:
						case LOG_METHOD:	logger.warn('Method - ' + str); break;
						case LOG_TRACE3:
						case LOG_MAJOR:		logger.warn(' Major - ' + str); break;
						case LOG_TRACE4:
						case LOG_MINOR:		logger.info(' Minor - ' + str); break;
						case LOG_TRACE5:
						case LOG_ALL:		logger.info('   All - ' + str); break;
					}
					}
				}
		
		    } catch (e) {
		    	alert('Unexpected error in (): ' + e);
		    }
		}
	
		// alias methods
		this.fatal 		= function(str) { this.doLog(LOG_FATAL, str); }
		this.error 		= function(str) { this.doLog(LOG_ERROR, str); }
		this.warn 		= function(str) { this.doLog(LOG_WARN, str); }
		this.info 		= function(str) { this.doLog(LOG_INFO, str); }
		this.trace1 	= function(str) { this.doLog(LOG_TRACE1, str); }
		this.object 	= function(str) { this.trace1(str); }
		this.trace2 	= function(str) { this.doLog(LOG_TRACE2, str); }
		this.method		= function(str) { this.trace2(str); }
		this.method		= function(str) { this.trace2(str); }
		this.trace3 	= function(str) { this.doLog(LOG_TRACE3, str); }
		this.major 		= function(str) { this.trace3(str); }
		this.trace4 	= function(str) { this.doLog(LOG_TRACE4, str); }
		this.minor 		= function(str) { this.trace4(str); }
		this.trace5 	= function(str) { this.doLog(LOG_TRACE5, str); }
		this.all 		= function(str) { this.trace5(str); }
	
		/**
		 * abstraction layer to push items onto the funcStack
		 */
		this.funcStackPush = function (param) {
			this.funcStack.push(param);
			log.method('Begin');
		}
		
		/**
		 * abstraction layer to remove items from the funcStack
		 */
		this.funcStackPop = function () {
			log.method('End');
			this.funcStack.pop();
		}
		
		
		/**
		 * Determines if the itm is in the col
		 */
		this.contains = function (col, itm) {
			var cleanItm = itm.replace(')', '').replace('(', '');
			
			for(var i=0; i<this.hiddenFunctions.length; i++) {
				if(this.hiddenFunctions[i] == cleanItm) {
					return true;
				}
			}
			
			return false;
		}
		
		/**
		 * builds an alertable string of the call stack
		 */
		this.funcStackPrint = function() {
			var str = '';
			for (var a=0; a<this.funcStack.length; a++) {
				str += '\n' + this.funcStack[a];
			}
			return str;
		}
		
	}

} catch (e) {
	alert('Unexpected error initializing log.js: ' + e);
}
	