//addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;
var itemsOnPage = 10

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.id + ' ').indexOf("sort") != -1) && thisTbl.id) {
			//if (thisTbl.rows.length > itemsOnPage - 5) {
				ts_makeSortable(thisTbl);
			/*} else {
				thisTbl.caption.style.display = 'none'
			}*/
		}
	}
}

function ts_makeSortable(table) {
	table.count_visible = 0
 	table.column = 0
	table.count_min = 0
	table.count_max = itemsOnPage - 1

	if (table.rows && table.rows.length > 0) {
		var firstRow = table.rows[0];
	}

	if (!firstRow) return;

	if (firstRow.cells.length > 1) {
		for (var i = 0; i < firstRow.cells.length; i++) {
			var cell = firstRow.cells[i];
            var txt = ts_getInnerText(cell);
			var txt1 = cell.innerHTML;
            if(txt1.indexOf("<INPUT") == -1){
                cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;">' + txt+ '<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
            }
		}
	}

	ts_resortTable(firstRow.cells[0].childNodes[0])
}

function ts_getInnerText(el) {
	if (typeof el == "string") return el;

	if (typeof el == "undefined") {
		return el
	} ;

	if (el.innerText) return el.innerText

	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;
}

//itemsOnPage--
function ts_filter(lnk) {
	var td = lnk.parentNode;

	var table = getParent(td, 'TABLE');
	table.count_min = 0
	//   table.count_max=itemsOnPage-1
	ts_resortTable(lnk)
}

function ts_pagePrev(lnk) {
	var td = lnk.parentNode;

	var table = getParent(td, 'TABLE');
	table.count_min = Math.max(table.count_min - itemsOnPage, 0)
	ts_resortTable(lnk)
}

function ts_pageNext(lnk) {
	var td = lnk.parentNode;

	var table = getParent(td, 'TABLE');

	if (table.count_min + itemsOnPage <= table.count_visible - 1) {
		table.count_min = Math.min(table.count_min + itemsOnPage, table.count_visible)

		ts_resortTable(lnk)
	}
}

function ts_page(lnk, offset) {
	var td = lnk.parentNode;

	var table = getParent(td, 'TABLE');
	table.count_min = offset

	//alert(td.tagName+"  table.count_min="+table.count_min)
	ts_resortTable(lnk)
}

//var page_inputs_buffer=[]
function save_inputs() {
	var inputs = document.getElementsByTagName("INPUT");

	for (var i = 0; i < inputs.length; i++) {
		inputs[i].defaultChecked = inputs[i].checked
	}
}
/*function restore_inputs() {
	var inputs=document.getElementsByTagName("INPUT");
	for(var i=0;i<inputs.length;i++){
	//	inputs[i].checked =	page_inputs_buffer[inputs[i].name]
	  //  if(!inputs[i].checked)alert(inputs[i].checked)
	  //    if(!inputs[i].checked)      alert(page_inputs_buffer[inputs[i].name])
		//alert(inputs[i].value)
	}
}*/
function ts_resortTable(lnk) {
	save_inputs();

	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 table = getParent(td, 'TABLE');
	var column = td.cellIndex;

	

//alert("table.column = "+table.column)
	if ( typeof column == "undefined") {
		if ( typeof table.column != "undefined") {
			column = table.column
		} else {
			column = 0
//alert("hh "+column)
			table.count_min = 0
		}
	}

	table.count_visible = 0
	var count_visible = table.count_visible
	var count_min = table.count_min
	var count_max = count_min + itemsOnPage - 1	
//	alert( table.count_min+":"+	 table.count_max)
	//form=document.forms[table.id+"_form"];
		_counter = document.getElementById(table.id + "_counter")
		_searchtxt = document.getElementById(table.id + "_searchtxt")

	// Work out a type for the column
	if (table.rows.length <= 1) return;

	var itm = ts_getInnerText(table.rows[1].cells[column]);
	sortfn = ts_sort_caseinsensitive;

	if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = ts_sort_date;

	if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;

	if (itm.match(/^[£$]/)) sortfn = ts_sort_currency;

	if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;

	SORT_COLUMN_INDEX = column;
	var firstRow = new Array();
	var newRows = new Array();

	for (i = 0; i < table.rows[0].length; i++) {
		firstRow[i] = table.rows[0][i];
	}

	for (j = 1; j < table.rows.length; j++) {
		newRows[j - 1] = table.rows[j];
	}

	if (span) {
		newRows.sort(sortfn);

		//alert(newRows.length)
		if (span.getAttribute("sortdir") == 'down') {
			ARROW = '&nbsp;^';

			newRows.reverse();
			span.setAttribute('sortdir', 'up');
		} else {
			ARROW = '&nbsp;v';

			span.setAttribute('sortdir', 'down');
		}
	}

	_searchtxt.value = _searchtxt.value.toLowerCase()

	for (i = 0; i < newRows.length; i++) {
		//	alert("row "+i)
		//   if ( !newRows[i].className ||  (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1) )        )        {
		var currRow = table.tBodies[0].appendChild(newRows[i]);

		var ct = ts_getInnerText(newRows[i])

		if (_searchtxt.value == "" || ct.toLowerCase().indexOf(_searchtxt.value) != -1) {
			if (count_visible <= count_max && count_visible >= count_min) { //
				currRow.style.display = "";
			} else {
				currRow.style.display = "none";
			}

			count_visible++;
		} else {
			currRow.style.display = "none";
		}
	//    }

	}

	// do sortbottom rows only
	// for (i=0;i<newRows.length;i++) { if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}

	// Delete any other arrows there may be showing
	if (span) {
		var allspans = document.getElementsByTagName("span");

		for (var ci = 0; ci < allspans.length; ci++) {
			if (allspans[ci].className == 'sortarrow') {
				if (getParent(allspans[ci], "table") == getParent(lnk, "table")) { // in the same table as us?
					allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';
				}
			}
		}
	}

	if (span) {
		span.innerHTML = ARROW;
	}

	count_max++
	count_max = Math.min(count_max, count_visible)
	count_min++
	// _counter.innerHTML=" "+count_min+"-"+count_max+" ("+count_visible+") " ;
	var paging_str = "";

	for (var i = 0; i < count_visible; i = i + itemsOnPage) {
        var classH=act="";
		if ((i+1) == count_min) {
		  	//alert(i+" : min "+count_min)
			classH = " class=highlight ";
		}else{
			act="onClick='ts_page(this," + i + ");return false;'";
		}
		page=i/itemsOnPage+1
		paging_str += " <a href=# " +act+ classH + ">" + page + "</a> ";
	//alert(i)
	}

	_counter.innerHTML = paging_str;
	table.count_visible = count_visible
	table.column = column

//restore_inputs();
}

function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()
		&& el.id) // Gecko bug, supposed to be uppercase
		return el;
	else return getParent(el.parentNode, pTagName);
}

function ts_sort_date(a, b) {
	// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);

	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);

	if (aa.length == 10) {
		dt1 = aa.substr(6, 4) + aa.substr(3, 2) + aa.substr(0, 2);
	} else {
		yr = aa.substr(6, 2);

		if (parseInt(yr) < 50) {
			yr = '20' + yr;
		} else {
			yr = '19' + yr;
		}

		dt1 = yr + aa.substr(3, 2) + aa.substr(0, 2);
	}

	if (bb.length == 10) {
		dt2 = bb.substr(6, 4) + bb.substr(3, 2) + bb.substr(0, 2);
	} else {
		yr = bb.substr(6, 2);

		if (parseInt(yr) < 50) {
			yr = '20' + yr;
		} else {
			yr = '19' + yr;
		}

		dt2 = yr + bb.substr(3, 2) + bb.substr(0, 2);
	}

	if (dt1 == dt2) return 0;

	if (dt1 < dt2) return-1;

	return 1;
}

function ts_sort_currency(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g, '');

	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g, '');
	return parseFloat(aa) - parseFloat(bb);
}

function ts_sort_numeric(a, b) {
	aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));

	if (isNaN(aa)) aa = 0;

	bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));

	if (isNaN(bb)) bb = 0;

	return aa - bb;
}

function ts_sort_caseinsensitive(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();

	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();

	if (aa == bb) return 0;

	if (aa < bb) return-1;

	return 1;
}

function ts_sort_default(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);

	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);

	if (aa == bb) return 0;

	if (aa < bb) return-1;

	return 1;
}

function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
	{
	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");
	}
}
