PageSourceSearch

https://www.peacepeople.com/wp-content/themes/total/js/waypoint.js?ver=2.2.2

js peacepeople.com collected 2026-09-24 21:23:04 UTC 17,548 bytes, 649 lines download raw bytes

1/*!
2Waypoints - 4.0.0
3Copyright © 2011-2015 Caleb Troughton
4Licensed under the MIT license.
5https://github.com/imakewebthings/waypoints/blog/master/licenses.txt
6*/
7(function() {
8  'use strict'
9
10  var keyCounter = 0
11  var allWaypoints = {}
12
13  /* http://imakewebthings.com/waypoints/api/waypoint */
14  function Waypoint(options) {
15    if (!options) {
16      throw new Error('No options passed to Waypoint constructor')
17    }
18    if (!options.element) {
19      throw new Error('No element option passed to Waypoint constructor')
20    }
21    if (!options.handler) {
22      throw new Error('No handler option passed to Waypoint constructor')
23    }
24
25    this.key = 'waypoint-' + keyCounter
26    this.options = Waypoint.Adapter.extend({}, Waypoint.defaults, options)
27    this.element = this.options.element
28    this.adapter = new Waypoint.Adapter(this.element)
29    this.callback = options.handler
30    this.axis = this.options.horizontal ? 'horizontal' : 'vertical'
31    this.enabled = this.options.enabled
32    this.triggerPoint = null
33    this.group = Waypoint.Group.findOrCreate({
34      name: this.options.group,
35      axis: this.axis
36    })
37    this.context = Waypoint.Context.findOrCreateByElement(this.options.context)
38
39    if (Waypoint.offsetAliases[this.options.offset]) {
40      this.options.offset = Waypoint.offsetAliases[this.options.offset]
41    }
42    this.group.add(this)
43    this.context.add(this)
44    allWaypoints[this.key] = this
45    keyCounter += 1
46  }
47
48  /* Private */
49  Waypoint.prototype.queueTrigger = function(direction) {
50    this.group.queueTrigger(this, direction)
51  }
52
53  /* Private */
54  Waypoint.prototype.trigger = function(args) {
55    if (!this.enabled) {
56      return
57    }
58    if (this.callback) {
59      this.callback.apply(this, args)
60    }
61  }
62
63  /* Public */
64  /* http://imakewebthings.com/waypoints/api/destroy */
65  Waypoint.prototype.destroy = function() {
66    this.context.remove(this)
67    this.group.remove(this)
68    delete allWaypoints[this.key]
69  }
70
71  /* Public */
72  /* http://imakewebthings.com/waypoints/api/disable */
73  Waypoint.prototype.disable = function() {
74    this.enabled = false
75    return this
76  }
77
78  /* Public */
79  /* http://imakewebthings.com/waypoints/api/enable */
80  Waypoint.prototype.enable = function() {
81    this.context.refresh()
82    this.enabled = true
83    return this
84  }
85
86  /* Public */
87  /* http://imakewebthings.com/waypoints/api/next */
88  Waypoint.prototype.next = function() {
89    return this.group.next(this)
90  }
91
92  /* Public */
93  /* http://imakewebthings.com/waypoints/api/previous */
94  Waypoint.prototype.previous = function() {
95    return this.group.previous(this)
96  }
97
98  /* Private */
99  Waypoint.invokeAll = function(method) {
100    var allWaypointsArray = []
101    for (var waypointKey in allWaypoints) {
102      allWaypointsArray.push(allWaypoints[waypointKey])
103    }
104    for (var i = 0, end = allWaypointsArray.length; i < end; i++) {
105      allWaypointsArray[i][method]()
106    }
107  }
108
109  /* Public */
110  /* http://imakewebthings.com/waypoints/api/destroy-all */
111  Waypoint.destroyAll = function() {
112    Waypoint.invokeAll('destroy')
113  }
114
115  /* Public */
116  /* http://imakewebthings.com/waypoints/api/disable-all */
117  Waypoint.disableAll = function() {
118    Waypoint.invokeAll('disable')
119  }
120
121  /* Public */
122  /* http://imakewebthings.com/waypoints/api/enable-all */
123  Waypoint.enableAll = function() {
124    Waypoint.invokeAll('enable')
125  }
126
127  /* Public */
128  /* http://imakewebthings.com/waypoints/api/refresh-all */
129  Waypoint.refreshAll = function() {
130    Waypoint.Context.refreshAll()
131  }
132
133  /* Public */
134  /* http://imakewebthings.com/waypoints/api/viewport-height */
135  Waypoint.viewportHeight = function() {
136    return window.innerHeight || document.documentElement.clientHeight
137  }
138
139  /* Public */
140  /* http://imakewebthings.com/waypoints/api/viewport-width */
141  Waypoint.viewportWidth = function() {
142    return document.documentElement.clientWidth
143  }
144
145  Waypoint.adapters = []
146
147  Waypoint.defaults = {
148    context: window,
149    continuous: true,
150    enabled: true,
151    group: 'default',
152    horizontal: false,
153    offset: 0
154  }
155
156  Waypoint.offsetAliases = {
157    'bottom-in-view': function() {
158      return this.context.innerHeight() - this.adapter.outerHeight()
159    },
160    'right-in-view': function() {
161      return this.context.innerWidth() - this.adapter.outerWidth()
162    }
163  }
164
165  window.Waypoint = Waypoint
166}())
167;(function() {
168  'use strict'
169
170  function requestAnimationFrameShim(callback) {
171    window.setTimeout(callback, 1000 / 60)
172  }
173
174  var keyCounter = 0
175  var contexts = {}
176  var Waypoint = window.Waypoint
177  var oldWindowLoad = window.onload
178
179  /* http://imakewebthings.com/waypoints/api/context */
180  function Context(element) {
181    this.element = element
182    this.Adapter = Waypoint.Adapter
183    this.adapter = new this.Adapter(element)
184    this.key = 'waypoint-context-' + keyCounter
185    this.didScroll = false
186    this.didResize = false
187    this.oldScroll = {
188      x: this.adapter.scrollLeft(),
189      y: this.adapter.scrollTop()
190    }
191    this.waypoints = {
192      vertical: {},
193      horizontal: {}
194    }
195
196    element.waypointContextKey = this.key
197    contexts[element.waypointContextKey] = this
198    keyCounter += 1
199
200    this.createThrottledScrollHandler()
201    this.createThrottledResizeHandler()
202  }
203
204  /* Private */
205  Context.prototype.add = function(waypoint) {
206    var axis = waypoint.options.horizontal ? 'horizontal' : 'vertical'
207    this.waypoints[axis][waypoint.key] = waypoint
208    this.refresh()
209  }
210
211  /* Private */
212  Context.prototype.checkEmpty = function() {
213    var horizontalEmpty = this.Adapter.isEmptyObject(this.waypoints.horizontal)
214    var verticalEmpty = this.Adapter.isEmptyObject(this.waypoints.vertical)
215    if (horizontalEmpty && verticalEmpty) {
216      this.adapter.off('.waypoints')
217      delete contexts[this.key]
218    }
219  }
220
221  /* Private */
222  Context.prototype.createThrottledResizeHandler = function() {
223    var self = this
224
225    function resizeHandler() {
226      self.handleResize()
227      self.didResize = false
228    }
229
230    this.adapter.on('resize.waypoints', function() {
231      if (!self.didResize) {
232        self.didResize = true
233        Waypoint.requestAnimationFrame(resizeHandler)
234      }
235    })
236  }
237
238  /* Private */
239  Context.prototype.createThrottledScrollHandler = function() {
240    var self = this
241    function scrollHandler() {
242      self.handleScroll()
243      self.didScroll = false
244    }
245
246    this.adapter.on('scroll.waypoints', function() {
247      if (!self.didScroll || Waypoint.isTouch) {
248        self.didScroll = true
249        Waypoint.requestAnimationFrame(scrollHandler)
250      }
251    })
252  }
253
254  /* Private */
255  Context.prototype.handleResize = function() {
256    Waypoint.Context.refreshAll()
257  }
258
259  /* Private */
260  Context.prototype.handleScroll = function() {
261    var triggeredGroups = {}
262    var axes = {
263      horizontal: {
264        newScroll: this.adapter.scrollLeft(),
265        oldScroll: this.oldScroll.x,
266        forward: 'right',
267        backward: 'left'
268      },
269      vertical: {
270        newScroll: this.adapter.scrollTop(),
271        oldScroll: this.oldScroll.y,
272        forward: 'down',
273        backward: 'up'
274      }
275    }
276
277    for (var axisKey in axes) {
278      var axis = axes[axisKey]
279      var isForward = axis.newScroll > axis.oldScroll
280      var direction = isForward ? axis.forward : axis.backward
281
282      for (var waypointKey in this.waypoints[axisKey]) {
283        var waypoint = this.waypoints[axisKey][waypointKey]
284        var wasBeforeTriggerPoint = axis.oldScroll < waypoint.triggerPoint
285        var nowAfterTriggerPoint = axis.newScroll >= waypoint.triggerPoint
286        var crossedForward = wasBeforeTriggerPoint && nowAfterTriggerPoint
287        var crossedBackward = !wasBeforeTriggerPoint && !nowAfterTriggerPoint
288        if (crossedForward || crossedBackward) {
289          waypoint.queueTrigger(direction)
290          triggeredGroups[waypoint.group.id] = waypoint.group
291        }
292      }
293    }
294
295    for (var groupKey in triggeredGroups) {
296      triggeredGroups[groupKey].flushTriggers()
297    }
298
299    this.oldScroll = {
300      x: axes.horizontal.newScroll,
301      y: axes.vertical.newScroll
302    }
303  }
304
305  /* Private */
306  Context.prototype.innerHeight = function() {
307    /*eslint-disable eqeqeq */
308    if (this.element == this.element.window) {
309      return Waypoint.viewportHeight()
310    }
311    /*eslint-enable eqeqeq */
312    return this.adapter.innerHeight()
313  }
314
315  /* Private */
316  Context.prototype.remove = function(waypoint) {
317    delete this.waypoints[waypoint.axis][waypoint.key]
318    this.checkEmpty()
319  }
320
321  /* Private */
322  Context.prototype.innerWidth = function() {
323    /*eslint-disable eqeqeq */
324    if (this.element == this.element.window) {
325      return Waypoint.viewportWidth()
326    }
327    /*eslint-enable eqeqeq */
328    return this.adapter.innerWidth()
329  }
330
331  /* Public */
332  /* http://imakewebthings.com/waypoints/api/context-destroy */
333  Context.prototype.destroy = function() {
334    var allWaypoints = []
335    for (var axis in this.waypoints) {
336      for (var waypointKey in this.waypoints[axis]) {
337        allWaypoints.push(this.waypoints[axis][waypointKey])
338      }
339    }
340    for (var i = 0, end = allWaypoints.length; i < end; i++) {
341      allWaypoints[i].destroy()
342    }
343  }
344
345  /* Public */
346  /* http://imakewebthings.com/waypoints/api/context-refresh */
347  Context.prototype.refresh = function() {
348    /*eslint-disable eqeqeq */
349    var isWindow = this.element == this.element.window
350    /*eslint-enable eqeqeq */
351    var contextOffset = isWindow ? undefined : this.adapter.offset()
352    var triggeredGroups = {}
353    var axes
354
355    this.handleScroll()
356    axes = {
357      horizontal: {
358        contextOffset: isWindow ? 0 : contextOffset.left,
359        contextScroll: isWindow ? 0 : this.oldScroll.x,
360        contextDimension: this.innerWidth(),
361        oldScroll: this.oldScroll.x,
362        forward: 'right',
363        backward: 'left',
364        offsetProp: 'left'
365      },
366      vertical: {
367        contextOffset: isWindow ? 0 : contextOffset.top,
368        contextScroll: isWindow ? 0 : this.oldScroll.y,
369        contextDimension: this.innerHeight(),
370        oldScroll: this.oldScroll.y,
371        forward: 'down',
372        backward: 'up',
373        offsetProp: 'top'
374      }
375    }
376
377    for (var axisKey in axes) {
378      var axis = axes[axisKey]
379      for (var waypointKey in this.waypoints[axisKey]) {
380        var waypoint = this.waypoints[axisKey][waypointKey]
381        var adjustment = waypoint.options.offset
382        var oldTriggerPoint = waypoint.triggerPoint
383        var elementOffset = 0
384        var freshWaypoint = oldTriggerPoint == null
385        var contextModifier, wasBeforeScroll, nowAfterScroll
386        var triggeredBackward, triggeredForward
387
388        if (waypoint.element !== waypoint.element.window) {
389          elementOffset = waypoint.adapter.offset()[axis.offsetProp]
390        }
391
392        if (typeof adjustment === 'function') {
393          adjustment = adjustment.apply(waypoint)
394        }
395        else if (typeof adjustment === 'string') {
396          adjustment = parseFloat(adjustment)
397          if (waypoint.options.offset.indexOf('%') > - 1) {
398            adjustment = Math.ceil(axis.contextDimension * adjustment / 100)
399          }
400        }
401
402        contextModifier = axis.contextScroll - axis.contextOffset
403        waypoint.triggerPoint = elementOffset + contextModifier - adjustment
404        wasBeforeScroll = oldTriggerPoint < axis.oldScroll
405        nowAfterScroll = waypoint.triggerPoint >= axis.oldScroll
406        triggeredBackward = wasBeforeScroll && nowAfterScroll
407        triggeredForward = !wasBeforeScroll && !nowAfterScroll
408
409        if (!freshWaypoint && triggeredBackward) {
410          waypoint.queueTrigger(axis.backward)
411          triggeredGroups[waypoint.group.id] = waypoint.group
412        }
413        else if (!freshWaypoint && triggeredForward) {
414          waypoint.queueTrigger(axis.forward)
415          triggeredGroups[waypoint.group.id] = waypoint.group
416        }
417        else if (freshWaypoint && axis.oldScroll >= waypoint.triggerPoint) {
418          waypoint.queueTrigger(axis.forward)
419          triggeredGroups[waypoint.group.id] = waypoint.group
420        }
421      }
422    }
423
424    Waypoint.requestAnimationFrame(function() {
425      for (var groupKey in triggeredGroups) {
426        triggeredGroups[groupKey].flushTriggers()
427      }
428    })
429
430    return this
431  }
432
433  /* Private */
434  Context.findOrCreateByElement = function(element) {
435    return Context.findByElement(element) || new Context(element)
436  }
437
438  /* Private */
439  Context.refreshAll = function() {
440    for (var contextId in contexts) {
441      contexts[contextId].refresh()
442    }
443  }
444
445  /* Public */
446  /* http://imakewebthings.com/waypoints/api/context-find-by-element */
447  Context.findByElement = function(element) {
448    return contexts[element.waypointContextKey]
449  }
450
451  window.onload = function() {
452    if (oldWindowLoad) {
453      oldWindowLoad()
454    }
455    Context.refreshAll()
456  }
457
458  Waypoint.requestAnimationFrame = function(callback) {
459    var requestFn = window.requestAnimationFrame ||
460      window.mozRequestAnimationFrame ||
461      window.webkitRequestAnimationFrame ||
462      requestAnimationFrameShim
463    requestFn.call(window, callback)
464  }
465  Waypoint.Context = Context
466}())
467;(function() {
468  'use strict'
469
470  function byTriggerPoint(a, b) {
471    return a.triggerPoint - b.triggerPoint
472  }
473
474  function byReverseTriggerPoint(a, b) {
475    return b.triggerPoint - a.triggerPoint
476  }
477
478  var groups = {
479    vertical: {},
480    horizontal: {}
481  }
482  var Waypoint = window.Waypoint
483
484  /* http://imakewebthings.com/waypoints/api/group */
485  function Group(options) {
486    this.name = options.name
487    this.axis = options.axis
488    this.id = this.name + '-' + this.axis
489    this.waypoints = []
490    this.clearTriggerQueues()
491    groups[this.axis][this.name] = this
492  }
493
494  /* Private */
495  Group.prototype.add = function(waypoint) {
496    this.waypoints.push(waypoint)
497  }
498
499  /* Private */
500  Group.prototype.clearTriggerQueues = function() {
501    this.triggerQueues = {
502      up: [],
503      down: [],
504      left: [],
505      right: []
506    }
507  }
508
509  /* Private */
510  Group.prototype.flushTriggers = function() {
511    for (var direction in this.triggerQueues) {
512      var waypoints = this.triggerQueues[direction]
513      var reverse = direction === 'up' || direction === 'left'
514      waypoints.sort(reverse ? byReverseTriggerPoint : byTriggerPoint)
515      for (var i = 0, end = waypoints.length; i < end; i += 1) {
516        var waypoint = waypoints[i]
517        if (waypoint.options.continuous || i === waypoints.length - 1) {
518          waypoint.trigger([direction])
519        }
520      }
521    }
522    this.clearTriggerQueues()
523  }
524
525  /* Private */
526  Group.prototype.next = function(waypoint) {
527    this.waypoints.sort(byTriggerPoint)
528    var index = Waypoint.Adapter.inArray(waypoint, this.waypoints)
529    var isLast = index === this.waypoints.length - 1
530    return isLast ? null : this.waypoints[index + 1]
531  }
532
533  /* Private */
534  Group.prototype.previous = function(waypoint) {
535    this.waypoints.sort(byTriggerPoint)
536    var index = Waypoint.Adapter.inArray(waypoint, this.waypoints)
537    return index ? this.waypoints[index - 1] : null
538  }
539
540  /* Private */
541  Group.prototype.queueTrigger = function(waypoint, direction) {
542    this.triggerQueues[direction].push(waypoint)
543  }
544
545  /* Private */
546  Group.prototype.remove = function(waypoint) {
547    var index = Waypoint.Adapter.inArray(waypoint, this.waypoints)
548    if (index > -1) {
549      this.waypoints.splice(index, 1)
550    }
551  }
552
553  /* Public */
554  /* http://imakewebthings.com/waypoints/api/first */
555  Group.prototype.first = function() {
556    return this.waypoints[0]
557  }
558
559  /* Public */
560  /* http://imakewebthings.com/waypoints/api/last */
561  Group.prototype.last = function() {
562    return this.waypoints[this.waypoints.length - 1]
563  }
564
565  /* Private */
566  Group.findOrCreate = function(options) {
567    return groups[options.axis][options.name] || new Group(options)
568  }
569
570  Waypoint.Group = Group
571}())
572;(function() {
573  'use strict'
574
575  var $ = window.jQuery
576  var Waypoint = window.Waypoint
577
578  function JQueryAdapter(element) {
579    this.$element = $(element)
580  }
581
582  $.each([
583    'innerHeight',
584    'innerWidth',
585    'off',
586    'offset',
587    'on',
588    'outerHeight',
589    'outerWidth',
590    'scrollLeft',
591    'scrollTop'
592  ], function(i, method) {
593    JQueryAdapter.prototype[method] = function() {
594      var args = Array.prototype.slice.call(arguments)
595      return this.$element[method].apply(this.$element, args)
596    }
597  })
598
599  $.each([
600    'extend',
601    'inArray',
602    'isEmptyObject'
603  ], function(i, method) {
604    JQueryAdapter[method] = $[method]
605  })
606
607  Waypoint.adapters.push({
608    name: 'jquery',
609    Adapter: JQueryAdapter
610  })
611  Waypoint.Adapter = JQueryAdapter
612}())
613;(function() {
614  'use strict'
615
616  var Waypoint = window.Waypoint
617
618  function createExtension(framework) {
619    return function() {
620      var waypoints = []
621      var overrides = arguments[0]
622
623      if (framework.isFunction(arguments[0])) {
624        overrides = framework.extend({}, arguments[1])
625        overrides.handler = arguments[0]
626      }
627
628      this.each(function() {
629        var options = framework.extend({}, overrides, {
630          element: this
631        })
632        if (typeof options.context === 'string') {
633          options.context = framework(this).closest(options.context)[0]
634        }
635        waypoints.push(new Waypoint(options))
636      })
637
638      return waypoints
639    }
640  }
641
642  if (window.jQuery) {
643    window.jQuery.fn.waypoint = createExtension(window.jQuery)
644  }
645  if (window.Zepto) {
646    window.Zepto.fn.waypoint = createExtension(window.Zepto)
647  }
648}())
649;

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.