var Paginator = function(numPerPage, exp) {
    this.target = $(exp);
    this.numPerPage = numPerPage;
    this.currentPage = 1;
    this.totalPages = 0;
    this.numOfItems = 0;
    this.calcPages();
    this.buttonSize = {width:20, height:60};
}

Paginator.prototype = {

    setUp : function() {
        this.initPages();
        this.enablePaginateButtons();
    },

    calcPages : function() {
        var self = this;
        self.numOfItems = self.target.find('ul li:visible').length;
        self.totalPages = Math.ceil(self.numOfItems / self.numPerPage);
    },

    initPages : function() {
        var self = this;
        for (var i = 1; i <= self.totalPages; i++) {
            var a = "<span class='a_page p" + i + "'>" + i + "</span>";
            self.target.find('.pages_box').append(a);
        }
        this.setCurrentPage(1);
    },

    setCurrentPage : function(num) {
        var self = this;
        var target = self.target.find('.pages_box span.p' + num);
        target.siblings().removeClass('current_page')
            .mouseover(function() {
                $(this).css('cursor', 'pointer');
            })
            .click(function() {
                var toPage = parseInt($(this).text());
                self.moveToPage(toPage);
            });
        target.addClass('current_page')
            .mouseover(function() {
                $(this).css('cursor', 'default');
            });
        self.currentPage = num;
    },

    moveToPage : function(toPage) {
        var self = this;
        if (self.totalPages <= 1) {
            return;
        }

        if (toPage > self.currentPage && toPage > self.totalPages) {
            return self.moveToPage(1);
        }
        if (toPage < self.currentPage && toPage < 1) {
            return self.moveToPage(self.totalPages);
        }

        if (toPage > self.currentPage && toPage <= self.totalPages) {
            var sIndex = (self.currentPage - 1) * self.numPerPage;
            var eIndex = (toPage - 1) * self.numPerPage;
            self.target.find('li').slice(sIndex, eIndex).hide();
            this.setCurrentPage(toPage);
        } else if (toPage < self.currentPage && toPage >= 1) {
            var sIndex = (toPage - 1) * self.numPerPage;
            var eIndex = (self.currentPage - 1) * self.numPerPage;
            self.target.find('li').slice(sIndex, eIndex).show();
            self.setCurrentPage(toPage);
        }
    },

    enablePaginateButtons : function() {
        var self = this;
        var prevButton = self.target.find('.paginate_prev_button');
        var nextButton = self.target.find('.paginate_next_button');
        prevButton.unbind('click');
        nextButton.unbind('click');
        if (self.totalPages <= 1) {
            prevButton.hide();
            nextButton.hide();
            return;
        }

        nextButton.mouseover(function() {
                $(this).css('cursor', 'pointer');
            }).click(function() {
                self.moveToPage(self.currentPage + 1);
            }).show();
        prevButton.mouseover(function() {
                $(this).css('cursor', 'pointer');
            }).click(function() {
                self.moveToPage(self.currentPage - 1);
            }).show();
        if (IE6) {
            prevButton.css(self.buttonSize).css('position', 'absolute');
            nextButton.css(self.buttonSize).css('position', 'absolute');
        }
    }
};

