﻿(function($) {
    var $s = $.serpentine;

    $.extend($s, {
        pagination: function(element, options) {
            $.extend(this, options);
            this.element = element;
            this.isInitialized = false;

            if ($.serpentine.hasDimensions(this.element) && !this.isInitialized)
                this._init();

            var instance = this;
            $("#subnav").bind("selectedIndexChanged", function(event, args) {
                if ($.serpentine.hasDimensions(instance.element) && !instance.isInitialized)
                    instance._init();
            });

            $s.trigger(element, 'load');
        }
    });

    $.extend($s.pagination.prototype, {
        _init: function() {
            this.isInitialized = true;
            if (typeof (this.placeHolder) == "undefined")
                this.placeHolder = null;

            if (typeof (this.pagerItems) == "undefined")
                this.pagerItems = 3;

            this._pageCount = this.element.children.length;

            if (typeof (this.animationEffect) == "undefined")
                this.animationEffect = "fade";

            this._generatePager();
            $(this.placeHolder + " a").click($s.delegate(this, this._pagerClickHandler));
            this.openPage(1);
        },

        _updatePager: function() {
            var currentPage = this._getCurrentPageNumber();
            var pageButtons = $(this.placeHolder).find("a");

            var firstNumber = parseInt(pageButtons.eq(1).text().replace(",", ""));
            var lastNumber = firstNumber + this.pagerItems - 1;
            var currentPageExists = (currentPage >= firstNumber) && (currentPage <= lastNumber);

            var startPage = firstNumber;

            if (currentPage < firstNumber)
                startPage = startPage - 1;

            if (currentPage > lastNumber)
                startPage = startPage + this.pagerItems;

            var j = 1;
            for (i = startPage; i < startPage + this.pagerItems; i++) {
                if ((j == 1) && (i != this._pageCount)) { //first page number
                    pageButtons.eq(j).html("<span>&nbsp;</span>" + i + "<span>,</span>");
                    pageButtons.eq(j).addClass("first-page");
                }
                else if ((j != this.pagerItems) && (i != this._pageCount)) { //middle page
                    pageButtons.eq(j).html(i + "<span>,</span>");
                    pageButtons.eq(j).addClass("middle-page");
                }
                else {//last page number
                    pageButtons.eq(j).html(i + "<span>&nbsp;</span>");
                    pageButtons.eq(j).addClass("last-page");
                }

                if (currentPage == i)
                    pageButtons.eq(j).addClass("selected");
                else
                    pageButtons.eq(j).removeClass("selected");

                if (i > this._pageCount)
                    pageButtons.eq(j).addClass("disabled-page-number");
                else
                    pageButtons.eq(j).removeClass("disabled-page-number");

                j++;
            }

            if (currentPage == 1)
                pageButtons.eq(0).addClass("disabled");
            else
                pageButtons.eq(0).removeClass("disabled");

            if (this._pageCount == currentPage)
                pageButtons.eq(this.pagerItems + 1).addClass("disabled");
            else
                pageButtons.eq(this.pagerItems + 1).removeClass("disabled");

            $(this.placeHolder).find(".pager-wrapper").css("visibility", "visible");

            if (this._pageCount <= 1) {
                $(this.placeHolder).find(".pager-wrapper").addClass("invisible-pager");
            }
        },

        _generatePager: function() {
            var preview = '<td><a class="pagePreview" href="javascript:void(0)"></a></td>';
            var next = '<td><a class="pageNext" href="javascript:void(0)"></a></td>';

            var content = "";
            for (i = 0; i < this.pagerItems; i++)
                content += '<td><a href="javascript:void(0)">' + (i + 1) + '</a></td>';

            var template = '<div id="pager" class="pager-wrapper"><table class="pagination"  cellspacing="0" cellpadding="0" border="0"><tr>' + preview + content + next + '</tr></table></div>';
            $(this.placeHolder).append(template);
        },

        _pagerClickHandler: function(sender, args) {
            var pageIndex = $(sender).text();

            var isPreview = $(sender).hasClass("pagePreview");
            if (isPreview)
                pageIndex = this._getCurrentPageNumber() - 1;

            var isNext = $(sender).hasClass("pageNext");
            if (isNext)
                pageIndex = this._getCurrentPageNumber() + 1;

            var pageNumber = parseInt(pageIndex);
            if (pageNumber != this._getCurrentPageNumber())
                this.openPage(parseInt(pageIndex));
        },

        _getCurrentPageNumber: function() {
            var currentPage = $(this.element).children("div:visible");
            return $(this.element).children("div").index(currentPage) + 1;
        },

        openPage: function(pageNumber) {
            pageNumber = pageNumber - 1;

            var options = {};

            if (pageNumber < 0) return;
            if (pageNumber > this._pageCount - 1) return;

            var oldPageContainer = $(this.element).children("div:visible");
            var newPageContainer = $(this.element).children("div").eq(pageNumber);
            var oldPageContainerIndex = $(this.element).children("div").index(oldPageContainer);
            var newPageContainerIndex = $(this.element).children("div").index(newPageContainer);

            var instance = this;
            var updatePagerAdjustLineHeight = function() {
                $(instance.element).data("sColumnize").adjustLineHeight(
                    $(instance.element).children("div").get(pageNumber),
                    $(instance.element).children("div").length - 1 == pageNumber
                );
                $(instance.element).data("sColumnize").makeItVisible();
                instance._updatePager();
            };

            if (this.animationEffect == "fade") {
                oldPageContainer.hide();
                newPageContainer.fadeIn(updatePagerAdjustLineHeight);
            }
            else if (this.animationEffect == "none") {
                oldPageContainer.hide();
                newPageContainer.show();
                updatePagerAdjustLineHeight();
            }
            else {
                oldPageContainer.fadeOut(function() {
                    newPageContainer.show();
                    if (instance.animationEffect == "slide")
                        options = { direction: "right" };
                    if ((instance.animationEffect == "slide") && (newPageContainerIndex < oldPageContainerIndex))
                        options = { direction: "left" };

                    $(instance.element).show(instance.animationEffect, options, 500, updatePagerAdjustLineHeight);
                });
            }
        }
    });

    $.fn.sPagination = function(options) {
        options = $.extend({}, $.fn.sPagination.defaults, options);

        return this.each(function() {
            options = $.meta ? $.extend({}, options, $(this).data()) : options;

            if (!$(this).data('sPagination'))
                $(this).data('sPagination', new $s.pagination(this, options));
        });
    };
})(jQuery);


