Subversion Repositories cheapmusic

Rev

Rev 128 | Blame | Compare with Previous | Last modification | View Log | RSS feed

(function($) {
    $.fn.paginate = function(options) {
        var defaults = {
            paginateElement: 'li',
            hashPage: 'page',
            elementsPerPage: 10,
            maxPageButtons: 5,
            firstButton: true,
            firstButtonText: '<<',
            lastButton: true,
            lastButtonText: '>>',
            prevButton: true,
            prevButtonText: '<',
            nextButton: true,
            nextButtonText: '>',
            extraButtonClasses: '',
            functionOnNav: null
        };

        return this.each(function() {
            if (typeof plugin == 'undefined') {
                plugin = {};
                newPlugin = true;
            } else {
                newPlugin = false;
            }

            if (newPlugin) {
                plugin.el = $(this);
                plugin.el.addClass('paginateList');

                plugin.settings = {
                    pages: 0,
                    objElements: Object,
                    currentPage: 1
                };
            }

            var getNbOfPages = function() {
                return Math.ceil(plugin.objElements.length / plugin.settings.elementsPerPage);
            };

            var displayNav = function() {
                htmlNav = '<div class="paginateNav text-center' + (plugin.settings.pages <= 1 ? " invisible" : "") + '">';

                if (plugin.settings.firstButton) {
                    htmlNav += '<a href="#' + plugin.settings.hashPage + ':1" title="First page" rel="1" class="first mr-1 ' + plugin.settings.extraButtonClasses + '">' + plugin.settings.firstButtonText + '</a>';
                }

                if (plugin.settings.prevButton) {
                    htmlNav += '<a href="" title="Previous Page" rel="" class="prev mr-1 ' + plugin.settings.extraButtonClasses + '">' + plugin.settings.prevButtonText + '</a>';
                }

                pagesLeft = plugin.settings.pages - plugin.settings.currentPage + 1;
                if (plugin.settings.pages > plugin.settings.maxPageButtons && pagesLeft >= plugin.settings.maxPageButtons) {
                    startPage = plugin.settings.currentPage - Math.floor((plugin.settings.maxPageButtons - 2) / 2);
                    showPages = plugin.settings.maxPageButtons - 2;
                } else {
                    startPage = plugin.settings.pages - plugin.settings.maxPageButtons + 1;
                    showPages = plugin.settings.maxPageButtons;
                }
                startPage = (startPage < 1) ? 1 : startPage;

                for (j = 1, i = startPage; j <= showPages && i <= plugin.settings.pages; j++, i++) {
                    htmlNav += '<a href="#' + plugin.settings.hashPage + ':' + i + '" title="Page ' + i + '" rel="' + i + '" class="pageNoNav' + i + ' page mx-1 ' + plugin.settings.extraButtonClasses + '">' + i + '</a>';
                }

                if (plugin.settings.pages > plugin.settings.maxPageButtons && pagesLeft >= plugin.settings.maxPageButtons) {
                    htmlNav += '<span class="btn-sm mx-1 ' + plugin.settings.extraButtonClasses + '">...</span>';
                    htmlNav += '<a href="#' + plugin.settings.hashPage + ':' + plugin.settings.pages + '" title="Page ' + plugin.settings.pages + '" rel="' + plugin.settings.pages + '" class="pageNoNav' + plugin.settings.pages + ' page mx-1 ' + plugin.settings.extraButtonClasses + '">' + plugin.settings.pages + '</a>';
                }

                if (plugin.settings.nextButton) {
                    htmlNav += '<a href="" title="Next Page" rel="" class="next ml-1 ' + plugin.settings.extraButtonClasses + '">' + plugin.settings.nextButtonText + '</a>';
                }

                if (plugin.settings.lastButton) {
                    htmlNav += '<a href="#' + plugin.settings.hashPage + ':' + plugin.settings.pages + '" title="Last page" rel="' + plugin.settings.pages + '" class="last ml-1 ' + plugin.settings.extraButtonClasses + '">' + plugin.settings.lastButtonText + '</a>';
                }

                htmlNav += '</div>';
                plugin.nav = $(htmlNav);
//                plugin.nav.css({
//                    'width': plugin.el.width()
//                });

                $('.paginateNav').remove();
                plugin.el.after(plugin.nav);

                var elSelector = '#' + plugin.el.get(0).id + ' + ';
                $(elSelector + ' .paginateNav a.page,' +
                    elSelector + ' .paginateNav a.first,' +
                    elSelector + ' .paginateNav a.last').on('click', function(e) {
                    e.preventDefault();
                    displayPage($(this).attr('rel'));
                    if (plugin.settings.functionOnNav) plugin.settings.functionOnNav();
                });

                $(elSelector + ' .paginateNav a.prev').on('click', function(e) {
                    e.preventDefault();
                    page = plugin.settings.currentPage > 1 ? parseInt(plugin.settings.currentPage) - 1 : 1;
                    displayPage(page);
                    if (plugin.settings.functionOnNav) plugin.settings.functionOnNav();
                });

                $(elSelector + ' .paginateNav a.next').on('click', function(e) {
                    e.preventDefault();
                    page = plugin.settings.currentPage < plugin.settings.pages ? parseInt(plugin.settings.currentPage) + 1 : plugin.settings.pages;
                    displayPage(page);
                    if (plugin.settings.functionOnNav) plugin.settings.functionOnNav();
                });
            };

            var displayPage = function(page) {
                plugin.settings.currentPage = parseInt(page);
                displayNav();
                offsetStart = (page - 1) * plugin.settings.elementsPerPage;
                offsetEnd = page * plugin.settings.elementsPerPage;
                transition_default (offsetStart, offsetEnd);

                if (plugin.nav !== undefined) {
                    plugin.nav.find('.current').removeClass('current');
//                    plugin.nav.find('a.page:eq(' + (page - 1) + ')').addClass('current');
                    plugin.nav.find('a.pageNoNav' + page + '').addClass('current');
                }

                switch (plugin.settings.currentPage) {
                    case 1:
                        $('.paginateNav a', plugin).removeClass('disabled');
                        $('.paginateNav a.first, .paginateNav a.prev', plugin).addClass('disabled');
                        break;
                    case plugin.settings.pages:
                        $('.paginateNav a', plugin).removeClass('disabled');
                        $('.paginateNav a.last, .paginateNav a.next', plugin).addClass('disabled');
                        break;
                    default:
                        $('.paginateNav a', plugin).removeClass('disabled');
                        break;
                }
            };

            var transition_default = function(offsetStart, offsetEnd) {
                //plugin.currentElements.hide();
                plugin.currentElements.addClass("d-none");
                plugin.currentElements = plugin.objElements.slice(offsetStart, offsetEnd).clone();
                plugin.el.html(plugin.currentElements);
                //plugin.currentElements.show();
                plugin.currentElements.removeClass("d-none");
            };

            plugin.settings = $.extend({}, defaults, options);
            plugin.settings.currentPage = 1;
            plugin.currentElements = $([]);

            if (newPlugin) {
                plugin.objElements = plugin.el.find(plugin.settings.paginateElement);
            } else {
                $('.paginateNav').remove();
            }

            plugin.settings.pages = getNbOfPages();
            plugin.el.html();

            displayNav();

            page = 1;
            if (document.location.hash.indexOf('#' + plugin.settings.hashPage + ':') != -1) {
                page = parseInt(document.location.hash.replace('#' + plugin.settings.hashPage + ':', ''));
                if (page.length <= 0 || page < 1 || page > plugin.settings.pages) {
                    page = 1;
                }
            }

            displayPage(page);
        });
    };
})(jQuery);