123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- (function($, wp, wps, window, undefined) {
- '$:nomunge';
- var $w = $(window),
- waypoints = [],
- oldScroll = -99999,
- didScroll = false,
- didResize = false,
- eventName = 'waypoint.reached',
- methods = {
- init: function(f, options) {
- this.each(function() {
- var $this = $(this),
- ndx = waypointIndex($this),
- base = ndx < 0 ? $.fn[wp].defaults: waypoints[ndx].options,
- opts = $.extend({},
- base, options);
- opts.offset = opts.offset === "bottom-in-view" ?
- function() {
- return $[wps]('viewportHeight') - $(this).outerHeight();
- }: opts.offset;
- if (ndx < 0) {
- waypoints.push({
- element: $this,
- offset: $this.offset().top,
- options: opts
- });
- }
- else {
- waypoints[ndx].options = opts;
- }
- f && $this.bind(eventName, f);
- });
- $[wps]('refresh');
- return this;
- },
- remove: function() {
- return this.each(function() {
- var ndx = waypointIndex($(this));
- if (ndx >= 0) {
- waypoints.splice(ndx, 1);
- }
- });
- },
- destroy: function() {
- return this.unbind(eventName)[wp]('remove');
- }
- };
- function waypointIndex(el) {
- var i = waypoints.length - 1;
- while (i >= 0 && waypoints[i].element[0] !== el[0]) {
- i -= 1;
- }
- return i;
- }
- function triggerWaypoint(way, dir) {
- way.element.trigger(eventName, dir)
- if (way.options.triggerOnce) {
- way.element[wp]('destroy');
- }
- }
- function doScroll() {
- var newScroll = $w.scrollTop(),
- isDown = newScroll > oldScroll,
- pointsHit = $.grep(waypoints,
- function(el, i) {
- return isDown ? (el.offset > oldScroll && el.offset <= newScroll) : (el.offset <= oldScroll && el.offset > newScroll);
- });
- if (!oldScroll || !newScroll) {
- $[wps]('refresh');
- }
- oldScroll = newScroll;
- if (!pointsHit.length) return;
- if ($[wps].settings.continuous) {
- $.each(isDown ? pointsHit: pointsHit.reverse(),
- function(i, point) {
- triggerWaypoint(point, [isDown ? 'down': 'up']);
- });
- }
- else {
- triggerWaypoint(pointsHit[isDown ? pointsHit.length - 1: 0], [isDown ? 'down': 'up']);
- }
- }
- $.fn[wp] = function(method) {
- if (methods[method]) {
- return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
- }
- else if (typeof method === "function" || !method) {
- return methods.init.apply(this, arguments);
- }
- else if (typeof method === "object") {
- return methods.init.apply(this, [null, method]);
- }
- else {
- $.error('Method ' + method + ' does not exist on jQuery' + wp);
- }
- };
- $.fn[wp].defaults = {
- offset: 0,
- triggerOnce: false
- };
- var jQMethods = {
- refresh: function() {
- $.each(waypoints,
- function(i, o) {
- var adjustment = 0,
- oldOffset = o.offset;
- if (typeof o.options.offset === "function") {
- adjustment = o.options.offset.apply(o.element);
- }
- else if (typeof o.options.offset === "string") {
- var amount = parseFloat(o.options.offset),
- adjustment = o.options.offset.indexOf("%") ? Math.ceil($[wps]('viewportHeight') * (amount / 100)) : amount;
- }
- else {
- adjustment = o.options.offset;
- }
- o.offset = o.element.offset().top - adjustment;
- if (oldScroll > oldOffset && oldScroll <= o.offset) {
- triggerWaypoint(o, ['up']);
- }
- else if (oldScroll < oldOffset && oldScroll >= o.offset) {
- triggerWaypoint(o, ['down']);
- }
- });
- waypoints.sort(function(a, b) {
- return a.offset - b.offset;
- });
- },
- viewportHeight: function() {
- return (window.innerHeight ? window.innerHeight: $w.height());
- },
- aggregate: function() {
- var points = $();
- $.each(waypoints,
- function(i, e) {
- points = points.add(e.element);
- });
- return points;
- }
- };
- $[wps] = function(method) {
- if (jQMethods[method]) {
- return jQMethods[method].apply(this);
- }
- else {
- return jQMethods["aggregate"]();
- }
- };
- $[wps].settings = {
- continuous: true,
- resizeThrottle: 200,
- scrollThrottle: 100
- };
- $w.scroll(function() {
- if (!didScroll) {
- didScroll = true;
- window.setTimeout(function() {
- doScroll();
- didScroll = false;
- },
- $[wps].settings.scrollThrottle);
- }
- }).resize(function() {
- if (!didResize) {
- didResize = true;
- window.setTimeout(function() {
- $[wps]('refresh');
- didResize = false;
- },
- $[wps].settings.resizeThrottle);
- }
- }).load(function() {
- $[wps]('refresh');
- doScroll();
- });
- })(jQuery, 'waypoint', 'waypoints', this);
|