PageSourceSearch

https://britannia.edu.bd/assets/frontend/js/jquery.waypoints.js

js britannia.edu.bd collected 2026-10-02 23:17:15 UTC 18,832 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/blob/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.