/*
	Plugin Ajaxtable v1.0.0
	http://imperavi.com/
 
	Copyright 2010, Imperavi Ltd.
	Dual licensed under the MIT or GPL Version 2 licenses.
*/

(function($){
	
	// Initialization	
	$.fn.ajaxtable = function(options)
	{		
		return this.each(function() {
			var obj = new Construct(this, options);
			obj.init();
		});
	};
	
	// Options and variables	
	function Construct(el, options) {

		this.opts = $.extend({
			url: false,
			pages: 1,
			rows: false,
			limit: 20,
			sort: false,
			order: 'asc',
			max: 10
		}, options);
		
		this.$el = $(el);
	};

	// Functionality
	Construct.prototype = {
		init: function()
		{	
		
			var sort = this.parse('sort');
			var order = this.parse('order');
			
			if (sort != 1) this.opts.sort = sort;
			if (order != 1) this.opts.order = order;
		
			var self = this;
			$(this.$el.find('thead td')).each(function()
			{
				var title = $(this).attr('title');
				if (title != '')
				{
					var class_sort = 'arrow_sort'; 
					if (title == self.opts.sort) 
					{
						if (self.opts.order == 'asc') class_sort = 'arrow_up';
						else class_sort = 'arrow_down';
					}
					
					$(this).append('<span id="sort_trigger_' + title + '" class="arrow_table ' + class_sort + '" title="' + title + '">&nbsp;</span>').click(function(e) { this.sort(e); }.bind(self));
				}
			});
			
			this.$tbody = $(this.$el.find('tbody'));			
			this.load(false);
		},
		sort: function(e)
		{	
			var title = $(e.target).attr('title');
			
			this.opts.sort = title;
			
			if ($(e.target).hasClass('arrow_sort'))	var sort = 'up';
			else if ($(e.target).hasClass('arrow_up')) var sort = 'down';
			else if ($(e.target).hasClass('arrow_down')) var sort = 'up';	
			
			$('.arrow_table').removeClass('arrow_up').removeClass('arrow_down').addClass('arrow_sort');						
					
			if (sort == 'up')
			{
				$(e.target).removeClass('arrow_sort').addClass('arrow_up');
				this.opts.order = 'asc';
			}
			else if (sort == 'down')
			{
				$(e.target).removeClass('arrow_sort').addClass('arrow_down');
				this.opts.order = 'desc';
			}

			this.load(true);

		},	
		parse: function(name)
		{
			var param = location.href;
			
			var regex = new RegExp(name + "=(.*?)(&|$)", "gi");
			
			param = param.match(regex);
			if (param == null) param = 1;
			else
			{
				param = param[0];
				param = param.replace('&', '');
				param = param.replace(name + '=', '');			
			}
			
			return param;		
		},
		load: function(reload)
		{
			var page = this.parse('page');

			if (this.opts.sort) params = '?page=' + page + '&sort=' + this.opts.sort + '&order=' + this.opts.order;
 		
 			if (reload !== false) top.location.href = params;
		}	
	};
	
	// bind
	Function.prototype.bind = function(object)
	{
	    var method = this; var oldArguments = $.makeArray(arguments).slice(1);
	    return function (argument)
	    {
	        if (argument == new Object) { method = null; oldArguments = null; }
	        else if (method == null) throw "Attempt to invoke destructed method reference.";
	        else { var newArguments = $.makeArray(arguments); return method.apply(object, oldArguments.concat(newArguments)); }
	    };
	}	
	
})(jQuery);