var SortTable = Class.create();
SortTable.prototype = {
	initialize: function(table) {
	    // Local variables
		this.table = table;
		this.table_css = '#' + this.table.id + ' ';
		this.sort_key = '';
		this.sort_key_index = -1;
		this.sort_key_criteria = null;

		// Loop through the sort images
		$$(this.table_css + 'img.sortable_column').each( function(img) {
			Event.observe(img, 'click', this.sort.bindAsEventListener(this));
		}.bind(this));
	 },

	reload: function(event) {
	    // Set all the rows to show before we apply the filters
	    for (var bodyCount=0; bodyCount < this.table.tBodies.length; bodyCount++) {
		    for (var rowCount=0; rowCount < this.table.tBodies[bodyCount].rows.length; rowCount++) {
			    Element.show(this.table.tBodies[bodyCount].rows[rowCount]);
		    }
	    }
    },

	_reloadTableRows: function(event) {
	    // Update the row CSS classes
	    var partCount = 0;
	    var rowCss = 'even';
	    for (var bodyCount=0; bodyCount < this.table.tBodies.length; bodyCount++) {
		    var tableBody = this.table.tBodies[bodyCount];
		    for (var rowCount=0; rowCount < tableBody.rows.length; rowCount++) {
			    var tableRow = tableBody.rows[rowCount];
			    if (Element.visible(tableRow)) {
				    tableRow.className = rowCss;
				    rowCss = ((rowCss=='even')?'odd':'even');
				    partCount++
			    }
		    }
	    }
	    return partCount;
    },

	sort: function(event) {
      s.tl(this,'o','sort');
	    this._sort(Event.element(event));
	    this._reloadTableRows();
      this.reload();
    },

	_sort: function(img) {
	    var key = this._getKey(img, 'sort_');
	    var colIndex = this._getColumnIndex(this._getColumn(img));
	    var desc = (this.sort_key == key);
	    this.sort_key = key + ((desc)?' DESC':'')
    	
	    $$(this.table_css + 'img.sortable_column').each( function(i) { i.src='/images/btn_sort.gif'; i.alt='Click to Sort'; });
	    if (desc) {
		  img.src = '/images/btn_sort_desc.gif';
		} else {
		  img.src = '/images/btn_sort_asc.gif';
		  img.alt='Click to Sort Descending';
		}
	    
	    for (var bodyCount=0; bodyCount < this.table.tBodies.length; bodyCount++) {
		    var tableBody = this.table.tBodies[bodyCount];

		    var newRows = new Array;
		    for (var rowCount=0; rowCount < tableBody.rows.length; rowCount++) {
			    newRows[rowCount] = tableBody.rows[rowCount];
		    }
    	
		    this.sort_key_index = colIndex;
		    this.sort_key_criteria = null;
		    newRows.sort(this._sortTableRows.bind(this));
    	
		    var fragment = document.createDocumentFragment();
		    if (desc) {
			    for (var rowCount=newRows.length-1; rowCount >= 0; rowCount--) {
				    fragment.appendChild(newRows[rowCount]);
			    }
		    } else {
			    for (var rowCount=0; rowCount < newRows.length; rowCount++) {
				    fragment.appendChild(newRows[rowCount]);
			    }
		    }
		    tableBody.appendChild(fragment);
	    }
    },

    _sortTableRows: function(row1, row2) {
      
	    var sValue1 = row1.cells[this.sort_key_index].innerHTML;
	    var sValue2 = row2.cells[this.sort_key_index].innerHTML;

	    if (sValue1 == sValue2) {
		    // Get the material values and compare.
		    var sValue1 = row1.cells[0].firstChild.value;
		    var sValue2 = row2.cells[0].firstChild.value;
		    if (sValue1 == sValue2)
			    return 0;
		    return (sValue1 < sValue2)?-1:1;
	    }
	    
	    // Get the string values
	    if (this.sort_key_criteria) {
		    var intValue1 = 999;
		    var intValue2 = 999;
		    for (var criteriaCount = 0; criteriaCount < this.sort_key_criteria.length; criteriaCount++) {
			    if (sValue1 == this.sort_key_criteria[criteriaCount])
				    intValue1 = criteriaCount;
			    if (sValue2 == this.sort_key_criteria[criteriaCount])
				    intValue2 = criteriaCount;
		    }
		    if (intValue1 == intValue2) return 0;
		    return (intValue1 < intValue2)?-1:1;
	    } else {
		    
        if (sValue1 == sValue2) return 0;
		    return (sValue1 < sValue2)?-1:1;
	    }
    },

    _getColumn: function(element) {
	    while (element.parentNode != null && element.tagName && 
			    (element.tagName.toLowerCase() != 'th' && 
			     element.tagName.toLowerCase() != 'td')) {
		    element = element.parentNode;
	    }
	    return element;
    },

    _getColumnIndex: function(col) {
	    var cellIndex = col.cellIndex;
	    // Loop through to get the real cell index. (IE bug)
	    var cells = col.parentNode.cells;
	    for (var i = 0; i < cells.length; i++) {
		    if (col == cells[i]) cellIndex = i;
	    }
	    return cellIndex;
    },

    _getColumnKey: function(col) {
	    return this._getKey(col, 'pss_col_');
    },

    _getKey: function(element, startsWith) {
        if (element && element.id && element.id.indexOf(startsWith)==0) {
		    return element.id.substr(startsWith.length);
	    }
	    return null;
    }

}
