/********************************************************************************
 COPYRIGHT(C):  IAAA-2003
 PROYECTO:      Búsquedas
 ARCHIVO:       ControlledListCriterionQueryBuilder.js
 CREACION:      13-13-05 claborda
 ULTIMA MODIF:
 LENGUAJE:      Javascript
 PLATAFORMA:    Windows 95-NT, debe funcionar en todas
 REQUERIM.:
 DESCRIPCION:   Criterio de búsqueda por lista controlada, en zona común de memoria
 		para todos los JSP.
 HISTORIA:      13-13-05 claborda Creación.
*******************************************************************************/

 /**
  *   Constructor.
  * @param name nombre.
  * @return nueva instancia de la clase.
  */
 function ControlledListCriterionQueryBuilder(name, config, contexto, containingDocument, myPath)
 {
    	this._name = name;

	// contexto de la aplicación. Obtenido del fichero web.xml
	this._contexto = contexto;
    	
	//config: Array de etiquetas del criterio de listas controladas.
	this._config = config;
	
	this._containingDocument = containingDocument;
 	this._mypath = myPath;
	
    	this._CONTROLLED_LIST_CRITERION_QUERY_FIELDS = null;
    	this._CONTROLLED_LIST_CRITERION_QUERY_VALUES = null;
	this._avoFilterBuilder = new AVOFilterBuilder(name + "_avoFB");
	this.loadControlledListCriterionQueryFields();
	this._avoFilterBuilder.setAttributes(this._CONTROLLED_LIST_CRITERION_QUERY_FIELDS);
	this._avoFilterBuilder.setInnerOperator("OR");
	//this._avoFilterBuilder.setQueryOperator("=");
	if (this._config._queryOperator != "")
	{
		this._avoFilterBuilder.setQueryOperator(this._config._queryOperator);
	}

	this._undefinedValue = null;
	this._title = this._config._title;
	this._tooltip = this._config._tooltip;
	
	this._CONTROLLED_LIST_CRITERION_QUERY_KEYS = new Array();
	this._CONTROLLED_LIST_CRITERION_QUERY_VALUES = new Array();
	this._CONTROLLED_LIST_CRITERION_QUERY_KEYS = this._config._keys[0];
	this._CONTROLLED_LIST_CRITERION_QUERY_VALUES = this._config._values[0];
	
	this._onChangeEventListeners = new Array();	
        this._disabled = false;
        this._cargado = false;
        
        // Variable que guarda los índices seleccionados de la lista controlada.
        // Usado para el refinamiento de consulta, stateString...
        this._selectedIndexes = new Array();
 }
 
 ControlledListCriterionQueryBuilder.prototype.setContainingDocument = function(document) {
 	this._containingDocument = document;
 }
 
 ControlledListCriterionQueryBuilder.prototype.setPath = function(path) {
 	this._mypath = path;
 }

 ControlledListCriterionQueryBuilder.prototype.loadControlledListCriterionQueryFields = function()
 {
    this._CONTROLLED_LIST_CRITERION_QUERY_FIELDS = new Array(this._config._queryFields.length);
    for (i=0; i<this._config._queryFields.length; i++) {
    	this._CONTROLLED_LIST_CRITERION_QUERY_FIELDS[i] = this._config._queryFields[i];
    }
 }

 /**
  *    Método para generar una consulta por todos los campos de this._searchingAttributes
  *  a partir del texto introducido por el usuario.
  */
 ControlledListCriterionQueryBuilder.prototype.getQueryTree = function(valuesArray)
 {
    var queryTree = null;
    //var valuesArray = null;
    var operatorsArray = null;
    var queryTreeArray = new Array();
    var controlledList = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];

    // Si no hay ninguna opcion selecionada, devolver arbol vacio
    // (la opcion 0 es 'cualquiera' --> vacio)
    if (controlledList.selectedIndex <= 0)
    {
       queryTree = "";
    }
    else
    {
	var searchValues = null;
	//valuesArray = value.split(",");

	for (var i=0; i < valuesArray.length; i++) {
		operatorsArray = new Array();
		index=valuesArray[i];
		searchValues = this._CONTROLLED_LIST_CRITERION_QUERY_VALUES[index];
		this._avoFilterBuilder.setValues(searchValues);
		this._avoFilterBuilder.setOperators("OR");
		queryTreeArray[i] = this._avoFilterBuilder.getFilter();
	}
	queryTree = this._avoFilterBuilder._filterBuilderToolkitObject.logicalMultipleUnification(queryTreeArray, "OR");
    }

    return queryTree;
 }

 ControlledListCriterionQueryBuilder.prototype.getQueryTreeFromGUI = function()
 {
	this._selectedIndexes = this.getState();

	return this.getQueryTree(this._selectedIndexes);
 }

 ControlledListCriterionQueryBuilder.prototype.getGUI = function()
 {
    	var code = '';

	
	/*
	 *  Jamás intentar cambiar el DIV que engloba la lista controlada por
	 * otro elemento (P, SPAN,...). Por misterios de la naturaleza, Mozilla
	 * y Firefox (Geckos varios) no son capaces de recargar correctamente
	 * el contenido de la lista controlada (SELECT). Probablemente sea por
	 * algún conflicto de estilos o alguna otra causa aberrante que hemos
	 * sido incapaces de detectar.
	 */
	code = '<div>';
	code = code + '<select name="' + this._name + 'ControlledList"';
	if (this._disabled) {
		code = code + ' disabled';
	}
	code = code + ' size="' + this._config._sizeGUI + '"';
	code = code + ' class="' + this._config._styleGUI + '"';
	code = code + ' onChange="javascript:' + consCadPath(this._mypath,this._name) + '.onChangeHandler(event)">' + '\n';	
	code = code + '</select>' + '\n';
    	code = code + '</div>';
        this._cargado = true;
	return code;
 }

 ControlledListCriterionQueryBuilder.prototype.onChangeHandler = function(evnt)
 {
 	if (!evnt) {
 		evnt = Window.event;
 	}
 	for (var i = 0; i < this._onChangeEventListeners.length; i++) {
 		var eventListener = this._onChangeEventListeners[i];
 		var listener = eventListener.listener;
 		var target = eventListener.target;
 		listener.call(target, evnt);
 	}
 }

 
 ControlledListCriterionQueryBuilder.prototype.addOnChangeEventListener = function(listener, target)
 {
 	var eventListener = new Array();
 	eventListener.listener = listener;
 	eventListener.target = target;
 	this._onChangeEventListeners.push(eventListener);
 }

 ControlledListCriterionQueryBuilder.prototype.deleteOnChangeEventListeners = function()
 {
 	this._onChangeEventListeners.length = 0;
 }

 ControlledListCriterionQueryBuilder.prototype.getState = function()
 {
	var controlledList = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];
	var selected = new Array();

	for(var i=0;i<controlledList.length;i++){
		if (controlledList.options[i].selected) {
			selected.push(i);
		}
	}
	//return selected.join(",");
	return selected;
 }

 ControlledListCriterionQueryBuilder.prototype.setState = function()
 {
	var controlledList = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];

	for (var i=0; i < this._selectedIndexes.length; i++) {
		controlledList.options[this._selectedIndexes[i]].selected = true;
	}
 }
 
 ControlledListCriterionQueryBuilder.prototype.setSelectedIndexes = function(value)
 {
 	var valuesArray = value.split(",");
	
	for (var i=0; i < valuesArray.length; i++) {
		this._selectedIndexes[i] = valuesArray[i];	
	}
 }

 ControlledListCriterionQueryBuilder.prototype.loadControlledList = function()
 {
   var controlledList = null;
   var option = null;

   controlledList = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];
   controlledList.options.length = 0;

   for (i = 0; i < this._CONTROLLED_LIST_CRITERION_QUERY_KEYS.length; i++)
   {
	option = new Option(this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[i], this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[i], false, false);
	controlledList.options[i] = option;
   }
   controlledList.options[0].selected = true;
 }


 ControlledListCriterionQueryBuilder.prototype.setControlledList = function(keys, values)
 {
 	this._CONTROLLED_LIST_CRITERION_QUERY_KEYS = keys;
 	this._CONTROLLED_LIST_CRITERION_QUERY_VALUES = values;
 }

 ControlledListCriterionQueryBuilder.prototype.reset = function()
 {
   var controlledList = null;

   controlledList = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];
   controlledList.options[0].selected=true;
 }

 ControlledListCriterionQueryBuilder.prototype.enable = function()
 {
    this._disabled = false;
    
    if(this._cargado)
    {
        var sel = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];
    	sel.disabled=false;
    }
 }

 ControlledListCriterionQueryBuilder.prototype.disable = function()
 {
    this._disabled = true;
    if(this._cargado)
    {
        var sel = this._containingDocument.getElementsByName(this._name + 'ControlledList')[0];
    	sel.disabled=true;
    }
 }

 ControlledListCriterionQueryBuilder.prototype.stateString = function(value)
 {
 	var cadena = "<b>" + this._title + ":</b>&nbsp;";
	
 	var categorias = "";
 	
 	// Parámetro de entrada "value", no debería necesitarse, pq los criterios js
 	// se han pasado a una zona común de memoria para todos los JSP.
 	// Pero en el caso concreto del buscador "indexRadio" del gazetter al aparecer en otra 
 	// ventana da problemas en explorer (no en mozilla) si no se crea la variable objeto
 	// del criterio en el propio jsp "indexRadio" por lo que en este caso tenemos que 
 	// pasar lo seleccionado por el usuario por GET o POST (variable estado) como antes.
 	if ((value == "") || (value == null) || (value == undefined)) {
		categorias = this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[this._selectedIndexes[0]];
		for (var i=1; i < this._selectedIndexes.length; i++) {
 			categorias = categorias + ", " + this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[this._selectedIndexes[i]];
 		}
	}
	else {	
		var valuesArray = value.split(",");
		categorias = this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[valuesArray[0]];
		for (var i=1; i < valuesArray.length; i++) {
 			categorias = categorias + ", " + this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[valuesArray[i]];
 		}
	}

 	if (categorias != this._CONTROLLED_LIST_CRITERION_QUERY_KEYS[0]) {
 		cadena = cadena + categorias + "<br/>"
		return cadena;
 	}
 	else{
 		return "";
 	}
 
}

/* PRIVATE */

 // función que da acceso al objeto javaScript identificado
 // por nombre y que está declarado en thePath
function consCadPath(thePath,nombre){
    var k = 0;
    var limite= thePath.length;
    var cadena= "";
    while(k<limite){
      cadena = cadena + thePath[k] + '.';
      k++;
    }
    cadena = cadena + nombre;
    return cadena;
 }
