// dbg.js 
//		:: generic debug utilities
//		@(#)dbg.js	1.1.2.4 10:11:58 08/31/01

var UNDEF = 'undefined';
var ui = new Object();		// really shd be in ui.js 
ui.tz = 'local';


var dbgDbg = false;
var dbgBool = true;
var dbgdoc = null;
var dbgWin = null;
var warnBool = true;

function dbgOn() { dbgBool = true; }
function dbgOff() { dbgBool = false; dbgdoc=null; }

// -- the dbgCache functions work-around
//     a deadlock when running dbg to dbgdoc while receiving g2/xml msgs
var dbgCache = false;
var dbgCacheBuffer = '';
function dbgCacheOn() { dbgCache = true; }
function dbgCacheOff() { 
	dbgCache = false;
	dbg(dbgCacheBuffer); dbgCacheBuffer = '';
}


function dbgi(txt) { dbg('\n<li>'); dbg(txt); }
function dbgnv(name,val) { dbg('\n<li>' + name + ': '); dbg(val); }

function dbgao(obj) { dbg(dumpAppObj(obj)); }

function dbg(txt)
{
//var txt0 = txt; 
	if (dbgCache) { 
		if (typeof(txt)=='object') txt = '<font size=-1><pre>' + dumpObj(txt) + '</pre></font>';
		dbgCacheBuffer += txt;
		return;
	}

	//dbgBool = false;

	if (!dbgBool){  // set in fset.0
	    return;
	}

	if (typeof(txt)=='object') txt = '<font size=-1><pre>' + dumpObj(txt) + '</pre></font>';

		if (dbgdoc == null){ 

			spec = 'width=400,height=400,scrollbars=yes,resizable=yes';
			if (document.all) target="DEBUG_IE";
			else              target="DEBUG_NN";
			dbgWin = window.open('',target,spec);
			if (typeof(dbgWin) == UNDEF) {
				alert('sorry - problems starting trace window');
			}
			else {
				dbgdoc = dbgWin.document;
				dbgdoc.open();
				dbgdoc.write("<html><title>*Log</title>");
				dbgdoc.write("<table><tr><td width=400> &nbsp; &nbsp; </table>");
			}
		}
//if (dbgDbg){ 
//	alert('' + dbg.caller + '\n' + txt0 + '\n--------------------\n' + txt);
//}

		if (dbgWin && dbgWin.open && !dbgWin.closed) dbgdoc.write(txt );

		
}



function dumpObj(obj,rbool,indent)
{
	if (typeof rbool == UNDEF){ rbool = ''; indent='';}
	if (typeof obj != "object") return 'dmpObj - '
		+ typeof(obj) + ' ( ' + obj + ' )\n  NOT AN OBJECT ??';

	var msg = "" ; var d = "";
	for (var x in obj){
		msg += d + indent  + " - " + x ; d="\n<br>";

		try {
		if (typeof(obj[x]) == "function"){msg += ': function'; continue; }
		var t = typeof(obj[x]);

		if (document.aaa){
		if (x.indexOf('HTML') >= 0){ msg + ': ...'; continue; }
		if (x.indexOf('drawSpec') >= 0){ msg + ': ...'; continue; }
		//if (x.indexOf('innerText') >= 0){ msg + ': ...'; continue; }
		//if (x.indexOf('outerText') >= 0){ msg + ': ...'; continue; }
		if (t=='unknown'){ msg += ': **unknown**'; continue; }
		}

		//if (t==UNDEF){ msg += ': UNDEFINED'; continue; }
		//if (t=='object'){ msg += ': OBJECT'; continue; }
		//msg += ": " + typeof(obj[x]);  d = "\n";

		if ( (t=='object') && (rbool=="r")) {
			msg += ':' +  dumpObj(obj[x],rbool,indent + '   ');
		}
		else {
			msg +=  ": " + obj[x]; d = "\n";
		}


		//if (x == "layers") {
		//	for (y in obj[x]) msg += "\n - - - layer: " + y;
		//}

		if (x == "cbfn") msg += dump_cbfn(obj[x]);
		}
		catch(e){
			msg += 'NOT AVAILABLE';
		}

	}
	return msg;
}


function dump_cbfn(arr)
{
	var msg = '';
	for (y in arr) { 
		var val = '' +  arr[y];
		var i = val.indexOf('(');
		var tmp = val.substr(0,i);
		tmp = tmp.replace('\nfunction','');
		msg += "\n<br> - - cbfn: " + y + ' ' + tmp;
	}
	return msg;
}


function ao(obj,txt)
{
	if (typeof txt == UNDEF) txt = "no.title?";
	var msg = txt + dumpObj(obj);
	alert(msg);
	return;
}

function aok(obj,txt)
{
	if (typeof txt == UNDEF) txt = "no.title?";
	var msg = '';
	for ( x in obj) msg += '\n' + x;
	alert(msg);
	return;
}


function ckObj(p,msg){
	if (typeof p == "object")
		//ao(p,msg);
		return true;
	else
		alert('NOT an object.  ' + msg);
		return false;
}


var timestamp = 0;
var tmArr = new Object();
var tmCnt = new Object();
function tmstamp(flag, label, value) 
{
	// from Danny Goodman - debugging javascript

	if (typeof label == UNDEF) label = flag;
	else if (!flag)  return;

       var now = new Date();
       var elapsed = now - timestamp;
       if (elapsed < 900000) { dbg( "<li> (" + elapsed + " msec)"); }
       timestamp = now;

	if (typeof tmArr[label] == UNDEF){ 
		tmArr[label] = 0  ;
		tmCnt[label] = 0  ;
	}
	tmArr[label] += 0 + elapsed;
	tmCnt[label] += 1;

if (dbgBool) dbg('<li>' + label + '<hr>');
}


function dumpHtml(win)
{
	var cum = win.document.outerHTML;
	cum = jsReplace(cum,'<','&lt;');
	dbg( '\n<hr>' + cum + '\n<hr>\n');
}


function captureError(errmsg,url,line)
{
	showCodeError('<pre>Browser/Javascript Error: (' +line+ '<br>'  + e.text);
	return true;  // suppress standard error dialog
}

function dbgError(stuff)
{
	dbg('<li><font color=red>ERROR: ');
	dbg(stuff);
	dbg('</font>');
}

var dbgDaoCnt = 0;
function dumpAppObj(obj,indent)
{
	return dumpAppObjR(obj,indent,0)
}

function dumpAppObjR(obj,indent,rcnt)
{
	if (rcnt > 8 ){
//dbg('<li><font color=red>rcnt=</font>' + rcnt);
	return '<font color=red>oo</font>';
	}
	if (typeof indent == UNDEF){ indent='\n<br>';}
	if (typeof( obj ) != "object"){ 
//dbg('<li><font color=red>non-object passed to dumpAppObR</font>');
//dbg('<li><font color=red>typeof is</font>' + typeof(obj));
		return 'dmpObj - '
		+ typeof(obj) + ' ( ' + obj + ' )\n  NOT AN OBJECT ??';
	}

	var msg = "" ; var d = "";
	for (x in obj){
		
		try {
		msg += d + indent  + " - " + x ; 	//d="\n<br>";

		if (typeof(obj[x]) == "function"){
			// msg += ': function'; 
			continue; }
		var t = typeof(obj[x]);

		if (t=='object') {
//dbg(msg);  dbg('<li>x=' +x+ ' t=' +t);
			msg += ':' +  dumpAppObjR(obj[x],indent + ' .  ', rcnt+1 );
		}
		else {
			msg +=  ": '" + obj[x] + "'"; //d = "\n";

		}
		}
		catch(e){
			msg += ' R.NOT.AVAILABLE';
		}

	}
	return msg;
}

function error(txt)
{
	return '<p><hr><font color=red>'
		+ txt
		+ '</font><hr><p>'
		;
}
