/*! * jScroll - jQuery Plugin for Infinite Scrolling / Auto-Paging * http://jscroll.com/ * * Copyright 2011-2013, Philip Klauzinski * http://klauzinski.com/ * Dual licensed under the MIT and GPL Version 2 licenses. * http://jscroll.com/#license * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl-2.0.html * * @author Philip Klauzinski * @version 2.3.5 * @requires jQuery v1.4.3+ * @preserve */ (function($) { 'use strict'; // Define the jscroll namespace and default settings $.jscroll = { defaults: { debug: false, autoTrigger: true, autoTriggerUntil: false, loadingHtml: 'Loading...', loadingFunction: false, padding: 0, nextSelector: 'a:last', contentSelector: '', pagingSelector: '', callback: false } }; // Constructor var jScroll = function($e, options) { // Private vars and methods var _data = $e.data('jscroll'), _userOptions = (typeof options === 'function') ? { callback: options } : options, _options = $.extend({}, $.jscroll.defaults, _userOptions, _data || {}), _isWindow = ($e.css('overflow-y') === 'visible'), _$next = $e.find(_options.nextSelector).first(), _$window = $(window), _$body = $('body'), _$scroll = _isWindow ? _$window : $e, _nextHref = $.trim(_$next.attr('href') + ' ' + _options.contentSelector), // Check if a loading image is defined and preload _preloadImage = function() { var src = $(_options.loadingHtml).filter('img').attr('src'); if (src) { var image = new Image(); image.src = src; } }, // Wrap inner content, if it isn't already _wrapInnerContent = function() { if (!$e.find('.jscroll-inner').length) { $e.contents().wrapAll('
'); } }, // Find the next link's parent, or add one, and hide it _nextWrap = function($next) { var $parent; if (_options.pagingSelector) { $next.closest(_options.pagingSelector).hide(); } else { $parent = $next.parent().not('.jscroll-inner,.jscroll-added').addClass('jscroll-next-parent').hide(); if (!$parent.length) { $next.wrap('').parent().hide(); } } }, // Remove the jscroll behavior and data from an element _destroy = function() { return _$scroll.unbind('.jscroll') .removeData('jscroll') .find('.jscroll-inner').children().unwrap() .filter('.jscroll-added').children().unwrap(); }, // Observe the scroll event for when to trigger the next load _observe = function() { if ($e.is(':visible')) { _wrapInnerContent(); var $inner = $e.find('div.jscroll-inner').first(), data = $e.data('jscroll'), borderTopWidth = parseInt($e.css('borderTopWidth'), 10), borderTopWidthInt = isNaN(borderTopWidth) ? 0 : borderTopWidth, iContainerTop = parseInt($e.css('paddingTop'), 10) + borderTopWidthInt, iTopHeight = _isWindow ? _$scroll.scrollTop() : $e.offset().top, innerTop = $inner.length ? $inner.offset().top : 0, iTotalHeight = Math.ceil(iTopHeight - innerTop + _$scroll.height() + iContainerTop); if (!data.waiting && iTotalHeight + _options.padding >= $inner.outerHeight()) { //data.nextHref = $.trim(data.nextHref + ' ' + _options.contentSelector); _debug('info', 'jScroll:', $inner.outerHeight() - iTotalHeight, 'from bottom. Loading next request...'); return _load(); } } }, // Check if the href for the next set of content has been set _checkNextHref = function(data) { data = data || $e.data('jscroll'); if (!data || !data.nextHref) { _debug('warn', 'jScroll: nextSelector not found - destroying'); _destroy(); return false; } else { _setBindings(); return true; } }, _setBindings = function() { var $next = $e.find(_options.nextSelector).first(); if (!$next.length) { return; } if (_options.autoTrigger && (_options.autoTriggerUntil === false || _options.autoTriggerUntil > 0)) { _nextWrap($next); var scrollingBodyHeight = _$body.height() - $e.offset().top, scrollingHeight = ($e.height() < scrollingBodyHeight) ? $e.height() : scrollingBodyHeight, windowHeight = ($e.offset().top - _$window.scrollTop() > 0) ? _$window.height() - ($e.offset().top - $(window).scrollTop()) : _$window.height(); if (scrollingHeight <= windowHeight) { _observe(); } _$scroll.unbind('.jscroll').bind('scroll.jscroll', function() { return _observe(); }); if (_options.autoTriggerUntil > 0) { _options.autoTriggerUntil--; } } else { _$scroll.unbind('.jscroll'); $next.bind('click.jscroll', function() { _nextWrap($next); _load(); return false; }); } }, // Load the next set of content, if available _load = function() { var $inner = $e.find('div.jscroll-inner').first(), data = $e.data('jscroll'); data.waiting = true; $inner.append('') .children('.jscroll-added').last() .html('