var alternate_row_colors = true;
var REV_COL_INDEX=8;
var SORT_COLUMN_INDEX;
var thead = false;
var selTable;
var gridViewSort = false;

addEvent(window, "load", sortables_init);

function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener){
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent){
		var r = elm.attachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be removed");
	}
}

function trim(s) {
	return s.replace(/^\s+|\s+$/g, "");
}

function hideElement(displayElementId,tabId,isPrint) {
	if(!isPrint) {
		document.getElementById(tabId).className='tabItem';
	}
	if(tabId=='listTab') {
		document.getElementById('gridView').style.display='block';
		document.getElementById('split_content').style.display='none';
	} else {
			document.getElementById('gridView').style.display='none';
			document.getElementById('split_content').style.display='block';
	}
}

function showTabElement(displayElementId,tabId) {
	if (document.getElementById) { // DOM3 = IE5, NS6, Mozilla
		document.getElementById(displayElementId).style.display='block';
	} else {
		if (document.layers) { // Netscape 4
			document.displayElementId.display='block';
		} else { // IE 4
			document.all.displayElementId.style.display='block';
		}
	}
	document.getElementById(tabId).className='selectedTabItem';
}

function getGridOptionFromURL() {
	var url = document.location.href;
	var gridStart = url.indexOf('grid/');
	if (gridStart > -1) {
		gridViewSort = true;
	}
	return gridViewSort;
}

function sortables_init() {
	// Find all tables with class sortable and make them sortable
	if (!document.getElementsByTagName) return;
	tbls = document.getElementsByTagName("table");
	for (ti=0;ti<tbls.length;ti++) {
		thisTbl = tbls[ti];
		if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {
			selTable=thisTbl;
			ts_makeSortable(thisTbl);
		}
	}
}

function ts_makeSortable(t) {
	if (t.rows && t.rows.length > 0) {
		if (t.tHead && t.tHead.rows.length > 0) {
			var firstRow = t.tHead.rows[t.tHead.rows.length-1];
			thead = true;
		} else {
			var firstRow = t.rows[0];
		}
	}
	if (!firstRow) return;

	// Pre-Sort the table in case requested in url
	var url = document.location.href;
	var gridStart = url.indexOf('grid/');

	var colToSort="ove";
	var colNumToSort=2;
	if (gridStart > -1) {
		gridViewSort = true;
		var str = url.substr(gridStart,url.length);
		strArr = str.split("/");
		if(strArr[1]) colToSort=strArr[1].substring(0,3).toLowerCase();
	}

	// We have a first row: assume it's the header, and make its contents clickable links
	for (var i=0;i<firstRow.cells.length;i++) {
		var cell = firstRow.cells[i];
		var txt = ts_getInnerText(cell);
		if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
			//Check if sorting required and figure out the column number
			if(gridViewSort) {
				if(txt.toLowerCase().indexOf(colToSort)==0) colNumToSort = i;
			}
			cell.innerHTML = '<a href="javascript:void(0);" class="sortheader" onclick="ts_resortTable(this, '+i+');return false;">'+txt+'</a>';
		}
	}

	// Add hidden span for rank to first column (ignore header row)
	for (var i=1;i<t.rows.length;i++) {
		var cell = t.rows[i].cells[0];
		var txt = ts_getInnerText(cell);
		cell.innerHTML = txt+'<span class="ranked" style="display:none">' + i + '</span>';
	}

	if(gridViewSort) {
		ts_sortTable(colNumToSort);
	}
}

function ts_sortTable(colNum) {
	ts_resortTable(selTable.rows[0].cells[colNum].firstChild,colNum);
}

function ts_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 += ts_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function ts_resortTable(lnk, clid) {
	var span;
	for (var ci=0;ci<lnk.childNodes.length;ci++) {
		if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
	}
	var spantext = ts_getInnerText(span);

	var td = lnk.parentNode;
	var column = clid || td.cellIndex;
	var t = getParent(td,'TABLE');
	var colHeadText  = ts_getInnerText(t.tBodies[0].rows[0].cells[column]).toLowerCase();

	// Work out a type for the column
	if (t.rows.length <= 1) return;
	var itm = "";
	var i = 1;
	while (itm == "" && i < t.tBodies[0].rows.length) {
		var itm = ts_getInnerText(t.tBodies[0].rows[i].cells[column]);
		itm = trim(itm);
		if (itm.substr(0,4) == "<!--" || itm.length == 0) {
			itm = "";
		}
		i++;
	}
	if (itm == "") return;
	sortfn = ts_sort_caseinsensitive;
	if (itm.match(/^-?[£$€Û¢´]\d/)) sortfn = ts_sort_numeric;
	if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) sortfn = ts_sort_numeric;
	SORT_COLUMN_INDEX = column;
	var firstRow = new Array();
	var newRows = new Array();
	for (k=0;k<t.tBodies.length;k++) {
		for (i=0;i<t.tBodies[k].rows[0].length;i++) {
			firstRow[i] = t.tBodies[k].rows[0][i];
		}
	}
	for (k=0;k<t.tBodies.length;k++) {
		if (!thead) {
			// Skip the first row
			for (j=1;j<t.tBodies[k].rows.length;j++) {
				newRows[j-1] = t.tBodies[k].rows[j];
			}
		} else {
			// Do NOT skip the first row
			for (j=0;j<t.tBodies[k].rows.length;j++) {
				newRows[j] = t.tBodies[k].rows[j];
			}
		}
	}

	// Sort first on rank then on required column (for duplicate values in required col)
	newRows.sort(sortfn);

	// for other than the MPG values only
	if(SORT_COLUMN_INDEX != REV_COL_INDEX) {
		newRows.reverse();
	}

	// We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
	// don't do sortbottom rows
	for (i=0; i<newRows.length; i++) {
		if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
			t.tBodies[0].appendChild(newRows[i]);
		}
	}
	// do sortbottom rows only
	for (i=0; i<newRows.length; i++) {
		if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))
			t.tBodies[0].appendChild(newRows[i]);
	}

	alternate(t);

	web_tracking('cars-trucks/rankings/' + rankingNameForTracking + '/grid/' + colHeadText + "/");
}

function getParent(el, pTagName) {
	if (el == null) {
		return null;
	} else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) {
		return el;
	} else {
		return getParent(el.parentNode, pTagName);
	}
}

function ts_sort_numeric(a,b) {
	var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	aa = clean_num(aa);
	var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	bb = clean_num(bb);
	if (SORT_COLUMN_INDEX==REV_COL_INDEX) {
		if(aa=="0") aa=999999999999;
		if(bb=="0") bb=999999999999;
	}
	if (aa==bb) {
		cc = parseFloat(ts_getInnerText(a.cells[0].lastChild));
		dd = parseFloat(ts_getInnerText(b.cells[0].lastChild));
		if(cc==dd) {
			return 0;
		}
		if(cc<dd && SORT_COLUMN_INDEX == REV_COL_INDEX) { return -1; }
		if(cc>dd && SORT_COLUMN_INDEX == REV_COL_INDEX) { return	1; }
		if(cc<dd && SORT_COLUMN_INDEX != REV_COL_INDEX) { return	1; }
		if(cc>dd && SORT_COLUMN_INDEX != REV_COL_INDEX) { return -1; }
	}

	return compare_numeric(aa,bb);
}
function compare_numeric(a,b) {
	var a = parseFloat(a);
	a = (isNaN(a) ? 0 : a);
	var b = parseFloat(b);
	b = (isNaN(b) ? 0 : b);
	return a - b;
}
function ts_sort_caseinsensitive(a,b) {
	if (SORT_COLUMN_INDEX<8) {
		aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX].getElementsByTagName("SPAN")[0]).toLowerCase();
		bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX].getElementsByTagName("SPAN")[0]).toLowerCase();
		if(aa.toLowerCase().indexOf('na') != -1) aa=-1;
		if(bb.toLowerCase().indexOf('na') != -1) bb=-1;
	}
	else {
		aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
		bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
		if(aa.toLowerCase().indexOf('na') != -1) aa="-1";
		if(bb.toLowerCase().indexOf('na') != -1) bb="-1";
	}
	if (aa==bb) {
		cc = parseFloat(ts_getInnerText(a.cells[0].lastChild));
		dd = parseFloat(ts_getInnerText(b.cells[0].lastChild));
		if(cc==dd) {
			return 0;
		}
		if(cc<dd && SORT_COLUMN_INDEX == REV_COL_INDEX) { return -1; }
		if(cc>dd && SORT_COLUMN_INDEX == REV_COL_INDEX) { return	1; }
		if(cc<dd && SORT_COLUMN_INDEX != REV_COL_INDEX) { return	1; }
		if(cc>dd && SORT_COLUMN_INDEX != REV_COL_INDEX) { return -1; }
	}

	if (aa<bb) {
		return -1;
	}
	return 1;
}

function clean_num(str) {
	str = str.replace(new RegExp(/[^-?0-9.]/g),"");
	if(str=='') str="0";
	return str;
}

function alternate(table) {
	// Take object table and get all it's tbodies.
	var tableBodies = table.getElementsByTagName("tbody");
	// Loop through these tbodies
	for (var i = 0; i < tableBodies.length; i++) {
		// Take the tbody, and get all it's rows
		var tableRows = tableBodies[i].getElementsByTagName("tr");
		// Loop through these rows
		// Start at 1 because we want to leave the heading row untouched
		for (var j = 0; j < tableRows.length; j++) {
			// Check if j is even, and apply classes for both possible results
			if ( (j % 2) == 0	) {
				if ( !(tableRows[j].className.indexOf('odd') == -1) ) {
					tableRows[j].className = tableRows[j].className.replace('odd', 'even');
				} else {
					if ( tableRows[j].className.indexOf('even') == -1 ) {
						tableRows[j].className += " even";
					}
				}
			} else {
				if ( !(tableRows[j].className.indexOf('even') == -1) ) {
					tableRows[j].className = tableRows[j].className.replace('even', 'odd');
				} else {
					if ( tableRows[j].className.indexOf('odd') == -1 ) {
						tableRows[j].className += " odd";
					}
				}
			}

			// If last row then apply lastRow class else remove lastRow class
			if (j == tableRows.length-1) {
				if ( tableRows[j].className.indexOf('lastRow') == -1 ) {
					tableRows[j].className += " lastRow";
				}
			} else {
				if ( !(tableRows[j].className.indexOf('lastRow') == -1 )) {
					tableRows[j].className = tableRows[j].className.replace('lastRow', '');
				}
			}

			// Highlight the selected column
			for (var k=0; k<tableRows[j].cells.length; k++) {
				if(k==SORT_COLUMN_INDEX) {
					if ( tableRows[j].cells[k].className.indexOf('selectedCol') == -1 ) {
						tableRows[j].cells[k].className += " selectedCol";

						//Add Orange score box
						if(k>1 && k<8 && j!=0 )
						{
							tableRows[j].cells[k].getElementsByTagName("SPAN")[0].className = 'points';
							tableRows[j].cells[k].getElementsByTagName("SPAN")[1].className = 'ratings';
						}

					}
				} else {
					if ( !(tableRows[j].cells[k].className.indexOf('selectedCol') == -1 )) {
						tableRows[j].cells[k].className = tableRows[j].cells[k].className.replace('selectedCol', '');

						//Remove Orange score box
						if(k>1 && k<8 && j!=0 ) {
							tableRows[j].cells[k].getElementsByTagName("SPAN")[0].className = 'disablePoints';
							tableRows[j].cells[k].getElementsByTagName("SPAN")[1].className = 'hiddenRatings';
						}

					}
				}
			}
		}
	}
}
