/******************************************************************************************************************************/
// Class FormObject 
/******************************************************************************************************************************/

function FormObject(oForm){
	//properties
	this.oForm = oForm;
	this.name = oForm.name;
	//in het geval van een checkbox of een radio button kan één field uit meerdere form elements bestaan.
	this.aFields = new Array();
	this.aValidationErrors = new Array();
	//methods
	this.initFormFields = initFormFields;
	this.addField = addField;
	this.getName = getName;
	this.resetFields = resetFields;
	this.validateFields = validateFields;
	this.submit = submit;
	this.getField = getField;
	this.getFieldValue = getFieldValue;
	this.getHiddenField = getHiddenField;
	this.getHiddenFieldValue = getHiddenFieldValue;
	this.getValidationErrors = getValidationErrors;
	this.getFieldsAsQueryString = getFieldsAsQueryString;
	this.getHiddenFieldsAsQueryString = getHiddenFieldsAsQueryString;
	this.search = search;
	this.getDefaultErrorMessage = getDefaultErrorMessage;
	this.displayErrors = displayErrors;
	this.displayFirstError = displayFirstError;

	this.initFormFields();
	return true;
}

function initFormFields(){
	for(var i=0; i<this.oForm.elements.length; i++){
		this.addField(this.oForm.elements[i]);
	}
	return true;
}

function addField(oElement){
	var oField = null;
	switch (oElement.type)
	{
		case "text":
		case "textarea":
		case "password":
			oField = new Field(oElement);
			this.aFields[this.aFields.length] = oField;
			oField.setValue(oElement.value);
			break;
		case "radio":
			//check of er al een veld met de zelfde naam en type bestaat
			oField = this.getField(oElement.name);
			if(oField!=null && (oField.getType()=="radio")){
				if(oElement.checked){
					oField.setValue(oElement.value);
				}
			}
			else{
				oField = new Field(oElement);
				this.aFields[this.aFields.length] = oField;
				if(oElement.checked){
					oField.setValue(oElement.value);
				}
			}
			break;
		case "checkbox":
			//check of er al een veld met de zelfde naam en type bestaat
			oField = this.getField(oElement.name);
			if(oField!=null && oField.getType()=="checkbox"){
				if(oElement.checked){
					oField.setValue(oElement.value);
				}
			}
			else{
				oField = new Field(oElement);
				this.aFields[this.aFields.length] = oField;
				if(oElement.checked){
					oField.setValue(oElement.value);
				}
			}
			break;
		case "select-one":
		case "select-multiple":
			oField = new Field(oElement);
			this.aFields[this.aFields.length] = oField;
			for(var i=0; i<oElement.options.length; i++){
				if(oElement.options[i].selected){
					oField.setValue(oElement.options[i].value);
				}
			}
			break;
		case "hidden":
		case "button":
		case "submit":
		case "reset":
		case "image":
			break;
		default:
			window.alert("ERROR: invalid type: "+oElement.type+"!");
			return null;
			break;
	}
	return true;
}

function getName(){
	return this.name;
}

function resetFields(){
	for(var i=0; i<this.aFields.length; i++){
		this.aFields[i].resetValue();
	}
	return true;
}

function validateFields(){
	var bValidForm = true;
	var oFocusOnMe = null;

	for(var i=0; i<this.aFields.length; i++){
		if(this.aFields[i].validate()==false){
			bValidForm = false;
			if(oFocusOnMe==null){
				oFocusOnMe = this.aFields[i];
			}
		}
	}
	//create validation error list
	for(var i=0; i<this.aFields.length; i++){
		var aFieldValidationErrors=this.aFields[i].getFieldValidationErrors();
		var iLengte = this.aValidationErrors.length;
		for(var j=0; j<aFieldValidationErrors.length; j++){
			this.aValidationErrors[iLengte] = new Array(2);
			this.aValidationErrors[iLengte][0]=this.aFields[i];
			this.aValidationErrors[iLengte][1]=aFieldValidationErrors[j];
		}
	}
	if(oFocusOnMe!=null){
		oFocusOnMe.focus();
	}
	return bValidForm;
}

function submit(){
	this.oForm.submit();
	return true;
}

function getField(sName){
	var oField = null;
	for(var i=0; i<this.aFields.length; i++){
		if(this.aFields[i].getName()==sName){
			oField = this.aFields[i];
		}
	}
	return oField;
}

function getFieldValue(sName){
	var oField = null;
	var sFieldValue = "";

	for(var i=0; i<this.aFields.length; i++){
		if(this.aFields[i].getName()==sName){
			oField = this.aFields[i];
		}
	}
	if(oField != null){
		sFieldValue = oField.getValue();
	}
	return sFieldValue;
}

function getHiddenField(sName){
	var oField;

	for(var i=0; i<this.oForm.elements.length; i++){
		if((this.oForm.elements[i].type=="hidden") && (this.oForm.elements[i].name==sName)){
			oField = this.oForm.elements[i];
		}
	}
	return oField;
}

function getHiddenFieldValue(sName){
	var oField;
	var sFieldValue = "";

	for(var i=0; i<this.oForm.elements.length; i++){
		if((this.oForm.elements[i].type=="hidden") && (this.oForm.elements[i].name==sName)){
			oField = this.oForm.elements[i];
		}
	}
	if(oField != null){
		sFieldValue = oField.value;
	}
	return sFieldValue;
}

function getValidationErrors(){
	return this.aValidationErrors;
}

function getFieldsAsQueryString(){
	var sQueryString = "";

	var bFirst = true;
	for(var i=0; i<this.aFields.length; i++){
		if(bFirst){
			sQueryString = sQueryString + this.aFields[i].getName() + "=" + URLEncode(this.aFields[i].getValue());
			bFirst = false;
		}
		else{
			sQueryString = sQueryString + "&" + this.aFields[i].getName() + "=" + URLEncode(this.aFields[i].getValue());
		}
	}	
	return sQueryString;
}

function getHiddenFieldsAsQueryString(){
	var sQueryString = "";
	var bFirst = true;
	for(var i=0; i<this.oForm.elements.length; i++){
		if(this.oForm.elements[i].type=="hidden"){
			if(bFirst){
				sQueryString = sQueryString + this.oForm.elements[i].name + "=" + URLEncode(this.oForm.elements[i].value);
				bFirst = false;
			}
			else{
				sQueryString = sQueryString + "&" + this.oForm.elements[i].name + "=" + URLEncode(this.oForm.elements[i].value);
			}
		}
	}
	return sQueryString;
}

function search(sSearchString){
	var aFoundFields = null;
	for(var i=0; i<this.aFields.length; i++){
		if(this.aFields[i].getName().indexOf(sSearchString)>=0){
			if(aFoundFields==null){
				aFoundFields = new Array();
			}
			aFoundFields[aFoundFields.length] = this.aFields[i];
		}
	}
	return aFoundFields;
}

function getDefaultErrorMessage(sErrorType, oField){
	var sErrorMessage = "";
	switch(sErrorType){
		case "ERRMANDATORY":
			sErrorMessage = "Het veld "+oField.getName()+" is een verplicht veld.";
			break;
		case "ERRFORMAT":
			sErrorMessage = "Het veld "+oField.getName()+" heeft niet het juiste formaat.";
			break;
		case "ERRMAXLENGTH":
			sErrorMessage = "Het veld "+oField.getName()+" dient maximaal " + oField.getMaxLength() + " karakters te bevatten.";
			break;
		case "ERRMINLENGTH":
			sErrorMessage = "Het veld "+oField.getName()+" dient minimaal " + oField.getMinLength() + " karakters te bevatten.";
			break;
		case "ERRMINMAXLENGTH":
			sErrorMessage = "Het veld "+oField.getName()+" dient minimaal " + oField.getMinLength() + " en maximaal " + oField.getMaxLength() + " karakters te bevatten.";
			break;
		case "ERRFORBIDDEN":
			sErrorMessage = "Het veld "+oField.getName()+" bevat verboden woorden.";
			break;
		case "ERRMAXVALUE":
			sErrorMessage = "Het veld "+oField.getName()+" dient een waarde onder" + oField.getMaxIntegerValue() + " te bevatten.";
			break;
		case "ERRMINVALUE":
			sErrorMessage = "Het veld "+oField.getName()+" dient een waarde boven " + oField.getMinIntegerValue() + " te bevatten.";
			break;
		case "ERRMAXSELECTIONS":
			sErrorMessage = "Bij het veld "+oField.getName()+" mogen maximaal " + oField.getMaxSelections() + " onderdelen geselecteerd worden.";
			break;
		default:
			window.alert("ERROR getDefaultErrorMessage: geen geldig errortype: "+sErrorType);
			break;
	}
	return sErrorMessage;
}

function displayErrors(){
	var oField = null;
	var sErrorType = null;
	var sErrorMessage = "";

	if(this.aValidationErrors.length>0){
		for(var i=0; i<this.aValidationErrors.length; i++){
			oField = this.aValidationErrors[i][0];
			sErrorType = this.aValidationErrors[i][1];
			sErrorMessage = oField.getErrorMessage(sErrorType);
			if(sErrorMessage==null){
				sErrorMessage = this.getDefaultErrorMessage(sErrorType, oField);
			}
			window.alert(sErrorMessage);
		}
	}
	return true;
}

function displayFirstError(){
	var oField = null;
	var sErrorType = null;
	var sErrorMessage = "";

	if(this.aValidationErrors.length>0){
		oField = this.aValidationErrors[0][0];
		sErrorType = this.aValidationErrors[0][1];
		sErrorMessage = oField.getErrorMessage(sErrorType);
		if(sErrorMessage==null){
			sErrorMessage = this.getDefaultErrorMessage(sErrorType, oField);
		}
		window.alert(sErrorMessage);
	}
	return true;
}

/******************************************************************************************************************************/
// Class Field 
/******************************************************************************************************************************/

function Field(oElement){
	//properties
	this.aErrorMessages = new Array();
	this.aForbiddenStrings = null;
	this.aValidationErrors = new Array();
	this.aValues = null;
	this.bMandatory = null;
	this.iMaxIntegerValue = null;
	this.iMaxLength = null;
	this.iMaxSelections = null;
	this.iMinIntegerValue = null;
	this.iMinLength = null;
	this.oFirstElement = oElement;	
	this.rxValidFormat = null;
	this.sName = oElement.name;
	this.sType = oElement.type;
	//methods
	this.focus = focus;
	this.getErrorMessage = getErrorMessage;
	this.getFieldValidationErrors = getFieldValidationErrors;
	this.getMandatory = getMandatory;
	this.getMaxIntegerValue = getMaxIntegerValue;
	this.getMaxSelections = getMaxSelections;
	this.getMaxLength = getMaxLength;
	this.getMinIntegerValue = getMinIntegerValue;
	this.getMinLength = getMinLength;
	this.getName = getName;
	this.getType = getType;
	this.getValue = getValue;
	this.resetValue = resetValue;
	this.setValue = setValue;
	this.setMandatory = setMandatory;
	this.setMinLength = setMinLength;
	this.setMaxLength = setMaxLength;
	this.setValidFormat = setValidFormat;
	this.setForbiddenStrings = setForbiddenStrings;
	this.setMinIntegerValue = setMinIntegerValue;
	this.setMaxIntegerValue = setMaxIntegerValue;
	this.setMaxSelections = setMaxSelections;
	this.setErrorMessage = setErrorMessage;
	this.isEmpty = isEmpty;
	this.validate = validate;
	return true;
}

function getErrorMessage(sErrorType){
	var sErrorMessage = null;
	for(var i=0; i<this.aErrorMessages.length; i++)
	{
		if(this.aErrorMessages[i][0]==sErrorType){
			sErrorMessage = this.aErrorMessages[i][1];
		}
	}
	return sErrorMessage;
}

function getMandatory(){
	return this.bMandatory;
}

function getMaxIntegerValue(){
	return this.iMaxIntegerValue;
}

function getMaxLength(){
	return this.iMaxLength;
}

function getMaxSelections(){
	return this.iMaxSelections;
}

function getMinIntegerValue(){
	return this.iMinIntegerValue;
}

function getMinLength(){
	return this.iMinLength;
}

function getName(){
	return this.sName;
}

function getType(){
	return this.sType;
}

function getValue(){
	if(this.aValues==null || this.aValues.length==0){
		return "";
	}
	else if(this.aValues.length==1){
		return this.aValues[0];
	}
	else{
		var sResult="";
		for(var i=0; i<this.aValues.length; i++){
			if(i==(this.aValues.length-1)){
				sResult+=this.aValues[i];
			}
			else{
				sResult+=this.aValues[i]+" ";
			}
		}
		return sResult;
	}
}

function isEmpty(){
	var bEmpty = false;
	if(this.aValues==null || this.aValues.length==0){
		bEmpty = true;
	}
	return bEmpty;
}

function resetValue(){
	this.aValues = null;
	return true;
}

function setErrorMessage(sErrorType, sErrorMessage){
	var iLengte = this.aErrorMessages.length;
	this.aErrorMessages[iLengte] = new Array(2);
	this.aErrorMessages[iLengte][0] = sErrorType;
	this.aErrorMessages[iLengte][1] = sErrorMessage;
	return true;
}

function setForbiddenStrings(aForbiddenStrings){
	if(aForbiddenStrings==null || typeof(aForbiddenStrings)!="object"){
		window.alert("ERROR setForbiddenStrings: aForbiddenStrings bevat geen geldige waarde.");
	}
	else if(aForbiddenStrings.length==0){
		window.alert("ERROR setForbiddenStrings: aForbiddenStrings bevat geen geldige waarde.");
	}
	else{
		bValidStringArray = true;
		for(var i=0; i<aForbiddenStrings.length; i++)
		{
			if(typeof(aForbiddenStrings[i])!="string"){
				bValidStringArray = false;
			}
		}
		if(bValidStringArray==true){
			this.aForbiddenStrings = aForbiddenStrings;
		}
		else{
			window.alert("ERROR setForbiddenStrings: aForbiddenStrings bevat ongeldige waarden.");
		}
	}
	return true;
}

function setMandatory(){
	this.bMandatory = true;
	return true;
}

function setMaxIntegerValue(iMaxIntegerValue){
	if(rxValidInteger.test(String(iMaxIntegerValue))==false){
		window.alert("ERROR setMaxIntegerValue: iMaxIntegerValue bevat geen geldige waarde: "+iMaxIntegerValue);
	}
	else{
		this.iMaxIntegerValue = iMaxIntegerValue;
	}
	return true;
}

function setMaxLength(iMaxLength){
	if(rxValidPosInteger.test(String(iMaxLength))==false){
		window.alert("ERROR setMaxLength: iMaxLength bevat geen geldige waarde: "+iMaxLength);
	}
	else{
		this.iMaxLength = iMaxLength;
	}
	return true;
}

function setMaxSelections(iMaxSelections){
	if(rxValidPosInteger.test(String(iMaxSelections))==false){
		window.alert("ERROR setMaxSelections: iMaxSelections bevat geen geldige waarde: "+iMaxSelections);
	}
	else{
		this.iMaxSelections = iMaxSelections;
	}
	return true;
}

function setMinIntegerValue(iMinIntegerValue){
	if(rxValidInteger.test(String(iMinIntegerValue))==false){
		window.alert("ERROR setMinIntegerValue: iMinIntegerValue bevat geen geldige waarde: "+iMinIntegerValue);
	}
	else{
		this.iMinIntegerValue = iMinIntegerValue;
	}
	return true;
}

function setMinLength(iMinLength){
	if(rxValidPosInteger.test(String(iMinLength))==false){
		window.alert("ERROR setMinLength: iMinLength bevat geen geldige waarde: "+iMinLength);
	}
	else{
		this.iMinLength = iMinLength;
	}
	return true;
}


function setValidFormat(rxValidFormat){
	if(rxValidRegExp.test(String(rxValidFormat))==false){
		window.alert("ERROR setValidFormat: rxValidFormat bevat geen geldige waarde: "+rxValidFormat);
	}
	else{
		this.rxValidFormat = rxValidFormat;
	}
	return true;
}

function setValue(sValue){
	if(this.aValues==null){
		this.aValues = new Array();
	}
	this.aValues[this.aValues.length] = sValue;
	return true;
}

function validate(){
	var bValidField=true;

	//controleer "verplicht veld"-restrictie
	if(this.bMandatory==true && (this.aValues==null || this.aValues[0]=="")){
		bValidField=false;
		this.aValidationErrors[this.aValidationErrors.length]="ERRMANDATORY";
	}

	//controleer "stringformaat"-restrictie
	if(bValidField==true && this.rxValidFormat!=null){
		if(this.rxValidFormat.test(this.aValues[0])==false && this.aValues[0]!=""){
			bValidField=false;
			this.aValidationErrors[this.aValidationErrors.length]="ERRFORMAT";
		}
	}

	//controleer "stringlengte"-restrictie
	if(bValidField==true && (this.iMinLength!=null || this.iMaxLength!=null)){
		if(this.iMinLength==null){
			if(this.aValues[0].length > this.iMaxLength){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMAXLENGTH";
			}
		}
		else if(this.iMaxLength==null){
			if(this.aValues[0].length < this.iMinLength){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMINLENGTH";
			}
		}
		else{
			if(this.aValues[0].length < this.iMinLength || this.aValues[0].length > this.iMaxLength){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMINMAXLENGTH";
			}
		}
	}

	//controleer "verboden woorden"-restrictie
	if(bValidField==true && (this.aForbiddenStrings!=null)){
		for(i=0; i<this.aForbiddenStrings.length; i++)
		{
			if(this.aValues[0].toUpperCase().indexOf(this.aForbiddenStrings[i].toUpperCase())>-1)
			{
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRFORBIDDEN";
			}
		}
	}

	//controleer "stringwaarde"-restrictie
	if(bValidField==true && (this.iMinIntegerValue!=null || this.iMaxIntegerValue!=null)){
		if(this.iMinIntegerValue==null){
			if(parseInt(this.aValues[0]) > this.iMaxIntegerValue){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMAXVALUE";
			}
		}
		else if(this.iMaxIntegerValue==null){
			if(parseInt(this.aValues[0]) < this.iMinIntegerValue){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMINVALUE";
			}
		}
		else{
			if(parseInt(this.aValues[0]) < this.iMinIntegerValue || parseInt(this.aValues[0]) > this.iMaxIntegerValue){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMINMAXVALUE";
			}
		}
	}
	//controleer "aantal selecties"-restrictie
	if(bValidField==true && this.iMaxSelections!=null){
		if(this.aValues!=null){
			if(this.aValues.length > this.iMaxSelections){
				bValidField=false;
				this.aValidationErrors[this.aValidationErrors.length]="ERRMAXSELECTIONS";
			}
		}
	}
	return bValidField;
}

function focus(){
	this.oFirstElement.focus();
	return true;
}

function getFieldValidationErrors(){
	return this.aValidationErrors;
}