var lastTableNumber;
var lastColumnNumber;
var lastOrder;
var tables;
var selectedColour = '';

function sortTableRows (table)
{
	// get all tables in this document
	tables = document.getElementById(table);
	// iterate through all the tables, to make the tables sortable
	
		// check if the table uses the thead-element
		//var thead = tables.getElementsByTagName ('thead');
		//if (thead.length > 0) var headerRow = thead[0].getElementsByTagName ('tr')[0];
		// if not, use the first row of this table as header
		//var rows = tables.getElementsByTagName ('tr');
		//for(var rowNumber = 1; rowNumber<rows.length;rowNumber++)
		//{
		//	rows[rowNumber].onmouseover = rollOver;
		//	rows[rowNumber].onmouseout = rollOut;
		//}
		
		
		var headerRow = tables.getElementsByTagName ('tr')[0];

		// iterate through all the th-elements, to add the onclick event with the 'sortColumn'-function attached
		tableHeaders = headerRow.getElementsByTagName ('th');
		var thCount = tableHeaders.length-1;
		for (var columnNumber = 1; columnNumber < thCount; columnNumber++)
		{
			// attach the 'sortColumn'-function
			if (!document.all && document.getElementById)
			{
				// this method works fine in Mozillla, but IE doesn't do anything, really.
				// It's a pity, 'cause when using the setAttribute-function you can style
				// the element with CSS using:
				//     th[onclick] { /* some properties here */ }
				tableHeaders[columnNumber].setAttribute ('onclick', 'sortColumn(' + columnNumber + ');');
			}
			else if (document.all && document.getElementById)
			{
				tableHeaders[columnNumber]['onclick'] = new Function ('sortColumn(' + columnNumber + ')');
				tableHeaders[columnNumber].style.cursor = 'hand';
			}
		}
		
		//sortColumn(2);
}

function sortColumn (columnNumber)
{
	// set some variables we're going to use
	var rowData = new Array ();
	var rowDataSorted = new Array ();
	var rowToBeRemoved = new Array ();
	var rowToBeInserted = new Array ();
	var table, rows, order;

	
	// check whether it should be ordered ascending or descending
	if (lastTableNumber == 0 && lastColumnNumber == columnNumber)
	{
		if (lastOrder == 'ascending') order = 'descending';
		else if (lastOrder == 'descending') order = 'ascending';
	}
	else order = 'ascending';

	// in case there is a tbody-element, we'll use the rows nested in this element ...
	table = tables;
	var headerRow = table.getElementsByTagName ('tr')[0];
	tableHeaders = headerRow.getElementsByTagName ('th');
	var thCount = tableHeaders.length-1;
	for (var i = 1; i < thCount; i++)
	{		
		if(columnNumber == i)
		{
			tableHeaders[i].className = (tableHeaders[i].className == "filter-idle" || tableHeaders[i].className == "filter-down")?"filter-up":"filter-down";
		}
		else
		{
			tableHeaders[i].className = "filter-idle";
		}
	}
	tbody = table.getElementsByTagName ('tbody');
	if (tbody.length > 0)
	{
		var tbody = table.getElementsByTagName ('tbody')[0];
		var firstRow = 0;
	}
	// ... otherwise we'll use the rows that are directly nested in the table-element, starting with the second (assuming the first row is the header)
	else
	{
		var tbody = table;
		var firstRow = 1;
	}
	
	// put all the rows in an array, so we can access each easily
	rows = tbody.getElementsByTagName ('tr');
	
	// iterate through the rows, and put the data according to which the table must be sorted in an array
	var rlcount = rows.length;
	var data = '';
	for (var rowNumber = 1; rowNumber < rlcount; rowNumber++)
	{
		if(rows[rowNumber].getElementsByTagName ('td')[columnNumber].firstChild == null) {
			data = "";
		}
		else {
			data = rows[rowNumber].getElementsByTagName ('td')[columnNumber].firstChild.nodeValue;
		}
		rowData[rowData.length] = new Array (rowNumber, data);
	}

	// choose the relevant sorting method, according to the first row:
	//   - the data is numeric
	if (rowData[0][1].match(/^[0-9][0-9] [A-Z][a-z][a-z] [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [A-Z][A-Z]+$/)){rowDataSorted = rowData.sort(date);}
    else if (rowData[0][1].match(/^[\d\.]+$/)) rowDataSorted = rowData.sort (numeric);
	else rowDataSorted = rowData.sort (normal);

	// iterate through the rows, that now are in the correct order ...
	var rdsCount = rowDataSorted.length
	for (var x = 0; x < rdsCount; x++)
	{
		originalRow = rows[(rowDataSorted[x][0])];
	
		// ... create a clone of the orignal row, and register it to be inserted in its new place ...
		rowToBeInserted[rowToBeInserted.length] = originalRow.cloneNode (true);
		
		//rowToBeInserted[rowToBeInserted.length-1].getElementsByTagName ('td')[0].getElementsByTagName('input')[0].checked = originalRow.getElementsByTagName ('td')[0].getElementsByTagName('input')[0].checked;
		// ... and register the original row to be removed, because its place isn't correct anymore
		rowToBeRemoved[rowToBeRemoved.length] = originalRow;
		
	}

	// reverse order if we sort this column descending
	if (order == 'descending') rowToBeInserted.reverse ();

	// insert the clones into the table's body
	var rtiCount = rowToBeInserted.length
	for (var x = 0; x < rtiCount; x++)
	{
		// the following two lines are for the alternate row colorrowToBeInserted[x].getAttribute ('class') + 
		if (x%2)
		{
			//var oldClass = rowToBeInserted[x].getAttribute ('class');
			//oldClass = oldClass.replace ('odd', '');
			//oldClass = oldClass.replace ('even', '');
			//rowToBeInserted[x].style.backgroundColor = 'F7F7F7';
		}
		else
		{
			//var oldClass = rowToBeInserted[x].getAttribute ('class');
			//oldClass = oldClass.replace ('odd', '');
			//oldClass = oldClass.replace ('even', '');
			//rowToBeInserted[x].style.backgroundColor = 'E7E7FF';
		}
		//var cbx = rowToBeInserted[x].getElementsByTagName ('td')[0].getElementsByTagName('input')[0].checked;
		tbody.appendChild (rowToBeInserted[x]);
		//tbody.children[tbody.children.length-1].getElementsByTagName('td')[0].getElementsByTagName('input')[0].checked = cbx;
	}
	// remove the original, now superfluous, rows
	var rtrCount =rowToBeRemoved.length;
	for (var x = 0; x < rtrCount; x++)
	{
		tbody.removeChild (rowToBeRemoved[x]);
	}

	// register a class to the header of the column according to which the table has been sorted, so one can style a ascending and descending sorted column differently
	// check if the table uses the thead-element
	//if (thead = tables[tableNumber].getElementsByTagName ('thead')) headerRow = thead[0].getElementsByTagName ('tr')[0];
	// if not, use the first row of this table as header
	headerRow = tables.getElementsByTagName ('tr')[0];

	// iterate through all the th-elements, to add the onclick event with the 'sortColumn'-function attached
	tableHeaders = headerRow.getElementsByTagName ('tr');
	var tbhCount = tableHeaders.length;
	for (var columnNumberTwo = 0; columnNumberTwo < tbhCount; columnNumberTwo++)
	{
		if (columnNumberTwo == columnNumber) tableHeaders[columnNumberTwo].setAttribute ('class', order);
		else tableHeaders[columnNumberTwo].setAttribute ('class', '');
	}
	

	
	// remember according to which column from which table we've sorted, and in what order, so when one sorts this column again, we sort it in reverse order
	lastTableNumber = 0;
	lastColumnNumber = columnNumber;
	lastOrder = order;
}



function sortWatchListTableRows (table)
{
	// get all tables in this document
	tables = document.getElementById(table);
	// iterate through all the tables, to make the tables sortable
	
		// check if the table uses the thead-element
		//var thead = tables.getElementsByTagName ('thead');
		//if (thead.length > 0) var headerRow = thead[0].getElementsByTagName ('tr')[0];
		// if not, use the first row of this table as header
		//var rows = tables.getElementsByTagName ('tr');
		//for(var rowNumber = 1; rowNumber<rows.length;rowNumber++)
		//{
		//	rows[rowNumber].onmouseover = rollOver;
		//	rows[rowNumber].onmouseout = rollOut;
		//}
		
		
		var headerRow = tables.getElementsByTagName ('tr')[0];

		// iterate through all the th-elements, to add the onclick event with the 'sortColumn'-function attached
		tableHeaders = headerRow.getElementsByTagName ('th');
		var thCount = tableHeaders.length-1;
		for (var columnNumber = 0; columnNumber <= thCount; columnNumber++)
		{
			// attach the 'sortColumn'-function
			if (!document.all && document.getElementById)
			{
				// this method works fine in Mozillla, but IE doesn't do anything, really.
				// It's a pity, 'cause when using the setAttribute-function you can style
				// the element with CSS using:
				//     th[onclick] { /* some properties here */ }
				tableHeaders[columnNumber].setAttribute ('onclick', 'sortWatchListColumn(' + columnNumber + ');');
			}
			else if (document.all && document.getElementById)
			{
				tableHeaders[columnNumber]['onclick'] = new Function ('sortWatchListColumn(' + columnNumber + ')');
				tableHeaders[columnNumber].style.cursor = 'hand';
			}
		}
		
		//sortColumn(2);
}

function sortWatchListColumn (columnNumber)
{
	// set some variables we're going to use
	var rowData = new Array ();
	var rowDataSorted = new Array ();
	var rowToBeRemoved = new Array ();
	var rowToBeInserted = new Array ();
	var table, rows, order;

	
	// check whether it should be ordered ascending or descending
	if (lastTableNumber == 0 && lastColumnNumber == columnNumber)
	{
		if (lastOrder == 'ascending') order = 'descending';
		else if (lastOrder == 'descending') order = 'ascending';
	}
	else order = 'ascending';

	// in case there is a tbody-element, we'll use the rows nested in this element ...
	table = tables;
	var headerRow = table.getElementsByTagName ('tr')[0];
	tableHeaders = headerRow.getElementsByTagName ('th');
	var thCount = tableHeaders.length-1;
	for (var i = 0; i <= thCount; i++)
	{		
		if(columnNumber == i)
		{
			tableHeaders[i].className = (tableHeaders[i].className == "filter-idle" || tableHeaders[i].className == "filter-down")?"filter-up":"filter-down";
		}
		else
		{
			tableHeaders[i].className = "filter-idle";
		}
	}
	tbody = table.getElementsByTagName ('tbody');
	if (tbody.length > 0)
	{
		var tbody = table.getElementsByTagName ('tbody')[0];
		var firstRow = 0;
	}
	// ... otherwise we'll use the rows that are directly nested in the table-element, starting with the second (assuming the first row is the header)
	else
	{
		var tbody = table;
		var firstRow = 1;
	}
	
	// put all the rows in an array, so we can access each easily
	rows = tbody.getElementsByTagName ('tr');
	
	// iterate through the rows, and put the data according to which the table must be sorted in an array
	var rlcount = rows.length;
	var data = '';
	for (var rowNumber = 1; rowNumber < rlcount; rowNumber++)
	{
		if(rows[rowNumber].getElementsByTagName ('td')[columnNumber].firstChild == null) {
			data = "";
		}
		else {
			data = rows[rowNumber].getElementsByTagName ('td')[columnNumber].firstChild.nodeValue;
		}
		rowData[rowData.length] = new Array (rowNumber, data);
	}

	// choose the relevant sorting method, according to the first row:
	//   - the data is numeric
	if (rowData[0][1].match(/^[0-9][0-9] [A-Z][a-z][a-z] [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [A-Z][A-Z]+$/)){rowDataSorted = rowData.sort(date);}
    else if (rowData[0][1].match(/^[\d\.]+$/)) rowDataSorted = rowData.sort (numeric);
	else rowDataSorted = rowData.sort (normal);

	// iterate through the rows, that now are in the correct order ...
	var rdsCount = rowDataSorted.length
	for (var x = 0; x < rdsCount; x++)
	{
		originalRow = rows[(rowDataSorted[x][0])];
	
		// ... create a clone of the orignal row, and register it to be inserted in its new place ...
		rowToBeInserted[rowToBeInserted.length] = originalRow.cloneNode (true);
		
		//rowToBeInserted[rowToBeInserted.length-1].getElementsByTagName ('td')[0].getElementsByTagName('input')[0].checked = originalRow.getElementsByTagName ('td')[0].getElementsByTagName('input')[0].checked;
		// ... and register the original row to be removed, because its place isn't correct anymore
		rowToBeRemoved[rowToBeRemoved.length] = originalRow;
		
	}

	// reverse order if we sort this column descending
	if (order == 'descending') rowToBeInserted.reverse ();

	// insert the clones into the table's body
	var rtiCount = rowToBeInserted.length
	for (var x = 0; x < rtiCount; x++)
	{
		// the following two lines are for the alternate row colorrowToBeInserted[x].getAttribute ('class') + 
		if (x%2)
		{
			//var oldClass = rowToBeInserted[x].getAttribute ('class');
			//oldClass = oldClass.replace ('odd', '');
			//oldClass = oldClass.replace ('even', '');
			//rowToBeInserted[x].style.backgroundColor = 'F7F7F7';
		}
		else
		{
			//var oldClass = rowToBeInserted[x].getAttribute ('class');
			//oldClass = oldClass.replace ('odd', '');
			//oldClass = oldClass.replace ('even', '');
			//rowToBeInserted[x].style.backgroundColor = 'E7E7FF';
		}
		//var cbx = rowToBeInserted[x].getElementsByTagName ('td')[0].getElementsByTagName('input')[0].checked;
		tbody.appendChild (rowToBeInserted[x]);
		//tbody.children[tbody.children.length-1].getElementsByTagName('td')[0].getElementsByTagName('input')[0].checked = cbx;
	}
	// remove the original, now superfluous, rows
	var rtrCount =rowToBeRemoved.length;
	for (var x = 0; x < rtrCount; x++)
	{
		tbody.removeChild (rowToBeRemoved[x]);
	}

	// register a class to the header of the column according to which the table has been sorted, so one can style a ascending and descending sorted column differently
	// check if the table uses the thead-element
	//if (thead = tables[tableNumber].getElementsByTagName ('thead')) headerRow = thead[0].getElementsByTagName ('tr')[0];
	// if not, use the first row of this table as header
	headerRow = tables.getElementsByTagName ('tr')[0];

	// iterate through all the th-elements, to add the onclick event with the 'sortColumn'-function attached
	tableHeaders = headerRow.getElementsByTagName ('tr');
	var tbhCount = tableHeaders.length;
	for (var columnNumberTwo = 0; columnNumberTwo < tbhCount; columnNumberTwo++)
	{
		if (columnNumberTwo == columnNumber) tableHeaders[columnNumberTwo].setAttribute ('class', order);
		else tableHeaders[columnNumberTwo].setAttribute ('class', '');
	}
	

	
	// remember according to which column from which table we've sorted, and in what order, so when one sorts this column again, we sort it in reverse order
	lastTableNumber = 0;
	lastColumnNumber = columnNumber;
	lastOrder = order;
}




function numeric (foo, bar)
{
	valueOne = foo[1];
	valueTwo = bar[1];
	return valueOne - valueTwo;
}

function normal (foo, bar)
{
	x = new Array (foo[1], bar[1]);
	x.sort ();
	if (x[0] == foo[1]) return -1;
	else if (x[0] == x[1]) return 0;
	else return 1;
}

function date(foo,bar)
{
	x = new Array(foo[1],bar[1]);
	if ( eval(ConvertDate(x[0])>ConvertDate(x[1])) ) {
		temp=x[1]; 
		x[1] = x[0]; 
		x[0]=temp;	
	}
	if (x[0] == foo[1]) return -1;
	else if (x[0] == x[1])return 0;
	else	{ return 1;	 }
}



function ConvertDate(DT){


var D = DT.substring(0,2);
var M = DT.substring(3,6);
var Y = DT.substring(7,11);
var T = DT.substring(12,DT.length-3);

switch(M)
{
	case "Jan":M = "01";break;
	case "Feb":M = "02";break;
	case "Mar":M = "03";break;
	case "Apr":M = "04";break;
	case "May":M = "05";break;
	case "Jun":M = "06";break;
	case "Jul":M = "07";break;
	case "Aug":M = "08";break;
	case "Sep":M = "09";break;
	case "Oct":M = "10";break;
	case "Nov":M = "11";break;
	case "Dec":M = "12";break;
}
return Y+""+M+""+D+T
}



function rollOver()
{    
	this.className += "_over";
	this.title = "Edit"
}
    
function rollOut()
{
	this.className = this.className.replace("_over","");
}


function rollOverQuickLink()
{    
	this.className = this.className + '_over';
}
    
function rollOutQuickLink()
{
	this.className = this.className.replace("_over","");
}
        
function toggleJoinCheckBox(checkboxChecked)
{
	var objTRNode = checkboxChecked.parentNode.parentNode;
	if (checkboxChecked.checked)
	{
		objTRNode.className = 'selectedactiveclass';
	}
	else
	{
		
		objTRNode.className = 'resultsitemclass';
	}
	//var strNewClassName = removeOver(objTRNode.className);
	//strNewClassName = strNewClassName
}

function selectAll(blnselect)
{	
	var rows = tables.getElementsByTagName ('tr');
	for(var rowNumber = 1; rowNumber<rows.length;rowNumber++)
	{
		tableColumn = rows[rowNumber].getElementsByTagName ('td')[0];
		checkbox = tableColumn.getElementsByTagName('input')[0];
		if(!checkbox.disabled){
			checkbox.checked = blnselect;
			if (blnselect) rows[rowNumber].className = 'selectedactiveclass';
			else rows[rowNumber].className = 'resultsitemclass';
		}
	}
	
}



// Lock table header functions

function lockCol(tblID) {
  var table = document.getElementById(tblID);
  var button = document.getElementById('toggle');
  var cTR = table.getElementsByTagName('tr');  //collection of rows

  if (table.rows[0].cells[0].className == '') {
    for (i = 0; i < cTR.length; i++)
    {
    var tr = cTR.item(i);
    tr.cells[0].className = 'locked'
    }
    button.innerText = "Unlock First Column";
  } else {
    for (i = 0; i < cTR.length; i++)
        {
    var tr = cTR.item(i);
    tr.cells[0].className = ''
    }
    button.innerText = "Lock First Column";
  }
}


