/**
 * Observer - Observe formelements for changes
 *
 * - Additional code from clientside.cnet.com
 *
 * @version                1.1
 *
 * @license                MIT-style license
 * @author                Harald Kirschner <mail [at] digitarald.de>
 * @copyright        Author
 */
var Observer = new Class({

        Implements: [Options, Events],

        options: {
                periodical: false,
                delay: 10
        },

        initialize: function(el, onFired, options){
                this.element = $(el) || $$(el);
                this.addEvent('onFired', onFired);
                this.setOptions(options);
                this.bound = this.changed.bind(this);
                this.resume();
        },

        changed: function() {
                var value = this.element.get('value');
                if ($equals(this.value, value)) return;
                this.clear();
                this.value = value;
                this.timeout = this.onFired.delay(this.options.delay, this);
        },

        setValue: function(value) {
                this.value = value;
                this.element.set('value', value);
                return this.clear();
        },

        onFired: function() {
                this.fireEvent('onFired', [this.value, this.element]);
        },

        clear: function() {
                $clear(this.timeout || null);
                return this;
        },

        pause: function(){
                if (this.timer) $clear(this.timer);
                else this.element.removeEvent('keyup', this.bound);
                return this.clear();
        },

        resume: function(){
                this.value = this.element.get('value');
                if (this.options.periodical) this.timer = this.changed.periodical(this.options.periodical, this);
                else this.element.addEvent('keyup', this.bound);
                return this;
        }

});

var $equals = function(obj1, obj2) {
        return (obj1 == obj2 || JSON.encode(obj1) == JSON.encode(obj2));
};