/*****************************************************************************/
/*                                2010 Shio2e                                */
/*                      JAVASCRIPT SUGERENCIAS BUSCADOR                      */
/*****************************************************************************/
var sugerenciasBuscador = {
	// VARIABLES CONFIGURACION
	cantidad_resultados : 5,
	tiempo_guarda_consulta : 200, // ms

	// VARIABLES INTERNAS
	id_campo_formulario : '',
	mensaje_x_defecto : '',
	modo : 'buscador',
	timer : null,
	inicializado : false,
	listado_elementos_mostrados : 0,
	listado_elementos_seleccionado : -1,
	raton_encima : false,

	// FUNCIONES
	nuevoBuscador : function (id_campo_formulario, mensaje_x_defecto, modo){
		mensaje_x_defecto = typeof mensaje_x_defecto == 'undefined' ? '' : mensaje_x_defecto;
		modo = typeof modo == 'undefined' ? this.modo : modo;

		// ELEMENTOS NECESARIOS
		if (!this.inicializado) {
			document.body.appendChild(
				new Element('div', {'id': 'sugerencias_buscador', 'class': 'en_'+modo}).update(
					new Element('ul', {'id': 'sugerencias_buscador_resultados'})
				)
			);

			for (i=0; i<this.cantidad_resultados; i++)
				$('sugerencias_buscador_resultados').appendChild( new Element('li', {'id': 'sugerencias_buscador_resultado_'+i}) );

			this.ocultarResultados();
			this.inicializado = true;
		}

		// VARIABLES
		this.id_campo_formulario 	= id_campo_formulario;
		this.mensaje_x_defecto 		= mensaje_x_defecto;
		this.modo					= modo;

		// CONFIGURAR CAMPO BUSCADOR
		$(id_campo_formulario).value = this.mensaje_x_defecto;
		$(id_campo_formulario).observe('focus', function(event) {
			if (this.value == sugerenciasBuscador.mensaje_x_defecto)
				this.value = '';
		});
		$(id_campo_formulario).observe('blur', function(event) {
			if (this.value == '')
				this.value = sugerenciasBuscador.mensaje_x_defecto;
			sugerenciasBuscador.blur();
		});

		// EVENTOS
		Event.observe(document, "keydown", this.prevenirAccionDefectoFlechas.bind(this));
		Event.observe(document, "keypress", this.prevenirAccionDefectoFlechas.bind(this));
		$(id_campo_formulario).observe('keyup', this.teclaPulsada.bind(this));
		$('sugerencias_buscador').observe('mouseover', this.listadoSeleccionarNada.bind(this));
	},

	teclaPulsada : function (event){
		var tecla_pulsada = event.keyCode;

		this.raton_encima = false;

		if (tecla_pulsada == 38) { // flecha arriba
			if (this.listado_elementos_mostrados > 0) {
				if (this.listado_elementos_seleccionado == -1)
					this.listado_elementos_seleccionado = this.listado_elementos_mostrados;
				this.listado_elementos_seleccionado--;
				if (this.listado_elementos_seleccionado < 0)
					this.listado_elementos_seleccionado = -1;
				this.listadoSeleccionarElemento();
			}
		} else if (tecla_pulsada == 40) { // flecha abajo
			if (this.listado_elementos_mostrados > 0) {
				this.listado_elementos_seleccionado++;
				if (this.listado_elementos_seleccionado >= this.listado_elementos_mostrados)
					this.listado_elementos_seleccionado = -1;
				this.listadoSeleccionarElemento();
			}
		} else if (tecla_pulsada == 13) { // intro
			if (this.listado_elementos_seleccionado != -1) {
				// REALIZAR ACCION CON LA OPCION ELEGIDA
				this.elementoElegido($('sugerencias_buscador_resultado_'+this.listado_elementos_seleccionado));
			}
		} else { // resto de teclas
			clearTimeout(this.timer);
			this.timer = setTimeout('sugerenciasBuscador.buscar("'+this.id_campo_formulario+'")', this.tiempo_guarda_consulta);
		}
	},

	elementoElegido : function (elemento){
		if (this.modo == 'buscador') {
			// REALIZAR ACCION CON LA OPCION ELEGIDA
			localizador.seleccionado(elemento.busqueda.id_provincia, elemento.busqueda.id_poblacion);

			// ESCRIBIR TEXTO POR DEFECTO EN CAMPO DEL BUSCADOR
			$(this.id_campo_formulario).value = this.mensaje_x_defecto;

			// QUITAR FOCUS DEL BUSCADOR
			$(this.id_campo_formulario).blur();
		} else {
			redir('/buscador'+elemento.busqueda.url);
		}
	},

	prevenirAccionDefectoFlechas : function (evt){
		var keyCode = evt.keyCode;
		var navigateUp = keyCode == 37 || keyCode == 38;
		var navigateDown = keyCode == 39 || keyCode == 40;
		if((!evt.ctrlKey && !evt.metaKey) && sugerenciasBuscador.listado_elementos_mostrados > 0 && (navigateUp || navigateDown)){
			if(evt.preventDefault){
				evt.preventDefault();
			}
			else{
				evt.returnValue = false;
			}
			if(evt.stopPropagation){
				evt.stopPropagation();
			}
			else{
				evt.cancelBubble = true;
			}
			return false;
		}
	},

	listadoSeleccionarNada : function (){
		if (!this.raton_encima) {
			this.listadoSeleccionarElemento(-1);
			this.raton_encima = true;
			this.listado_elementos_seleccionado = -1;
		}
	},

	listadoSeleccionarElemento : function (elemento_seleccionado){
		elemento_seleccionado = typeof elemento_seleccionado == 'undefined' ? this.listado_elementos_seleccionado : elemento_seleccionado;
		if (this.listado_elementos_mostrados > 0)
			for (i=0; i<this.listado_elementos_mostrados; i++)
				if ($('sugerencias_buscador_resultado_'+i))
					$('sugerencias_buscador_resultado_'+i).update(this.generarEnlace('sugerencias_buscador_resultado_'+i, elemento_seleccionado == i));
	},

	blur : function (event){
		setTimeout('sugerenciasBuscador.ocultarResultados()', 250);
	},

	buscar : function (){
		var elemento = $(this.id_campo_formulario);
		if (elemento.value.length > 0) {
			new Ajax.Request('/exec/ajax/sugerencias_buscador.php', {
				parameters: { busqueda: encodeURIComponent(elemento.value), modo: this.modo },
				onSuccess: function(respuesta) {
					var resultados_busqueda = respuesta.responseText.evalJSON();
					sugerenciasBuscador.mostrarResultados(resultados_busqueda);
				}
			});
		}
	},

	generarEnlace : function (id_elemento, seleccionado){
		seleccionado = typeof seleccionado == 'undefined' ? false : seleccionado;
		//return '<a'+(seleccionado ? ' class="seleccionado"' : '')+' href="javascript:void(0);" onclick="javascript:sugerenciasBuscador.elementoElegido('+$(id_elemento).busqueda.id_provincia+','+$(id_elemento).busqueda.id_poblacion+');">'+$(id_elemento).busqueda.nombre+'</a>';
		return '<a'+(seleccionado ? ' class="seleccionado"' : '')+' href="javascript:void(0);" onclick="javascript:sugerenciasBuscador.elementoElegido($(\''+id_elemento+'\'));">'+$(id_elemento).busqueda.nombre+'</a>';
	},

	mostrarResultados : function (resultados_busqueda){
		// SI NO SE HAN ENCONTRADO RESULTADOS, OCULTAR SUGERENCIAS
		if (resultados_busqueda[0].nombre == '') {
			this.ocultarResultados();
			return;
		}

		// MOSTRAR ELEMENTOS POSIBLEMENTE OCULTOS
		$('sugerencias_buscador').show();
		$('sugerencias_buscador_resultados').show();

		// INSERTAR LOS RESULTADOS RECIBIDOS EN EL DIV
		this.listado_elementos_mostrados = 0;
		this.listado_elementos_seleccionado = -1;
		for (i=0; i<this.cantidad_resultados; i++)
			if (resultados_busqueda[i].nombre != '') {
				this.listado_elementos_mostrados++;
				$('sugerencias_buscador_resultado_'+i).show();
				$('sugerencias_buscador_resultado_'+i).busqueda = resultados_busqueda[i];
				$('sugerencias_buscador_resultado_'+i).update(this.generarEnlace('sugerencias_buscador_resultado_'+i));
			} else {
				$('sugerencias_buscador_resultado_'+i).hide();
			}

		// POSICIONAR DIV DE SUGERENCIAS
		var posicion = $(this.id_campo_formulario).viewportOffset();
		var top = posicion.top + 24 + (this.modo == 'portada' ? 7 : 0);
		var left = posicion.left;
		$('sugerencias_buscador').setStyle({ top: top+'px', left: left+'px' });
	},

	ocultarResultados : function (){
		if ($('sugerencias_buscador'))
			$('sugerencias_buscador').hide();
	}
};
