function getJson(obj)
{
	if (typeof obj !== "object") { return obj; }

	return '<span class="jsonOperator">{</span><br />' + getJsonNode(obj, 1, false, 'jsObj') + '<br /><span class="jsonOperator">}</span>';
}

function getJsonNode(obj, level, arr, nodePath)
{
	var out = '';
	var toolTipText = '';

	var j = 0;
	for (var i in obj)
	{
		// Array: 808000
		// 008080
		if (j > 0)
		{
			out += '<span class="jsonOperator">,</span><br />';
		}

		// Build Tool Tip Text
		toolTipText = '{b}' + nodePath + '[&quot;' + i + '&quot;]{/b}{br /}';
		toolTipText += 'Type: ';
		if (typeof obj[i] === "object")
		{
			if (obj[i] === null)
			{
				toolTipText += 'null';
			}
			else if (obj[i] instanceof Array)
			{
				toolTipText += 'Array{br /}';
				toolTipText += 'Length: ' + obj[i].length;
			}
			else
			{
				toolTipText += 'Object';
			}
		}
		else
		{
			toolTipText += (typeof obj[i]).substr(0, 1).toUpperCase() + (typeof obj[i]).substr(1);
		}
		toolTipText += '{br /}XML-type: ';
		switch(i.substr(0, 1))
		{
			case "#":
				toolTipText += 'Text content';
				break;
			case "@":
				toolTipText += 'Attribute';
				break;
			default:
				toolTipText += 'Node';
		}

		out += getIndentation(level);
		if (!arr)
		{
			out += '<span class="jsonNodeNameQuot">"</span><span class="jsonNodeNameText" onmouseover="showToolTip(this, \'' + toolTipText + '\');" onmouseout="hideToolTip(this);">' + i + '</span><span class="jsonNodeNameQuot">"</span><span class="jsonOperator">:</span> ';
		}

		switch (typeof obj[i])
		{
			case "object":
				if (obj[i] === null)
				{
					out += '<span class="jsonNodeContentNull">null</span>';
				}
				else
				{
					out += '<span class="jsonOperator">' + (obj[i] instanceof Array ? '[' : '{') + '</span><br />' + getJsonNode(obj[i], level + 1, (obj[i] instanceof Array),  nodePath + (arr ? '[' + i + ']' : '[&quot;' + i + '&quot;]')) + '<br />' + getIndentation(level) + '<span class="jsonOperator">' + (obj[i] instanceof Array ? ']' : '}') + '</span>';
				}
				break;
			case "string":
				out += '<span class="jsonNodeContentQuot">"</span><span class="jsonNodeContentText">' + obj[i].replace(/\\/g, '\\\\').replace(/\//g, '\\\/').replace(/\"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</span><span class="jsonNodeContentQuot">"</span>';
				break;
			case "number":
				out += '<span class="jsonNodeContentNumber">' + obj[i] + '</span>';
				break;
			case "boolean":
				out += '<span class="jsonNodeContentBoolean">' + (obj[i] === true ? 'true' : 'false' ) + '</span>';
				break;
			default:
				out += '<span class="jsonNodeContentNull">null</span> <span class="jsonComment">/* ERROR */</span>';
				break;
		}
		j++;
	}

	return out;
}

function getIndentation(level)
{
	var out = '';

	for (var i = 0; i < level * 5; i++)
	{
		out += '&nbsp';
	}

	return out;
}

var toolTipElem = null;

function showToolTip(which, text)
{
	var elem = document.createElement("div");
	elem.className = "jsonToolTip";
	elem.style.top = (which.offsetTop + which.offsetHeight - which.parentNode.scrollTop) + "px";
	elem.style.left = which.offsetLeft + "px";
	elem.innerHTML = text.replace(/{/g, "<").replace(/}/g, ">");
	toolTipElem = document.body.appendChild(elem);
}

function hideToolTip(which)
{
	document.body.removeChild(toolTipElem);
}