///////////////////////////////////////////////////////////////////
// Form Validator
// (c) Carsten Gehling
//
// Usage:
// Call formValidate with reference to form as parameter
// e.g. <form on submit="return formValidate(this);">
//
// formValidate returns true, if all form elements are correct.
// If not an errormessage is displayed and false is returned.
//
// All form fields that needs validation should include the
// following two attributes:
//
// validator="<pattern>" errormsg="Some tekst"
//
// validator must be a regular expression in the form:
// "/regexp/options"       -> defines a regular expression to use on the field
// "=name/regexp/options"  -> defines a named regular expression
// "name"                  -> reuses a named regular expression, either defined as above
//                            or one of the following predefined:
//
// valNotEmpty   -> field must be filled with any characters
// valDigits     -> field must be filled but only with numeric characters
// valTime       -> field must be filled with a valid time (HHMM)
//
//
// errormsg must contain the error message displayed for the field
//
///////////////////////////////////////////////////////////////////


// A pattern to match patterns "/xyz/gi"
var patternDef = /^\/(.*)\/([^/]*)/;

// A pattern to match pattern defs "=patName/xyz/gi"
var patternNameDef = /^=(\w+)\/(.*)\/([^/]*)/;

// Fill dictionary with common validators
patternDict("valNotEmpty", "/./");
patternDict("valDigits", "/^\\d+$/");
patternDict("valTime", "/^(([0-1]\\d)|(2[0-3]))[0-5]\\d$/");

function formValidate(theForm) {
	var elemList = theForm.elements;
	
	var errStr = "";
	
	for (var  i=0; i<elemList.length; i++)
		with (elemList[i]) {
			var v = elemList[i].validator;
			if (!v)
				continue;
			var elemPat = patternDict(v);
			if (!elemPat)
				continue;
			if (!elemPat.exec(value))
				errStr += " - " + errormsg + "\n";
		}
		
	if (errStr.length > 0) {
		errStr = "Følgende indtastningsfelter er ikke udfyldt korrekt:\n\n" + errStr;
		alert(errStr);
		return false;
	}
	
	return true;
}


function patternDict(name, pat) {
	// if both name and pat is filled, create, store and return the pattern
	if (pat) {
		var p = patternDef.exec(pat);
		if (!p)
			return null;
		return patternDict[name] = new RegExp(p[1], p[2]);
	}
	
	// if the pattern name exists in dictionary, return the pattern
	var p = patternDict[name];
	if (p)
		return p;

	// if only pattern is submitted in name, create, store (with pattern as the name) and return the pattern		
	p = patternDef.exec(name)
	if (p)
		return patternDict[name] = new RegExp(p[1], p[2]);

	// if name and pattern is submitted in name, create, store (with name) and return pattern
	p = patternNameDef.exec(name)
	if (p)
		return patternDict[p[1]] = new RegExp(p[2], p[3]);

	// Invalid parameters, return null
	return null;
}

