129 lines
4.4 KiB

  1. /**
  2. * @preserve
  3. * bootpag - jQuery plugin for dynamic pagination
  4. *
  5. * Copyright (c) 2013 botmonster@7items.com
  6. *
  7. * Licensed under the MIT license:
  8. * http://www.opensource.org/licenses/mit-license.php
  9. *
  10. * Project home:
  11. * http://botmonster.com/jquery-bootpag/
  12. *
  13. * Version: 1.0.5
  14. *
  15. */
  16. (function($, window) {
  17. $.fn.bootpag = function(options){
  18. var $owner = this,
  19. settings = $.extend({
  20. total: 0,
  21. page: 1,
  22. maxVisible: null,
  23. leaps: true,
  24. href: 'javascript:void(0);',
  25. hrefVariable: '{{number}}',
  26. next: '»',
  27. prev: '«'
  28. },
  29. $owner.data('settings') || {},
  30. options || {});
  31. if(settings.total <= 0)
  32. return this;
  33. if(!$.isNumeric(settings.maxVisible) && !settings.maxVisible){
  34. settings.maxVisible = settings.total;
  35. }
  36. $owner.data('settings', settings);
  37. function renderPage($bootpag, page){
  38. var lp,
  39. maxV = settings.maxVisible == 0 ? 1 : settings.maxVisible,
  40. step = settings.maxVisible == 1 ? 0 : 1,
  41. vis = Math.floor((page - 1) / maxV) * maxV,
  42. $page = $bootpag.find('li');
  43. settings.page = page = page < 0 ? 0 : page > settings.total ? settings.total : page;
  44. $page.removeClass('disabled');
  45. lp = page - 1 < 1 ? 1 :
  46. settings.leaps && page - 1 >= settings.maxVisible ?
  47. Math.floor((page - 1) / maxV) * maxV : page - 1;
  48. $page
  49. .first()
  50. .toggleClass('disabled', page === 1)
  51. .attr('data-lp', lp)
  52. .find('a').attr('href', href(lp));
  53. var step = settings.maxVisible == 1 ? 0 : 1;
  54. lp = page + 1 > settings.total ? settings.total :
  55. settings.leaps && page + 1 < settings.total - settings.maxVisible ?
  56. vis + settings.maxVisible + step: page + 1;
  57. $page
  58. .last()
  59. .toggleClass('disabled', page === settings.total)
  60. .attr('data-lp', lp)
  61. .find('a').attr('href', href(lp));;
  62. var $currPage = $page.filter('[data-lp='+page+']');
  63. if(!$currPage.not('.next,.prev').length){
  64. var d = page <= vis ? -settings.maxVisible : 0;
  65. $page.not('.next,.prev').each(function(index){
  66. lp = index + 1 + vis + d;
  67. $(this)
  68. .attr('data-lp', lp)
  69. .toggle(lp <= settings.total)
  70. .find('a').html(lp).attr('href', href(lp));
  71. });
  72. $currPage = $page.filter('[data-lp='+page+']');
  73. }
  74. $currPage.addClass('disabled');
  75. $owner.data('settings', settings);
  76. }
  77. function href(c){
  78. return settings.href.replace(settings.hrefVariable, c);
  79. }
  80. return this.each(function(){
  81. var $bootpag, lp, me = $(this),
  82. p = ['<ul class="pagination bootpag">'];
  83. if(settings.prev){
  84. p.push('<li data-lp="1" class="prev"><a href="'+href(1)+'">'+settings.prev+'</a></li>');
  85. }
  86. for(var c = 1; c <= Math.min(settings.total, settings.maxVisible); c++){
  87. p.push('<li data-lp="'+c+'"><a href="'+href(c)+'">'+c+'</a></li>');
  88. }
  89. if(settings.next){
  90. lp = settings.leaps && settings.total > settings.maxVisible
  91. ? Math.min(settings.maxVisible + 1, settings.total) : 2;
  92. p.push('<li data-lp="'+lp+'" class="next"><a href="'+href(lp)+'">'+settings.next+'</a></li>');
  93. }
  94. p.push('</ul>');
  95. me.find('ul.bootpag').remove();
  96. me.append(p.join(''));
  97. $bootpag = me.find('ul.bootpag');
  98. me.find('li').click(function paginationClick(){
  99. var me = $(this);
  100. if(me.hasClass('disabled')){
  101. return;
  102. }
  103. var page = parseInt(me.attr('data-lp'), 10);
  104. renderPage($bootpag, page);
  105. $owner.trigger('page', page);
  106. });
  107. renderPage($bootpag, settings.page);
  108. });
  109. }
  110. })(jQuery, window);