Rev 119 | Rev 128 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
(function($) {
$.fn.paginate = function(options) {
var defaults = {
paginateElement: 'li',
hashPage: 'page',
elementsPerPage: 10,
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" rel="" class="prev mr-1 ' + plugin.settings.extraButtonClasses + '">' + plugin.settings.prevButtonText + '</a>';
}
//bugbug show less page numbers when the number of pages is too big
for (i = 1; i <= plugin.settings.pages; i++) {
htmlNav += '<a href="#' + plugin.settings.hashPage + ':' + i + '" title="Page ' + i + '" rel="' + i + '" class="page mx-1 ' + plugin.settings.extraButtonClasses + '">' + i + '</a>';
}
if (plugin.settings.nextButton) {
htmlNav += '<a href="" title="Next" 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()
});
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);
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');
}
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 = plugin.objElements.slice(offsetStart, offsetEnd).clone();
plugin.el.html(plugin.currentElements);
plugin.currentElements.show();
};
plugin.settings = $.extend({}, defaults, options);
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);