/**
 * Sortable List Object
 * v 0.5
 *
 * @author	Tajs Seelen
 */

function addEvent(obj, evType, fn){
 if (obj.addEventListener){
    obj.addEventListener(evType, fn, true);
    return true;
 } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
 } else {
    return false;
 }
} 

var taj_sortableList = function()
{

	var parent, elements, head, columns;

	this.__register = function(id)
	{
		var e = document.getElementById(id);
		if (e) {
			this.parent = e;
		} else {
			alert("couldn't find id of list");
			return false;
		}
		switch (this.parent.nodeName) {
		case "UL":
			this.__buildUL();
			break;
		case "TABLE":
			this.__buildTable();
			break;
		default:
			alert("E#001: Prefered parentNode ("+e.nodeName+") not supported");
			break;
		}
	}

	this.__buildUL = function()
	{		
		this.elements = this.parent.getElementsByTagName("li");

		if (this.elements[0].className == 'header') {
			this.head = this.elements[0];	
		} else {
			alert("E#002: no header was found");
			return false;
		}
		this.__setSortableColumns();
	}

	this.__buildTable = function()
	{
		alert("todo: sortable for tables");
		return false;
	}

	this.__setSortableColumns = function()
	{
		var a = this.head.getElementsByTagName('A');
		var columnName;
		this.columns = new Array();
		for (var i = 0; i < a.length; i++) {
			var str = a[i].rel;
			columnName = str.split("sort[").join("").split("]").join("");
			this.columns.push(columnName);
			var closure = ( function(p, column) {
				return function(event) { p.__sort(column);};
			})(this, columnName);
			addEvent(a[i], 'click', closure);
		}
	}

	this.__sort = function(column)
	{		
		var a = new Array();
		for (var i = 1; i < this.elements.length; i++) {
      var xList = this.elements[i];
			var spans = xList.getElementsByTagName('SPAN');
						
			for (var j = 0; j < spans.length; j++) {
				if (spans[j].className == column) {
					var x = spans[j].innerHTML;
					a.push(x);
				}
			}
		}

		for (var n = 0; n < a.length; n++) {
			for (var m = n + 1; m < a.length; m++) {
				if (this.__cmpStr(a[n], a[m]) == 1) {
					var t = a[n];
	        a[n] = a[m];
	        a[m] = t;
				}
			}
		}
	}

	this.__cmpStr = function(a, b)
	{
		a = a.toLowerCase();
		b = b.toLowerCase();

		var c = 0;
		if (a != b) {
			while (c < a.length && c < b.length) {
				if (a.charCodeAt(c) == b.charCodeAt(c)) {
					c++;
				} else {
					if (a.charCodeAt(c) > b.charCodeAt(c)) {
						return 1;
					} else {
						return -1;
					}
					c = a.length;
				}
			}
		}
		return 0;
	}

}