


	function validateFormTemplate( objForm, divErrorId, show_alert ) {
		
		for( var i=0; i< objForm.elements.length; ++i ){
			
			var elem = objForm.elements[i];
			
			if( !elem.id || elem.length == 0 || !elem.getAttribute("validate") || elem.getAttribute("validate").length == 0 ) continue;
			
			var elemType			= elem.type;
			var elemValue 			= formValidation_getFieldValue( objForm, elem, elemType );
			var validationType 		= elem.getAttribute("validate");
			var errorMessage 		= elem.getAttribute("errorMsg");
			var arrValidationTypes 	= validationType.split("|");
			
			for (var j=0; j < arrValidationTypes.length; j++) {
				
				var blnValid = true;

				switch( arrValidationTypes[j] ){
				
					case "not_empty":
						if( elemType == "select-one" && elemValue == 0 ) blnValid = false;
						else{
							if( elemType == "checkbox" && !elem.checked ) blnValid = false;
							else{
								if( elemType != "select-one" && formValidation_allTrim(elemValue) == "" ) blnValid = false;
							}
						}
					break;

					case "integer":
						if( elemValue != "" ){
							var filter = /^-?\d+$/;						
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;

					case "number":
						if( elemValue != "" ){
							var filter = /^[-+]?\d+(\.\d+)?$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "positive":
						if( elemValue != "" ){
							var filter = /^\d+$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;

					case "email":
						if( elemValue != "" ){
							var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "phone_PT":
					
						if( elemValue != "" ){
							var filter = /^[0-9]{9}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
							if( blnValid ){
								if( elemValue.charAt(0) != 2 && elemValue.charAt(0) != 3 && elemValue.charAt(0) != 9 ) blnValid = false;
								if( (elemValue.charAt(0) == 9) && (elemValue.charAt(1) != 6 && elemValue.charAt(1) != 1 && elemValue.charAt(1) != 3 && elemValue.charAt(1) != 2 )) blnValid = false;
							}
						}
					break;
					
					case "name":
						
						if( elemValue != "" ){
							var filter = /^[A-Za-z0-9 áéíóúàèìòùÁÉÍÓÚÀÈÌÒÙÇçüöäÃÕÑãõñ']{2,120}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;					
					
					default:
						try{
							blnValid = eval(arrValidationTypes[j])( elemValue );
						}
						catch( err ){
							alert( "ERRO FORM_TEMPLATE: função não definida" );
							blnValid = true;
						}
					break;
				}
				
				if( !show_alert ){
					if( blnValid == false ){
						document.getElementById(divErrorId).innerHTML = errorMessage;   
						//elem.style.backgroundColor = "#cccccc";
						if( elemType != "hidden" && elem.style.display != "none" && elem.style.visibility != "hidden" ) elem.focus();
						return false;
					}
					else{
						document.getElementById(divErrorId).innerHTML = "";
						//elem.style.backgroundColor = "#FFFFFF";
					}
				}
				else{
					if( blnValid == false ){
						alert( errorMessage );
						if( elemType != "hidden" && elem.style.display != "none" && elem.style.visibility != "hidden" ) elem.focus();
						return false;
					}
				}
			}
		}
		
		// verifies if listener is defined and calls it.
        var listener_defined = false;
		if(typeof formValidation_listener == 'function') listener_defined = true;
		if( listener_defined ) formValidation_listener();
		
		return true;
	}
	
	
	
	function formValidation_getFieldValue( formObj, elem, elemType ){
		
		switch( elemType ){
			case "text": 
				return elem.value;
			break;
			case "select":
				return elem.selectedIndex;
			break;
			case "select-one": 
				return elem.selectedIndex;
			break;
			case "radio":
				var radioObj = formObj.elements[ elem.name ];
				return formValidation_getCheckedRadio( radioObj )
			break;
			default: 
				return elem.value;
			break;
		}
		return "";
	}
	
	
	
	function formValidation_getCheckedRadio( radioObj ){
		if(!radioObj)
			return "";
		var radioLength = radioObj.length;
		if(radioLength == undefined){
			if(radioObj.checked)
				return radioObj.value;
			else
				return "";
		}
		for(var i = 0; i < radioLength; i++) {
			if(radioObj[i].checked) {
				return radioObj[i].value;
			}
		}
		return "";
	}
	
	
	
	function formValidation_allTrim(cValue){
		var lDone=false;

		while (lDone==false){
			if (cValue.length==0) {return cValue;}
			if (cValue.indexOf(' ')==0){cValue=cValue.substring(1);lDone=false; continue;}
			else {lDone=true;}
			if (cValue.lastIndexOf(' ')==cValue.length-1){cValue=cValue.substring(0, cValue.length-1);lDone=false;continue;}
			else {lDone=true;}
		}
		return cValue;
	}
	
	
	function formValidation_isValidNIF(nif){
		var c;
		var checkDigit = 0;
		//Check if is not null, is numeric and if has 9 numbers
		if( nif != null && nif == parseInt(nif) && nif.length == 9 ){
			//Get the first number of NIF
			var c = nif.charAt(0);
			//Check firt number is (1, 2, 5, 6, 8 or 9)
			if(c == '1' || c == '2' || c == '5' || c == '6' || c == '8' || c == '9')
			{
				//Perform CheckDigit calculations
				checkDigit = c * 9;
				var i = 0;
				for(i = 2; i <= 8; i++)
				{
					checkDigit += nif.charAt(i-1) * (10-i);
				}
				checkDigit = 11 - (checkDigit % 11);
				//if checkDigit is higher than ten set it to zero
				if(checkDigit >= 10)
					checkDigit = 0;
				//Compare checkDigit with the last number of NIF
				//If equal the NIF is Valid.           
				if(checkDigit == nif.charAt(8))
					return true;           
			}       
		}
		return false;
	} 
	
	
	
	// valid date types => dd/mm/YYYY dd-mm-YYYY
	function formValidation_validateDate( strValue, format ) {
		if( format == 'EN' ){
			var objRegExp = /^\d{4}(\-|\/|\.)\d{2}\1\d{2}$/
			if( !objRegExp.test(strValue) )
				return false;
				
			var strSeparator = strValue.substring(4,5);
			var arrayDate = strValue.split(strSeparator);
			return formValidation_validateDateDays( arrayDate[2], arrayDate[1], arrayDate[0] );
		}
		if( format == 'PT' ){
			var objRegExp = /^\d{2}(\-|\/|)\d{2}\1\d{4}$/
			 
			//check to see if in correct format
			if(!objRegExp.test(strValue))
				return false; //doesn't match pattern, bad date
			
			var strSeparator = strValue.substring(2,3);
			var arrayDate = strValue.split(strSeparator);
			return formValidation_validateDateDays( arrayDate[0], arrayDate[1], arrayDate[2] );
		}
		return false; //any other values, bad date
	}
	
	
	function formValidation_validateDateDays( day_val, month_val, year_val ){
		
		//create a lookup for months not equal to Feb.
		var arrayLookup = { '01' : 31,'03' : 31, 
							'04' : 30,'05' : 31,
							'06' : 30,'07' : 31,
							'08' : 31,'09' : 30,
							'10' : 31,'11' : 30,
							'12' : 31 }
							
		var intDay = parseInt( day_val, 10 ); 
			
		//check if month value and day value agree
		if(arrayLookup[month_val] != null) {
		  if(intDay <= arrayLookup[month_val] && intDay != 0)
			return true; //found in lookup table, good date
		}
			
		// verify biss year
		var intMonth = parseInt(month_val,10);
		if (intMonth == 2) { 
			var intYear = parseInt(year_val);
		 	if (intDay > 0 && intDay < 29) {
				return true;
			}
			else if (intDay == 29) {
				 if ((intYear % 4 == 0) && (intYear % 100 != 0) || (intYear % 400 == 0)) {
					// year div by 4 and ((not div by 100) or div by 400) ->ok
				 	return true;
				 }   
			}
		}
		return false;
	}
	
	
	// validate portuguese car plates formats
	function formValidation_validateCarPlate_PT( elemValue ){
		var filter1 = /^[A-Za-z]{2}[-][0-9]{2}[-][0-9]{2}$/;
		var filter2 = /^[0-9]{2}[-][A-Za-z]{2}[-][0-9]{2}$/;
		var filter3 = /^[0-9]{2}[-][0-9]{2}[-][A-Za-z]{2}$/;
		if( ! filter1.test( elemValue ) && ! filter2.test( elemValue ) && ! filter3.test( elemValue ) ) return false;
		return true;
	}
	

