106 lines
2.7 KiB
JavaScript
106 lines
2.7 KiB
JavaScript
(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
|
|
}())
|