/**
 * 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
	},

	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(e) {

		if(e.key!='up' && e.key!='enter' && e.key!='down' && e.key!='tab' && e.key!='shift' && e.key!='ctrl')
		{
			if($('citycode'))$('citycode').set('value','');
			if($('assignedHidden'))$('assignedHidden').set('value','');
			
			if($('typeCnt'))if($('typeCnt').get('alt')!='dontHide')$('typeCnt').setStyle('display','none');
			
			if($('typeInfo'))$('typeInfo').setStyle('display','none');
			if($('stars'))$('stars').setStyle('display','none');
			if($('star_type'))$('star_type').setStyle('display','none');
			if($('keys'))$('keys').setStyle('display','none');
			if($("reserveType"))$("reserveType").setStyle('display','none');
	//		if($('officialForm'))$('officialForm').setStyle('display','none');
		}


		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));
};
