var EventSelectors = { version: '1.0_pre', cache: [], start: function(rules) { this.rules = rules || {}; this.timer = new Array(); this._extendRules(); this.assign(this.rules); }, assign: function(rules) { var observer = null; this._unloadCache(); rules._each(function(rule) { var selectors = $A(rule.key.split(',')); selectors.each(function(selector) { var pair = selector.split(':'); var event = pair[1]; $$(pair[0]).each(function(element) { if(pair[1] == '' || pair.length == 1) return rule.value(element); if(event.toLowerCase() == 'loaded') { this.timer[pair[0]] = setInterval(this._checkLoaded.bind(this, element, pair[0], rule), 15); } else { observer = function(event) { var element = Event.element(event); if (element.nodeType == 3) // Safari Bug (Fixed in Webkit) element = element.parentNode; rule.value($(element), event); } this.cache.push([element, event, observer]); Event.observe(element, event, observer); } }.bind(this)); }.bind(this)); }.bind(this)); }, // Scoped caches would rock. _unloadCache: function() { if (!this.cache) return; for (var i = 0; i < this.cache.length; i++) { Event.stopObserving.apply(this, this.cache[i]); this.cache[i][0] = null; } this.cache = []; }, _checkLoaded: function(element, timer, rule) { var node = $(element); if(element.tagName != 'undefined') { clearInterval(this.timer[timer]); rule.value(node); } }, _extendRules: function() { Object.extend(this.rules, { _each: function(iterator) { for (key in this) { if(key == '_each') continue; var value = this[key]; var pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } } }); } }