// imagem utilizada para sinalizar erro de preenchimento
var HINT_ICON = 'erro.gif'

// referencia para o primeiro hint de erro
var gPrimHint = null;

/*******************************************
// Comportamento do Hint
//******************************************/			
function showHint(e,msg){
var hint = window.createPopup();					
	var top = 0, left = 0;   
	if (!e) { 
		e = window.event; 
	}   
	var myTarget = e.currentTarget;   
	if (!myTarget) {    
		myTarget = e.srcElement;   
	}   else if (myTarget == "undefined") {    
		myTarget = e.srcElement;   
	}   
	while(myTarget!= document.body) {      
		top += myTarget.offsetTop;      
		left += myTarget.offsetLeft;  
		myTarget = myTarget.offsetParent;   
	}  
	var re  = /\n/gi;
	altura =  montaAlturaHint(msg);
	msg = msg.replace(re, "<br>");
	msg = msg.replace('ƒ', "<br>");
	left += -190;
	top  += +25;
	var popupBody = hint.document.body
	
	
	popupBody.className ="popUP";

	var hintMsg 		= hint.document.createElement("div");		
	hintMsg.innerHTML 	= msg;
	hint.document.body.appendChild(hintMsg);		
	hint.document.body.style.color 			= HINT_FONTCOLOR;
	hint.document.body.style.fontSize 		= HINT_FONTSIZE;	
	hint.document.body.style.color 			= HINT_FONTCOLOR;	
	hint.document.body.style.background 	= HINT_BACKGROUND;
	hint.document.body.style.border 		= HINT_BORDER;
	hint.document.body.style.padding 		= HINT_TEXTPADDING;
	hint.document.body.style.fontFamily		= HINT_FONTFAMILY

	//popupBody.outerHTML = hintStyle.outerHTML + popupBody.outerHTML;
	//popupBody.innerHTML = "<span>" + msg + "</span>";
	hint.show(left,top, 200, 50);// document.body);

	//alert(hint.document.location);


}

function hideHint(){
	hint.hide();
}


function montaAlturaHint(msg){
	var str = msg;
	var delim = "/gi"
	var regexp = eval("/" + "<br>" + delim)
	var resultArray = str.match(regexp)
	if (resultArray) {
		altura = ((resultArray.length  + 0.2) * 30);
	} else {
		altura = 30;
	}
	return altura
}


/***************************************************************
// Limpa Hints da Tela (necessário para efeito de click do NOVO
//
// parâmetros:
//	(document) doc = documento HTML de onde se deseja eleminar 
//                       os hints
//*************************************************************/
function clearAllErrorHints(oDoc){
	// verifica se a referência ao documento
	// a ser modificado é válida
	if(oDoc) {
		// obtém coleção de spans no documento
		var oSpans = oDoc.getElementsByTagName('span');
		// laço entre a coleção de spans do documento
		for(i=0; i < oSpans.length; i++) {
			// verifica se o span tem um tipo
			//(pode ser um hint de erro..)
			if(oSpans[i].tipo) {
				// otem o tipo do span
				var tipo = oSpans[i].tipo.toLowerCase();
				// verifica se o span é um hint de erro
				if(tipo == 'hint-erro') {
					// remove a span do documento
					oSpans[i].outerHTML = "";
					//Decremente o i, pois a coleção 'Spans' é diminiuda quando um span é removida
					i--;
				}
			}
		}
	}
}


///*******************************************************************************************
// Cria hint (imagem com TITLE) para exibição de erros de 
// preenchimento (imagem pode ser definida pela constante
// HINT_ICON desta biblioteca): posiciona um ícone ao lado
// do campo indicado.
//
// parâmetros:
// (string)	sCampoErro	= nome do campo com erro
// (string)	sMessage	= mensagem de erro	
// (string)	sValor		= caso o valor de 'sValor' seja valido, cria o hint eh criado
//							somente se o valor do campo for igual a sValor
// (int)	iPos		= possição do campo (sCampoErro) no array js de campos
// (char)	tTipo		= tipo do hint (Icone ou Texto) usar as contantes:
//							TP_ICONE e TP_TEXTO
// (string)	sHtml		= HTML que será exibido antes do hint (normalmente "<br>" para 
//							forçar que o hint aparece na linha de baixo
//*******************************************************************************************/
var TP_ICONE = 'I';
var TP_TEXTO = 'T';

function criaHintErro(sCampoErro, sMessage, sValor, iPos, tTipo, blContainer){
	
	//Caso nenhum Tipo tenho sido definido, define TP_ICONE como padrão
	if(!tTipo){
		tTipo = TP_ICONE;
	}
	
	if (!(sValor)){
		// formulário com erro....
		var formErro = "document.forms.frmTela";
		
		// verifica se o campo foi informado
		if (sCampoErro != ""){
			
			// obtem referencia ao campo indicado
			objeto 	= eval(formErro + "."  + sCampoErro);
			
			// obtem referencia para o conteiner onde será colocado o hint
			if(blContainer){
				//eval("objContainer = document.getElementById('"+sCampoErro+"_erro');");
				//eval("objContainer = document.all."+sCampoErro+"_erro;");
				eval("objContainerAux = document.getElementsByTagName('span');");
				
				var sNomeContainer;
				var iTotal = -1;
				var arrEncontrado = new Array();
				
				for(var iAux = 0; iAux < objContainerAux.length; iAux++){
					sNomeContainer = sCampoErro+"_erro";
					if(objContainerAux[iAux].id == sNomeContainer){
						iTotal = iTotal + 1;
						arrEncontrado[iTotal] = objContainerAux[iAux];
					}
				}
				
				if(iTotal == 0){
					objContainer = arrEncontrado[0];
				}else{
					objContainer = arrEncontrado;
				}
				
			}else{
				objContainer = null;
			}
			
			// verifica se a referencia ao campo foi obtida
			if (objeto  == "[object]"){
				
				if(isFieldArray(objeto)){
					// cria/configura tag do hint
					var oSpan = document.createElement("span");
					
					// Verifica o tipo e coloca o HTML q será mostrado
					if (tTipo == TP_TEXTO){
						oSpan.innerHTML = sMessage;
					}else{
						oSpan.innerHTML = "<img src='"+HINT_ICON+"' title='"+sMessage+"' class='popUP'>";
					}
					// Seta o tipo p/ 'hint-erro' para por ser identidicado e removido
					oSpan.tipo		= 'hint-erro';
					// Seta o classe
					oSpan.className	= "popUP";
					// Seta a title
					oSpan.title		= sMessage;
					
					if(isFieldArray(objContainer)) {
						//Adiciona o Span ao lado do Campo
						if(objContainer){
							objContainer[iPos].appendChild(oSpan);
						}else{
							objeto[iPos].parentElement.appendChild(oSpan);
						}
					} else {
						objContainer.appendChild(oSpan);
					}
				}else{
					// cria/configura tag do hint
					var oSpan = document.createElement("span");
					
					// Verifica o tipo e coloca o HTML q será mostrado
					if (tTipo == TP_TEXTO){
						oSpan.innerHTML = sMessage;
					}else{
						oSpan.innerHTML = "<img src='"+HINT_ICON+"' title='"+sMessage+"' class='popUP'>";
					}
					// Seta o tipo p/ 'hint-erro' para por ser identidicado e removido
					oSpan.tipo		= 'hint-erro';
					// Seta o classe
					oSpan.className	= "popUP";
					// Seta a title
					oSpan.title		= sMessage;
					
					//Adiciona o Span ao lado do Campo
					if(objContainer){
						objContainer.appendChild(oSpan);
					}else{
						objeto.parentElement.appendChild(oSpan);
					}
				}
			}
		}
	}else{
		// formulário com erro....
		var formErro = "document.forms.frmTela";
		
		// verifica se o campo foi informado
		if (sCampoErro != ""){
			
			// obtem referencia ao campo indicado
			objeto 	= eval(formErro + "."  + sCampoErro);
			
			// obtem referencia para o conteiner onde será colocado o hint
			if(blContainer){
 				eval("objContainer = document.getElementById('"+sCampoErro+"_erro');");
			}else{
				objContainer = null;
			}
					
			if (objeto.length>1){
				for (var i=0; i<objeto.length; i++){
					// verifica se a referencia ao campo foi obtida
					if (objeto  == "[object]"){
						
						if (objeto[i].value == sValor){
							// cria/configura tag do hint
							var oSpan = document.createElement("span");
							
							// Verifica o tipo e coloca o HTML q será mostrado
							if (tTipo == TP_TEXTO){
								oSpan.innerHTML = sMessage;
							}else{
								oSpan.innerHTML = "<img src='"+HINT_ICON+"' title='"+sMessage+"' class='popUP'>";
							}
							// Seta o tipo p/ 'hint-erro' para por ser identidicado e removido
							oSpan.tipo		= 'hint-erro';
							// Seta o classe
							oSpan.className	= "popUP";
							// Seta a title
							oSpan.title		= sMessage;
							
							//Adiciona o Span ao lado do Campo
							if(objContainer){
								objContainer[i].appendChild(oSpan);
							}else{
								objeto[i].parentElement.appendChild(oSpan);
							}
						}
					}
				}
			}else{
				// verifica se a referencia ao campo foi obtida
				if (objeto  == "[object]"){
					
					if (objeto.value == sValor){
						// cria/configura tag do hint
						var oSpan = document.createElement("span");
						
						// Verifica o tipo e coloca o HTML q será mostrado
						if (tTipo == TP_TEXTO){
							oSpan.innerHTML = sMessage;
						}else{
							oSpan.innerHTML = "<img src='"+HINT_ICON+"' title='"+sMessage+"' class='popUP'>";
						}
						// Seta o tipo p/ 'hint-erro' para por ser identidicado e removido
						oSpan.tipo		= 'hint-erro';
						// Seta o classe
						oSpan.className	= "popUP";
						// Seta a title
						oSpan.title		= sMessage;
						
						//Adiciona o Span ao lado do Campo
						if(objContainer){
							objContainer.appendChild(oSpan);
						}else{
							objeto.parentElement.appendChild(oSpan);
						}
					}
				}
			}
		}
	}

        // verifica se não possui referência para um hint
        if(gPrimHint == null) {
                // obtem referência para o hint criado
                gPrimHint = objeto;
        } else {
                // estava dando erro em algumas circunstancias
                if(objeto != null) {
                        // verifica se o hint criado(objeto) está mais acima do que o hint referenciado (gPrimHint)
                        if(GetHintTopPosition(gPrimHint) > GetHintTopPosition(objeto)) {
                                // atualiza referencia - o hint criado está mais acima
                                gPrimHint = objeto;
                        }
                }
        }
}

/***************************************************************                                                  
// Obtem a posicao do TOP(y) do hint indicado pelo param                                                          
//                                                                                                                
// parâmetros:                                                                                                    
//      (object) objElement = referência ao hint que se deseja                                                    
//                            saber a posição Y                                                                   
//
// retorno: (int) posição Y do hint indicado no param                                                             
//*************************************************************/                                                  
function GetHintTopPosition(objElement){                                                                          
        var y = 0;                                                                                                
        var obj = objElement;                                                                                     
                                                                                                                  
        // acontecia um bug em algumas circunstancias ao acessar                                                  
        // .offsetParent (unspecified error): o bloco try foi                                                     
        // colocado para ignorar ele.                                                                             
        try {                                                                                                     
                // laco entre os elementos pais para obter a posicionamento                                       
                // de cada um e calcular o posicionamento de objElement                                           
                while (obj.offsetParent != null) {                                                                
                        y += obj.offsetTop;                                                                       
                        obj = obj.offsetParent;                                                                   
                }                                                                                                 
                                                                                                                  
                                                                                                                  
                // prepara a variavel para retorno                                                                
                y += obj.offsetTop;                                                                               
        }                                                                                                         
        catch(e) {                                                                                                
        }                                                                                                         
                                                                                                                  
        return y;                                                                                                 
}  


/***************************************************************
// Posiciona a tela no primeiro hint que aparece no formulário
// (de cima para baixo)
//*************************************************************/
function exibePrimeiroHintErro() {
        // verifica se o documento foi carregado para executar ações sem erro
        if(document.readyState == 'complete') {
	
		// verifica se existe o primeiro hint (existe pelo menos um...)
      	  	if(gPrimHint != null) {
                	// executa scroll na tela para a posicao (x,y)
                	window.scrollTo(0,GetHintTopPosition(gPrimHint)-30);
        	}
	}
}


/***************************************************************
// adiciona o eventHandler no carregamento do documento para
// tratar o posicionamento no primeiro hint de erro
//*************************************************************/
try {
        document.attachEvent('onreadystatechange',exibePrimeiroHintErro);
} catch(ex) {
	document.readyState = 'complete';  	
	//window.onload = exibePrimeiroHintErro();
	//document.addEventListener('load',exibePrimeiroHintErro,true);
}
