var fibuForms = new Hash();
var fibuWrongValues = new Hash();

function fibuAddInputListener(fieldId, value) {

	var formName = $(fieldId).form.name;
	var fibuValues = new Hash();

	if (!fibuForms.get(formName)) {
		fibuForms.set(formName,new Hash());
	}

	fibuValues.set(fieldId, value);
	fibuForms.get(formName).update(fibuValues);

	$(fieldId).onfocus = fibuResetField;
}

function fibuAddInputTextListener(fieldId, value) {
	fibuAddInputListener(fieldId, value);
}

function fibuAddCheckboxListener(fieldId, value) {
	fibuAddInputListener(fieldId, value);
	$(fieldId).onchange = fibuSetCheckboxValue;
}

function fibuCheckForm(formName, noEffects) {
	var formValues = fibuForms.get(formName);
	var formKeys = formValues.keys();

	// reset wrong values for this check
	fibuWrongValues = new Hash();

	for (var i = 0; i < document.forms[formName].elements.length; i++) {
		var currentElement = document.forms[formName].elements[i];

		// if the current form element is an element to check (in the array)
		if (formKeys.indexOf(currentElement.name) >= 0) {
			// numeric checking
			if (Number(formValues.get(currentElement.name)) || formValues.get(currentElement.name) == 0) {
				if (formValues.get(currentElement.name) == currentElement.value) {
					// value OK
					fibuWrongValues.unset(currentElement.name);
				} else {
					// value not OK
					fibuWrongValues.set(currentElement.name, 1);
				}
			// text checking
			} else { 
				if (formValues.get(currentElement.name).toLowerCase() == currentElement.value.toLowerCase()) {
					// value OK
					fibuWrongValues.unset(currentElement.name);
				} else {
					// value not OK
					fibuWrongValues.set(currentElement.name, 1);
				}

			}
		}
	}

	if (!noEffects) {
		if (fibuWrongValues.keys().length > 0) {
			$(formName + '_ok').hide();
			$(formName + '_failed').hide();
			Effect.Appear(formName + '_failed');
		} else {
			fibuResetFields(formName);
			$(formName + '_ok').hide();
			$(formName + '_failed').hide();
			Effect.Appear(formName + '_ok');
		}
	}
}

function fibuSetCheckboxValue(evt) {
	if (!evt) { evt = window.event; }
	var source = Event.element(evt);
	var id = source.getAttribute('id');

	if ($(id).checked) {
		$(id).value = "1";
	} else {
		$(id).value = "0";
	}
}

function fibuMarkWrongFields(formName) {
	fibuCheckForm(formName, true);
	for (var i = 0; i < fibuWrongValues.keys().length; i++) {
		new Effect.Morph(fibuWrongValues.keys()[i], {
			style: {
				backgroundColor: '#ffe2d9'
			},
			duration: 0.8
		});
	}
}

function fibuShowReason(formName) {
	Effect.Appear(formName + '_reason');
}
function fibuHideReason(formName) {
	Effect.Fade(formName + '_reason');
}

function fibuResetField(evt) {
	if (!evt) { evt = window.event; }
	var source = Event.element(evt);
	var id = source.getAttribute('id');

	if ($(id).type == 'select-one') {
		return false;
	}

	$(id).setStyle({backgroundColor: '#fff'});
}

function fibuResetFields(formName) {
	var formValues = fibuForms.get(formName);
	var formKeys = formValues.keys();

	for (var i = 0; i < document.forms[formName].elements.length; i++) {
		var currentElement = document.forms[formName].elements[i];

		// if the current form element is an element to check (in the array)
		if (formKeys.indexOf(currentElement.name) >= 0 && $(currentElement).type != 'select-one') {
			$(currentElement).setStyle({backgroundColor: '#fff'});
		}
	}
}

