PageSourceSearch

https://www.rollacentre.org/wp-content/themes/RollasHealth/js/jquery.mobile.js?ver=7.0.5

js rollacentre.org collected 2026-10-02 00:03:44 UTC 24,145 bytes, 864 lines download raw bytes

1/*
2* jQuery Mobile v1.4.5
3* http://jquerymobile.com
4*
5* Copyright 2010, 2014 jQuery Foundation, Inc. and other contributors
6* Released under the MIT license.
7* http://jquery.org/license
8*
9*/
10
11(function ( root, doc, factory ) {
12	if ( typeof define === "function" && define.amd ) {
13		// AMD. Register as an anonymous module.
14		define( [ "jquery" ], function ( $ ) {
15			factory( $, root, doc );
16			return $.mobile;
17		});
18	} else {
19		// Browser globals
20		factory( root.jQuery, root, doc );
21	}
22}( this, document, function ( jQuery, window, document, undefined ) {// This plugin is an experiment for abstracting away the touch and mouse
23// events so that developers don't have to worry about which method of input
24// the device their document is loaded on supports.
25//
26// The idea here is to allow the developer to register listeners for the
27// basic mouse events, such as mousedown, mousemove, mouseup, and click,
28// and the plugin will take care of registering the correct listeners
29// behind the scenes to invoke the listener at the fastest possible time
30// for that device, while still retaining the order of event firing in
31// the traditional mouse environment, should multiple handlers be registered
32// on the same element for different events.
33//
34// The current version exposes the following virtual events to jQuery bind methods:
35// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel"
36
37(function( $, window, document, undefined ) {
38
39var dataPropertyName = "virtualMouseBindings",
40	touchTargetPropertyName = "virtualTouchID",
41	virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split( " " ),
42	touchEventProps = "clientX clientY pageX pageY screenX screenY".split( " " ),
43	mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
44	mouseEventProps = $.event.props.concat( mouseHookProps ),
45	activeDocHandlers = {},
46	resetTimerID = 0,
47	startX = 0,
48	startY = 0,
49	didScroll = false,
50	clickBlockList = [],
51	blockMouseTriggers = false,
52	blockTouchTriggers = false,
53	eventCaptureSupported = "addEventListener" in document,
54	$document = $( document ),
55	nextTouchID = 1,
56	lastTouchID = 0, threshold,
57	i;
58
59$.vmouse = {
60	moveDistanceThreshold: 10,
61	clickDistanceThreshold: 10,
62	resetTimerDuration: 1500
63};
64
65function getNativeEvent( event ) {
66
67	while ( event && typeof event.originalEvent !== "undefined" ) {
68		event = event.originalEvent;
69	}
70	return event;
71}
72
73function createVirtualEvent( event, eventType ) {
74
75	var t = event.type,
76		oe, props, ne, prop, ct, touch, i, j, len;
77
78	event = $.Event( event );
79	event.type = eventType;
80
81	oe = event.originalEvent;
82	props = $.event.props;
83
84	// addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280
85	// https://github.com/jquery/jquery-mobile/issues/3280
86	if ( t.search( /^(mouse|click)/ ) > -1 ) {
87		props = mouseEventProps;
88	}
89
90	// copy original event properties over to the new event
91	// this would happen if we could call $.event.fix instead of $.Event
92	// but we don't have a way to force an event to be fixed multiple times
93	if ( oe ) {
94		for ( i = props.length, prop; i; ) {
95			prop = props[ --i ];
96			event[ prop ] = oe[ prop ];
97		}
98	}
99
100	// make sure that if the mouse and click virtual events are generated
101	// without a .which one is defined
102	if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ) {
103		event.which = 1;
104	}
105
106	if ( t.search(/^touch/) !== -1 ) {
107		ne = getNativeEvent( oe );
108		t = ne.touches;
109		ct = ne.changedTouches;
110		touch = ( t && t.length ) ? t[0] : ( ( ct && ct.length ) ? ct[ 0 ] : undefined );
111
112		if ( touch ) {
113			for ( j = 0, len = touchEventProps.length; j < len; j++) {
114				prop = touchEventProps[ j ];
115				event[ prop ] = touch[ prop ];
116			}
117		}
118	}
119
120	return event;
121}
122
123function getVirtualBindingFlags( element ) {
124
125	var flags = {},
126		b, k;
127
128	while ( element ) {
129
130		b = $.data( element, dataPropertyName );
131
132		for (  k in b ) {
133			if ( b[ k ] ) {
134				flags[ k ] = flags.hasVirtualBinding = true;
135			}
136		}
137		element = element.parentNode;
138	}
139	return flags;
140}
141
142function getClosestElementWithVirtualBinding( element, eventType ) {
143	var b;
144	while ( element ) {
145
146		b = $.data( element, dataPropertyName );
147
148		if ( b && ( !eventType || b[ eventType ] ) ) {
149			return element;
150		}
151		element = element.parentNode;
152	}
153	return null;
154}
155
156function enableTouchBindings() {
157	blockTouchTriggers = false;
158}
159
160function disableTouchBindings() {
161	blockTouchTriggers = true;
162}
163
164function enableMouseBindings() {
165	lastTouchID = 0;
166	clickBlockList.length = 0;
167	blockMouseTriggers = false;
168
169	// When mouse bindings are enabled, our
170	// touch bindings are disabled.
171	disableTouchBindings();
172}
173
174function disableMouseBindings() {
175	// When mouse bindings are disabled, our
176	// touch bindings are enabled.
177	enableTouchBindings();
178}
179
180function startResetTimer() {
181	clearResetTimer();
182	resetTimerID = setTimeout( function() {
183		resetTimerID = 0;
184		enableMouseBindings();
185	}, $.vmouse.resetTimerDuration );
186}
187
188function clearResetTimer() {
189	if ( resetTimerID ) {
190		clearTimeout( resetTimerID );
191		resetTimerID = 0;
192	}
193}
194
195function triggerVirtualEvent( eventType, event, flags ) {
196	var ve;
197
198	if ( ( flags && flags[ eventType ] ) ||
199				( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
200
201		ve = createVirtualEvent( event, eventType );
202
203		$( event.target).trigger( ve );
204	}
205
206	return ve;
207}
208
209function mouseEventCallback( event ) {
210	var touchID = $.data( event.target, touchTargetPropertyName ),
211		ve;
212
213	if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ) {
214		ve = triggerVirtualEvent( "v" + event.type, event );
215		if ( ve ) {
216			if ( ve.isDefaultPrevented() ) {
217				event.preventDefault();
218			}
219			if ( ve.isPropagationStopped() ) {
220				event.stopPropagation();
221			}
222			if ( ve.isImmediatePropagationStopped() ) {
223				event.stopImmediatePropagation();
224			}
225		}
226	}
227}
228
229function handleTouchStart( event ) {
230
231	var touches = getNativeEvent( event ).touches,
232		target, flags, t;
233
234	if ( touches && touches.length === 1 ) {
235
236		target = event.target;
237		flags = getVirtualBindingFlags( target );
238
239		if ( flags.hasVirtualBinding ) {
240
241			lastTouchID = nextTouchID++;
242			$.data( target, touchTargetPropertyName, lastTouchID );
243
244			clearResetTimer();
245
246			disableMouseBindings();
247			didScroll = false;
248
249			t = getNativeEvent( event ).touches[ 0 ];
250			startX = t.pageX;
251			startY = t.pageY;
252
253			triggerVirtualEvent( "vmouseover", event, flags );
254			triggerVirtualEvent( "vmousedown", event, flags );
255		}
256	}
257}
258
259function handleScroll( event ) {
260	if ( blockTouchTriggers ) {
261		return;
262	}
263
264	if ( !didScroll ) {
265		triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) );
266	}
267
268	didScroll = true;
269	startResetTimer();
270}
271
272function handleTouchMove( event ) {
273	if ( blockTouchTriggers ) {
274		return;
275	}
276
277	var t = getNativeEvent( event ).touches[ 0 ],
278		didCancel = didScroll,
279		moveThreshold = $.vmouse.moveDistanceThreshold,
280		flags = getVirtualBindingFlags( event.target );
281
282		didScroll = didScroll ||
283			( Math.abs( t.pageX - startX ) > moveThreshold ||
284				Math.abs( t.pageY - startY ) > moveThreshold );
285
286	if ( didScroll && !didCancel ) {
287		triggerVirtualEvent( "vmousecancel", event, flags );
288	}
289
290	triggerVirtualEvent( "vmousemove", event, flags );
291	startResetTimer();
292}
293
294function handleTouchEnd( event ) {
295	if ( blockTouchTriggers ) {
296		return;
297	}
298
299	disableTouchBindings();
300
301	var flags = getVirtualBindingFlags( event.target ),
302		ve, t;
303	triggerVirtualEvent( "vmouseup", event, flags );
304
305	if ( !didScroll ) {
306		ve = triggerVirtualEvent( "vclick", event, flags );
307		if ( ve && ve.isDefaultPrevented() ) {
308			// The target of the mouse events that follow the touchend
309			// event don't necessarily match the target used during the
310			// touch. This means we need to rely on coordinates for blocking
311			// any click that is generated.
312			t = getNativeEvent( event ).changedTouches[ 0 ];
313			clickBlockList.push({
314				touchID: lastTouchID,
315				x: t.clientX,
316				y: t.clientY
317			});
318
319			// Prevent any mouse events that follow from triggering
320			// virtual event notifications.
321			blockMouseTriggers = true;
322		}
323	}
324	triggerVirtualEvent( "vmouseout", event, flags);
325	didScroll = false;
326
327	startResetTimer();
328}
329
330function hasVirtualBindings( ele ) {
331	var bindings = $.data( ele, dataPropertyName ),
332		k;
333
334	if ( bindings ) {
335		for ( k in bindings ) {
336			if ( bindings[ k ] ) {
337				return true;
338			}
339		}
340	}
341	return false;
342}
343
344function dummyMouseHandler() {}
345
346function getSpecialEventObject( eventType ) {
347	var realType = eventType.substr( 1 );
348
349	return {
350		setup: function(/* data, namespace */) {
351			// If this is the first virtual mouse binding for this element,
352			// add a bindings object to its data.
353
354			if ( !hasVirtualBindings( this ) ) {
355				$.data( this, dataPropertyName, {} );
356			}
357
358			// If setup is called, we know it is the first binding for this
359			// eventType, so initialize the count for the eventType to zero.
360			var bindings = $.data( this, dataPropertyName );
361			bindings[ eventType ] = true;
362
363			// If this is the first virtual mouse event for this type,
364			// register a global handler on the document.
365
366			activeDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1;
367
368			if ( activeDocHandlers[ eventType ] === 1 ) {
369				$document.bind( realType, mouseEventCallback );
370			}
371
372			// Some browsers, like Opera Mini, won't dispatch mouse/click events
373			// for elements unless they actually have handlers registered on them.
374			// To get around this, we register dummy handlers on the elements.
375
376			$( this ).bind( realType, dummyMouseHandler );
377
378			// For now, if event capture is not supported, we rely on mouse handlers.
379			if ( eventCaptureSupported ) {
380				// If this is the first virtual mouse binding for the document,
381				// register our touchstart handler on the document.
382
383				activeDocHandlers[ "touchstart" ] = ( activeDocHandlers[ "touchstart" ] || 0) + 1;
384
385				if ( activeDocHandlers[ "touchstart" ] === 1 ) {
386					$document.bind( "touchstart", handleTouchStart )
387						.bind( "touchend", handleTouchEnd )
388
389						// On touch platforms, touching the screen and then dragging your finger
390						// causes the window content to scroll after some distance threshold is
391						// exceeded. On these platforms, a scroll prevents a click event from being
392						// dispatched, and on some platforms, even the touchend is suppressed. To
393						// mimic the suppression of the click event, we need to watch for a scroll
394						// event. Unfortunately, some platforms like iOS don't dispatch scroll
395						// events until *AFTER* the user lifts their finger (touchend). This means
396						// we need to watch both scroll and touchmove events to figure out whether
397						// or not a scroll happenens before the touchend event is fired.
398
399						.bind( "touchmove", handleTouchMove )
400						.bind( "scroll", handleScroll );
401				}
402			}
403		},
404
405		teardown: function(/* data, namespace */) {
406			// If this is the last virtual binding for this eventType,
407			// remove its global handler from the document.
408
409			--activeDocHandlers[ eventType ];
410
411			if ( !activeDocHandlers[ eventType ] ) {
412				$document.unbind( realType, mouseEventCallback );
413			}
414
415			if ( eventCaptureSupported ) {
416				// If this is the last virtual mouse binding in existence,
417				// remove our document touchstart listener.
418
419				--activeDocHandlers[ "touchstart" ];
420
421				if ( !activeDocHandlers[ "touchstart" ] ) {
422					$document.unbind( "touchstart", handleTouchStart )
423						.unbind( "touchmove", handleTouchMove )
424						.unbind( "touchend", handleTouchEnd )
425						.unbind( "scroll", handleScroll );
426				}
427			}
428
429			var $this = $( this ),
430				bindings = $.data( this, dataPropertyName );
431
432			// teardown may be called when an element was
433			// removed from the DOM. If this is the case,
434			// jQuery core may have already stripped the element
435			// of any data bindings so we need to check it before
436			// using it.
437			if ( bindings ) {
438				bindings[ eventType ] = false;
439			}
440
441			// Unregister the dummy event handler.
442
443			$this.unbind( realType, dummyMouseHandler );
444
445			// If this is the last virtual mouse binding on the
446			// element, remove the binding data from the element.
447
448			if ( !hasVirtualBindings( this ) ) {
449				$this.removeData( dataPropertyName );
450			}
451		}
452	};
453}
454
455// Expose our custom events to the jQuery bind/unbind mechanism.
456
457for ( i = 0; i < virtualEventNames.length; i++ ) {
458	$.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] );
459}
460
461// Add a capture click handler to block clicks.
462// Note that we require event capture support for this so if the device
463// doesn't support it, we punt for now and rely solely on mouse events.
464if ( eventCaptureSupported ) {
465	document.addEventListener( "click", function( e ) {
466		var cnt = clickBlockList.length,
467			target = e.target,
468			x, y, ele, i, o, touchID;
469
470		if ( cnt ) {
471			x = e.clientX;
472			y = e.clientY;
473			threshold = $.vmouse.clickDistanceThreshold;
474
475			// The idea here is to run through the clickBlockList to see if
476			// the current click event is in the proximity of one of our
477			// vclick events that had preventDefault() called on it. If we find
478			// one, then we block the click.
479			//
480			// Why do we have to rely on proximity?
481			//
482			// Because the target of the touch event that triggered the vclick
483			// can be different from the target of the click event synthesized
484			// by the browser. The target of a mouse/click event that is synthesized
485			// from a touch event seems to be implementation specific. For example,
486			// some browsers will fire mouse/click events for a link that is near
487			// a touch event, even though the target of the touchstart/touchend event
488			// says the user touched outside the link. Also, it seems that with most
489			// browsers, the target of the mouse/click event is not calculated until the
490			// time it is dispatched, so if you replace an element that you touched
491			// with another element, the target of the mouse/click will be the new
492			// element underneath that point.
493			//
494			// Aside from proximity, we also check to see if the target and any
495			// of its ancestors were the ones that blocked a click. This is necessary
496			// because of the strange mouse/click target calculation done in the
497			// Android 2.1 browser, where if you click on an element, and there is a
498			// mouse/click handler on one of its ancestors, the target will be the
499			// innermost child of the touched element, even if that child is no where
500			// near the point of touch.
501
502			ele = target;
503
504			while ( ele ) {
505				for ( i = 0; i < cnt; i++ ) {
506					o = clickBlockList[ i ];
507					touchID = 0;
508
509					if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) ||
510								$.data( ele, touchTargetPropertyName ) === o.touchID ) {
511						// XXX: We may want to consider removing matches from the block list
512						//      instead of waiting for the reset timer to fire.
513						e.preventDefault();
514						e.stopPropagation();
515						return;
516					}
517				}
518				ele = ele.parentNode;
519			}
520		}
521	}, true);
522}
523}
523)( jQuery, window, document );
524
525(function( $ ) {
526	$.mobile = {};
527}( jQuery ));
528
529	(function( $, undefined ) {
530		var support = {
531			touch: "ontouchend" in document
532		};
533
534		$.mobile.support = $.mobile.support || {};
535		$.extend( $.support, support );
536		$.extend( $.mobile.support, support );
537	}( jQuery ));
538
539
540(function( $, window, undefined ) {
541	var $document = $( document ),
542		supportTouch = $.mobile.support.touch,
543		scrollEvent = "touchmove scroll",
544		touchStartEvent = supportTouch ? "touchstart" : "mousedown",
545		touchStopEvent = supportTouch ? "touchend" : "mouseup",
546		touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
547
548	// setup new event shortcuts
549	$.each( ( "touchstart touchmove touchend " +
550		"tap taphold " +
551		"swipe swipeleft swiperight " +
552		"scrollstart scrollstop" ).split( " " ), function( i, name ) {
553
554		$.fn[ name ] = function( fn ) {
555			return fn ? this.bind( name, fn ) : this.trigger( name );
556		};
557
558		// jQuery < 1.8
559		if ( $.attrFn ) {
560			$.attrFn[ name ] = true;
561		}
562	});
563
564	function triggerCustomEvent( obj, eventType, event, bubble ) {
565		var originalType = event.type;
566		event.type = eventType;
567		if ( bubble ) {
568			$.event.trigger( event, undefined, obj );
569		} else {
570			$.event.dispatch.call( obj, event );
571		}
572		event.type = originalType;
573	}
574
575	// also handles scrollstop
576	$.event.special.scrollstart = {
577
578		enabled: true,
579		setup: function() {
580
581			var thisObject = this,
582				$this = $( thisObject ),
583				scrolling,
584				timer;
585
586			function trigger( event, state ) {
587				scrolling = state;
588				triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event );
589			}
590
591			// iPhone triggers scroll after a small delay; use touchmove instead
592			$this.bind( scrollEvent, function( event ) {
593
594				if ( !$.event.special.scrollstart.enabled ) {
595					return;
596				}
597
598				if ( !scrolling ) {
599					trigger( event, true );
600				}
601
602				clearTimeout( timer );
603				timer = setTimeout( function() {
604					trigger( event, false );
605				}, 50 );
606			});
607		},
608		teardown: function() {
609			$( this ).unbind( scrollEvent );
610		}
611	};
612
613	// also handles taphold
614	$.event.special.tap = {
615		tapholdThreshold: 750,
616		emitTapOnTaphold: true,
617		setup: function() {
618			var thisObject = this,
619				$this = $( thisObject ),
620				isTaphold = false;
621
622			$this.bind( "vmousedown", function( event ) {
623				isTaphold = false;
624				if ( event.which && event.which !== 1 ) {
625					return false;
626				}
627
628				var origTarget = event.target,
629					timer;
630
631				function clearTapTimer() {
632					clearTimeout( timer );
633				}
634
635				function clearTapHandlers() {
636					clearTapTimer();
637
638					$this.unbind( "vclick", clickHandler )
639						.unbind( "vmouseup", clearTapTimer );
640					$document.unbind( "vmousecancel", clearTapHandlers );
641				}
642
643				function clickHandler( event ) {
644					clearTapHandlers();
645
646					// ONLY trigger a 'tap' event if the start target is
647					// the same as the stop target.
648					if ( !isTaphold && origTarget === event.target ) {
649						triggerCustomEvent( thisObject, "tap", event );
650					} else if ( isTaphold ) {
651						event.preventDefault();
652					}
653				}
654
655				$this.bind( "vmouseup", clearTapTimer )
656					.bind( "vclick", clickHandler );
657				$document.bind( "vmousecancel", clearTapHandlers );
658
659				timer = setTimeout( function() {
660					if ( !$.event.special.tap.emitTapOnTaphold ) {
661						isTaphold = true;
662					}
663					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
664				}, $.event.special.tap.tapholdThreshold );
665			});
666		},
667		teardown: function() {
668			$( this ).unbind( "vmousedown" ).unbind( "vclick" ).unbind( "vmouseup" );
669			$document.unbind( "vmousecancel" );
670		}
671	};
672
673	// Also handles swipeleft, swiperight
674	$.event.special.swipe = {
675
676		// More than this horizontal displacement, and we will suppress scrolling.
677		scrollSupressionThreshold: 30,
678
679		// More time than this, and it isn't a swipe.
680		durationThreshold: 1000,
681
682		// Swipe horizontal displacement must be more than this.
683		horizontalDistanceThreshold: 30,
684
685		// Swipe vertical displacement must be less than this.
686		verticalDistanceThreshold: 30,
687
688		getLocation: function ( event ) {
689			var winPageX = window.pageXOffset,
690				winPageY = window.pageYOffset,
691				x = event.clientX,
692				y = event.clientY;
693
694			if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) ||
695				event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) {
696
697				// iOS4 clientX/clientY have the value that should have been
698				// in pageX/pageY. While pageX/page/ have the value 0
699				x = x - winPageX;
700				y = y - winPageY;
701			} else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) {
702
703				// Some Android browsers have totally bogus values for clientX/Y
704				// when scrolling/zooming a page. Detectable since clientX/clientY
705				// should never be smaller than pageX/pageY minus page scroll
706				x = event.pageX - winPageX;
707				y = event.pageY - winPageY;
708			}
709
710			return {
711				x: x,
712				y: y
713			};
714		},
715
716		start: function( event ) {
717			var data = event.originalEvent.touches ?
718					event.originalEvent.touches[ 0 ] : event,
719				location = $.event.special.swipe.getLocation( data );
720			return {
721						time: ( new Date() ).getTime(),
722						coords: [ location.x, location.y ],
723						origin: $( event.target )
724					};
725		},
726
727		stop: function( event ) {
728			var data = event.originalEvent.touches ?
729					event.originalEvent.touches[ 0 ] : event,
730				location = $.event.special.swipe.getLocation( data );
731			return {
732						time: ( new Date() ).getTime(),
733						coords: [ location.x, location.y ]
734					};
735		},
736
737		handleSwipe: function( start, stop, thisObject, origTarget ) {
738			if ( stop.time - start.time < $.event.special.swipe.durationThreshold &&
739				Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&
740				Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {
741				var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight";
742
743				triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true );
744				triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true );
745				return true;
746			}
747			return false;
748
749		},
750
751		// This serves as a flag to ensure that at most one swipe event event is
752		// in work at any given time
753		eventInProgress: false,
754
755		setup: function() {
756			var events,
757				thisObject = this,
758				$this = $( thisObject ),
759				context = {};
760
761			// Retrieve the events data for this element and add the swipe context
762			events = $.data( this, "mobile-events" );
763			if ( !events ) {
764				events = { length: 0 };
765				$.data( this, "mobile-events", events );
766			}
767			events.length++;
768			events.swipe = context;
769
770			context.start = function( event ) {
771
772				// Bail if we're already working on a swipe event
773				if ( $.event.special.swipe.eventInProgress ) {
774					return;
775				}
776				$.event.special.swipe.eventInProgress = true;
777
778				var stop,
779					start = $.event.special.swipe.start( event ),
780					origTarget = event.target,
781					emitted = false;
782
783				context.move = function( event ) {
784					if ( !start || event.isDefaultPrevented() ) {
785						return;
786					}
787
788					stop = $.event.special.swipe.stop( event );
789					if ( !emitted ) {
790						emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );
791						if ( emitted ) {
792
793							// Reset the context to make way for the next swipe event
794							$.event.special.swipe.eventInProgress = false;
795						}
796					}
797					// prevent scrolling
798					if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
799						event.preventDefault();
800					}
801				};
802
803				context.stop = function() {
804						emitted = true;
805
806						// Reset the context to make way for the next swipe event
807						$.event.special.swipe.eventInProgress = false;
808						$document.off( touchMoveEvent, context.move );
809						context.move = null;
810				};
811
812				$document.on( touchMoveEvent, context.move )
813					.one( touchStopEvent, context.stop );
814			};
815			$this.on( touchStartEvent, context.start );
816		},
817
818		teardown: function() {
819			var events, context;
820
821			events = $.data( this, "mobile-events" );
822			if ( events ) {
823				context = events.swipe;
824				delete events.swipe;
825				events.length--;
826				if ( events.length === 0 ) {
827					$.removeData( this, "mobile-events" );
828				}
829			}
830
831			if ( context ) {
832				if ( context.start ) {
833					$( this ).off( touchStartEvent, context.start );
834				}
835				if ( context.move ) {
836					$document.off( touchMoveEvent, context.move );
837				}
838				if ( context.stop ) {
839					$document.off( touchStopEvent, context.stop );
840				}
841			}
842		}
843	};
844	$.each({
845		scrollstop: "scrollstart",
846		taphold: "tap",
847		swipeleft: "swipe.left",
848		swiperight: "swipe.right"
849	}, function( event, sourceEvent ) {
850
851		$.event.special[ event ] = {
852			setup: function() {
853				$( this ).bind( sourceEvent, $.noop );
854			},
855			teardown: function() {
856				$( this ).unbind( sourceEvent );
857			}
858		};
859	});
860
861})( jQuery, this );
862
863
864}));

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.