// Created by Cameron Graham
// cameron@on.co.nz / http://on.co.nz

(function($) {
	var startoffset		= 0;

	$.fn.ajaxtable = function(options) {
		var defaults = {
			sectionbase: "body",
			offset: 0,
			updateinterval: 15000,
			currentpage: 1,
			lastvalidpage: 1,
			maxpages: 0,
			rowsperpage: 10,
			prevsortedby: "",
			prevsortorder: "",
			sortedby: "id",
			sortorder: "d",
			tableurl: "",
			ajaxloaderpath: "images/ajax-loader.gif",
			callback: ""
		}

		var table_ajaxtable;
		var icon_ajaxloader;
		var button_prevpage;
		var button_nextpage;
		var notify_currentpage;
		var notify_maximumpage;
		var select_rows;

		var settings = $.extend({}, defaults, options);

		return this.each(function() {
			// apply plugin functionality to each element
			if	(	$(this+":has('table')") &&
					$(this).find("tbody")
				) {
				table_ajaxtable		= $(this);
				table_headers		= $(this).find("th a");

				icon_ajaxloader		= $(settings.sectionbase).find(".ajaxtable_loader");

				button_refresh		= $(settings.sectionbase).find(".ajaxtable_refresh");
				button_prevpage		= $(settings.sectionbase).find(".ajaxtable_prevpage");
				button_nextpage		= $(settings.sectionbase).find(".ajaxtable_nextpage");

				notify_currentpage	= $(settings.sectionbase).find(".ajaxtable_currentpage");
				notify_maximumpage	= $(settings.sectionbase).find(".ajaxtable_maximumpage");

				select_rows			= $(settings.sectionbase).find(".ajaxtable_rows");

				$(table_headers).click(function() {
					column = $(this).attr("href");
					if (column != "#" && column != "") {
						sorttable(column);
					}
					return false;
				});
				$(icon_ajaxloader).click(function() {
					gettabledata();
					return false;
				});
				$(button_refresh).click(function() {
					gotopage(0);
					return false;
				});
				$(button_prevpage).click(function() {
					gotopage(-1);
					return false;
				});
				$(button_nextpage).click(function() {
					gotopage(1);
					return false;
				});
				$(select_rows).change(function() {
					settings.currentpage = 1;
					settings.rowsperpage = $(this).val();
					gettabledata();
				});


				gettabledata();
				setTimeout(startpolling, startoffset);

				startoffset += settings.offset;
			}
		});


		function startpolling() {
			setInterval(gettabledata, settings.updateinterval);
		}


		function sorttable(newsortby) {
			if (settings.sortedby == newsortby) {
				if (settings.sortorder == "d") {
					settings.sortorder = "a";
				} else {
					settings.sortorder = "d";
				}
			} else {
				settings.sortorder = "a";
				settings.sortedby = newsortby;
			}
			gettabledata();
		}


		function gotopage(inc) {
			var newpage = settings.currentpage + inc;
			if (newpage > 0 && newpage <= settings.maxpages)
			{
				settings.currentpage = newpage;
			}
			gettabledata();
		}


		function gettabledata() {
			$(icon_ajaxloader).fadeIn();

			if (settings.tableurl != "")
			{
//				$.ajax({
//					type: "GET",
//					url: settings.tableurl,
//					data: {
//						getmaxpages: 1,
//						rows: settings.rowsperpage
//					},
//					dataType: "json",
//					success: function(msg) {
//						if (isNumeric(msg.maxpages)) {
//							settings.maxpages = msg.maxpages;
//							$(notify_maximumpage).text(msg.maxpages);
//						} else {
//							$(notify_maximumpage).text("?");
//						}
//					}
//				});

				$.ajax({
					type: "GET",
					url: settings.tableurl,
					data: {
						page: settings.currentpage,
						rows: settings.rowsperpage,
						sortedby: settings.sortedby,
						sortorder: settings.sortorder,
						seed: Math.ceil(Math.random()*100000)
					},
					dataType: "json",
					success: function(msg) {
						$(notify_currentpage).text(settings.currentpage);
						$(table_ajaxtable).find("tbody").html(msg.returnedhtml);

						if (isNumeric(msg.maxpages)) {
							settings.maxpages = msg.maxpages;
							$(notify_maximumpage).text(msg.maxpages);
						} else {
							$(notify_maximumpage).text("?");
						}

						$(table_ajaxtable).find("tbody tr").each(function() {
							prevcolor = $(this).css("background-color");
							prevtext = $(this).find("td").css("color");
							$(this).hover(function() {
								$(this).css("background-color", "#eee");
								$(this).children("td").css("color", "#000");
							}, function() {
								$(this).css("background-color", prevcolor);
								$(this).children("td").css("color", prevtext);
							});
						});

						container = $(icon_ajaxloader).parent().parent();
						if ($(container).css("display") == "none")
						{
							$(icon_ajaxloader).hide();
						} else {
							$(icon_ajaxloader).fadeOut();
						}

						settings.lastvalidpage = settings.currentpage;

						if (jQuery.isFunction(settings.callback))
						{
							(settings.callback)(msg);
						}
					},
					error: function(msg) {
						alert("Table data currently unavailable");

						// Hack to get around parent hidden bug
						container = $(icon_ajaxloader).parent().parent();
						if ($(container).css("display") == "none")
						{
							$(icon_ajaxloader).hide();
						} else {
							$(icon_ajaxloader).fadeOut();
						}

						settings.currentpage = settings.lastvalidpage;
					}
				});
			} else {
				alert("Invalid URL provided!");
			}
		}

		function isNumeric(value) {
			if (value == null || !value.toString().match(/^[-]?\d*\.?\d*$/)) return false;
			return true;
		}
	};
})(jQuery);
