

function class_form(name)
{
	this.tabs = new Array();
	this.fieldDepends = new Array();
	this.name = name;
	this.form = document.forms[name];
	this.addVerify = null;
	this.buttonRequiresVerify = false;
	this.doVerifyOnSubmit = false;
	var self = this;

	this._buildHandler = function(func, value) {
		return function() { func(value); };
	}

	this._showTab = function(idx) {
		if(self.tabs[idx].disabled)
			return;
		for(var i = 0; i < self.tabs.length; i++)
		{
			Element.hide(self.tabs[i].node);
			if(self.tabs[i].disabled)
				self.tabs[i].label.className = 'disabled';
			else
				self.tabs[i].label.className = 'inactive';
		}
		Element.show(self.tabs[idx].node);
		self.tabs[idx].label.className = 'active';
	}

	this._initTabs = function() {
		var c = 0;
		for(var i = 0; i < this.form.childNodes.length; i++)
		{
			var child = this.form.childNodes[i];
			if(child.nodeType == 1 && child.id.match(/^tab_(.*)$/))
			{
				var tabName = RegExp.$1;
				var label = $('tabLabel_' + this.name + '_' + tabName);
				this.tabs.push({
					name			: RegExp.$1,
					node			: child,
					label			: label,
					dependsOn		: '',
					disabled		: false
				});
				Element.hide(child);
				Event.observe(label, 'click',
				  this._buildHandler(self._showTab, c), false);
				c++;
			}
		}
		if(this.tabs.length > 0)
		{
			Element.show(this.tabs[0].node);
			this.tabs[0].label.className = 'active';
		}
	}

	this._getTabIdx = function(name) {
		for(var i = 0; i < this.tabs.length; i++)
		{
			if(this.tabs[i].name == name)
				return i;
		}
		return -1;
	}

	this.setTabDependency = function(tabName, fieldName, values) {
		var idx = this._getTabIdx(tabName);
		if(idx == -1)
		{
			alert("setTabDependency() tab not found: " + tabName);
			return;
		}
		var realName = this.name + '[' + fieldName + ']';
		this.tabs[idx].dependsOn = realName;
		this.tabs[idx].dependsValues = values;
		Event.observe(this.form.elements[realName], 'change',
		  function() { self._checkTabDepends(idx); }, false);
		this._checkTabDepends(idx);
	}

	this._enableTab = function(idx) {
		self.tabs[idx].label.className = 'inactive';
		self.tabs[idx].disabled = false;
	}

	this._disableTab = function(idx) {
		self.tabs[idx].label.className = 'disabled';
		self.tabs[idx].disabled = true;
	}

	this._checkTabDepends = function(idx) {
		var value = self.form.elements[self.tabs[idx].dependsOn].value;
		for(var i = 0; i < self.tabs[idx].dependsValues.length; i++)
		{
			if(self.tabs[idx].dependsValues[i] == value)
			{
				if(self.tabs[idx].disabled)
					self._enableTab(idx);
				return
			}
		}
		self._disableTab(idx);
	};

	this.realName = function(name) {
		return self.name + '[' + name + ']';
	}

	this.setFieldDependency = function(fieldName, depFieldName, values) {
		var field = this.form.elements[this.realName(fieldName)];
		if(! field)
		{
			alert('setFieldDependency() unknown field: ' + fieldName);
			return;
		}
		var depField = this.form.elements[this.realName(depFieldName)];
		if(! depField)
		{
			alert('setFieldDependency() unknown field: ' + depField);
			return;
		}
		this.fieldDepends[fieldName] = {
			field		: field,
			dependsOn	: depField,
			values		: values
		};
		Event.observe(depField, 'change', function() {
		  self._checkFieldDepends(fieldName) }, false);
		this._checkFieldDepends(fieldName);
	}

	this._checkFieldDepends = function(fieldName) {
		var values = self.fieldDepends[fieldName].values;
		for(var i = 0; i < values.length; i++)
		{
			if(self.fieldDepends[fieldName].dependsOn.value == values[i])
			{
				self.fieldDepends[fieldName].field.disabled = false;
				return;
			}
		}
		self.fieldDepends[fieldName].field.disabled = true;
	}

	this.verifyOnSubmit = function() {
		if(arguments.length > 0 && typeof(arguments[0]) == 'function')
			this.addVerify = arguments[0];
		this.doVerifyOnSubmit = true;
	}

	this.onSubmit = function() {
		if(! self.doVerifyOnSubmit || ! self.buttonRequiresVerify)
			return true;

		self.buttonRequiresVerify = false;
		if(self.addVerify != null)
			return self.addVerify(self);
		return true;
	}

	this._buttonOnClick = function() {
		self.buttonRequiresVerify = true;
	}

	/**
	 * Diese Funktion dient dazu, einen Submit-Button als 'Verified-Button'
	 * zu definieren. Das Druecken eines 'Verfied-Button' hat zur Folge,
	 * dass vor dem Submit des Formulars eine Validierung mittels
	 * Javascript stattfindet.
	 * @param[in] name (String); Name des Buttons.
	 */
	this.setVerifiedButton = function(name) {
		Event.observe(this.form.elements[this.realName(name)],
		  'click', function() { self._buttonOnClick(); }, false);
	}

	/**
	 * Liefert das dem Objekt zugehoerige Formular-Element.
	 * @return Objekt; Formular-Element;
	 */
	this.getForm = function() {
		return self.form;
	}

	this._initTabs();
}


// vim: ts=4:sw=4

