
var debugValidator = false;
var mandatoryfields = Array();
var optionalfields = Array();



/* wether a 0000-00-00 date is accepted as valid */
var din5008_0_isvalid = true;

function validateFieldsAndSubmit() {
	ok = validateList(mandatoryfields);
	
	for (i = 0; ok && i < optionalfields.length; i++) {
		curinfo = optionalfields[i];

		f = document.getElementsByName(curinfo[0]);
		if (debugValidator && (!f || f && f.length < 1))
			alert("[validator debug] field not found: " + curinfo[0]);

		if (f && f.length > 0) {
			element = f[0];
			ok = curinfo[1](element);
		}
	}

	if (debugValidator && ok) {
		alert("[validator debug] would submit form now");
		return false;
	}
	return ok;
}

function validateList(arr) {
	ok = true;
	for (i = 0; ok && i < arr.length; i++) {
		curinfo = arr[i];

		f = document.getElementsByName(curinfo[0]);
		if (debugValidator && (!f || f && f.length < 1))
			alert("[validator debug] field not found: " + curinfo[0]);

		if (f && f.length > 0) {
			element = f[0];
			ok = validate_Field(f[0], curinfo);
		}
	}
	return ok;
}

function validate_Field(field,info) {
/* 
 * Format of the "info" parameter:
 * 
 * Array("project[projectname]", "string", "Please enter a project name.")
 */

	fieldname = info[0];
	fieldtype = info[1];
	errormsg = info[2];

	checked = true;
	switch (fieldtype) {
		case "string":
			checked = field.value.length > 0;
			break;

		case "select":
			checked = field.selectedIndex > 0;
			break;

		case "email":
			themail = valueOfField(field);
			checked = checkMail(themail);
			break;

		case "din5008":
			thedate = valueOfField(field);
			checked = check_din5008(thedate);
			if (!checked) {
				addmsg = "The date '"+thedate+"' is invalid. ";
				if (thedate.length < 1)
					addmsg = "An empty date is invalid. ";
				alert(addmsg + errormsg);
				field.focus();
				return false;
			}

			break;
		default:
			alert("Unhandled field type: " + fieldtype);
			return false;
			break;
	}

	if (!checked) {
		alert(errormsg);
		field.focus();
		return false;
	}

	return true;
}


/* ************************************************* */

function validateFindField(fieldname) {
	f = document.getElementsByName(fieldname)
	if (debugValidator && (!f || f && f.length < 1)) {
		alert("[validator debug] no value: field not found: " + fieldname);
		return false;
	}
	return f[0];
}

function findvalueOfField(fieldname) {
	f = validateFindField(fieldname);
	if (!f) return false;
	return valueOfField(f)
}

function valueOfField(element) {
	value = false;

	switch(element.tagName) {
		case "INPUT":
			return element.value;
		case "SELECT":
			return element.options[element.selectedIndex].value;
		default:
			alert("valueOfField: unhandled element tag type: " + element.tagName);
			return false;
	}
	return value;
}

/* ************************************************* */




function validateEmail(email) {
	at = email.indexOf("@")
	if (at <= 0 || email.substring(at).indexOf(".") < 2)
		return false;
	return true;
}

/*
 * YYYY-MM-DD datums format
 */
function check_din5008(date) {
	l = date.length;

	/* XXX not leap year safe yet */
	dayspermonth = Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

	if (l != 10) return false;
	year = date.substring(0,4);
	month = date.substring(5,7);
	day = date.substring(8,10);

	if (din5008_0_isvalid && year == 0 && month == 0 && day == 0) {
		return true;
	}

	if (month < 1 || month > 12) {
		return false;
	}

	if (day < 1 || day > dayspermonth[month-1]) {
		return false;
	}

	return true;
}

function checkMail(email) {
    at = email.indexOf("@");
    if (at <= 0 || email.substring(at).indexOf(".") < 3) {
		return false;
    }
    return true;
}

