This repository has been archived by the owner on Feb 21, 2023. It is now read-only.
/
behaviors.js
59 lines (52 loc) · 1.56 KB
/
behaviors.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
//= require "controldepo"
//= require "extensions/event.js"
/*
* based on:
* Justin Palmer's EventSelectors (http://encytemedia.com/event-selectors)
* Dan Webb's LowPro (http://svn.danwebb.net/external/lowpro)
*/
CD3.Behaviors = (function(){
function run(args){
if (args.length == 1){
var root = document, rules = args[0];
} else {
var root = $$(args[0]).first(), rules = args[1];
}
if (root) assign(root, Object.isFunction(rules) ? rules.call(root, root) : rules);
}
function assign(root, rules){
for (var selector in rules){
var observer = rules[selector], parts = selector.split(/:(?=[a-z]+$)/), css = parts.shift(), event = parts.join('');
Selector.findChildElements(root, [css]).each(function(element){
if (event){
observe(element, event, observer);
} else if (observer.prototype && observer.prototype.initialize){
new observer(element);
} else if (Object.isFunction(observer)){
observer.call(element, element);
} else if (Object.isArray(observer)){
var klass = observer.shift();
new klass(element, observer.shift());
} else {
for(var e in observer) observe(element, e, observer[e]);
}
});
}
}
function observe(element, event, observer){
if (Object.isFunction(observer)){
Event.observe(element, event, observer);
} else {
for(var selector in observer){
Event.delegate(element, selector, event, observer[selector]);
}
}
}
return function(){
if (document.loaded){
run(arguments);
} else {
document.observe('dom:loaded', run.curry(arguments));
}
};
})();