Property watchers

by Christopher Pitt

HTML

<div id="puppet"></div>

JavaScript

// should be used with: https://github.com/sixtyseconds/mootools-unified-timer

(function(){
    
    var id = 0,
        lookup = {},
        hasOnPropertyChange = Browser.ie6 || Browser.ie7 || Browser.ie8,
        hasDOMAttrModified = (Browser.opera && Browser.version >= 7) || Browser.firefox || (Browser.ie && Browser.version >= 9);
    
    Element.implement({
        'addWatcher': function(property, callback, repeat) {
            
            var me = id++;
            lookup[me] = {
                'worker': function(before, after) {
                    var now = after || this.get(lookup[me].property);
                    callback(before || lookup[me].last, now);
                    lookup[me].last = now;
                },
                'watcher': 'watcher-' + property + '-' + me,
                'repeat': repeat || 50,
                'property': property,
                'last': this.get(property)
            };
            
            if (hasOnPropertyChange) {
                this.addListener('onpropertychange', lookup[me].worker);
            } else if (hasDOMAttrModified) {
                this.addListener('DOMAttrModified', lookup[me].worker);
            } else {
                lookup[me].interval = setInterval(function(){
                    var before = lookup[me].last,
                        after = this.get(lookup[me].property);
                    if (before != after) {
                        lookup[me].worker(before, after);
                    }
                }.bind(this), lookup[me].repeat);
            }
            
            return me;
        },
        'addWatchers': function(watchers) {
            var us = [];
            
            Object.each(watchers, function(watcher, key) {
                us.push(this.addWatcher(key, watcher));
            }.bind(this));
            
            return us;
        },
        'removeWatcher': function(me) {
            if (hasOnPropertyChange) {
               ...