var TableManager = new Object();
var forceOnColumns = new Array();
var isHTMLTable = false;

var companyColumns = null;
var criteriaColumns = null;
var phaseColumns = null;
var advancedQuotesColumns = null;
var	basicQuotesColumns = null;

function setSameWindow(on){
	savePreference("sameWindow", on);
	ajaxTables_sameWindow = on;
}

var controlsdrawn = false;

function thumbnailsChange(){
	refreshTables();
	if(ajaxCharts_chartsPerRow > 4 || ajaxCharts_chartsPerRow < 1) ajaxCharts_chartsPerRow = 1;
	if(!chartsWasOn && (ajaxCharts_chartsOn && ajaxCharts_chartsPerRow > 0)){
		for(var i = 0; i < TableManager.tables.length; i++){
			getCharts(getRowSymbols(TableManager.tables[i].element.id), TableManager.tables[i].chartProfile);
		}
	}
}

function showCompany(on){
	savePreference("companyInfoOn", on);
	showColumns(companyColumns, on);
}
function showCriteria(on){
	savePreference("criteriaOn", on);
	showColumns(criteriaColumns, on);
}
function showPhase(on){
	savePreference("phaseOn", on);
	showColumns(phaseColumns, on);
	
}
function showBasicQuotes(on){
	setBasicQuotes(on);
	showColumns(basicQuotesColumns, on);
	if(!on){
		document.getElementById('setControl_DetailQuotes').checked = false;
		showDetailedQuotes(on);
	}
}
function showDetailedQuotes(on){
	setAdvancedQuotes(on);
	showColumns(advancedQuotesColumns, on);
	if(on){
		document.getElementById('setControl_BasicQuotes').checked = true;
		showBasicQuotes(on);
	}
}

function showColumns(cols, on){
	for(var i = 0; i < cols.length; i++){
		cols[i].show(on);
	}
}
function showAdvanced(on){
	savePreference("advancedOn", on);
	ajaxTables_advancedOn = on;
	if(on){
		$('tr#advancedControls').show();
		$('a#advancedSwitch').html('Hide Controls');
	}else{
		$('tr#advancedControls').hide();
		$('a#advancedSwitch').html('Customize This View');
	}
}
function refreshTables() {
	if(TableManager.tables == null) return;
	for(var l = 0; l < TableManager.tables.length; l++){
		TableManager.tables[l].refresh();
	}
}

if (window.attachEvent) {
    var clearElementProps = [
        'data',
        'onmouseover',
        'onmouseout',
        'onmousedown',
        'onmouseup',
        'ondblclick',
        'onclick',
        'onselectstart',
        'oncontextmenu'
    ];


    window.attachEvent("onunload", function() {
    	var obj = document.getElementById("contentArea");
    	if( obj ) {
    	    obj.style.display = "none";
    	    var el;
    	    for(var d = document.all.length;d--;){
                el = document.all[d];
                el.formatter = null;
                el.lastValue = null;
                el.lastClass = null;
                for(var c = clearElementProps.length;c--;){
                    el[clearElementProps[c]] = null;
                }
            }
        }
    });
}
function purgeTable(table){
	if(!document.all || table == null) return;
	for(var i = 0; i < table.rows.length; i++){
		for(var f = 0; f < table.rows[i].fields.length; f++){
			if(table.rows[i].fields[f] != null){
				table.rows[i].fields[f].element = null;
				table.rows[i].fields[f] = null;
			}
		}
		table.rows[i].element = null;
	}
	table.rows = null;
	for(var i = 0; i < table.columns.length; i ++){
		table.columns[i].element = null;
		table.columns[i] = null;
	}
	table.element = null;
	table.table = null;
	CM.chartManager.charts = new Array();
	CollectGarbage();
}
function purgeElement(element){
	if(!document.all) return;
	var el;
    for(var d = element.all.length;d--;){
    	el = element.all[d];
        el.formatter = null;
        el.lastValue = null;
        el.lastClass = null;
        for(var c = clearElementProps.length;c--;){
        	el[clearElementProps[c]] = null;
		}
	}
	CollectGarbage();
}
TableManager.Table = function(tableXML, replace, initialSort){

	this.chartRows = new Array();
	onThumbnailsChange = thumbnailsChange;
	if(TableManager.tables == null)
		TableManager.tables = new Array();
	criteriaColumns = new Array();
	companyColumns = new Array();
	phaseColumns = new Array();
	advancedQuotesColumns = new Array();
	basicQuotesColumns = new Array();
	this.lastWhite = false;
	this.table = document.createElement("table");
	this.table.setAttribute("cellSpacing", "0");
	this.table.setAttribute("cellPadding", "4");
	this.element = document.createElement("tbody");
	this.table.appendChild(this.element);
	var location = replace;
	if(location < 0){
		location = TableManager.tables.length;
	}
	if(location < TableManager.tables.length)
		purgeTable(TableManager.tables[location]);
	TableManager.tables[location] = this;
	var attbs = tableXML.attributes;
	this.element.id = attbs.getNamedItem('id').value;
	this.chartProfile = new CM.ChartManager.ChartProfile(this.element.id);
	this.chartProfile.companyInfo = false;
	
	var selectors = document.getElementById(this.element.id+"_rowSelector");
	if(selectors != null){
		this.selectors = selectors;
	}



	var columnsXML = tableXML.getElementsByTagName('column');
	this.columns = new Array();
	this.columnSets = new Array();
	this.superColRow = document.createElement("tr");
	this.superColRow.className = "resultsColoredRow";
	this.element.appendChild(this.superColRow);
	this.colRow = document.createElement("tr");
	this.colRow.className = "resultsColoredRow";
	this.element.appendChild(this.colRow);
	for(var i = 0; i < columnsXML.length; i++){
		var colsetName = columnsXML[i].attributes.getNamedItem("set").value;
		var set = colsetName;
		var subSet = columnsXML[i].attributes.getNamedItem("superColumn");
		if(subSet != null && subSet.value.length > 0)
			set = subSet.value;
		var columnSet = this.getSuperColumn(set);
		var newCol = new TableManager.Table.Column(columnsXML[i], columnSet, this, i);
		this.columns.push(newCol);
		if(colsetName.indexOf("Company") > -1){
			if(!companyInfoOn)
				newCol.show(false);
			companyColumns.push(newCol);
		}
		if(colsetName.indexOf("Phase") > -1){
			if(!phaseOn)
				newCol.show(false);
			phaseColumns.push(newCol);
		}
		if(colsetName.indexOf("Criteria") > -1){
			if(!criteriaOn)
				newCol.show(false);
			criteriaColumns.push(newCol);
		}
		if(colsetName.indexOf("Quotes") > -1){
			if(newCol.value.indexOf("Last") > -1 | newCol.value.indexOf("%") == 0){
				if(!ajaxQuotes_quotesBasic)
					newCol.show(false);
				basicQuotesColumns.push(newCol);
			}else{
				if(!ajaxQuotes_quotesDetailed)
					newCol.show(false);
				advancedQuotesColumns.push(newCol);
			}
		}
	}
	if(initialSort == null)
		initialSort = -1;
	this.sortColumnIndex = initialSort;
	
	var rowsXML = tableXML.getElementsByTagName('row');
	
	this.rows = new Array();
	
	for(var i = 0; i < rowsXML.length; i++){

		this.rows[i] = new TableManager.Table.Row(rowsXML[i], this.columns, this);
		//if(i == 0)
		//	QuoteManager.ReqSymbols = this.rows[i].symbol;
		//else
		//	QuoteManager.ReqSymbols += ","+this.rows[i].symbol;
			
	}
	var tableContainer = document.getElementById(this.element.id+"_container");
	
	purgeElement(tableContainer);
	tableContainer.innerHTML = "";
	tableContainer.appendChild(this.table);
	var displayControles = document.getElementById(this.element.id+"_displayControls");
	if(displayControles != null){
		this.setDisplayControles(displayControles);
	}
	if(ajaxCharts_chartsOn && ajaxCharts_chartsPerRow > 0)
		getCharts(getRowSymbols(this.element.id), this.chartProfile);
	this.refresh();
	//startQuotesPreBuilt();
}
TableManager.Table.prototype = {

	getSuperColumn:function(name) {
		if(name != "Criteria")
			for(var i = 0; i < this.columnSets.length; i++){
				if(this.columnSets[i].display == name)
					return this.columnSets[i];
			}
		return new TableManager.Table.SuperColumn(this, name);
	},
	setDisplayControles:function(element){
		if(true) return;
		if(controlsdrawn) return;
		else controlsdrawn = true;	
		var html = new Array();
		html.push('<table><tr><td>');
		
		//html.push('<input onclick="showThumbnails(this.checked);wlStartQuotes();" id=chk_chartsOn ');
		//if(ajaxCharts_chartsOn)
		//	html.push("checked=true ");
		//html.push('type="checkbox" class="checkboxbtn">Show Thumbnails</input>');
		
		html.push('</td> ');
		
		var panelName = "Customize This View";
		if(ajaxTables_advancedOn) panelName = "Hide Controls";
		html.push('<td width=300px /><td><a id=advancedSwitch href="javascript:showAdvanced(!ajaxTables_advancedOn);">'+panelName+'</a></td>');
		html.push('</tr>');
		var hidden = 'style=\'display:none;\'';
			if(ajaxTables_advancedOn)
				hidden = "";
		html.push('<tr valign="top" id=advancedControls '+hidden+' ><td class=box2Wrap valign="top" colspan=3 width="500px"><table  width=100% style="vertical-align: top;" >');
		html.push('<tr><td><b>Columns</b>');
		
		var checked = "";
		if(companyInfoOn)
			checked = "checked";
		if(companyColumns.length > 0)
			html.push('<br/><input onclick="companyInfoOn = this.checked;showCompany(this.checked);" ' +
				'id=setControl_Company '+ checked + ' ' +
				'type="checkbox" class="checkboxbtn">Company Info</input> ');
		
		if(criteriaOn)
			checked = "checked";
		else
			checked = "";
		if(criteriaColumns.length > 0)
			html.push('<br/><input onclick="criteriaOn = this.checked;showCriteria(this.checked);"  '+
				'id=setControl_Criteria '+ checked + ' ' +
				'type="checkbox" class="checkboxbtn">Criteria</input> ');

		if(!readOnly){
			if(phaseOn)
				checked = "checked";
			else
				checked = "";
			if(phaseColumns.length > 0)
				html.push('<br/><input onclick="phaseOn = this.checked;showPhase(this.checked);" '+
					'id=setControl_Phase '+ checked + ' ' +
					'type="checkbox" class="checkboxbtn">Phase 1 & 2 Scores</input> ');

		}
		if(ajaxQuotes_quotesBasic)
			checked = "checked";
		else
			checked = "";
		html.push('<br/><input onclick="ajaxQuotes_quotesBasic = this.checked;showBasicQuotes(this.checked);"  '+
			'id=setControl_BasicQuotes '+checked + ' ' +
			'type="checkbox" class="checkboxbtn">Basic Quotes</input> ');
			
		if(ajaxQuotes_quotesDetailed)
			checked = "checked";
		else
			checked = "";
		html.push('<br/><input onclick="ajaxQuotes_quotesDetailed = this.checked;showDetailedQuotes(this.checked);"  '+
			'id=setControl_DetailQuotes '+checked + ' ' +
			'type="checkbox" class="checkboxbtn">Detailed Quotes</input> ');
			
		intervalDisabled = (ajaxQuotes_quotesBasic | ajaxQuotes_quotesDetailed);
		html.push("<br/>Quotes Interval: <select id=updateInterval_sel "+intervalDisabled+
			" onchange='changeUpdateInterval(\"updateInterval_sel\");' >");
		for (var t = 5; t <= 65; t+=5){
			if(t == 65) val = 0;
			else val = t;
			html.push("<option value='"+val+"' ");
			if((val * 1000) == updateFrequencyMillis)
				html.push(" selected=true ");
			html.push(">");
			if(t == 60)
				html.push("1 min");
			else if(t == 65)
				html.push("Off");
			else
				html.push(t+" secs");
			html.push("</option>");
		}
		html.push("</select>");
		
		html.push("</td><td valign=top><b>Thumbnails</b>");
		
		if(ajaxCharts_chartsOnly)
			checked = "checked";
		else
			checked = "";
		html.push('<br/><input onclick="ajaxCharts_chartsOnly = this.checked;chartsOnlyOn(this.checked);wlStartQuotes();" ' +
				'id=chartControl_ChartsOnly '+ checked + ' ' +
				'type="checkbox" class="checkboxbtn">Show Charts Only</input> ');
		
		html.push("<br/>Arrange Charts <select id=chartsPerRowSel "+
			" onchange='changeChartsPerRow(getSelectedValue(\"chartsPerRowSel\"));' >");
		for (var i = 1; i < 5; i++){
			html.push("<option value='"+i+"' ");
			if(i == ajaxCharts_chartsPerRow)
				html.push(" selected=true ");
			html.push(">" + i + " Across</option>");
		}
		html.push("</select>");
		
		if(ajaxCharts_chartStudies)
			checked = "checked";
		else
			checked = "";
		html.push('<br/><input onclick="ajaxCharts_chartStudies = this.checked;chartsStudiesOn(this.checked, \''+this.chartProfile.id+'\');" ' +
				'id=chartControl_studies '+ checked + ' ' +
				'type="checkbox" class="checkboxbtn">Show Studies</input> ');
		if(ajaxCharts_chartVolume)
			checked = "checked";
		else
			checked = "";
		html.push('<br/><input onclick="ajaxCharts_chartVolume = this.checked;chartsVolumeOn(this.checked, \''+this.chartProfile.id+'\');" ' +
				'id=chartControl_volume '+ checked + ' ' +
				'type="checkbox" class="checkboxbtn">Show Volume</input> ');
		if(ajaxCharts_chartEvents)
			checked = "checked";
		else
			checked = "";
		html.push('<br/><input onclick="ajaxCharts_chartEvents = this.checked;chartsEventsOn(this.checked, \''+this.chartProfile.id+'\');" ' +
				'id=chartControl_events '+ checked + ' ' +
				'type="checkbox" class="checkboxbtn">Show Events</input> ');
				
		html.push("</td><td valign=top><b>Snapshots and Option Chains</b>");
		var samewindow = "";
		var popwindow = "checked";
		if(ajaxTables_sameWindow){
			var samewindow = "checked";
			var popwindow = "";
		}
			
		html.push("<br/><input onclick='setSameWindow(true);'  "+samewindow+" type=radio name=opt_sameWindow value=false>Open in same window");
		html.push("<br/><input onclick='setSameWindow(false);' "+popwindow+" type=radio name=opt_sameWindow value=true>Open in new window");
		html.push('</td>');
		html.push('</tr></table></td></tr>');
		html.push('</table>');
		element.innerHTML = html.join("");
		
	},
	clear:function(){
		var id = this.element.id;
		this.table.removeChild(this.element);
		this.element = document.createElement("tbody");
		this.element.id = id;
		this.table.appendChild(this.element);
	},
	refresh:function(){
		this.clear();
		var perRow = ajaxCharts_chartsPerRow;
		var on = ajaxCharts_chartsOn;
		var rowsOn = true;
		if(ajaxCharts_chartsOn && ajaxCharts_chartsOnly) rowsOn = false;
		if(ajaxCharts_chartsOn && ajaxCharts_chartsOnly){
			on = true;
			if(perRow == 0)
				perRow = 2;
		}
		if(rowsOn){
			this.element.appendChild(this.superColRow);
			this.element.appendChild(this.colRow);
		}
		var chartSymbols = new Array();
		for(var i = 0; i < this.rows.length; i++){
			if(rowsOn){
				if(((i + 2) % 2) == 0)
					this.rows[i].element.className = "";
				else
					this.rows[i].element.className = "resultsColoredRow";
				this.element.appendChild(this.rows[i].element);
			}
			chartSymbols.push(this.rows[i].chart);
			if(!rowsOn){
				if(this.rows[i].chart.toprow.firstChild != this.rows[i].selector)
					this.rows[i].chart.toprow.insertBefore(this.rows[i].selector,
						this.rows[i].chart.toprow.firstChild);
			}else{
				if(this.rows[i].element.firstChild != this.rows[i].selector)
					this.rows[i].element.insertBefore(this.rows[i].selector,
						this.rows[i].element.firstChild);
			}
			if(on && perRow > 0 && chartSymbols.length == perRow){
				this.element.appendChild(getChartRow(chartSymbols, !rowsOn));
				chartSymbols = new Array();
			}
		}
		if(on && perRow > 0 && chartSymbols.length > 0){
			this.element.appendChild(getChartRow(chartSymbols, !rowsOn));
			chartSymbols = new Array();
		}

		setSymbolContexts();
	}
}
TableManager.Table.SuperColumn = function(tableObj, name){
	this.display = name;
	this.name = name;
	if(this.name.indexOf(" ") > -1)
		this.name = this.name.substring(0, this.name.indexOf(" "));
	if(this.name == "default" || this.name == "Chart" || this.name == "Criteria")
		this.display = "";
	tableObj.columnSets.push(this);
	this.columns = new Array();
	this.colspan = 0;
	this.element = document.createElement("td");
	this.element.align = "center";
	this.element.innerHTML = "<b>"+this.display+"</b>";
	tableObj.superColRow.appendChild(this.element);
	this.table = tableObj;	
}
TableManager.Table.SuperColumn.prototype = {

	addColumn:function(column) {
		this.colspan++;
		this.element.setAttribute("colSpan", this.colspan);
		this.columns.push(column);
	}
}
TableManager.Table.Column = function(columnXML, columnSet, table, Index){
	this.table = table;
	this.colSet = columnSet;
	columnSet.addColumn(this);
	var attbs = columnXML.attributes;
	this.fields = new Array();
	this.index = Index;
	this.element = document.createElement("td");
	table.colRow.appendChild(this.element);
	this.element.setAttribute("id", attbs.getNamedItem('id').value);
	this.value = "";
	if(attbs.getNamedItem('value') != null)
		this.value = attbs.getNamedItem('value').value;
	this.currentSortAscending = true;
	
	if(this.value != null)
		this.element.innerHTML = //this.value;
			'<a style="color:black;" href="javascript:'+
			'sortTable(\''+ this.table.element.id +'\', \''+this.index+'\');">' + this.value + '</a>';
    this.format = attbs.getNamedItem('format').value;
    this.sorttype = attbs.getNamedItem('sortType').value;
    if(this.sorttype.indexOf("ouble") > -1 || this.sorttype.indexOf("atio"))
    	this.currentSortAscending = false;
    this.formatter = getFormatter(this.format);
    if (this.formatter == "Snapshot"){
		this.link = contextPath + '/graphs/snapshot.iedu?symbol=';
	} else if(this.formatter == "Options"){
		this.link = contextPath + '/graphs/option/listed.iedu?symbol=';
	} else if(this.formatter == "Tagged"){
		this.buttonTag = "<input id=ID type=\"button\" class=\"button\" value=\"Tag\" onclick=\"tag(this.id)\" onMouseOver=\"this.className='button-hover';\" onMouseOut=\"this.className='button';\" style=\"font-size:9px; height:16px; width: 45px;\">";
		this.buttonUntag = "<input id=ID type=\"button\" class=\"button\" value=\"Untag\" onclick=\"untag(this.id)\" onMouseOver=\"this.className='button-hover';\" onMouseOut=\"this.className='button';\" style=\"font-size:9px; height:16px; width: 45px; font-weight: bold;\">";
	}
}
TableManager.Table.Column.prototype = {

	setSort:function(on) {
		var html = '<A style="color:black;" href="javascript:'+
			'sortTable(\''+ this.table.element.id +'\', \''+this.index+'\');">' + this.value + '</A>';
		if(on){
			var sortImgName = (this.currentSortAscending)? 'up_sort_arrow.gif' : 'down_sort_arrow.gif';
			var sortImgUrl = contextPath+'/images/' + sortImgName;
			html =	'<TABLE cellspacing="1" cellpadding="1" border="0" width="100%"><TR>'+
        		'<TD><IMG src="' + sortImgUrl + '" width="7" height="4" border="0">'+
				'</TD><TD style="vertical-align: top;text-align:center;">'+html+"</TD></TR></TABLE>";
		}
		
		this.element.innerHTML = html;
	},
	show:function(on){
		var display = "";
		if(!on)
			display = "none";
		this.element.style.display = display;
		if(this.colSet.display.indexOf("uotes") > -1){
			var colspan = 0;
			if(ajaxQuotes_quotesDetailed)
				colspan += 3;
			if(ajaxQuotes_quotesBasic)
				colspan += 2;
			if(colspan == 0){
				this.colSet.element.style.display = display;
			}else{
				this.colSet.element.style.display = "";
				this.colSet.colspan = colspan;
				this.colSet.element.setAttribute("colSpan", colspan);
			}
		}else
			this.colSet.element.style.display = display;
		for(var i = 0; i < this.fields.length; i++){
			this.fields[i].element.style.display = display;
		}
	}
}
TableManager.Table.Row = function(rowXML, columns, table){
	//this.quoteFields = new Array();
	var attbs = rowXML.attributes;
	this.table = table;
	this.element = document.createElement("tr");
	this.symbol = null;
	this.company = "N/A";
	this.chart = null;
	if(table.lastWhite)
		this.element.className = "resultsColoredRow";
	table.lastWhite = !table.lastWhite;
	table.element.appendChild(this.element);
	this.element.id = attbs.getNamedItem('id').value;
	this.selector = document.createElement("td");
	this.selector.innerHTML = '<input class="checkboxbtn" type="checkbox"  '+
		'onClick="changeAllButton(\''+table.element.id+'\', null)" value="'+this.element.id+'" '+
		'name="select_checkbox" id="chk_'+this.element.id+'"/>';
	this.element.appendChild(this.selector);
	

	var fieldsXML = rowXML.getElementsByTagName('field');
	this.fields = new Array();
	var c = -1;
	for(var i = 0; i < fieldsXML.length; i++){
		var fieldAttbs = fieldsXML[i].attributes;
		
		symbolLink = $(fieldsXML[i]).text();
		
		c = getElementIndex(columns, fieldAttbs.getNamedItem('id').value, c);
		if(c > -1){
			this.fields[c] = new TableManager.Table.Row.Field(this, columns[c], fieldAttbs, symbolLink);
		}
		if(this.symbol != null && this.chart == null){
			this.chart = new TableManager.Table.Row.Chart(this.symbol);
		}
	}
	
	var exch = attbs.getNamedItem('exchange').value;
	//new QuoteManager.Quote(this.symbol, this.quoteFields);
	if(exch == "N/A"){
		exch = "";
	}
	this.chart.compName.innerHTML = "<table width=100%><tr><td class='smallBoldLabel'>"+
		this.company+"&nbsp;("+attbs.getNamedItem('exchange').value+")"+
		"&nbsp;<a href='javascript:popWindow(\""+getLink("Snapshot")+this.symbol+"\")'>"+this.symbol+"</a></td><td align=right>"+
		getTradeLink(this.element.id)+"</td></tr></table>";

	for(var i = 0; i < this.fields.length; i++){
		if(this.fields[i] != null)
			this.element.appendChild(this.fields[i].element);
	}
}

TableManager.Table.Row.Chart = function(symbol){
	this.togehter == true;

	var optionDisplay = false;
	if(opt != null && opt)
		optionDisplay = true;
	this.compName = document.createElement("td");
	
	this.toprow = document.createElement("tr");
	this.toprow.appendChild(this.compName);
	
	this.lastrade = document.createElement("tr");
	this.phase1 = document.createElement("td");
	this.vvol = document.createElement("td");
	this.vvol.nowrap = "noWrap";
	this.vvol.setAttribute("align", "right");
	this.fe = document.createElement("td");
	this.fe.setAttribute("align", "right");
	this.pp = document.createElement("td");
	this.opt = document.createElement("td");
	this.opt.setAttribute("align", "right");
	
	
	this.element = document.createElement("table");
	var body1 = document.createElement("tbody");
	this.element.appendChild(body1);
	var tr = document.createElement("tr");
	body1.appendChild(tr);
	var td = document.createElement("td");
	tr.appendChild(td);
	var table = document.createElement("table");
	table.width = "100%";
	td.appendChild(table);
	body2 = document.createElement("tbody");
	table.appendChild(body2);
	tr = document.createElement("tr");
	body2.appendChild(tr);
	
	td = document.createElement("td");
	td.colSpan = 2;
	tr.appendChild(td);
	table = document.createElement("table");
	table.width = "100%";
	td.appendChild(table);
	var body3 = document.createElement("tbody");
	table.appendChild(body3);
	body3.appendChild(this.toprow);
	
	if(!optionDisplay){
	
		tr = document.createElement("tr");
		body2.appendChild(tr);
		td = document.createElement("td");
		tr.appendChild(td);
		table = document.createElement("table");
		table.cellSpacing = "0";
		table.cellPadding = "0";
		table.setAttribute("height", "5px");
		td.appendChild(table);
		var body3 = document.createElement("tbody");
		table.appendChild(body3);
		body3.appendChild(this.lastrade);
		this.lastrade.setAttribute("align", "left");
		td = document.createElement("td");
		td.innerHTML = "Last";
		td.width = "15px";
		this.lastrade.appendChild(td);
		tr.appendChild(this.opt);
		tr = document.createElement("tr");
		body2.appendChild(tr);
		tr.appendChild(this.phase1);
		tr.appendChild(this.fe);
		tr = document.createElement("tr");
		body2.appendChild(tr);
		tr.appendChild(this.pp);
		tr.appendChild(this.vvol);
	
	}
	
	
	this.tableHolder = document.createElement("tr");
	body1.appendChild(this.tableHolder);
	
	this.chartTable = document.createElement("td");
	this.tableHolder.appendChild(this.chartTable);
	this.url = contextPath + '/images/empty_chart.gif';
	if(this.chart != null)
		this.url = chart.url;
	this.chartTable.innerHTML = "<span class='ajaxChartSpan' symbol='"+symbol+"'><img class='AjaxChart' height=220 width=300 src='"+this.url+"'></span>";

}
var onceAL = 1;
TableManager.Table.Row.Field = function(row, column, fieldAttbs, symbolLink){
	this.column = column;
	if(column == null) return;
	this.row = row;
	this.element = document.createElement("td");
	this.column.fields.push(this);
	this.marked = "unmarked";
	if(fieldAttbs.getNamedItem('marked') != null){
		this.marked = fieldAttbs.getNamedItem('marked').value;
	}
	var val;
	if(fieldAttbs == null){
		this.id = "N/A";
	}else{
		this.id = fieldAttbs.getNamedItem('id').value;
		val = fieldAttbs.getNamedItem('value');
	}
	this.element.setAttribute("id", this.id);
	this.element.setAttribute("name", this.id);
	if(this.column.element.style.display == "none")
		this.element.style.display = "none";
	this.element.noWrap = true;
	//this.element.setAttribute("nowrap", "nowrap");
	if(val == null || val.value == null)
		this.value = "N/A";
	else
		this.value = val.value;
		
	var formatter = column.formatter;
	this.popup = "N/A";
	var popupval = fieldAttbs.getNamedItem('popup');
	if(popupval != null)
		this.popup = popupval.value;
		
	if(this.column.value == "Last Price"){
		this.ajax = true;
		//this.row.quoteFields.push(new QuoteManager.Quote.Field(
		//	this.row.symbol, "price", quoteFormatters[0], this.element));
		this.element.setAttribute("class", "BQ");
		this.element.className = "BQ";
		var td = document.createElement("td");
		td.setAttribute("width", "15px");
		this.row.chart.lastrade.appendChild(td);
		var pr = document.createElement("td");
		pr.className = 'smallBoldLabel';
		//this.row.quoteFields.push(new QuoteManager.Quote.Field(
		//	this.row.symbol, "price", quoteFormatters[0], pr));
		pr.innerHTML = formatter.call(this, this.value, true, this.id);
		this.row.chart.lastrade.appendChild(pr);
		
	}else if(this.column.value == "$ Change"){
		this.element.setAttribute("class", "BQ");
		this.element.className = "BQ";
		this.ajax = true;
		//this.row.quoteFields.push(new QuoteManager.Quote.Field(
		//	this.row.symbol, "change", quoteFormatters[1], this.element));
		var td = document.createElement("td");
		td.setAttribute("width", "15px");
		this.row.chart.lastrade.appendChild(td);
		var dolch = document.createElement("td");
		dolch.className = 'smallBoldLabel';
		//this.row.quoteFields.push(new QuoteManager.Quote.Field(
		//	this.row.symbol, "change", quoteFormatters[1], dolch));
		dolch.innerHTML = formatter.call(this, this.value, true, this.id);
		this.row.chart.lastrade.appendChild(dolch);
	}else if (this.column.value == "% Change"){
		this.element.setAttribute("class", "BQ");
		this.element.className = "BQ";
		this.ajax = true;
		//this.row.quoteFields.push(new QuoteManager.Quote.Field(
		//	this.row.symbol, "percChange", quoteFormatters[2], this.element));
		var td = document.createElement("td");
		td.setAttribute("width", "15px");
		this.row.chart.lastrade.appendChild(td);
		var perch = document.createElement("td");
		perch.className = 'smallBoldLabel';
	//	this.row.quoteFields.push(new QuoteManager.Quote.Field(
	//		this.row.symbol, "percChange", quoteFormatters[2], perch));
		perch.innerHTML = formatter.call(this, this.value, true, this.id);
		this.row.chart.lastrade.appendChild(perch);

	}else if (this.column.value == "Volume"){
		this.element.setAttribute("class", "BQ");
		this.element.className = "BQ";
		this.ajax = true;
	//	this.row.quoteFields.push(new QuoteManager.Quote.Field(
	//		this.row.symbol, "volume", quoteFormatters[3], this.element));
	}else if(this.column.value.indexOf("V V") > -1){
		this.element.setAttribute("class", "BQ");
		this.element.className = "BQ";
		this.ajax = true;
	//	this.row.quoteFields.push(new QuoteManager.Quote.Field(
	//		this.row.symbol, "vvpercChange", quoteFormatters[8], this.element));
			
		var t = document.createElement("table");
		this.row.chart.vvol.appendChild(t);
		var tb = document.createElement("tbody");
		t.appendChild(tb);
		var tr = document.createElement("tr");
		tb.appendChild(tr);
		var label = document.createElement("td");
		label.innerHTML = "V V% Chg.:&nbsp;";
		this.row.chart.width = "150";
		var data = document.createElement("td");
		data.innerHTML = formatter.call(this, this.value, true, this.id);
		
		data.className = "smallBoldLabel";
		//data.style.color = color;
		//data.innerHTML = plus + val +"%";
		tr.appendChild(label);
		tr.appendChild(data);
		//this.row.quoteFields.push(new QuoteManager.Quote.Field(
		//	this.row.symbol, "vvpercChange", quoteFormatters[8], data));
	} else if(this.column.value == "Phase 1"){
	
		var xs = this.value.substring(0, this.value.indexOf("/"));
		var ys = this.value.substring(this.value.indexOf("/") + 1, this.value.length);
		var x = parseInt(xs);
		var y = parseInt(ys);
		if(y > x || x < 5)
			this.arrow = "<img src='" + contextPath + "/common/images/arrow_down.gif'/>";
		else if (x >= 5)
			this.arrow = "<img src='" + contextPath + "/common/images/arrow_up.gif'/>";
		else
			this.arrow = "<img src='" + contextPath + "/common/images/spacer.gif' height='9px' width='11px'/>";
		this.row.chart.phase1.innerHTML = "Phase 1 Score:&nbsp;<span class='smallBoldLabel'>"+
			isNA(this.value) +"</span>"+this.arrow;
	}else if(this.column.value == "F/E Score"){
		var chartArrow ="";
		if(parseFloat(this.value) < 2){
			this.arrow = "<img src='" + contextPath + "/common/images/arrow_down.gif'/>";
			chartArrow = this.arrow;
		}else if (parseFloat(this.value) >= 3.25){
			this.arrow = "<img src='" + contextPath + "/common/images/arrow_up.gif'/>";
			chartArrow = this.arrow;
		}else
			this.arrow = "<img src='" + contextPath + "/common/images/spacer.gif' height='9px' width='11px'/>";
		var v = isNA(""+this.value);
		if(v == "null") v = "N/A";
		this.row.chart.fe.innerHTML = "F/E Score:&nbsp;<span class='smallBoldLabel'>"+
			v +"</span>"+chartArrow;
	}else if(this.column.value == "Price Pattern"){
		if(parseFloat(this.value) <= 2)
			this.arrow = "<img src='" + contextPath + "/common/images/arrow_down.gif'/>";
		else if (parseFloat(this.value) >= 2.5)
			this.arrow = "<img src='" + contextPath + "/common/images/arrow_up.gif'/>";
		else
			this.arrow = "<img src='" + contextPath + "/common/images/spacer.gif' height='9px' width='11px'/>";
			
		this.row.chart.pp.innerHTML = "Price Pattern:&nbsp;<span class='smallBoldLabel'>"+
			isNA(this.value) +"</span>"+this.arrow;
	}else if(this.column.element.id == "Name"){
		this.popup = this.value;
		if(this.value.length > 20){
			this.value = this.value.substring(0, 17);
			this.value = this.value+" ...";
		}
		this.row.company = this.popup;
	}
	if(column.link != null){
		var link = "";
		var linkVal = fieldAttbs.getNamedItem('link').value;
		if(linkVal == "row"){
			linkVal = row.element.id;
			link = symbolLink;
			//link = "<a href='javascript:popWindow(\""+column.link+linkVal+"\");'>"+this.value+"</a>";
		}else if(linkVal == "field"){
			linkVal = this.value;
			link = "<a href='javascript:popWindow(\""+column.link+linkVal+"\");'>"+this.value+"</a>";
		}else if(linkVal == "none")
			link = "";
		else
			link ="<a href='javascript:popWindow(\""+column.link+linkVal+"\");'>"+linkVal+"</a>";

		if(this.column.value.indexOf("Symbol") > -1){
			if(this.row.symbol == null)
				this.row.symbol = this.value;
			link = "<table width=100%><tr><td align=left>"+link+"</td><td align=right>"+
				getTradeLink(this.value) + "</td></tr></table>";
		}
		this.element.innerHTML = link;
		if(this.column.value == "Options"){
			this.row.chart.opt.innerHTML = link;
		}
	}else if(column.buttonTag != null){
		if(this.marked == "marked"){
			this.element.innerHTML = this.column.buttonUntag.replace("ID", this.element.id+"_b");
			
			this.element.childNodes[0].id = "button_"+this.row.element.id;
			this.row.element.style.fontWeight = "bold";
		}else{
			this.element.innerHTML = this.column.buttonTag.replace("ID", this.element.id+"_b");
			this.element.childNodes[0].id = "button_"+this.row.element.id;
			this.row.element.style.fontWeight = "normal";
		}
	}else{
		var html = "";
		html = formatter.call(this, this.value, true, this.id);
		
		if(this.arrow != null){
			html = "<table width=100%><tr><td align=left>"+html+"</td><td align=right>"+
				this.arrow+"</td>";
		}
		this.element.innerHTML = html;
	}
	var tiptext = getTipText(this);
	var tipwidth = 120;
	if(this.column.value == "Symbol")
		tipwidth = 160;
	this.element.onmouseover = function(){
		ddrivetip(tiptext, tipwidth);}
	this.element.onmouseout = function(){
		hideddrivetip();}
	
}
function getTipText(field){
	var colname = field.column.value;
	if(field.column.colSet != null)
		colname = field.column.colSet.display + " " + colname;
	var showVal = false;
	if(colname == null) colname = field.column.value;
	if(field.column.value == "Symbol"){
		val = field.popup;
		width = 140;
		return val;
	}else if(field.column.value == "Name"){
		colname = "Company Name";
		val = field.popup;
		val = replaceAll(val, "\"", "&#8217;");
		showVal = true;
	}else if(field.column.value == "Industry"){
		showVal = true;
		val = field.popup;
		width = 120;
	}
	if(colname.indexOf("\"") > -1){
		once = true;
		val = field.row.element.id + "<br/>" + field.column.id;
		val = replaceAll(val, "'", "&#8217;");
		val = replaceAll(val, "\"", "&#8217;");
		return field.row.element.id + "<br/>" + field.column.id;
	}
	var tip = field.row.element.id + "<br/>" + colname;
	if(showVal)
		tip = tip + " = <br/>"+val;
	tip = tip.replace("'", "&#8217;");
	return tip;
	//field.tip = "ddrivetip(\""+tip+"\", "+width+")";
	//return field.tip;
}
function replaceAll(val, charic, rep){
	while (val.indexOf(charic) > -1)
		val = val.replace(charic, rep);
	return val;
}
var once = false;
function isInArray(array, val){
	for(var i = 0; i < array.length; i++){
		if(array[i].indexOf(val) > -1)
			return true;
	}
	return false;
}
function getTableIndex(id){
	return getElementIndex(TableManager.tables, id);
}
function getTable(id){
	if(TableManager.tables != null)
		return TableManager.tables[getTableIndex(id)];
	return null;
}

function getElementIndex(array, id, start){
	if(array == null || id == null || id.length == 0) return -1;
	if(start == null)
		start = -1;
	var end = start;
	start++;
	if(end < 0) end = array.length;
	var test = ""+id;
	
	for(var i = start; i != end; i++){
		if(i >= array.length) i = 0;
		if(test.indexOf(array[i].element.id) == 0)
			return i;
	}
	return -1;
}
function getRowSymbols(tableId){
	var table = getTable(tableId);
	if(table == null) return null;
	var ids = new Array();
	for(var i = 0; i < table.rows.length; i++){
		ids.push(table.rows[i].symbol);
	}
	return ids;
}
function getRows(check, tableId, all){
	if(all == null) all = false; 
	var table = getTable(tableId);
	if(table == null) return;
	var htmlTable = table.element;
	if (!htmlTable) return;
	var htmlRemove = document.getElementById(tableId+"_remove_btn");
	var checkboxes = htmlTable.getElementsByTagName('input');
	if(htmlRemove != null)
		if(check)
			htmlRemove.disabled = false;
		else
			htmlRemove.disabled = true;
	var ids = new Array();
	for(var i=0; i < checkboxes.length; i++){
		if(checkboxes[i].name == "select_checkbox"){
		
			if(checkboxes[i].checked && htmlRemove != null) htmlRemove.disabled = false;
			if(checkboxes[i].checked || all){
				ids.push(checkboxes[i].id.replace("chk_", ""));
			}
			if(check != null){
				if(check){
					checkboxes[i].checked = true;
					if(htmlRemove != null) htmlRemove.disabled = false;
				}else{
					if(htmlRemove != null) htmlRemove.disabled = true;
					checkboxes[i].checked = false;
				}
			}
		}
	}
	return ids;
}
function changeAllButton(tableid, newCheckSetting){
	var table = getTable(tableid);
	if (!table) return;
	if(newCheckSetting == null){
		newCheckSetting = (getRows(null, tableid).length == 0);
	}
	allButtonCheck = newCheckSetting;
	if (isHTMLTable){
		table.selectors = document.getElementById(tableid+"_rowSelector");
	}
	table.selectors.value=(newCheckSetting)? "Select All" : "Clear All";
	//Disable Add buttons if nothing is checked.
	var pf = document.getElementById("btnAddToPortfolioButton");
	var wl = document.getElementById("btnAddToWatchlistButton");
	if (pf && wl){
		pf.disabled = (newCheckSetting)? true : false;
		wl.disabled = (newCheckSetting)? true : false;
	}
}
var allButtonCheck = true;
function selectClearRows(tableId){
	getRows(allButtonCheck, tableId);
	changeAllButton(tableId, !allButtonCheck);
}
var sortColumn;
var sortDir;
function markSort(){
	sortColumn = TableManager.tables[0].sortColumnIndex;
	sortDir = TableManager.tables[0].columns[sortColumn].currentSortAscending;
}
function sortTable(tableId, columnIndex, Reverse){
	var table = getTable(tableId);
	if(table == null) return;
	if(table.sortColumnIndex > -1)
		table.columns[table.sortColumnIndex].setSort(false);
	if(table == null)
		return;
	var column = null;
	if(columnIndex == null) columnIndex = sortColumn;
	sortColumn = null;
	if(columnIndex != null){
		column = table.columns[columnIndex];
		if(Reverse == null) Reverse = (table.sortColumnIndex == columnIndex);
		if(Reverse)
			column.currentSortAscending = !column.currentSortAscending;
		if(sortDir != null){
			column.currentSortAscending = sortDir;
			sortDir = null;
		}
		table.sortColumnIndex = columnIndex;
	}else{
		column = table.columns[table.sortColumnIndex];
	}
	reversingSort = (!column.currentSortAscending);
	if(column.sorttype == 'Double'){
		table.rows.sort(doubleValueSorter);
	}else if(column.sorttype == 'Reverse_Double'){
		reversingSort = !reversingSort;
		table.rows.sort(reverseDoubleValueSorter);
	}else if(column.sorttype == 'Ratio'){
		table.rows.sort(ratioValueSorter);
	}else{
		table.rows.sort(stringValueSorter);
	}
	if (!column.currentSortAscending) {
    	table.rows.reverse();
	}
	table.columns[table.sortColumnIndex].setSort(true);
	table.refresh();
}
function stringValueSorter(rowA, rowB) {
    var valueA = rowA.fields[rowA.table.sortColumnIndex].value;
	if(valueA == null){
    	if(reversingSort) return -1;
    	else return 1;
    }	
	var valueB = rowB.fields[rowB.table.sortColumnIndex].value;
	if(valueB == null){
    	if(reversingSort) return 1;
    	else return -1;
	}
    if (valueA > valueB) {
        return 1;
    } else if (valueA < valueB) {
        return -1;
    } else {
        return 0;
    }
}
function ratioValueSorter(rowA, rowB) {
	table = rowA.table;
    var valueA = rowA.fields[rowA.table.sortColumnIndex].value;
    var valueAT = valueA.substring(0, valueA.lastIndexOf("/"));
    if (isNAValue(valueAT)){
    	if(reversingSort) return -1;
    	else return 1;
    }
    var valueB = rowB.fields[rowB.table.sortColumnIndex].value;
    var valueBT = valueB.substring(0, valueB.lastIndexOf("/"));
    if (isNAValue(valueBT)) 
    	if(reversingSort) return 1;
    	else return -1;
    if(valueAT != valueBT)
    	return valueAT - valueBT;
    var valueAB = valueA.substring(valueA.lastIndexOf("/") + 1);
    var valueBB = valueB.substring(valueB.lastIndexOf("/") + 1);
	if(isNAValue(valueAB))
    	valueAB = 0;
    if(isNAValue(valueBB))
    	valueBB = 0;
    return valueBB - valueAB;
}
function reverseDoubleValueSorter(rowA, rowB){
	return doubleValueSorter(rowB, rowA);
}
function isNAValue(value){
	return (value == null || value == NA_VALUE || value == 'NaN' || value == 'undefined' || value == 'null');
}
function doubleValueSorter(rowA, rowB) {
	table = rowA.table;
    var valueA = rowA.fields[rowA.table.sortColumnIndex].value;
    if (isNAValue(valueA)) {
    	if(reversingSort) return -1;
    	else return 1;
    }
    var valueB = rowB.fields[rowB.table.sortColumnIndex].value;
    if (isNAValue(valueB)) {
		if(reversingSort) return 1;
    	else return -1;
    }
    var floatValueA = parseFloat(valueA);
    var floatValueB = parseFloat(valueB);
    return floatValueA - floatValueB;
}


function getChartRow(chartSymbols, fullChart){
	var chartRow = document.createElement("tr");
	var td = document.createElement("td");
	td.setAttribute("colSpan", 20);
	chartRow.appendChild(td);
	var table = document.createElement("table");
	td.appendChild(table);
	table.style.valign = "top";
	table.width = "100%";
	table.cellSpacing = "5";
	table.cellPadding = "0";
	table.border = "0";
	var body = document.createElement("tbody");
	table.appendChild(body);
	var tr = document.createElement("tr");
	body.appendChild(tr);
	td = document.createElement("td");
	tr.appendChild(td);
	
	td.width = "12px";
	
	for (var c = 0; c < chartSymbols.length; c++){
		if(fullChart){
			td = document.createElement("td");
			tr.appendChild(td);
			td.appendChild(chartSymbols[c].element);
			if(!chartSymbols[c].togehter){
				chartSymbols[c].tableHolder.appendChild(chartSymbols[c].chartTable);
				chartSymbols[c].togehter = true;
			}
		}else{
			chartSymbols[c].togehter = false;
			tr.appendChild(chartSymbols[c].chartTable);
		}
		td = document.createElement("td");
		tr.appendChild(td);
		td.width = "12px";
	}
	
	td = document.createElement("td");
	tr.appendChild(td);
	td.width = "100%";
	
	return chartRow;
	
}
