/**
 * @author jdreissig
 */

 
 
if (typeof(mobile) == "undefined") var mobile = {};

mobile.FormWatcher = Class.create({
	_form: null,
	_method: null,
	_options: null,
	
	initialize: function(form, method, options) {
		this._form = $(form);
		this._method = method;
		this._options = Object.extend({
			registerKeyHandlers: true,
			registerChangeHandlers: true
		}, options);
		
		this._initHandlers();
	},
	
	_initHandlers: function() {
		if (this._options.registerChangeHandlers) {
			this._initChangeHandlers();
		}
		if (this._options.registerKeyHandlers) {
			this._initKeyUpHandlers();
		}
	},

	_initChangeHandlers: function(){
		// update hit counter on any entry in form
		if (!Prototype.Browser.IE) {
			this._form.observe('change', (function(event) {
				var element = Event.element(event);
				// input fields have a keyup handler, exclude here
				if (!(element.tagName.toLowerCase() == "input" && (element.type || "").toLowerCase() == "text")) {
					this._method();
				}
			}).bindAsEventListener(this));
		} else {
			// IE needs change handlers for each form element.
			// Text input fields handle change via a key handler on the form element, exclude here.
			this._form.getElements("select").invoke("observe", "change", this._method);
			// IE needs a blur for a change after a click on a checkbox, use a click handler instead.
			this._form.select("input[type=checkbox]").invoke("observe", "click", this._method);
			this._form.observe("dom:update", (function(event) {
				// attach handlers to new elements here.
				event.memo.select('select').invoke("observe", "change", this._method);
			}).bindAsEventListener(this));
		}
	},

	_initKeyUpHandlers: function(){
		this._form.observe('keyup', (function(event) {
			if ((event.keyCode > 20 && !this.constructor._SPECIAL_KEY_CODES.include(event.keyCode)) || event.keyCode == Event.KEY_BACKSPACE) {
				this._method();
			}
		}).bindAsEventListener(this));
	}
	
});

Object.extend(mobile.FormWatcher, {
	_SPECIAL_KEY_CODES: $w("TAB RETURN ESC LEFT UP RIGHT DOWN HOME END PAGEUP PAGEDOWN INSERT").map(function(name) {return Event["KEY_"+name]})	
});
