/*
# $Id$
*/

/*
# @namespace App.Form
*/
App.Form = {

	/*
	# @function void disableElement( HTMLElement e )
	# e	= Element
	#
	# Disables the form element, and all fields contained within.
	*/
	disableElement: function(e) {

		// Disable all fields
		var fields = e.getElements('input,textarea');
		for(var i=0; i<fields.length; i++) {
			fields[i].disabled = true;
		}

		// Fade out
		var f = new Fx.Tween(e, {
			property: 'opacity',
			duration: 50,
			onComplete: function() {
				e.addClass('disabled');
			}
		});
		f.start(1, 0.33);
	},

	/*
	# @function void enableElement( HTMLElement e )
	# e	= Element
	#
	# Enables the element, and all fields contained within.
	*/
	enableElement: function(e) {

		// Enable all fields
		var fields = e.getElements('input,textarea,select');
		for(var i=0; i<fields.length; i++) {
			fields[i].disabled = false;
		}

		// Fade in
		var f = new Fx.Tween(e, {
			property: 'opacity',
			duration: 50,
			onComplete: function() {
				e.removeClass('disabled');
			}
		});
		f.start(0.33, 1);
	},

	/*
	# @function bool hasChanged( HTMLFormELement form )
	# form	= The form to check
	#
	# Checks if any of the fields in the specified form have been altered since
	# the page was first loaded.
	# If you want to ignore any elements in this check, set the
	# "ignoreHasChanged" on those elements to "true".
	*/
	hasChanged: function(form) {  
		var el = form.elements;
		for (var j=0; j < el.length; j++) {
			var e = $(el[j]);
			var ignoreHasChanged = e.get('ignoreHasChanged') ? true : false;
			if(!ignoreHasChanged && e.type && App.Form.hasElementChanged(e)) {
				return true;
			} 
		}
		return false;
	},

	hasElementChanged: function(el) {
		switch(el.type.toLowerCase()) {
			case 'text':
			case 'textarea':
			case 'password':
				if(el.value!=el.defaultValue) {
					return true;
				}
				break;

			case 'radio':
			case 'checkbox':
			if(el.checked!=el.defaultChecked) {
				return true;
			}
			break;

			case 'select-one':
			case 'select-multiple':

				for(var k=0; k<el.options.length; k++) {
					if(el.options[k].selected != el.options[k].defaultSelected) {
						return true;
					}
				}
				break;

			default:
				return false;
		}
	}
};