dwz.pagination.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. *
  3. * @author ZhangHuihua@msn.com
  4. * @param {Object} opts Several options
  5. */
  6. (function($){
  7. $.fn.extend({
  8. pagination: function(opts){
  9. var setting = {
  10. first$:"li.j-first", prev$:"li.j-prev", next$:"li.j-next", last$:"li.j-last", nums$:"li.j-num>a", jumpto$:"li.jumpto",
  11. pageNumFrag:'<li class="#liClass#"><a href="javascript:;">#pageNum#</a></li>'
  12. };
  13. return this.each(function(){
  14. var $this = $(this);
  15. var pc = new Pagination(opts);
  16. var interval = pc.getInterval();
  17. var pageNumFrag = '';
  18. for (var i=interval.start; i<interval.end;i++){
  19. pageNumFrag += setting.pageNumFrag.replaceAll("#pageNum#", i).replaceAll("#liClass#", i==pc.getCurrentPage() ? 'selected j-num' : 'j-num');
  20. }
  21. $this.html(DWZ.frag["pagination"].replaceAll("#pageNumFrag#", pageNumFrag).replaceAll("#currentPage#", pc.getCurrentPage())).find("li").hoverClass();
  22. var $first = $this.find(setting.first$);
  23. var $prev = $this.find(setting.prev$);
  24. var $next = $this.find(setting.next$);
  25. var $last = $this.find(setting.last$);
  26. if (pc.hasPrev()){
  27. $first.add($prev).find(">span").hide();
  28. _bindEvent($prev, pc.getCurrentPage()-1, pc.targetType(), pc.rel());
  29. _bindEvent($first, 1, pc.targetType(), pc.rel());
  30. } else {
  31. $first.add($prev).addClass("disabled").find(">a").hide();
  32. }
  33. if (pc.hasNext()) {
  34. $next.add($last).find(">span").hide();
  35. _bindEvent($next, pc.getCurrentPage()+1, pc.targetType(), pc.rel());
  36. _bindEvent($last, pc.numPages(), pc.targetType(), pc.rel());
  37. } else {
  38. $next.add($last).addClass("disabled").find(">a").hide();
  39. }
  40. $this.find(setting.nums$).each(function(i){
  41. _bindEvent($(this), i+interval.start, pc.targetType(), pc.rel());
  42. });
  43. $this.find(setting.jumpto$).each(function(){
  44. var $this = $(this);
  45. var $inputBox = $this.find(":text");
  46. var $button = $this.find(":button");
  47. $button.click(function(event){
  48. var pageNum = $inputBox.val();
  49. if (pageNum && pageNum.isPositiveInteger()) {
  50. dwzPageBreak({targetType:pc.targetType(), rel:pc.rel(), data: {pageNum:pageNum}});
  51. }
  52. });
  53. $inputBox.keyup(function(event){
  54. if (event.keyCode == DWZ.keyCode.ENTER) $button.click();
  55. });
  56. });
  57. });
  58. function _bindEvent($target, pageNum, targetType, rel){
  59. $target.bind("click", {pageNum:pageNum}, function(event){
  60. dwzPageBreak({targetType:targetType, rel:rel, data:{pageNum:event.data.pageNum}});
  61. event.preventDefault();
  62. });
  63. }
  64. },
  65. orderBy: function(options){
  66. var op = $.extend({ targetType:"navTab", rel:"", asc:"asc", desc:"desc"}, options);
  67. return this.each(function(){
  68. var $this = $(this).css({cursor:"pointer"}).click(function(){
  69. var orderField = $this.attr("orderField");
  70. var orderDirection = $this.hasClass(op.asc) ? op.desc : op.asc;
  71. dwzPageBreak({targetType:op.targetType, rel:op.rel, data:{orderField: orderField, orderDirection: orderDirection}});
  72. });
  73. });
  74. },
  75. pagerForm: function(options){
  76. var op = $.extend({pagerForm$:"#pagerForm", parentBox:document}, options);
  77. var frag = '<input type="hidden" name="#name#" value="#value#" />';
  78. return this.each(function(){
  79. var $searchForm = $(this), $pagerForm = $(op.pagerForm$, op.parentBox);
  80. var actionUrl = $pagerForm.attr("action").replaceAll("#rel#", $searchForm.attr("action"));
  81. $pagerForm.attr("action", actionUrl);
  82. $searchForm.find(":input").each(function(){
  83. var $input = $(this), name = $input.attr("name");
  84. if (name && (!$input.is(":checkbox,:radio") || $input.is(":checked"))){
  85. if ($pagerForm.find(":input[name='"+name+"']").length == 0) {
  86. var inputFrag = frag.replaceAll("#name#", name).replaceAll("#value#", $input.val());
  87. $pagerForm.append(inputFrag);
  88. }
  89. }
  90. });
  91. });
  92. }
  93. });
  94. var Pagination = function(opts) {
  95. this.opts = $.extend({
  96. targetType:"navTab", // navTab, dialog
  97. rel:"", //用于局部刷新div id号
  98. totalCount:0,
  99. numPerPage:10,
  100. pageNumShown:10,
  101. currentPage:1,
  102. callback:function(){return false;}
  103. }, opts);
  104. }
  105. $.extend(Pagination.prototype, {
  106. targetType:function(){return this.opts.targetType},
  107. rel:function(){return this.opts.rel},
  108. numPages:function() {
  109. return Math.ceil(this.opts.totalCount/this.opts.numPerPage);
  110. },
  111. getInterval:function(){
  112. var ne_half = Math.ceil(this.opts.pageNumShown/2);
  113. var np = this.numPages();
  114. var upper_limit = np - this.opts.pageNumShown;
  115. var start = this.getCurrentPage() > ne_half ? Math.max( Math.min(this.getCurrentPage() - ne_half, upper_limit), 0 ) : 0;
  116. var end = this.getCurrentPage() > ne_half ? Math.min(this.getCurrentPage()+ne_half, np) : Math.min(this.opts.pageNumShown, np);
  117. return {start:start+1, end:end+1};
  118. },
  119. getCurrentPage:function(){
  120. var currentPage = parseInt(this.opts.currentPage);
  121. if (isNaN(currentPage)) return 1;
  122. return currentPage;
  123. },
  124. hasPrev:function(){
  125. return this.getCurrentPage() > 1;
  126. },
  127. hasNext:function(){
  128. return this.getCurrentPage() < this.numPages();
  129. }
  130. });
  131. })(jQuery);