/**
 * 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,
            appendContainer: "body",
            startDistanceFromBottom: 20
        }

    };

    $.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
            $(config.appendContainer).append("<div id='loadingContainer'><img src='" + config.loaderImgPath + "' /><span id='loadingText'>Loading more entries</span></div>");
            //            $("#loadingContainer").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";
            config.appendContainer = (config.appendContainer != "") ? config.appendContainer : "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) < config.totalResults) &&
                    !loading &&
                    ($(this).scrollTop() >= ($(document).height() - $(this).height() - config.startDistanceFromBottom))) {

                    // this automatically prevents any further attempts to execute another ajax call until the current ajax call has returned a result
                    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 != "") {
                        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
                        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);
                    $("#loadingContainer").show();

                    // execute our ajax call and deal with the result.
                    var newHtml;
                    $.ajax({
                        type: "GET",
                        dataType: "html",
                        url: config.url,
                        success: function(html) {

                            html = $.trim(html);

                            if (html) {
                                newHtml = $(html);
                                newHtml.hide();
                                $(config.container).append(newHtml)
                                newHtml.fadeIn(1000);
                                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;
                            $("#loadingContainer").hide();
                            $.flexiPagination.completeAction(newHtml);
                        }
                    });
                }
            });

            return this;
        }
    });

    $.flexiPagination.completeAction = function() {
    };
})(jQuery);
