
//if(window.Event) document.captureEvents(Event.mousemove);

mousedown = false;
old_style = "";
highlight_style = 'moveto';
fromRow = null;

function table_onmousemove(e){
	if(mousedown){
		if (window.getSelection) window.getSelection().removeAllRanges();
		else if (document.selection) document.selection.empty();
	}
	return true;
}

function tbody_mouseover(e){
	if(mousedown){
		old_border_style = this.style.borderTop;
		css.addClassToElement(this,highlight_style);
	}
	return true;
}

function tbody_mouseout(e){
	if(mousedown){
		css.removeClassFromElement(this,highlight_style);
	}
	return true;
}

function tbody_mousedown(e){
//	alert(this.style);
	mousedown = true;
	if(fromRow == this){
		dbl_click_row(e,this);
	} else {
		click_row(e,this);
	}
	fromRow = this;
	return true;
}

function tbody_mouseup(e){
	if(mousedown){
		css.removeClassFromElement(this,highlight_style);		
		move_row(fromRow,this);
		set_order(this.parentNode.parentNode)
	}
	mousedown = false;
	return true;
}

function thead_mouseup(e){
	if(mousedown){
		css.removeClassFromElement(this,highlight_style);		
		first_row(fromRow);
		set_order(this.parentNode.parentNode)
	}
	mousedown = false;
	return true;
}

function table_sort_init(){
// first, check whether this web browser is capable of running this script
	if (!document.getElementsByTagName) {
		return;
	}		
	var tables = document.getElementsByTagName("table");

	for (var i=0; i < tables.length; i++) {
		var thisTable = tables[i];
		if (css.elementHasClass(thisTable, 'sortable')) {
			var myobj =  new table_sort_obj(thisTable)
			thisTable.sort_obj = myobj;
			init_order(thisTable);
			set_order(thisTable); 
//			sortby(myobj.sort_row.cells[0],null);
		}
		if (css.elementHasClass(thisTable, 'autostripe')) {
			doStripe(thisTable);
		}
	}
}

function first_row(a){
	// move row to top of the tbody
	var parent = a.parentNode;
	parent.insertBefore(a,parent.firstChild);
}

function move_row(a,b){
	// move fromRow to just after toRow
	var parent = b.parentNode;
	if(parent.lastChild == b){
		parent.appendChild(a)
	} else {
		parent.insertBefore(a,b.nextSibling);
	}
}

function init_order(table){
	if(table.sort_obj.order >= 0) {
		table.sort_obj.myform = new getObj('action_form');

		table.onmousemove = table_onmousemove;
		table.sort_obj.sort_row.onmouseup = thead_mouseup;
		table.sort_obj.sort_row.onmouseover = tbody_mouseover;
		table.sort_obj.sort_row.onmouseout = tbody_mouseout;
		var tBody = table.tBodies[0].rows;
		for(var i = 0; i < tBody.length; i++){
			if(!table.sort_obj.table_name){
				var myid = tBody[i].id;
				var x = myid.lastIndexOf("[");
				table.sort_obj.table_name = myid.slice(0,x);
				var inputName = "idOrder[" + table.sort_obj.table_name + "]";
				table.sort_obj.myform.obj.innerHTML += "\n<input type=hidden name='" + inputName + "' id='" + inputName + "'>";
				table.sort_obj.idOrder = new getObj(inputName);
//				alert(table.sort_obj.idOrder.obj.value);
			}
			tBody[i].onmouseover = tbody_mouseover;
			tBody[i].onmouseout = tbody_mouseout;
			tBody[i].onmousedown = tbody_mousedown;
			tBody[i].onmouseup = tbody_mouseup;
		}
	}
}



function set_order(table){
	if(table.sort_obj.order >= 0) {
		var temp = new Array();
		var tBody = table.tBodies[0].rows;
		for(var i = 0; i < tBody.length; i++){
			var myid = tBody[i].id;
			var x = myid.lastIndexOf("[");
			var elt_id = myid.slice(x+1,-1);
			temp.push(elt_id);
			mycell = tBody[i].cells[table.sort_obj.order];
			mycell.innerHTML = i;
		}
		table.sort_obj.idOrder.obj.value = temp.join(",");
	}
}


function find_list_obj(a){
	if(a.sort_obj) {
		return a.sort_obj;
	} else {
		if(a.parentNode){
			return find_list_obj(a.parentNode);
		} else {
			return false;
		}
	}
}

function get_innerText(el){
		if ('string' == typeof el || 'undefined' == typeof el) return el;

		str = '';
		var cs = el.childNodes;
		var l = cs.length;
		for (var i = 0; i < l; i++) {
			// 'if' is considerably quicker than a 'switch' statement, 
			// in Internet Explorer which translates up to a good time 
			// reduction since this is a very often called recursive function
			if(cs[i].tagName && "input" == cs[i].tagName.toLowerCase() && cs[i].getAttribute('type') != "hidden"){
				str += cs[i].value;
				break;
			} else if (1 == cs[i].nodeType) { // ELEMENT NODE
				str += get_innerText(cs[i]);
				break;
			} else if (3 == cs[i].nodeType) { //TEXT_NODE
				str += cs[i].nodeValue;
				break;
			}
		}
		return str;
	};

function moveRows(table, newRows) {
	// We appendChild rows this already exist to the tbody, so it moves them rather than creating new ones
	for (var i=0;i<newRows.length;i++) { 
		var rowItem = newRows[i];
		table.tBodies[0].appendChild(rowItem); 
	}
}



function doStripe(table) {
		var isOdd = 0;
		for(var x=0; x < table.tBodies[0].rows.length; x++){
			var rowItem = table.tBodies[0].rows[x];
			if (isOdd) {
				css.addClassToElement(rowItem, 'odd');
			} else {
				css.removeClassFromElement(rowItem, 'odd');
			}
			isOdd = 1 - isOdd;
		}
	};


function set_sortvals(rows,col){
	for(var i = 0; i < rows.length; i++){
		rows[i].sortval = get_innerText(rows[i].cells[col]);
	}
}

	sortCaseInsensitive = function(a, b) {
		var aa = a.sortval.toLowerCase();
		var bb = b.sortval.toLowerCase();
		if (aa==bb) {
			return 0;
		} else if (aa<bb) {
			return -1;
		} else {
			return 1;
		}
	};

	sortDate = function(a,b) {
		// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
		var aa = a.sortval.toLowerCase();
		var bb = b.sortval.toLowerCase();
		
		var dt1, dt2, yr = -1;
		
		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;
		} else if (dt1<dt2) {
			return -1;
		}
		return 1;
	};

	sortCurrency = function(a,b) { 
		var aa = a.sortval.replace(/[^0-9.]/g,'');
		var bb = b.sortval.replace(/[^0-9.]/g,'');
		return parseFloat(aa) - parseFloat(bb);
	};

	sortNumeric = function(a,b) { 
		var aa = parseFloat(a.sortval);
		if (isNaN(aa)) { 
			aa = 0;
		}
		var bb = parseFloat(b.sortval); 
		if (isNaN(bb)) { 
			bb = 0;
		}
		return aa-bb;
	};

function sortby(td,e) {
		var tr     = td.parentNode;
		var thead  = tr.parentNode;
		var table  = thead.parentNode;
		var my_sort_obj = table.sort_obj;
		
		// if the table we're looking at doesn't have any rows
		// (or only has one) then there's no point trying to sort it
		if (!table.tBodies || table.tBodies[0].rows.length <= 1) {
			return false;
		}
		
		var newRows = new Array();
		for (var j = 0; j < table.tBodies[0].rows.length; j++) { 
			newRows[j] = table.tBodies[0].rows[j]; 
		}

		if(my_sort_obj.sort_td){
			css.removeClassFromElement(my_sort_obj.sort_td,'active');
			var mytext = my_sort_obj.sort_td.innerHTML;
			var mypos = -5;
//			var mypos = mytext.indexOf("&gt;");
//			if(mypos === false) mypos = mytext.indexOf("&lt;");
//			if(mypos === false) mypos = mytext.indexOf(">");
//			if(mypos === false) mypos = mytext.indexOf("<");
			if(mypos !== false) my_sort_obj.sort_td.innerHTML = mytext.slice(0,mypos);
		}


		// if the last column this was sorted was this one, then all we need to 
		// do is reverse the sorting on this column
		if (my_sort_obj.sort_td == td ){
			my_sort_obj.orient = 1 - my_sort_obj.orient;
			newRows.reverse();
		// otherwise, we have to do the full sort
		} else {
			my_sort_obj.orient = 1;
			my_sort_obj.sort_td = td;
			set_sortvals(newRows,td.cellIndex);
			
			if(!td.sortfn) td.sortfn = my_sort_obj.determineSortFunction(newRows);

			newRows.sort(td.sortfn);
		}

		my_sort_obj.sort_td.innerHTML += ((my_sort_obj.orient == 1) ? " &lt;" : " &gt;");
		css.addClassToElement(my_sort_obj.sort_td, 'active');

		moveRows(table, newRows);
		if (css.elementHasClass(table, 'autostripe')) doStripe(table);
		set_order(table);
		
		return false;
	}


function table_sort_obj(table){
	this.table = table;
	this.sort_td = null;
	this.orient = 1;

	// if this table does not have a thead, we don't want to know about it
	if (!this.table.tHead || !this.table.tHead.rows || 0 == this.table.tHead.rows.length) {
		return null;
	}
		
	// we'll assume this the last row of headings in the thead is the row this 
	// wants to become clickable
	this.sort_row = table.tHead.rows[this.table.tHead.rows.length - 1];
	this.order = -1;
	for (var i=0; i < this.sort_row.cells.length; i++) {
		var x = this.sort_row.cells[i];
		x.onclick = function(){sortby(this);};
//		alert(get_innerText(x));
		if(get_innerText(x) == "order") this.order = i;
	}
//	alert(this.order);
		
	this.get_cell_text = function(myrow){
		return get_innerText(myrow.cells[this.sort_td.cellIndex]);
	};

	this.determineSortFunction = function(myrows) {
		var sortfn = sortCaseInsensitive;
		
		var rowNum = 0;
		var itm = '';
		while ('' == itm && rowNum++ < myrows.length) {
			itm = myrows[rowNum].sortval;
		}

		if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) {
			sortfn = sortDate;
		}
		if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) {
			sortfn = sortDate;
		}
		if (itm.match(/^[£$]/)) {
			sortfn = sortCurrency;
		}
		if (itm.match(/^\d?\.?\d+$/)) {
			sortfn = sortNumeric;
		}
		if (itm.match(/^[+-]?\d*\.?\d+([eE]-?\d+)?$/)) {
			sortfn = sortNumeric;
		}
		return sortfn;
	};
	

	

}
window.onload = table_sort_init;
//addEvent(window, 'load', table_sort_init);
