/*
 * ajax_combo.js Jueves 26 de Febrero
 *
 * ajax_combo.js v2009-08-13
 *
 * Depende de prototype.js y scriptaculous.js
 *
 * Implementa una funcion que permite tratar un input Ajax.Autocompleter como
 * un SELECT con autorellenado.
 *
 * Necesidades: La imagen combo-select.gif y un CSS que formatee todo bien.
 * Ejemplo de utilizacion:
 * <input class="combo_autocomplete" type="text" id="componente1"
 *   name="data[Componentefl][0][nombre]"/><img src="/dice/img/combo_select.gif"
 *   class="combo_img" onclick="cliqueado(comp1)"/>
 * <div id="autocomplete_componente1" class="autocomplete"></div>
 * <script type="text/javascript">
 *    var comp1 = new Ajax.Autocompleter('componente1',
 *               'autocomplete_componente1',
 *               '/dice/Autocompletar/getComponentesByNombre',
 *               {minChars:-1,
 *                paramName: "data[Componentefl][nombre]"}) ;
 */


 /**
  * Funcion que permite mostar y ocultar el cuadro de sugerencias cuando se
  * clickea en la imagen de desplegable (tipo SELECT)
  * 
  * @param elemento Ajax.Autocompleter que se va a activar y ocultar
  */

    function cliqueado (elemento) {
        if (elemento.active == false){
            elemento.activate() ;
        } else {
            elemento.active = false;
            elemento.hide();
        }
    }

  /**
   * Función simple de selección que permite meter el ID del <li> en un INPUT
   * hidden para pasarlo como información al controlador en la petición AJAX.
   */
    function seleccionado (text,li) {
        var input_hidden = document.getElementById(text.id+'_value') ;
        text.value = li.childNodes[0].data;
        if (li.id != 0 ) {
            if (input_hidden != null) input_hidden.value = li.id ;
            // Parece ser que al añadir el botón manual para el efecto de
            // combobox hay un problema a la hora de copiar el dato seleccionado
            // en el INPUT, así que lo hacemos a mano... 
            text.value = li.childNodes[0].data;
        }else{
            if (input_hidden != null) input_hidden.value = '' ;
            // En este caso se resetea el valor
            text.value='' ;
        }
    }

    function seleccionado_colocativo (text,li) {
        var input_hidden = document.getElementById(text.id+'_value') ;
        if (li.id != 0 || li.id=='') {
        	if (input_hidden != null) input_hidden.value = li.id ;
            // Parece ser que al añadir el botón manual para el efecto de
            // combobox hay un problema a la hora de copiar el dato seleccionado
            // en el INPUT, así que lo hacemos a mano... 
            text.value = li.childNodes[0].data;
        }else{
        	if (input_hidden != null) input_hidden.value = '' ;
            text.value='' ;
        }
    }


    function fl_seleccionado (input_componente,li) {
        seleccionado(input_componente,li) ;
        if (li.id != 0 ) {
            // Se ha escogido una función
            // Miramos cuantos indices tiene el componente seleccionado
            var num_indices=li.getAttribute('indices') ;
            for (var i=1; i<=3; i++) {
                limpiar_ocultar_recursivo('indice'+i+input_componente.id,true) ;
            }
            for (var i=1; i<=3; i++) {
                if (i<=num_indices) {
                    // Mostramos los índices pertinentes, (comienzan en 1!)
                    mostrar('indice'+i+input_componente.id) ;
                }
            }
            //Activamos la relación
            mostrar(input_componente.getAttribute('relacionsiguiente_id')) ;
        }else{
            limpiar_ocultar_recursivo(input_componente.id,false) ;
        }
    }
    
    function indice_seleccionado (text,li) {
        seleccionado(text,li) ;
    }

    function relacion_seleccionado (text,li) {
        seleccionado(text,li) ;
        if (li.id != 0 ) {
            //Activamos el siguiente componente
            mostrar(text.getAttribute('componenteflsiguiente_id')) ;
        }else{
            limpiar_ocultar_recursivo(text.id,false) ;
        }
    }

    function limpiar_ocultar_recursivo (input_id, erase_this, force_recursive, solo_ocultar) {
    	// El parámetro 'force_recursive' no se usa para nada
    	var obj_input = document.getElementById(input_id) ;
        if (obj_input==null) return ;

        var obj_input_value = document.getElementById(input_id+'_value') ;
        if (erase_this) {
            if (solo_ocultar!=true){
                obj_input_value.value='' ;
                obj_input.value = '' ;
                // BORRAR EL ATRIBUTO HTML value
                obj_input.defaultValue = '' ;
            }
            ocultar(input_id,solo_ocultar) ;
        }

        // Ocultamos los índices si esto tiene índices...
        if(document.getElementById('indice1'+input_id)) {
            for (var i=1; i<=3; i++) {
                limpiar_ocultar_recursivo('indice'+i+input_id,true, null, solo_ocultar);
            }
        }
        // Ocultamos la relacion siguiente... si tiene
        var relacionsiguiente_id = obj_input.getAttribute('relacionsiguiente_id') ;
        if (relacionsiguiente_id!=null && relacionsiguiente_id!=''){
           limpiar_ocultar_recursivo (relacionsiguiente_id,true, null, solo_ocultar) ;
        }
        // Ocultamos el componente siguiente... si tiene
        var componenteflsiguiente_id = obj_input.getAttribute('componenteflsiguiente_id') ;
        if (componenteflsiguiente_id!=null && componenteflsiguiente_id!=''){
            limpiar_ocultar_recursivo (componenteflsiguiente_id,true, null, solo_ocultar) ;
        }
    }

    function ocultar(input_id, solo_ocultar) {
        var input_obj = document.getElementById(input_id) ;
        if (input_obj!=null) {
            if (solo_ocultar!=true) input_obj.value='';
            input_obj.style.visibility='hidden' ;
            if (input_obj.parentNode.nodeName == 'SPAN') {
				input_obj.parentNode.style.display = 'none';
			}
            if (solo_ocultar!=true) {
                var input_obj_value = document.getElementById(input_id+'_value');
                if (input_obj_value!=null) input_obj_value.value='' ;
            }
            var input_img_obj = document.getElementById('img_'+input_id) ;
			if (input_img_obj != null) {
                input_img_obj.style.visibility='hidden' ;
            }
            var input_obj_progreso = document.getElementById(input_id+'_progreso') ;
            if (input_obj_progreso != null) {
				input_obj_progreso.parentNode.style.visibility = 'hidden';
			}
        }
    }
    
    function mostrar(input_id) {
        var input_obj = document.getElementById(input_id) ;
        if (input_obj!=null) {
            input_obj.style.visibility='inherit' ;
            if (input_obj.parentNode.nodeName == 'SPAN') {
                input_obj.parentNode.style.display='inline';
            }
            var input_img_obj = document.getElementById('img_'+input_id) ;
            if (input_img_obj != null) {
				input_img_obj.style.visibility = 'inherit';
			}    
            var input_obj_progreso = document.getElementById(input_id+'_progreso') ;
            if (input_obj_progreso != null) {
				input_obj_progreso.parentNode.style.visibility = 'inherit';
			}
        }
    }


 /**
  * Función que se encarga de efectuar acciones cuando un usuario escoge un LEMA
  * Primero, si el ID (en el <li>) de la opción escogida es !== 0, copia dicho
  * identificador en su INPUT HIDDEN  personal.
  * Después, si existe un INPUT relacionado que dependa de esta elección, le
  * modifica el atributo al INPUT: setAttribute('lema_id',...) para que
  * lo utilice a la hora de buscar.
  * En el caso de ponerse este input a id=0, la información del objeto
  * relacionado también se borra
  */
    function seleccionado_lema (text,li) {
        var i ;
        var input_hidden = document.getElementById(text.id+'_value') ;
        var lema_id_nuevo ;
        if (li.id != 0 ) {
            lema_id_nuevo = li.id;
            // Parece ser que al añadir el botón manual para el efecto de
            // combobox hay un problema a la hora de copiar el dato seleccionado
            // en el INPUT, así que lo hacemos a mano... 
            text.value = li.childNodes[0].data;
        } else {
            lema_id_nuevo = '' ;
            text.value='';
        }
        // Guardamos el valor de lema.id en el input hidden de este control
        if (input_hidden!=null) input_hidden.value = lema_id_nuevo ;

        // Los IDs relacionados pueden ser una lista separadas por espacios
        var text_related_objects = text.getAttribute('related_object_id') ;
        if (text_related_objects !== null) {
            var related_objects_ids = text_related_objects.split(" ") ;
            for (i=0; i< related_objects_ids.length; i++){
                // Guardamos el valor de lema.id en el atributo lema_id del control
                // relacionado
                var related_object = document.getElementById(related_objects_ids[i]);
                if (related_object!=null) {
                	related_object.setAttribute('lema_id',lema_id_nuevo) ;
                	related_object.value='' ;
                }
                var related_object_hidden = document.getElementById(related_objects_ids[i]+'_value') ;
                if (related_object_hidden!=null) related_object_hidden.value='' ;
            }
        }
    }

    function seleccionado_unidadlexica (text,li) {
        var i ;
        var input_hidden = document.getElementById(text.id+'_value') ;
        var ul_id_nuevo ;
        if (li.id != 0 ) {
            ul_id_nuevo = li.id;
            // Parece ser que al añadir el botón manual para el efecto de
            // combobox hay un problema a la hora de copiar el dato seleccionado
            // en el INPUT, así que lo hacemos a mano... 
            text.value = li.childNodes[0].data;
        } else {
            ul_id_nuevo = '' ;
            text.value='';
        }
        // Guardamos el valor de lema.id en el input hidden de este control
        if (input_hidden!=null) input_hidden.value = ul_id_nuevo ;

        // Los IDs relacionados pueden ser una lista separadas por espacios
        var text_related_objects = text.getAttribute('related_object_id') ;
        if (text_related_objects !== null) {
            var related_objects_ids = text_related_objects.split(" ") ;
            for (i=0; i< related_objects_ids.length; i++){
                // Guardamos el valor de lema.id en el atributo lema_id del control
                // relacionado
                var related_object = document.getElementById(related_objects_ids[i]);
                if (related_object!=null) {
                	related_object.setAttribute('unidadlexica_id',ul_id_nuevo) ;
                	related_object.value='' ;
                }
                var related_object_hidden = document.getElementById(related_objects_ids[i]+'_value') ;
                if (related_object_hidden!=null) related_object_hidden.value='' ;
            }
        }
    }

    function seleccionado_clasificacionsintactica (text,li) {
        var input_hidden = document.getElementById(text.id+'_value') ;
        var clasificacion_id_nuevo ;
        if (li.id != 0 ) {
            clasificacion_id_nuevo = li.id;
            // Parece ser que al añadir el botón manual para el efecto de
            // combobox hay un problema a la hora de copiar el dato seleccionado
            // en el INPUT, así que lo hacemos a mano... 
            text.value = li.childNodes[0].data;
        } else {
            clasificacion_id_nuevo = '' ;
            text.value='';
        }
        // Guardamos el valor de lema.id en el input hidden de este control
        if (input_hidden!=null) input_hidden.value = clasificacion_id_nuevo ;

        // Los IDs relacionados pueden ser una lista separadas por espacios
        var text_related_objects = text.getAttribute('related_object_id') 
        if (text_related_objects !== null) {
            var related_objects_ids = text_related_objects.split(" ") ;
            for (i=0; i< related_objects_ids.length; i++){
                // Guardamos el valor de lema.id en el atributo lema_id del control
                // relacionado
                var related_object = document.getElementById(related_objects_ids[i]);
                if (related_object!=null) {
                	related_object.setAttribute('clasificacionsintactica_id',clasificacion_id_nuevo) ;
                	related_object.value='' ;
                }
                var related_object_hidden = document.getElementById(related_objects_ids[i]+'_value') ;
                if (related_object_hidden!=null) related_object_hidden.value='' ;
            }
        }
    }

  /*
  * Función que rellena el querystring de una unidad léxica restringiendo la
  * búsqueda al lema que el usuario haya seleccionado.
  * Accede al atributo añadido con setAttribute 'lema_id' del input dado.
  * Este nuevo atributo permite tener dos controles "virtualmente enlazados"
  */
    function anadirInfoLemaId(input_object,querystring){
        var lema_id = input_object.getAttribute('lema_id') ;
        if (lema_id != null) {
            return ("data%5BUnidadlexica%5D%5Blema_id%5D="+lema_id) ;
        } else {
            return '' ;
        }
    }

    function anadirInfoLemaText(input_obj, querystring) {
    	var lema_text = document.getElementById(input_obj.getAttribute('parent_lema_id')) ;
    	if (lema_text!=null) {
    		return ("data%5BLema%5D%5Blema%5D="+lema_text.value) ;
    	}
    	return "" ;
    }
    
    function buscarTodo(input_object,querystring) {
        return '' ;
    }

    function anadirInfoIndice (input_object,querystring){
        var unidadlexica_id = input_object.getAttribute('unidadlexica_id') ;
        if (unidadlexica_id != null) {
            return ("data%5BUnidadlexica%5D%5Bid%5D="+unidadlexica_id) ;
        } else {
            return '' ;
        }
    }
    
    function anadirInfoGlosa(input_object,querystring) {
        var lema_id = input_object.getAttribute('lema_id') ;
        var unidadlexica_id = input_object.getAttribute('unidadlexica_id' );
        var clasificacionsintactica_id = input_object.getAttribute('clasificacionsintactica_id');
        if (lema_id != null) querystring = querystring + '&data%5BLema%5D%5Bid%5D='+lema_id ;
        if (unidadlexica_id != null) querystring = querystring + '&data%5BUnidadlexica%5D%5Bid%5D='+unidadlexica_id ;
        if (clasificacionsintactica_id != null) querystring = querystring + '&data%5BColocacioncolocativo%5D%5Bclasificacionsintactica_id%5D='+clasificacionsintactica_id ;
        return (querystring) ;        
    }

    function anadirInfoGlosaText(input_object,querystring) {
        var lema_text = document.getElementById(input_object.getAttribute('parent_lema_id')) ;
        var unidadlexica_text = document.getElementById(input_object.getAttribute('parent_unidadlexica_id' ));
        var clasificacionsintactica_id = input_object.getAttribute('clasificacionsintactica_id');
        if (lema_text != null) querystring = querystring + '&data%5BLema%5D%5Blema%5D='+lema_text.value ;
        if (unidadlexica_text != null) querystring = querystring + '&data%5BUnidadlexica%5D%5Bnumeroul%5D='+unidadlexica_text.value ;
        if (clasificacionsintactica_id != null) querystring = querystring + '&data%5BColocacioncolocativo%5D%5Bclasificacionsintactica_id%5D='+clasificacionsintactica_id ;
        return (querystring) ;        
    }
    
  /*
   * Funciones para borrar los campos de los formularios.
   * SÓLO RECOMENDABLE PARA INPUTS QUE NO DEPENDEN DE LOS VALORES DE LOS
   * ATRIBUTOS QUE SE BORRAN POR DEFECTO!!! (tener cuidado)
   */

    /** Borra los input con id en el array así como su "_value", y, si existen,
     *  "lema_id", "unidadlexica_id", etc...
     */
    function clearInputs(array_inputs_names) {
       for (var i=0; i<array_inputs_names.length; i++) {
            var elemento = document.getElementById(array_inputs_names[i]) ;       

            if (elemento != null){
                elemento.value = '' ;
                // Borramos los posibles atributos del elemento
                elemento.removeAttribute('lema_id') ;
                elemento.removeAttribute('unidadlexica_id') ;          
                elemento.removeAttribute('clasificacionsintactica_id') ;          
                elemento.defaultValue = '' ;
            }
            // Borramos el valor oculto
            elemento = document.getElementById(array_inputs_names[i]+'_value') ; // Borramos el valor oculto
            if (elemento != null) {
                elemento.value = '' ;
                elemento.defaultValue = '' ;
            }
        }
    }

    /**
     * Función que borra y oculta los inputs para componer el nombre de una
     * función léxica. Como array de nombres de controles a borrar indicar
     * únicamente el nombre del primer input de todo el conjunto:
     *        ['Componentefl0','Componentefl1',...]
     */
    function clearFunctionInputs(array_inputs_names) {
       for (var i=0; i<array_inputs_names.length; i++) {
            limpiar_ocultar_recursivo (array_inputs_names[i], true, true,false) ;
            mostrar (array_inputs_names[i]) ;
        }
    }

 /**
  *  ************************************************************************
  *  *************************** DEPRECATED *********************************
  *  ************************************************************************
  *  **    Se recomienda la utilización del helper AutocompleterHelper     **
  *  ************************************************************************
  *
  * Crea un combobox (SELECT) en base a un INPUT realizando sugerencias de
  * autocompletar mediante AJAX. 
  *
  * @param id
  *                   Identificador que se le dará al INPUT en HTML. El objeto
  *                   Ajax.Autocompleter se podrá referenciar mediante
  *                   id = 'js_'+id 
  * @param name
  *                   Nombre que se le dará al INPUT y por lo tanto nombre
  *                   que se utilizará como parámetro al hacer el SUBMIT
  *                   del formulario
  * @param name_value (OPCIONAL)
  *                   Nombre que se le dará al INPUT oculto que contiene
  *                   el valor de índice(o lo deseado, tipo SELECT) para
  *                   enviar también en el SUBMIT
  * @param autocompletequery_name
  *                   Nombre del parámetro que se utilizará para
  *                   realizar la petición AJAX. Con este nombre se enviará
  *                   el valor que hay en el input principal 
  * @param class
  *                   Nombre del estilo. El INPUT principal tendra dicho nombre
  *                   y el estilo del div de las opcioens será class+'_choices'
  * @param url_button
  *                   URL de la imagen que se utilizará como botón SELECT
  *                   en el INPUT. Su funcionamiento es virtual (programado)
  * @param url_img_progreso (OPCIONAL)
  *                   URL de la imagen que se mostrará cuando se estén cargando
  *                   datos AJAX.
  * @param afterUpdateElement_callback (OPCIONAL)
  *                   función que se ejecutará cuando el
  *                   usuario haya seleccionado un elemento. La firma de
  *                   dicha función es: ....(text, li), es decir, el INPUT
  *                   y el LI seleccionado. En caso de desear que se ejecute
  *                   también "seleccionado()" añadirlo a la función
  *                   personalizada.
  * @param beforeRequest_callback (OPCIONAL)
  *                   Función que se ejecutará justo antes de realizar la
  *                   petición AJAX, permitiendo modificar la querystring que
  *                   se enviará al servidor. La firma de la función es:
  *                   ....(input_object, querystring). La querystring es de la
  *                   forma 'value=XXX', y hay que devolver la nueva querystring
  *                   que se desee utilizar incluyendo la parte por defecto.
  * @param is_readonly (OPCIONAL)
  *                   Si este parámetro es true (valor javascript, sin comillas)
  *                   el INPUT será de sólo lectura, por lo que el sistema
  *                   de sugerencias según se escribe queda desactivado
  *                   virtualmente
  *
  * @param more_attributes (OPCIONAL)
  *                   Cadena de texto que se añadirá como atributo al input
  *                   principal. Utilizar comillas dobles para el contenido
  *                   de cada atributo.
  *
  * ATENCIÓN: Los parámetros OPCIONALES se pueden omitir pasando
  *           el valor 'undefined' (sin comillas)
  */
    function crearCombo(id,
                        name,
                        name_value,
                        autocompletequery_name,
                        url_autocomplete,
                        clase,
                        url_button,
                        url_img_progreso,
                        afterUpdateElement_callback,
                        beforeRequest_callback,
                        is_readonly,
                        more_attributes) {
        document.write('<input class="'+clase+'" type="text" id="'+id+'"'+
            ' name="'+name+'"') ;
        if (more_attributes!==undefined) {
            document.write(' '+more_attributes+' ') ;
        }
        if (is_readonly===true){
            document.write(' readonly ') ;
        }
        document.write('/><img id="img_'+id+'" src="'+url_button+'" class="combo_img"'+
            ' onclick="document.getElementById(\''+id+'\').focus(); cliqueado(js_'+id+')"/>') ;
        document.write('<div id="'+id+'_choices" class="'+clase+'_choices"></div>') ;
        if (name_value!=undefined){
            document.write('<input type="hidden" id="'+id+'_value" name="'+name_value+'" autocomplete="off" style="display:none"/>');
        }
        document.write('<script type="text/javascript">') ;
        document.write('var js_'+id+' = new Ajax.Autocompleter("'+id+'",'+
            '"'+id+'_choices","'+url_autocomplete+'", {minChars:-1,'+
            'paramName: "'+autocompletequery_name+'"');
        if (url_img_progreso !== undefined) {
            document.write(",indicator: '"+id+"_progreso'");
        }
        if (afterUpdateElement_callback !== undefined){
            document.write(',afterUpdateElement:'+afterUpdateElement_callback);
        }
        if (beforeRequest_callback !== undefined){
            document.write(',callback:'+beforeRequest_callback);
        }
        document.write('});') ;
        document.write('</script>') ;
        //Si el indicator está activo, tenemos que colocar la imagen que se
        // usará como indicador de progreso
        if (url_img_progreso !== undefined) {
            document.write('<span class="progreso '+id+
                    '_progreso">'+
                     '<img id="'+id+'_progreso" src="'+url_img_progreso+'" style="display:none"/></span>');
        }


    }
  
  
