var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

function formField(objeto)
{
	this.obj = objeto;
	
	//Obtendo as informacoes do objeto
	this.name = (typeof(this.obj.name) != "undefined")?this.obj.name:"";
	this.id = (typeof(this.obj.id) != "undefined")?this.obj.id:"";
		
	this.type = "";
	
	if (this.obj.type == null || this.obj.type == "undefined" )
	{
		this.type = this.obj[0].type;
	}
	else if( typeof(this.obj.type) != null )
	{
		this.type = this.obj.type;
	}
	
	//Valor do campo obtido atraves da funcao geraValor
	this.valor = "";
	
	//Mensagem 
	this.mensagem = "- " + this.obj.alt;
	this.idReferencia = "";
	this.idLabel = "";
	this.idSpan = "";
	
	/*
	# Parametrso de validacao
	###############################
	*/
	
	//Requerido
	this.requerido = false;//boolean
	
	//Tamanho
	this.tamanho = false;//boolean
	
	//Numero
	this.numerico = false;//boolean
	this.inteiro = false;//boolean
	this.positivo = false;//boolean
	this.deNumero = false;//numerico
	this.ateNumero  = false;//numerico
	this.separadorDecimal = false;// substituicao decimal
	
	//Data
	this.data = false;//boolean
	this.deData = false;//string
	this.ateData = false;//string
	this.novaData = false;//boolean
	
	//Hora
	this.hora = false;//boolean
	this.deHora = false;//hora
	this.ateHora = false;//hora
	
	//Email
	this.email = false;//boolean
	
	//CPF
	this.cpf = false;//boolean
	
	//CNPJ
	this.cnpj = false;//boolean
	
	//Regular Expression
	this.regularExpression = false;//string
	
	//Regular Expression
	this.regularExpressionNOT = false;//string
	
	/*
	###############################
	*/
	
	//Obtendo o valor segundo o tipo de campo
	this.geraValor = function()
	{
		var o = this.obj;

		//Obtendo valor pelo tipo
		switch(this.type)
		{
			case "text":this.valor = o.value; break;
			case "file":this.valor = o.value; break;
			case "password":this.valor = o.value; break;
			case "hidden":this.valor = o.value; break;
			case "select":this.valor = selectValues(o); break;
			case "select-one":this.valor = selectValues(o); break;
			case "select-multiple":this.valor = selectValues(o); break;
			case "textarea":this.valor = o.value; break;
			case "radio":this.valor = radioValue(o); break;
			case "checkbox":this.valor = checkboxValues(o); break;
			default:this.valor = "";
		}
		
		//verificando se se eh necessaria separacao decimal
		if (this.separadorDecimal)
		{
			reg = new RegExp("\\" + this.separadorDecimal.toString(),"g");
			this.valor = this.valor.replace(reg,".");
		}
	}
	
	
	/*
	# Metodos para obter valor do objeto
	#######################################
	*/
	
	function selectValues(obj)
	{
		var retValor = "";
		
		for ( var i = 0 ; i < obj.options.length ; i++ )
		{
			if(obj.options[i].selected)
			{
				retValor = listAdd(retValor,obj.options[i].value,",");
			}
		}

		return retValor;
	}
	
	function checkboxValues(obj)
	{
		var retValor = "";
		
		if( typeof(obj.length) != "number" )
		{
			if(obj.checked)
			{
				retValor = obj.value;
			}
		}
		else
		{
			for ( var i = 0 ; i < obj.length ; i++ )
			{
				if(obj[i].checked)
				{
					retValor = listAdd(retValor,obj[i].value,",");
				}
			}
		}
		return retValor;
	}
	
	function radioValue(obj)
	{
		var retValor = "";

		if( typeof(obj.length) != "number" )
		{
			if(obj.checked)
			{
				retValor = obj.value;
			}
		}
		else
		{
			for ( var i = 0 ; i < obj.length ; i++ )
			{
				if(obj[i].checked)
				{
					retValor = listAdd(retValor,obj[i].value,",");
				}
			}
		}
		
		return retValor;
	}
	
	function listAdd(lista,valor,separador)
	{
		return (lista == "")?valor:lista.toString + separador.toString + valor.toString;
	}
}

/*
####################################
# Objeto de validacao
####################################
*/
function validate()
{
	/*
	# Propriedades para exibicao do erro
	##########################################
	*/
	
	//Tipos de acao
	this.msgBox = false;
	this.divErro = false;
	this.spanErro = false;
	this.mudaCor = false;
	
	//cor para mudaCor
	this.cor = "#F00";
	
	//idDivErro
	this.idDivErro = "";
	
	//Titulo para divErro
	this.tituloErro = "<br>Para efetuar a ação defina corretamente o(s) seguinte(s) campo(s):";
	
	/*
	##########################################
	*/
	
	this.arCampos = new Array();
	
	this.arErros = new Array();
	
	this.addCampo = function(campo) { this.arCampos.push(campo); }

	this.run = function()
	{
		var campos = this.arCampos;
		
		//limpando o divErro
		if ( this.idDivErro != "" )
		{
			document.getElementById(this.idDivErro).innerHTML = "";
			document.getElementById(this.idDivErro).style.display = "none";
		}
		
		//varrendo o array de objetos
		for ( var i = 0 ; i < campos.length ; i++ )
		{
			virgem = true;
			
			campo = campos[i];
		
			//Limpando o spanErro
			if (campo.idSpan != "") document.getElementById(campo.idSpan).innerHTML = "";
			
			//limpando a cor da borda
			if (campo.id != "")document.getElementById(campo.id).style.borderColor = "";
			if (campo.idReferencia != "")document.getElementById(campo.idReferencia).style.borderColor = "";
			
			//limpando o label
			if(campo.idLabel != "") document.getElementById(campo.idLabel).style.color = "";
			
			//gerando o valor do campo para validar
			campo.geraValor();
			
			//Requerido
			if(campo.requerido) virgem = (trim(campo.valor) != "");
			
			//Requerido
			if(campo.tamanho) virgem = (trim(campo.valor).length <= campo.tamanho);
			
			//Validando campo caso seja requerido ou esteja preenchido
			var valida = (campo.requerido || trim(campo.valor) != "");
			
			//Numero
			if(virgem && campo.numerico && valida) virgem = !isNaN(campo.valor);
			
			//inteiro
			if(virgem && campo.inteiro && valida) virgem = ( campo.valor ==  parseInt(campo.valor));
			
			//positivo
			if(virgem && campo.inteiro && valida) virgem = ( campo.valor > -1 );
			
			//deNumero
			if(virgem && campo.deNumero && valida) virgem = ( campo.valor >= campo.deNumero );
			
			//ateNumero
			if(virgem && campo.ateNumero && valida) virgem = ( campo.valor <= campo.ateNumero );
			
			//data
			if(virgem && campo.data && valida) virgem = ( isDate(campo.valor) );
			
			//deData
			if(virgem && campo.deData && valida) virgem = ( dateDiff(campo.valor,campo.deData) >= 0 );
			
			//ateData
			if(virgem && campo.ateData && valida)
			{
				virgem = ( dateDiff(campo.ateData,campo.valor) >= 0 );
				//novaData
				if(campo.novaData) virgem = ( novaData(campo.valor) );
			}

			//hora
			if(virgem && campo.hora && valida) virgem = ( isHour(campo.valor) );
			
			//deHora
			if(virgem && campo.deHora && valida) virgem = ( hourDiff(campo.valor, campo.deHora) >= 0 );
			
			//ateHora
			if(virgem && campo.deHora && valida) virgem = ( hourDiff(campo.ateHora, campo.valor) >= 0 );
			
			//email
			if(virgem && campo.email && valida) virgem = ( isMail(campo.valor) );
			
			//cpf
			if(virgem && campo.cpf && valida) virgem = ( isCPF(campo.valor) );
			
			//cnpj
			if(virgem && campo.cnpj && valida) virgem = ( isCNPJ(campo.valor) );
			
			/* === IMPEDE A VALIDAÇÃO POR EXPRESSÃO REGULAR DE ARQUIVOS P/ UPLOAD CASO A VERSÃO DO BROWSER =====
			====== SEJA FIREFOX (DEVIDO A REMOÇÃO DO CAMINHO COMPLETO NO .value DO INPUT "FILE") ============ */
			BrowserDetect.init();
			if(campo.type == "file" && BrowserDetect.browser == "Firefox"){
			} else{
				//Regular Expression
				if(virgem && campo.regularExpression && valida)
				{
					var reg = new RegExp(eval(campo.regularExpression));
					virgem = reg.test(campo.valor);
				}
				
				//Regular Expression
				if(virgem && campo.regularExpressionNOT && valida)
				{
					var reg = new RegExp(eval(campo.regularExpressionNOT));
					virgem = !reg.test(campo.valor);
				}
			}

			//Erro
			if(!virgem) this.arErros.push(campo);
		}
		
		var retorno = (this.arErros.length == 0);
		
		if (!retorno) this.action();
		
		/////////////////////////////////////////////////////////
		/// OED 1241 - Duplicidade nas mensagens enviadas. //////
		/// Código abaixo trabalha junto com div criada na //////
		/// página /educa/index.cfm e /educa/admin.cfm     //////
		/// impedir que os forms sejam submetidos 2 vezes. //////
		/////////////////////////////////////////////////////////
		try
		{
			if(retorno)
			{
				if(document.getElementById('ValidaSubmitForms').innerHTML != "")
				{
					retorno = false;
				} else
				{
					document.getElementById('ValidaSubmitForms').innerHTML = 1;
				}
			}
		} catch(err)
		{
			// Caso nao exista "ValidaSubmitForms" nao impedimos o funcionamento do formulário.
		}
		
		return retorno;
	}
	
	this.action = function()
	{
		if(this.msgBox)this.exibeMsgBox();
		if(this.divErro)this.exibeDivErro();
		if(this.spanErro)this.exibeSpanErro();
		if(this.mudaCor)this.exibeCor();
	}
	
	this.exibeDivErro = function()
	{
		if (this.idDivErro != "")
			{
			//exibindo o divErro
			document.getElementById(this.idDivErro).style.display = "block";
					
			conteudo = this.tituloErro;
			
			//montando a mensagem em paragrafos
			campos = this.arErros;
			
			for ( var i = 0 ; i < campos.length ; i++ )
			{
				conteudo += "\n<p style='color:"+ this.cor +";'>" + campos[i].mensagem + "</p>";
				if ( i == (campos.length - 1) )
				{
					conteudo += "<br>";
				}
			} 
			
			document.getElementById(this.idDivErro).innerHTML = conteudo;
			document.getElementById(this.idDivErro).style.color = this.cor;
			}
	}
	
	this.exibeCor = function()
	{
		campos = this.arErros;
		
		for ( var i = 0 ; i < campos.length ; i++ )
		{
			destino = (campos[i].idReferencia == "")?document.getElementById(campos[i].id):document.getElementById(campos[i].idReferencia);
			destino.style.borderColor = this.cor;
			if(campos[i].idLabel != "" ) document.getElementById(campos[i].idLabel).style.color = this.cor;
		}
	}
	
	this.exibeMsgBox = function()
	{
		var strMensagem = "";
		
		for ( var i = 0 ; i < this.arErros.length ; i++ )
		{
			strMensagem += this.arErros[i].mensagem + "\n";
		}
		
		alert(strMensagem);
	}
	
	this.exibeSpanErro = function()
	{
		for ( var i = 0 ; i < this.arErros.length ; i++ )
		{
			campo = this.arErros[i];
			if(campo.idSpan != "")
			{
				document.getElementById(campo.idSpan).innerHTML = campo.mensagem;
				document.getElementById(campo.idSpan).style.color = this.cor;
			}
		}
	}
}


/*
###################################
# Funcoes auxiliares
###################################
*/

function trim( valor )
{
	return valor.replace(/^\s*|\s*$/g,"");
}

function isDate(dateStr)
{
  var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
  var matchArray = dateStr.match(datePat); // is format OK?

  if (matchArray == null) return false;

  month = matchArray[3];
  day = matchArray[1];
  year = matchArray[5];

  if (month < 1 || month > 12) return false;

  if (day < 1 || day > 31) return false;

  if ((month==4 || month==6 || month==9 || month==11) && day==31) return false;

  if (month == 2)
  {
    var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    if (day > 29 || (day==29 && !isleap)) return false;
  }
  
  return true;
}

//Função que retorna a diferença, em dias, entre duas datas
function dateDiff(data1,data2)
{
	dataA= new Date(data1.substring(6),(data1.substring(3,5)-1),data1.substring(0,2));
	dataB= new Date(data2.substring(6),(data2.substring(3,5)-1),data2.substring(0,2));
	dataA= dataA.getTime();
	dataB= dataB.getTime();
	_a = ((dataA-dataB)/1000/60/60/24);
	return parseInt(_a);
}

//Função que verifica se a data é igual ou maior que hoje
function novaData(data1)
{
	dataA = new Date(data1.substring(6),(data1.substring(3,5)-1),data1.substring(0,2));
	dataB = new Date();
	return (dataA.getDate() >= dataB.getDate());
}

//Verifica se a hora eh valida
function isHour(hourStr)
{
  var hourPat = /^(\d{1,2})(:{1})(\d{2})$/; // 242
  var matchArray = hourStr.match(hourPat); // is format OK?
  
  if (matchArray == null) return false;

  // parse hour into variables
  hour = matchArray[1];
  minutes = matchArray[3];
	
  return ((parseInt(hour) >= 0 && parseInt(hour) < 24) && (parseInt(minutes) >= 0 && parseInt(minutes) < 60));
}

//funcao que verifica se uma hora eh igual a outra
function hourDiff(hora1,hora2)
{
	_h1 = Number(hora1.replace(/\:/g,""));
	_h2 = Number(hora2.replace(/\:/g,""));
	return _h2 - _h1;
}

function isMail(value)
{
 // proibi nome.@empresa.com e nome@.empresa.com
 var expression = "^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,4})|(aero|coop|info|museum|name))$";
 // var expression = "^([-!#$%&'*+./0-9=?A-Z^_`a-z{|}~])+@([-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+\\.)+[a-zA-Z]{2,4}$";
 return ereg(expression, value);
}

// --- isCPF
// Verifica se CPF é válido através de checagem do DV (não utilizar ífem)
// Tipo de retorno: BOOLEAN
// Domínio: [true | false]
function isCPF(_cpf){ 
	if( typeof _cpf == "string"){
		CPF = _cpf;
	} else {
		CPF = _cpf.value;
	}
	if (CPF.length != 11 		|| CPF == "00000000000" 	|| CPF == "11111111111" || 
		CPF == "22222222222" 	|| CPF == "33333333333" 	|| CPF == "44444444444" || 
		CPF == "55555555555" 	|| CPF == "66666666666" 	|| CPF == "77777777777" || 
		CPF == "88888888888" 	|| CPF == "99999999999"){
		return false;
	}
	soma = 0; 
	for (i=0; i < 9; i ++){
		soma += parseInt(CPF.charAt(i)) * (10 - i);
	}
	resto = 11 - (soma % 11); 
	if (resto == 10 || resto == 11){
		resto = 0;
	}
	if (resto != parseInt(CPF.charAt(9))){
		return false;
	}
	soma = 0; 
	for (i = 0; i < 10; i ++){
		soma += parseInt(CPF.charAt(i)) * (11 - i);
	}
	resto = 11 - (soma % 11); 
	if (resto == 10 || resto == 11){
		resto = 0;
	}
	if (resto != parseInt(CPF.charAt(10))){
		return false;
	}
	return true; 
}

// --- isCNPJ
// Verifica se o um CNPJ eh valido
// @param cnpj	=> Objeto referente ao campo do CNPJ
// @retorno boolean
function isCNPJ(cnpj)
{
	var c = cnpj.value.substr(0,12);
	var dv = cnpj.value.substr(12,2);
	var d1 = 0;
	
	for (i = 0; i < 12; i++)
	{
		d1 += c.charAt(11-i)*(2+(i % 8));
	}
	
	if (d1 == 0) return false;
	
	d1 = 11 - (d1 % 11);
	
	if (d1 > 9) d1 = 0;
	
	if (dv.charAt(0) != d1)
	{
		alert("O valor para CNPJ é invalido. Por favor, verifique.");
		cnpj.focus();
		cnpj.select();
		return false;
	}
	
	d1 *= 2;
	
	for (i = 0; i < 12; i++)
	{
		d1 += c.charAt(11-i)*(2+((i+1) % 8));
	}
	
	d1 = 11 - (d1 % 11);
	
	if (d1 > 9) d1 = 0;
	
	if (dv.charAt(1) != d1)
	{
		alert("CNPJ Invalido");
		cnpj.focus();
		cnpj.select();
		return false;
	}
	return true;
}

function ereg(expression, value)
{
 var objRegExp = new RegExp(expression);
 return objRegExp.exec(value) ? true : false;
}
