-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsignajs.js
118 lines (96 loc) · 3.77 KB
/
signajs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
var signajs = (function() {
var SIGNAJS_PROP = '__signajs_events__';
function signajs_object_property(object) {
if(typeof(object[SIGNAJS_PROP]) === 'undefined') {
Object.defineProperty(object, SIGNAJS_PROP, {
enumerable: false,
writable: true
});
object[SIGNAJS_PROP] = {};
}
return object[SIGNAJS_PROP];
}
function signajs_event_slots(object, event) {
var objectSignajs = signajs_object_property(object);
if(typeof(objectSignajs[event]) === 'undefined')
objectSignajs[event] = []
return objectSignajs[event];
}
var signajs = {
connect: function signajs_connect(object, events, callback) {
if(typeof(callback) === 'function') {
events = events.split(/\s+/);
for (var i = 0; i < events.length; ++i)
signajs_event_slots(object, events[i]).push(callback)
}
return this;
},
disconnect: function signajs_disconnect(object, events, callback) {
var objectSignajs = signajs_object_property(object);
events = events.split(/\s+/);
for (var i = 0; i < events.length; ++i) {
if (events[i] in objectSignajs) {
var eventSlots = signajs_event_slots(object, events[i]);
if (typeof(callback) === 'function') {
var found = false;
for (var k; k < eventSlots[i].length; ++k) {
if (eventSlots[k] == callback) {
found = true;
break;
}
}
if (found)
eventSlots[i].splice(k, 1)
} else {
delete objectSignajs[events[i]];
}
}
}
return this;
},
signal: function signajs_signal(object, event) {
var objectEvent, dot, eventName
, callbacksQueue = []
, args = Array.prototype.slice.apply(arguments, [2])
, objectSignajs = signajs_object_property(object);
;
for (objectEvent in objectSignajs) {
dot = objectEvent.indexOf('.');
if (dot !== -1)
eventName = objectEvent.substr(0, dot);
else
eventName = objectEvent
if (eventName === event)
callbacksQueue.push.apply(
callbacksQueue, signajs_event_slots(object, objectEvent)
)
}
if (callbacksQueue.length) {
setTimeout(function () {
for (var i=0;i<callbacksQueue.length; ++i) {
if (typeof(callbacksQueue[i]) === 'function') {
callbacksQueue[i].call(object, args)
}
}
}, 0);
}
return this;
}
};
signajs.SignableObject = function SignableObject() {}
signajs.SignableObject.prototype.on = function signajs_connect_proto(events, callback) {
signajs.connect(this, events, callback);
return this;
};
signajs.SignableObject.prototype.off = function signajs_disconnect_proto(events, callback) {
signajs.disconnect(this, events, callback);
return this;
};
signajs.SignableObject.prototype.fire = function signajs_signal_proto(event, data) {
signajs.signal.apply(
this, Array.prototype.slice.call(arguments, [])
);
return this;
};
return signajs;
})();