| (function() { |
| 'use strict' |
| |
| function byTriggerPoint(a, b) { |
| return a.triggerPoint - b.triggerPoint |
| } |
| |
| function byReverseTriggerPoint(a, b) { |
| return b.triggerPoint - a.triggerPoint |
| } |
| |
| var groups = { |
| vertical: {}, |
| horizontal: {} |
| } |
| var Waypoint = window.Waypoint |
| |
| /* http://imakewebthings.com/waypoints/api/group */ |
| function Group(options) { |
| this.name = options.name |
| this.axis = options.axis |
| this.id = this.name + '-' + this.axis |
| this.waypoints = [] |
| this.clearTriggerQueues() |
| groups[this.axis][this.name] = this |
| } |
| |
| /* Private */ |
| Group.prototype.add = function(waypoint) { |
| this.waypoints.push(waypoint) |
| } |
| |
| /* Private */ |
| Group.prototype.clearTriggerQueues = function() { |
| this.triggerQueues = { |
| up: [], |
| down: [], |
| left: [], |
| right: [] |
| } |
| } |
| |
| /* Private */ |
| Group.prototype.flushTriggers = function() { |
| for (var direction in this.triggerQueues) { |
| var waypoints = this.triggerQueues[direction] |
| var reverse = direction === 'up' || direction === 'left' |
| waypoints.sort(reverse ? byReverseTriggerPoint : byTriggerPoint) |
| for (var i = 0, end = waypoints.length; i < end; i += 1) { |
| var waypoint = waypoints[i] |
| if (waypoint.options.continuous || i === waypoints.length - 1) { |
| waypoint.trigger([direction]) |
| } |
| } |
| } |
| this.clearTriggerQueues() |
| } |
| |
| /* Private */ |
| Group.prototype.next = function(waypoint) { |
| this.waypoints.sort(byTriggerPoint) |
| var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) |
| var isLast = index === this.waypoints.length - 1 |
| return isLast ? null : this.waypoints[index + 1] |
| } |
| |
| /* Private */ |
| Group.prototype.previous = function(waypoint) { |
| this.waypoints.sort(byTriggerPoint) |
| var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) |
| return index ? this.waypoints[index - 1] : null |
| } |
| |
| /* Private */ |
| Group.prototype.queueTrigger = function(waypoint, direction) { |
| this.triggerQueues[direction].push(waypoint) |
| } |
| |
| /* Private */ |
| Group.prototype.remove = function(waypoint) { |
| var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) |
| if (index > -1) { |
| this.waypoints.splice(index, 1) |
| } |
| } |
| |
| /* Public */ |
| /* http://imakewebthings.com/waypoints/api/first */ |
| Group.prototype.first = function() { |
| return this.waypoints[0] |
| } |
| |
| /* Public */ |
| /* http://imakewebthings.com/waypoints/api/last */ |
| Group.prototype.last = function() { |
| return this.waypoints[this.waypoints.length - 1] |
| } |
| |
| /* Private */ |
| Group.findOrCreate = function(options) { |
| return groups[options.axis][options.name] || new Group(options) |
| } |
| |
| Waypoint.Group = Group |
| }()) |