1/* 2 * pagination.js 2.0.7 3 * A jQuery plugin to provide simple yet fully customisable pagination. 4 * https://github.com/superRaytin/paginationjs 5 * 6 * Homepage: http://paginationjs.com 7 * 8 * Copyright 2014-2100, superRaytin 9 * Released under the MIT license. 10 */ 11 12(function(global, $) { 13 14 if (typeof $ === 'undefined') { 15 throwError('Pagination requires jQuery.'); 16 } 17 18 var pluginName = 'pagination'; 19 20 var pluginHookMethod = 'addHook'; 21 22 var eventPrefix = '__pagination-'; 23 24 // Conflict, use backup 25 if ($.fn.pagination) { 26 pluginName = 'pagination2'; 27 } 28 29 $.fn[pluginName] = function(options) { 30 31 if (typeof options === 'undefined') { 32 return this; 33 } 34 35 var container = $(this); 36 37 var pagination = { 38 39 initialize: function() { 40 var self = this; 41 42 // Save attributes of current instance 43 if (!container.data('pagination')) { 44 container.data('pagination', {}); 45 } 46 47 // Before initialize 48 if (self.callHook('beforeInit') === false) return; 49 50 // If pagination has been initialized, destroy it 51 if (container.data('pagination').initialized) { 52 $('.paginationjs', container).remove(); 53 } 54 55 // Whether to disable Pagination at the initialization 56 self.disabled = !!attributes.disabled; 57 58 // Passed to the callback function 59 var model = self.model = { 60 pageRange: attributes.pageRange, 61 pageSize: attributes.pageSize 62 }; 63 64 // "dataSource"`s type is unknown, parse it to find true data 65 self.parseDataSource(attributes.dataSource, function(dataSource) { 66 67 // Whether pagination is sync mode 68 self.sync = Helpers.isArray(dataSource); 69 if (self.sync) { 70 model.totalNumber = attributes.totalNumber = dataSource.length; 71 } 72 73 // Obtain the total number of pages 74 model.totalPage = self.getTotalPage(); 75 76 // Less than one page 77 if (attributes.hideWhenLessThanOnePage) { 78 if (model.totalPage <= 1) return; 79 } 80 81 var el = self.render(true); 82 83 // Extra className 84 if (attributes.className) { 85 el.addClass(attributes.className); 86 } 87 88 model.el = el; 89 90 // Load template 91 container[attributes.position === 'bottom' ? 'append' : 'prepend'](el); 92 93 // Binding events 94 self.observer(); 95 96 // initialized flag 97 container.data('pagination').initialized = true; 98 99 // After initialized 100 self.callHook('afterInit', el); 101 }); 102 }, 103 104 render: function(isBoot) { 105 var self = this; 106 var model = self.model; 107 var el = model.el || $('<div class="paginationjs"></div>'); 108 var isForced = isBoot !== true; 109 110 // Before render 111 self.callHook('beforeRender', isForced); 112 113 var currentPage = model.pageNumber || attributes.pageNumber; 114 var pageRange = attributes.pageRange; 115 var totalPage = model.totalPage; 116 117 var rangeStart = currentPage - pageRange; 118 var rangeEnd = currentPage + pageRange; 119 120 if (rangeEnd > totalPage) { 121 rangeEnd = totalPage; 122 rangeStart = totalPage - pageRange * 2; 123 rangeStart = rangeStart < 1 ? 1 : rangeStart; 124 } 125 126 if (rangeStart <= 1) { 127 rangeStart = 1; 128 129 rangeEnd = Math.min(pageRange * 2 + 1, totalPage); 130 } 131 132 el.html(self.createTemplate({ 133 currentPage: currentPage, 134 pageRange: pageRange, 135 totalPage: totalPage, 136 rangeStart: rangeStart, 137 rangeEnd: rangeEnd 138 })); 139 140 // After render 141 self.callHook('afterRender', isForced); 142 143 return el; 144 }, 145 146 // Create template 147 createTemplate: function(args) { 148 var self = this; 149 var currentPage = args.currentPage; 150 var totalPage = args.totalPage; 151 var rangeStart = args.rangeStart; 152 var rangeEnd = args.rangeEnd; 153 154 var totalNumber = attributes.totalNumber; 155 156 var showPrevious = attributes.showPrevious; 157 var showNext = attributes.showNext; 158 var showPageNumbers = attributes.showPageNumbers; 159 var showNavigator = attributes.showNavigator; 160 var showGoInput = attributes.showGoInput; 161 var showGoButton = attributes.showGoButton; 162 163 var pageLink = attributes.pageLink; 164 var prevText = attributes.prevText; 165 var nextText = attributes.nextText; 166 var ellipsisText = attributes.ellipsisText; 167 var goButtonText = attributes.goButtonText; 168 169 var classPrefix = attributes.classPrefix; 170 var activeClassName = attributes.activeClassName; 171 var disableClassName = attributes.disableClassName; 172 var ulClassName = attributes.ulClassName; 173 174 var formatNavigator = $.isFunction(attributes.formatNavigator) ? attributes.formatNavigator() : attributes.formatNavigator; 175 var formatGoInput = $.isFunction(attributes.formatGoInput) ? attributes.formatGoInput() : attributes.formatGoInput; 176 var formatGoButton = $.isFunction(attributes.formatGoButton) ? attributes.formatGoButton() : attributes.formatGoButton; 177 178 var autoHidePrevious = $.isFunction(attributes.autoHidePrevious) ? attributes.autoHidePrevious() : attributes.autoHidePrevious; 179 var autoHideNext = $.isFunction(attributes.autoHideNext) ? attributes.autoHideNext() : attributes.autoHideNext; 180 181 var header = $.isFunction(attributes.header) ? attributes.header() : attributes.header; 182 var footer = $.isFunction(attributes.footer) ? attributes.footer() : attributes.footer; 183 184 var html = ''; 185 var goInput = '<input type="text" class="J-paginationjs-go-pagenumber">'; 186 var goButton = '<input type="button" class="J-paginationjs-go-button" value="' + goButtonText + '">'; 187 var formattedString; 188 var i; 189 190 if (header) { 191 formattedString = self.replaceVariables(header, { 192 currentPage: currentPage, 193 totalPage: totalPage, 194 totalNumber: totalNumber 195 }); 196 html += formattedString; 197 } 198 199 if (showPrevious || showPageNumbers || showNext) { 200 html += '<div class="paginationjs-pages">'; 201 202 if (ulClassName) { 203 html += '<ul class="' + ulClassName + '">'; 204 } else { 205 html += '<ul>'; 206 } 207 208 // Previous page button 209 if (showPrevious) { 210 if (currentPage === 1) { 211 if (!autoHidePrevious) { 212 html += '<li class="' + classPrefix + '-prev ' + disableClassName + '"><a style="cursor:no-drop;" data-href="#">«<\/a><\/li>'; 213 html += '<li class="' + classPrefix + '-prev ' + disableClassName + '"><a style="cursor:no-drop;" data-href="#">
213' + prevText + '<\/a><\/li>'; 214 } 215 } else { 216 html += '<li class="' + classPrefix + '-prev J-paginationjs-previous" data-num="' + 1 + '"><a style="cursor:pointer;" data-href="' + pageLink + '">«<\/a><\/li>'; 217 html += '<li class="' + classPrefix + '-prev J-paginationjs-previous" data-num="' + (currentPage - 1) + '"><a style="cursor:pointer;" data-href="' + pageLink + '">' + prevText + '<\/a><\/li>'; 218 } 219 } 220 221 // Page numbers 222 if (showPageNumbers) { 223 if (rangeStart <= 3) { 224 for (i = 1; i < rangeStart; i++) { 225 if (i == currentPage) { 226 html += '<li class="' + classPrefix + '-page J-paginationjs-page ' + activeClassName + '" data-num="' + i + '"><a>' + i + '<\/a><\/li>'; 227 } else { 228 html += '<li class="' + classPrefix + '-page J-paginationjs-page" data-num="' + i + '"><a style="cursor:pointer;" data-href="' + pageLink + '">' + i + '<\/a><\/li>'; 229 } 230 } 231 } else { 232 if (attributes.showFirstOnEllipsisShow) { 233 html += '<li class="' + classPrefix + '-page ' + classPrefix + '-first J-paginationjs-page" data-num="1"><a style="cursor:pointer;" data-href="' + pageLink + '">1<\/a><\/li>'; 234 } 235 html += '<li class="' + classPrefix + '-ellipsis ' + disableClassName + '"><a>' + ellipsisText + '<\/a><\/li>'; 236 } 237 238 // Main loop 239 for (i = rangeStart; i <= rangeEnd; i++) { 240 if (i == currentPage) { 241 html += '<li class="' + classPrefix + '-page J-paginationjs-page ' + activeClassName + '" data-num="' + i + '"><a>' + i + '<\/a><\/li>'; 242 } else { 243 html += '<li class="' + classPrefix + '-page J-paginationjs-page" data-num="' + i + '"><a style="cursor:pointer;" data-href="' + pageLink + '">' + i + '<\/a><\/li>'; 244 } 245 } 246 247 if (rangeEnd >= totalPage - 2) { 248 for (i = rangeEnd + 1; i <= totalPage; i++) { 249 html += '<li class="' + classPrefix + '-page J-paginationjs-page" data-num="' + i + '"><a style="cursor:pointer;" data-href="' + pageLink + '">' + i + '<\/a><\/li>'; 250 } 251 } else { 252 html += '<li class="' + classPrefix + '-ellipsis ' + disableClassName + '"><a>' + ellipsisText + '<\/a><\/li>'; 253 254 if (attributes.showLastOnEllipsisShow) { 255 html += '<li class="' + classPrefix + '-page ' + classPrefix + '-last J-paginationjs-page" data-num="' + totalPage + '"><a style="cursor:pointer;" data-href="' + pageLink + '">' + totalPage + '<\/a><\/li>'; 256 } 257 } 258 } 259 260 // Next page button 261 if (showNext) { 262 if (currentPage == totalPage) { 263 if (!autoHideNext) { 264 html += '<li class="' + classPrefix + '-next ' + disableClassName + '"><a style="cursor:no-drop;" data-href="#">
264' + nextText + '<\/a><\/li>'; 265 html += '<li class="' + classPrefix + '-next ' + disableClassName + '"><a style="cursor:no-drop;" data-href="#">»<\/a><\/li>'; 266 } 267 } else { 268 html += '<li class="' + classPrefix + '-next J-paginationjs-next" data-num="' + (currentPage + 1) + '"><a style="cursor:pointer;" data-href="' + pageLink + '">' + nextText + '<\/a><\/li>'; 269 html += '<li class="' + classPrefix + '-next J-paginationjs-next" data-num="' + totalPage + '"><a style="cursor:pointer;" data-href="' + pageLink + '">»<\/a><\/li>'; 270 } 271 } 272 html += '<\/ul><\/div>'; 273 } 274 275 // Navigator 276 if (showNavigator) { 277 if (formatNavigator) { 278 formattedString = self.replaceVariables(formatNavigator, { 279 currentPage: currentPage, 280 totalPage: totalPage, 281 totalNumber: totalNumber 282 }); 283 html += '<div class="' + classPrefix + '-nav J-paginationjs-nav">' + formattedString + '<\/div>'; 284 } 285 } 286 287 // Go input 288 if (showGoInput) { 289 if (formatGoInput) { 290 formattedString = self.replaceVariables(formatGoInput, { 291 currentPage: currentPage, 292 totalPage: totalPage, 293 totalNumber: totalNumber, 294 input: goInput 295 }); 296 html += '<div class="' + classPrefix + '-go-input">' + formattedString + '</div>'; 297 } 298 } 299 300 // Go button 301 if (showGoButton) { 302 if (formatGoButton) { 303 formattedString = self.replaceVariables(formatGoButton, { 304 currentPage: currentPage, 305 totalPage: totalPage, 306 totalNumber: totalNumber, 307 button: goButton 308 }); 309 html += '<div class="' + classPrefix + '-go-button">' + formattedString + '</div>'; 310 } 311 } 312 313 if (footer) { 314 formattedString = self.replaceVariables(footer, { 315 currentPage: currentPage, 316 totalPage: totalPage, 317 totalNumber: totalNumber 318 }); 319 html += formattedString; 320 } 321 322 return html; 323 }, 324 325 // Go to the specified page 326 go: function(number, callback) { 327 var self = this; 328 var model = self.model; 329 330 if (self.disabled) return; 331 332 var pageNumber = number; 333 var pageSize = attributes.pageSize; 334 var totalPage = model.totalPage; 335 336 pageNumber = parseInt(pageNumber); 337 338 // Page number out of bounds 339 if (!pageNumber || pageNumber < 1 || pageNumber > totalPage) return; 340 341 // Sync mode 342 if (self.sync) { 343 render(self.getDataSegment(pageNumber)); 344 return; 345 } 346 347 var postData = {}; 348 var alias = attributes.alias || {}; 349 350 postData[alias.pageSize ? alias.pageSize : 'pageSize'] = pageSize; 351 postData[alias.pageNumber ? alias.pageNumber : 'pageNumber'] = pageNumber; 352 353 var formatAjaxParams = { 354 type: 'get', 355 cache: false, 356 data: {}, 357 contentType: 'application/x-www-form-urlencoded; charset=UTF-8', 358 dataType: 'json', 359 async: true 360 }; 361 362 $.extend(true, formatAjaxParams, attributes.ajax); 363 $.extend(formatAjaxParams.data || {}, postData); 364 365 formatAjaxParams.url = attributes.dataSource; 366 formatAjaxParams.success = function(response) { 367 render(self.filterDataByLocator(response)); 368 }; 369 formatAjaxParams.error = function(jqXHR, textStatus, errorThrown) { 370 attributes.formatAjaxError && attributes.formatAjaxError(jqXHR, textStatus, errorThrown); 371 self.enable(); 372 }; 373 374 self.disable(); 375 376 $.ajax(formatAjaxParams); 377 378 function render(data) { 379 // Before paging 380 if (self.callHook('beforePaging', pageNumber) === false) return false; 381 382 // Pagination direction 383 model.direction = typeof model.pageNumber === 'undefined' ? 0 : (pageNumber > model.pageNumber ? 1 : -1); 384 385 model.pageNumber = pageNumber; 386 387 self.render(); 388 389 if (self.disabled && !self.sync) { 390 // enable 391 self.enable(); 392 } 393 394 // cache model data 395 container.data('pagination').model = model; 396 397 // format result before execute callback 398 if ($.isFunction(attributes.formatResult)) { 399 var cloneData = $.extend(true, [], data); 400 if (!Helpers.isArray(data = attributes.formatResult(cloneData))) { 401 data = cloneData; 402 } 403 } 404 405 container.data('pagination').currentPageData = data; 406 407 // callback 408 self.doCallback(data, callback); 409 410 // After pageing 411 self.callHook('afterPaging', pageNumber); 412 413 // Already the first page 414 if (pageNumber == 1) { 415 self.callHook('afterIsFirstPage'); 416 } 417 418 // Already the last page 419 if (pageNumber == model.totalPage) { 420 self.callHook('afterIsLastPage'); 421 } 422 } 423 }, 424 425 doCallback: function(data, customCallback) { 426 var self = this; 427 var model = self.model; 428 429 if ($.isFunction(customCallback)) { 430 customCallback(data, model); 431 } else if ($.isFunction(attributes.callback)) { 432 attributes.callback(data, model); 433 } 434 }, 435 436 destroy: function() { 437 // Before destroy 438 if (this.callHook('beforeDestroy') === false) return; 439 440 this.model.el.remove(); 441 container.off(); 442 443 // Remove style element 444 $('#paginationjs-style').remove(); 445 446 // After destroy 447 this.callHook('afterDestroy'); 448 }, 449 450 previous: function(callback) { 451 this.go(this.model.pageNumber - 1, callback); 452 }, 453 454 next: function(callback) { 455 this.go(this.model.pageNumber + 1, callback); 456 }, 457 458 disable: function() { 459 var self = this; 460 var source = self.sync ? 'sync' : 'async'; 461 462 // Before disabling 463 if (self.callHook('beforeDisable', source) === false) return; 464 465 self.disabled = true; 466 self.model.disabled = true; 467 468 // After disabling 469 self.callHook('afterDisable', source); 470 }, 471 472 enable: function() { 473 var self = this; 474 var source = self.sync ? 'sync' : 'async'; 475 476 // Before enabling 477 if (self.callHook('beforeEnable', source) === false) return; 478 479 self.disabled = false; 480 self.model.disabled = false; 481 482 // After enabling 483 self.callHook('afterEnable', source); 484 }, 485 486 refresh: function(callback) {
vendor: 8,671 bytes, lines 487-764
487 this.go(this.model.pageNumber, callback); 488 }, 489 490 show: function() { 491 var self = this; 492 493 if (self.model.el.is(':visible')) return; 494 495 self.model.el.show(); 496 }, 497 498 hide: function() { 499 var self = this; 500 501 if (!self.model.el.is(':visible')) return; 502 503 self.model.el.hide(); 504 }, 505 506 // Replace variables of template 507 replaceVariables: function(template, variables) { 508 var formattedString; 509 510 for (var key in variables) { 511 var value = variables[key]; 512 var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img'); 513 514 formattedString = (formattedString || template).replace(regexp, value); 515 } 516 517 return formattedString; 518 }, 519 520 // Get data segments 521 getDataSegment: function(number) { 522 var pageSize = attributes.pageSize; 523 var dataSource = attributes.dataSource; 524 var totalNumber = attributes.totalNumber; 525 526 var start = pageSize * (number - 1) + 1; 527 var end = Math.min(number * pageSize, totalNumber); 528 529 return dataSource.slice(start - 1, end); 530 }, 531 532 // Get total page 533 getTotalPage: function() { 534 return Math.ceil(attributes.totalNumber / attributes.pageSize); 535 }, 536 537 // Get locator 538 getLocator: function(locator) { 539 var result; 540 541 if (typeof locator === 'string') { 542 result = locator; 543 } else if ($.isFunction(locator)) { 544 result = locator(); 545 } else { 546 throwError('"locator" is incorrect. (String | Function)'); 547 } 548 549 return result; 550 }, 551 552 // Filter data by "locator" 553 filterDataByLocator: function(dataSource) { 554 var locator = this.getLocator(attributes.locator); 555 var filteredData; 556 557 // Data source is an Object, use "locator" to locate the true data 558 if (Helpers.isObject(dataSource)) { 559 try { 560 $.each(locator.split('.'), function(index, item) { 561 filteredData = (filteredData ? filteredData : dataSource)[item]; 562 }); 563 } 564 catch (e) { 565 } 566 567 if (!filteredData) { 568 throwError('dataSource.' + locator + ' is undefined.'); 569 } else if (!Helpers.isArray(filteredData)) { 570 throwError('dataSource.' + locator + ' must be an Array.'); 571 } 572 } 573 574 return filteredData || dataSource; 575 }, 576 577 // Parse dataSource 578 parseDataSource: function(dataSource, callback) { 579 var self = this; 580 var args = arguments; 581 582 if (Helpers.isObject(dataSource)) { 583 callback(attributes.dataSource = self.filterDataByLocator(dataSource)); 584 } else if (Helpers.isArray(dataSource)) { 585 callback(attributes.dataSource = dataSource); 586 } else if ($.isFunction(dataSource)) { 587 attributes.dataSource(function(data) { 588 if ($.isFunction(data)) { 589 throwError('Unexpect parameter of the "done" Function.'); 590 } 591 args.callee.call(self, data, callback); 592 }); 593 } else if (typeof dataSource === 'string') { 594 if (/^https?|file:/.test(dataSource)) { 595 attributes.ajaxDataType = 'jsonp'; 596 } 597 callback(dataSource); 598 } else { 599 throwError('Unexpect data type of the "dataSource".'); 600 } 601 }, 602 603 callHook: function(hook) { 604 var paginationData = container.data('pagination'); 605 var result; 606 607 var args = Array.prototype.slice.apply(arguments); 608 args.shift(); 609 610 if (attributes[hook] && $.isFunction(attributes[hook])) { 611 if (attributes[hook].apply(global, args) === false) { 612 result = false; 613 } 614 } 615 616 if (paginationData.hooks && paginationData.hooks[hook]) { 617 $.each(paginationData.hooks[hook], function(index, item) { 618 if (item.apply(global, args) === false) { 619 result = false; 620 } 621 }); 622 } 623 624 return result !== false; 625 }, 626 627 observer: function() { 628 var self = this; 629 var el = self.model.el; 630 631 // Go to page 632 container.on(eventPrefix + 'go', function(event, pageNumber, done) { 633 pageNumber = parseInt($.trim(pageNumber)); 634 635 if (!pageNumber) return; 636 637 if (!$.isNumeric(pageNumber)) { 638 throwError('"pageNumber" is incorrect. (Number)'); 639 } 640 641 self.go(pageNumber, done); 642 }); 643 644 // Page click 645 el.delegate('.J-paginationjs-page', 'click', function(event) { 646 var current = $(event.currentTarget); 647 var pageNumber = $.trim(current.attr('data-num')); 648 649 if (!pageNumber || current.hasClass(attributes.disableClassName) || current.hasClass(attributes.activeClassName)) return; 650 651 // Before page button clicked 652 if (self.callHook('beforePageOnClick', event, pageNumber) === false) return false; 653 654 self.go(pageNumber); 655 656 // After page button clicked 657 self.callHook('afterPageOnClick', event, pageNumber); 658 659 if (!attributes.pageLink) return false; 660 }); 661 662 // Previous click 663 el.delegate('.J-paginationjs-previous', 'click', function(event) { 664 var current = $(event.currentTarget); 665 var pageNumber = $.trim(current.attr('data-num')); 666 667 if (!pageNumber || current.hasClass(attributes.disableClassName)) return; 668 669 // Before previous clicked 670 if (self.callHook('beforePreviousOnClick', event, pageNumber) === false) return false; 671 672 self.go(pageNumber); 673 674 // After previous clicked 675 self.callHook('afterPreviousOnClick', event, pageNumber); 676 677 if (!attributes.pageLink) return false; 678 }); 679 680 // Next click 681 el.delegate('.J-paginationjs-next', 'click', function(event) { 682 var current = $(event.currentTarget); 683 var pageNumber = $.trim(current.attr('data-num')); 684 685 if (!pageNumber || current.hasClass(attributes.disableClassName)) return; 686 687 // Before next clicked 688 if (self.callHook('beforeNextOnClick', event, pageNumber) === false) return false; 689 690 self.go(pageNumber); 691 692 // After next clicked 693 self.callHook('afterNextOnClick', event, pageNumber); 694 695 if (!attributes.pageLink) return false; 696 }); 697 698 // Go button click 699 el.delegate('.J-paginationjs-go-button', 'click', function() { 700 var pageNumber = $('.J-paginationjs-go-pagenumber', el).val(); 701 702 // Before Go button clicked 703 if (self.callHook('beforeGoButtonOnClick', event, pageNumber) === false) return false; 704 705 container.trigger(eventPrefix + 'go', pageNumber); 706 707 // After Go button clicked 708 self.callHook('afterGoButtonOnClick', event, pageNumber); 709 }); 710 711 // go input enter 712 el.delegate('.J-paginationjs-go-pagenumber', 'keyup', function(event) { 713 if (event.which === 13) { 714 var pageNumber = $(event.currentTarget).val(); 715 716 // Before Go input enter 717 if (self.callHook('beforeGoInputOnEnter', event, pageNumber) === false) return false; 718 719 container.trigger(eventPrefix + 'go', pageNumber); 720 721 // Regains focus 722 $('.J-paginationjs-go-pagenumber', el).focus(); 723 724 // After Go input enter 725 self.callHook('afterGoInputOnEnter', event, pageNumber); 726 } 727 }); 728 729 // Previous page 730 container.on(eventPrefix + 'previous', function(event, done) { 731 self.previous(done); 732 }); 733 734 // Next page 735 container.on(eventPrefix + 'next', function(event, done) { 736 self.next(done); 737 }); 738 739 // Disable 740 container.on(eventPrefix + 'disable', function() { 741 self.disable(); 742 }); 743 744 // Enable 745 container.on(eventPrefix + 'enable', function() { 746 self.enable(); 747 }); 748 749 // Refresh 750 container.on(eventPrefix + 'refresh', function(event, done) { 751 self.refresh(done); 752 }); 753 754 // Show 755 container.on(eventPrefix + 'show', function() { 756 self.show(); 757 }); 758 759 // Hide 760 container.on(eventPrefix + 'hide', function() { 761 self.hide(); 762 }); 763 764 // Destroy
765 container.on(eventPrefix + 'destroy', function() { 766 self.destroy(); 767 }); 768 769 // Whether to load the default page 770 if (attributes.triggerPagingOnInit) { 771 container.trigger(eventPrefix + 'go', Math.min(attributes.pageNumber, self.model.totalPage)); 772 } 773 } 774 }; 775 776 // If initial 777 if (container.data('pagination') && container.data('pagination').initialized === true) { 778 // Handling events 779 if ($.isNumeric(options)) { 780 // container.pagination(5) 781 container.trigger.call(this, eventPrefix + 'go', options, arguments[1]); 782 return this; 783 } else if (typeof options === 'string') { 784 var args = Array.prototype.slice.apply(arguments); 785 args[0] = eventPrefix + args[0]; 786 787 switch (options) { 788 case 'previous': 789 case 'next': 790 case 'go': 791 case 'disable': 792 case 'enable': 793 case 'refresh': 794 case 'show': 795 case 'hide': 796 case 'destroy': 797 container.trigger.apply(this, args); 798 break; 799 // Get selected page number 800 case 'getSelectedPageNum': 801 if (container.data('pagination').model) { 802 return container.data('pagination').model.pageNumber; 803 } else { 804 return container.data('pagination').attributes.pageNumber; 805 } 806 // Get total page 807 case 'getTotalPage': 808 return container.data('pagination').model.totalPage; 809 // Get selected page data 810 case 'getSelectedPageData': 811 return container.data('pagination').currentPageData; 812 // Whether pagination was be disabled 813 case 'isDisabled': 814 return container.data('pagination').model.disabled === true; 815 default: 816 throwError('Pagination do not provide action: ' + options); 817 } 818 return this; 819 } else { 820 // Uninstall the old instance before initialize a new one 821 uninstallPlugin(container); 822 } 823 } else { 824 if (!Helpers.isObject(options)) throwError('Illegal options'); 825 } 826 827 // Attributes 828 var attributes = $.extend({}, arguments.callee.defaults, options); 829 830 // Check parameters 831 parameterChecker(attributes); 832 833 pagination.initialize(); 834 835 return this; 836 }; 837 838 // Instance defaults 839 $.fn[pluginName].defaults = { 840 841 // Data source 842 // Array | String | Function | Object 843 //dataSource: '', 844 845 // String | Function 846 //locator: 'data', 847 848 // Total entries, must be specified when the pagination is asynchronous 849 totalNumber: 1, 850 851 // Default page 852 pageNumber: 1, 853 854 // entries of per page 855 pageSize: 10, 856 857 // Page range (pages on both sides of the current page) 858 pageRange: 2, 859 860 // Whether to display the 'Previous' button 861 showPrevious: true, 862 863 // Whether to display the 'Next' button 864 showNext: true, 865 866 // Whether to display the page buttons 867 showPageNumbers: true, 868 869 showNavigator: false, 870 871 // Whether to display the 'Go' input 872 showGoInput: false, 873 874 // Whether to display the 'Go' button 875 showGoButton: false, 876 877 // Page link 878 pageLink: '', 879 880 // 'Previous' text 881 prevText: '«', 882 883 // 'Next' text 884 nextText: '»', 885 886 // Ellipsis text 887 ellipsisText: '...', 888 889 // 'Go' button text 890 goButtonText: 'Go', 891 892 // Additional className for Pagination element 893 //className: '', 894 895 classPrefix: 'paginationjs', 896 897 // Default active class 898 activeClassName: 'active', 899 900 // Default disable class 901 disableClassName: 'disabled', 902 903 //ulClassName: '', 904 905 // Whether to insert inline style 906 inlineStyle: true, 907 908 formatNavigator: '<%= currentPage %> / <%= totalPage %>', 909 910 formatGoInput: '<%= input %>', 911 912 formatGoButton: '<%= button %>', 913 914 // Pagination element's position in the container 915 position: 'bottom', 916 917 // Auto hide previous button when current page is the first page 918 autoHidePrevious: false, 919 920 // Auto hide next button when current page is the last page 921 autoHideNext: false, 922 923 //header: '', 924 925 //footer: '', 926 927 // Aliases for custom pagination parameters 928 //alias: {}, 929 930 // Whether to trigger pagination at initialization 931 triggerPagingOnInit: true, 932 933 // Whether to hide pagination when less than one page 934 hideWhenLessThanOnePage: false, 935 936 showFirstOnEllipsisShow: true, 937 938 showLastOnEllipsisShow: true, 939 940 // Pagging callback 941 callback: function() { 942 } 943 }; 944 945 // Hook register 946 $.fn[pluginHookMethod] = function(hook, callback) { 947 if (arguments.length < 2) { 948 throwError('Missing argument.'); 949 } 950 951 if (!$.isFunction(callback)) { 952 throwError('callback must be a function.'); 953 } 954 955 var container = $(this); 956 var paginationData = container.data('pagination'); 957 958 if (!paginationData) { 959 container.data('pagination', {}); 960 paginationData = container.data('pagination'); 961 } 962 963 !paginationData.hooks && (paginationData.hooks = {}); 964 965 //paginationData.hooks[hook] = callback; 966 paginationData.hooks[hook] = paginationData.hooks[hook] || []; 967 paginationData.hooks[hook].push(callback); 968 969 }; 970 971 // Static method 972 $[pluginName] = function(selector, options) { 973 if (arguments.length < 2) { 974 throwError('Requires two parameters.'); 975 } 976 977 var container; 978
979 // 'selector' is a jQuery object 980 if (typeof selector !== 'string' && selector instanceof jQuery) { 981 container = selector; 982 } else { 983 container = $(selector); 984 } 985 986 if (!container.length) return; 987 988 container.pagination(options); 989 990 return container; 991 }; 992 993 // ============================================================ 994 // helpers 995 // ============================================================ 996 997 var Helpers = {}; 998 999 // Throw error 1000 function throwError(content) { 1001 throw new Error('Pagination: ' + content); 1002 } 1003 1004 // Check parameters 1005 function parameterChecker(args) { 1006 if (!args.dataSource) { 1007 throwError('"dataSource" is required.'); 1008 } 1009 1010 if (typeof args.dataSource === 'string') { 1011 if (typeof args.totalNumber === 'undefined') { 1012 throwError('"totalNumber" is required.'); 1013 } else if (!$.isNumeric(args.totalNumber)) { 1014 throwError('"totalNumber" is incorrect. (Number)'); 1015 } 1016 } else if (Helpers.isObject(args.dataSource)) { 1017 if (typeof args.locator === 'undefined') { 1018 throwError('"dataSource" is an Object, please specify "locator".'); 1019 } else if (typeof args.locator !== 'string' && !$.isFunction(args.locator)) { 1020 throwError('' + args.locator + ' is incorrect. (String | Function)'); 1021 } 1022 } 1023 } 1024 1025 // uninstall plugin 1026 function uninstallPlugin(target) { 1027 var events = ['go', 'previous', 'next', 'disable', 'enable', 'refresh', 'show', 'hide', 'destroy']; 1028 1029 // off events of old instance 1030 $.each(events, function(index, value) { 1031 target.off(eventPrefix + value); 1032 }); 1033 1034 // reset pagination data 1035 target.data('pagination', {}); 1036 1037 // remove old 1038 $('.paginationjs', target).remove(); 1039 } 1040 1041 // Object type detection 1042 function getObjectType(object, tmp) { 1043 return ( (tmp = typeof(object)) == "object" ? object == null && "null" || Object.prototype.toString.call(object).slice(8, -1) : tmp ).toLowerCase(); 1044 } 1045 1046 $.each(['Object', 'Array'], function(index, name) { 1047 Helpers['is' + name] = function(object) { 1048 return getObjectType(object) === name.toLowerCase(); 1049 }; 1050 }); 1051 1052 /* 1053 * export via AMD or CommonJS 1054 * */ 1055 if (typeof define === 'function' && define.amd) { 1056 define(function() { 1057 return $; 1058 }); 1059 } 1060 1061})(this, window.jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.