/**************************************************************

	Script		: Sortable Table
	Version		: 1.4
	Authors		: Samuel Birch
	Desc			: Sorts and filters table elements
	Licence		: Open Source MIT Licence

**************************************************************/
var sortableTable = new Class({							  
	getOptions: function(){
		return {
			overCls: false,
			onClick: false,
			sortOn : 0
		};
	},

	initialize: function(table, options){
		this.setOptions(this.getOptions(), options);
		this.table = $(table);
		this.tHead = this.table.getElement('thead');
		this.tBody = this.table.getElement('tbody');
		this.elements = this.tBody.getElements('tr');
		this.filtered = false;

		this.elements.each(function(el,i){
			if(this.options.overCls){
				el.addEvent('mouseover', function(){
					el.addClass(options.overCls);
				}, this);
				el.addEvent('mouseout', function(){
					el.removeClass(options.overCls);
				});
			}
			if(this.options.onClick){
				el.addEvent('click', options.onClick);
			}
		}, this);
		
		//setup header
		this.tHead.getElements('th').each(function(el,i){
			if(el.getProperty('axis')=='string'||el.getProperty('axis')=='date'){
				el.addEvent('click', this.sort.bind(this,i));
				el.addEvent('mouseover', function(){
					el.addClass('tableHeaderOver');
				});
				el.addEvent('mouseout', function(){
					el.removeClass('tableHeaderOver');
				});
				
				if(i == this.options.sortOn){
					this.options.sortOn=-1;
					el.fireEvent('click');
				}
			}
			else {
				el.setStyle('background-image','none').setStyle('padding','4px');
			}
		}, this);
	},
	
	sort: function(index){
	
		$(document.body).setStyle('cursor','wait');

		if(this.options.onStart){
			this.fireEvent('onStart');
		}
		var header = this.tHead.getElements('th');
		var el = header[index];
		header.each(function(e,i){
			if(i != index){
				e.removeClass('sortedASC');
				e.removeClass('sortedDESC');
			}
		});
		
		if(el.hasClass('sortedASC')){
			el.removeClass('sortedASC');
			el.addClass('sortedDESC');
			el.sortBy = 'DESC';
		}else if(el.hasClass('sortedDESC')){
			el.removeClass('sortedDESC');
			el.addClass('sortedASC');
			el.sortBy = 'ASC';
		}else{
			if(el.getProperty('axis')=='string'){
				el.addClass('sortedASC');
				el.sortBy = 'ASC';
			}else{
				el.addClass('sortedDESC');
				el.sortBy = 'DESC';
			}
		}
		if (this.options.sortOn==index){
			this.elements.reverse();
			this.elements.injectInside(this.tBody);
		}else{
			this.options.sortOn = index;
			
			this.rows = new Array;
			var trs = $A(this.elements);
			while ( row = trs.shift() ) {
				row = { row: row.remove() };
				this.rows.unshift(row);
			}
	
			this.rows.each(function(row){
				row.compare_value = this.textcompare( row );
				row.toString = function(){ return row.compare_value; }
			}.bind( this ));
			this.rows.sort();
			if (el.sortBy=='DESC')this.rows.reverse();
	
			var i=0;
			while (row = this.rows.shift()){
				row.row.injectInside(this.tBody);
				if ((i%2)== 0){row.row.removeClass('g').addClass('w');}
				else {row.row.addClass('g').removeClass('w');}
				i++;
			}
        }
		this.elements = this.tBody.getElements('tr');
		$(document.body).setStyle('cursor','default');
		if(this.options.onComplete){
			this.fireEvent('onComplete');
		}
	},
	textcompare: function(row){
		return $(row.row.getElementsByTagName('td')[this.options.sortOn]).getText();
	}
});
sortableTable.implement(new Events);
sortableTable.implement(new Options);

/*************************************************************/
