text: /**
   * jCarousel Pagination Plugin
   *
   * Depends:
   *     core.js
   *     core_plugin.js
   */
  (function($) {
      'use strict';
  
      $.jCarousel.plugin('jcarouselPagination', {
          _options: {
              perPage: null,
              item: function(page) {
                  return '<a href="#' + page + '">' + page + '</a>';
              },
              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;
  
              while (true) {
                  curr = items.eq(idx++);
  
                  if (curr.length === 0) {
                      break;
                  }
  
                  if (!pages[page]) {
                      pages[page] = curr;
                  } else {
                      pages[page] = pages[page].add(curr);
                  }
  
                  wh += carousel.dimension(curr);
  
                  if (wh >= clip) {
                      page++;
                      wh = 0;
                  }
              }
  
              return pages;
          },
          _getCarouselItems: function() {
              if (!this._carouselItems) {
                  this._carouselItems = this.carousel().jcarousel('items');
              }
  
              return this._carouselItems;
          }
      });
  }(jQuery));
  