summaryrefslogtreecommitdiff
path: root/frontend/gamma/js/MochiKit/Signal.js
Side-by-side diff
Diffstat (limited to 'frontend/gamma/js/MochiKit/Signal.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/js/MochiKit/Signal.js47
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);