

var inputLista;
var v;
var nuevaBusqueda=1; 
var busqueda=null; 
var ultimaBusquedaNula=null;
var divLista;
var inputLista;



function txt_autocomplete_onFocus(obj){
	inputLista=obj;

/*	var imgTitulo = document.getElementById("imgTitulo");
	divLista.style.left = (inputLista.offsetLeft + imgTitulo.offsetLeft + 3) + "px";
	divLista.style.top = (inputLista.offsetTop + 3) + "px";
	divLista.style.position = "absolute";
*/
	var cord = findPos(inputLista);
	var t = 0;
	divLista.style.left = cord[0] + "px";
	t = (cord[1] * 1);
//	t+= (inputLista.height * 1 );	// le sumo el tamaņo del imputbox
	t += 20;
	divLista.style.top = t + "px";


	if(document.getElementById('lista').childNodes[0] != null && obj.value != '' ) 
	{ 
		filtraLista(obj.value); 
		formateaLista(obj.value); 
		reiniciaSeleccion(); 
		document.getElementById('lista').style.display = 'block'; 


	}
}


function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}

//	alert(" " + curleft + " " + curtop);

	return [curleft,curtop];
}


function txt_autocomplete_onBlur(obj){
	if(v==1) 
		document.getElementById('lista').style.display = 'none';
}


function txt_autocomplete_onKeyUp(obj, event){
	if( navegaTeclado(event) == 1 ) 
	{
		clearTimeout(ultimoIdentificador); 
		ultimoIdentificador = setTimeout('rellenaLista()', 1000); 
	}
}

function asignaVariables()
{
	// Funcion que asigna variables que se usan a lo largo de las funciones	
	v=1; nuevaBusqueda=1; busqueda=null; ultimaBusquedaNula=null;
	divLista=document.getElementById("lista");
	inputLista=document.getElementById("txtTema");
	elementoSeleccionado=0;
	ultimoIdentificador=0;

/*	imgTitulo = document.getElementById("imgTitulo");
	divLista.style.left = (inputLista.offsetLeft + imgTitulo.offsetLeft + 3) + "px";
	divLista.style.position = "absolute";
*/
}


function eliminaEspacios(cadena)
{
	var x=0, y=cadena.length-1;
	while(cadena.charAt(x)==" ") x++;	
	while(cadena.charAt(y)==" ") y--;	
	return cadena.substr(x, y-x+1);
}


function formateaLista(valor)
{
	// Funcion encargada de ir colocando en negrita las palabras y asignarle un ID a los elementos
	var x=0;
	var verificaExpresion=new RegExp("^("+valor+")", "i");
	
	while(divLista.childNodes[x]!=null)
	{
		// Asigo el ID para reconocerlo cuando se navega con el teclado
		divLista.childNodes[x].id = x+1;
		// Coloco en cada elemento de la lista en negrita lo que se haya ingresado en el input
//GB esto trae algun bardo... y llena de errores todo
//		divLista.childNodes[x].innerHTML = divLista.childNodes[x].innerHTML.replace(verificaExpresion, "<b>$1</b>");
		x++;
	}
}

function limpiaPalabra(palabra)
{
	if (palabra)
	{
		// Funcion encargada de sacarle el codigo HTML de la negrita a las palabras
		palabra=palabra.replace(/<b>/i, "");
		palabra=palabra.replace(/<\/b>/i, "");
	}
	return palabra;
}

function coincideBusqueda(palabraEntera, primerasLetras)
{
	/* Funcion para verificar que las primeras letras de busquedaActual sean iguales al
	contenido de busquedaAnterior. Se devuelve 1 si la verificacion es afirmativa */
	if(primerasLetras==null) 
		return 0;

	var verificaExpresion = new RegExp("^("+primerasLetras+")", "i");
	
	if(verificaExpresion.test(palabraEntera)) 
		return 1;
	else 
		return 0;
}

function nuevaCadenaNula(valor)
{
	/* Seteo cual fue la ultima busqueda que no arrojo resultados siempre y cuando la cadena
	nueva no comience con las letras de la ultima cadena que no arrojo resultados */
	if(coincideBusqueda(valor, ultimaBusquedaNula)==0) 
		ultimaBusquedaNula=valor;
}

function busquedaEnBD()
{
	/* Funcion encargada de verificar si hay que buscar el nuevo valor ingresado en la base
	de datos en funcion de los resultados obtenidos en la ultima busqueda y en base a que
	la cadena bsucada anteriormente este dentro de la nueva cadena */
	var valor=inputLista.value;
	
	if((coincideBusqueda(valor, busqueda)==1 && nuevaBusqueda==0) || coincideBusqueda(valor, ultimaBusquedaNula)==1) 
		return 0;
	else 
		return 1;
}

function filtraLista(valor)
{
	// Funcion encargada de modificar la lista de nombres en base a la nueva busqueda
	var x=0;

	while(divLista.childNodes[x]!=null)
	{
		// Saco la negrita a los elementos del listado
		divLista.childNodes[x].innerHTML=limpiaPalabra(divLista.childNodes[x].innerHTML);
		if(coincideBusqueda(limpiaPalabra(divLista.childNodes[x].innerHTML), valor)==0)
		{
			/* Si remuevo el elemento x, el elemento posterior pasa a ocupar la posicion de
			x, entonces quedaria sin revisar. Por eso disminuyo 1 valor a x */
			divLista.removeChild(divLista.childNodes[x]);
			x--;
		}
		x++;
	}
}

function reiniciaSeleccion()
{
	mouseFuera(); 
	elementoSeleccionado=0;
}

function navegaTeclado(evento)
{
	if ( ! evento )
		return 0;


	var teclaPresionada=(document.all) ? evento.keyCode : evento.which;
	
	switch(teclaPresionada)
	{
		case 40:
			if(elementoSeleccionado<divLista.childNodes.length)
			{
				mouseDentro(document.getElementById(parseInt(elementoSeleccionado)+1));
			}
			return 0;
		
		case 38:
			if(elementoSeleccionado>1)
			{
				mouseDentro(document.getElementById(parseInt(elementoSeleccionado)-1));
			}
			return 0;
		
		case 13:
			if(divLista.style.display=="block" && elementoSeleccionado!=0)
			{
				clickLista(document.getElementById(elementoSeleccionado))
			} 
			else 
			{
				if (divLista.style.display == 'none')
				{
					// si esta la lista cerrada
					mandarForm('buscar');
				}
			}
			return 0;
		
		default: 
			return 1;
	}
}	

function rellenaLista()
{
	var valor=inputLista.value;

	// Valido con una expresion regular el contenido de lo que el usuario ingresa
	var reg=/(^[a-zA-Z0-9.@ ]{2,40}$)/;
	if(!reg.test(valor)) 
	{
		divLista.style.display="none";
	}
	else
	{
		if(busquedaEnBD()==0)
		{	
			// Si no hay que buscar el valor en la BD
			busqueda=valor;
	
			// Hago el filtrado de la nueva cadena ingresada
			filtraLista(valor);
			// Si no quedan elementos para mostrar en la lista
			if(divLista.childNodes[0]==null) 
			{ 
				divLista.style.display="none"; 
				nuevaCadenaNula(valor); 
			}
			else 
			{ 
				reiniciaSeleccion(); 
				formateaLista(valor); 
			}
		}
		else
		{	
			/* Si se necesita verificar la base de datos, guardo el patron de busqueda con el que se
			busco y luego recibo en una variable si existen mas resultados de los que se van a mostrar */
			busqueda=valor;

			var ajax = ConstructorXMLHttpRequest();	//nuevoAjax();
			
			switch (inputLista.name)
			{
				case "txtAutor":
					ajax.open("POST", "busca_autor.php?", true);
					ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					ajax.send("txtAutor="+valor);
					break;
				case "txtBloqueAutor":
					ajax.open("POST", "busca_bloques.php?", true);
					ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					ajax.send("txtBloqueAutor="+valor);
					break;
				default:
					ajax.open("POST", "busca_temas.php?", true);
					ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					ajax.send("txtTema="+valor);
					break;
			}
			
		
			ajax.onreadystatechange=function()
			{	
				if (ajax.readyState==4)
				{
					//alert(ajax.responseText);
					if(!ajax.responseText) 
					{ 
						divLista.style.display="none"; 
					}
					else 
					{
						var respuesta=new Array(2);
						respuesta=ajax.responseText.split("&");

						/* Obtengo un valor que representa si tengo que ir a BD en las proximas 
						busquedas con cadena similar */
						nuevaBusqueda=respuesta[0];
				
						// Si se obtuvieron datos los muestro
						if(respuesta[1]!="vacio") 
						{ 
							divLista.style.display="block"; 
							divLista.innerHTML=respuesta[1]; 
							// Coloco en negrita las palabras
							reiniciaSeleccion();
							formateaLista(valor); 
						}
						else // En caso contrario seteo la busqueda actual como una busqueda sin resultados
						{
							nuevaCadenaNula(valor);
						}
					}
				}
			}
		}
	}
}

function clickLista(elemento)

{
	/* Se ejecuta cuando se hace clic en algun elemento de la lista. Se coloca en el input el
	valor del elemento clickeado */
	v=1;
	valor=limpiaPalabra(elemento.innerHTML); 
	busqueda=valor; 
	inputLista.value=valor;
	divLista.style.display="none";
	elemento.className="normal";
}

function mouseFuera()
{
	// Des-selecciono el elemento actualmente seleccionado, si es que hay alguno
	if(elementoSeleccionado!=0 && document.getElementById(elementoSeleccionado)) 
		document.getElementById(elementoSeleccionado).className="normal"; 
}

function mouseDentro(elemento)
{
	mouseFuera();
	elemento.className="resaltado";
	// Establezco el nuevo elemento seleccionado
	elementoSeleccionado=elemento.id;
}



