123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- /*!
- * jQuery pagination plugin v1.4.1
- * http://esimakin.github.io/twbs-pagination/
- *
- * Copyright 2014-2016, Eugene Simakin
- * Released under Apache 2.0 license
- * http://apache.org/licenses/LICENSE-2.0.html
- */
- (function ($, window, document, undefined) {
- 'use strict';
- var old = $.fn.twbsPagination;
- // PROTOTYPE AND CONSTRUCTOR
- var TwbsPagination = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.twbsPagination.defaults, options);
- if (this.options.startPage < 1 || this.options.startPage > this.options.totalPages) {
- throw new Error('Start page option is incorrect');
- }
- this.options.totalPages = parseInt(this.options.totalPages);
- if (isNaN(this.options.totalPages)) {
- throw new Error('Total pages option is not correct!');
- }
- this.options.visiblePages = parseInt(this.options.visiblePages);
- if (isNaN(this.options.visiblePages)) {
- throw new Error('Visible pages option is not correct!');
- }
- if (this.options.onPageClick instanceof Function) {
- this.$element.first().on('page', this.options.onPageClick);
- }
- // hide if only one page exists
- if (this.options.hideOnlyOnePage && this.options.totalPages == 1) {
- this.$element.trigger('page', 1);
- return this;
- }
- if (this.options.totalPages < this.options.visiblePages) {
- this.options.visiblePages = this.options.totalPages;
- }
- if (this.options.href) {
- this.options.startPage = this.getPageFromQueryString();
- if (!this.options.startPage) {
- this.options.startPage = 1;
- }
- }
- var tagName = (typeof this.$element.prop === 'function') ?
- this.$element.prop('tagName') : this.$element.attr('tagName');
- if (tagName === 'UL') {
- this.$listContainer = this.$element;
- } else {
- this.$listContainer = $('<ul></ul>');
- }
- this.$listContainer.addClass(this.options.paginationClass);
- if (tagName !== 'UL') {
- this.$element.append(this.$listContainer);
- }
- if (this.options.initiateStartPageClick) {
- this.show(this.options.startPage);
- } else {
- this.render(this.getPages(this.options.startPage));
- this.setupEvents();
- }
- return this;
- };
- TwbsPagination.prototype = {
- constructor: TwbsPagination,
- destroy: function () {
- this.$element.empty();
- this.$element.removeData('twbs-pagination');
- this.$element.off('page');
- return this;
- },
- show: function (page) {
- if (page < 1 || page > this.options.totalPages) {
- throw new Error('Page is incorrect.');
- }
- this.currentPage = page;
- this.render(this.getPages(page));
- this.setupEvents();
- this.$element.trigger('page', page);
- return this;
- },
- buildListItems: function (pages) {
- var listItems = [];
- if (this.options.first) {
- listItems.push(this.buildItem('first', 1));
- }
- if (this.options.prev) {
- var prev = pages.currentPage > 1 ? pages.currentPage - 1 : this.options.loop ? this.options.totalPages : 1;
- listItems.push(this.buildItem('prev', prev));
- }
- for (var i = 0; i < pages.numeric.length; i++) {
- listItems.push(this.buildItem('page', pages.numeric[i]));
- }
- if (this.options.next) {
- var next = pages.currentPage < this.options.totalPages ? pages.currentPage + 1 : this.options.loop ? 1 : this.options.totalPages;
- listItems.push(this.buildItem('next', next));
- }
- if (this.options.last) {
- listItems.push(this.buildItem('last', this.options.totalPages));
- }
- return listItems;
- },
- buildItem: function (type, page) {
- var $itemContainer = $('<li></li>'),
- $itemContent = $('<a></a>'),
- itemText = this.options[type] ? this.makeText(this.options[type], page) : page;
- $itemContainer.addClass(this.options[type + 'Class']);
- $itemContainer.data('page', page);
- $itemContainer.data('page-type', type);
- $itemContainer.append($itemContent.attr('href', this.makeHref(page)).addClass(this.options.anchorClass).html(itemText));
- return $itemContainer;
- },
- getPages: function (currentPage) {
- var pages = [];
- var half = Math.floor(this.options.visiblePages / 2);
- var start = currentPage - half + 1 - this.options.visiblePages % 2;
- var end = currentPage + half;
- // handle boundary case
- if (start <= 0) {
- start = 1;
- end = this.options.visiblePages;
- }
- if (end > this.options.totalPages) {
- start = this.options.totalPages - this.options.visiblePages + 1;
- end = this.options.totalPages;
- }
- var itPage = start;
- while (itPage <= end) {
- pages.push(itPage);
- itPage++;
- }
- return {"currentPage": currentPage, "numeric": pages};
- },
- render: function (pages) {
- var _this = this;
- this.$listContainer.children().remove();
- var items = this.buildListItems(pages);
- jQuery.each(items, function(key, item){
- _this.$listContainer.append(item);
- });
- this.$listContainer.children().each(function () {
- var $this = $(this),
- pageType = $this.data('page-type');
- switch (pageType) {
- case 'page':
- if ($this.data('page') === pages.currentPage) {
- $this.addClass(_this.options.activeClass);
- }
- break;
- case 'first':
- $this.toggleClass(_this.options.disabledClass, pages.currentPage === 1);
- break;
- case 'last':
- $this.toggleClass(_this.options.disabledClass, pages.currentPage === _this.options.totalPages);
- break;
- case 'prev':
- $this.toggleClass(_this.options.disabledClass, !_this.options.loop && pages.currentPage === 1);
- break;
- case 'next':
- $this.toggleClass(_this.options.disabledClass,
- !_this.options.loop && pages.currentPage === _this.options.totalPages);
- break;
- default:
- break;
- }
- });
- },
- setupEvents: function () {
- var _this = this;
- this.$listContainer.off('click').on('click', 'li', function (evt) {
- var $this = $(this);
- if ($this.hasClass(_this.options.disabledClass) || $this.hasClass(_this.options.activeClass)) {
- return false;
- }
- // Prevent click event if href is not set.
- !_this.options.href && evt.preventDefault();
- _this.show(parseInt($this.data('page')));
- });
- },
- makeHref: function (page) {
- return this.options.href ? this.generateQueryString(page) : "#";
- },
- makeText: function (text, page) {
- return text.replace(this.options.pageVariable, page)
- .replace(this.options.totalPagesVariable, this.options.totalPages)
- },
- getPageFromQueryString: function (searchStr) {
- var search = this.getSearchString(searchStr),
- regex = new RegExp(this.options.pageVariable + '(=([^&#]*)|&|#|$)'),
- page = regex.exec(search);
- if (!page || !page[2]) {
- return null;
- }
- page = decodeURIComponent(page[2]);
- page = parseInt(page);
- if (isNaN(page)) {
- return null;
- }
- return page;
- },
- generateQueryString: function (pageNumber, searchStr) {
- var search = this.getSearchString(searchStr),
- regex = new RegExp(this.options.pageVariable + '=*[^&#]*');
- if (!search) return '';
- return '?' + search.replace(regex, this.options.pageVariable + '=' + pageNumber);
- },
- getSearchString: function (searchStr) {
- var search = searchStr || window.location.search;
- if (search === '') {
- return null;
- }
- if (search.indexOf('?') === 0) search = search.substr(1);
- return search;
- }
- };
- // PLUGIN DEFINITION
- $.fn.twbsPagination = function (option) {
- var args = Array.prototype.slice.call(arguments, 1);
- var methodReturn;
- var $this = $(this);
- var data = $this.data('twbs-pagination');
- var options = typeof option === 'object' ? option : {};
- if (!data) $this.data('twbs-pagination', (data = new TwbsPagination(this, options) ));
- if (typeof option === 'string') methodReturn = data[ option ].apply(data, args);
- return ( methodReturn === undefined ) ? $this : methodReturn;
- };
- $.fn.twbsPagination.defaults = {
- totalPages: 1,
- startPage: 1,
- visiblePages: 5,
- initiateStartPageClick: true,
- hideOnlyOnePage: false,
- href: false,
- pageVariable: '{{page}}',
- totalPagesVariable: '{{total_pages}}',
- page: null,
- first: 'First',
- prev: 'Previous',
- next: 'Next',
- last: 'Last',
- loop: false,
- onPageClick: null,
- paginationClass: 'pagination',
- nextClass: 'page-item next',
- prevClass: 'page-item prev',
- lastClass: 'page-item last',
- firstClass: 'page-item first',
- pageClass: 'page-item',
- activeClass: 'active',
- disabledClass: 'disabled',
- anchorClass: 'page-link'
- };
- $.fn.twbsPagination.Constructor = TwbsPagination;
- $.fn.twbsPagination.noConflict = function () {
- $.fn.twbsPagination = old;
- return this;
- };
- $.fn.twbsPagination.version = "1.4.1";
- })(window.jQuery, window, document);
|