// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  © Copyright 2000, Calypso Systems, Inc.
//  All Rights Reserved.
//
//  Description:	csxClientSide Trace Utility
//
//  Who                     When         What
//  ------------------------------------------------
//  lGoodman@calsys.com     01/17/00     Created
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// -----------------------------------------
// String Builder
// -----------------------------------------
function strBuilder()
{
	this.count = 0;
	this._items = new Array();
}

	// Add a property
	strBuilder.prototype.addProp = function(sName,sValue)
	{
	this.add(" " + sName + "='" + sValue + "'");
	}


	// Add an item 
	strBuilder.prototype.add = function(sItem)
	{
		this.count++;
		this._items[this.count] = sItem;
	}
	
	// AddEx - Add as many strings as there are items
	strBuilder.prototype.addEx = function()
	{
		for (var i=0;i < arguments.length; i++)
		{
			this.add(arguments[i])
		}
	}
	

	// Return Results
	strBuilder.prototype.join = function(sDelim)
	{
		if (sDelim) 
		{
			return this._items.join(sDelim);
		}
		else
		{
			return this._items.join("");
		}
	}

// ------------------------------------------------------
// trace utility - creates seperate window with trace box
//		trace.out(a,b,...)
//		trace.write(sText)
//		trace.writeln(sText)
//    trace.element() -> returns trace text area
//    trace.parms(arguments) -> traces the paramaters of the current proc
//	   trace.stack() -> Dumps the call stack and parms
//    trace.clear() -> Clears the trace window
//	   trace.object(sName,obj) -> Dumps all named object parms
//	   trace.array(sName,oArr) -> Dumps all ordinal object parms
//    trace.write(sText) -> Appends text w/o crlf
// ------------------------------------------------------
var trace = new xTrace()
function xTrace()
{
	this.name = "xTraceDefault";
	this.rows = 20;
	this.cols = 90;
	this.height = 380;
	this.width = 790;
	this.top = 0;
	this.left = 0;
}

// ------------------------------------------------------------
// trace.out
// ------------------------------------------------------------
xTrace.prototype.out = function()
{
	var sOut = "";
	for(var i=0;i<arguments.length;i++)
	{
		var vItem = arguments[i];
		if (i==0)
		{ sOut += vItem }
		else
		{ sOut += ":" + vItem }
	}
	if(sOut!="")
	{
		this.writeln(sOut)
	}
}


// ------------------------------------------------------------
// trace.write
// ------------------------------------------------------------
xTrace.prototype.write = function(sOut)
{
	var el = this.element();
	el.value = sOut + el.value;
}

// ------------------------------------------------------------
// trace.write
// ------------------------------------------------------------
xTrace.prototype.writeln = function(sOut)
{
	var el = this.element();
	el.value = sOut + '\n' + el.value;
}


// ------------------------------------------------------------
// getTraceElement
// ------------------------------------------------------------
xTrace.prototype.element = function()
{
	
	if(document.layers)
	{
		var bMakeNew;
		// --------- Netscape -----------
		if(!this.traceWin)
		{
			bMakeNew = true;
		}
		else
		{
			if(!this.traceWin.document)
			{
				bMakeNew = true;
			}
		}
		if(bMakeNew == true)
		{
			var sOpen = ""
			sOpen += "scrollbars=yes";
			sOpen += ",resizable=yes";
			sOpen += ",width=" + this.width;
			sOpen += ",height=" + this.height ;
			sOpen += ",top=" + this.top ;
			sOpen += ",left=" + this.left ;
			this.traceWin = window.open("",this.name,sOpen);
			
			var oDoc = this.traceWin.document;
			var sOut = "";
			sOut += "<HTML>";
			sOut += ("<HEAD><TITLE>" + "CSX Trace" + "</TITLE></HEAD>");
			sOut += ("<BODY>");
			sOut += ("<FORM ACTION='x.htm' id=form1 name=form1><TEXTAREA COLS=" + this.cols + " ROWS=" + this.rows + " NAME=txtTrace ID=txtTrace></TEXTAREA></FORM>");
			sOut += ("</BODY>");
			sOut += ("</HTML>");
			oDoc.write(sOut);
			oDoc.close();
		}
		var oRet = this.traceWin.document.forms[0].elements['txtTrace'];
		return oRet;
	}
	else
	{
		var bMakeNew;
		// Internet Exlorer
		if(!this.traceWin)
		{
			bMakeNew = true;
		}
		else
		{
			if(!this.traceWin.document)
			{
				bMakeNew = true;
			}
		}
		if(bMakeNew == true)
		{
			var sOpen = ""
			sOpen += "scrollbars=yes";
			sOpen += ",resizable=yes";
			sOpen += ",width=" + this.width;
			sOpen += ",height=" + this.height ;
			sOpen += ",top=" + this.top ;
			sOpen += ",left=" + this.left ;
			this.traceWin = window.open("",this.name,sOpen);
			var oDoc = this.traceWin.document;
			if (!oDoc.all.txtTrace)
			{
				var sOut = "";
				sOut += "<HTML>";
				sOut += ("<HEAD><TITLE>" + "CSX Trace" + "</TITLE></HEAD>");
				sOut += ("<BODY>");
				sOut += ("<TEXTAREA COLS=" + this.cols + " ROWS=" + this.rows + " NAME=txtTrace ID=txtTrace></TEXTAREA>");
				sOut += ("</BODY>");
				sOut += ("</HTML>");
				oDoc.write(sOut);
			}
			var oRet = this.traceWin.document.all.txtTrace;
			oRet.value = "--Trace Window Init--";
		}
		var oRet = this.traceWin.document.all.txtTrace;
		return oRet;
	}
}


xTrace.prototype.parms = function (args) {
  var oRet = new strBuilder()
  var s, r, i;
  var n = 0;
  var f = args.callee;
  if (typeof(f) == 'function') {
    s = f.toString();
    r = s.match(/function\s+(\S*\(.*\))/);
    oRet.addEx('Parms: ', r[0], '\n','\t arguments = [');
    for (i=0; i < f.arguments.length; i++) {
       oRet.addEx(f.arguments[i]);
       if (i < f.arguments.length - 1) oRet.addEx(', ');
    }
    oRet.addEx(']\t length = ', f.arguments.length, '\n');
  }
  trace.write(oRet.join());
}
//window.onerror = traceErrors;

function traceErrors(sError,sLoc,iLine)
{
	trace.out("--------------------------------------------------");
	trace.stack(2);
	var oTime = new Date();
	trace.out("Stack:");
	trace.out("  line " + iLine + " - " + sLoc );
	trace.out("  " + sError);
	trace.out("Error:");
	
	trace.out("----------- CSX Javascript Error Trace -----------");
	//window.onerror = "";
}
xTrace.prototype.stack = function(iSkip) {
  var oRet = new strBuilder()
  var s, r, i;
  var n = 0;
  var f = arguments.callee;
  if (iSkip) 
  {
	for(var t=0;t<iSkip;t++)
	  {  f = f.caller; }
	}
	else
	{
		f = f.caller;
	}
  while (typeof(f) == 'function') {
    s = f.toString();
    r = s.match(/function\s+(\S*\(.*\))/);
    oRet.addEx(' -', n++, '- ', r[0], '\n');
    for (i=0; i < f.arguments.length; i++) {
		oRet.addEx('       parm('+i+')='+f.arguments[i],'\n');
    }
    f = f.caller;
  }
  trace.write(oRet.join());
}


xTrace.prototype.clear = function()
{
	this.element().value = ""
}

xTrace.prototype.object = function(sName,ob)
{
	var oRet = new strBuilder()
	oRet.add("---------------------------------------")
	oRet.add(sName + ":" + typeof(ob))
	oRet.add(ob)
	oRet.add("---------------------------------------")
	for (var vKey in ob)
	{
		oRet.add(vKey + ":" + ob[vKey]);
	}

	oRet.add("---------------------------------------")
	trace.writeln(oRet.join("\n"));
}


xTrace.prototype.array = function(sName,ob)
{
var oRet = new strBuilder()
	oRet.add("---------------------------------------")
	oRet.add(sName + ":" + typeof(ob))
	oRet.add("---------------------------------------")
	for (var vKey  = 0; vKey < ob.length ; vKey++)
	{
		oRet.add(sName + "[" + vKey + "]=" + ob[vKey]);
	}
	oRet.add("---------------------------------------")
	trace.writeln(oRet.join());
}

function describeObject(ob)
{
var sOut = "";
sOut += "---------------------------------------\n"
for (var vKey in ob)
{
	sOut+=vKey + " (" + typeof(ob[vKey]) + ") " + ob[vKey] + "\n"
}
sOut += "---------------------------------------\n"
return sOut;
}
