////////////////////////////////////////////////////////////////////
function DBG( s, bClear )
{
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))
{
try
{
eval('debugger')
}
catch(e){}
}
}
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" );}
}
}
