

// --------------------- Constructor for Table Object
function Table(s,bSerialize)
	{
	if (arguments.length < 2) bSerialize = false;
	if (bSerialize) s = unescape(s)
	var aTemp = s.split("\2")
	this.raw = s;
	this.data = new Array()
	this.orig = new Array()
	this.index = new Array()
	this.indexLookup = new Array()
	this.types = new Array()
	this.enums = new Array()
	
	this.filterColumn = -1
	this.pattern = ""
	
	for (var a=0;a<aTemp.length;a++)
		{
		this.data[a] = aTemp[a].split("\3");
		this.orig[a] = aTemp[a].split("\3");
		}
	
	aTemp = this.data[0]
	
	for (var a=0;a<=aTemp.length;a++)
		{
		this.index[aTemp[a]] = a
		this.indexLookup[a] = aTemp[a]
		}	
	this.changeCol = this.index.length;
	}


// ------------------ Dump Array as an HTML Table

function _DumpTable(sCaption,sOptions)
	{
	var bChangedOnly = false
	var bSerialize = false
	var bFilter = false
	var bHeader = true
	var bGenRow = true;
	var bHasOpts;
	var sBuffer = ""
	
	if (arguments.length < 1) sCaption = ""
	if (arguments.length > 1)
		{
		var aOpts = String(sOptions).toUpperCase().split(",")
		
		for (var a=0;a<aOpts.length;a++)
			{
			switch (aOpts[a])
				{
				case "CHANGED":	
					bChangedOnly = true;
					bHasOpts = true
					break;
				case "NOHEADER":	
					bHeader = false;
					break;
				}
			}
		}
	else
		{
		bHasOpts = false
		}
	sBuffer += "<table cellspacing='0' cellpadding='0' border='1' width='100%'>"
	sBuffer += "<tr><td bgcolor='cccccc' colspan='100' align='center'><b>" + sCaption + "</b></td></tr>"
	if (bHeader)
		{
		sBuffer += "<tr><td bgcolor='cccccc'>&nbsp;</td><td bgcolor='cccccc'>" + this.data[0].join("</td><td bgcolor='cccccc'>") + "</td></tr>"
		}
	
	for (var a=1;a<this.data.length;a++)
		{
		bGenRow = false;
		if (!bHasOpts) bGenRow = true
		else
			{
			if (bChangedOnly)
				{
				if (this.isRowDirty(a)) bGenRow = true;
				}
			}
		
		if (bGenRow)
			{
			sBuffer += "<tr><td bgcolor='cccccc'>" + a + "</td><td>";
			sBuffer += this.data[a].join("&nbsp;</td><td>") + "&nbsp;</td></tr>";
			}
		}
	sBuffer += "</table>";
	return sBuffer;
	}
	Table.prototype.dump = _DumpTable;

// ------------------ Get the Size of the Array

function _GetCount()
	{
	return this.data.length;
	}
	Table.prototype.count = _GetCount;

// ------------------ Get A Value from the Array

function _GetValue(iRow,iCol,sFormat)
	{
	var vReturn = ""
	var iIndex
		
	if (String(iCol).search(/[^0-9]/) >= 0)
		{
		vReturn = this.data[iRow][this.index[iCol]];
		iIndex = this.index[iCol]
		}
	else
		{
		vReturn = this.data[iRow][iCol];
		iIndex = iCol
		}

	if (arguments.length < 3)
		{
		sFormat = "";
		if (String(this.types[iIndex]) != "undefined") sFormat = this.types[iIndex]
		}

	if (sFormat != "")
		{
		switch (String(sFormat).toUpperCase())
			{
			case "INT":
				vReturn = parseInt(vReturn,10);
				break;
			case "FLOAT":
			case "E":
				if (String(this.enums[iCol]) != "undefined") vReturn = this.enums[iCol][vReturn];
				break;
			case "D":
				vReturn = this.formatDate(vReturn);
				break;
			case "DA":
			case "ANSI":
				vReturn = this.formatANSIDate(vReturn);
				break;
			case "N":
				vReturn = parseFloat(vReturn);
				break;
			case "$":
				vReturn = this.currency(vReturn);
				break;
			}
		}
	return vReturn;
	}
	Table.prototype.get = _GetValue;


// ------------------ Generate a Form Element

function _Table_GetInput(iRow,iCol,sFormat)
	{
	var sBuffer
	var sVal = this.get(iRow,iCol,"NF")
	}
	Table.prototype.input = _Table_GetInput;


// ------------------ Set A Value in the Array

function _SetValue(iRow,iCol,sVal)
	{
	if (String(iCol).search(/[^0-9]/) >= 0)
		{
		this.data[iRow][this.index[iCol]] = sVal;
		}
	else
		{
		this.data[iRow][iCol] = sVal;
		}
	}
	Table.prototype.set = _SetValue;


// ------------------ Return Change Status

function _CheckDirty(sCols)
	{
	for (var a=1;a<this.data.length;a++)
		{
		if (this.isRowDirty(a)) return true;
		}
	return false;
	}
	Table.prototype.isDirty = _CheckDirty;


// ------------------ Return Changed Rows

function _CheckRowDirty(iRow, sCols)
	{
	if (this.data[iRow].join("\3") != this.orig[iRow].join("\3")) return true;
	return false;
	}
	Table.prototype.isRowDirty = _CheckRowDirty;


// ------------------ Return Changed Rows

function _GetRow(iRow)
	{
	return this.data[iRow];
	}
	Table.prototype.getRow = _GetRow;


// ------------------ Add a New Row

function _NewRow()
	{
	var aTypes = this.types
	var iCount;
	var iRow = this.data.length

	if (this.types.length > 0)
		{
		iCount = aTypes.length
		}
	else
		{
		iCount = this.data[0].length
		}
	
	this.data[iRow] = new Array()
	this.orig[iRow] = new Array()
	for (var a=0;a<iCount;a++)
		{
		if (aTypes == "")
			{
			this.data[iRow][a] = ""
			this.orig[iRow][a] = ""
			}
		else
			{
			switch (aTypes[a])
				{
				case "N":
					this.data[iRow][a] = "0";
					this.orig[iRow][a] = "0";
					break;
				default:
					this.data[iRow][a] = "";
					this.orig[iRow][a] = "";
				}
			}
		}
	return this.data[iRow];
	}
	Table.prototype.newRow = _NewRow;


// ================================================================
// D A T A   T Y P E S
// ================================================================

// ------------------ Set Datatypes of Return Strings
// C = Character / String (will be quoted)
// N = Numeric (will not be quoted)
// D = Date (will be quoted)
// E = Enumeration

function _SetDataTypes(s)
	{
	this.types = s.split(",")
	}
	Table.prototype.setTypes = _SetDataTypes;


function _SetEnum(key,arr)
	{
	this.enums[key] = arr;
	}
	Table.prototype.setEnum = _SetEnum;





// ================================================================
// T E M P L A T E   R E S O L U T I O N
// ================================================================

function _Table_Resolve_Template(sTemplate, iIndex)
	{
	sTemplate = String(sTemplate)
	var oTemp = this.data[iIndex];
	var s
	for (var a in this.index)
		{
		i = this.index[a]
		s = "{" + a + "}"
		s = new RegExp(s,"g")

		if (sTemplate.search(s) >= 0)
			{
			sTemplate = sTemplate.replace(s,this.get(iIndex,a))
			}
		}
	return sTemplate
	}
	Table.prototype.resolve = _Table_Resolve_Template;

// ================================================================
// D A T A   F O R M A T   F U N C T I O N S
// ================================================================

function _Table_FormatCurrency(amt) 
	{
	var a, s;
	amt = String(amt);
	amt = amt.replace(/([^.0-9_]*|\s*)(\d*)/g, "$2");
	if(!/\.{1}/.test(amt)) { amt = amt + "."; }
	a = new Array().concat(amt.split("."));
	s = "";
	for(var i = a[0].length - 1; i >= 0; i--) {	s += a[0].charAt(i); }
	s = s.replace(/(\d{3})/g, "$1,");
	a[0] = "";
	for(var i = s.length - 1; i >= 0; i--) { a[0] += s.charAt(i); }
	while(a[1].length < 2) { a[1] += "0"; }
	return a[0].replace(/^\,(.*)/, "$1") + "." + a[1].slice(0, 2);
	}
	Table.prototype.currency = _Table_FormatCurrency;


function _Table_FormatDate(s)
	{
	var d = new Date(s)
	var sBuffer = this.pad(d.getMonth() + 1) + "/" + this.pad(d.getDate()) + "/" + d.getFullYear()
	if (sBuffer.search(/[^0-9\/]/) >= 0) sBuffer = ""
	return sBuffer;
	}
	Table.prototype.formatDate = _Table_FormatDate;

function _Table_FormatANSIDate(s)
	{
	var d
	if (arguments.length > 0) d = new Date(s)
	else d = new Date()
	var sBuffer =  d.getFullYear() + "-" + this.pad(d.getMonth() + 1) + "-" + this.pad(d.getDate())
	if (sBuffer.search(/[^0-9\-]/) >= 0) sBuffer = ""
	return sBuffer;
	}
	Table.prototype.formatANSIDate = _Table_FormatANSIDate;

function _Table_Pad(s,count)
	{
	if (arguments.length < 2) count = 2;
	s = "0000000000000000000" + s
	s = s.substr(s.length - count, count)
	return s;
	}
	Table.prototype.pad = _Table_Pad;
	
// ================================================================
// G E N E R A L   T A B L E   R O U T I N E S
// ================================================================

// ------------------ Generate an array from a serialized string

function genTable(sRaw)
	{
	var oRows = sRaw.split("\2")
	var oTemp = new Array()
	for (var a=0;a<oRows.length;a++)
		{
		oTemp[a] = oRows[a].split("\3")
		}
	return oTemp;
	}


function hiliteObj(obj)
	{
	try {
		obj.style.backgroundColor = "#F2F6D5";
		}
	catch (e) {}
	}

function normObj(obj)
	{
	try {
		obj.style.backgroundColor = "";
		}
	catch (e) {}
	}

