/**
 * Function : dump()
 * Arguments: The data - array,hash(associative array),object
 *    The level - OPTIONAL
 * Returns  : The textual representation of the array.
 * This function was inspired by the print_r function of PHP.
 * This will accept some data as the argument and return a
 * text that will be a more readable version of the
 * array/hash/object that is given.
 * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
 */
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}

// function to pad a numbers with zeros to get the specified number of digits
Number.prototype.pad = function(digitNum)
{
	var numberString = this.toString();
	
	for(var lengthCounter = numberString.length; lengthCounter < digitNum; lengthCounter++)
	{
      numberString = "0" + numberString;
	}
	
	return numberString;
}

// toggles debug console output
function toggleDebugConsoleOutput(toggleButton)
{
	if(!window.debugConsoleDisabled)
	{
		window.debugConsoleDisabled = true;
		toggleButton.value = 'Enable Output';	
	}
	else
	{
		window.debugConsoleDisabled = false;
		toggleButton.value = 'Disable Output';
	}
}

// toggles scroll lock
function toggleDebugConsoleScroll(toggleButton)
{
	if(!window.debugConsoleScrollLock)
	{
		window.debugConsoleScrollLock = true;
		toggleButton.value = 'Disable Scroll Lock';	
	}
	else
	{
		window.debugConsoleScrollLock = false;
		toggleButton.value = 'Scroll Lock';
	}
}

// call this function to display text in the debug console
function dcout(string)
{
	if(!window.debugConsoleDisabled)
	{
		var debugConsoleDiv = document.getElementById('debugConsole');
		var debugConsoleTextDiv = document.getElementById('debugConsoleText');
		var debugConsoleHeaderDiv = document.getElementById('debugConsoleHeader');		
		
		// if the debug console div doesn't exist...
		if(!debugConsoleDiv)
		{
			// get the body tag
			var bodyTag = document.getElementsByTagName('BODY')[0];
			
			// create the debug console div
			debugConsoleDiv = document.createElement('div');
			debugConsoleDiv.id = 'debugConsole';		

			// create the spacer so everything on the page can still be seen
			// with the debug console visible
			debugConsoleSpacerDiv = document.createElement('div');
			debugConsoleSpacerDiv.id = 'debugConsoleSpacer';

			// insert the debug console and spacer into the document						
			bodyTag.appendChild(debugConsoleDiv);
			bodyTag.appendChild(debugConsoleSpacerDiv);			
	
			// create the debug console HTML
			debugConsoleHTML = '<div id="debugConsoleHeader"><b>Debug Console</b> ';
			debugConsoleHTML += '<input type="button" value="Disable Output" onClick="toggleDebugConsoleOutput(this)"/> ';
			debugConsoleHTML += '<input type="button" value="Scroll Lock" onClick="toggleDebugConsoleScroll(this)"/>';
			debugConsoleHTML += '</div>';
			debugConsoleHTML += '<div id="debugConsoleText"></div>';			
	
			debugConsoleDiv.innerHTML = debugConsoleHTML;
			
			// in the interest of keeping the debug console code in one place, the
			// styles (which really belong in a css file) are here.			
			debugConsoleDiv.style.position = 'fixed';
			debugConsoleDiv.style.left = '0px';
			debugConsoleDiv.style.bottom = '0px';
			debugConsoleDiv.style.height = '200px';
			debugConsoleDiv.style.width = '100%';
			debugConsoleDiv.style.color = '#000000';
			debugConsoleDiv.style.backgroundColor = '#FFFFFF';
			debugConsoleDiv.style.border = '1px solid #000000';
			debugConsoleDiv.style.fontFamily = 'courier';			
			
			debugConsoleHeaderDiv = document.getElementById('debugConsoleHeader');
			debugConsoleHeaderDiv.style.backgroundColor = '#EEEEEE';
			
			debugConsoleTextDiv = document.getElementById('debugConsoleText');
			debugConsoleTextDiv.style.overflow = 'auto';
			debugConsoleTextDiv.style.height = '180px';
			debugConsoleTextDiv.style.color = '#000000';
			
			debugConsoleSpacerDiv.style.height = debugConsoleDiv.style.height;
		}
	
		// format the output timestamp
		var now = new Date();
	
		var hours = now.getHours().pad(2);
		var minutes = now.getMinutes().pad(2);
		var seconds = now.getSeconds().pad(2);
		var milliseconds = now.getMilliseconds().pad(3);
	
		var timestamp = hours + ":" + minutes + ":" + seconds + ":" + milliseconds;
	
		// output to the debug console
		debugConsoleTextDiv.innerHTML += '<div>[' + timestamp + '] ' + string + '</div>';	
		
		if(!window.debugConsoleScrollLock)
		{
			// scroll to the bottom
			debugConsoleTextDiv.scrollTop = debugConsoleTextDiv.scrollHeight;
		}
	}
}
