/*========================================================================
	TECLADO VIRTUAL UNIFICADO
========================================================================*/

var objAryTeclado = new Array() //Representa o teclado
var objAryFont = new Array()		//Caracteres possíveis para o teclado
var objAryCoord	= new Array()		//Coordenadas(x,y) dos caracters
var objAryStatus = new Array()	//Imagens das formas que o teclado pode assumir
var objAryCampos = new Array()	//Os campos que o teclado vai ser utilizado
var intCampoAtual = 0						//Indice do objeto(textbox) que estamos atualmente 
var intOtherX = -3;             //Controla posição do campo
var aryCharacters = new Array();


function CarregarCaractersTeclado()
{
	//Caracters do teclado
	objAryFont[0] = new Array("'", unescape("%22"))
	objAryFont[1] = new Array(1,"!")
	objAryFont[2] = new Array(2,"@")
	objAryFont[3] = new Array(3,"#")
	objAryFont[4] = new Array(4,"$")
	objAryFont[5] = new Array(5,"%")
	objAryFont[6] = new Array(6,"¨")
	objAryFont[7] = new Array(7,"&")
	objAryFont[8] = new Array(8,"*")
	objAryFont[9] = new Array(9,"(")
	objAryFont[10] = new Array(0,")")
	objAryFont[11] = new Array("-","_")
	objAryFont[12] = new Array("=","+")
	objAryFont[13] = new Array("q","")
	objAryFont[14] = new Array("w","")
	objAryFont[15] = new Array("e","")
	objAryFont[16] = new Array("r","")
	objAryFont[17] = new Array("t","")
	objAryFont[18] = new Array("y","")
	objAryFont[19] = new Array("u","")
	objAryFont[20] = new Array("i","")
	objAryFont[21] = new Array("o","")
	objAryFont[22] = new Array("p","")
	objAryFont[23] = new Array("´","`")
	objAryFont[24] = new Array("[","{")
	objAryFont[25] = new Array("<-","")
	objAryFont[26] = new Array("a","")
	objAryFont[27] = new Array("s","")
	objAryFont[28] = new Array("d","")
	objAryFont[29] = new Array("f","")
	objAryFont[30] = new Array("g","")
	objAryFont[31] = new Array("h","")
	objAryFont[32] = new Array("j","")
	objAryFont[33] = new Array("k","")
	objAryFont[34] = new Array("l","")
	objAryFont[35] = new Array("ç","")
	objAryFont[36] = new Array("~","^")
	objAryFont[37] = new Array("]","}")
	objAryFont[38] = new Array("RET","")
	objAryFont[39] = new Array("\\","|")
	objAryFont[40] = new Array("z","")
	objAryFont[41] = new Array("x","")
	objAryFont[42] = new Array("c","")
	objAryFont[43] = new Array("v","")
	objAryFont[44] = new Array("b","")
	objAryFont[45] = new Array("n","")
	objAryFont[46] = new Array("m","")
	objAryFont[47] = new Array(",","<")
	objAryFont[48] = new Array(".",">")
	objAryFont[49] = new Array(";",":")
	objAryFont[50] = new Array("/","?")
	objAryFont[51] = new Array("RET","")
	objAryFont[52] = new Array("CAPS","")
	objAryFont[53] = new Array("CAPS","")
	objAryFont[54] = new Array("CAPS","")
	objAryFont[55] = new Array("SHIFT","")
	objAryFont[56] = new Array("SHIFT","")
	objAryFont[57] = new Array("SHIFT","")
	objAryFont[58] = new Array(" ","")
	objAryFont[59] = new Array(" ","")
	objAryFont[60] = new Array(" ","")
	objAryFont[61] = new Array(" ","")
	objAryFont[62] = new Array(" ","")
	objAryFont[63] = new Array(" ","")
	objAryFont[64] = new Array(" ","")
}

function MapearTeclado(intPosVertInicialOrig,intPosHozInicialOrig,intDesloca,intFator,blnOffLine,intLarguraHozTcl,intLarguraVerTcl)
{
	intPosVertInicialOrig = parseInt(intPosVertInicialOrig+Math.round(Math.random()*intFator))				//Posição vertical do teclado(inicial+aleatorio)
	intPosHozInicialOrig  = parseInt(intPosHozInicialOrig+intDesloca+Math.round(Math.random()*intFator))//Posição horizontal do teclado(inicial+aleatorio)

	//Correção da posição do teclado na versão 4.5(IE MAC)
	if ( SeMac()=="MAC" && QualVersao()<5 )
	{
		intPosVertInicialOrig -= 50;
	}

	//Mapea o Teclado conforme a posição atual calculada
		
	var intPosVertInicial = intPosVertInicialOrig
	var intPosHozInicial = intPosHozInicialOrig
	var intPosVertInicialOld = intPosVertInicialOrig
	var intX1,intY1,intX2,intY2

	for (var intIndex=0;intIndex<65;intIndex++)
	{
		intX1 = intPosVertInicial
		intY1 = intPosHozInicial
		intX2 = parseInt(intPosVertInicial+parseInt(intLarguraVerTcl-2))
		intY2 = parseInt(intPosHozInicial+parseInt(intLarguraHozTcl-2))

		objAryCoord[intIndex] = new Array(intX1,intY1,intX2,intY2,objAryFont[intIndex][0],objAryFont[intIndex][1])

		intPosVertInicial+=intLarguraVerTcl

		if ((parseInt(intIndex+1)%13)==0 && intIndex != 0) 
		{
			intPosHozInicial+=intLarguraHozTcl
			intPosVertInicial = intPosVertInicialOld
		}	
	}
	//Mostra o teclado na página
	EscreverTeclado(intPosVertInicialOrig,intPosHozInicialOrig,blnOffLine)
}

//Altera o status do teclado NORMAL,SHIFT,CAPSLOCK,SHIT-CAPSLOCK
function AlterarStatus(strTecla)
{
	switch(strTecla)
	{
		case "CAPS":
			if (objAryStatus[0][0]) //NORMAL
			{
				TrocarTeclado(1)
				objAryStatus[0][0] = false
				objAryStatus[1][0] = true
				return true			
			}
			if (objAryStatus[2][0]) //SHIFT
			{
				if (document.imgTeclado.complete)
				{
					TrocarTeclado(3)
					objAryStatus[3][0] = true
					objAryStatus[2][0] = false
					return true
				}
				else
				{
					alert("Imagem carregando.Um momento")
					return false
				}	
			}
			if (objAryStatus[3][0]) //CAPS - SHIFT
			{
				if (document.imgTeclado.complete)
				{
					TrocarTeclado(2)
					objAryStatus[2][0] = true
					objAryStatus[3][0] = false
					return true
				}
				else
				{
					alert("Imagem carregando.Um momento")
					return false
				}	
					
			}
			else
			{
				TrocarTeclado(0)
				objAryStatus[0][0] = true
				objAryStatus[1][0] = false
				return true
			}	
			break
		case "SHIFT":
			if (objAryStatus[0][0]) //Normal
			{
				TrocarTeclado(2)
				objAryStatus[0][0] = false
				objAryStatus[2][0] = true
				return true
			}
			if (objAryStatus[1][0]) //CAPS
			{
				TrocarTeclado(3)
				objAryStatus[3][0] = true
				objAryStatus[1][0] = false
				return true
			}
			if (objAryStatus[3][0]) //CAPS - SHIFT
			{
				TrocarTeclado(1)
				objAryStatus[1][0] = true
				objAryStatus[3][0] = false
				return true
			}
			else
			{
				TrocarTeclado(0) //NORMAL
				objAryStatus[0][0] = true
				objAryStatus[2][0] = false
				return true
			}	
			break
	}
	return true
}

//Troca a imagem
function TrocarTeclado(intIndex)
{
	document.imgTeclado.src = objAryTeclado[intIndex].src
	return true
}

//Responde a interação do usuário com o teclado virtual 
function ManipularTeclado(evnt)
{
	var blnImg = false
	var blnRet = false
	
	if(navigator.appName == 'Netscape')
	{
		if (evnt.target.name == "imgTeclado" || evnt.target == "javascript:void(13)")
			blnImg = true;
		else
			return true;
	}
	else
	{
		if(window.event.srcElement.tagName == "IMG")
			blnImg = true
	}
	
	if(blnImg)
	{
		if(navigator.appName == 'Netscape')
		{
			var x  = parseFloat(parseInt(evnt.pageX)) 
			var y  = parseFloat(parseInt(evnt.pageY)) 
		}
		else
		{
			var x  = parseFloat(parseInt(event.x) + parseFloat(document.body.scrollLeft))
			var y  = parseFloat(parseInt(event.y) + parseFloat(document.body.scrollTop))
		}	

		for (var intIndex=0;intIndex<objAryCoord.length;intIndex++)
		{
			if ((x >= objAryCoord[intIndex][0] && x <= objAryCoord[intIndex][2]) && (y >= objAryCoord[intIndex][1] && y <= objAryCoord[intIndex][3]))
			{
				switch (objAryCoord[intIndex][4])
				{
					case "<-":
					  if (navigator.appName == 'Netscape')
					  {
					    if ( (eval("document.forms[0]."+objAryCampos[intCampoAtual][0]+".type == 'text'"))||(eval("document.forms[0]."+objAryCampos[intCampoAtual][0]+".type == 'password'")) )
						    eval("document.forms[0]."+objAryCampos[intCampoAtual][0]+".value=document.forms[0]."+objAryCampos[intCampoAtual][0]+".value.substring(0,parseInt(document.forms[0]."+objAryCampos[intCampoAtual][0]+".value.length)-1)")
						}
						else
						  ApagarPosicao(intOtherX, eval("document.forms[0]."+objAryCampos[intCampoAtual][0]));

						break;

					case "RET":
						AtualizaObj();
						setTimeout("eval('document.forms[0]."+objAryCampos[intCampoAtual][0]+".focus()');",10)
						blnRet = true;
						break

					case "CAPS":
						AlterarStatus("CAPS") 	
						break

					case "SHIFT":
						AlterarStatus("SHIFT")
						break
					
					default:
						if (objAryStatus[0][0]) //Normal
						{	
							AtualizarValor(objAryCoord[intIndex][4])
						}
									
						if (objAryStatus[1][0] && isNaN(objAryCoord[intIndex][4]))
						{
							AtualizarValor(objAryCoord[intIndex][4].toUpperCase())
						}

						if (objAryStatus[1][0] && !isNaN(objAryCoord[intIndex][4]))
						{
							AtualizarValor(objAryCoord[intIndex][4])
						}

						if (objAryStatus[2][0])
						{
							if (objAryCoord[intIndex][5] != "")
							{
								AtualizarValor(objAryCoord[intIndex][5])
							}
							else
							{
								if (isNaN(objAryCoord[intIndex][4]))
								{
									AtualizarValor(objAryCoord[intIndex][4].toUpperCase())
								}
								else //Números
								{
									AtualizarValor(objAryCoord[intIndex][4])
								}
							}	
							AlterarStatus("SHIFT")
						}

						if (objAryStatus[3][0])
						{
							if (objAryCoord[intIndex][5] != "")
							{
								AtualizarValor(objAryCoord[intIndex][5])
							}
							else
							{
								if (isNaN(objAryCoord[intIndex][4]))
								{
									AtualizarValor(objAryCoord[intIndex][4].toUpperCase())
								}
								else //Números
								{
									AtualizarValor(objAryCoord[intIndex][4])
								}
							}	
							AlterarStatus("SHIFT")
						}

				}//switch
			}
		}	
	}
	else
	{
	  if(navigator.appName == 'Netscape')
	    return true;
	  else
	  {
      if ( (window.event.srcElement.value != '')&&
           ( (window.event.srcElement.type == 'text')||(window.event.srcElement.type == 'password') ) 
         )
      {
		    // Versão IE >= 5.5
		    if (parseFloat(navigator.appVersion.split(" ")[3]) >= 5.5)
		      window.event.srcElement.fireEvent('onfocus');
		    else
		    {
          for (var intCont=0; intCont<objAryCampos.length;intCont++)
          {
            if (objAryCampos[intCont][0] == window.event.srcElement.name)
              AtualizaObj(intCont);
          }
		    }


		    if (aryCharacters[objAryCampos[intCampoAtual][0]].replace(/#/g, '').length == 0)
		      intOtherX = -2;
		    else
		      intOtherX = -1;
        
	      var aryMaxPos = new Array(0, -1);
	      

		    if(intOtherX == -2)
		    {
			    return true;
		    }

		    intOtherX = -1;
	      
	      var aryTmp = aryCharacters[objAryCampos[intCampoAtual][0]].split("#");
	      var intCoefDesloc = 0;

	      for (var intCont=0; intCont<aryTmp.length; intCont++)
	      {
	        if (aryTmp[intCont] != '')
	        {
	          aryMaxPos[0] = aryTmp[intCont].split('%')[1];
	          aryMaxPos[1] = intCont;
	        }
	        
	        intCoefDesloc = parseInt((aryTmp[intCont].split('%')[1] - aryTmp[intCont].split('%')[0]) / 2)
	        if ( (window.event.offsetX >= (parseInt(aryTmp[intCont].split('%')[0]) + intCoefDesloc))&&
	             (window.event.offsetX < (parseInt(aryTmp[intCont].split('%')[1]) + intCoefDesloc)) )
			      intOtherX = intCont;
	      }

        if (window.event.offsetX > aryMaxPos[0])
          intOtherX = aryMaxPos[1]
      }
      else
      {
        if ( (window.event.srcElement.type != 'text')&&(window.event.srcElement.type != 'password') )
        {
          //if (intOtherX > -2)
            intOtherX = -3;
        }
        else
        {
          if (intOtherX >= -3)
            intOtherX = -1;
        }
      }
      

      return true;
	  }
	}
	
	if (!blnRet)
	{
	  if (intOtherX > -3)
	    setTimeout("eval('document.forms[0]." + objAryCampos[intCampoAtual][0] + ".focus()')", 10);
	}

	return false;
}

//Adiciona o valor para o campo atual muda o foco
function AtualizarValor(strValor)
{
	switch(objAryCampos[intCampoAtual][2])
	{
		case "A": //Alfanumérico
			if(eval("document.forms[0]."+objAryCampos[intCampoAtual][0]+".value.length") < parseInt(objAryCampos[intCampoAtual][1]))
			{
			  var objTargetField = new Object(eval("document.forms[0]."+objAryCampos[intCampoAtual][0]));
			  
			  if (navigator.appName == 'Netscape')
				  objTargetField.value += strValor;
			  else
			  {
			    if (intOtherX == -3)
			      return false;


				  if ( (intOtherX == -2)&&(objTargetField.value.length > 0) )
				    objTargetField.value += strValor;
				  else
				  {
				    if (intOtherX == -2)
				      intOtherX = -1;				
				

				    //Adiciona character onde cursor esta
				    if (intOtherX > -1)
              objTargetField.value = objTargetField.value.substr(0, intOtherX + 1) + strValor + objTargetField.value.substr(intOtherX + 1);
            else
				      objTargetField.value = strValor + objTargetField.value;


				    InserirValor(intOtherX, strValor, objTargetField);

				    //Posiciona o cursor no novo character
				    var oTextRange = objTargetField.createTextRange();
				    oTextRange.move("character", (intOtherX + 1));
				    oTextRange.select();
				  }
			  }
			}
			if(eval("document.forms[0]."+objAryCampos[intCampoAtual][0]+".value.length") == parseInt(objAryCampos[intCampoAtual][1]))
			{
				if (intOtherX > -3)
	      {
				  AtualizaObj()
				  setTimeout("eval('document.forms[0]."+objAryCampos[intCampoAtual][0]+".focus()');", 10)
	      }
			}
			break;
	  	
		case "N": //Numerico
			if (eval("parseInt(document.forms[0]."+objAryCampos[intCampoAtual][0]+".value.length)") < parseInt(objAryCampos[intCampoAtual][1]))
			{
				if (escape(strValor)=="%27")
				{
					eval("document.forms[0]."+objAryCampos[intCampoAtual][0]+".value+=ValidarNum(\"" + strValor + "\")")
				}
				else
				{
				  if (strValor == String.fromCharCode(92))
				    strValor += '\\';

				  var objTargetField = new Object(eval("document.forms[0]."+objAryCampos[intCampoAtual][0]));
					  
			    if (navigator.appName == 'Netscape')
			      objTargetField.value += ValidarNum(eval("'" + strValor + "'"));
			    else
			    {
			      if (intOtherX == -3)
			        return false;


			      if (ValidarNum(eval("'" + strValor + "'")) != '')
			      {
				      if ( (intOtherX == -2)&&(objTargetField.value.length > 0) )
				        objTargetField.value += strValor;
				      else
				      {
				        if (intOtherX == -2)
				          intOtherX = -1;				


				        //Adiciona character onde cursor esta
				        if (intOtherX > -1)
                  objTargetField.value = objTargetField.value.substr(0, intOtherX + 1) + ValidarNum(eval("'" + strValor + "'")) + objTargetField.value.substr(intOtherX + 1);
                else
				          objTargetField.value = ValidarNum(eval("'" + strValor + "'")) + objTargetField.value;

	              InserirValor(intOtherX, ValidarNum(eval("'" + strValor + "'")), objTargetField);
				    
                //Posiciona o cursor no novo character
                var oTextRange = objTargetField.createTextRange();
                oTextRange.move("character", (intOtherX + 1));
                oTextRange.select();
              }
            }
			    }
				}	
			}	
	  			
			if (eval("parseInt(document.forms[0]."+objAryCampos[intCampoAtual][0]+".value.length)") == parseInt(objAryCampos[intCampoAtual][1]))
			{
				if (intOtherX > -3)
	      {
				  AtualizaObj()
				  setTimeout("eval('document.forms[0]."+objAryCampos[intCampoAtual][0]+".focus()');",10)
	      }
			}
			break;
	}
	  
	return true;
}

//Atualiza o objeto que esta com o foco
function AtualizaObj(evn)
{
	if (arguments.length > 0)
	{
    intCampoAtual = arguments[0];

		if ( ((eval("document.forms[0]." + objAryCampos[intCampoAtual][0] + ".type == 'text'"))||
		      (eval("document.forms[0]." + objAryCampos[intCampoAtual][0] + ".type == 'password'"))
		     )&&(intOtherX == -3)
		   )
      intOtherX = -1;
    else if ( (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length > 0'))&&
		          (aryCharacters[objAryCampos[intCampoAtual][0]].replace(/#/g, '').length == 0) 
		        )
      intOtherX = -2;
    else if ( (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length > 0'))&&
		          (aryCharacters[objAryCampos[intCampoAtual][0]].replace(/#/g, '').length > 0)
		        )
		{
		  var objSelection = document.selection.createRange();
		  if ( (objSelection.text.length > 0)&&(objSelection.text.length == eval('document.forms[0].' + objAryCampos[intCampoAtual][0]).value.length) )
        intOtherX = (eval('document.forms[0].' + objAryCampos[intCampoAtual][0]).value.length - 1);
    }
    //else if (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length == 0'))
      //intOtherX = -1;
  }
	else
	{
		if (parseInt(parseInt(objAryCampos.length)-1) == parseInt(intCampoAtual))
			intCampoAtual	= 0;
		else
			intCampoAtual = parseInt(intCampoAtual)+1;

		if ( (eval("document.forms[0]." + objAryCampos[intCampoAtual][0] + ".type != 'text'"))&&
		     (eval("document.forms[0]." + objAryCampos[intCampoAtual][0] + ".type != 'password'"))
		   )
		{
		  intOtherX = -1;
		  return true;
		}
		if ( (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length > 0'))&&
		     (aryCharacters[objAryCampos[intCampoAtual][0]].replace(/#/g, '').length == 0) 
		   )
		  intOtherX = -2;
		else
		  intOtherX = -1;
	}
	
	return true;
}

function EscreverTeclado(intPosVertInicialOrig,intPosHozInicialOrig,blnOffLine)
{
	//Imprime o teclado na página conforme o navegador
	if (navigator.appName == 'Netscape')
	{
		window.captureEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP)
			
		if (parseFloat(navigator.appVersion.split(" ")[0]) < 5)
		{
			if (!blnOffLine)
			{
				//document.writeln('<STYLE type="text/css">#posicaotcl { position:absolute; left:'+intPosVertInicialOrig+'; top:'+intPosHozInicialOrig+';}</STYLE>')
				document.writeln('<layer id="posicaotcl" left="'+intPosVertInicialOrig+'" top="'+intPosHozInicialOrig+'" ><A HREF="javascript:void(13)"><img name="imgTeclado" border="0" src="'+objAryStatus[0][1]+'"></A></layer>')
			}
			else
			{
				var objLyr = document.posicaotcl
				objLyr.top = intPosHozInicialOrig
				objLyr.left = intPosVertInicialOrig
			}
		}		
		else //Netscape > 5.0
		{	
			if (!blnOffLine)
			{
				document.writeln('<layer id="posicaotcl" style="position:absolute; left:'+intPosVertInicialOrig+'; top:'+intPosHozInicialOrig+';" ><a href="javascript:void(13)"><img name="imgTeclado" border="0" src="'+objAryStatus[0][1]+'"></a></layer>')
			}	
			else
			{
				//document.posicaotcl.top = intPosHozInicialOrig
				//document.posicaotcl.left = intPosVertInicialOrig
			}	
		}	

		window.onmousedown = ManipularTeclado
	}
	else
	{
		//IE
		if (!blnOffLine)
			document.writeln('<div id=divTeclado style="cursor:hand; width:284;height:93;position:absolute; left:'+intPosVertInicialOrig+'; top:'+intPosHozInicialOrig+'" ><img name="imgTeclado" border="0" src="'+objAryStatus[0][1]+'"></div>')
		else
		{
			divTeclado.style.top = intPosHozInicialOrig
			divTeclado.style.left = intPosVertInicialOrig
		}	
		
		var agt=navigator.userAgent.toLowerCase();

		//Windows
		if( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) )
		{
			document.imgTeclado.ondblclick = ManipularTeclado
			document.onmousedown = ManipularTeclado    		
		}
		//Mac
		else		
		{          
			document.onmousedown = ManipularTeclado			
		}		
				
    		document.onkeydown = ManipularTecladoKey
	}
}	

//Adiciona os campos nos quais o teclado vai ser usuado
//Formato da entrada para um campo Nome%Tamanho%Tipo
function CarregarCampos()
{
	for(intIndex=0;intIndex<arguments.length;intIndex++)
	{
		objAryCampos[intIndex] = new Array(arguments[intIndex].split("%")[0],arguments[intIndex].split("%")[1],arguments[intIndex].split("%")[2])
		
		if ( (eval('document.forms[0].' + arguments[intIndex].split("%")[0]).type == 'password')||
		     (eval('document.forms[0].' + arguments[intIndex].split("%")[0]).type == 'text') )
      IniciarCampo(arguments[intIndex].split("%")[0], (parseInt(arguments[intIndex].split("%")[1])-1), true);
	}
}

//Carrega as imagens do teclado
function CarregarImagens()
{
	var blnSel;
	for(intIndex=0;intIndex<arguments.length;intIndex++)
	{
		//Imgens que representa os status do Teclado
		if (intIndex == 0) blnSel = true
		else blnSel = false
		objAryStatus[intIndex] = new Array(blnSel,arguments[intIndex])
	}	

	//Carrega as imagens do Teclado no cliente
	for (var intIndex=0;intIndex<objAryStatus.length;intIndex++)
	{
		objAryTeclado[intIndex] = new Image() 
		objAryTeclado[intIndex].src = objAryStatus[intIndex][1]
	}
}

//Validar Números
function ValidarNum(intVal)
{
	if(isNaN(intVal) || intVal == " ")
	  return "";
	else
	  return intVal;
}

function TecladoVirtual(intPosVertInicial,intPosHozInicial,intDeslocamento,intFatorCorrecao,blnOffLine,intLarguraHozTcl,intLarguraVerTcl)
{
	CarregarCaractersTeclado()
	MapearTeclado(intPosVertInicial,intPosHozInicial,intDeslocamento,intFatorCorrecao,blnOffLine,intLarguraHozTcl,intLarguraVerTcl)
}

function ApagarPosicao(intX, objTarget)
{
  if ( ((objTarget.type != 'text')&&(objTarget.type != 'password'))||(intOtherX == -3) )
    return true;
  
  var aryTmp = aryCharacters[objTarget.name].split("#");

  var strValor = '';
  if (intX >= 0)
  {
    aryTmp[intX] = '';
    aryCharacters[objTarget.name] = aryTmp.join("#");

    if (intX == (aryTmp.length-1))
      objTarget.value = objTarget.value.substring(0, (objTarget.value.length-1));
    else
    {
      if ( (intX == 0)&&(parseFloat(navigator.appVersion.split(" ")[3]) == 4) )
        objTarget.value = objTarget.value.substring(1);
      else
      {
        var oTextRange = objTarget.createTextRange();
        oTextRange.move("character", intX);
        oTextRange.expand("character");
        strValor = oTextRange.text;
        oTextRange.execCommand("Delete");
      }
      
      Reindexar(intX, objTarget);
    }
    
    intOtherX--;
    

    return true;
  }
  else 
  {
	  if (objTarget.value.length > 0)
	  {
	    objTarget.value = objTarget.value.substring(0,parseInt(objTarget.value.length)-1);

			//Posiciona o cursor no novo character
			var oTextRange = objTarget.createTextRange();
			oTextRange.move("character", objTarget.value.length);
			oTextRange.select();
    }
  }
  
  return true;
}

function ManipularTecladoKey()
{
  var objAtual = new Object(eval('document.forms[0].' + objAryCampos[intCampoAtual][0]));
  if ( ((objAtual.type != 'text')&&(objAtual.type != 'password'))||(intOtherX == -3) )
    return true;


  var intXAnterior = intOtherX;
  var intMaxPos = 0;
  
  var aryTmp = aryCharacters[objAryCampos[intCampoAtual][0]].split("#");
  
  for (var intCont=0; intCont<=aryTmp.length-1; intCont++)
  {
    if (aryTmp[intCont] != '')
      intMaxPos = intCont;
  }

  switch (window.event.keyCode)
  {
    case 8: // BackSpace
      var objSelection = document.selection.createRange();
      if (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length == ' + objSelection.text.length))
      {
        intOtherX = -1;
        
        IniciarCampo(objAryCampos[intCampoAtual][0], objAryCampos[intCampoAtual][1]);
      }
      else
      {
        if (intOtherX >= 0)
          intOtherX--;
      }
      break;
    case 46: // Del
      var objSelection = document.selection.createRange();
      if (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length == ' + objSelection.text.length))
      {
        intOtherX = -1;
        
        IniciarCampo(objAryCampos[intCampoAtual][0], objAryCampos[intCampoAtual][1]);
      }
      break;
    case 37: // <-
      if (intOtherX >= 0)
        intOtherX--;
      break;
    case 39: // ->
      if (intOtherX < intMaxPos)
        intOtherX++;
      break;
    case 36: // Home
      intOtherX = -1;
      break;
    case 35: // End
      intOtherX = intMaxPos;
      break;
    case 33: // PgUp
      intOtherX = -1;
      break;
    case 34: // PgDown
      intOtherX = intMaxPos;
      break;
    case 20: //Caps Lock
      break;
    case 9: //Tab
		  if ( (eval("document.forms[0]." + objAryCampos[intCampoAtual][0] + ".type != 'text'"))&&
		       (eval("document.forms[0]." + objAryCampos[intCampoAtual][0] + ".type != 'password'"))
		     )
		  {
		    intOtherX = -1;
		    break;
		  }
		  if ( (eval('document.forms[0].' + objAryCampos[intCampoAtual][0] + '.value.length > 0'))&&
		       (aryCharacters[objAryCampos[intCampoAtual][0]].replace(/#/g, '').length == 0) 
		     )
		    intOtherX = -2;
		  else
		    intOtherX = -1;

      break;
  }

  if (((window.event.keyCode >= 48)&&(window.event.keyCode <= 57))    ||
      ((window.event.keyCode >= 65)&&(window.event.keyCode <= 90))    ||
      ((window.event.keyCode >= 96)&&(window.event.keyCode <= 107))   ||
      ((window.event.keyCode >= 108)&&(window.event.keyCode <= 111))  ||
      ((window.event.keyCode >= 186)&&(window.event.keyCode <= 194))  ||
      ((window.event.keyCode >= 219)&&(window.event.keyCode <= 223))  ||
      (window.event.keyCode == 226)                                   ||
      (window.event.keyCode == 32))
  {
    if (eval('document.forms[0].' + objAryCampos[intCampoAtual][0]).value.length < objAryCampos[intCampoAtual][1])
    {    
	    intOtherX = -2;

	    IniciarCampo(objAryCampos[intCampoAtual][0], (parseInt(objAryCampos[intCampoAtual][1])-1));
	  }
  }

  if (intXAnterior == -2)
    intOtherX = intXAnterior;

  return true;
}

function FuncaoPixel(strEntr)
{
  var aryPixels = new Array();
  
  aryPixels[0] = ['4', 'il'];
  aryPixels[1] = ['5', 'fjt,. !'];
  aryPixels[2] = ['6', '/|\\-;:r()"IJ[]'];
  aryPixels[3] = ['7', '?cszFLç'];
  aryPixels[4] = ['8', 'EPTY'];
  aryPixels[5] = ['9', '&ABHNRSUVXZK'];
  aryPixels[6] = ['10', 'w+=#<>CDGMOQÇ~^'];
  aryPixels[7] = ['11', '@'];
  aryPixels[8] = ['12', 'mW'];
  aryPixels[9] = ['13', '%'];

  if (strEntr == "'")
	  return 4;


  for (var intCont=0; intCont<=9; intCont++)
  {
    if (aryPixels[intCont][1].indexOf(strEntr) > -1)
      return parseInt(aryPixels[intCont][0]);
  }
  
  return 8;
}

function Replicate(intQtd, strChar)
{
  var strReplicate = '';
  
  for (var intCont=0; intCont<intQtd; intCont++)
    strReplicate += strChar;
    
  return strReplicate;
}

function Reindexar(intX, objTarget)
{
  var blnAux = false;
  var intTotal = 0;
  var intCoefDif = 0;
  var aryTmp = aryCharacters[objTarget.name].split("#");
  
  if (intX > 0)
    intCoefDif = parseInt(aryTmp[intX+1].split('%')[0]) - parseInt(aryTmp[intX-1].split('%')[1]);
  else
    intCoefDif = parseInt(aryTmp[intX+1].split('%')[0]) - 1;
    
  intTotal = aryTmp.length - 1;

  for (var intCont=intX; intCont<=intTotal; intCont++)
  {
    blnAux = false;
    
    if (intCont == intTotal)
      blnAux = true;
      
    if (!blnAux)
      blnAux = (aryTmp[intCont+1] != '')
    else
      blnAux = false;
      
    if (blnAux)
    {
      if (intCont > 0)
        aryTmp[intCont] = (parseInt(aryTmp[intCont+1].split('%')[0])-intCoefDif) + '%' + (parseInt(aryTmp[intCont+1].split('%')[1])-intCoefDif);
      else
        aryTmp[intCont] = '0%' + (parseInt(aryTmp[intCont+1].split('%')[1])-intCoefDif);
    }
    else
      aryTmp[intCont] = '';
  }
  aryCharacters[objTarget.name] = aryTmp.join("#");

  return true;
}

function Reindexar2(intX, objTarget)
{
  var intTotal = 0;
  var intCoefDif = 0;
  var aryTmp = aryCharacters[objTarget.name].split("#");

  intCoefDif = parseInt(aryTmp[intX].split('%')[1]) - parseInt(aryTmp[intX+1].split('%')[0]);
  intTotal = aryTmp.length - 1;
  
  for (var intCont=(intX+1); intCont<=intTotal; intCont++)
  {
    if (aryTmp[intCont] != '')
    {
      if ((intCont-1) > 0)
        aryTmp[intCont] = (parseInt(aryTmp[intCont].split('%')[0])+intCoefDif) + '%' + (parseInt(aryTmp[intCont].split('%')[1])+(intCoefDif));
      else
      {
        aryTmp[intCont] = (parseInt(aryTmp[intCont].split('%')[0])+intCoefDif) + '%' + (parseInt(aryTmp[intCont].split('%')[1])+(intCoefDif-1));
        intCoefDif--;
      }
    }
    else
      aryTmp[intCont] = '';
  }
  aryCharacters[objTarget.name] = aryTmp.join("#");

  return true;
}

function Deslocar(intX, objTarget)
{
  var aryTmp = aryCharacters[objTarget.name].split("#");

  for (var intCont=(aryTmp.length-1); intCont>=intX; intCont--)
  {
    if (aryTmp[intCont] != '')
      aryTmp[intCont+1] = aryTmp[intCont];
  }
  
  aryTmp[intX] = '';

  aryCharacters[objTarget.name] = aryTmp.join("#");

  return true;
}

function InserirValor(intX, strValor, objTarget)
{
  var intPosFimAnt = 0;
  var intPosAtual = 0;
  var blnReindex = false;
  var blnAux = false;
  var blnAux2 = false;


  if (intX == -1)
  {
    intX++;
    blnAux2 = true;
  }
  
  var aryTmp = aryCharacters[objTarget.name].split("#");

  //deslocar valores para cima
  if (blnAux2)
    blnAux = (aryTmp[0] != '');
  else
    blnAux = (aryTmp[intX+1] != '');
    
  if (blnAux)
  {
    if (blnAux2)
      Deslocar(0, objTarget);
    else
      Deslocar((intX+1), objTarget);

    blnReindex = true;
  }

  aryTmp = aryCharacters[objTarget.name].split("#");
  
  if (blnAux2)
    blnAux = false;
  else
    blnAux = (aryTmp[intX] != '')

  if (blnAux)
    intPosFimAnt = aryTmp[intX].split("%")[1];


  //-1 pelo deslocamento, portanto não fica com a mesma qtde de px
  if (objTarget.type == 'password')
    intPosAtual = (FuncaoPixel('*') - 1);
  else
    intPosAtual = (FuncaoPixel(strValor) - 1);
    

  if (blnAux2)
    aryTmp[0] = (intPosFimAnt + '%' + (parseInt(intPosFimAnt) + intPosAtual + 1));
  else
    aryTmp[intX+1] = (intPosFimAnt + '%' + (parseInt(intPosFimAnt) + intPosAtual));
    	              
  aryCharacters[objTarget.name] = aryTmp.join("#");
  	              
  if (blnReindex)
  {
    if (blnAux2)
      Reindexar2(0, objTarget);
    else
      Reindexar2((intX+1), objTarget);
  }

  intOtherX++;
}

function IniciarCampo(strCampo, intTamanho)
{
  aryCharacters[strCampo] = Replicate(intTamanho, '#');
  

  var objTarget = new Object(eval('document.forms[0].' + strCampo));
  var intTamCampo = objTarget.value.length;
  var strValor = '';
  if ( (arguments.length == 3)&&(arguments[2])&&(intTamCampo > 0) )
  {
    var intOtherXAnt = intOtherX;
    intOtherX = -1;
    
    for (var intCont=0; intCont<intTamCampo; intCont++)
    {
      strValor = objTarget.value.charAt(intCont);

      InserirValor(intOtherX, strValor, objTarget);
    }
    
    intOtherX = intOtherXAnt;
    //document.forms[0].hdnTeste.value = aryCharacters[strCampo];
  }
}