1/**! 2 * MixItUp Pagination v1.1.0 3 * A Premium Extension for MixItUp 4 * 5 * @copyright Copyright 2014 KunkaLabs Limited. 6 * @author KunkaLabs Limited. 7 * @link https://mixitup.kunkalabs.com 8 * 9 * @license To be used under the same terms as MixItUp core. 10 * https://mixitup.kunkalabs.com/licenses/ 11 */ 12 13(function($, undf){ 14 15 /* Add Actions 16 ---------------------------------------------------------------------- */ 17 18 /** 19 * Constructor 20 * @extends _constructor 21 */ 22 23 $.MixItUp.prototype.addAction('_constructor', 'pagination', function(){ 24 var self = this; 25 26 self.pagination = { 27 limit: 0, 28 loop: false, 29 generatePagers: true, 30 maxPagers: 5, 31 pagerClass: '', 32 prevButtonHTML: '«', 33 nextButtonHTML: '»' 34 }; 35 36 $.extend(self.selectors, { 37 pagersWrapper: '.pager-list', 38 pager: '.pager' 39 }); 40 41 $.extend(self.load, { 42 page: 1 43 }); 44 45 self._activePage = null; 46 self._totalPages = null; 47 48 self._$pagersWrapper = $(); 49 }, 1); 50 51 /** 52 * Initialize 53 * @extends $.MixItUp.prototype._init 54 * @priority 1 55 */ 56 57 $.MixItUp.prototype.addAction('_init', 'pagination', function(){ 58 var self = this; 59 60 self._activePage = self.load.page * 1; 61 self.pagination.maxPagers = ( 62 typeof self.pagination.maxPagers === 'number' && 63 self.pagination.maxPagers < 5 64 ) ? 65 5 : 66 self.pagination.maxPagers; 67 }, 1); 68 69 /** 70 * Bind Handlers 71 * @extends $.MixItUp.prototype._bindHandlers 72 * @priority 1 73 */ 74 75 $.MixItUp.prototype.addAction('_bindHandlers', 'pagination', function(){ 76 var self = this; 77 78 if(self.pagination.generatePagers){ 79 self._$pagersWrapper = $(self.selectors.pagersWrapper); 80 }; 81 82 if(self.controls.live){ 83 self._$body.on('click.mixItUp.'+self._id, self.selectors.pager, function(){ 84 self._processClick($(this), 'page'); 85 }); 86 } else { 87 self._$pagersWrapper.on('click.mixItUp.'+self._id, self.selectors.pager, function(){; 88 self._processClick($(this), 'page'); 89 }); 90 } 91 }, 1); 92 93 /** 94 * Process Click 95 * @extends $.MixItUp.prototype._processClick 96 * @priority 1 97 */ 98 99 $.MixItUp.prototype.addAction('_processClick', 'pagination', function(args){ 100 var self = this, 101 pageNumber = null, 102 $button = args[0], 103 type = args[1]; 104 105 if(type === 'page'){ 106 pageNumber = $button.attr('data-page') || false; 107 108 if(pageNumber === 'prev'){ 109 pageNumber = self._getPrevPage(); 110 } else if(pageNumber === 'next'){ 111 pageNumber = self._getNextPage(); 112 } else if(pageNumber){ 113 pageNumber = pageNumber * 1; 114 } else { 115 return false; 116 } 117 118 if(!$button.hasClass(self.controls.activeClass)){ 119 self.paginate(pageNumber); 120 } 121 } 122 }, 1); 123 124 /** 125 * Build State 126 * @extends $.MixItUp.prototype._buildState 127 * @priority 1 128 */ 129 130 $.MixItUp.prototype.addAction('_buildState', 'pagination', function(){ 131 var self = this; 132 133 $.extend(self._state, { 134 limit: self.pagination.limit, 135 activePage: self._activePage, 136 totalPages: self._totalPages 137 }); 138 }, 1); 139 140 /** 141 * Sort 142 * @extends $.MixItUp.prototype._sort 143 * @priority 1 144 */ 145 146 $.MixItUp.prototype.addAction('_sort', 'pagination', function(){ 147 var self = this; 148 149 if(self.pagination.limit > 0){ 150 self._printSort(); 151 } 152 }, 1); 153 154 /** 155 * Filter 156 * @extends $.MixItUp.prototype._filter 157 * @priority 1 158 */ 159 160 $.MixItUp.prototype.addAction('_filter', 'pagination', function(){ 161 var self = this, 162 startPageAt = self.pagination.limit * (self.load.page - 1), 163 endPageAt = (self.pagination.limit * self.load.page) - 1, 164 $inPage = null, 165 $notInPage = null; 166 167 self._activePage = self.load.page; 168 self._totalPages = self.pagination.limit ? Math.ceil(self._$show.length / self.pagination.limit) : 1; 169 170 if(self.pagination.limit > 0){ 171 172 $inPage = self._$show.filter(function(index){ 173 return index >= startPageAt && index <= endPageAt; 174 }); 175 176 $notInPage = self._$show.filter(function(index){ 177 return index < startPageAt || index > endPageAt; 178 }); 179 180 self._$show = $inPage; 181 self._$hide = self._$hide.add($notInPage); 182 183 if(self._sorting){ 184 self._printSort(true); 185 } 186 } 187 188 if(self.pagination.generatePagers && self._$pagersWrapper.length){ 189 self._generatePagers(); 190 }; 191 }, 1); 192 193 /** 194 * MultiMix 195 * @extends $.MixItUp.prototype.multiMix 196 * @priority 0 197 */ 198 199 $.MixItUp.prototype.addAction('multiMix', 'pagination', function(args){ 200 var self = this, 201 args = self._parseMultiMixArgs(args); 202 203 if(args.command.paginate !== undf){ 204 typeof args.command.paginate === 'object' ? 205 $.extend(self.pagination, args.command.paginate) : 206 self.load.page = args.command.paginate; 207 208 } else if(args.command.filter !== undf || args.command.sort !== undf){ 209 self.load.page = 1; 210 } 211 }, 0); 212 213 /** 214 * Destory 215 * @extends $.MixItUp.prototype.destroy 216 * @priority 1 217 */ 218 219 $.MixItUp.prototype.addAction('destroy', 'pagination', function(){ 220 var self = this; 221 222 self._$pagersWrapper.off('.mixItUp').html(''); 223 }, 1); 224 225 /* Add Private Methods 226 ---------------------------------------------------------------------- */ 227 228 $.MixItUp.prototype.extend({ 229 230 /** 231 * Get Next Page 232 * @return {number} page 233 */ 234 235 _getNextPage: function(){ 236 var self = this,
237 page = self._activePage + 1, 238 page = self._activePage < self._totalPages ? 239 page : 240 self.pagination.loop ? 241 1 : 242 self._activePage; 243 244 return self._execFilter('_getNextPage', page * 1); 245 }, 246 247 /** 248 * Get Previous Page 249 * @return {number} page 250 */ 251 252 _getPrevPage: function(){ 253 var self = this, 254 page = self._activePage - 1, 255 page = self._activePage > 1 ? 256 page : 257 self.pagination.loop ? 258 self._totalPages : 259 self._activePage; 260 261 return self._execFilter('_getPrevPage', page * 1); 262 }, 263 264 /** 265 * Generate Pagination Controls 266 */ 267 268 _generatePagers: function(){ 269 var self = this, 270 pagerTag = self._$pagersWrapper[0].nodeName === 'UL' ? 'li' : 'span', 271 pagerClass = self.pagination.pagerClass ? self.pagination.pagerClass+' ' : '', 272 273 prevButtonHTML = '<'+pagerTag+' class="'+pagerClass+'pager page-prev" data-page="prev"><span>'+self.pagination.prevButtonHTML+'</span></'+pagerTag+'>', 274 prevButtonHTML = (self._activePage > 1) ? 275 prevButtonHTML : self.pagination.loop ? prevButtonHTML : 276 '<'+pagerTag+' class="'+pagerClass+'pager page-prev disabled"><span>'+self.pagination.prevButtonHTML+'</span></'+pagerTag+'>'; 277 278 nextButtonHTML = '<'+pagerTag+' class="'+pagerClass+'pager page-next" data-page="next"><span>'+self.pagination.nextButtonHTML+'</span></'+pagerTag+'>', 279 nextButtonHTML = (self._activePage < self._totalPages) ? 280 nextButtonHTML : self.pagination.loop ? nextButtonHTML : 281 '<'+pagerTag+' class="'+pagerClass+'pager page-next disabled"><span>'+self.pagination.nextButtonHTML+'</span></'+pagerTag+'>'; 282 283 totalButtons = ( 284 self.pagination.maxPagers !== false && 285 self._totalPages > self.pagination.maxPagers 286 ) ? 287 self.pagination.maxPagers : 288 self._totalPages, 289 pagerButtonsHTML = '', 290 pagersHTML = '', 291 wrapperClass = ''; 292 293 self._execAction('_generatePagers', 0); 294 295 for(var i = 0; i < totalButtons; i++){ 296 var pagerNumber = null, 297 classes = ''; 298 299 if(i === 0){ 300 pagerNumber = 1; 301 if( 302 self.pagination.maxPagers !== false && 303 self._activePage > (self.pagination.maxPagers - 2) && 304 self._totalPages > self.pagination.maxPagers 305 ){ 306 classes = ' page-first'; 307 } 308 } else { 309 if( 310 self.pagination.maxPagers === false || 311 totalButtons < self.pagination.maxPagers 312 ){ 313 pagerNumber = i + 1; 314 } else { 315 if(i === self.pagination.maxPagers - 1){ 316 pagerNumber = self._totalPages; 317 if(self._activePage < self._totalPages - 2 && self._totalPages > self.pagination.maxPagers){ 318 classes = ' page-last'; 319 } 320 } else{ 321 if( 322 self._activePage > self.pagination.maxPagers - 2 && 323 self._activePage < self._totalPages - 2 324 ){ 325 pagerNumber = self._activePage - (2 - i); 326 } else if(self._activePage < self.pagination.maxPagers - 1){ 327 pagerNumber = i + 1; 328 } else if(self._activePage >= self._totalPages - 2){ 329 pagerNumber = self._totalPages - (self.pagination.maxPagers - 1 - i); 330 } 331 } 332 } 333 } 334 335 classes = (pagerNumber == self._activePage) ? classes+' '+self.controls.activeClass : classes; 336 337 pagerButtonsHTML += '<'+pagerTag+' class="'+pagerClass+'pager page-number'+classes+'" data-page="'+pagerNumber+'"><span>'+pagerNumber+'</span></'+pagerTag+'> '; 338 } 339 340 pagersHTML = self._totalPages > 1 ? prevButtonHTML+' '+pagerButtonsHTML+' '+nextButtonHTML : ''; 341 342 wrapperClass = self._totalPages > 1 ? '' : 'no-pagers'; 343 344 self._$pagersWrapper.html(pagersHTML).removeClass('no-pagers').addClass(wrapperClass); 345 346 self._execAction('_generatePagers', 1); 347 }, 348 349 /** 350 * Parse Paginate Arguments 351 * @param {array} args 352 * @return {object} output 353 */ 354 355 _parsePaginateArgs: function(args){ 356 var self = this, 357 output = { 358 command: null, 359 animate: self.animation.enable, 360 callback: null 361 }; 362 363 for(var i = 0; i < args.length; i++){ 364 var arg = args[i]; 365 366 if(arg !== null){ 367 if(typeof arg === 'object' || typeof arg === 'number'){ 368 output.command = arg;
369 } else if(typeof arg === 'boolean'){ 370 output.animate = arg; 371 } else if(typeof arg === 'function'){ 372 output.callback = arg; 373 } 374 } 375 } 376 377 return self._execFilter('_parsePaginateArgs', output, arguments); 378 } 379 }); 380 381 /* Add Public Methods 382 ---------------------------------------------------------------------- */ 383 384 $.MixItUp.prototype.extend({ 385 386 /** 387 * Paginate 388 * @param {array} arguments 389 */ 390 391 paginate: function(){ 392 var self = this, 393 args = self._parsePaginateArgs(arguments); 394 395 self.multiMix({paginate: args.command}, args.animate, args.callback); 396 }, 397 398 /** 399 * nextPage 400 * @param {array} arguments 401 */ 402 403 nextPage: function(){ 404 var self = this, 405 args = self._parsePaginateArgs(arguments); 406 407 self.multiMix({paginate: self._getNextPage()}, args.animate, args.callback); 408 }, 409 410 /** 411 * prevPage 412 * @param {array} arguments 413 */ 414 415 prevPage: function(){ 416 var self = this, 417 args = self._parsePaginateArgs(arguments); 418 419 self.multiMix({paginate: self._getPrevPage()}, args.animate, args.callback); 420 } 421 }); 422 423})(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.