This repository has been archived by the owner on Jan 5, 2024. It is now read-only.
forked from sebmarkbage/art
-
Notifications
You must be signed in to change notification settings - Fork 1
/
dummy.js
116 lines (105 loc) · 2.64 KB
/
dummy.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
var Class = require('../core/class');
module.exports = Class({
// placement
_resetPlacement: function(){
var container = this.parentNode;
if (container){
var previous = this.previousSibling, next = this.nextSibling;
if (previous){
previous.nextSibling = next;
} else {
container.firstChild = next;
}
if (next){
next.previousSibling = previous;
} else {
container.lastChild = this.previousSibling;
}
}
this.previousSibling = null;
this.nextSibling = null;
this.parentNode = null;
return this;
},
inject: function(container){
this._resetPlacement();
var last = container.lastChild;
if (last){
last.nextSibling = this;
this.previousSibling = last;
} else {
container.firstChild = this;
}
container.lastChild = this;
this.parentNode = container;
this._place();
return this;
},
injectBefore: function(sibling){
this._resetPlacement();
var container = sibling.parentNode;
if (!container) return this;
var previous = sibling.previousSibling;
if (previous){
previous.nextSibling = this;
this.previousSibling = previous;
} else {
container.firstChild = this;
}
sibling.previousSibling = this;
this.nextSibling = sibling;
this.parentNode = container;
this._place();
return this;
},
eject: function(){
this._resetPlacement();
this._place();
return this;
},
_place: function(){},
// events
dispatch: function(event){
var events = this._events,
listeners = events && events[event.type];
if (listeners){
listeners = listeners.slice(0);
for (var i = 0, l = listeners.length; i < l; i++){
var fn = listeners[i], result;
if (typeof fn == 'function')
result = fn.call(this, event);
else
result = fn.handleEvent(event);
if (result === false) event.preventDefault();
}
}
if (this.parentNode && this.parentNode.dispatch){
this.parentNode.dispatch(event);
}
},
subscribe: function(type, fn, bind){
if (typeof type != 'string'){ // listen type / fn with object
var subscriptions = [];
for (var t in type) subscriptions.push(this.subscribe(t, type[t]));
return function(){ // unsubscribe
for (var i = 0, l = subscriptions.length; i < l; i++)
subscriptions[i]();
return this;
};
} else { // listen to one
var bound = typeof fn === 'function' ? fn.bind(bind || this) : fn,
events = this._events || (this._events = {}),
listeners = events[type] || (events[type] = []);
listeners.push(bound);
return function(){
// unsubscribe
for (var i = 0, l = listeners.length; i < l; i++){
if (listeners[i] === bound){
listeners.splice(i, 1);
break;
}
}
}
}
}
});