var NUM_DIGITOS_CPF  = 11;
var NUM_DIGITOS_CNPJ = 14;
var NUM_DGT_CNPJ_BASE = 8;


var language			= new Array();
var checkObjects		= new Array();
var errors				= "";
var returnVal			= false;

language["header"]			= "Atenção";
language["start"]			= "";
language["field"]			= " O Campo ";
language["require"]			= " não pode ser nulo";
language["min"]				= " , o mínimo de caracteres é ";
language["max"]				= " o máximo de caracteres é ";
language["minmax"]			= " e o máximo ";
language["chars"]			= " caracteres";
language["num"]				= " precisa ser numérico";
language["email"]			= " endereco de email inválido";
language["carregando"]		= "Aguarde o carregamento";
language["atividadeAcao"]	= " <font color='#000000'>Aguarde carregando</font> ";
language["combodefault"]	= " Selecione ";
language["maxUpload"]		= " Máximo 3 uploads";
language["dataInvalida"]	= "Data inválida";
language["emailInvalido"]	= "Email inválido";
language["horaInvalida"]	= "Hora inválida";
language["invalido"]		= " inválido";
language["cep"]				= " CEP inválido";
language["cep_nao"]			= " CEP não encontrado";
language["periodoInvalido"]	= "Período inválido\nA data final é menor que a data de início do período";	


function define(n, type, HTMLname, min, max, HTMLname2, d) {
	var p;
	var i;
	var x;
	if (!d) d = document;

	if ((p=n.indexOf("?"))>0&&parent.frames.length) {
		d = parent.frames[n.substring(p+1)].document;
		n = n.substring(0,p);
	}
	if (!(x = d[n]) && d.all) x = d.all[n];

	for (i = 0; !x && i < d.forms.length; i++) {
		x = d.forms[i][n];
	}

	for (i = 0; !x && d.layers && i < d.layers.length; i++) {
		x = define(n, type, HTMLname, min, max, HTMLname2, d.layers[i].document);
		return x;       
	}
	eval("V_"+n+" = new formResult(x, type, HTMLname, min, max,HTMLname2);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}
	
function formResult(form, type, HTMLname, min, max,HTMLname2) {
		this.form = form;
		this.type = type;
		this.HTMLname = HTMLname;
		this.min  = min;
		this.max  = max;
		this.HTMLname2 = HTMLname2;
}

function validate() {
	if (checkObjects.length > 0) {
		errorObject = "";
		for (i = 0; i < checkObjects.length; i++) {
		validateObject = new Object();
		validateObject.form = checkObjects[i].form;
		validateObject.name = checkObjects[i].form.name;		
		validateObject.HTMLname = checkObjects[i].HTMLname;
		validateObject.val = checkObjects[i].form.value;
		validateObject.len = checkObjects[i].form.value.length;
		validateObject.min = checkObjects[i].min;
		validateObject.max = checkObjects[i].max;
		validateObject.type = checkObjects[i].type;
		validateObject.HTMLname2 = checkObjects[i].HTMLname2;

			if (validateObject.type == "num" || validateObject.type == "string") {
				if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))) { 
						errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";
						validateObject.form.focus();
				}
				if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) { 
						errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
						validateObject.form.focus();
				}
				if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) { 
						errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
						validateObject.form.focus();
				}
				if (validateObject.max && !validateObject.min && (validateObject.len > validateObject.max)) { 
						errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
						validateObject.form.focus();
				}
				if (!validateObject.min && !validateObject.max && validateObject.len <= 0) {
						errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
						validateObject.form.focus();
				}
			}

			if (validateObject.min!=null || validateObject.len >0){
				if(validateObject.type == "email") {
						if (!emailCheck(validateObject.val)){
							checkObjects[i].form.focus();
							errors = "exibido"; //indica q o erro ja foi exibido na funcao nesse caso o erro é exibido pela funcao emailCheck
						}
				}
				if(validateObject.type == "date" ) {
					if((validateObject.min==1) || (validateObject.min==0 && validateObject.val!="")){
						if (!checkDate(validateObject.form)){
							checkObjects[i].form.focus();
							errors = "exibido"; 
						}
					}
				}
				if(validateObject.type == "hora") {
					if((validateObject.min==1) || (validateObject.min==0 && validateObject.val!="")){
						if (!checkHours(validateObject.form)){
							checkObjects[i].form.focus();
							errors = "exibido"; 
						}
					}
				}
				if(validateObject.type == "combo") {
					if (validateObject.val==""){
						errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
						checkObjects[i].form.focus();						
					}
				}
				if(validateObject.type == "cpf") {
					if((validateObject.min==1) || (validateObject.min==0 && validateObject.val!="")){
						if (!isCpf(validateObject.form.value)){
							errors = language['start'] + validateObject.HTMLname + language['invalido'] + "\n";
							validateObject.form.focus();						
						}
					}
				}
				if(validateObject.type == "cnpj") {
					if((validateObject.min==1) || (validateObject.min==0 && validateObject.val!="")){
						if (!isCnpj(validateObject.form.value)){
							errors = language['start'] + validateObject.HTMLname + language['invalido'] + "\n";
							validateObject.form.focus();						
						}
					}
				}
			}
			
			if(validateObject.type == "webeditor") {
				/* para firefox */
				if (eval('document.getElementById("'+validateObject.name+'_webframe").contentDocument')){
					webeditor=eval('document.getElementById("'+validateObject.name+'_webframe").contentDocument.getElementById("wysiwyg" + "'+validateObject.name+'").contentWindow.document.body.innerHTML;');
				}else{
					webeditor=eval('document.frames("'+validateObject.name+'_webframe").document.getElementById("wysiwyg" + "'+validateObject.name+'").contentWindow.document.body.innerHTML;');
				}	
				//webeditor='document.SYSFRM.'+validateObject.name+'.value='+'"'+webeditor+'"';
				strWeb=eval('document.getElementById("'+validateObject.name+'");');
				strWeb.value=webeditor;
				//eval(webeditor);
				
			}			
			
			if(validateObject.type == "databetween") {
				if((validateObject.min==1) || ((validateObject.min==0 && validateObject.val!="") || (validateObject.min==0 && eval("document."+validateObject.form.form.name+"."+validateObject.HTMLname2+".value")!="")) ){
					if (!checkPeriodo(validateObject.val,eval("document."+validateObject.form.form.name+"."+validateObject.HTMLname2+".value"))){
						checkObjects[i].form.focus();
						errors = "exibido"; 
					}
				}
			}

			if(validateObject.type == "hiddenStr") {
				if (validateObject.val==""){
					errors = language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				}
			}
			
			if (errors!=""){
				i = checkObjects.length;
			}
		}
	}

	if (errors) {
		exibirErro=language["header"]+"\n" + errors;
		if (errors != "exibido") alert(exibirErro);
		errors = "";
		return false;
	} else {
		return true;
	}
}



function emailCheck (emailStr) {

	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)#$%&*!><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	var alerta_erro = language["emailInvalido"];
	
	if (matchArray==null) {
		alert(alerta_erro);
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			alert(alerta_erro);
			return false;
		}
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			alert(alerta_erro);
			return false;
		}
	}
	
	if (user.match(userPat)==null) {	
		alert(alerta_erro);
		return false;
	}

	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
	
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				alert(alerta_erro);
				return false;
		   }
		}
		return true;
	}
	
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			alert(alerta_erro);
			return false;
	    } 
	}
	
	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
		alert(alerta_erro);
		return false;
	}

	if (len<2) {
		alert(alerta_erro);
		return false;
	}
	
	return true;
}


function checkDate( Input ){
	var Data = Input.value;
	var DataRegEx = /^([012][0-9]|3[01])\/(0[1-9]|1[012])\/([0-9]{4})$/;
	var erro = language["dataInvalida"];
	if (Data.length==0){ alert(erro); Input.focus(); return false; }	
	if(!(Matches = Data.match(DataRegEx))){
		alert(erro);
		Input.focus();
		return false;
	}

	var Dia = Matches[1], Mes = Matches[2], Ano = Matches[3];

	if(Dia<1 || Dia>31){ alert(erro); Input.focus(); return false; }
	if(Mes<1 || Mes>12){ alert(erro); Input.focus(); return false; }
	if ((Mes==4 || Mes==6 || Mes==9 || Mes==11) && Dia>30){ alert(erro); Input.focus(); return false; }

	if (Mes==2) {
		var Resto = (Ano % 4); 
	
		if (Resto==0 && Dia>29){ alert(erro); Input.focus(); return false; }
		if (Resto != 0 && Dia>28){ alert(erro); Input.focus(); return false; }	
	}
	
	return true;
}


function checkHours( Field ){
	var Hora = Field.value;
	var RegExp = /^([01][0-9]|2[0-3])\:([0-5][0-9])$/; 
 
	if(!(arrVal = Hora.match(RegExp))){
		alert(language["horaInvalida"]);
		Field.focus();
		return false;
	}
	return true;
}

function areaCaracteres(valor,tamanho) {
	formname=valor.form.name;
	maxlength=valor.name+"_MaxLength";
	campoMax=eval("document."+formname+"."+maxlength);
	campoMax.value=valor.value.length;
	if(campoMax.value>tamanho){
		alert(" Máximo de caracteres " + tamanho);
		valor.value = valor.value.substr(0,tamanho);
		campoMax.value=valor.value.length;
	}
}


function checkPeriodo( dataInicio, dataTermino )
{
	var dtIni, dtFim;
	var ctlDt1, ctlDt2;
	
	if (dataInicio=="" || dataTermino==""){
		alert( language["periodoInvalido"] );
		return false;		
	}
	
	ctlDt1	= dataInicio.split("/");
	ctlDt2	= dataTermino.split("/");

	// para validar o período deve-se iniciar do Ano para o Dia
	dtIni	= ctlDt1[2] + ctlDt1[1] + ctlDt1[0];
	dtFim	= ctlDt2[2] + ctlDt2[1] + ctlDt2[0];

	if ( parseInt(dtIni) > parseInt(dtFim) ){
		alert( language["periodoInvalido"] );
		return false;
	}
	return true;
}



function novoPop(arquivo,nome,specs){

	windowLeft=100;
	windowTop=100;
        screenw=screen.width;
        screeny=screen.height;
	popnum=popup.length;

	
	popup[popnum]=window.open("about:blank",nome,specs);

	if (parseInt(navigator.appVersion) >= 4) {
	 	popup[popnum].window.focus();
	}
	
	if (!popup[popnum].closed && popup[popnum].document.body){
		cliw=popup[popnum].document.body.clientWidth;
		cliy=popup[popnum].document.body.clientHeight;
		var windowLeft = (screenw - cliw) / 2;
		var windowTop = (screeny - cliy) / 2;
		popup[popnum].moveTo( windowLeft, windowTop );
	}else{
		var windowLeft = (100);
		var windowTop = (100);
		popup[popnum].moveTo( windowLeft, windowTop );
	}
	
	popup[popnum]=window.open(arquivo,nome,specs);
}

function closePop(){
	for (i=0;i<popup.length;i++){
		if (!popup[i].closed)
		popup[i].close();
	}
	popup = new Array();
}

/**
 * Adiciona método lpad() à classe String.
 * Preenche a String à esquerda com o caractere fornecido,
 * até que ela atinja o tamanho especificado.
 */
String.prototype.lpad = function(pSize, pCharPad)
{
	var str = this;
	var dif = pSize - str.length;
	var ch = String(pCharPad).charAt(0);
	for (; dif>0; dif--) str = ch + str;
	return (str);
}
/**
 * Adiciona método trim() à classe String.
 * Elimina brancos no início e fim da String.
 */
String.prototype.trim = function()
{
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
} 

/**
 * Elimina caracteres de formatação e zeros à esquerda da string
 * de número fornecida.
 * @param String pNum
 * 	String de número fornecida para ser desformatada.
 * @return String de número desformatada.
 */
function unformatNumber(pNum)
{
	return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
} 

function isCpf(pCpf)
{
	var numero = formatCpfCnpj(pCpf, false, false);
	var base = numero.substring(0, numero.length - 2);
	var digitos = dvCpfCnpj(base, false);
	var algUnico, i;

	// Valida dígitos verificadores
	if (numero != base + digitos) return false;

	/* Não serão considerados válidos os seguintes CPF:
	 * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44,
	 * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
	 */
	algUnico = true;
	for (i=1; i<NUM_DIGITOS_CPF; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	return (!algUnico);
}

function isCnpj(pCnpj)
{
	var numero = formatCpfCnpj(pCnpj, false, true);
	var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
	var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
	var digitos = dvCpfCnpj(base + ordem, true);
	var algUnico;

	// Valida dígitos verificadores
	if (numero != base + ordem + digitos) return false;

	/* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS:
	 * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555,
	 * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
	 */
	algUnico = numero.charAt(0) != '0';
	for (i=1; i<NUM_DGT_CNPJ_BASE; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	if (algUnico) return false;

	/* Não será considerado válido CNPJ com número de ORDEM igual a 0000.
	 * Não será considerado válido CNPJ com número de ORDEM maior do que 0300
	 * e com as três primeiras posições do número BÁSICO com 000 (zeros).
	 * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
	 */
	if (ordem == "0000") return false;
	return (base == "00000000"
		|| parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000");
} 


function isHora3Digitos(pVal){

	var reTipo = /^\d{3}:\d{2}$/; 
	return reTipo.test(pVal);
	
}

/**
 * Formata a string fornecida como CNPJ ou CPF, adicionando zeros
 * à esquerda se necessário e caracteres separadores, conforme solicitado.
 * @param String pCpfCnpj
 * 	String fornecida para ser formatada.
 * @param boolean pUseSepar
 * 	Indica se devem ser usados caracteres separadores (. - /).
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String de CPF ou CNPJ devidamente formatada.
 */
function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	if (pUseSepar==null) pUseSepar = true;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var numero = unformatNumber(pCpfCnpj);

	numero = numero.lpad(maxDigitos, '0');
	if (!pUseSepar) return numero;

	if (pIsCnpj)
	{
		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
		numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5");
	}
	else
	{
		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
		numero = numero.replace(reCpf, "$1.$2.$3-$4");
	}
	return numero;
} 

/**
 * Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de
 * CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e
 * informa se o número-efetivo fornecido é CNPJ (default = false).
 * @param String pEfetivo
 * 	String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF.
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é de um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String com os dois dígitos verificadores.
 */
function dvCpfCnpj(pEfetivo, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	var i, j, k, soma, dv;
	var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITOS_CPF;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var calculado = formatCpfCnpj(pEfetivo, false, pIsCnpj);
	calculado = calculado.substring(2, maxDigitos);
	var result = "";

	for (j = 1; j <= 2; j++)
	{
		k = 2;
		soma = 0;
		for (i = calculado.length-1; i >= 0; i--)
		{
			soma += (calculado.charAt(i) - '0') * k;
			k = (k-1) % cicloPeso + 2;
		}
		dv = 11 - soma % 11;
		if (dv > 9) dv = 0;
		calculado += dv;
		result += dv
	}

	return result;
}



/* funcao para selecionar todos os checks por grupo */

function checkAll(form, grupo, check){
	var theForm = form;
    checklen=grupo.length;

	for(i=0; i<theForm.elements.length; i++){
	  if (theForm.elements[i].type=="checkbox")
	  {
		if (theForm.elements[i].name.substr(0,checklen)==grupo)
		{
			theForm.elements[i].checked = check.checked? true:false;
		}
	  }
	}
}

function returnAllchecked(form, grupo){
	var theForm = form;
    checklen=grupo.length;
	var list="";
	var list1=false;
	
	for(i=0; i<theForm.elements.length; i++){
		
	  if (theForm.elements[i].type=="checkbox")
	  {
		if (theForm.elements[i].name.substr(0,checklen)==grupo && theForm.elements[i].checked==true )
		{
			if (list1==true) list=list+",";
			list=list+theForm.elements[i].value;
			list1=true;
		}
	  }
	}
	return list;
}
