/*
Objetivo:				Trabalhar com campos de formulario
Data Criacao:			11/03/2002
Data Atualizacao:		29/07/2005
*/


/**************************************************************
 variaveis
**************************************************************/
var objMascarado = null;
var mascara = "";
var ultTecla = 0;
var enterAutotab = false;


// cod para teclas
var codCima = 38;
var codEsquerda = 37;
var codDireita = 39;
var codBaixo = 40;
var codEspaco = 32;
var codEnter = 13;
var codTab = 9;
var codHome = 36;
var codEnd = 35;
var codPageUp = 33;
var codPageDown = 34;
var codEsc = 27;
var codShift = 16;
var codCtrl = 17;
var codAlt = 18;
var codCaps = 20;
var codBackSpace = 8;
var codDelete = 46;


/***************************************************************************
 desabilitar auto completar dos campos texto
***************************************************************************/
function setAutoCompletar(valor)
{
	var autoCompletar = valor ? "on" : "off";

	if (document.getElementById('conteudoPagina') && parent.document.getElementById('iConteudo') )
	    parent.document.getElementById('iConteudo').height = document.getElementById('conteudoPagina').scrollHeight;
	
	if (document.getElementsByTagName) {
		var inputElements = document.getElementsByTagName("input");
		for (i=0; inputElements[i]; i++) {
			inputElements[i].setAttribute("autocomplete", autoCompletar);
		}
	}
}



/**************************************************************
 habilita o ENTER para auto_tab
**************************************************************/
function setEnterAutotab()
{
	enterAutotab = true;
}



/**************************************************************
 tabulacao automatica entre os campos
**************************************************************/
function autotab(obj, maxlength)
{
	var form, prox_obj = null;
	var i, j;
	

	if (!obj) return false;
	form = obj.form;
	if (!form) return false;


	// autotab invertido ?
	if (ultTecla == codBackSpace)
	{
		autotabInvertido(obj);
		//alert(1);
		return false;
	}
	
	// verificar se nao e uma tecla especial
	if (teclasEspeciais(ultTecla, obj))
	{
		return false;
	}


	obj.value = obj.value.substr(0, maxlength);
	
	if (obj.type != "text" && obj.type != "textarea")
	{
		if (obj.type != "select-one")
			return false;
	}
	else
	{
		if (maxlength > obj.value.length)
			return false;
	}
	
	for (i = 0; i < form.length; i++)
	{
		if (form[i] == obj)
			break;
	}
	
	for (j = i + 1; j < form.length; j++)
	{
		if (form[j].type != "hidden" && !form[j].readOnly)
		{
			prox_obj = form[j];
			break;
		}
	}
	
	if (prox_obj) prox_obj.focus();
	
	return true;
}


/**************************************************************
 tabulacao automatica invertida entre os campos
**************************************************************/
function autotabInvertido(obj)
{
	var form, obj_ant = null;
	var i, j;
	
	if (!obj) return false;
	form = obj.form;
	if (!form) return false;


	if (obj.type != "text" && obj.type != "textarea")
	{
		//if (obj.type != "select-one")
			return false;
	}
	
	if (obj.value.length > 0)
		return false;
	
	// encontrar o objeto anterior
	for (i = 0; i < form.length; i++)
	{
		if (form[i] == obj)
		{
			obj_ant = form[i - 1];
			if (!obj_ant || obj_ant.name != obj.name)
				return false;
				
			obj_ant.focus();
			var temp = obj_ant.value;
			obj_ant.value = "";
			obj_ant.value = temp;
			
			break;
		}
	}
	
	return true;
}


/**************************************************************
 funcao que guarda o objeto e mascara
**************************************************************/
function mascarar(obj, masc)
{
	objMascarado = obj;
	mascara = masc;

	if (mascara == 'CAIXAALTA')
	{
		obj.style.textTransform = "uppercase";
		obj.onblur = caixaAlta;
	}
	else if (mascara == 'CAIXABAIXA')
	{
		obj.style.textTransform = "lowercase";
		obj.onblur = caixaBaixa;
	}
}




/**************************************************************
 retorna a tecla digitada
**************************************************************/
function getTecla(evt)
{
	if (evt)
		return evt.which;
	else
		return event.keyCode;
}



/**************************************************************
 retorna o elemento de formulario atual
**************************************************************/
function getElementoForm(evt)
{
	if (evt)
		return evt.target;
	else
		return event.srcElement;
}


/**************************************************************
 verifica se esta tudo certo para tratar a mascara
**************************************************************/
function mascararOk(tecla, obj)
{
	if (!obj || obj != objMascarado || obj.type != "text" || mascara.length == 0 /*|| tecla == 0 || tecla == 27*/)
		return false;
				
	return true;
}


/**************************************************************
 verifica se o usuario digitou alguma tecla especial
**************************************************************/
function teclasEspeciais(tecla, obj)
{
	switch(tecla)
	{
		case codCima:
		case codEsquerda:
		case codDireita:
		case codBaixo:
		//case codEnter:
		case codTab:
		case codHome:
		case codEnd:
		case codPageUp:
		case codPageDown:
		case codEsc:
		case codShift:
		case codCtrl:
		case codAlt:
		case codCaps:
		case codBackSpace:
		case codDelete:
		{
			return true;
			break;
		}
		
	}
	
	return false;
}






/**************************************************************
 formata caixa alta
**************************************************************/
function caixaAlta()
{
	this.value = this.value.toUpperCase();
	return true;
}


/**************************************************************
 formata caixa baixa
**************************************************************/
function caixaBaixa()
{
	this.value = this.value.toLowerCase();
	return true;
}


function virgula2Ponto(campo)
{
	campo.value=campo.value.replace(/\,/, '.');
}

/**************************************************************
* TROCA ENTER POR TAB NO CAMPO ESPECIFICADO
**************************************************************/
function Tab2Enter (field, event) {
	var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	if (keyCode == 13) {
		var i;
		for (i = 0; i < field.form.elements.length; i++)
		{
			if (field == field.form.elements[i])
				break;
	
		}

		i = (i + 1) % field.form.elements.length;

		while (field.form.elements[i].type == 'hidden') 
			i++;

		if (field.form.elements[i-1].type == 'textarea')
			return true;

		field.form.elements[i].focus();
		return false;
	}
	else
		return true;
}
 

/**************************************************************
 tratamento para mascara (filtro)
**************************************************************/
function keypress(evt)
{
	var tecla = getTecla(evt);
	var obj = getElementoForm(evt);
	
	if (!mascararOk(tecla, obj))
		return true;
		
	if (tecla == codEnter)
		return true;
	
	/*if (teclasEspeciais(tecla, obj))
		return true;*/
	if (tecla == 0 || tecla == codBackSpace)
		return true;

	// pegar o caracter da tecla digitada
	var ch = String.fromCharCode(tecla);
		
	// tratar mascara
	switch(mascara)
	{
		case "MOEDA":
		case "REAL":
		{
			// expressao regular para moeda
			if (ch == ",")
				return (obj.value.indexOf(",") == -1);
			
			var re = /^[\d\,]+$/;
			return re.test(ch);
	
			break;
		}
		
		case "TELEFONE":
		case "CEP":
		case "CNPJ":
		case "INTEIRO":
		case "NUMERICO":
		{
			var re = /^[\d]+$/;
			return re.test(ch);
			
			break;
		}
		
		
		/*case "TELEFONE":
		{
			// expressao regular para telefone
			var re = /^[\d \-]+$/;
			return re.test(ch);
			
			break;
		}*/
		
		
		case "CAIXAALTA":
		case "CAIXABAIXA":
		{
			//return !(tecla > 125 || tecla == 96);
			return true;
			
			break;
		}
		
		
		case "DATA":
		{
			// expressao regular para telefone
			if (ch == "/")
			{
				var re = /\/.*\//;
				return !re.test(obj.value); 
			}
			
			var re = /^[\d]+$/;
			return re.test(ch);
			
			break;
		}
	}
	

	return true;
}





/**************************************************************
 tratamento de teclas especiais
**************************************************************/
function keydown(evt)
{
	var tecla = getTecla(evt);
	var obj = getElementoForm(evt);
	ultTecla = tecla;
	if (tecla == codEnter)
	{
		if (enterAutotab && obj.type == 'textarea')
			return true;
		else
		{
			if (enterAutotab && obj.type == "button")
				return true;
			else if (enterAutotab && obj.type != "submit")
			{
				if (obj.value != undefined)
				{
					autotab(obj, obj.value.length);
					return false;
				}
			}
			else if (enterAutotab && obj.type == "submit")
			{
				if (obj && obj.form && ((obj.form.onsubmit == undefined) || (obj.form.onsubmit())))
					obj.form.submit();
					
				return true;
			}
		}	
	}
	
	return true;
}



/**************************************************************
 colocar o foco no primeiro elemento do formulario
 que nao seja campo oculto
**************************************************************/
function focarFormulario()
{
	var form = document.forms[0];
	var obj;

	for (var i = 0; i < form.length; i++)
	{
		obj = form[i];
		if (obj.type != "hidden" && obj.type != "submit" && obj.type != "button" && !obj.readOnly && !obj.disabled && !obj.invisible)
		{
			obj.focus();
			break;
		}

	}
	
	return true;
}



/**************************************************************
 assinalar os eventos abaixo as funcoes
**************************************************************/
document.onkeypress = keypress;
//document.onkeyup = keyup;
document.onkeydown = keydown;





/***************************************************************************
 TRABALHAR COM ALTERACAO DE FORMULARIO
***************************************************************************/


/***************************************************************************
 funcao que engatilha todos os campos de um formulario para registrar uma
 alteracao no mesmo
***************************************************************************/
function engatilharAlteracaoForm(form)
{
	var i;
	
	if (!form)
		form = document.forms[0];
	
	if (!form || form.name.length == 0 || !form._alterado)
		return;
		
	// registrar evento para cada campo de formulario
	for (i = 0; i < form.length; i++)
	{
		var obj = form[i];
		var evento = "";
		
		if ((obj.type.indexOf("text") != -1) || (obj.type.indexOf("password") != -1))
		{
			evento = "change"; // "keypress"
		}
		else if (obj.type == "select-one" || obj.type == "select-multiple" || obj.type == "radio" || obj.type == "checkbox")
		{
			evento = "change";
		}
		
		if (evento != "")
		{
			if (obj.addEventListener)
			{
				obj.addEventListener(evento, function () {registrarAlteracaoForm(obj.form)}, false);
			}
			else if (obj.attachEvent)
			{
				obj.attachEvent("on" + evento, function () {registrarAlteracaoForm(obj.form)});
			}
		}
		
		
		/*var temp = "";
		for (prop in obj)
			if (prop.indexOf("on") > -1)
				temp += " " + prop;
				
		temp += " Tipo: " + obj.type;
		if (obj.type != "text")
			alert(temp);*/
	}
}


/***************************************************************************
 funcao que registra uma alteracao no formulario
***************************************************************************/
function registrarAlteracaoForm(form)
{
	if (!form)
		return;
		
	if (!form._alterado)
		return false;
		
	form._alterado.value = "1";
}


/***************************************************************************
 funcao para saber se formulario foi alterado
***************************************************************************/
function verificarAlteracaoForm(form)
{
	if (!form)
		form = document.forms[0];
		
	if (!form._alterado)
		return false;
		
	return form._alterado.value == "1";
}



/***************************************************************************
 Posicao do Formulario em relacao ao deslizamento de barras de rolagem
***************************************************************************/

/**
* ajustar posicao
*/
function ajustarPosicao(form)
{
	if (!form)
		form = document.forms[0];
		
	if (!form._posX || !form._posY)
		return;
		
	if (!document.documentElement)
		return;
	
	var posX = parseInt(form._posX.value);
	var posY = parseInt(form._posY.value);
	
	window.scrollTo(posX, posY);
}


/**
* gravar posicao
*/
function gravarPosicao(form)
{

	if (!form)
		form = document.forms[0];
		
	if (!form._posX || !form._posY)
		return;
	
	var posicoes = posicaoAtual();
	
	form._posX.value = posicoes[0];
	form._posY.value = posicoes[1];
}


/**
* le posicoes da tela
*/
function posicaoAtual()
{
	var posicoes = new Array();
	posicoes[0] = (window.pageXOffset) ? (window.pageXOffset) : document.body.scrollLeft;
	posicoes[1] = (window.pageYOffset) ? (window.pageYOffset) : document.body.scrollTop;
	
	return posicoes;
}


/***************************************************************************
 Validacao de formulario
***************************************************************************/


/**
* funcao de encontrar um objeto adapatado do Macromedia DreamWeaver
*/
function MM_findObj(n, d) { //v4.01
  /*var p,i,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=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;*/
	for (var i = 0; i < document.forms.length ; i++)
	{
		for (var j = 0; j < document.forms[i].length ; j++)
		{
			if (document.forms[i][j].name == n)
			{
					return document.forms[i][j];
			}
		}
	}
	
	if (document.getElementById) 
	{
		return document.getElementById(n);
	}

	return "";
}

/**
* funcao de validar formulario adapatado do Macromedia DreamWeaver
*/
function MM_validateForm() { //v4.0
  var i,p,q,nm,test,num,min,max,pobj=null,obj=null,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; obj=val=MM_findObj(args[i]);
    if (val) { nm=MM_findObj("label_"+args[i]); if (nm) nm=nm.innerHTML; if ((val=val.value)!="") {
      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
        if (p<1 || p==(val.length-1)) errors+='- o campo \''+nm+'\' precisa ser um endereço de e-mail.\n';
      } else if (test!='R') { num = parseFloat(val);
        if (isNaN(val)) errors+='- o campo \''+nm+'\' deve conter um número.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- o campo \''+nm+'\' deve conter um número entre '+min+' e '+max+'.\n';
    } } } else if (test.charAt(0) == 'R') errors += '- o campo \''+nm+'\''+(obj.type.indexOf('select') != -1 ? ' deve ser selecionado.\n' : ' deve ser preenchido.\n'); }
	if (pobj == null && errors != '') pobj=obj;
  } if (errors) { alert('Erro:\n'+errors); pobj.focus(); }
  document.MM_returnValue = (errors == '');
}

	
	
/* VALIDAÇÕES */
/*
*    Script:    Mascaras em Javascript
*    Autor:    Matheus Biagini de Lima Dias
*    Data:    26/08/2008
*    Obs:    
*/
    /*Função Pai de Mascaras*/
    function Mascara(o,f){
        v_obj=o
        v_fun=f
        setTimeout("execmascara()",1)
    }
    
    /*Função que Executa os objetos*/
    function execmascara(){
        v_obj.value=v_fun(v_obj.value)
    }
    
    /*Função que Determina as expressões regulares dos objetos*/
    function leech(v){
        v=v.replace(/o/gi,"0")
        v=v.replace(/i/gi,"1")
        v=v.replace(/z/gi,"2")
        v=v.replace(/e/gi,"3")
        v=v.replace(/a/gi,"4")
        v=v.replace(/s/gi,"5")
        v=v.replace(/t/gi,"7")
        return v
    }
    
    /*Função que permite apenas numeros*/
    function Integer(v){
        return v.replace(/\D/g,"")
    }
    
    /*Função que padroniza telefone (11) 4184-1241*/
    function Telefone(v){
        v=v.replace(/\D/g,"")                 
        v=v.replace(/^(\d\d)(\d)/g,"($1) $2") 
        v=v.replace(/(\d{4})(\d)/,"$1-$2")    
        return v
    }
    
    /*Função que padroniza telefone (11) 41841241*/
    function TelefoneCall(v){
        v=v.replace(/\D/g,"")                 
        v=v.replace(/^(\d\d)(\d)/g,"($1) $2")    
        return v
    }
    
    /*Função que padroniza CPF*/
    function Cpf(v){
        v=v.replace(/\D/g,"")                    
        v=v.replace(/(\d{3})(\d)/,"$1.$2")       
        v=v.replace(/(\d{3})(\d)/,"$1.$2")       
                                                 
        v=v.replace(/(\d{3})(\d{1,2})$/,"$1-$2") 
        return v
    }
    
    /*Função que padroniza CEP*/
    function Cep(v){
        v=v.replace(/D/g,"")                
        v=v.replace(/^(\d{5})(\d)/,"$1-$2") 
        return v
    }
    
    /*Função que padroniza CNPJ*/
    function Cnpj(v){
        v=v.replace(/\D/g,"")                   
        v=v.replace(/^(\d{2})(\d)/,"$1.$2")     
        v=v.replace(/^(\d{2})\.(\d{3})(\d)/,"$1.$2.$3") 
        v=v.replace(/\.(\d{3})(\d)/,".$1/$2")           
        v=v.replace(/(\d{4})(\d)/,"$1-$2")              
        return v
    }
    
    /*Função que permite apenas numeros Romanos*/
    function Romanos(v){
        v=v.toUpperCase()             
        v=v.replace(/[^IVXLCDM]/g,"") 
        
        while(v.replace(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"")!="")
            v=v.replace(/.$/,"")
        return v
    }
    
    /*Função que padroniza o Site*/
    function Site(v){
        v=v.replace(/^http:\/\/?/,"")
        dominio=v
        caminho=""
        if(v.indexOf("/")>-1)
            dominio=v.split("/")[0]
            caminho=v.replace(/[^\/]*/,"")
            dominio=dominio.replace(/[^\w\.\+-:@]/g,"")
            caminho=caminho.replace(/[^\w\d\+-@:\?&=%\(\)\.]/g,"")
            caminho=caminho.replace(/([\?&])=/,"$1")
        if(caminho!="")dominio=dominio.replace(/\.+$/,"")
            v="http://"+dominio+caminho
        return v
    }

    /*Função que padroniza DATA*/
    function Data(v){
        v=v.replace(/\D/g,"") 
        v=v.replace(/(\d{2})(\d)/,"$1/$2") 
        v=v.replace(/(\d{2})(\d)/,"$1/$2") 
        return v
    }
    
    /*Função que padroniza DATA*/
    function Hora(v){
        v=v.replace(/\D/g,"") 
        v=v.replace(/(\d{2})(\d)/,"$1:$2")  
        return v
    }
    
    /*Função que padroniza valor monétario*/
    function Valor(v){
        v=v.replace(/\D/g,"") //Remove tudo o que não é dígito
        v=v.replace(/^([0-9]{3}\.?){3}-[0-9]{2}$/,"$1.$2");
        //v=v.replace(/(\d{3})(\d)/g,"$1,$2")
        v=v.replace(/(\d)(\d{2})$/,"$1.$2") //Coloca ponto antes dos 2 últimos digitos
        return v
    }
    
    /*Função que padroniza Area*/
    function Area(v){
        v=v.replace(/\D/g,"") 
        v=v.replace(/(\d)(\d{2})$/,"$1.$2") 
        return v
        
    }	

	function mostrarFormulario(id) {
		document.getElementById("carregando").style.display = "none";
		document.getElementById(id).style.display = "";
	}
	
	function callAjax(div, divAni, nomeFuncao, valor, nomeForm, tipoValor,carregando)
	{

		if (nomeForm != "")
			valor = "xajax.getFormValues('"+nomeForm+"',true)";

		document.getElementById(div).style.display = 'none';
		if (carregando == "SIMPLES")
			document.getElementById(divAni).innerHTML = HTMLCarregando;
		else	
			document.getElementById(divAni).innerHTML = HTMLCarregando + '&nbsp; <span class="Atencao"> Aguarde ...</atencao>';	

		if (tipoValor == "string")
			valor = "'"+valor+"'";
		

		if (valor == "")	
			funcao = "xajax_"+nomeFuncao+"('"+div+"', '"+divAni+"')";		
		else	
			funcao = "xajax_"+nomeFuncao+"('"+div+"', '"+divAni+"',"+valor+")";

		eval(funcao);
	}
	
