var Observer = new Class({	Implements: [Options, Events],	options: {		periodical: false,		delay: 1000	},	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));};