function validateFields(fieldsList, formID){
	var returnValue = true;
	var errorsDiv = document.getElementById(formID+"Errors");	
	var finalVal = true;
	//empty errors form if containes any messages
	errorsDiv.innerHTML = "";
	for (i=0; i<fieldsList.length; i++){
		if (fieldsList[i][1] != 'matchFields'){
			var fieldValue = trimValidation(document.getElementById(fieldsList[i][0]).value);
		}
		switch (fieldsList[i][1]){
			case 'string':
				returnValue = validateString(fieldValue, fieldsList[i][2], fieldsList[i][3], fieldsList[i][4], fieldsList[i][5], errorsDiv)
				break;
			case 'number':
				returnValue = validateNumber(fieldValue, fieldsList[i][2], fieldsList[i][3], fieldsList[i][4], fieldsList[i][5], errorsDiv)
				break;
			case 'integer':
				returnValue = validateInteger(fieldValue, fieldsList[i][2], fieldsList[i][3], fieldsList[i][4], fieldsList[i][5], errorsDiv)
				break;				
			case 'email':
				returnValue = validateEmail(fieldValue, fieldsList[i][2], fieldsList[i][3], errorsDiv);
				break;
			case 'date':
				returnValue = validateDate(fieldValue, fieldsList[i][2], fieldsList[i][3], fieldsList[i][4], errorsDiv);
				break;
			case 'matchFields':
				var fieldValueMatch_1 = trimValidation(document.getElementById(fieldsList[i][3]).value);
				var fieldValueMatch_2 = trimValidation(document.getElementById(fieldsList[i][4]).value);
				returnValue = validateMatchFields(fieldValueMatch_1, fieldValueMatch_2, fieldsList[i][2], fieldsList[i][5], errorsDiv);
				break;
		}
		//if at least one condition fails, the validation fail
		if (!returnValue){
			finalVal = false;
		}
	}

	if (!finalVal){
		errorsDiv.innerHTML += "<br>";
		
		scroll(0,0);
	}

	return finalVal;
}

function validateString(fieldValue, mandatory, minValue, maxValue, errorMsg, errorsDiv){
	var returnValue = true;
	if (fieldValue == ""){
		if (mandatory == 1){
			returnValue = false;
		}
	}else{
		//if a string in specified validate by rules
		if (minValue > 0){
			if (fieldValue.length < minValue){
				returnValue = false;
			}
		}
		if (maxValue > 0 ){
			if (fieldValue.length > maxValue){
				returnValue = false;
			}			
		}
	}
	if (!returnValue){
		outputErrors(errorsDiv, errorMsg);
	}
	return returnValue;
}

function validateMatchFields(field_1_Value, field_2_Value, mandatory, errorMsg, errorsDiv){
	var returnValue = true;
	if (mandatory == 1){
		if (field_1_Value == "" && field_2_Value == ""){
			returnValue = false;
		}else{
			if (field_1_Value != field_2_Value){
				returnValue = false;
			}
		}
	}else{
		if (field_1_Value != field_2_Value){
			returnValue = false;
		}
	}
	if (!returnValue){
		outputErrors(errorsDiv, errorMsg);
	}
	return returnValue;
}


function validateNumber(fieldValue, mandatory, minValue, maxValue, errorMsg, errorsDiv){
	var regNumber = new RegExp("^-?(\\d\\d*\\.\\d*$)|(^-?\\d\\d*$)|(^-?\\.\\d\\d*$)");
	
	var returnValue = true;
	if (fieldValue == ""){
		if (mandatory == 1){
			returnValue = false;
		}
	}else{
		if (regNumber.test(fieldValue)){
			if (fieldValue < minValue){
				returnValue = false;
			}
			
			if (fieldValue > maxValue){
				returnValue = false;
			}			
		}else{
			returnValue = false;
		}
	}
	if (!returnValue){
		outputErrors(errorsDiv, errorMsg);
	}
	return returnValue;	
}

function validateInteger(fieldValue, mandatory, minValue, maxValue, errorMsg, errorsDiv){
	var regNumber = new RegExp("^-?\\d\\d*$");
	
	var returnValue = true;
	if (fieldValue == ""){
		if (mandatory == 1){
			returnValue = false;
		}
	}else{
		if (regNumber.test(fieldValue)){
			if (fieldValue < minValue){
				returnValue = false;
			}
			
			if (fieldValue > maxValue){
				returnValue = false;
			}			
		}else{
			returnValue = false;
		}
	}
	if (!returnValue){
		outputErrors(errorsDiv, errorMsg);
	}
	return returnValue;	
}

function validateEmail(fieldValue, mandatory, errorMsg, errorsDiv){
	var regEmail = new RegExp("^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w\\.-]{2,4}$");
	var returnValue = true;
	if (fieldValue == ""){
		if (mandatory == 1){
			returnValue = false;
		}
	}else{
		if (!regEmail.test(fieldValue)){
			returnValue = false;
		}
	}
	if (!returnValue){
		outputErrors(errorsDiv, errorMsg);
	}
	return returnValue;
}

function validateDate(fieldValue, mandatory, dateType, errorMsg, errorsDiv){
	var regDate = getRegExpDate(dateType);
	
	var returnValue = true;
	if (fieldValue == ""){
		if (mandatory == 1){
			returnValue = false;
		}
	}else{
		if (!regDate.test(fieldValue)){
			returnValue = false;
		}
	}
	if (!returnValue){
		outputErrors(errorsDiv, errorMsg);
	}
	return returnValue;
}


////////////////////////////////
//util functions for validation
////////////////////////////////
function outputErrors(errorsDiv, errorMsg){
	if(errorsDiv.innerHTML == ""){
		if(errorsDiv.id != "forgotpasswdformErrors"){
			errorsDiv.innerHTML = "<b>" + i18n["errors"] + "</b>:<br>";
		}
	}

	if(errorsDiv.id != "forgotpasswdformErrors"){
		errorsDiv.innerHTML += " - " + errorMsg + "<br>";
	}
	else{
		errorsDiv.innerHTML = i18n["forgot_password_error"];
	}
}

function trimValidation(str){
	var val;
	val = str.replace(/^\s+/g, '').replace(/\s+$/g, '');
	return val;
}

function getRegExpDate(dateType){
	var dateReg = "";
	switch (dateType){
		case 'YYYY-MM-DD':
			dateReg = new RegExp("^\([0-9]{4}\)\\-\([0-1][0-9]\)\\-\([0-3][0-9]\)$");
			break;
		case 'YYYY/MM/DD':
			dateReg = new RegExp("^\([0-9]{4}\)\/\([0-1][0-9]\)\/\([0-3][0-9]\)$");
			break;			
	}
	//default type if user does not specify a correct one
	if (dateReg == ""){
		dateReg = new RegExp("^\([0-9]{4}\)\\-\([0-1][0-9]\)\\-\([0-3][0-9]\)$", 0, 1, 2, "-");
	}
	return dateReg;
}