/**
 * jqPageFlow v0.1b - jQuery plugin
 * Copyright (c) 2009 Barry Roodt (http://calisza.wordpress.com)
 *
 * Licensed under the New BSD license.
 *
 * This plugin makes scrolling pagination possible (such as that found on Google Reader and dzone.com).
 * An example can be found at http://flexidev.co.za/projects/jqpageflow
 * Please check http://code.google.com/p/flexidev/downloads/ for the latest version
 *
 * Special thanks to Christopher Mills (http://imod.co.za) for the help with naming and promoting this plugin
 *
 */

;(function($){
 	$.flexiPagination = {

		defaults: {
			url: "",
   			currentPage: 0,
   			totalResults: 100,
   			perPage: 25,
   			container: "body",
   			pagerVar : "p",
   			loaderImgPath: "images/loader.gif",
   			debug : 0,
   			scrollDiv : "body"
		}

	};

	$.fn.extend({
		flexiPagination:function(config) {
		
			// initialize our config object
			var config = $.extend({}, $.flexiPagination.defaults, config);
			var loading = false;
			
			// create and append our progress indicator div to the body content, then make sure our css is applied
   		$("#jqpageflow-indicator").append("<div id='jqpageflow-block' style=\"align:center;\"><img src='" + config.loaderImgPath + "' /><span id='jqpageflow-text'></span></div>");
			$("#jqpageflow-block").addClass("jqpageflow-loader");
			$("#jqpageflow-text").addClass("jqpageflow-loadertext");
   			 
   		// set default container element as body if config var is empty
   		config.container = (config.container != "") ? config.container : "body";
   			
   		// bind the window's scroll event to a custom function
			$(window).scroll(function(){
				// work out whether we need to fire our ajax call or not
				if ( config.currentPage >= 0 && (config.perPage * (config.currentPage + 1) < config.totalResults)  
				&& !loading && $(this).scrollTop() >= $(config.scrollDiv).offset().top + $(config.scrollDiv).height() - $(this).height() ) {
				   
				loading = true;
				   
				// set a default url if none specified. 
				// Note: this needs to be calculated just before the ajax call since our currentPage counter is updated each time the event is executed 
				if (config.url != "") {
					fullurl = config.url + (config.url.indexOf("?")!==-1 ? "&" : "?") + config.pagerVar + "=" + (config.currentPage + 1);
				} else {
					// the default url is the current window location with the pageVar and currentPage values attached
					fullurl = config.url + window.location + (window.location.search != '' ? "&" : "?") + config.pagerVar + "=" + ( config.currentPage + 1 );
				}
				
				// update the loader text and display the loader.
				//$("#jqpageflow-text").text('Loading results ' + (config.perPage * ((config.currentPage > 0) ? config.currentPage : 1)) + ' of ' + config.totalResults);
				$("#jqpageflow-block").show();
				   
			   // execute our ajax call and deal with the result.
					$.ajax({
						type: "GET",
						dataType: "html",
						url: fullurl,
						success: function( html ) {
							html = $.trim( html );
							if ( html ) {
								$(config.container).append( html );
								config.currentPage++;
							} else {
								// prevent any further attempts to execute the ajax call since the backend is not returning a useable result.
								config.currentPage = -1;
							}
						},
						complete: function() {
							// allow ajax call to be executed again if necessary and hide the loader
							loading = false;
							$("#jqpageflow-block").hide();
						}
					});
				}
			});
			return this;
		}
	});
	
})(jQuery);
