
function jd(data, op, dumpdiv_id)
{
	try {
	if (typeof dumpdiv_id == 'undefined')
		dumpdiv_id = 'dumpdiv';
	var dc = document.getElementById(dumpdiv_id);
	if (!dc)
		return;

	jd.dumpedobj = data;
	dc.style.position = (browser()=='ie') ? 'absolute' : 'fixed';
	dc.style.display = 'block';

	switch (op)
	{
		case 'once': // do not rewrite or append inner html
			if (dc.innerHTML.length > 5)
				return;
		break;
		case 're': // rewrite inner html
			dc.innerHTML = '';
		break;
		case undefined: // undefined op
		case 'a': // append inner html
		break;
		default:
			dc.innerHTML += '<br>' + op; // cast 'op' as the title
		break;
	}

	if (dc.innerHTML)
		dc.innerHTML += '<br>';

	if (!data)
		return;

	if (typeof(data)!='object') // not an object
	{
		dc.innerHTML += data;
		return;
	}

	// dump object
	if (jd.parentobj)
		dc.innerHTML += '<a href="#" onClick="javascript:var obj=jd.parentobj; jd.parentobj=null; jd(obj,\'re\'); cancelBubble(event); return false">Parent</a><br>';
	if (data.nodeName)
		dc.innerHTML += '<u>Node name: <b>' + data.nodeName + '<b></u><br>';
	if (data.name)
		dc.innerHTML += '<u>name: <b>' + data.name + '<b></u><br>';
	if (data.id)
		dc.innerHTML += '<u>id: <b>' + data.id + '<b></u><br>';
	if (dc.innerHTML)
		dc.innerHTML += '<br>';

/*
	for (var i in data)
	{
		dc.innerHTML += '<b>' + i + '</b> = ' + data[i] + '<br>';
	}
*/
	var txt = '';
	for (var i in data)
	{
		try{
		if (typeof data[i] == 'object')
		{
			txt += '<b>' + i + '</b> = <a href="#" onClick="javascript:jd.parentobj=jd.dumpedobj; jd(jd.dumpedobj[\''+i+'\'],\'re\'); cancelBubble(event); return false">' + data[i] + '</a><br>';
		}
		else
			txt += '<b>' + i + '</b> = ' + data[i] + '<br>';
		}catch(e){ txt+=i+'!!!<br>';}
	}
	dc.innerHTML += txt;
	} catch(e) { jd(e); }

}
