/**
 * Activate/Deactivate submit buttons in forms
 *
 * Required form fields are identified by Web Forms 2.0 convention of having required="required" attributes.
 * An array of required fields can also be passed to buttons.activator.setup() because select tags do not
 * validate with required="required" attributes.
 *
 * Requires events.js and majax.js (although it doesn't use ajax calls) 
 */

var buttons = {
	activator: {
		unanswered_fields: [],		// array of form fields names that remain unanswered

		activate: function(frm) {
			// Enable buttons if form fields are answered.
			this.unanswered_fields = [];
			if (! frm.required_fields) return;
			for (var i=0,l=frm.required_fields.length; i<l; i++) {
				var e = frm.required_fields[i];
				if (! this.is_answered(e)) {
					this.unanswered_fields.push(e);
				}
			}
			if (this.unanswered_fields.length > 0) {
				this.deactivate_buttons(frm);
			}
			else {
				this.activate_buttons(frm);
			}
		},
		setup: function(frm,required_fields) {
			frm.alter_buttons = [];
			frm.required_fields = [];
			var required_lookup = {};
			if (required_fields) {
				for (var idx in required_fields) { required_lookup[required_fields[idx]] = 1; }
			}

			// Find fields on form that are required.
			// Search for fields with "required" attribute
			var fld, arr = majax.formFields(frm);
			for (var i=0,l=arr.length; i<l; i++) {
				fld = arr[i];
				if (fld.type == 'submit' || fld.type == 'image') {
					frm.alter_buttons[frm.alter_buttons.length] = fld;
				}
				if (fld.required || required_lookup[fld.name]) {
					frm.required_fields[frm.required_fields.length] = fld;
					this.setup_event_handler(fld);
				}
			}
			buttons.activator.activate(frm);
		},
		setup_event_handler: function(fld) {
			if (!fld.type) {	// happens with radio button collections
				for (var i=0,l=fld.length; i<l; i++) {
					if (fld[i] && fld[i].type) this.setup_event_handler(fld[i]);	// recursive call
				}
			}
			else if (fld.type == 'checkbox' || fld.type == 'radio') {
				addEvent(fld,'click',function(){buttons.activator.activate(fld.form)});
			}
			else {
				addEvent(fld,'change',function(){buttons.activator.activate(fld.form)});
			}
		},
		activate_buttons: function(frm) {
			if (! frm.alter_buttons) return;
			for (var i=0,l=frm.alter_buttons.length; i<l; i++) {
				var e = $(frm.alter_buttons[i]);
				if (e) e.disabled = false;
			}
		},
		deactivate_buttons: function(frm) {
			if (! frm.alter_buttons) return;
			for (var i=0,l=frm.alter_buttons.length; i<l; i++) {
				var e = $(frm.alter_buttons[i]);
				if (e) e.disabled = true;
			}
		},
		is_answered: function(fld) {
			if (!fld.type) {	// happens with radio button collections
				for (var i=0,l=fld.length; i<l; i++) {
					if (fld[i] && fld[i].type && this.is_answered(fld[i])) return true;	// recursive call
				}
				return false;
			}
			else if (fld.type == 'checkbox' || fld.type == 'radio') {
				return fld.checked ? true : false;
			}
			else {
				return fld.value && fld.value.length > 0;
			}
		}
	}
}
