1/** 2 * IAS Paging Extension 3 * An IAS extension providing additional events 4 * https://infiniteajaxscroll.com 5 * 6 * This file is part of the Infinite AJAX Scroll package 7 * 8 * Copyright 2014-2018 Webcreate (Jeroen Fiege) 9 */ 10 11var IASPagingExtension = function() { 12 this.ias = null; 13 this.pagebreaks = [[0, document.location.toString()]]; 14 this.lastPageNum = 1; 15 this.enabled = true; 16 this.listeners = { 17 pageChange: new IASCallbacks(jQuery) 18 }; 19 20 /** 21 * Fires pageChange event 22 * 23 * @param currentScrollOffset 24 * @param scrollThreshold 25 */ 26 this.onScroll = function(currentScrollOffset, scrollThreshold) { 27 if (!this.enabled) { 28 return; 29 } 30 31 var ias = this.ias, 32 currentPageNum = this.getCurrentPageNum(currentScrollOffset), 33 currentPagebreak = this.getCurrentPagebreak(currentScrollOffset), 34 urlPage; 35 36 if (this.lastPageNum !== currentPageNum) { 37 urlPage = currentPagebreak[1]; 38 39 ias.fire('pageChange', [currentPageNum, currentScrollOffset, urlPage]); 40 } 41 42 this.lastPageNum = currentPageNum; 43 }; 44 45 /** 46 * Keeps track of pagebreaks 47 * 48 * @param url 49 */ 50 this.onNext = function(url) { 51 var currentScrollOffset = this.ias.getCurrentScrollOffset(this.ias.$scrollContainer); 52 53 this.pagebreaks.push([currentScrollOffset, url]); 54 55 // trigger pageChange and update lastPageNum 56 var currentPageNum = this.getCurrentPageNum(currentScrollOffset) + 1; 57 58 this.ias.fire('pageChange', [currentPageNum, currentScrollOffset, url]); 59 60 this.lastPageNum = currentPageNum; 61 }; 62 63 /** 64 * Keeps track of pagebreaks 65 * 66 * @param url 67 */ 68 this.onPrev = function(url) { 69 var self = this, 70 ias = self.ias, 71 currentScrollOffset = ias.getCurrentScrollOffset(ias.$scrollContainer), 72 prevCurrentScrollOffset = currentScrollOffset - ias.$scrollContainer.height(), 73 $firstItem = ias.getFirstItem(); 74 75 this.enabled = false; 76 77 this.pagebreaks.unshift([0, url]); 78 79 ias.one('rendered', function() { 80 // update pagebreaks 81 for (var i = 1, l = self.pagebreaks.length; i < l; i++) { 82 self.pagebreaks[i][0] = self.pagebreaks[i][0] + $firstItem.offset().top; 83 } 84 85 // trigger pageChange and update lastPageNum 86 var currentPageNum = self.getCurrentPageNum(prevCurrentScrollOffset) + 1; 87 88 ias.fire('pageChange', [currentPageNum, prevCurrentScrollOffset, url]); 89 90 self.lastPageNum = currentPageNum; 91 92 self.enabled = true; 93 }); 94 }; 95 96 return this; 97}; 98 99/** 100 * @public 101 */ 102IASPagingExtension.prototype.initialize = function(ias) { 103 this.ias = ias; 104 105 // expose the extensions listeners 106 jQuery.extend(ias.listeners, this.listeners); 107}; 108 109/** 110 * @public 111 */ 112IASPagingExtension.prototype.bind = function(ias) { 113 try { 114 ias.on('prev', jQuery.proxy(this.onPrev, this), this.priority); 115 } catch (exception) {} 116 117 ias.on('next', jQuery.proxy(this.onNext, this), this.priority); 118 ias.on('scroll', jQuery.proxy(this.onScroll, this), this.priority); 119}; 120 121/** 122 * @public 123 * @param {object} ias 124 */ 125IASPagingExtension.prototype.unbind = function(ias) { 126 try { 127 ias.off('prev', this.onPrev); 128 } catch (exception) {} 129 130 ias.off('next', this.onNext); 131 ias.off('scroll', this.onScroll); 132}; 133 134/** 135 * Returns current page number based on scroll offset 136 * 137 * @param {number} scrollOffset 138 * @returns {number} 139 */ 140IASPagingExtension.prototype.getCurrentPageNum = function(scrollOffset) { 141 for (var i = (this.pagebreaks.length - 1); i > 0; i--) { 142 if (scrollOffset > this.pagebreaks[i][0]) { 143 return i + 1; 144 } 145 } 146 147 return 1; 148}; 149 150/** 151 * Returns current pagebreak information based on scroll offset 152 * 153 * @param {number} scrollOffset 154 * @returns {number}|null 155 */ 156IASPagingExtension.prototype.getCurrentPagebreak = function(scrollOffset) { 157 for (var i = (this.pagebreaks.length - 1); i >= 0; i--) { 158 if (scrollOffset > this.pagebreaks[i][0]) { 159 return this.pagebreaks[i]; 160 } 161 } 162 163 return null; 164}; 165 166/** 167 * @public 168 * @type {number} 169 */ 170IASPagingExtension.prototype.priority = 500;
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.