/********************************************************************************
 COPYRIGHT(C):  IAAA-2003
 PROYECTO:      Búsquedas
 ARCHIVO:       ExtendedTextFieldCriterionQueryBuilder.js
 CREACION:      13-12-05 claborda
 ULTIMA MODIF:
 LENGUAJE:      Javascript
 PLATAFORMA:    Windows 95-NT, debe funcionar en todas
 REQUERIM.:
 DESCRIPCION:   Criterio de búsqueda por cuadro de texto con opción de 
 		seleccionar su concordancia, en zona común de memoria
 		para todos los JSP.
 HISTORIA:      13-12-05 claborda Creación.
*******************************************************************************/


 /**
  *   Constructor.
  * @param name nombre.
  * @return nueva instancia de la clase.
  */
 function ExtendedTextFieldCriterionQueryBuilder(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 cuadro de texto.
	this._config = config;
	
	this._containingDocument = containingDocument;
 	this._mypath = myPath;
	
    	this._EXTENDED_TEXT_FIELD_CRITERION_QUERY_FIELDS = null;
	this._avoFilterBuilder = new AVOFilterBuilder(name + "_avoFB");
	this.loadExtendedTextFieldCriterionQueryFields();
	this._avoFilterBuilder.setAttributes(this._EXTENDED_TEXT_FIELD_CRITERION_QUERY_FIELDS);
	this._avoFilterBuilder.setInnerOperator("OR");
	this._type = "TODAS";
	
	this._onChangeEventListeners = new Array();
	this._onKeyDownEventListeners = new Array();
	this._inputFilters =  new Array();
	this._inputValidators =  new Array();

        this._title = this._config._title;
        this._exactTip = this._config._exactTip;
        this._anyTip = this._config._anyTip;
        this._allTip = this._config._allTip;
	this._titleTips = this._config._titleTips;
	
	// Variable que guarda el texto introducido por el usuario.
        // Usado para el refinamiento de consulta, stateString...
        this._userText = "";
        // Variable que guarda la concordancia elegida por el usuario.
        // Usado para el refinamiento de consulta...
        this._userMatch = 0;
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.setContainingDocument = function(document) {
 	this._containingDocument = document;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.setPath = function(path) {
 	this._mypath = path;
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.selectTypeOfQuery = function(opcion)
 {
	this._type = opcion;
 	if(opcion=="EXACTA"){
		this._avoFilterBuilder.setQueryOperator(this._config._queryOperatorExact);
 	}
 	if(opcion=="TODAS"){
		this._avoFilterBuilder.setQueryOperator(this._config._queryOperatorAll);
 	}
 	if(opcion=="CUALQUIERA"){
		this._avoFilterBuilder.setQueryOperator(this._config._queryOperatorAny);
 	}
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.loadExtendedTextFieldCriterionQueryFields = function()
 {
 	this._EXTENDED_TEXT_FIELD_CRITERION_QUERY_FIELDS = new Array(this._config._queryFields.length);
 	for (i=0; i<this._config._queryFields.length; i++) {
    		this._EXTENDED_TEXT_FIELD_CRITERION_QUERY_FIELDS[i] = this._config._queryFields[i];
    	}
 }


 /**
  *    Método para generar una consulta por todos los campos de this._EXTENDED_TEXT_FIELD_CRITERION_QUERY_FIELDS
  *    a partir del texto "bruto" introducido por el usuario.
  *     1. Parsea el texto proporcionado por el usuario para obtener un conjunto de valores.
  *     2. Genera las consultas para cada uno de esos valores.
  *     3. Compone la consulta global.
  */
 ExtendedTextFieldCriterionQueryBuilder.prototype.getQueryTree = function(userInputText)
 {
	var queryTree = null;
	//var texto = '';

	if (userInputText == "")
	{
		queryTree = "";
	}
	else
	{
		valuesArray = new Array();
		operatorsArray = new Array();

		userInputText = this.applyFilters();

		if(this._type == "EXACTA"){
			valuesArray[0] = userInputText;
		}
		else{
			detailedParseUserText(userInputText, valuesArray, operatorsArray);
		}

		this._avoFilterBuilder.setValues(valuesArray);

		if(this._type == "TODAS"){
			for(i=0; i<operatorsArray.length; i++){
				operatorsArray[i] = "AND";
			}
		}

		this._avoFilterBuilder.setOperators(operatorsArray);
		queryTree = this._avoFilterBuilder.getFilter();
	}

	return queryTree;
 }


 ExtendedTextFieldCriterionQueryBuilder.prototype.getQueryTreeFromGUI = function()
 {
	var concordancia = this._containingDocument.getElementsByName(this._name + 'queryType');

	for (i=0; i<concordancia.length; i++) {
		if (concordancia[i].checked) {
			if (concordancia[i].value == "anywords") {
				this.selectTypeOfQuery("CUALQUIERA");
				this._userMatch = 1;
			}

			if (concordancia[i].value == "allwords") {
				this.selectTypeOfQuery("TODAS");
				this._userMatch = 2;
			}

			if (concordancia[i].value == "exact") {
				this.selectTypeOfQuery("EXACTA");
				this._userMatch = 0;
			}
		}
	}

	this._userText = this._containingDocument.getElementsByName(this._name + 'TextInput')[0].value;
	return this.getQueryTree(this._userText);
 }


 ExtendedTextFieldCriterionQueryBuilder.prototype.getGUI = function()
 {
	var code = '';

	code = '<p>' + '\n';
	if (this._config._wildCardMessage != "")
	{
		code = code + '<span class="' + this._config._styleGUIText + '">' + '\n'; 
		code = code + '  (' + (this._config._wildCardMessage) + ')<br />';
		code = code + '</span>' + '\n';
	}
	code = code + '<input type="text" name="' + this._name + 'TextInput"';
	code = code + ' size="' + this._config._sizeGUI + '"';
	code = code + ' class="' + this._config._styleGUI + '"';
	code = code + ' onChange="javascript:' + consCadPath(this._mypath,this._name) + '.onChangeHandler(event)"';
	code = code + ' onKeyDown="javascript:' + consCadPath(this._mypath,this._name) + '.onKeyDownHandler(event)">' + '\n';
	code = code + '</input>' + '\n';
	code = code + '<br />' + '\n';
	code = code + '<DIV align="left"  style="margin-bottom:0px">' + '\n';
	code = code + '  <FONT class="intro">' + '\n';
	code = code + '    ' + this._titleTips + ':<br/>' + '\n';
	code = code + '    <input type="radio" checked name="' + this._name + 'queryType" value="exact">' + this._exactTip + '</input>' + '\n';
	code = code + '    <br />' + '\n';
	code = code + '    <input type="radio" name="' + this._name + 'queryType" value="anywords">' + this._anyTip + '</input>' + '\n';
	code = code + '    <br />' + '\n';
	code = code + '    <input type="radio" name="' + this._name + 'queryType" value="allwords">' + this._allTip + '</input>' + '\n';
	code = code + '  </FONT>' + '\n';
	code = code + '</DIV>' + '\n';
	code = code + '</p>' + '\n';

	return code;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.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);
 	}
 }
 
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.addOnChangeEventListener = function(listener, target)
 {
 	var eventListener = new Array();
 	eventListener.listener = listener;
 	eventListener.target = target;
 	this._onChangeEventListeners.push(eventListener);
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.deleteOnChangeEventListeners = function()
 {
 	this._onChangeEventListeners.length = 0;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.onKeyDownHandler = function(evnt)
 {
 	if (!evnt) {
 		evnt = Window.event;
 	}
 	 
 	for (var i = 0; i < this._onKeyDownEventListeners.length; i++) {
 		var eventListener = this._onKeyDownEventListeners[i];
 		var listener = eventListener.listener;
 		var target = eventListener.target;
 		listener.call(target, evnt);
 	}
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.addOnKeyDownEventListener = function(listener, target)
 {
 	var eventListener = new Array();
 	eventListener.listener = listener;
 	eventListener.target = target;
 	this._onKeyDownEventListeners.push(eventListener);
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.deleteOnKeyDownEventListeners = function()
 {
 	this._onKeyDownEventListeners.length = 0;
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.checkInput = function()
 {
 	var userInputText = this._containingDocument.getElementsByName(this._name + 'TextInput')[0].value;
	
	for (var i = 0; i < this._inputValidators.length; i++) {
		var inputValidator = this._inputValidators[i];
		if(!inputValidator(userInputText)) {
			return false;
		}
	}
	return true;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.addInputValidator = function(inputValidator)
 {
 	this._inputValidators.push(inputValidator);
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.deleteInputValidators = function()
 {
 	this._inputValidators.length = 0;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.applyFilters = function()
 {
	userInputText = this._containingDocument.getElementsByName(this._name + 'TextInput')[0].value;

	for (var i = 0; i < this._inputFilters.length; i++) {
		var inputFilter = this._inputFilters[i];
		userInputText = inputFilter(userInputText);
	}
	return userInputText;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.addInputFilter = function(inputFilter)
 {
 	this._inputFilters.push(inputFilter);
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.deleteInputFilters = function()
 {
 	this._inputFilters.lentgh = 0;
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.getState = function()
 {
	var textInput = this._containingDocument.getElementsByName(this._name + 'TextInput');
          
	return textInput[0].value;
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.setState = function()
 {
 	var concordancia = this._containingDocument.getElementsByName(this._name + 'queryType');

	if(this._userText != "") {
		var textInput = this._containingDocument.getElementsByName(this._name + 'TextInput')[0];

		textInput.value = this._userText;
		
		concordancia[this._userMatch].checked = true;
   	}
   	else
   	{
		concordancia[0].checked = true;
   	}
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.resetState = function()
 {
 	var textInput = this._containingDocument.getElementsByName(this._name + 'TextInput')[0];
 	var concordancia = this._containingDocument.getElementsByName(this._name + 'queryType');

	this.resetStateVars();

	textInput.value = this._userText;
	concordancia[this._userMatch].checked = true;
 }
 
 ExtendedTextFieldCriterionQueryBuilder.prototype.resetStateVars = function()
 {
 	this._userText = "";
	this._userMatch = 0;
 }

 ExtendedTextFieldCriterionQueryBuilder.prototype.stateString = function(value)
 {
    	var cadena = "";

    	if (this._userText != "") {
    		cadena += "<b>" + this._title +"</b>:&nbsp;";
	     	if (this._userMatch == 0) {
	           	cadena += "(<i>" + this._exactTip + "</i>)&nbsp;";
	           	cadena += this._userText;
	     	}
	     	if (this._userMatch == 1) {
	           	cadena += "(<i>" + this._anyTip + "</i>)&nbsp;";
	           	cadena += this._userText;
	     	}
	     	if (this._userMatch == 2) {
	           	cadena += "(<i>" + this._allTip + "</i>)&nbsp;";
	           	cadena += this._userText;
	     	}
	     	cadena += "<br/>";
	}
	return cadena;
 }
 
 // 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;
 }

