(function($) {
    $.fn.extend({
        watajax: function(options) {
    		var defaults = {
    		   page: 1,
    		   per_page: 30,
    		   pager_max_buttons: 5,
    		   ajax_connector: '/ajax.php',
    		   table_id: 1,
    		   sort_order: "DESC",
    		   search: "",
    		   search_timeout: 300,
    		   tools_position: "under",
    		   table_class: "watajax_table"
    		};       
    		var options = $.extend(defaults, options);
    		var table = $(this);
    		var dataOptions = {};
    		var searchTimeout = null;
    		
    		/**
    		 * Methods
    		 */
    		this.loadFromConnector = function(section, args) {
    			var _this = this;
    			var args = (args == undefined) ? "" : args;
    			$('#'+table.attr('id')+"_table_loading").show();
    			
    			if (section == "body") {
    				args += "watajax_page="+options.page+"&";
					args += "watajax_per_page="+options.per_page+"&";	
    				
    				if (options.sortBy) {
    					args += "watajax_sortBy="+options.sortBy+"&";	
    					args += "watajax_sortOrder="+options.sort_order+"&";	    					
    				}
    				if (options.search != "") {
    					args += "watajax_search="+options.search+"&";
    				}
    			}
    			$.ajax({
	  			      url:	options.ajax_connector+"?action=watajax_load_"+section+"&watajax_table="+options.table_id+"&"+args,
	  			      dataType: "html",
	  			      success: function(msg, stat){
	    				if (stat == "success") {
	    					$('#'+table.attr('id')+"_table_loading").hide();
	    					$('#'+table.attr('id')+"_table_"+section).html(msg);
	    					if (section == "head") {
	    						_this.activateHeader();
	    					} else if (section == "body") {
	    						$('#'+table.attr('id')+"_table_body tr:odd").addClass('zebra');
	    						$('#'+table.attr('id')+"_table_body tr").hover(
	    								   function() { $(this).addClass("highlight") },
	    								   function() { $(this).removeClass("highlight") }
	    						)}
	    				}
	    			  }
	  			   }
	  			);
    		}
    		
    		this.loadSettingsFromConnector = function (args) {
    			var _this = this;
    			$('#'+table.attr('id')+"_table_loading").show();
				args = "watajax_page="+options.page+"&";
				args += "watajax_per_page="+options.per_page+"&";
    			$.ajax({
	  			      url:	options.ajax_connector+"?action=watajax_load_settings&watajax_table="+options.table_id+"&"+args,
	  			      dataType: "json",
	  			      success: function(msg, stat){
	    				if (stat == "success") {
	    					$('#'+table.attr('id')+"_table_loading").hide();
	    					dataOptions = msg;
	    					_this.createPager();
	    					_this.createSearch();
	    				} else {
	    					alert('Could not load WATAJAX settings');
	    			    }
	    			  }
	  			   }
	  			) 			
    		}
    		
    		this.activateHeader = function () {
    			var _this = this;
    			$('#'+table.attr('id')+"_table_head tr th").each(function () {
    				$(this).click(function () {
    					_this.sortBy($(this).attr('id'));
    					$('#'+table.attr('id')+"_table_head tr th").removeClass('header_sorting');
    					$(this).addClass('header_sorting');
    				})
    			})
    		}
    		
    		this.sortBy = function (column) {
    			options.sort_order = (options.sort_order == "ASC") ? "DESC" : "ASC";    			
    			options.sortBy = column;
    			this.loadFromConnector('body');
    		}
    		
    		this.gotoPage = function (page) {
    			options.page = page;
    			this.createPager();
    			this.loadFromConnector('body');
    		}
    		
    		this.search = function (string) {
    			options.page = 1;
    			this.createPager();
    			options.search = string;
    			this.loadFromConnector('body');
    		}
    		
    		this.searchKeyUp = function (string) {
    			var _this = this;
    			clearTimeout(searchTimeout);
    			searchTimeout = setTimeout(function () {
    				_this.search(string);
    			}, options.search_timeout);
    		}
    		
    		this.createSearch = function () {
    			var _this = this;
				var search_title = document.createElement('div');
				search_title.className = "search_title";
				search_title.innerHTML = "Sök:";
				
				var search_input = document.createElement('input');
				search_input.type = "text";
				search_input.id = "search_input";
				$(search_input).keyup(function () {
					_this.searchKeyUp($(this).val());
				});
				
				$('#'+table.attr('id')+"_table_search").append(search_title); 
				$('#'+table.attr('id')+"_table_search").append(search_input); 
    		}
    		
    		this.createPager = function () {
    			var _this = this;
    			if (dataOptions.pages > 1) {
    				$('#'+table.attr('id')+"_table_pager").html(''); // Empty pager first
    				var pager_title = document.createElement('div');
    				pager_title.innerHTML = 'Sida ';
    				pager_title.className = 'pager_title';
					$('#'+table.attr('id')+"_table_pager").append(pager_title);    				

					/**
					 * Check if we need to show the first page button
					 */
					if (options.page > options.pager_max_buttons) { 
    					var pager_button = document.createElement('div');
    					pager_button.className = "page_button";
    					pager_button.innerHTML = 1;
    					$(pager_button).click(function () { _this.gotoPage(1);});
    					$('#'+table.attr('id')+"_table_pager").append(pager_button);
    					var pager_button = document.createElement('div');
    					pager_button.className = "page_button page_dots";
    					pager_button.innerHTML = "...";
    					$('#'+table.attr('id')+"_table_pager").append(pager_button);    					
					}
					
					/**
					 * Render page buttons
					 */					
    				var i_start = (options.page - ((options.pager_max_buttons-1)/2))-1;
    				var i_end = i_start + options.pager_max_buttons;
    				i_end = (i_end > dataOptions.pages) ? dataOptions.pages : i_end;
    				i_start = (i_start < 0) ? 0 : i_start;
    				
					for(var i=i_start; i<i_end; i++) {
    					var pager_button = document.createElement('div');
    					pager_button.className = "page_button";
    					pager_button.innerHTML = (i+1);
    					if (options.page == (i+1)) {
    						pager_button.className = "page_button current_page";
    					}
    					$(pager_button).click(function () {
        					var page_ref = $(this).html();
    						_this.gotoPage(page_ref);
    					});
    					$('#'+table.attr('id')+"_table_pager").append(pager_button);
    				}

					/**
					 * Check if we need to show the last page button
					 */
					if (options.page < (dataOptions.pages-options.pager_max_buttons)) { 
    					var pager_button = document.createElement('div');
    					pager_button.className = "page_button page_dots";
    					pager_button.innerHTML = "...";
    					$('#'+table.attr('id')+"_table_pager").append(pager_button);    											
    					var pager_button = document.createElement('div');
    					pager_button.className = "page_button";
    					pager_button.innerHTML = dataOptions.pages;
    					$(pager_button).click(function () { _this.gotoPage(dataOptions.pages);});
    					$('#'+table.attr('id')+"_table_pager").append(pager_button);
					}
    				
    			}
    		}
    		
    		this.init = function() {
    			table.html(
    					"<table class='"+options.table_class+"' cellspacing='0' id='"+table.attr('id')+"_table'>" +
    					"<thead id='"+table.attr('id')+"_table_head'></thead>" +
    					"<tbody id='"+table.attr('id')+"_table_body'></tbody>" +
    					"</table>");
    			var tools = "<div id='"+table.attr('id')+"_table_pager' class='table_pager'></div>" +
				"<div id='"+table.attr('id')+"_table_search' class='table_search'></div>" +
				"<div id='"+table.attr('id')+"_table_loading' class='ajax_loading'></div>";
    			if (options.tools_position == "above") {
    				table.html(tools+table.html());
    			} else {
    				table.html(table.html()+tools);
    			}
    			$('#'+table.attr('id')+"_table_loading").hide();
    			this.loadFromConnector('head');
    			this.loadFromConnector('body');
    			this.loadSettingsFromConnector();
    		}
    		
    		this.init();    		
        }
    });
})(jQuery);

