function		DumpObject	(pObject, pName)	// New optional 3rd parm: maximum number of properties per alert 
{												// (used when an object has a LOT of properties). 
var	sCtr		= 0;
var	sMaxDisplay	= (DumpObject.arguments.length > 2)? DumpObject.arguments[2] : 99999;
var	sString		= "Properties of '" + pName + "':\n\n";
for	(var sProperty in pObject)
	{
	sString		+= pName + "." + sProperty + " = " + pObject[sProperty] + "\n";
	sCtr++;
	if	(sCtr >= sMaxDisplay)
		{
		if	(!confirm(sString + "\n(more)"))
			return;
		sCtr	= 0;
		sString	= "More properties of '" + pName + "':\n\n";
		}
	}
alert(sString + "\nEnd of properties.");
}

function DumpLongString					(pString, pLengthPerAlert)
{
if	(pLengthPerAlert == null)
	pLengthPerAlert						= 2000;
var	sFrom								= 0;
var	sTo									= pLengthPerAlert;
while (sTo < pString.length)
	{
	if	(!confirm(pString.substring(sFrom,sTo)))
		return;
	sFrom								+= pLengthPerAlert;
	sTo									+= pLengthPerAlert;
	}
alert(pString.substring(sFrom,pString.length) + "\n\nEnd of long string.");
}

// ************************** Recursive Drill-down Version **************************

function DumpObjectAndChildNodes	(pObject, pName)	// Optional 3rd parm: maximum number of properties per alert 
{														// (used when an object has a LOT of properties). 
if	(DumpObjectAndChildNodes.arguments.length > 2)
	DumpObject	(pObject, pName, DumpObjectAndChildNodes.arguments[2]);
else
	DumpObject	(pObject, pName);
// This function does way, way, WAY more alerts than DumpObject, so 
// display "confirm" dialogs, and allow them to abort the recursion: 
if ((pObject.length)
&&	(pObject.length > 0)
&&	(pObject[0]))
	{
	if	(confirm(pName + " is an array. Dump all elements too?"))
		{
		for	(var i = 0; i < pObject.length; i++)
			if	(!DumpObjectAndChildNodes	(pObject[i],			pName + "[" + i + "]"))
				return false;
		}
	else
		return false;
	}
if	(pObject.childNodes)
	if	(confirm(pName + " has childNodes. Dump them too?"))
		{
		if	(!DumpObjectAndChildNodes		(pObject.childNodes,	pName + ".childNodes"))
			return false;
		}
	else
		return false;
return true;
}
