/* TODO: this script is deprecated. It is recommended that we use the more efficient interactive.form2.js (However that script requires jQuery) */
var GAInteractiveForm = Class.create();
GAInteractiveForm.forms = {};

GAInteractiveForm.initializations = new Array();
GAInteractiveForm.registerInit = function(func) {
	GAInteractiveForm.initializations.push(func);
};

GAInteractiveForm.create = function(form) {
	Event.observe(window, 'load', 
				function(e) {
					if (!$(form)) {
						var i = 0;
						$A(document.getElementsByClassName(form)).each(
							function (formel) {
								GAInteractiveForm.forms[form + '_' + i] = new GAInteractiveForm(formel);
								i++;
							}
						);
					} else {
						GAInteractiveForm.forms[form] = new GAInteractiveForm(form);
					}
					GAInteractiveForm.initializations.each( function(func){func();} );
				});
};


GAInteractiveForm.prototype = {
	
	initialize: function (form) {
		var major_form_sets = $A(document.getElementsByClassName('form', form));
		var form_elements = Form.getElements(form);
		var formsets = new Array();
		var f = $(form);
		var formfields = new Array();
		var dis = this;
		
		this.form_sets = new Array();
		this.form = f;
		this.submitButtons = [];
		
		Event.observe(f, 'submit', this.onsubmit.bindAsEventListener(this));
		
		form_elements.each(
			function(node) {
				Element.addClassName(node, 'ga_interactive_form_field');
				if (node.type == 'submit' || node.type == 'image') {
					dis.submitButtons.push(node);
				}
			}
		);		
		
		// Get all the form sets and add the class "form_set" to these
		// Add them to the minor_form_sets array
		major_form_sets.each(
			function(node) {
				$A(node.childNodes).each (
					function(el) {
						if (el.nodeName != '#text') {
							formsets.push(new GAInteractiveForm.FormSet(el,dis).setFields(document.getElementsByClassName('ga_interactive_form_field', el)));
						}
					}
				)
			}
		);
		
		this.form_sets = formsets;
		
		Event.observe(window, 'unload', this.unload.bindAsEventListener(this));
		
		
	},
	
	onsubmit: function() {
		// Disable submit buttons while submitting form
		var dis = this;
		var i = 0;
		var old_name,old_value,old_id,hid;
		
		
		this.submitButtons.each(function(submt) {
				// Create a hidden element first to store submit button values
				if (submt.field_wrap.activated) {
					old_name = submt.name;
					old_value = submt.value;
					if (submt.id) {
						old_id = submt.id;
					} else {
						i++;
						old_id = i + '_generated';
						old_id = old_name + old_id;
					}
					
					hid = document.createElement('input');
					if (hid) {	
						hid.type = 'hidden';
						hid.value = old_value;
						hid.name = old_name;
						submt.parentNode.appendChild(hid);
						submt.id = old_id + '_disabled';
						submt.name = old_name + '_disabled';
					}
				}
				submt.disabled = true;
		});
		dis = null;
		
		// Run validation codes
		return this.validation();
	},
	
	validation : function () { return true;},
	
	getRadioValue: function(name) {
		var radioval = 0;
		$A(this.form[name]).each(
			function(radio) {
				if (radio.checked) {
					radioval = radio.value;
				}
			}
		);
		return radioval;
	},
		
	
	focusOnFormSet: function(event) {
		var field = Event.element(event);
		if (field.field_wrap) {
			Object.values(GAInteractiveForm.forms).each(
				function(form) {
					if(form.form_sets) {
						form.form_sets.each(
							function(form_set) {
								if (form_set != field.field_wrap.form_set) {
									form_set.formSetUnFocus();
								} else {
									form_set.formSetFocus();
								}
							}
						);
					}
				}
			);
		}
	},
	
	unload: function() {
		// Clear all references
		this.form = null;
		this.form_sets = null;
	}

};

GAInteractiveForm.FormSet = Class.create();
GAInteractiveForm.FormSet.prototype = {
	initialize: function(form_set, form) {
		this.element = form_set;
		this.element.form_set = this;
		this.fields = new Array();
		this.ga_form = form;
		this.is_can_be_focused = Element.hasClassName(form_set, 'actions') ? false : true;
		
		Element.addClassName(form_set, 'form_set');
		
		if (this.is_can_be_focused) {
			Event.observe(this.element, 'click', this.ga_form.focusOnFormSet.bindAsEventListener(this.ga_form));
		}
		Event.observe(window, 'unload', this.unload.bindAsEventListener(this));
		
		
	},
	
	setFields: function(fields) {
		var formfields = new Array();
		var dis = this;
		$A(fields).each(
			function(el) {
				formfields.push(new GAInteractiveForm.Field(el, dis));
				if (dis.is_can_be_focused) {
					Event.observe(el, 'change', dis.ga_form.focusOnFormSet.bindAsEventListener(dis.ga_form));
					Event.observe(el, 'focus', dis.ga_form.focusOnFormSet.bindAsEventListener(dis.ga_form));
				}
			}
		);
		this.fields = formfields;
		return this;
	},
	
	disableFields: function() {
		this.fields.each(
			function(field) {
				field.element.blur();
				field.element.disabled = true;
			}
		);
		Element.addClassName(this.element, 'disabled');
		
	},
	
	enableFields: function() {
		this.fields.each(
			function(field) {
				field.element.disabled = false;
			}
		);
		Element.removeClassName(this.element, 'disabled');
	},
	
	showSet: function() {
		this.element.style.display = '';
	},
	
	hideSet: function() {
		this.element.style.display = 'none';
	},
	
	formSetFocus: function() {
		if ( !Element.hasClassName(this.element, 'focused') ) {
			Element.addClassName(this.element, 'focused');
		}
	},
	
	formSetUnFocus: function() {
		if ( Element.hasClassName(this.element, 'focused') ) {
			Element.removeClassName(this.element, 'focused');
		}
	},
	
	unload: function() {
		this.element.form_set = null;
		this.element = null;
	}
};

GAInteractiveForm.Field = Class.create();
GAInteractiveForm.Field.prototype = {
	initialize: function(field_el, form_set) {
		this.form_set = form_set;
		this.element = field_el;
		this.element.field_wrap = this; //Back reference
		
		if (this.element.type == 'submit' || this.element.type == 'image') {
			Event.observe(this.element, 'keypress', this.activator.bindAsEventListener(this));
			Event.observe(this.element, 'click', this.activator.bindAsEventListener(this));
		}
		Event.observe(window, 'unload', this.unload.bindAsEventListener(this));
	},
	
	formSetFocus: function() {
		this.form_set.formSetFocus();
	},
	
	formSetUnFocus: function() {
		this.form_set.formSetUnFocus();
	},
	
	unload: function() {
		this.form_set = null;
		this.element.field_wrap = null;
		this.element = null;
		
	},
	
	activated: false,
	
	activator: function(e) {
		if (e.keyCode == Event.KEY_RETURN || e.type == 'click' ) this.activate();
	},
	
	activate: function() {
		var submits = this.form_set.ga_form.submitButtons;
		
		// Deactivate everything first
		for(sbmit in submits) {
			if (sbmit.deactivate) sbmit.deactivate();
		}
		
		// Then activate just this one
		this.activated = true;
	},
	
	deactivate: function() {
		this.activated = false;
	}
};



GAInteractiveForm.create('interactive_form');

