var ts_sortable_classname = "sortable" ;
var ts_clickable_classname = "clickable" ;
var ts_clicked_classname = "clicked" ;
var ts_firstSort_classname = "firstSort" ;
var ts_ascOrder_classname = "asc" ;
var ts_descOrder_classname = "desc" ;
var ts_orderedAsc_classname = "orderedAsc" ;
var ts_orderedDesc_classname = "orderedDesc" ;






function ts_init() {
	// lance la detection des tables a trier et les rend triables
    var ti ;
    if (!document.getElementsByTagName) return;
    tbls = document.getElementsByTagName("table");
    for (ti=0;ti<tbls.length;ti++) {
        thisTbl = tbls[ti];
        if (hasClass(thisTbl,ts_sortable_classname)) {
			if (thisTbl.sortable != 1) {
				this.sortable = 1 ;
				ts_makeSortable(thisTbl);
				
			}
        } else {
			if (thisTbl.sortable == 1) {
				ts_unmakeSortable(thisTbl) ;
				this.sortable = 0 ;
			}
		}
    }
}

function ts_setOrderAsc(cell) {
	addClass(cell, ts_ascOrder_classname) ;
	removeClass(cell, ts_descOrder_classname) ;
}
function ts_setOrderDesc(cell) {
	removeClass(cell, ts_ascOrder_classname) ;
	addClass(cell, ts_descOrder_classname) ;
}
function ts_initOrder(cell) {
	if (hasClass(cell, ts_ascOrder_classname)) return ;
	if (hasClass(cell, ts_descOrder_classname)) return ;
	addClass(cell, ts_ascOrder_classname) ;
}
function ts_hasOrderAsc(cell) {
	return hasClass(cell, ts_ascOrder_classname) ;
}
function ts_hasOrderDesc(cell) {
	return hasClass(cell, ts_descOrder_classname) ;
}

function ts_makeSortable(table) {
	var i, j ;
	table.sortedIndex = -1 ;
	head = table.tHead ;
	for(i=0;i<head.rows.length;i++) {
		row = head.rows[i] ;
		for(j=0;j<row.cells.length;j++) {
			cell = row.cells[j] ;
			addClass(cell, ts_clickable_classname) ;
			addEvent(cell, 'click', ts_sortByHeader_event) ;
			ts_initOrder(cell) ;
			if (hasClass(cell, ts_firstSort_classname)) {
				removeClass(cell, ts_firstSort_classname) ;
				ts_sortByHeader(cell) ;
			}
		}
	}
}
function ts_unmakeSortable(table) { 
	var i, j ;
	head = table.tHead ;
	for(i=0;i<head.rows.length;i++) {
		row = head.rows[i] ;
		for(j=0;j<row.cells.length;j++) {
			cell = row.cells[j] ;
			removeClass(cell, ts_clickable_classname) ;
			removeEvent(cell, 'click', ts_sortByHeader_event) ;
		}
		
	}
}

function ts_sortByHeader_event(e) {
	var th ;
	e = (e) ? e : window.event ;
	th = (e.target) ? e.target : e.srcElement ;
	ts_sortByHeader(th) ;
}	
	
function ts_sortByHeader(th) {	
	var table, tbodies, thead, index, tr, td ;
	var oldDisplay , order;
	var i, j ;
	thead = th.parentNode.parentNode ;
	table = thead.parentNode ;
	if ((th.cellIndex != null) && th.getCellIndex) {
		index = th.getCellIndex() ;
	} else {
		index = th.cellIndex ;
	}
	if (table.sortedIndex==index) {
		if (ts_hasOrderAsc(th)) {
			ts_setOrderDesc(th) ;
			order = -1 ;
		} else {
			ts_setOrderAsc(th) ;
			order = 1 ;
		}
	} else {
		if (ts_hasOrderAsc(th)) {
			order = 1 ;
		} else {
			order = -1 ;
		}
	}
	table.sortedIndex = index ;
	for(i=0; i<thead.rows.length; i++) {
		tr = thead.rows[i] ;
		for(j=0; j<tr.cells.length;j++) {
			if (j==index) {
				addClass(tr.cells[j], ts_clicked_classname) ;
				if (ts_hasOrderAsc(tr.cells[j])) {
					addClass(tr.cells[j], ts_orderedAsc_classname) ;
					removeClass(tr.cells[j], ts_orderedDesc_classname) ;
				} else {
					addClass(tr.cells[j], ts_orderedDesc_classname) ;
					removeClass(tr.cells[j], ts_orderedAsc_classname) ;
				}
			} else {
				removeClass(tr.cells[j], ts_clicked_classname) ;
				removeClass(tr.cells[j], ts_orderedAsc_classname) ;
				removeClass(tr.cells[j], ts_orderedDesc_classname) ;
			}
		}
	}
	
	
	oldDisplay = table.style.display;
	table.style.display = "none";
	
	tbodies = table.tBodies ;
	ts_bodySortByCellIndex(tbodies, index, order) ;
	
	table.style.display = oldDisplay ;
}

function ts_null(e) {
}


function ts_bodySortByCellIndex(tbodies, index, order) {
	var i, j, k;
	var body, tr, td;
	var minRow ;
	var tmp ;
	for(i=0; i<tbodies.length; i++) {
		body = tbodies[i] ;
		for(j=0; j<body.rows.length ; j++) {
			minRow = j ;
			for (k = j + 1; k < body.rows.length; k++) {
				tr = body.rows[k] ;
				if (ts_compareRowsWithCellIndex(body.rows[minRow], tr, index, order)>0) {
					minRow = k ;
				}
			}
			if (minRow > j) {
				tr = body.removeChild(body.rows[minRow]);
				body.insertBefore(tr, body.rows[j]);
			}
			tr = body.rows[j] ;
			for (k=0; k<tr.cells.length; k++) {
				td = body.rows[j].cells[k] ;
				if (k == index) {
					addClass(td, ts_clicked_classname) ;
				} else {
					removeClass(td, ts_clicked_classname) ;
				}
			}
		}
	}
}

function ts_compareRowsWithCellIndex(r1, r2, index, order) {
	var n1, n2 ;
	var v1, v2 ;
	v1 = getTextContent( r1.cells[index] ).toLowerCase() ;
	v2 = getTextContent( r2.cells[index] ).toLowerCase() ;
	
	n1 = parseFloat(v1);
	n2 = parseFloat(v2);
	if (!isNaN(n1) && !isNaN(n2)) {
		v1 = n1;
		v2 = n2;
	}
	
	if (v1 == v2) {
		return 0;
	} else if (v1 > v2) {
		return 1*order;
	} else {
		return -1*order;
	}
}


addEvent(window, "load", ts_init);
