blob: 78c8ef66d3c76e6dad12c91307ff6a8c3b1659b4 [file] [log] [blame]
/*!
* jQuery UI Mouse 1.8.23
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Mouse
*
* Depends:
* jquery.ui.widget.js
*/
(function ($, undefined) {
var mouseHandled = false;
$(document).mouseup(function (e) {
mouseHandled = false;
});
$.widget("ui.mouse", {
options:{
cancel:':input,option',
distance:1,
delay:0
},
_mouseInit:function () {
var self = this;
this.element
.bind('mousedown.' + this.widgetName, function (event) {
return self._mouseDown(event);
})
.bind('click.' + this.widgetName, function (event) {
if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
$.removeData(event.target, self.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.unbind('.' + this.widgetName);
if (this._mouseMoveDelegate) {
$(document)
.unbind('mousemove.' + this.widgetName, this._mouseMoveDelegate)
.unbind('mouseup.' + this.widgetName, this._mouseUpDelegate);
}
},
_mouseDown:function (event) {
// don't let more than one widget handle mouseStart
if (mouseHandled) {
return
}
;
// we may have missed mouseup (out of window)
(this._mouseStarted && this._mouseUp(event));
this._mouseDownEvent = event;
var self = this,
btnIsLeft = (event.which == 1),
// event.target.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 () {
self.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 self._mouseMove(event);
};
this._mouseUpDelegate = function (event) {
return self._mouseUp(event);
};
$(document)
.bind('mousemove.' + this.widgetName, this._mouseMoveDelegate)
.bind('mouseup.' + this.widgetName, this._mouseUpDelegate);
event.preventDefault();
mouseHandled = true;
return true;
},
_mouseMove:function (event) {
// IE mouseup check - mouseup happened when mouse was out of window
if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
return this._mouseUp(event);
}
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) {
$(document)
.unbind('mousemove.' + this.widgetName, this._mouseMoveDelegate)
.unbind('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);
}
return false;
},
_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;
}
});
})(jQuery);