text: /*!
   * jQuery UI Mouse 1.12.1
   * http://jqueryui.com
   *
   * Copyright jQuery Foundation and other contributors
   * Released under the MIT license.
   * http://jquery.org/license
   */
  
  //>>label: Mouse
  //>>group: Widgets
  //>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
  //>>docs: http://api.jqueryui.com/mouse/
  
  ( function( factory ) {
  	if ( typeof define === "function" && define.amd ) {
  
  		// AMD. Register as an anonymous module.
  		define( [
  			"jquery",
  			"../ie",
  			"../version",
  			"../widget"
  		], factory );
  	} else {
  
  		// Browser globals
  		factory( jQuery );
  	}
  }( function( $ ) {
  
  var mouseHandled = false;
  $( document ).on( "mouseup", function() {
  	mouseHandled = false;
  } );
  
  return $.widget( "ui.mouse", {
  	version: "1.12.1",
  	options: {
  		cancel: "input, textarea, button, select, option",
  		distance: 1,
  		delay: 0
  	},
  	_mouseInit: function() {
  		var that = this;
  
  		this.element
  			.on( "mousedown." + this.widgetName, function( event ) {
  				return that._mouseDown( event );
  			} )
  			.on( "click." + this.widgetName, function( event ) {
  				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
  					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
  					event.stopImmediatePropagation();
  					return false;
  				}
  			} );
  
  		this.started = false;
  	},
  
  	// TODO: make sure destroying one instance of mouse doesn't mess with
  	// other instances of mouse
  	_mouseDestroy: function() {
  		this.element.off( "." + this.widgetName );
  		if ( this._mouseMoveDelegate ) {
  			this.document
  				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
  		}
  	},
  
  	_mouseDown: function( event ) {
  
  		// don't let more than one widget handle mouseStart
  		if ( mouseHandled ) {
  			return;
  		}
  
  		this._mouseMoved = false;
  
  		// We may have missed mouseup (out of window)
  		( this._mouseStarted && this._mouseUp( event ) );
  
  		this._mouseDownEvent = event;
  
  		var that = this,
  			btnIsLeft = ( event.which === 1 ),
  
  			// event.projection.nodeName works around a bug in IE 8 with
  			// disabled inputs (#7620)
  			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
  				$( event.target ).closest( this.options.cancel ).length : false );
  		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
  			return true;
  		}
  
  		this.mouseDelayMet = !this.options.delay;
  		if ( !this.mouseDelayMet ) {
  			this._mouseDelayTimer = setTimeout( function() {
  				that.mouseDelayMet = true;
  			}, this.options.delay );
  		}
  
  		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
  			this._mouseStarted = ( this._mouseStart( event ) !== false );
  			if ( !this._mouseStarted ) {
  				event.preventDefault();
  				return true;
  			}
  		}
  
  		// Click event may never have fired (Gecko & Opera)
  		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
  			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
  		}
  
  		// These delegates are required to keep context
  		this._mouseMoveDelegate = function( event ) {
  			return that._mouseMove( event );
  		};
  		this._mouseUpDelegate = function( event ) {
  			return that._mouseUp( event );
  		};
  
  		this.document
  			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
  
  		event.preventDefault();
  
  		mouseHandled = true;
  		return true;
  	},
  
  	_mouseMove: function( event ) {
  
  		// Only check for mouseups outside the document if you've moved inside the document
  		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
  		// fire a mousemove event if content is placed under the cursor. See #7778
  		// Support: IE <9
  		if ( this._mouseMoved ) {
  
  			// IE mouseup check - mouseup happened when mouse was out of window
  			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
  					!event.button ) {
  				return this._mouseUp( event );
  
  			// Iframe mouseup check - mouseup occurred in another document
  			} else if ( !event.which ) {
  
  				// Support: Safari <=8 - 9
  				// Safari sets which to 0 if you press any of the following keys
  				// during a drag (#14461)
  				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
  						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
  					this.ignoreMissingWhich = true;
  				} else if ( !this.ignoreMissingWhich ) {
  					return this._mouseUp( event );
  				}
  			}
  		}
  
  		if ( event.which || event.button ) {
  			this._mouseMoved = true;
  		}
  
  		if ( this._mouseStarted ) {
  			this._mouseDrag( event );
  			return event.preventDefault();
  		}
  
  		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
  			this._mouseStarted =
  				( this._mouseStart( this._mouseDownEvent, event ) !== false );
  			( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
  		}
  
  		return !this._mouseStarted;
  	},
  
  	_mouseUp: function( event ) {
  		this.document
  			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
  
  		if ( this._mouseStarted ) {
  			this._mouseStarted = false;
  
  			if ( event.target === this._mouseDownEvent.target ) {
  				$.data( event.target, this.widgetName + ".preventClickEvent", true );
  			}
  
  			this._mouseStop( event );
  		}
  
  		if ( this._mouseDelayTimer ) {
  			clearTimeout( this._mouseDelayTimer );
  			delete this._mouseDelayTimer;
  		}
  
  		this.ignoreMissingWhich = false;
  		mouseHandled = false;
  		event.preventDefault();
  	},
  
  	_mouseDistanceMet: function( event ) {
  		return ( Math.max(
  				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
  				Math.abs( this._mouseDownEvent.pageY - event.pageY )
  			) >= this.options.distance
  		);
  	},
  
  	_mouseDelayMet: function( /* event */ ) {
  		return this.mouseDelayMet;
  	},
  
  	// These are placeholder methods, to be overriden by extending plugin
  	_mouseStart: function( /* event */ ) {},
  	_mouseDrag: function( /* event */ ) {},
  	_mouseStop: function( /* event */ ) {},
  	_mouseCapture: function( /* event */ ) { return true; }
  } );
  
  } ) );
  