aboutsummaryrefslogtreecommitdiff
path: root/point/libs/hammerjs/hammer.min.js
blob: d7b2e9ad5a6912e510d0558c8e6f37439a9d4735 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
/*! Hammer.JS - v1.1.3 - 2014-05-20
 * http://eightmedia.github.io/hammer.js
 *
 * Copyright (c) 2014 Jorik Tangelder <j.tangelder@gmail.com>;
 * Licensed under the MIT license */


!function (a, b) {
	"use strict";
	function c() {
		d.READY || (s.determineEventTypes(), r.each(d.gestures, function (a) {
			u.register(a)
		}), s.onTouch(d.DOCUMENT, n, u.detect), s.onTouch(d.DOCUMENT, o, u.detect), d.READY = !0)
	}

	var d = function v(a, b) {
		return new v.Instance(a, b || {})
	};
	d.VERSION = "1.1.3", d.defaults = {behavior: {userSelect: "none", touchAction: "pan-y", touchCallout: "none", contentZooming: "none", userDrag: "none", tapHighlightColor: "rgba(0,0,0,0)"}}, d.DOCUMENT = document, d.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled, d.HAS_TOUCHEVENTS = "ontouchstart"in a, d.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent), d.NO_MOUSEEVENTS = d.HAS_TOUCHEVENTS && d.IS_MOBILE || d.HAS_POINTEREVENTS, d.CALCULATE_INTERVAL = 25;
	var e = {}, f = d.DIRECTION_DOWN = "down", g = d.DIRECTION_LEFT = "left", h = d.DIRECTION_UP = "up", i = d.DIRECTION_RIGHT = "right", j = d.POINTER_MOUSE = "mouse", k = d.POINTER_TOUCH = "touch", l = d.POINTER_PEN = "pen", m = d.EVENT_START = "start", n = d.EVENT_MOVE = "move", o = d.EVENT_END = "end", p = d.EVENT_RELEASE = "release", q = d.EVENT_TOUCH = "touch";
	d.READY = !1, d.plugins = d.plugins || {}, d.gestures = d.gestures || {};
	var r = d.utils = {extend: function (a, c, d) {
		for (var e in c)!c.hasOwnProperty(e) || a[e] !== b && d || (a[e] = c[e]);
		return a
	}, on: function (a, b, c) {
		a.addEventListener(b, c, !1)
	}, off: function (a, b, c) {
		a.removeEventListener(b, c, !1)
	}, each: function (a, c, d) {
		var e, f;
		if ("forEach"in a)a.forEach(c, d); else if (a.length !== b) {
			for (e = 0, f = a.length; f > e; e++)if (c.call(d, a[e], e, a) === !1)return
		} else for (e in a)if (a.hasOwnProperty(e) && c.call(d, a[e], e, a) === !1)return
	}, inStr: function (a, b) {
		return a.indexOf(b) > -1
	}, inArray: function (a, b) {
		if (a.indexOf) {
			var c = a.indexOf(b);
			return-1 === c ? !1 : c
		}
		for (var d = 0, e = a.length; e > d; d++)if (a[d] === b)return d;
		return!1
	}, toArray: function (a) {
		return Array.prototype.slice.call(a, 0)
	}, hasParent: function (a, b) {
		for (; a;) {
			if (a == b)return!0;
			a = a.parentNode
		}
		return!1
	}, getCenter: function (a) {
		var b = [], c = [], d = [], e = [], f = Math.min, g = Math.max;
		return 1 === a.length ? {pageX: a[0].pageX, pageY: a[0].pageY, clientX: a[0].clientX, clientY: a[0].clientY} : (r.each(a, function (a) {
			b.push(a.pageX), c.push(a.pageY), d.push(a.clientX), e.push(a.clientY)
		}), {pageX: (f.apply(Math, b) + g.apply(Math, b)) / 2, pageY: (f.apply(Math, c) + g.apply(Math, c)) / 2, clientX: (f.apply(Math, d) + g.apply(Math, d)) / 2, clientY: (f.apply(Math, e) + g.apply(Math, e)) / 2})
	}, getVelocity: function (a, b, c) {
		return{x: Math.abs(b / a) || 0, y: Math.abs(c / a) || 0}
	}, getAngle: function (a, b) {
		var c = b.clientX - a.clientX, d = b.clientY - a.clientY;
		return 180 * Math.atan2(d, c) / Math.PI
	}, getDirection: function (a, b) {
		var c = Math.abs(a.clientX - b.clientX), d = Math.abs(a.clientY - b.clientY);
		return c >= d ? a.clientX - b.clientX > 0 ? g : i : a.clientY - b.clientY > 0 ? h : f
	}, getDistance: function (a, b) {
		var c = b.clientX - a.clientX, d = b.clientY - a.clientY;
		return Math.sqrt(c * c + d * d)
	}, getScale: function (a, b) {
		return a.length >= 2 && b.length >= 2 ? this.getDistance(b[0], b[1]) / this.getDistance(a[0], a[1]) : 1
	}, getRotation: function (a, b) {
		return a.length >= 2 && b.length >= 2 ? this.getAngle(b[1], b[0]) - this.getAngle(a[1], a[0]) : 0
	}, isVertical: function (a) {
		return a == h || a == f
	}, setPrefixedCss: function (a, b, c, d) {
		var e = ["", "Webkit", "Moz", "O", "ms"];
		b = r.toCamelCase(b);
		for (var f = 0; f < e.length; f++) {
			var g = b;
			if (e[f] && (g = e[f] + g.slice(0, 1).toUpperCase() + g.slice(1)), g in a.style) {
				a.style[g] = (null == d || d) && c || "";
				break
			}
		}
	}, toggleBehavior: function (a, b, c) {
		if (b && a && a.style) {
			r.each(b, function (b, d) {
				r.setPrefixedCss(a, d, b, c)
			});
			var d = c && function () {
				return!1
			};
			"none" == b.userSelect && (a.onselectstart = d), "none" == b.userDrag && (a.ondragstart = d)
		}
	}, toCamelCase: function (a) {
		return a.replace(/[_-]([a-z])/g, function (a) {
			return a[1].toUpperCase()
		})
	}}, s = d.event = {preventMouseEvents: !1, started: !1, shouldDetect: !1, on: function (a, b, c, d) {
		var e = b.split(" ");
		r.each(e, function (b) {
			r.on(a, b, c), d && d(b)
		})
	}, off: function (a, b, c, d) {
		var e = b.split(" ");
		r.each(e, function (b) {
			r.off(a, b, c), d && d(b)
		})
	}, onTouch: function (a, b, c) {
		var f = this, g = function (e) {
			var g, h = e.type.toLowerCase(), i = d.HAS_POINTEREVENTS, j = r.inStr(h, "mouse");
			j && f.preventMouseEvents || (j && b == m && 0 === e.button ? (f.preventMouseEvents = !1, f.shouldDetect = !0) : i && b == m ? f.shouldDetect = 1 === e.buttons || t.matchType(k, e) : j || b != m || (f.preventMouseEvents = !0, f.shouldDetect = !0), i && b != o && t.updatePointer(b, e), f.shouldDetect && (g = f.doDetect.call(f, e, b, a, c)), g == o && (f.preventMouseEvents = !1, f.shouldDetect = !1, t.reset()), i && b == o && t.updatePointer(b, e))
		};
		return this.on(a, e[b], g), g
	}, doDetect: function (a, b, c, d) {
		var e = this.getTouchList(a, b), f = e.length, g = b, h = e.trigger, i = f;
		b == m ? h = q : b == o && (h = p, i = e.length - (a.changedTouches ? a.changedTouches.length : 1)), i > 0 && this.started && (g = n), this.started = !0;
		var j = this.collectEventData(c, g, e, a);
		return b != o && d.call(u, j), h && (j.changedLength = i, j.eventType = h, d.call(u, j), j.eventType = g, delete j.changedLength), g == o && (d.call(u, j), this.started = !1), g
	}, determineEventTypes: function () {
		var b;
		return b = d.HAS_POINTEREVENTS ? a.PointerEvent ? ["pointerdown", "pointermove", "pointerup pointercancel lostpointercapture"] : ["MSPointerDown", "MSPointerMove", "MSPointerUp MSPointerCancel MSLostPointerCapture"] : d.NO_MOUSEEVENTS ? ["touchstart", "touchmove", "touchend touchcancel"] : ["touchstart mousedown", "touchmove mousemove", "touchend touchcancel mouseup"], e[m] = b[0], e[n] = b[1], e[o] = b[2], e
	}, getTouchList: function (a, b) {
		if (d.HAS_POINTEREVENTS)return t.getTouchList();
		if (a.touches) {
			if (b == n)return a.touches;
			var c = [], e = [].concat(r.toArray(a.touches), r.toArray(a.changedTouches)), f = [];
			return r.each(e, function (a) {
				r.inArray(c, a.identifier) === !1 && f.push(a), c.push(a.identifier)
			}), f
		}
		return a.identifier = 1, [a]
	}, collectEventData: function (a, b, c, d) {
		var e = k;
		return r.inStr(d.type, "mouse") || t.matchType(j, d) ? e = j : t.matchType(l, d) && (e = l), {center: r.getCenter(c), timeStamp: Date.now(), target: d.target, touches: c, eventType: b, pointerType: e, srcEvent: d, preventDefault: function () {
			var a = this.srcEvent;
			a.preventManipulation && a.preventManipulation(), a.preventDefault && a.preventDefault()
		}, stopPropagation: function () {
			this.srcEvent.stopPropagation()
		}, stopDetect: function () {
			return u.stopDetect()
		}}
	}}, t = d.PointerEvent = {pointers: {}, getTouchList: function () {
		var a = [];
		return r.each(this.pointers, function (b) {
			a.push(b)
		}), a
	}, updatePointer: function (a, b) {
		a == o || a != o && 1 !== b.buttons ? delete this.pointers[b.pointerId] : (b.identifier = b.pointerId, this.pointers[b.pointerId] = b)
	}, matchType: function (a, b) {
		if (!b.pointerType)return!1;
		var c = b.pointerType, d = {};
		return d[j] = c === (b.MSPOINTER_TYPE_MOUSE || j), d[k] = c === (b.MSPOINTER_TYPE_TOUCH || k), d[l] = c === (b.MSPOINTER_TYPE_PEN || l), d[a]
	}, reset: function () {
		this.pointers = {}
	}}, u = d.detection = {gestures: [], current: null, previous: null, stopped: !1, startDetect: function (a, b) {
		this.current || (this.stopped = !1, this.current = {inst: a, startEvent: r.extend({}, b), lastEvent: !1, lastCalcEvent: !1, futureCalcEvent: !1, lastCalcData: {}, name: ""}, this.detect(b))
	}, detect: function (a) {
		if (this.current && !this.stopped) {
			a = this.extendEventData(a);
			var b = this.current.inst, c = b.options;
			return r.each(this.gestures, function (d) {
				!this.stopped && b.enabled && c[d.name] && d.handler.call(d, a, b)
			}, this), this.current && (this.current.lastEvent = a), a.eventType == o && this.stopDetect(), a
		}
	}, stopDetect: function () {
		this.previous = r.extend({}, this.current), this.current = null, this.stopped = !0
	}, getCalculatedData: function (a, b, c, e, f) {
		var g = this.current, h = !1, i = g.lastCalcEvent, j = g.lastCalcData;
		i && a.timeStamp - i.timeStamp > d.CALCULATE_INTERVAL && (b = i.center, c = a.timeStamp - i.timeStamp, e = a.center.clientX - i.center.clientX, f = a.center.clientY - i.center.clientY, h = !0), (a.eventType == q || a.eventType == p) && (g.futureCalcEvent = a), (!g.lastCalcEvent || h) && (j.velocity = r.getVelocity(c, e, f), j.angle = r.getAngle(b, a.center), j.direction = r.getDirection(b, a.center), g.lastCalcEvent = g.futureCalcEvent || a, g.futureCalcEvent = a), a.velocityX = j.velocity.x, a.velocityY = j.velocity.y, a.interimAngle = j.angle, a.interimDirection = j.direction
	}, extendEventData: function (a) {
		var b = this.current, c = b.startEvent, d = b.lastEvent || c;
		(a.eventType == q || a.eventType == p) && (c.touches = [], r.each(a.touches, function (a) {
			c.touches.push({clientX: a.clientX, clientY: a.clientY})
		}));
		var e = a.timeStamp - c.timeStamp, f = a.center.clientX - c.center.clientX, g = a.center.clientY - c.center.clientY;
		return this.getCalculatedData(a, d.center, e, f, g), r.extend(a, {startEvent: c, deltaTime: e, deltaX: f, deltaY: g, distance: r.getDistance(c.center, a.center), angle: r.getAngle(c.center, a.center), direction: r.getDirection(c.center, a.center), scale: r.getScale(c.touches, a.touches), rotation: r.getRotation(c.touches, a.touches)}), a
	}, register: function (a) {
		var c = a.defaults || {};
		return c[a.name] === b && (c[a.name] = !0), r.extend(d.defaults, c, !0), a.index = a.index || 1e3, this.gestures.push(a), this.gestures.sort(function (a, b) {
			return a.index < b.index ? -1 : a.index > b.index ? 1 : 0
		}), this.gestures
	}};
	d.Instance = function (a, b) {
		var e = this;
		c(), this.element = a, this.enabled = !0, r.each(b, function (a, c) {
			delete b[c], b[r.toCamelCase(c)] = a
		}), this.options = r.extend(r.extend({}, d.defaults), b || {}), this.options.behavior && r.toggleBehavior(this.element, this.options.behavior, !0), this.eventStartHandler = s.onTouch(a, m, function (a) {
			e.enabled && a.eventType == m ? u.startDetect(e, a) : a.eventType == q && u.detect(a)
		}), this.eventHandlers = []
	}, d.Instance.prototype = {on: function (a, b) {
		var c = this;
		return s.on(c.element, a, b, function (a) {
			c.eventHandlers.push({gesture: a, handler: b})
		}), c
	}, off: function (a, b) {
		var c = this;
		return s.off(c.element, a, b, function (a) {
			var d = r.inArray({gesture: a, handler: b});
			d !== !1 && c.eventHandlers.splice(d, 1)
		}), c
	}, trigger: function (a, b) {
		b || (b = {});
		var c = d.DOCUMENT.createEvent("Event");
		c.initEvent(a, !0, !0), c.gesture = b;
		var e = this.element;
		return r.hasParent(b.target, e) && (e = b.target), e.dispatchEvent(c), this
	}, enable: function (a) {
		return this.enabled = a, this
	}, dispose: function () {
		var a, b;
		for (r.toggleBehavior(this.element, this.options.behavior, !1), a = -1; b = this.eventHandlers[++a];)r.off(this.element, b.gesture, b.handler);
		return this.eventHandlers = [], s.off(this.element, e[m], this.eventStartHandler), null
	}}, function (a) {
		function b(b, d) {
			var e = u.current;
			if (!(d.options.dragMaxTouches > 0 && b.touches.length > d.options.dragMaxTouches))switch (b.eventType) {
				case m:
					c = !1;
					break;
				case n:
					if (b.distance < d.options.dragMinDistance && e.name != a)return;
					var j = e.startEvent.center;
					if (e.name != a && (e.name = a, d.options.dragDistanceCorrection && b.distance > 0)) {
						var k = Math.abs(d.options.dragMinDistance / b.distance);
						j.pageX += b.deltaX * k, j.pageY += b.deltaY * k, j.clientX += b.deltaX * k, j.clientY += b.deltaY * k, b = u.extendEventData(b)
					}
					(e.lastEvent.dragLockToAxis || d.options.dragLockToAxis && d.options.dragLockMinDistance <= b.distance) && (b.dragLockToAxis = !0);
					var l = e.lastEvent.direction;
					b.dragLockToAxis && l !== b.direction && (b.direction = r.isVertical(l) ? b.deltaY < 0 ? h : f : b.deltaX < 0 ? g : i), c || (d.trigger(a + "start", b), c = !0), d.trigger(a, b), d.trigger(a + b.direction, b);
					var q = r.isVertical(b.direction);
					(d.options.dragBlockVertical && q || d.options.dragBlockHorizontal && !q) && b.preventDefault();
					break;
				case p:
					c && b.changedLength <= d.options.dragMaxTouches && (d.trigger(a + "end", b), c = !1);
					break;
				case o:
					c = !1
			}
		}

		var c = !1;
		d.gestures.Drag = {name: a, index: 50, handler: b, defaults: {dragMinDistance: 10, dragDistanceCorrection: !0, dragMaxTouches: 1, dragBlockHorizontal: !1, dragBlockVertical: !1, dragLockToAxis: !1, dragLockMinDistance: 25}}
	}("drag"), d.gestures.Gesture = {name: "gesture", index: 1337, handler: function (a, b) {
		b.trigger(this.name, a)
	}}, function (a) {
		function b(b, d) {
			var e = d.options, f = u.current;
			switch (b.eventType) {
				case m:
					clearTimeout(c), f.name = a, c = setTimeout(function () {
						f && f.name == a && d.trigger(a, b)
					}, e.holdTimeout);
					break;
				case n:
					b.distance > e.holdThreshold && clearTimeout(c);
					break;
				case p:
					clearTimeout(c)
			}
		}

		var c;
		d.gestures.Hold = {name: a, index: 10, defaults: {holdTimeout: 500, holdThreshold: 2}, handler: b}
	}("hold"), d.gestures.Release = {name: "release", index: 1 / 0, handler: function (a, b) {
		a.eventType == p && b.trigger(this.name, a)
	}}, d.gestures.Swipe = {name: "swipe", index: 40, defaults: {swipeMinTouches: 1, swipeMaxTouches: 1, swipeVelocityX: .6, swipeVelocityY: .6}, handler: function (a, b) {
		if (a.eventType == p) {
			var c = a.touches.length, d = b.options;
			if (c < d.swipeMinTouches || c > d.swipeMaxTouches)return;
			(a.velocityX > d.swipeVelocityX || a.velocityY > d.swipeVelocityY) && (b.trigger(this.name, a), b.trigger(this.name + a.direction, a))
		}
	}}, function (a) {
		function b(b, d) {
			var e, f, g = d.options, h = u.current, i = u.previous;
			switch (b.eventType) {
				case m:
					c = !1;
					break;
				case n:
					c = c || b.distance > g.tapMaxDistance;
					break;
				case o:
					!r.inStr(b.srcEvent.type, "cancel") && b.deltaTime < g.tapMaxTime && !c && (e = i && i.lastEvent && b.timeStamp - i.lastEvent.timeStamp, f = !1, i && i.name == a && e && e < g.doubleTapInterval && b.distance < g.doubleTapDistance && (d.trigger("doubletap", b), f = !0), (!f || g.tapAlways) && (h.name = a, d.trigger(h.name, b)))
			}
		}

		var c = !1;
		d.gestures.Tap = {name: a, index: 100, handler: b, defaults: {tapMaxTime: 250, tapMaxDistance: 10, tapAlways: !0, doubleTapDistance: 20, doubleTapInterval: 300}}
	}("tap"), d.gestures.Touch = {name: "touch", index: -1 / 0, defaults: {preventDefault: !1, preventMouse: !1}, handler: function (a, b) {
		return b.options.preventMouse && a.pointerType == j ? void a.stopDetect() : (b.options.preventDefault && a.preventDefault(), void(a.eventType == q && b.trigger("touch", a)))
	}}, function (a) {
		function b(b, d) {
			switch (b.eventType) {
				case m:
					c = !1;
					break;
				case n:
					if (b.touches.length < 2)return;
					var e = Math.abs(1 - b.scale), f = Math.abs(b.rotation);
					if (e < d.options.transformMinScale && f < d.options.transformMinRotation)return;
					u.current.name = a, c || (d.trigger(a + "start", b), c = !0), d.trigger(a, b), f > d.options.transformMinRotation && d.trigger("rotate", b), e > d.options.transformMinScale && (d.trigger("pinch", b), d.trigger("pinch" + (b.scale < 1 ? "in" : "out"), b));
					break;
				case p:
					c && b.changedLength < 2 && (d.trigger(a + "end", b), c = !1)
			}
		}

		var c = !1;
		d.gestures.Transform = {name: a, index: 45, defaults: {transformMinScale: .01, transformMinRotation: 1}, handler: b}
	}("transform"), "function" == typeof define && define.amd ? define(function () {
		return d
	}) : "undefined" != typeof module && module.exports ? module.exports = d : a.Hammer = d
}(window);
//# sourceMappingURL=hammer.min.map