/*
aasorting="alphaascending" aasortbegin="1" aasortend="last"
aasorting="alphadescending" aasortbegin="1" aasortend="32"
*/
jQuery.fn.sortElements = (function(){
 
    var sort = [].sort;
 
    return function(comparator, getSortable) {
 
        getSortable = getSortable || function(){return this;};
 
        var placements = this.map(function(){
 
            var sortElement = getSortable.call(this),
                parentNode = sortElement.parentNode,
 
                // Since the element itself will change position, we have
                // to have some way of storing its original position in
                // the DOM. The easiest way is to have a 'flag' node:
                nextSibling = parentNode.insertBefore(
                    document.createTextNode(''),
                    sortElement.nextSibling
                );
 
            return function() {
 
                if (parentNode === this) {
                    throw new Error(
                        "You can't sort elements if any one is a descendant of another."
                    );
                }
 
                // Insert before flag:
                parentNode.insertBefore(this, nextSibling);
                // Remove flag:
                parentNode.removeChild(nextSibling);
 
            };
 
        });
 
        return sort.call(this, comparator).each(function(i){
            placements[i].call(getSortable.call(this));
        });
 
    };
 
})();

jQuery.fn.classArguments = (function(){
    return function(className) {
		var wholeClassString = this.attr('class');
		var matchDef = RegExp(className+"_[a-zA-Z0-9_\\\-]+");
		var classString = wholeClassString.match(matchDef);
		var arguments = classString.length > 0 ? classString[0].split('_') : null;
		return arguments.length && arguments.length > 0  ? arguments.slice(1) : null;
    };
})();

$(function() {
	var ascending = function(a, b) {
		return jQuery(a).text() > jQuery(b).text() ? 1 : -1;
	};
	
	var descending = function(a,b) {
		return ascending(a,b) * -1 ;
	};

	$('table.aaSorting').each(function() {
		var table = $(this);
		var classArgs = table.classArguments("sort");
		var sort = classArgs.length == 3 ? {
			order : classArgs[0],
			begin : classArgs[1]-1,
			end : classArgs[2]
		} : null;
		var rows = table.children('tbody').children('tr');
		if(sort && !isNaN(sort.begin) && !isNaN(sort.end)) {
			rows = rows.slice(sort.begin, sort.end);
		}
		else if(sort && !isNaN(sort.begin)) {
			//sort.end is not defined, so only slice away from sort.begin
			rows = rows.slice(sort.begin);
		}
		var sortFunction = sort && sort.order == 'alphadescending' ? descending : ascending;
		rows.sortElements(sortFunction);
	});
});
