PrefixSearch: Avoid notice when no subpage exists
[mediawiki.git] / resources / lib / jquery.ui / jquery.ui.mouse.js
blob250365fe728f51a1157d89cd8080d6566b8f85bb
1 /*!
2  * jQuery UI Mouse 1.9.2
3  * http://jqueryui.com
4  *
5  * Copyright 2012 jQuery Foundation and other contributors
6  * Released under the MIT license.
7  * http://jquery.org/license
8  *
9  * http://api.jqueryui.com/mouse/
10  *
11  * Depends:
12  *      jquery.ui.widget.js
13  */
14 (function( $, undefined ) {
16 var mouseHandled = false;
17 $( document ).mouseup( function( e ) {
18         mouseHandled = false;
19 });
21 $.widget("ui.mouse", {
22         version: "1.9.2",
23         options: {
24                 cancel: 'input,textarea,button,select,option',
25                 distance: 1,
26                 delay: 0
27         },
28         _mouseInit: function() {
29                 var that = this;
31                 this.element
32                         .bind('mousedown.'+this.widgetName, function(event) {
33                                 return that._mouseDown(event);
34                         })
35                         .bind('click.'+this.widgetName, function(event) {
36                                 if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
37                                         $.removeData(event.target, that.widgetName + '.preventClickEvent');
38                                         event.stopImmediatePropagation();
39                                         return false;
40                                 }
41                         });
43                 this.started = false;
44         },
46         // TODO: make sure destroying one instance of mouse doesn't mess with
47         // other instances of mouse
48         _mouseDestroy: function() {
49                 this.element.unbind('.'+this.widgetName);
50                 if ( this._mouseMoveDelegate ) {
51                         $(document)
52                                 .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
53                                 .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
54                 }
55         },
57         _mouseDown: function(event) {
58                 // don't let more than one widget handle mouseStart
59                 if( mouseHandled ) { return; }
61                 // we may have missed mouseup (out of window)
62                 (this._mouseStarted && this._mouseUp(event));
64                 this._mouseDownEvent = event;
66                 var that = this,
67                         btnIsLeft = (event.which === 1),
68                         // event.target.nodeName works around a bug in IE 8 with
69                         // disabled inputs (#7620)
70                         elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
71                 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
72                         return true;
73                 }
75                 this.mouseDelayMet = !this.options.delay;
76                 if (!this.mouseDelayMet) {
77                         this._mouseDelayTimer = setTimeout(function() {
78                                 that.mouseDelayMet = true;
79                         }, this.options.delay);
80                 }
82                 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
83                         this._mouseStarted = (this._mouseStart(event) !== false);
84                         if (!this._mouseStarted) {
85                                 event.preventDefault();
86                                 return true;
87                         }
88                 }
90                 // Click event may never have fired (Gecko & Opera)
91                 if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
92                         $.removeData(event.target, this.widgetName + '.preventClickEvent');
93                 }
95                 // these delegates are required to keep context
96                 this._mouseMoveDelegate = function(event) {
97                         return that._mouseMove(event);
98                 };
99                 this._mouseUpDelegate = function(event) {
100                         return that._mouseUp(event);
101                 };
102                 $(document)
103                         .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
104                         .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
106                 event.preventDefault();
108                 mouseHandled = true;
109                 return true;
110         },
112         _mouseMove: function(event) {
113                 // IE mouseup check - mouseup happened when mouse was out of window
114                 if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
115                         return this._mouseUp(event);
116                 }
118                 if (this._mouseStarted) {
119                         this._mouseDrag(event);
120                         return event.preventDefault();
121                 }
123                 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
124                         this._mouseStarted =
125                                 (this._mouseStart(this._mouseDownEvent, event) !== false);
126                         (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
127                 }
129                 return !this._mouseStarted;
130         },
132         _mouseUp: function(event) {
133                 $(document)
134                         .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
135                         .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
137                 if (this._mouseStarted) {
138                         this._mouseStarted = false;
140                         if (event.target === this._mouseDownEvent.target) {
141                                 $.data(event.target, this.widgetName + '.preventClickEvent', true);
142                         }
144                         this._mouseStop(event);
145                 }
147                 return false;
148         },
150         _mouseDistanceMet: function(event) {
151                 return (Math.max(
152                                 Math.abs(this._mouseDownEvent.pageX - event.pageX),
153                                 Math.abs(this._mouseDownEvent.pageY - event.pageY)
154                         ) >= this.options.distance
155                 );
156         },
158         _mouseDelayMet: function(event) {
159                 return this.mouseDelayMet;
160         },
162         // These are placeholder methods, to be overriden by extending plugin
163         _mouseStart: function(event) {},
164         _mouseDrag: function(event) {},
165         _mouseStop: function(event) {},
166         _mouseCapture: function(event) { return true; }
169 })(jQuery);