// banasmoo.com/js/debug.js
// Copyright (c) 2005 Dan Wright
// danwright.info/contact

// JavaScript debugging utilities (asserts, logs)
// The log is displayed in the document window. We could put it in a new,
// popup window, but that would run afoul of popup-blocking in some cases.

var Debug = {
	enabled : false,
	earlyItems : "",
	
	clearOldLines : function()
			{
			var elemLog = Debug.getLogNode();
			if (elemLog)
				{
				var content = elemLog.innerHTML;
				var lines;
				if (content.indexOf("<BR>") >= 0)
					lines = content.split("<BR>");
				else if (content.indexOf("<BR/>") >= 0)
					lines = content.split("<BR/>");
				else
					return;
				if (lines.length > 60)
					{
					lines.splice(0, lines.length - 50);
					elemLog.innerHTML = lines.join("<BR/>");
					}
				}
			},
			
	log : function(text)
			{
			var elemLog = Debug.getLogNode();
			if (elemLog)
				{
				//Debug.clearOldLines();
				var bits = text.split('\n');
				var i;
				for (i = 0; i < bits.length; i++)
					{
					elemLog.appendChild(document.createTextNode(bits[i]));
					var brk = document.createElement('br');
					elemLog.appendChild(brk);
					}
				Debug.show();
				if (Debug.console != null)
					Debug.copyToConsoleWindow();
				}
			else
				{
				Debug.addEarlyItem(text);
				}
			},
	
	objectToString : function(obj)
			{
			if (null === obj)
				return "null";
			if (typeof obj != "object")
				return "["+typeof obj+"]";
			var desc = "{";
			try {
				for (var property in obj)
					desc += property+":"+obj[property]+";";
				return desc + "}";
				}
			catch (e)
				{
				return "[failure ("+desc+"): " + e.message + "; " + obj.innerText + "]";
				}
			},
	
	errorToString : function(error)
			{
			if (null == error)
				return "null";
			var msg = error.name + ": " + error.message;
			if (error.line != null)
				msg = msg + "; line " + error.line;
			if (error.sourceURL != null)
				msg = msg + " in " + error.sourceURL;
			return msg;
			},
			
	show : function()
			{
			var elemLog = Debug.getLogNode();
			if (elemLog)
				elemLog.style.display = 'block';
			},
	
	hide : function()
			{
			var elemLog = Debug.getLogNode();
			if (elemLog)
				elemLog.style.display = 'none';
			},
			
	assert : function(expr, message)
			{
			if (!expr)
				{
				if (arguments.length > 2 && typeof arguments[2] == 'object')
					{
					try {
						var func = arguments[2].callee;
						var functext = func.toString();
						var funcname = "/^[^()]*/".match(functext);
						alert(functext);
						}
					finally
						{
						Debug.log("assertion failure: " + message);
						}
					}
				else
					Debug.log("assertion failure: " + message);
				//alert("assertion failed!");
				}
			},
			
	getLogNode : function()
			{
			if (Debug.enabled)
				{
				return document.getElementById('debuglog');
				}
			return null;
			},
			
	init : function()
			{
			},
			
	addEarlyItem : function(text)
			{
			if (Debug.enabled)
				Debug.earlyItems = Debug.earlyItems + text + '\r' + '\n';
			},
		
	copyToConsoleWindow : function()
			{
			if (Debug.enabled)
				{
				if (Debug.console == null)
					{
					Debug.console = window.open("", "console", "");
					Debug.console.document.title = "com.banasmoo.debug.console";
					Debug.console.document.bgColor = '#ffeeee';
					}
				Debug.console.document.body.innerHTML = Debug.getLogNode().innerHTML;
				}
			},
			
	finishInit : function()
			{
			if (document.getElementById && Debug.enabled)
				{
				var body = document.body;
				if (body)
					{
					elemLog = document.createElement('pre');
					if (elemLog)
						{
						elemLog.id = 'debuglog';
						elemLog.style.display = 'block';
						elemLog.style.backgroundColor = '#880000';
						elemLog.style.color = '#77cccc';
						elemLog.style.padding = '5px';
						elemLog.style.border = '2px solid red';
						elemLog.style.cursor = 'pointer';
						elemLog.style.position = 'absolute';
						elemLog.style.left = '0.5in';
						elemLog.style.width = "80%";
						elemLog.style.bottom = '0.4in';
						elemLog.style.fontSize = "10px";
						elemLog.style.zIndex = 25;
						elemLog.style.textAlign = 'left';
						elemLog.style.overflow = 'scroll';
						elemLog.style.height = '150px';
						/*elemLog.title = '(click to hide)'; */
						elemLog.onclick = function() { Debug.copyToConsoleWindow(); }; 
						if (Debug.earlyItems.length > 0)
							{
							var txt = document.createTextNode(Debug.earlyItems);
							elemLog.appendChild(txt);
							Debug.earlyItems = "";
							}
						body.appendChild(elemLog);
						if (typeof Element.setOpacity == 'function')
							Element.setOpacity(elemLog, 0.7);
						Debug.enabled = true;
						return;
						}
					}
				}
			Debug.enabled = false;
			}
	
	};
	


addDocumentLoadFunc(Debug.finishInit);

