/*! jCarousel - v0.3.9 - 2018-07-30 * http://sorgalla.com/jcarousel/ * Copyright (c) 2006-2018 Jan Sorgalla; Licensed MIT */ (function($) { 'use strict'; $.jCarousel.plugin('jcarouselPagination', { _options: { perPage: null, item: function(page) { return '' + page + ''; }, event: 'click', method: 'scroll' }, _carouselItems: null, _pages: {}, _items: {}, _currentPage: null, _init: function() { this.onDestroy = $.proxy(function() { this._destroy(); this.carousel() .one('jcarousel:createend', $.proxy(this._create, this)); }, this); this.onReload = $.proxy(this._reload, this); this.onScroll = $.proxy(this._update, this); }, _create: function() { this.carousel() .one('jcarousel:destroy', this.onDestroy) .on('jcarousel:reloadend', this.onReload) .on('jcarousel:scrollend', this.onScroll); this._reload(); }, _destroy: function() { this._clear(); this.carousel() .off('jcarousel:destroy', this.onDestroy) .off('jcarousel:reloadend', this.onReload) .off('jcarousel:scrollend', this.onScroll); this._carouselItems = null; }, _reload: function() { var perPage = this.options('perPage'); this._pages = {}; this._items = {}; // Calculate pages if ($.isFunction(perPage)) { perPage = perPage.call(this); } if (perPage == null) { this._pages = this._calculatePages(); } else { var pp = parseInt(perPage, 10) || 0, items = this._getCarouselItems(), page = 1, i = 0, curr; while (true) { curr = items.eq(i++); if (curr.length === 0) { break; } if (!this._pages[page]) { this._pages[page] = curr; } else { this._pages[page] = this._pages[page].add(curr); } if (i % pp === 0) { page++; } } } this._clear(); var self = this, carousel = this.carousel().data('jcarousel'), element = this._element, item = this.options('item'), numCarouselItems = this._getCarouselItems().length; $.each(this._pages, function(page, carouselItems) { var currItem = self._items[page] = $(item.call(self, page, carouselItems)); currItem.on(self.options('event') + '.jcarouselpagination', $.proxy(function() { var target = carouselItems.eq(0); // If circular wrapping enabled, ensure correct scrolling direction if (carousel.circular) { var currentIndex = carousel.index(carousel.target()), newIndex = carousel.index(target); if (parseFloat(page) > parseFloat(self._currentPage)) { if (newIndex < currentIndex) { target = '+=' + (numCarouselItems - currentIndex + newIndex); } } else { if (newIndex > currentIndex) { target = '-=' + (currentIndex + (numCarouselItems - newIndex)); } } } carousel[this.options('method')](target); }, self)); element.append(currItem); }); this._update(); }, _update: function() { var target = this.carousel().jcarousel('target'), currentPage; $.each(this._pages, function(page, carouselItems) { carouselItems.each(function() { if (target.is(this)) { currentPage = page; return false; } }); if (currentPage) { return false; } }); if (this._currentPage !== currentPage) { this._trigger('inactive', this._items[this._currentPage]); this._trigger('active', this._items[currentPage]); } this._currentPage = currentPage; }, items: function() { return this._items; }, reloadCarouselItems: function() { this._carouselItems = null; return this; }, _clear: function() { this._element.empty(); this._currentPage = null; }, _calculatePages: function() { var carousel = this.carousel().data('jcarousel'), items = this._getCarouselItems(), clip = carousel.clipping(), wh = 0, idx = 0, page = 1, pages = {}, curr, dim; while (true) { curr = items.eq(idx++); if (curr.length === 0) { break; } dim = carousel.dimension(curr); if ((wh + dim) > clip) { page++; wh = 0; } wh += dim; if (!pages[page]) { pages[page] = curr; } else { pages[page] = pages[page].add(curr); } } return pages; }, _getCarouselItems: function() { if (!this._carouselItems) { this._carouselItems = this.carousel().jcarousel('items'); } return this._carouselItems; } }); }(jQuery));