//
// Helper functions
//

function trim(pValue) {
	return pValue.replace(/^\s+/,'').replace(/\s+$/,'');
}

function replaceString(inputVal,oldChar,newChar)
{
	var oneChar = '';
	var outputStr = '';
	for (var i = 0; i < inputVal.length; i++) 
	{
		oneChar = inputVal.charAt(i);
		outputStr = outputStr + ((oneChar != oldChar) ? oneChar : newChar);
	}
	return outputStr;
}

//
// Validate functions
//

function noValidation(inputVal)
{
	return true;
}

function isEmpty(inputVal) 
{
  return ((inputVal == null) || (inputVal == ""));
}

function isNotEmpty(inputVal) 
{
	return ((inputVal != null) && (trim(inputVal) != ""));
}

function isPosInteger(inputVal) 
{
	if (isEmpty(inputVal)) return false;

	inputStr = inputVal.toString()
  	for (var i = 0; i < inputStr.length; i++) 
  	{
    	var oneChar = inputStr.charAt(i)
    	if (oneChar < "0" || oneChar > "9") return false;
    }
	return true;
}

function isInteger(inputVal) 
{
	if (isEmpty(inputVal)) return false;

	inputStr = inputVal.toString();
	for (var i = 0; i < inputStr.length; i++) 
	{
		var oneChar = inputStr.charAt(i)
		if (i == 0 && oneChar == "-") continue;
	    if (oneChar < "0" || oneChar > "9") return false;
	}
	return true;
}

function isFloat(inputVal) 
{
	oneDecimal = false;

	if (isEmpty(inputVal)) return false;

	inputStr = inputVal.toString();
	for (var i = 0; i < inputStr.length; i++) 
	{
		var oneChar = inputStr.charAt(i);
		if (i == 0 && oneChar == "-") continue;
    	if (oneChar == "." && !oneDecimal) 
    	{
			oneDecimal = true;
			continue;
		}
		if (oneChar < "0" || oneChar > "9") return false;
	}
	return true;
}

function isMoney(inputVal) 
{
	if (isEmpty(inputVal)) return false;
	if (!isFloat(inputVal)) return false;

	var delim = inputVal.indexOf(".");
	var rest = inputVal.substring((delim + 1), inputVal.length);

	return !(rest.length > 2);
}

function isDate(inputVal) 
{
	if (isEmpty(inputVal)) return false;

	var dag    = inputVal.substring(0,2)
	var maand  = inputVal.substring(3,5)
	var jaar   = inputVal.substring(6,10)

	if (!isPosInteger(jaar)) return false;
	if (!isPosInteger(maand)) return false;
	if (!isPosInteger(dag)) return false;
	
	jaar = parseInt(jaar);
	if (jaar < 1900 || jaar > 2050) return false;
	
	maand = parseInt(maand);
	if (maand > 12) return false;
	
	dag = parseInt(dag);
	if (maand == 4 || maand == 6 || maand == 9 || maand == 11)
	{
    	if (dag > 30) return false;
	}
  	else if (maand == 02)
  	{
    	var febDagen = ((((jaar % 4) == 0) && ((jaar % 400) == 0)) ? 29 : 28);
	    if (dag > febDagen) return false;
	}
  	else if (dag > 31) return false;

	return true
}
  
function isTime(inputVal) 
{
	if (inputVal.length != 5) return false;

	var delim = inputVal.indexOf(":")
	if (delim != 2) return false;

	var hour = inputVal.substring(0, delim);
	var min  = inputVal.substring((delim + 1), inputVal.length);

  	if (!isPosInteger(hour)) return false;
	if (!isPosInteger(min)) return false;
	if ((parseInt(hour,10) < 0) || (parseInt(hour,10) > 23)) return false;
	if ((parseInt(min,10) < 0) || (parseInt(min,10) > 59)) return false;

	return true;
}

function isMailAddress(inputVal)
{
	if (isEmpty(inputVal)) return false;
	if (inputVal.indexOf("@") == -1) return false;
	if (inputVal.indexOf(".") == -1) return false;
	return true;
}

function isWWWAddress(inputVal) 
{
	return (!(isEmpty(inputVal)));
}

function isCreditCardNumber(inputVal) 
{
	return (!(isEmpty(inputVal)));
}

function isPassword(inputVal) 
{
	return (!(isEmpty(inputVal)));
}

function isPostcode(inputVal)
{
	var oneChar;
	
	if (isEmpty(inputVal)) return false;
	if ((inputVal.length != 7) && (inputVal.length != 6)) return false;

	// Alle spaties en ( en ) verwijderen
	tmpStr = replaceString(inputVal, ' ', '');
	if (tmpStr.length != 6) return false;

	for (var i=0; i < 4; i++)
	{
    	oneChar = tmpStr.charAt(i);
		if ((oneChar < "0") || (oneChar > "9")) return false;
	}
	for (var i=4; i < 6; i++)
  	{
    	oneChar = tmpStr.charAt(i);
		if (((oneChar < "A") || (oneChar > "Z")) && ((oneChar < "a") || (oneChar > "z"))) return false
	}

	return true;
}

function isTel(inputVal)
{
	// Alle spaties en ( en ) verwijderen
	tmpStr = replaceString(inputVal, ' ', '');
	tmpStr = replaceString(tmpStr, '-', '');
	tmpStr = replaceString(tmpStr, '(', '');
	tmpStr = replaceString(tmpStr, ')', '');

	// Rest moet een positief getal zijn
	return (isPosInteger(tmpStr));
}

function isRekNummer(inputVal)
{
	// Alle spaties verwijderen 
  	tmpStr = replaceString(inputVal, ' ', '');
  	tmpStr = replaceString(inputVal, '.', '');

	// Rest moet een positief getal zijn
  	return (isBankGiro(tmpStr));
}
 
function isGiro(inputVal) 
{
	if (isEmpty(inputVal)) return false;

	inputStr = inputVal.toString();
	if (inputStr.length > 7) return false;
	if ( inputStr.length < 3 ) return false;

	var oneChar = inputStr.charAt(0);
	for (var i = 1; i < inputStr.length; i++)
	{
    	var oneChar = inputStr.charAt(i);
		if (oneChar < "0" || oneChar > "9") return false;
	}
	
  	return true;
}
 
function isBank(inputVal) 
{
	if (isEmpty(inputVal)) return false;

	inputStr = inputVal.toString();
	if (inputStr.length != 9) return false;

	var SumReknr = 0;
	// Banknummer dus ook elfproef
	for (var i = 0; i < inputStr.length; i++)
	{
    	var oneChar = inputStr.charAt(i);
    	if (oneChar < "0" || oneChar > "9")
		{
			return false;
	  	}
    	else
    	{
      		SumReknr = SumReknr + oneChar * (9 - i);
		}
	}
  	return (SumReknr % 11 == 0);
}
 
function isBankGiro(inputVal) 
{
	if (isEmpty(inputVal)) return false;
	return (isBank(inputVal) == true);
}

function isLeeftijd(inputVal)
{
	// Alle spaties verwijderen
	tmpStr = replaceString(inputVal, ' ', '');
	if (isEmpty(inputVal)) return false;

	// Rest moet een positief getal zijn
    return (isPosInteger(tmpStr));
}

//
// Initialize dispatcher
//

function dispatcher(validationFunction) 
{
	this.doValidate = validationFunction;
}

var dispatchLookup = new Array();
dispatchLookup["noValidation"]       = new dispatcher(noValidation);
dispatchLookup["isEmpty"]            = new dispatcher(isEmpty);
dispatchLookup["isNotEmpty"]         = new dispatcher(isNotEmpty);
dispatchLookup["isPosInteger"]       = new dispatcher(isPosInteger);
dispatchLookup["isInteger"]          = new dispatcher(isInteger);
dispatchLookup["isFloat"]            = new dispatcher(isFloat);
dispatchLookup["isMoney"]            = new dispatcher(isMoney);
dispatchLookup["isDate"]             = new dispatcher(isDate);
dispatchLookup["isTime"]             = new dispatcher(isTime);
dispatchLookup["isMailAddress"]      = new dispatcher(isMailAddress);
dispatchLookup["isWWWAddress"]       = new dispatcher(isWWWAddress);
dispatchLookup["isCreditCardNumber"] = new dispatcher(isCreditCardNumber);
dispatchLookup["isPassword"]         = new dispatcher(isPassword);
dispatchLookup["isPostcode"]         = new dispatcher(isPostcode);
dispatchLookup["isTel"]              = new dispatcher(isTel);
dispatchLookup["isRekNummer"]        = new dispatcher(isRekNummer);
dispatchLookup["isLeeftijd"]         = new dispatcher(isLeeftijd);

//
// Access functions
//

function fieldValidate(pField, pValueFields, pValueFunctions, pValueMessages) 
{
	var fieldName = pField.name;
	for (var i = 0 ; i < pValueFields.length ; i++) 
	{
    	if (pValueFields[i] == fieldName)
    	{
    		var valueFunction = pValueFunctions[i];
			if (valueFunction && !dispatchLookup[valueFunction].doValidate(pField.value))
			{
				window.alert(pValueMessages[i]);
				pField.select();
				pField.focus();		
				return false;						
			}    		
    		break;
    	}
    }
    return true;
}
 
function checkForm(pForm, pValueFields, pValueFunctions, pValueMessages) 
{
	for (var i = 0; i < pForm.elements.length; i++) 
	{
		var type = pForm.elements[i].type; 
    	if ((type == "text") || (type == "password") || (type == "textarea")) 
    	{
			if (!fieldValidate(pForm.elements[i], pValueFields, pValueFunctions, pValueMessages)) return false;
      	}
    }
	return true;
}

function submitForm(pForm, pValueFields, pValueFunctions, pValueMessages)
{
	if (checkForm(document.forms[pForm], pValueFields, pValueFunctions, pValueMessages)) document.forms[pForm].submit();
}

function resetForm(pForm)
{
	document.forms[pForm].reset();
}
