/**
 * 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: 1000,
        event: 'keyup'
    },

    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(this.options.event, 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(this.options.event, this.bound);
        return this;
    }

});

var $equals = function(obj1, obj2) {
    return (obj1 == obj2 || JSON.encode(obj1) == JSON.encode(obj2));
};