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 			= ( elemType == "select" || elemType == "select-one" ? elem.selectedIndex : elem.value );
			var validationType 		= elem.getAttribute("validate");
			var errorMessage 		= elem.getAttribute("title");
			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 "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 "positive":
						if( elemValue != "" ){
							var filter = /^\d+$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "phone":
						if( elemValue != "" ){
							var filter = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "phone_PT":
					
						if( elemValue != "" ){
							if( elemValue.charAt(0) != 2 && elemValue.charAt(0) != 9 ) blnValid = false;
							if( elemValue.charAt(1) != 6 && elemValue.charAt(1) != 1 && elemValue.charAt(1) != 3 && elemValue.charAt(1) != 2 ) blnValid = false;
							if( blnValid == false )	
								break;
							if( formValidation_isInvalidPhoneNumbers( elemValue, 2, 8 ) ){ 
								blnValid = false;
								break;
							}
							var filter = /^[0-9]{9}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "mobile_PT":
						if( elemValue != "" ){
							if( elemValue.charAt(0) != 9 ) blnValid = false;
							if( elemValue.charAt(1) != 6 && elemValue.charAt(1) != 1 && elemValue.charAt(1) != 3 && elemValue.charAt(1) != 2 ) blnValid = false;
							if( blnValid == false )	
								break;
							if( formValidation_isInvalidPhoneNumbers( elemValue, 2, 8 ) ){ 
								blnValid = false;
								break;
							}
							var filter = /^[0-9]{9}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "phone_ES":
						if( elemValue != "" ){
							if( elemValue.charAt(0) != 6 && elemValue.charAt(0) != 9 ) blnValid = false;
							if( formValidation_isInvalidPhoneNumbers( elemValue, 2, 8 ) ) blnValid = false;
							var filter = /^[0-9]{9}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "username":
						if( elemValue != "" ){
							var filter = /^[A-Za-z0-9_-]{4,20}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "password":
						if( elemValue != "" ){
							var filter = /^[A-Za-z0-9!@#$%^&*()_]{4,20}$/
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "name":
						if( elemValue != "" ){
							var filter = /^[A-Za-záéíóúàèìòùçãõÁÉÍÓÚÀÈÌÒÙÇ' ]{3,120}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "name_surname":
						if( elemValue != "" ){
							var names = elemValue.split(' ');
							if( names.length <= 1 ) blnValid = false;
							else{
								for( var i=0; i< names.length; ++i ){
									var filter = /^[A-Za-záéíóúàèìòùçãõÁÉÍÓÚÀÈÌÒÙÇ' ]{2,120}$/;
									if( ! filter.test( names[i] ) ){ 
										blnValid = false;
										break;
									}
								}
							}
						}
					break;
					
					
					case "nif":
						if( elemValue != "" ){
							if( !formValidation_isValidNIF( elemValue ) && elemValue != "123456789"  ) blnValid = false;
						}
					break;
					
					case "cc_visa":
						if( elemValue != "" ){
							var filter = /^4(?:[0-9]{12}|[0-9]{15})$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "cc_mastercard":
						if( elemValue != "" ){
							var filter = /^5[1-5]{1}[0-9]{14}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "cc_amex":
						if( elemValue != "" ){
							var filter = /^3(4|7){1}[0-9]{13}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "cc_discover":
						if( elemValue != "" ){
							var filter = /^6011[0-9]{12}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "cc_dinersclub":
						if( elemValue != "" ){
							var filter = /^3(?:(0[0-5]{1}[0-9]{11})|(6[0-9]{12})|(8[0-9]{12}))$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "zip_PT":
						if( elemValue != "" ){
							var filter = /^[0-9]{4}[-]{1}[0-9]{3}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
						}
					break;
					
					case "date_PT":
						if( elemValue != "" )
							blnValid = formValidation_validateDate( elemValue );
					break;
					
					case "plus18":
						if( elemValue != "" ){
							minYear = 1900
							maxYear = 1991;
							
							if (elemValue.length != 4 || elemValue==0 || elemValue<minYear || elemValue>maxYear){
								errorMessage = "Lamentamos mas és menor de idade. O acesso a este site está restrito a maiores de 18 anos";
								blnValid = false;
								break;
							}
						}
						
					case "notNews":
						if( elemType == "checkbox" && !elem.checked ) {
							input_box=confirm(errorMessage);
							if (input_box == true) {
								elem.focus();
								return true;
							} else {
								blnValid = false;
							}
							
						}	
						
					default:
						try {
							blnValid = eval(validationType+"(element)");
						}
						catch( ex ){
							blnValid = true;
						}
					break;
				}
				
				if( !show_alert ){
					if( blnValid == false ) {
						document.getElementById(divErrorId).innerHTML = errorMessage;   
						//elem.style.backgroundColor = "#cccccc";
						elem.style.borderColor = "#be9900";
						elem.focus();
						return true;
					}
					else{
						document.getElementById(divErrorId).innerHTML = "";
						elem.style.borderColor = "#000000";
						//elem.style.backgroundColor = "#FFFFFF";
					}
				}
				else{
					if( blnValid == false ){
						alert( errorMessage );
						elem.focus();
						return true;
					}
				}
			}
		}
	}
	
	
	
	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;
	} 
	
	
	// invalid phones = 961111111, 962222222 ...
	function formValidation_isInvalidPhoneNumbers( phone, startPosition, endPosition ){
		invalidPhone = false;
		for( var i=0; i < phone.length || i <= 8; ++i ){
			var invalidPhone = false;
			
			for( var j=startPosition; j < phone.length || j <= endPosition; ++j ){
				if( phone.charAt(j) == i )
					invalidPhone = true;
				else{
					invalidPhone = false;
					break;
				}
			}
			if( invalidPhone ) return true;
		}
		return invalidPhone;
	}
	
	
	// valid date types => dd/mm/YYYY dd-mm-YYYY
	function formValidation_validateDate( strValue ) {
		var objRegExp = /^\d{1,2}(\-|\/|)\d{1,2}\1\d{4}$/
		 
		//check to see if in correct format
		if(!objRegExp.test(strValue))
			return false; //doesn't match pattern, bad date
		else{
			var strSeparator = strValue.substring(2,3) 
			var arrayDate = strValue.split(strSeparator); 
			//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( arrayDate[0], 10 ); 
		
			//check if month value and day value agree
			if(arrayLookup[arrayDate[1]] != null) {
			  if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0)
				return true; //found in lookup table, good date
			}
			
			// verify biss year
			var intMonth = parseInt(arrayDate[1],10);
			if (intMonth == 2) { 
			   var intYear = parseInt(arrayDate[2]);
			   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; //any other values, bad date
	}
