var GFValidate = {} ;
var lang = {} ;

lang.Portugues = [] ;
lang.English = [] ;

lang.Portugues[0] = "Foram encontrados #errorsCount# erros no formulário:"
lang.Portugues[1] = "O campo #FieldName# não pode ser vazio."
lang.Portugues[2] = "O campo #FieldName# deve ter mais de #MinChars# caracteres."
lang.Portugues[3] = "O campo #FieldName# deve ser selecionado."
lang.Portugues[4] = "O campo #FieldName# deve ser diferente de #diffValue#."
lang.Portugues[5] = "O campo #FieldName# deve ser um e-mail válido."
lang.Portugues[6] = "Se o campo #FieldName1# for preenchido, você deve preencher também o campo #FieldName2#."
lang.Portugues[7] = "Se o campo #FieldName1# for selecionado, você deve preencher também o campo #FieldName2#."
lang.Portugues[8] = "O campo #FieldName1# deve selecionado."
lang.Portugues[9] = "O formulário não pode ser validado.\n\n Mensagem de erro: #errorMsg#"
lang.Portugues[10] = "O campo #FieldName# deve ser igual a #diffValue#."
lang.Portugues[11] = "O campo #FieldName# deve ser igual ao campo #diffValue#."
lang.Portugues[12] = "O campo #FieldName# deve ser númerico."

lang.English[0] = "#errorsCount# errors in form:"
lang.English[1] = "The field #FieldName# cannot be empty."
lang.English[2] = "The field #FieldName# need have more then #MinChars# caracteres."
lang.English[3] = "The field #FieldName# must be selected."
lang.English[4] = "The field #FieldName# must be different of #diffValue#."
lang.English[5] = "The field #FieldName# must be a valid e-mail."
lang.English[6] = "If the field #FieldName1# was not empty, you must complete the field #FieldName2# too."
lang.English[7] = "If the field #FieldName1# was checked, you must complete the field #FieldName2# too."
lang.English[8] = "The field #FieldName1# must be checked."
lang.English[9] = "The form cannot be validated.\n\n Error message: #errorMsg#"
lang.English[10] = "The field #FieldName# must be equal #diffValue#."
lang.English[11] = "The field #FieldName# must be equal the field #diffValue#."
lang.English[12] = "The field #FieldName# must be numeric."

lang.inUse = lang.Portugues ;

GFValidate.formsValidate = [] ;
GFValidate.fieldsValidated = [] ;
GFValidate.errorMessage = "" ;
GFValidate.errorCount = 0 ;
GFValidate.canValidate = true ;
GFValidate.initErrorMsg = "" ;

GFValidate.init = function(){
	GFValidate.formsValidate = [] ;
	GFValidate.fieldsValidated = [] ;
	GFValidate.errorMessage = "" ;
	GFValidate.errorCount = 0 ;
	
	var forms = document.getElementsByTagName("form");
	for( i = 0 ; i < forms.length ; i++ ){
		if( forms[i].attributes.gfValidateForm ){
			if( forms[i].attributes.gfValidateMsg ){
				GFValidate.initErrorMsg = forms[i].attributes.gfValidateMsg.value ;
			}
			this.formsValidate.push( forms[i] );
		}
	}
	
	this.putValidate();
}

GFValidate.putValidate = function(){
	for( i = 0 ; i < this.formsValidate.length ; i++ ){
		this.formsValidate[i].onsubmit = function(){ return GFValidate.validateFields(this); };
	}
}

GFValidate.validateFields = function(formToValidate){
	if( this.canValidate ){
		var retorno = true ;
		
		this.errorMessage = "" ;
		this.errorCount = 0 ;
		this.fieldsValidated = [] ;
		
		var campos = formToValidate.getElementsByTagName("input");
		
	
		for( i = 0 ; i < campos.length ; i++ ){
			if( campos[i].attributes.validate ){
				switch( campos[i].type ){
					case "text" :
						if( ! this.validateTextType(campos[i]) ){ retorno = false ; };
						break;
					case "password" :
						if( ! this.validateTextType(campos[i]) ){ retorno = false ; };
						break;
					case "file" :
						if( ! this.validateTextType(campos[i]) ){ retorno = false ; };
						break;
					case "radio" :
						if( ! this.validateRadioType(campos[i],formToValidate) ){ retorno = false ; };
						break;
					case "checkbox" :
						if( ! this.validateCheckBoxType(campos[i]) ){ retorno = false ; };
						break;
				}
				this.fieldsValidated.push( campos[i] )
			}
		}
		
		var campos = formToValidate.getElementsByTagName("textarea");
		for( i = 0 ; i < campos.length ; i++ ){
			if( campos[i].attributes.validate ){
				if( ! this.validateTextType(campos[i]) ){ retorno = false ; }
				this.fieldsValidated.push( campos[i] )
			}
		}
		
		var campos = formToValidate.getElementsByTagName("select");
		for( i = 0 ; i < campos.length ; i++ ){
			if( campos[i].attributes.validate ){
				if( ! this.validateSelectType(campos[i]) ){ retorno = false ; }
				this.fieldsValidated.push( campos[i] )
			}
		}
		
		if( this.errorCount > 0 ){
			this.errorMessage = lang.inUse[0].replace('#errorsCount#' , this.errorCount.toString() ) + '\n' + this.errorMessage ;
			alert( this.errorMessage );
		}
		return retorno;
	}else{
		if( this.errorMessage == "" ){
			this.addError( 9 , ['#errorMsg#'] , [GFValidate.initErrorMsg] );
		}
		alert( this.errorMessage );
		return false;
	}
}

GFValidate.validateTextType = function( fieldToValidate ){
	var typesValidate = fieldToValidate.attributes.validate.value.split(",");
	var retorno = true ;
	
	for( l = 0 ; l < typesValidate.length ; l++ ){
		var typeFinal = typesValidate[l].split("(");
		switch( typeFinal[0].toLowerCase() ){
			case "minchar" :
				var qChar = Number( typeFinal[1].split(")")[0] );
				if( fieldToValidate.value.length < qChar ){
					retorno = false ;
					this.addError( 2 , ['#FieldName#','#MinChars#'] , [fieldToValidate.name.toUpperCase(),qChar.toString()] );
				}
				break ;
			case "empty" :
				if( fieldToValidate.value.length < 1 ){
					retorno = false ;
					this.addError( 1 , ['#FieldName#'] , [fieldToValidate.name.toUpperCase()] );
				}
				break ;
			case "numeric" :
				if( ! IsNum(fieldToValidate.value) ){
					retorno = false ;
					this.addError( 12 , ['#FieldName#'] , [fieldToValidate.name.toUpperCase()] );
				}
				break ;
			case "email" :
				var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
				//var arroba = fieldToValidate.value.indexOf("@") ;
				//var dot = fieldToValidate.value.indexOf(".",arroba) ;
				if( ! reg.test( fieldToValidate.value ) ){
					retorno = false ;
					this.addError( 5 , ['#FieldName#'] , [fieldToValidate.name.toUpperCase()] );
				}
				break ;
			case "ifnotempty" :
				var fieldValidatedOutStr = typeFinal[1].split(")")[0];
				var fieldValidatedOut = document.getElementById(fieldValidatedOutStr);
				if( fieldValidatedOut.value.length > 0 ){
					if( fieldToValidate.value.length < 1 ){
						retorno = false ;
						this.addError( 6 , ['#FieldName1#','#FieldName2#'] , [fieldValidatedOut.name.toUpperCase(),fieldToValidate.name.toUpperCase()] );
					}
				}
				else{
					this.removeErrorBorder( fieldToValidate );
				}
				break ;
			case "ifchecked" :
				var fieldValidatedOutStr = typeFinal[1].split(")")[0];
				var fieldValidatedOut = document.getElementById(fieldValidatedOutStr);
				if( fieldValidatedOut.checked ){
					if( fieldToValidate.value.length < 1 ){
						retorno = false ;
						this.addError( 7 , ['#FieldName1#','#FieldName2#'] , [fieldValidatedOut.name.toUpperCase(),fieldToValidate.name.toUpperCase()] );
					}
				}else{
					this.removeErrorBorder( fieldToValidate );
				}
				break ;
			case "diff" :
				var qChar = typeFinal[1].split(")")[0];
				if( fieldToValidate.value == qChar ){
					retorno = false ;
					this.addError( 4 , ['#FieldName#','#diffValue#'] , [fieldToValidate.name.toUpperCase(),fieldToValidate.value] );
				}
				break ;
			case "diffc" :
				var qChar = document.getElementById(typeFinal[1].split(")")[0]);
				if( fieldToValidate.value == qChar.value ){
					retorno = false ;
					this.addError( 4 , ['#FieldName#','#diffValue#'] , [fieldToValidate.name.toUpperCase(),fieldToValidate.value] );
				}
				break ;
			case "equal" :
				var qChar = typeFinal[1].split(")")[0];
				if( fieldToValidate.value != qChar ){
					retorno = false ;
					this.addError( 10 , ['#FieldName#','#diffValue#'] , [fieldToValidate.name.toUpperCase(),fieldToValidate.value] );
				}
				break ;
			case "equalc" :
				var qChar = typeFinal[1].split(")")[0];
				var fieldToCompare = document.getElementById(qChar) 
				if( fieldToValidate.value != fieldToCompare.value ){
					retorno = false ;
					this.addError( 11 , ['#FieldName#','#diffValue#'] , [fieldToValidate.name.toUpperCase(),fieldToCompare.name.toUpperCase()] );
				}
				break ;
		}
	}
	
	if( ! retorno ){
		this.addErrorBorder( fieldToValidate );
	}else{
		this.removeErrorBorder( fieldToValidate );
	}
	
	return retorno ;
}

GFValidate.validateSelectType = function( fieldToValidate ){
	var typesValidate = fieldToValidate.attributes.validate.value.split(",");
	var retorno = true ;
	
	for( l = 0 ; l < typesValidate.length ; l++ ){
		var typeFinal = typesValidate[l].split("(");
		
		switch( typeFinal[0].toLowerCase() ){
			case "diff" :
				var qChar = typeFinal[1].split(")")[0];
				if( qChar.indexOf("|") < 1 ){
					if( fieldToValidate.options[fieldToValidate.selectedIndex].value == qChar ){
						retorno = false ;
						this.addError( 4 , ['#FieldName#','#diffValue#'] , [fieldToValidate.name.toUpperCase(),fieldToValidate.options[fieldToValidate.selectedIndex].text.toUpperCase()] );
					}
				}else{
					var difs = qChar.split("|");
					for( u = 0 ; u < difs.length ; u++ ){
						if( fieldToValidate.options[fieldToValidate.selectedIndex].value == difs[u] ){
							retorno = false ;
							this.addError( 4 , ['#FieldName#','#diffValue#'] , [fieldToValidate.name.toUpperCase(),fieldToValidate.options[fieldToValidate.selectedIndex].text.toUpperCase()] );
						}
					}
				}
				break ;
		}
	}
	
	if( ! retorno ){
		this.addErrorBorder( fieldToValidate );
	}else{
		this.removeErrorBorder( fieldToValidate );
	}
	
	return retorno ;
}

GFValidate.validateRadioType = function( fieldToValidate , formToValidate ){
	var typesValidate = fieldToValidate.attributes.validate.value.split(",");
	var campos = formToValidate.getElementsByTagName("input");
	var camposV = [] ;
	var retorno = true ;

	for( l = 0 ; l < typesValidate.length ; l++ ){
		for( h = 0 ; h < campos.length ; h++ ){
			if( campos[h].name == fieldToValidate.name ){ camposV.push( campos[h] ); }
		}
		
		var typeFinal = typesValidate[l].split("(");
		switch( typeFinal[0].toLowerCase() ){
			case "diff" :
				var validar = true ;
				for( h = 0 ; h < this.fieldsValidated.length ; h++ ){
					if( this.fieldsValidated[h].name == fieldToValidate.name ){
						validar = false ;
					}
				}
				if( validar ){
					var qChar = Number( typeFinal[1].split(")")[0] );
					for( g = 0 ; g < camposV.length ; g++ ){
						if( camposV[g].checked ){
							if( camposV[g].value == qChar ){
								retorno = false ;
								this.addError( 4 , ['#FieldName#','#diffValue#'] , [camposV[g].name.toUpperCase(),qChar] );
							}
						}
					}
				}
				break ;
			case "checked" :
				var exist = false ;
				for( g = 0 ; g < camposV.length ; g++ ){
					if( camposV[g].checked ){
						exist = true ;
					}
				}
				if( ! exist ){
					retorno = false ;
					this.addError( 8 , ['#FieldName#'] , [fieldToValidate.name.toUpperCase(),qChar] );
				}
				break ;
		}
	}
	
	if( ! retorno ){
		this.addErrorBorder( fieldToValidate );
	}else{
		this.removeErrorBorder( fieldToValidate );
	}
	
	return retorno ;
}

GFValidate.addError = function( langIndex , replaces , values ){
	this.errorCount++ ;
	var stringFinal = lang.inUse[langIndex]
	for( kk = 0 ; kk < replaces.length ; kk++ ){
		stringFinal = stringFinal.replace( replaces[kk] , values[kk] );
	}
	this.errorMessage += "\n" + this.errorCount + ". " + stringFinal ;
}

GFValidate.addErrorBorder = function( fieldToChange ){
	fieldToChange.style.borderLeft = '3px solid red' ;
	if( document.getElementById('__'+fieldToChange.id) ){
		document.getElementById('__'+fieldToChange.id).innerHTML = '<img src="images/x.gif" />';
	}
}

GFValidate.removeErrorBorder = function( fieldToChange ){
	fieldToChange.style.borderLeft = '' ;
	if( document.getElementById('__'+fieldToChange.id) ) document.getElementById('__'+fieldToChange.id).innerHTML = '';
}

function IsNum(sText){
	var ValidChars = "0123456789.";
	var Char;
	var retorno = true
	for (ii = 0; ii < sText.length; ii++) { 
		Char = sText.charAt(ii); 
		if( ValidChars.indexOf(Char) == -1) {
			retorno = false;
		}
	}
	return retorno;
}

