﻿/// <reference path="../Javascript/jQueryIntellisense.js"/>

(function ($) {


    $.fn.facetSearchPager = function (options) {

        this.each(function () {

            var defaults = {}; // set defaults in vb
            var config = $.extend(defaults, options);

            // NAMED ELEMENTS

            var self = this, $self = $(this);
            var $facetSearch = $self.parents(".FacetSearchContainer");
            var facetSearch = $facetSearch[0];
            var $prevButton = $("a.PrevButton", $self);
            var $nextButton = $("a.NextButton", $self);
            var $firstButton = $("a.firstButton", $self);
            var $lastButton = $("a.LastButton", $self);
            var $firstButtonContainer = $("span.FirstButtonContainer", $self);
            var $lastButtonContainer = $("span.LastButtonContainer", $self);
            var $pageButtonContainer = $("span.PageButtonContainer", $self);

            // WIRE UP EVENTS

            $self.bind("dataBind", dataBind);

            // PUBLIC 

            var resultCount = 0;
            self.setResultCount = function (value) {
                resultCount = value;
                $self.trigger("dataBind");
            };
            self.getResultCount = function () {
                return resultCount
            };

            var page = 1; // 1 = first page
            self.setPage = function (value) {
                page = value;
                $self.trigger("dataBind");
            };
            self.getPage = function () {
                return page;
            }

            // PRIVATE

            function getPageCount() {
                return Math.floor(resultCount / facetSearch.getPageSize) + 1;
            }

            // EVENT HANDLERS

            function dataBind(event) {
                // This layout and logic is copied directly from StackOverflow's pager. 
                // Suppose there are 20 pages; as you page through, this is what you will see:
                // [1] 2 3 4 5 ... 20  next
                // prev  1 [2] 3 4 5 ... 20  next
                // prev  1 2 [3] 4 5 ... 20  next
                // prev  1 2 3 [4] 5 ... 20  next
                // prev  1 ... 3 4 [5] 6 7 ... 20  next
                // prev  1 ... 4 5 [6] 7 8 ... 20  next
                // ...
                // prev  1 ... 13 14 [15] 16 17 ... 20 next 
                // prev  1 ... 14 15 [16] 17 18 ... 20 next 
                // prev  1 ... 16 [17] 18 19 20  next 
                // prev  1 ... 16 17 [18] 19 20  next
                // prev  1 ... 16 17 18 [19] 20  next
                // prev  1 ... 16 17 18 19 [20] 
                var pageCount = getPageCount();
                var buttonCount = config.buttonCount;
                if (pageCount == 1) {
                    // one page - no need for a pager
                    $self.hide();
                } else {
                    $self.show();
                    // Hide prev if we're on first page
                    if (page == 1) {
                        $prevButton.hide()
                    } else {
                        $prevButton.show()
                    };
                    // Hide next if we're on last page
                    if (page == pageCount) {
                        $nextButton.hide()
                    } else {
                        $nextButton.show()
                    };
                    // Determine initial page
                    var initialPage;
                    if (page < buttonCount) {
                        // we're towards the beginning
                        initialPage = 1;
                    } else if (page + buttonCount > pageCount) {
                        // we're towards the end
                        initialPage = pageCount - buttonCount + 1;
                    } else {
                        // we're in the middle
                        initialPage = page - Math.floor(buttonCount / 2);
                    }
                    // Determine first/last button visibility
                    if (initialPage > 1) {
                        $firstButtonContainer.show();
                    } else {
                        $firstButtonContainer.hide();
                    };
                    if (initialPage + buttonCount > pageCount) {
                        $lastButtonContainer.hide();
                    } else {
                        $lastButtonContainer.show();
                    }
                    // Populate page buttons
                    $pageButtonContainer.empty();
                    for (i = initialPage; i < initialPage + buttonCount && i <= pageCount; i++) {
                        var $pageButton = $(String.format("<a class='PageButton'>{0}</a>", i))
                        if (i == page) $pageButton.addClass("On");
                        $pageButtonContainer.append($pageButton);
                    }
                    $lastButton.text(pageCount);
                }
                // Wire up events
                $("a.PageButton", $self).unbind("click").bind("click", pageButton_Click);
                $("a.PrevButton", $self).unbind("click").bind("click", prevButton_Click);
                $("a.NextButton", $self).unbind("click").bind("click", nextButton_Click);
                if (event) event.stopPropagation();
            }

            function pageButton_Click(event) {
                self.setPage(parseInt($(this).text()));
                scroll(0, 0); // back to top of page
                $facetSearch.trigger("pageChanged");
            };

            function prevButton_Click(event) {
                var p = page - 1;
                if (p < 1) p = 1;
                self.setPage(p);
                scroll(0, 0); // back to top of page
                $facetSearch.trigger("pageChanged");
            };

            function nextButton_Click(event) {
                var p = page + 1;
                var pageCount = getPageCount();
                if (p > pageCount) p = pageCount;
                self.setPage(p);
                scroll(0, 0); // back to top of page
                $facetSearch.trigger("pageChanged");
            }

        }); // each

        return this; // don't break the chain

    }; // $.fn.facetSearchPager

})(jQuery);



