/********************************************************************************
 COPYRIGHT(C):  IAAA-2003
 PROYECTO:      Búsquedas
 ARCHIVO:       TextFieldCriterionQueryBuilder.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 cuadro de texto, 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 TextFieldCriterionQueryBuilder(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._TEXT_FIELD_CRITERION_QUERY_FIELDS = null;
	this._avoFilterBuilder = new AVOFilterBuilder(name + "_avoFB");
	this.loadTextFieldCriterionQueryFields();
	this._avoFilterBuilder.setAttributes(this._TEXT_FIELD_CRITERION_QUERY_FIELDS);
	this._avoFilterBuilder.setInnerOperator("OR");
	if (this._config._queryOperator != "")
	{
		this._avoFilterBuilder.setQueryOperator(this._config._queryOperator);
	}
	
	this._onChangeEventListeners = new Array();
	this._onKeyDownEventListeners = new Array();
	this._inputFilters =  new Array();
	this._inputValidators =  new Array();

        this._title = this._config._title;
        
        // Variable que guarda el texto introducido por el usuario.
        // Usado para el refinamiento de consulta, stateString...
        this._userText = "";
 }
 
 TextFieldCriterionQueryBuilder.prototype.setContainingDocument = function(document) {
 	this._containingDocument = document;
 }
 
 TextFieldCriterionQueryBuilder.prototype.setPath = function(path) {
 	this._mypath = path;
 }

 TextFieldCriterionQueryBuilder.prototype.loadTextFieldCriterionQueryFields = function()
 {
 	this._TEXT_FIELD_CRITERION_QUERY_FIELDS = new Array(this._config._queryFields.length);
 	for (i=0; i<this._config._queryFields.length; i++) {
    		this._TEXT_FIELD_CRITERION_QUERY_FIELDS[i] = this._config._queryFields[i];
    	}
 }


 /**
  *    Método para generar una consulta por todos los campos de this._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.
  */
 TextFieldCriterionQueryBuilder.prototype.getQueryTree = function(userText)
 {
	var queryTree = null;

	if (userText == "")
	{
		queryTree = "";
	}
	else
	{
		valuesArray = new Array();
		operatorsArray = new Array();

		userText = this.applyFilters();

		detailedParseUserText(userText, valuesArray, operatorsArray);

		this._avoFilterBuilder.setValues(valuesArray);

		this._avoFilterBuilder.setOperators(operatorsArray);
		queryTree = this._avoFilterBuilder.getFilter();
	}

	return queryTree;
 }


 TextFieldCriterionQueryBuilder.prototype.getQueryTreeFromGUI = function()
 {
	this._userText = this._containingDocument.getElementsByName(this._name + 'TextInput')[0].value;
	
	return this.getQueryTree(this._userText);
 }


 TextFieldCriterionQueryBuilder.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 + '</p>' + '\n';

	return code;
 }
 
 TextFieldCriterionQueryBuilder.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);
 	}
 }
 
 
 TextFieldCriterionQueryBuilder.prototype.addOnChangeEventListener = function(listener, target)
 {
 	var eventListener = new Array();
 	eventListener.listener = listener;
 	eventListener.target = target;
 	this._onChangeEventListeners.push(eventListener);
 }
 
 TextFieldCriterionQueryBuilder.prototype.deleteOnChangeEventListeners = function()
 {
 	this._onChangeEventListeners.length = 0;
 }
 
 TextFieldCriterionQueryBuilder.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);
 	}
 }
 
 TextFieldCriterionQueryBuilder.prototype.addOnKeyDownEventListener = function(listener, target)
 {
 	var eventListener = new Array();
 	eventListener.listener = listener;
 	eventListener.target = target;
 	this._onKeyDownEventListeners.push(eventListener);
 }
 
 TextFieldCriterionQueryBuilder.prototype.deleteOnKeyDownEventListeners = function()
 {
 	this._onKeyDownEventListeners.length = 0;
 }

 TextFieldCriterionQueryBuilder.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;
 }
 
 TextFieldCriterionQueryBuilder.prototype.addInputValidator = function(inputValidator)
 {
 	this._inputValidators.push(inputValidator);
 }
 
 TextFieldCriterionQueryBuilder.prototype.deleteInputValidators = function()
 {
 	this._inputValidators.length = 0;
 }
 
 TextFieldCriterionQueryBuilder.prototype.applyFilters = function()
 {
	var 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;
 }
 
 TextFieldCriterionQueryBuilder.prototype.addInputFilter = function(inputFilter)
 {
 	this._inputFilters.push(inputFilter);
 }
 
 TextFieldCriterionQueryBuilder.prototype.deleteInputFilters = function()
 {
 	this._inputFilters.length = 0;
 }

 TextFieldCriterionQueryBuilder.prototype.getState = function()
 {
	var textInput = this._containingDocument.getElementsByName(this._name + 'TextInput');
          
	return textInput[0].value;
 }

 TextFieldCriterionQueryBuilder.prototype.setState = function()
 {
 	var textInput = this._containingDocument.getElementsByName(this._name + 'TextInput')[0];

	textInput.value = this._userText;
 }

 TextFieldCriterionQueryBuilder.prototype.resetState = function()
 {
 	var textInput = this._containingDocument.getElementsByName(this._name + 'TextInput')[0];

	this._userText = "";

	textInput.value = this._userText;
 }

 TextFieldCriterionQueryBuilder.prototype.stateString = function()
 {
	if(this._userText != "")
	{
		var cadena = "<b>" + this._title + ":</b>&nbsp;" + this._userText + "<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;
 }
