/**
* Globais
*/
var strTextAutoComplete;
var strNameDivAutoComplete;
var strNameIdInputAutoComplete;

var boolAjaxLoaded = true;

var intStartCount = 0;
var intFinishCount = 0;
var intDiffCount = 250; // diferença entre cada tecla (em milisegundos) para executar o ajax

/**
 * Retorna um inteiro que identifica a tecla pressionada
 *
 * @param handler de evento de tecla
 * @return integer
 */
function getIntKeyCode( keyEvent )
{
	var intKeyCode = ( ( keyEvent.which ) ? keyEvent.which : keyEvent.keyCode );
	if ( keyEvent.shiftKey )
	{
		intKeyCode += 1000;
	}
	return intKeyCode;
}

/**
 * Atribui foco à um determinado elemento a partir de uma tecla pressionada
 *
 * @param handler de evento de tecla
 * @param código do tecla para executar o foco
 * @param nome da div a ser focalizada 
 * @return bool
 */
function goToElementByKeyCode( event , intKeyCode , strId )
{
    // captura qual tecla foi pressionada a partir do evento
	var intKeyCodeEvent = getIntKeyCode( event );
	
	// caso tenha pressionado a determinada tecla e que exista a div a ser focalizada
	if( ( intKeyCodeEvent == intKeyCode ) && ( document.getElementById( strId ) != undefined ) )
	{
		document.getElementById( strId ).focus();
	}
	
	// teclas na qual não é necessária a execução do ajax
//	alert(intKeyCodeEvent);
	switch( intKeyCodeEvent )
	{
		case 8: 	// backspace
		case 16:	// shift
		case 17:	// ctrl
		case 18:	// alt
		case 20:	// caps lock
		case 27:	// esc
//		case 32:	// espaco
		case 33:	// page up
		case 34:	// page down
		case 35:	// end
		case 36:	// home
		case 37:	// esquerda
		case 38:	// cima
		case 39:	// direita
		case 40:	// baixo
		case 45:	// insert
		case 46:	// delete
		case 219:	// ´
		case 222:	// ~
		case 1035:	// shift + end
		case 1036:	// shift + home
		case 1037:	// shift + esquerda
		case 1038:	// shift + cima
		case 1039:	// shift + direita
		case 1040:	// shift + baixo
		case 1054:	// ¨
		case 1219:	// `
		case 1222:	// ^
		{
			return( false );
			break;
		}
	}
	
	// retorno da função
	return( true );
}

/**
 * Atribui foco à um determinado elemento a partir de uma tecla pressionada
 *
 * @param handler de evento de tecla
 * @param código do tecla para executar o foco
 * @param nome da div a ser focalizada 
 * @param objeto select
 * @return bool
 */
function goToElementByKeyCodeFromSelect( event , intKeyCode , strId , objElement )
{
	// captura qual tecla foi pressionada a partir do evento
	var intKeyCodeEvent = getIntKeyCode( event );
	
	// caso tenha pressionado a determinada tecla e que esteja selecionado o primeiro option do select
	if( ( intKeyCodeEvent == intKeyCode ) && ( objElement.selectedIndex == 0 ) )
	{
		document.getElementById( strId ).focus();
		return( false );
	}
	
	// retorno da função
	return( true );
}

/**
 * Função principal que realiza o ajax e visualiza o determinado div
 *
 * @param texto do input
 * @param nome da div a ser visualizada
 * @param nome do id do input a ser preenchido
 */
function autoComplete( strText , strNameDiv  , strNameIdInput )
{
	strTextAutoComplete = strText;
	strNameDivAutoComplete = strNameDiv;
	strNameIdInputAutoComplete = strNameIdInput;
	
	document.getElementById( strNameDivAutoComplete ).style.display = "none";
	
	var objDateStart = new Date();
	intStartCount = objDateStart.getTime();
	
/*	if( strText.length <= 1 )
	{
		intFinishCount = 0;
	}*/

	if( ( ( strText.length <= 1 ) || ( ( intStartCount - intFinishCount ) >= intDiffCount ) ) && ( boolAjaxLoaded == true ) )
	{
//		document.title += "|s(" + strText + "-" + ( intStartCount - intFinishCount ) + ")";
		
		boolAjaxLoaded = false;
		
//		ajax( "teste.php?texto=" + strText , strNameDiv );
		ajaxFunction( "../../include-site/autoComplete.php?texto=" + strText , "dataController" );
	}
	else
	{
//		document.title += "|n(" + strText + "-" + ( intStartCount - intFinishCount ) + ")";
//		document.getElementById( strNameIdInputAutoComplete ).value = strText;
		
		var objDateFinish = new Date();
		intFinishCount = objDateFinish.getTime();
	}
}

/**
 * Função que controla se o dado deverá ser visualizado somente no input ou também no select
 *
 * @param texto de retorno
 */
function dataController( strText )
{
	document.getElementById( strNameDivAutoComplete ).innerHTML = strText;
	
	var strTextCopy = new String( strText );
	var arrTextCopy = strTextCopy.split( "</option>" );
	var intCountOption = arrTextCopy.length;
	
	if( intCountOption != 1 )
	{
		// Caso sejam encontradas mais de uma opçao com o inicio daquela palavra
		if( intCountOption > 2 )
		{
			document.getElementById( strNameDivAutoComplete ).style.display = "block";
			document.getElementById( strNameIdInputAutoComplete ).value = strTextAutoComplete;
		}
		else
		{
			// Controle do texto visualizado no input
			var intLastCarac = arrTextCopy[ 0 ].lastIndexOf( ">" );
			var strFirstValue = arrTextCopy[ 0 ].substr( ( intLastCarac + 1 ) );
			
			if( removeSpecialChars( strTextAutoComplete.toLowerCase() ) == removeSpecialChars( strFirstValue.substr( 0 , strTextAutoComplete.length ).toLowerCase() ) )
			{
				var strFinalWord = strTextAutoComplete + strFirstValue.substr( strTextAutoComplete.length );
			}
			else
			{
				var strFinalWord = strTextAutoComplete;
			}

			document.getElementById( strNameIdInputAutoComplete ).value = strFinalWord;
			
			// Controle de foco e cursor
			document.getElementById( strNameIdInputAutoComplete ).focus();
			if( navigator.appName == "Netscape" )
			{
				if( document.getElementById( strNameIdInputAutoComplete ).setSelectionRange )
			    {
			        document.getElementById( strNameIdInputAutoComplete ).setSelectionRange( strTextAutoComplete.length , document.getElementById( strNameIdInputAutoComplete ).value.length );
			    }
			}
			else
			{
				if( document.getElementById( strNameIdInputAutoComplete ).createTextRange )
			    {
			        var objRange = document.getElementById( strNameIdInputAutoComplete ).createTextRange();
			        objRange.moveStart( "character" , strTextAutoComplete.length );
			        objRange.moveEnd( "character" , document.getElementById( strNameIdInputAutoComplete ).value.length );
			        objRange.select();
			    }
			}			
		}
	}
	
	boolAjaxLoaded = true;

	var objDateFinish = new Date();
	intFinishCount = objDateFinish.getTime();
}

/**
 * Remove as acentuações.
 * @param strOld String com acentos.
 * @return strNew String sem acentos.
 */
function removeSpecialChars( strOld )
{
	var arrSpecialWords = Array( 
		'Ã'	,	'Á' ,	'À' ,	'Â' ,	'Ä' , 
				'É' ,	'È' ,	'Ê' ,	'Ë' ,
				'Í' , 	'Ì' , 	'Î' ,	'Ï' ,
		'Õ' ,	'Ó' , 	'Ò' ,	'Ô' ,	'Ö' ,
				'Ú' ,	'Ù' ,	'Û' ,	'Ü' ,
				'Ç' ,	'Ñ'	
	);
	var arrSpecialLower = Array();
	for( var i = 0 ; i < arrSpecialWords.length ; ++i )
	{
		arrSpecialLower.push( arrSpecialWords[ i ].toLowerCase() );
	}

	var arrRegularWords = Array(
		'A'	,	'A' ,	'A' ,	'A' ,	'A' , 
				'E' ,	'E' ,	'E' ,	'E' ,
				'I' , 	'I' , 	'I' ,	'I' ,
		'O' ,	'O' , 	'O' ,	'O' ,	'O' ,
				'U' ,	'U' ,	'U' ,	'U'	,
				'C' ,	'N'
	);
	var arrRegularLower = Array();
	for( var i = 0 ; i < arrRegularWords.length ; ++i )
	{
		arrRegularLower.push( arrRegularWords[ i ].toLowerCase() );
	}

	var strNew = new String( strOld );
	for( var i = 0 ; i < arrSpecialWords.length ; ++i )
	{
		strNew = replaceAll( strNew , arrSpecialWords[ i ] , arrRegularWords[ i ] );
	}
	for( var i = 0 ; i < arrSpecialLower.length ; ++i )
	{
		strNew = replaceAll( strNew , arrSpecialLower[ i ] , arrRegularLower[ i ] );
	}
	
	return strNew;
}

/**
 * Substitui todas as ocorrencias de um string por outro
 *
 *@param  string strText
 *@param  string strFinder
 *@param  string strReplacer
 *@return string strNewText
 */
function replaceAll( strText , strFinder , strReplacer )
{
	strText += "";
	var strSpecials = /(\.|\*|\^|\?|\&|\$|\+|\-|\#|\!|\(|\)|\[|\]|\{|\}|\|)/gi;
	strFinder = strFinder.replace( strSpecials , "\\$1" )

	var objRegex = new RegExp( strFinder , "g" );
	
	return strText.replace( objRegex , strReplacer );
}