/* formvalidator.js
 *  A JavaScript to check forms for consitency with a common interface
 *
 * Usage:
 *  addFormElement("name or id of the form", "internal name of element", "element description", minimum_length, maximum_length, /regexp_to_check/);
 *  Example: addFormElement("someform", "input", "Some Input", 1, 10, /^\d*$/); // the element "input" must have at least 1 char, but not more than 10. All chars must be digits
 *  var form_ok = validateForm(document.someform);
 *  Note that the regexp may be "" to avoid value checking.
 *
 * Limitations:
 *  You cannot use a form field with the name "name". This will cause trouble.
 *  Also currently only text, textarea, password, radio and checkbox fields will be validated.
 *
 * Copyright:
 *  by Thomas Wittek, mail at gedankenkonstrukt dot de
 *  Published under the GPL.
 */

if (!form_data) {
	var form_data = new Array;
}

function addFormElement(form, name, descr, min, max, match) {
	if (!form_data[form]) {
		form_data[form] = new Array;
	}
	form_data[form][name] = new Array;
	form_data[form][name]["description"] = descr;
	form_data[form][name]["minlength"]   = min;
	form_data[form][name]["maxlength"]   = max;
	form_data[form][name]["match"]       = match;
}

function validateForm(form) {
	var retval = true;
	var formname = form.getAttribute("name");
	if (!formname) {
		formname = form.getAttribute("id");
	}
	//debug
	/*
	alert("form name: " + formname);
	for(i=0; i<=form.elements.length-1; i++) {
		alert("form element (nama/type/value): " + form.elements[i].name + " - " + form.elements[i].type + " - " + form.elements[i].value);
			if ((form.elements[i].type == "checkbox")) {
				alert("checked?: " + form.elements[i].checked);
			}
	}
	*/
	for(i=0; i<=form.elements.length-1; i++) {
		if ((retval == true) && (form.elements[i].name != "") && form_data[formname][form.elements[i].name] && ((form.elements[i].type == "text") || (form.elements[i].type == "textarea") || (form.elements[i].type == "password") || (form.elements[i].type == "checkbox"))) {
			// Remove leading and trailing whitespaces and cut to maximum length
			if ((form.elements[i].type == "text") || (form.elements[i].type == "textarea") || (form.elements[i].type == "password")) {
				// Trim
				form.elements[i].value = form.elements[i].value.replace(/^\s*/,"");
				form.elements[i].value = form.elements[i].value.replace(/\s*$/,"");
				// Cut
				form.elements[i].value = form.elements[i].value.substr(0,form_data[formname][form.elements[i].name]["maxlength"]);
			}
			if ((form.elements[i].type == "radio") && (form.elements[i].checked == false)) {
				continue;
			}
			// Checkbox element must be checked, when "match" is "true" or "1"
			if (form.elements[i].type == "checkbox") {
				if (form_data[formname][form.elements[i].name]["match"] == "1" || form_data[formname][form.elements[i].name]["match"] == "true") {
					if (!form.elements[i].checked) {
						var msg = formvalidator_not_checked;
						msg = msg.replace(/\$name\$/, form_data[formname][form.elements[i].name]["description"]);
						alert(msg);
						form.elements[i].focus();
						retval = false;
						break;
					}
				}
				continue;
			}
			// Check for minimum length
			if (form.elements[i].value.length < form_data[formname][form.elements[i].name]["minlength"]) {
				// Too short
				var msg = formvalidator_too_short;
				msg = msg.replace(/\$name\$/, form_data[formname][form.elements[i].name]["description"]);
				alert(msg);
				form.elements[i].focus();
				retval = false;
				break;
			} else {
				if (form.elements[i].value.length != 0 && form_data[formname][form.elements[i].name]["match"] && !form.elements[i].value.match(form_data[formname][form.elements[i].name]["match"])) {
					// Doesn't match!
					var msg = formvalidator_invalid;
					msg = msg.replace(/\$name\$/, form_data[formname][form.elements[i].name]["description"]);
					alert(msg);
					form.elements[i].focus();
					retval = false;
					break;
				}
			}
		}
	}
	return retval;
}//validateForm()
