/**
 * <p>Title: debugger.js</p>
 * <p>Description: Debugger javascript library.</p>
 * <p>Copyright: Copyright (c) 2007</p>
 * <p>Company: Kreber Graphics, Inc.</p>
 * @author Charlie Reading
 */

// Includes
var debugger_js = 1;
var includes = ((typeof Prototype == 'undefined') ? " prototype.js\n" : "");
if (includes != "")
{
	alert("debugger.js: you must first include:\n" + includes);
}

var Debugger =
{
	// targets
	kTarget_Debug: 0,
	kTarget_Log: 1,
	
	logTime: false,
	
	_inited: false,
	_enabled: false,
	_msgQueue: [],
	
	_capturedDebug: false,
	_capturedLog: false,
	_hasWindowDebug: false,
	_hasConsole: false,
	
	_debugger_: undefined,
	
	
	enable: function(enabled)
	{
		// enabled?
		Debugger._enabled = ((Object.isUndefined(enabled)) ? true : enabled);
		
		// init
		if (! Debugger._inited)
		{
			// "_debugger_" <div> inner-page debugger
			Debugger._debugger_ = $("_debugger_");

			Debugger._inited = true;
		}
		
		// enable (if requested)
		if (Debugger._enabled)
		{
			// dequeue queued messages
			Debugger._msgQueue.each(function(queued)
			{
				if (queued.target == Debugger.kTarget_Debug)
				{
					Debugger._debug("(queued) "+queued.msg, queued.time);
				}
				else
				{
					Debugger._log("(queued) "+queued.msg, queued.time);
				}
			});
		}
		
		Debugger.log("Debugger: " + ((Debugger._enabled) ? "enabled" : "disabled"));
	},
	
	debug: function(msg)
	{
		// queue pre-init
		if (! Debugger._inited)
		{
			Debugger._msgQueue.push({ msg: msg, target: Debugger.kTarget_Debug, time: new Date() });
			return;
		}
		
		Debugger._debug(msg);
	},
	
	log: function(msg)
	{
		// queue pre-init
		if (! Debugger._inited)
		{
			Debugger._msgQueue.push({ msg: msg, target: Debugger.kTarget_Log, time: new Date() });
			return;
		}
		
		Debugger._log(msg);
	},
	
	_debug: function(msg, time)
	{
		if (Debugger._enabled)
		{
			this._write(msg, Debugger.kTarget_Debug, time);
		}
	},
	
	_log: function(msg, time)
	{
		if (Debugger._enabled)
		{
			this._write(msg, Debugger.kTarget_Log, time);
		}
	},
	
	_write: function(msg, target, time)
	{
		var m = msg;
		if (Debugger.logTime)
		{
			var d = time || new Date();
			var dstr = "";
			var hms = [ d.getHours(), d.getMinutes(), d.getSeconds() ];
			hms.each(function(val,i)
			{
				if (i > 0)
				{
					dstr += ":";
				}
				var hmsstr = "0"+val;
				dstr += hmsstr.substr(hmsstr.length-2);
			});
			m = "["+dstr+"] "+msg;
		}
		
		if ((Debugger._hasWindowDebug) && (debugWindow != null))
		{
			Debugger._capturedDebug(m);
		}
		else if (! Debugger._hasConsole)
		{
			if (Debugger._debugger_)
			{
				Debugger._debugger_.innerHTML = m;
			}
			else
			{
				top.alert(m);
			}
		}
		else if (Prototype.Browser.IE)
		{
			Sys.Debug.trace(m);
		}
		else if (Prototype.Browser.WebKit)
		{
			window.console.log(m);
		}
		else
		{
			console.debug(m);
		}
	}
};

// set up debug/log functions (capturing existing one-- will override)
var debug = ((typeof debug == 'function') ? debug : undefined);
var log = ((typeof log == 'function') ? log : undefined);
if (debug)
{
	Debugger._capturedDebug = debug;
	Debugger.log("Debugger: capturing existing debug() function");
}
if (log)
{
	Debugger._capturedLog = log;
	Debugger.log("Debugger: capturing existing log() function");
}
debug = Debugger.debug;
log = Debugger.log;

// window.js debugger
Debugger._hasWindowDebug = (typeof showDebug == 'function');

// do we have a console?
if (Prototype.Browser.IE)
{
	Debugger._hasConsole = ((typeof Sys != 'undefined') && (typeof Sys.Debug != 'undefined'));
}
else if (Prototype.Browser.WebKit)
{
	Debugger._hasConsole = (typeof window.console != 'undefined');
}
else
{
	Debugger._hasConsole = ((typeof console != 'undefined') && (typeof console.debug != 'undefined'));
}
