<!--// which column is being sortedvar colsort;// ascending or descending?var oOrder;function getInnerText(el) {	if (typeof el == "string") return el;	if (typeof el == "undefined") { return el };	if (el.innerText) return el.innerText;	//Not needed but it is faster	var str = "";		var cs = el.childNodes;	var l = cs.length;	for (var i = 0; i < l; i++) {		switch (cs[i].nodeType) {			case 1: //ELEMENT_NODE				str += getInnerText(cs[i]);				break;			case 3:	//TEXT_NODE				str += cs[i].nodeValue;				break;		}	}	return str;}function colType(tbody,column) {tbody = document.getElementById(tbody);	// Work out a type for the column    if (tbody.rows.length <= 1) return;    var itm = getInnerText(tbody.rows[0].cells[column]);   	itm = itm.replace(/ /g,"");           	sortfn = "sort_caseinsensitive";	if (itm.match(/\d[\/-]\d{2}/)) sortfn = "sort_date";	else if (itm.match(/\d[:]\d\d/)) sortfn = "sort_date";	//else if (itm.match(/"Today"/)) sortfn = "sort_date";		else if (itm.match(/[£$]\d/)) sortfn = "sort_currency";	else if (itm.match(/[\d\.]/) && itm.match(/[a-z]/)) sortfn = "sort_caseinsensitive";		else if (itm.match(/[\d\.]/)) sortfn = "sort_numeric";		return sortfn;}function alternateRowColors(tbody) {	//fix Opera rendering bug	document.body.className = document.body.className;		var rowcolor = '#eeeeee';	var defaultrowcolor = '#ffffff';	var rows, arow;	var rowCount = 0;			tbody = document.getElementById(tbody)	rows = tbody.getElementsByTagName("tr");	for(var j=0;j<rows.length;j++) {		arow = rows.item(j);		if(arow.nodeName == "TR") {			if(rowCount % 2) {				arow.style.backgroundColor = rowcolor;			} else {				// default case				arow.style.backgroundColor = defaultrowcolor;			}			rowCount++;		}			}	rowCount = 0;}function formatDate(input) {	input = input.replace(/[\-]/g,"/");	dt = (input.match(/\d[\/-]\d{2}/)) ? 1:0;	tm = (input.match(/\d[:]\d\d/)) ? 1:0;	verbose=dt*tm;						if (verbose) {		// both date and time		input += "";						parts = input.split(" ");		timepart = parts.pop();				if (timepart.match(/[pP]/)) add = 12;		else add = 0;				hrs = timepart.split(":");		hr = hrs[0] * 1;		hr += add;		hr +="";		if (hr.length==1) hr = "0" + hr;				time = hr + ":" + hrs[1].substr(0,2);		input = parts[0] + " " + time;				}				else if (tm) {		// date eq today		if (input.match(/[pP]/)) add = 12;		else add = 0;				hrs = input.split(":");		hr = hrs[0] * 1;		hr += add;		hr +="";		if (hr.length==1) hr = "0" + hr;				time = hr + ":" + hrs[1].substr(0,2);				month = now.getMonth();		month++;		date = now.getDate();		year = now.getFullYear();		input = month + "/" + date + "/" + year + " "  + time;				}				else {		// date only		input += " 23:59";		}				inp = input.split(" ");				// need to account for "\/-"		yearpart = inp[0].split("/");				for (i=0; i<yearpart.length; i++) {			if (yearpart[i].length<2) yearpart[i] = "0" + yearpart[i];		}				y2k = "";		if (yearpart[2].length==2) {			if (yearpart[2]*1 > 50) {				y2k = 19;				alert(yearpart[2]);			}			else y2k = 20;		}				newtime = y2k + yearpart[2] + "/" + yearpart[0] + "/" + yearpart[1] + "." + inp[1];				return newtime;		}function sortTableRows(oTableItem,oColumn,oSortType,oOrder,oIgnoreRows,oIgnoreClass) {// toggle the sort orderoOrder = (colsort==oColumn) ? 0:1colsort = oOrder ? oColumn:-1;setHeaders(oTableItem,oColumn,oOrder)/*if (oOrder) {cols[i].className = "tablesort";document.images["sort"+oColumn].src = sortup.src}elsedocument.images["sort"+oColumn].src = sortdown.src*/oSortType = colType(oTableItem,oColumn);	if( !document.childNodes || !document.appendChild ) { return; }	oTableItem = document.getElementById(oTableItem);	//prepare the custom sorting function	var trimSpace = /^\s+|\s+$/g, oPadding = unescape('%00');	var sortFunc = function (a,b) {			var c = totalValueOf(a.quickCells[oColumn]).replace(trimSpace,'');			var d = totalValueOf(b.quickCells[oColumn]).replace(trimSpace,'');					switch (oSortType) {				case "sort_caseinsensitive":					//alpha sort					while( c.length > d.length ) { d += oPadding; }					while( d.length > c.length ) { c += oPadding; }					return ( oOrder ? ( d > c ) : ( c > d ) ) ? -1 : 1;					break;							case "sort_date":				c = formatDate(c);								d = formatDate(d);								while( c.length > d.length ) { d += oPadding; }				while( d.length > c.length ) { c += oPadding; }				return ( oOrder ? ( d > c ) : ( c > d ) ) ? -1 : 1;								break;								case "sort_currency":				//numeric sort				c = parseFloat(c.replace(/[$£]/g,""));				d = parseFloat(d.replace(/[$£]/g,""));				if( isNaN(c) ) { c = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					if( isNaN(d) ) { d = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					//'Infinity - Infinity' is NaN, and IE throws an error					return ( c == d ) ? 0 : ( oOrder ? ( c - d ) : ( d - c ) );				break;								case "sort_numeric":					//numeric sort					c = parseFloat(c);					d = parseFloat(d);					if( isNaN(c) ) { c = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					if( isNaN(d) ) { d = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					//'Infinity - Infinity' is NaN, and IE throws an error					return ( c == d ) ? 0 : ( oOrder ? ( c - d ) : ( d - c ) );					break;								default:				    if (c==d) return 0;				    if (c<d) return -1;				break;							}					/*if( oSortType ) {					//numeric sort					c = parseFloat(c);					d = parseFloat(d);					if( isNaN(c) ) { c = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					if( isNaN(d) ) { d = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					//'Infinity - Infinity' is NaN, and IE throws an error					return ( c == d ) ? 0 : ( oOrder ? ( c - d ) : ( d - c ) );			} else {					//alpha sort					while( c.length > d.length ) { d += oPadding; }					while( d.length > c.length ) { c += oPadding; }					return ( oOrder ? ( d > c ) : ( c > d ) ) ? -1 : 1;			}*/	};	//prepare the function used to get the text content of the cells - rudimentary, but should hardly be needed	var totalValueOf = function (oNode) {			var oStr = '';			for( var i = 0, j; i < oNode.childNodes.length; i++ ) {					j = oNode.childNodes[i];					if( j.nodeType == 3 ) {							oStr += j.nodeValue;					} else if( j.nodeType == 1 ) {							oStr += totalValueOf( j );					}			}			return oStr;	};	if( oTableItem.tagName.toLowerCase() == 'table' ) {			oTableItem = oTableItem.getElementsByTagName('tbody')[0];			//failed to find a table body - do not sort			if( !oTableItem ) { return; }	}	var usableRows = [], actualRows = 0;	for( var i = 0, j; i < oTableItem.childNodes.length; i++ ) {				j = oTableItem.childNodes[i];			if( j.tagName && j.tagName.toLowerCase() == 'tr' ) {					actualRows++;					if( ( actualRows > oIgnoreRows ) && ( !oIgnoreClass || !j.className || !j.className.match(oIgnoreClass) ) ) {							//we want to sort this row - get accurate refs to the cells (th/td)							j.quickCells = [];							for( var n = 0, m; n < j.childNodes.length; n++ ) {									m = j.childNodes[n];									if( m.tagName && ( m.tagName.toLowerCase() == 'td' || m.tagName.toLowerCase() == 'th' ) ) {											j.quickCells[j.quickCells.length] = m;									}							}							usableRows[usableRows.length] = j;					}			}	}	if( usableRows.length > 1 ) {			//enough rows to sort			usableRows.sort(sortFunc);			if( window.ActiveXObject && navigator.platform.indexOf('Mac') + 1 && !navigator.__ice_version && ( !window.ScriptEngine || ScriptEngine().indexOf('InScript') == -1 ) && !window.opera ) {					//IE Mac will crash - avoid the bug - slower so I will not use this "fix" in browsers that do not need it					for( var i = 0; i < usableRows.length; i++ ) {							if( usableRows[i] != oTableItem.lastChild ) {									oTableItem.insertBefore(usableRows[i],oTableItem.lastChild);									oTableItem.insertBefore(oTableItem.lastChild,oTableItem.lastChild.previousSibling);							}					}			} else {					for( var i = 0; i < usableRows.length; i++ ) {							oTableItem.appendChild(usableRows[i]);					}			}			//fix Opera rendering bug			document.body.className = document.body.className;	}}function setSort(elm,item) {sortdiv = getParent(elm,"DIV");sorts = sortdiv.getElementsByTagName("A");for (i=0; i<sorts.length; i++) {	if (i==item) sorts[i].className = "sortOn";	else sorts[i].className = "";}}function sortEvents(oTableItem,oColumn,oSortType,oOrder) {	if( !document.childNodes || !document.appendChild ) { return; }	switch (oSortType) {	case 0:	oSortType = "sort_caseinsensitive";	break;		case 1:	oSortType = "sort_date";	break;		case 2:	oSortType = "sort_currency";	break;		case 3:	oSortType = "sort_numeric";	break;		default:	oSortType = "sort_default";	break;		}				oTableItem = document.getElementById(oTableItem);	//prepare the custom sorting function	var trimSpace = /^\s+|\s+$/g, oPadding = unescape('%00');	var sortFunc = function (a,b) {			//var c = totalValueOf(a.quickCells[oColumn]).replace(trimSpace,'');			//var d = totalValueOf(b.quickCells[oColumn]).replace(trimSpace,'');							var c = totalValueOf(a).replace(trimSpace,'');			var d = totalValueOf(b).replace(trimSpace,'');							switch (oSortType) {				case "sort_caseinsensitive":					//alpha sort					while( c.length > d.length ) { d += oPadding; }					while( d.length > c.length ) { c += oPadding; }					return ( oOrder ? ( d > c ) : ( c > d ) ) ? -1 : 1;					break;							case "sort_date": 				c = formatDate(c);								d = formatDate(d);				//alert(c+", "+d);				while( c.length > d.length ) { d += oPadding; }				while( d.length > c.length ) { c += oPadding; }				return ( oOrder ? ( d > c ) : ( c > d ) ) ? -1 : 1;								break;								case "sort_currency":				//numeric sort				c = parseFloat(c.replace(/[$£]/g,""));				d = parseFloat(d.replace(/[$£]/g,""));				if( isNaN(c) ) { c = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					if( isNaN(d) ) { d = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					//'Infinity - Infinity' is NaN, and IE throws an error					return ( c == d ) ? 0 : ( oOrder ? ( c - d ) : ( d - c ) );				break;								case "sort_numeric":					//numeric sort					c = parseFloat(c);					d = parseFloat(d);					if( isNaN(c) ) { c = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					if( isNaN(d) ) { d = oOrder ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; }					//'Infinity - Infinity' is NaN, and IE throws an error					return ( c == d ) ? 0 : ( oOrder ? ( c - d ) : ( d - c ) );					break;								default:				    if (c==d) return 0;				    if (c<d) return -1;				break;							}			};	//prepare the function used to get the text content of the cells - rudimentary, but should hardly be needed	var totalValueOf = function (oNode) {			var oStr = '';			for( var i = 0, j; i < oNode.childNodes.length; i++ ) {					j = oNode.childNodes[i];					if( j.nodeType == 3 ) {							oStr += j.nodeValue;					} else if( j.nodeType == 1 ) {							oStr += totalValueOf( j );					}			}			return oStr;	};	var usableRows = [], actualRows = 0;	for( var i = 0, j; i < oTableItem.childNodes.length; i++ ) {				j = oTableItem.childNodes[i];			if( j.tagName && j.tagName.toLowerCase() == 'p' ) {					actualRows++;					//usableRows[usableRows.length] = j;										jitems = j.getElementsByTagName("A");					//alert(jitems.length);					if (jitems.length>0) {						usableRows[usableRows.length] = jitems[oColumn]						//alert(jitems[oColumn])					}															/*					if( ( actualRows > oIgnoreRows ) && ( !oIgnoreClass || !j.className || !j.className.match(oIgnoreClass) ) ) {							//we want to sort this row - get accurate refs to the cells (th/td)							j.quickCells = [];							for( var n = 0, m; n < j.childNodes.length; n++ ) {									m = j.childNodes[n];									if( m.tagName && ( m.tagName.toLowerCase() == 'td' || m.tagName.toLowerCase() == 'th' ) ) {											j.quickCells[j.quickCells.length] = m;									}							}							usableRows[usableRows.length] = j;					}					*/			}			//alert(usableRows.length)	}	if( usableRows.length > 1 ) {				//enough rows to sort			usableRows.sort(sortFunc);			if( window.ActiveXObject && navigator.platform.indexOf('Mac') + 1 && !navigator.__ice_version && ( !window.ScriptEngine || ScriptEngine().indexOf('InScript') == -1 ) && !window.opera ) {					//IE Mac will crash - avoid the bug - slower so I will not use this "fix" in browsers that do not need it					for( var i = 0; i < usableRows.length; i++ ) {							if( getParent(usableRows[i]) != oTableItem.lastChild ) {									oTableItem.insertBefore(getParent(usableRows[i]),oTableItem.lastChild);									oTableItem.insertBefore(oTableItem.lastChild,oTableItem.lastChild.previousSibling);							}					}			} else {					for( var i = 0; i < usableRows.length; i++ ) {							oTableItem.appendChild(getParent(usableRows[i]));					}			}			//fix Opera rendering bug			document.body.className = document.body.className;	}}function tablesort(table,col) {	sortTableRows(table,col,0,1,0);	alternateRowColors(table);}function table_init(table) {	alternateRowColors(table);}function setUpTable() {	tbodys = document.getElementsByTagName("TBODY");		for (i=0; i<tbodys.length; i++) {		if (tbodys[i].id && tbodys[i].id.length>1) {			table_init(tbodys[i].id);			}	}}function setHeaders(tbody,col,order) {		tag = "TABLE";	elm = document.getElementById(tbody);	par = (document.all) ? elm.parentElement:elm.parentNode;	while (tag && par.tagName != tag) {		par = (document.all) ? par.parentElement:par.parentNode;		if (par==null) return;	}	cols = par.getElementsByTagName("th");		for (i=0; i<cols.length; i++) {		if (i!=col) {			if (cols[i].className != "cellcheck")				cols[i].className = "tableunsort"						//document.images["sort"+i].src = sortoff.src		}		else {			if (order)			cols[i].className = "tablesortup";			else			cols[i].className = "tablesortdown";		}	}}// -->