//////////////////////////////////////////////////////////////////////
//
//	Debug utils
//
function DBG( s, bClear )
{
//return;
	var dt = new Date();
	var sD = dt.getTime();
	
	var oEl = dbg;
	if (!oEl.txt || bClear)
		oEl.txt = "";

	oEl.txt = s + "\n" + oEl.txt;
	oEl.innerText = oEl.txt;
}

function ASSERT( bExpr, sMsg )
{
	if (!bExpr) DbgMsgX(sMsg + "\n\nInvoke debugger?");
}

function DbgMsgX( sMsg )
{
	if(confirm(sMsg)) debugger;
}

function CStopWatch()
{
	this.m_Watch = new Date();
	this.m_aChPtArr = new Array;
	var m_sNest = "";

	this.Start = function()
	{
		this.m_Watch = new Date();
	}

	this.GetElapsedTime = function()
	{
		var nTime = 0;

		if( this.m_Watch )
		{
			nTime = new Date() - this.m_Watch;
		}

		return nTime;
	}

	this.ChPt = function()
	{
		var nRet = this.GetElapsedTime();
		this.Start();
		return nRet;
	}

	this.ChPtAr = function( sMsg )
	{
		var o = { d:this.ChPt(), sMsg: m_sNest + sMsg };
		this.m_aChPtArr.push( o );
	}

	this.RemoveLast = function()
	{
		this.m_aChPtArr.pop();
	}

	this.ShowChPtAr = function()
	{
		if (g_bDebugMode)
		{
			sMsg = "";
			nTotal = 0;
			for (var i = 0; i < this.m_aChPtArr.length; ++i)
			{
				nTotal += this.m_aChPtArr[i].d;
				sMsg += this.m_aChPtArr[i].sMsg;

				if( this.m_aChPtArr[i].d > 0 )
				{
				 	sMsg += ": " + this.m_aChPtArr[i].d;
				}

				sMsg += "\n";
			}
			sMsg += "-----------\nTotal: " + nTotal;
			alert(sMsg);
		}
	}

	this.ShowElapsedTimeSec = function()
	{
		alert( this.GetElapsedTime()/1000 + " sec" );
	}

	this.ShowElapsedTime = function( sMsg )
	{
		var sTxt = "";
		if (null != sMsg)
		{
			sTxt += sMsg;
			sTxt += "\n";
		}
		sTxt += this.GetElapsedTime() + " ms";
		alert( sTxt );
	}

	this.Nest = function()
	{
		m_sNest += "\t";
	}

	this.Unnest = function()
	{
		m_sNest = m_sNest.substr( 0, m_sNest.length - 1 );
	}
}


function CCleaner( m_oDoc )
{
	this.Clean = function()
	{
		ReportOpen();

		var aAll = m_oDoc.all;
		var nEls = aAll.length;
		for (var n = 0; n < nEls; ++n)
		{
			var oEl = aAll[n];
			CleanObj( oEl );
		}

		CleanObj( m_oDoc );
		CleanObj( m_oDoc.parentWindow );
		
		ReportClose();
	}

	function CleanObj( oObj )
	{
		CleanExpandos( oObj );
		CleanProps( oObj );
	}
	
	function CleanExpandos( oEl )
	{
		var aAttrs = oEl.attributes;
		if (aAttrs)
		{
			var nAttrs = aAttrs.length;
			for (var n = 0; n < nAttrs; ++n)
			{
				var oA = aAttrs[n];
				if (oA.expando)
				{
					var sType = typeof oA.nodeValue;
					if ("object" == sType || "function" == sType)
					{	
						if (oEl[oA.name])
						{
							Report( GetElHTMLPart( oEl ), oA.name );
							oEl[oA.name] = null;
						}
					}
				}
			}
		}
	}

	function CleanProps( oObj )	
	{
		try{
		for (var k in oObj)
		{
			var sPref = k.substr(0, 2);
			if (sPref == "m_" || sPref == "on")
			{
				if (oObj[k])
				{
					var sType = typeof oObj[k];
					if ("object" == sType || "function" == sType)
					{
						Report( GetElHTMLPart( oObj ), k );
						oObj[k] = null;
					}
				}
			}
		}
		}catch(e){}
	}
	
	function GetElHTMLPart( oEl )
	{
		var s = oEl.outerHTML;
		if (!s) s = "<Object>"
		s = s.substr(0, 48);
		return s.trim();
	}
	
	var m_axFS, m_oRepF;
	
	function ReportOpen()
	{
		try{
		m_axFS = new ActiveXObject("Scripting.FileSystemObject");
		}catch(e){}

		if (m_axFS)
		{
			m_oRepF = m_axFS.CreateTextFile( "d:/_wt_exps.txt", true, false );
		}
	}

	function ReportClose()
	{
		if (m_oRepF)
		{
			m_oRepF.Close();
		}
	}

	function Report(sHTML, sExpName)
	{
		if (m_oRepF)
		{
			m_oRepF.Write( "'" + sHTML + "'\tName: '" + sExpName + "'\r\n" );
		}
	}
}
