var XSLNS = "http://www.w3.org/1999/XSL/Transform";
var tabledata=new Array;

var isIE = (navigator.appName == "Microsoft Internet Explorer");
var isNav = (navigator.appName == "Netscape");
if (isIE) {
	xslt = new ActiveXObject("Microsoft.XMLDOM");
	xslt.async = false;
	xslt.load("http://www.toomuchcookies.net/xslt/newtablesorting/style_IE.xml");
} else {
	processor = new XSLTProcessor();
	xslt = document.implementation.createDocument("", "", null);
	xslt.async = false;
	xslt.load("http://www.toomuchcookies.net/xslt/newtablesorting/style.xml");
}


function install_sorters() {
	var mytables = document.getElementsByTagName("table");
	for (i=0;i<mytables.length;i++) {
		install_sorter(mytables.item(i));
	}
}

function install_sorter(mytable) {
	myheaders = mytable.getElementsByTagName("th");
	for (k=0;k<myheaders.length;k++) {
		if (isIE) {
			myheaders[k].attachEvent("onclick",sortfor);
			myheaders[k].setAttribute("colnumber",k+1);
		}
		else {
			myheaders[k].addEventListener('click',function(evt){sortfor(evt);},true);
			myheaders[k].setAttributeNS(null,"colnumber",k+1);
		}
	}
}

function sortfor(evt) {
	evt = (evt) ? evt : ((window.event) ? window.event : "");
	col=(evt.target) ? evt.target : evt.srcElement;

	if (isIE) colnumber=col.getAttribute("colnumber");
	else colnumber=col.getAttributeNS(null,"colnumber");
	
	var table=col.parentNode.parentNode.parentNode;
	
	data=gettabledom(table);
	
	// Change the Transformation-Doc
	if (isIE) {
		xmldoc = new ActiveXObject("Microsoft.XMLDOM");
		xmldoc.loadXML(data.getElementsByTagName("tbody").item(0).outerHTML);
		xmldoc.async =false;
		
		// sort for column #
		var mysort = xslt.getElementsByTagName("xsl:sort").item(0);
		mysort.setAttribute("select","TD["+colnumber+"]");
		
		// Perhaps sort as number??
		colclass=col.getAttribute("class");
		if (colclass && colclass.IndexOf('sorttypenumber')>-1) mysort.setAttribute("data-type","number");
		else mysort.removeAttribute("data-type");
		
		// Alternating Sort order
		sortorder="ascending";
		if (table.getAttribute("sortedfor") && table.getAttribute("sortedfor")==colnumber) {
			if (table.getAttribute("sortorder")=="ascending") sortorder="descending";
		}
		mysort.setAttribute("order",sortorder);
		
		// Now save the sort-parameters as attributes of table
		table.setAttribute("sortedfor",colnumber);
		table.setAttribute("sortorder",sortorder);
		result = xmldoc.transformNode(xslt);
		
		// we need to parse the result, so that we can find the tbody-object 
		xmldoc.loadXML(result);
		result=xmldoc.getElementsByTagName("tbody").item(0);
		
		// and replace old data with sorted data. (any hint, how to do this more elgantly, please post!
		myregex=new RegExp("<tbody>([\n\r\t]|.)*</tbody>","i");
		var temp=table.outerHTML.replace(myregex,result.xml);
		table.outerHTML=temp;
		
		// IE seems to throw out old eventhandlers somehow..
		install_sorters();
		return;
	} else {
		var xmls = new XMLSerializer();
		var processor = new XSLTProcessor();
		
		// sort for column #
		var mysort = xslt.getElementsByTagNameNS(XSLNS, "sort").item(0);
		mysort.setAttributeNS(null,"select","td["+colnumber+"]");
		
		// Perhaps sort as number??
		colclass=col.getAttributeNS(null,"class");
		if (colclass.lastIndexOf('sorttypenumber')>-1) mysort.setAttributeNS(null,"data-type","number");
		else mysort.removeAttributeNS(null,"data-type");
		
		// Alternating Sort order
		sortorder="ascending";
		if (table.getAttributeNS(null,"sortedfor")==colnumber) {
			if (table.getAttributeNS(null,"sortorder")=="ascending") sortorder="descending";
		}
		mysort.setAttributeNS(null,"order",sortorder);
		
		// Now save the sort-parameters as attributes of table
		table.setAttributeNS(null,"sortedfor",colnumber);
		table.setAttributeNS(null,"sortorder",sortorder);
		
		// run the xslt-processor
		processor.importStylesheet(xslt);
		result = processor.transformToDocument(data.getElementsByTagName("tbody").item(0));
		result=result.getElementsByTagName("tbody").item(0);
		
		// and replace old data with sorted data.
		var temp=table.getElementsByTagName("tbody").item(0);
		table.replaceChild(result,temp);
		return;
	}
}

function gettabledom(table) {
	if (isIE) {
		mytabledata=table;
	} else {
		if (table.getAttributeNS(null,"tablenumber")=="") {
			table.setAttributeNS(null,"tablenumber",tabledata.length);
			tabledata[tabledata.length]=table.cloneNode(true);
		}
		mytabledata=tabledata[table.getAttributeNS(null,"tablenumber")];
	}
	return mytabledata;
}

if (!isIE) window.addEventListener("load",install_sorters,false);



