var tableColDefs=new Array();
var tableRows=new Array();
var tableSort=new Array();
var tableFlt=new Array();
var tableLinks=new Array();

function updateTable(sID,iStartRow) {
	var i,sType,iWidth,x,target
	var thead,tbody,tr,td,th
	var table = document.getElementById(sID);
	var ar_coldefs=tableColDefs[sID];
	var ar_rows=tableRows[sID];
	var bShowRow=false;
	
	//filter active?
	var sFilter=tableFlt[sID];
	if (typeof tableFlt[sID] != "string") {
		sFilter='';
		tableFlt[sID]=sFilter;
	}
	sFilter=sFilter.toLowerCase();
	
	if (isNaN(iStartRow)) iStartRow=0;
	var starttime=new Date();
	var checktime = 0;
	
	window.status="Creating table";
	// create header
	thead=table.tHead;
	if (thead) {
		
		if (thead.rows.length == 0) {
			tr=thead.insertRow(0);
			for (i=0; i < ar_coldefs.length; i++) {
				th=tr.insertCell(tr.cells.length);
				x="<a href=\"javascript:sortTable('" + sID + "'," + i + ");\">"+ ar_coldefs[i][0] + "</a>";
				th.innerHTML=x;
				sType=ar_coldefs[i][1];
				iWidth=ar_coldefs[i][2];
				th.width=iWidth*8;				
				if ( sType == 'n' ) {
					th.align='right';
				} else {
					th.align='left';
				}
			}
		}
	} // else add header row to body
	
	tbody=table.tBodies[0];
	var iRows = ar_rows.length;
	var iCurrentRow=iStartRow;
	
	for (i=iStartRow; i < iRows; i++) {

		if (sFilter != '') {
			x='';
			for (j=1; j<ar_rows[i].length; j++) {
				
				switch ( ar_coldefs[j-1][1] ) {
					case 't': 
						x+=ar_rows[i][j]+' ';
						break;
					case 'n':
						x+=ar_rows[i][j][1]+' ';
						break;
					case 'd':
						x+=ar_rows[i][j][1]+' ';
						break;
					default:
						x+=ar_rows[i][j]+' ';
						break;
				}
			}
			
			x=x.toLowerCase();
			if (x.indexOf(sFilter) < 0 ) { continue; }
		}
		
		if (iCurrentRow > tbody.rows.length - 1) {
			// add row
			tr=tbody.insertRow(tbody.rows.length);
		} else {
			tr=tbody.rows[iCurrentRow];
		}
		
		for (j=1; j<ar_rows[i].length; j++) {
			
			if (j > tr.cells.length ) {
				td=tr.insertCell(tr.cells.length);
			} else {
				td=tr.cells[j-1];
			}
			
			switch ( ar_coldefs[j-1][1] ) {
				case 't':
					td.innerHTML=ar_rows[i][j];
					td.align='left';
					break;
				case 'n':
					td.innerHTML=ar_rows[i][j][1];
					td.align='right';
					break;
				case 'd':
					td.innerHTML=ar_rows[i][j][1];
					td.align='left';
					break;
				default:
					td.innerHTML=ar_rows[i][j];
					td.align='left';
					break;
			}
			
			if (tableLinks[sID]) {
				if (tableLinks[sID][0] == j) {
					x=td.innerHTML;
					target='';
					if (tableLinks[sID][2]) { target=' target='+tableLinks[sID][2]; }
					x="<a href=\""+tableLinks[sID][1].replace("@0",ar_rows[i][0])+"\"" + target +">"+x+"</a>";
					td.innerHTML=x;
				}
			}
			
		}
		if ( checktime++ > 100 ) {
			
			testtime=new Date();
			
			checktime=0;
			if (testtime - starttime > 500) {
				setTimeout("updateTable('"+sID+"',"+i+")",50);
				break;
			}
		}
		iCurrentRow++;
		
	}	
	window.status="";
	
}

function sortTable(sID,iColumn) {
	var ar_coldefs=tableColDefs[sID];
	var sType=ar_coldefs[iColumn][1];
	var i
	var iRows=tableRows[sID].length;
	
	// if tableSort already set to iColumn, just reverse
	if ( tableSort[sID] == iColumn ) {
		tableRows[sID]=tableRows[sID].reverse();
		updateTable(sID);
		return;
	}
	
	var sortrows=new Array();
	tableSort[sID]=iColumn;
	for (i=0;i<iRows;i++) {
		sortrows[i]=new Array();
		switch (sType) {
			case 't':
				sortrows[i][0]=tableRows[sID][i][iColumn+1].toLowerCase();
				sortrows[i][1]=tableRows[sID][i];
				break;
			case 'n':
				sortrows[i][0]=tableRows[sID][i][iColumn+1][0]+0;
				sortrows[i][1]=tableRows[sID][i];
				break;
			case 'd':
				sortrows[i][0]=tableRows[sID][i][iColumn+1];
				sortrows[i][1]=tableRows[sID][i];
				break;
			default:
				sortrows[i][0]=tableRows[sID][i][iColumn+1].toLowerCase();
				sortrows[i][1]=tableRows[sID][i];
		}
	}

	switch (sType) {
		case 't': sortrows.sort(sortrowsText); break;
		case 'n': sortrows.sort(sortrowsNum); break;
		case 'd': sortrows.sort(sortrowsText); break;
		default: sortrows.sort(sortrowsText);
	}

	for (i=0; i<sortrows.length; i++) {	
		tableRows[sID][i]=sortrows[i][1];
	}
	
	updateTable(sID);
	
}

function sortrowsText(a,b) {
	if (a[0]+'' > b[0]) { return 1; }
	if (a[0]+'' < b[0]) { return -1;}
	return 0;
}
function sortrowsNum(a,b) { 
	return a[0] - b[0]; 
}
function filterTable(sID,sFilter) {
	
	if ( tableFlt[sID] == sFilter ) { return; }
	var table=document.getElementById(sID);
	var tbody=table.tBodies[0];
	while (tbody.rows.length > 0) {
		tbody.deleteRow(0);
	}
	tableFlt[sID]=sFilter;
	updateTable(sID);
}

