Diffstat (limited to 'frontend/gamma/js/MochiKit/Signal.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/gamma/js/MochiKit/Signal.js | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/frontend/gamma/js/MochiKit/Signal.js b/frontend/gamma/js/MochiKit/Signal.js index 7df5619..11590c1 100644 --- a/frontend/gamma/js/MochiKit/Signal.js +++ b/frontend/gamma/js/MochiKit/Signal.js @@ -1,23 +1,23 @@ /*** MochiKit.Signal 1.5 See <http://mochikit.com/> for documentation, downloads, license, etc. (c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. ***/ -MochiKit.Base._module('Signal', '1.5', ['Base', 'DOM', 'Style']); +MochiKit.Base.module(MochiKit, 'Signal', '1.5', ['Base', 'DOM']); MochiKit.Signal._observers = []; /** @id MochiKit.Signal.Event */ MochiKit.Signal.Event = function (src, e) { this._event = e || window.event; this._src = src; }; MochiKit.Signal.Event.__export__ = false; MochiKit.Base.update(MochiKit.Signal.Event.prototype, { @@ -257,34 +257,35 @@ MochiKit.Base.update(MochiKit.Signal.Event.prototype, { _mouse: null, /** @id MochiKit.Signal.Event.prototype.mouse */ mouse: function () { if (this._mouse !== null) { return this._mouse; } var m = {}; var e = this._event; if (this.type() && ( this.type().indexOf('mouse') === 0 || + this.type().indexOf('drag') === 0 || this.type().indexOf('click') != -1 || this.type() == 'contextmenu')) { - m.client = new MochiKit.Style.Coordinates(0, 0); + m.client = { x: 0, y: 0 }; if (e.clientX || e.clientY) { m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX; m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY; } - m.page = new MochiKit.Style.Coordinates(0, 0); + m.page = { x: 0, y: 0 }; if (e.pageX || e.pageY) { m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX; m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY; } else { /* The IE shortcut can be off by two. We fix it. See: http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp This is similar to the method used in MochiKit.Style.getElementPosition(). @@ -328,25 +329,25 @@ MochiKit.Base.update(MochiKit.Signal.Event.prototype, { oncontextmenu is fired on right clicks between browsers and across platforms. */ } else { m.button.left = !!(e.button & 1); m.button.right = !!(e.button & 2); m.button.middle = !!(e.button & 4); } } if (this.type() == 'mousewheel') { - m.wheel = new MochiKit.Style.Coordinates(0, 0); + m.wheel = { x: 0, y: 0 }; if (e.wheelDeltaX || e.wheelDeltaY) { m.wheel.x = e.wheelDeltaX / -40 || 0; m.wheel.y = e.wheelDeltaY / -40 || 0; } else if (e.wheelDelta) { m.wheel.y = e.wheelDelta / -40; } else { m.wheel.y = e.detail || 0; } } this._mouse = m; return m; } @@ -663,24 +664,36 @@ MochiKit.Base.update(MochiKit.Signal, { connected: true }); self._observers.push(ident); if (!isDOM && typeof(src.__connect__) == 'function') { var args = MochiKit.Base.extend([ident], arguments, 1); src.__connect__.apply(src, args); } return ident; }, + /** @id MochiKit.Signal.connectOnce */ + connectOnce: function (src, sig, objOrFunc/* optional */, funcOrStr) { + var self = MochiKit.Signal; + var ident1 = self.connect(src, sig, objOrFunc, funcOrStr); + var ident2; + ident2 = self.connect(src, sig, function() { + self.disconnect(ident1); + self.disconnect(ident2); + }); + return ident1; + }, + _disconnect: function (ident) { // already disconnected if (!ident.connected) { return; } ident.connected = false; var src = ident.source; var sig = ident.signal; var listener = ident.listener; // check isDOM if (!ident.isDOM) { if (typeof(src.__disconnect__) == 'function') { @@ -706,171 +719,171 @@ MochiKit.Base.update(MochiKit.Signal, { // compatibility API var src = arguments[0]; if (typeof(src) == "string") { src = MochiKit.DOM.getElement(src); } var sig = arguments[1]; var obj = arguments[2]; var func = arguments[3]; for (var i = observers.length - 1; i >= 0; i--) { var o = observers[i]; if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) { self._disconnect(o); - if (!self._lock) { + if (self._lock === 0) { observers.splice(i, 1); } else { self._dirty = true; } return true; } } } else { var idx = m.findIdentical(observers, ident); if (idx >= 0) { self._disconnect(ident); - if (!self._lock) { + if (self._lock === 0) { observers.splice(idx, 1); } else { self._dirty = true; } return true; } } return false; }, /** @id MochiKit.Signal.disconnectAllTo */ disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) { var self = MochiKit.Signal; var observers = self._observers; var disconnect = self._disconnect; - var locked = self._lock; + var lock = self._lock; var dirty = self._dirty; if (typeof(funcOrStr) === 'undefined') { funcOrStr = null; } for (var i = observers.length - 1; i >= 0; i--) { var ident = observers[i]; if (ident.objOrFunc === objOrFunc && (funcOrStr === null || ident.funcOrStr === funcOrStr)) { disconnect(ident); - if (locked) { - dirty = true; - } else { + if (lock === 0) { observers.splice(i, 1); + } else { + dirty = true; } } } self._dirty = dirty; }, /** @id MochiKit.Signal.disconnectAll */ disconnectAll: function (src/* optional */, sig) { if (typeof(src) == "string") { src = MochiKit.DOM.getElement(src); } var m = MochiKit.Base; var signals = m.flattenArguments(m.extend(null, arguments, 1)); var self = MochiKit.Signal; var disconnect = self._disconnect; var observers = self._observers; var i, ident; - var locked = self._lock; + var lock = self._lock; var dirty = self._dirty; if (signals.length === 0) { // disconnect all for (i = observers.length - 1; i >= 0; i--) { ident = observers[i]; if (ident.source === src) { disconnect(ident); - if (!locked) { + if (lock === 0) { observers.splice(i, 1); } else { dirty = true; } } } } else { var sigs = {}; for (i = 0; i < signals.length; i++) { sigs[signals[i]] = true; } for (i = observers.length - 1; i >= 0; i--) { ident = observers[i]; if (ident.source === src && ident.signal in sigs) { disconnect(ident); - if (!locked) { + if (lock === 0) { observers.splice(i, 1); } else { dirty = true; } } } } self._dirty = dirty; }, /** @id MochiKit.Signal.signal */ signal: function (src, sig) { var self = MochiKit.Signal; var observers = self._observers; if (typeof(src) == "string") { src = MochiKit.DOM.getElement(src); } var args = MochiKit.Base.extend(null, arguments, 2); var errors = []; - self._lock = true; + self._lock++; for (var i = 0; i < observers.length; i++) { var ident = observers[i]; if (ident.source === src && ident.signal === sig && ident.connected) { try { if (ident.isDOM && ident.funcOrStr != null) { var obj = ident.objOrFunc; obj[ident.funcOrStr].apply(obj, args); } else if (ident.isDOM) { ident.objOrFunc.apply(src, args); } else { ident.listener.apply(src, args); } } catch (e) { errors.push(e); } } } - self._lock = false; - if (self._dirty) { + self._lock--; + if (self._lock === 0 && self._dirty) { self._dirty = false; for (var i = observers.length - 1; i >= 0; i--) { if (!observers[i].connected) { observers.splice(i, 1); } } } if (errors.length == 1) { throw errors[0]; } else if (errors.length > 1) { var e = new Error("Multiple errors thrown in handling 'sig', see errors property"); e.errors = errors; throw e; } } }); MochiKit.Signal.__new__ = function (win) { var m = MochiKit.Base; this._document = document; this._window = win; - this._lock = false; + this._lock = 0; this._dirty = false; try { this.connect(window, 'onunload', this._unloadCache); } catch (e) { // pass: might not be a browser } m.nameFunctions(this); }; MochiKit.Signal.__new__(this); |