/*
	Form Validation

	Attribute Description:

	validate =  "not_empty" - field cannot be empty. stips spaces before validation 
				"integer"   - integer allowed
				"number" 	- decimal allowed
				"positive" 	- positive integer ou decimal value
				"email"     - validates email syntax
				"phone" 	- includes international phone numbers
				"phone_PT"  - validate PT phone numbers (mobile and home numbers)
				"mobile_PT" - validates PT mobile numbers
				"username"	- username with 4 to 20 chars a-z A-Z and 0-9 or _ -
				"password"	- password with 4 to 20 chars A-Z a-z 0-9 and !@#$%^&*()_
				"name"		- letters from 3 to 120 chars
				"nif"		- pt nif	
				"cc_visa"	- visa credit card number
				"url"		- url
				"ptzipcode" - PT zip code xxxx-xxx
				
	multiplos atribultos validate = "integer|not_empty"
	title = "mensagem de erro a apresentar"

	Examples:
	
		Field with username validation:
		<input type="Text" id="username" name="username" validate="username" msg="Username is invalid" />
		
		Field with multiple validation (not_empty and integer):
		<input type="Text" id="age" name="age" validate="not_empty|integer" msg="Age is mandatory and as to be a valid integer" />

*/

    var formValidation_translations = Array("ERRO: função validação js não definida", "");

	function validateFormTemplate( objForm, divErrorId ) {

		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 "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":
						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 != "" ){
							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;
								if( blnValid ){
									if( formValidation_isInvalidPhoneNumbers( elemValue ) ) blnValid = false;
								}
							}
						}
					break;
					
					case "mobile_PT":
						if( elemValue != "" ){
							var filter = /^[0-9]{9}$/;
							if( ! filter.test( elemValue ) )  blnValid = false;
							
							if( blnValid ){
								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 ){
									if( formValidation_isInvalidPhoneNumbers( 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,32}$/
							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 "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 "url":
						if( elemValue != "" ){
							var filter = /(ftp|http|https):\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_%&\?\/.=]+$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
							
						}
					break;
					
					case "ptzipcode":
						if( elemValue != "" ){
							var filter = /^[0-9]{4}[-]{1}[0-9]{3}$/;
							if( ! filter.test( elemValue ) ) blnValid = false;
							if( blnValid ) blnValid = formValidation_validateZip_PT( elemValue );
						}

					break;
					
					default:
						try{
							blnValid = eval(arrValidationTypes[j])( elemValue );
						}
						catch( err ){
							alert( formValidation_translations[0] );
							blnValid = true;
						}
					break;
				}
					
				if (blnValid == false) {
					document.getElementById(divErrorId).innerHTML = errorMessage;   
                    elem.style.backgroundColor = "#FFF8C6";
                    elem.focus();
					return false;
				}
				else{
					document.getElementById(divErrorId).innerHTML = "";
					elem.style.backgroundColor = "#FFFFFF";
				}
			}
		}
		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;
	}
	
	

