if (!Event.KEY_MAYUS)
{
  Object.extend(Event, {
    KEY_MAYUS:   16,
    KEY_CONTROL: 17,
    KEY_ALT:     18
  });
}

var Buscador = Class.create();
Buscador.prototype = {
  
  _opciones : {
    load : true,      // Búsqueda al cargar la página con los valores que tenga el formulario
    callback : null,  // Método al que llamar cuando termine la consulta
    depurar : false,  // Inserta un contenedor de mensajes que por defecto solo muestra los parámetros de la consulta
    
    IntervaloTecla : 500,
    IntervaloRaton : 0
  },
  
  temporizador : null,
  
  Error : {
    Formulario : 'Debe especificar un formulario de búsqueda.',
    Url        : 'Debe especificar una URL de búsqueda.',
    Contenedor : 'Debe especificar un contenedor para los resultados.'
  },
  
  /**
   * Constructor
   * - formulario: Id del formulario que se enviará.
   * - url: URL de la página que procesará el formulario.
   * - contenedor: Id del nodo que presentará los resultados.
   * - opciones: Objeto con los atributos de configuración del buscador (ver _opciones).
   * Se invoca con el operador de instanciación.
   */
  initialize : function (formulario, url, contenedor)
  {
    var i;
    var debug = '';
    var opciones = arguments.length == 4 ? arguments[3] : {};

    this.formulario = formulario;
    this.contenedor = contenedor;
    this.url = url;

    for (opcion in this._opciones)
    {
      if (opcion == 'load')
      {
        if (opciones[opcion] == 'undefined' || opciones[opcion] == null)
        {
          opciones[opcion] = this._opciones[opcion];
        }
        this[opcion] = opciones[opcion];
      }
      else
      {
        this[opcion] = opciones[opcion] ? opciones[opcion] : this._opciones[opcion];
      }
    }

    if (this.depurar)
    {
      new Insertion.Bottom(document.body, '<div id="debug" style="position:fixed;bottom:10px;left:10px;min-height:10px;max-height:400px;padding:10px;overflow:auto;border:1px solid #696969;background:lightyellow;z-index:1;"></div>');
      if (Ajax.currentRequests)
      {
        $('debug').innerHTML += '<p><strong style="color:green;">Activado el soporte para clases de consultas AJAX.</strong></p>';
      }
    }
    var controls = null ;
    switch (true)
    {
      case !this.formulario || !$(this.formulario):
        throw (this.Error.Formulario);
        break;
      case !this.contenedor || !$(this.contenedor):
        throw (this.Error.Contenedor);
        break;
      case !this.url:
        throw (this.Error.Url);
        break;
      default:
        $(this.formulario).buscador = this;
        Event.observe(this.formulario, 'submit', function(event) { Event.stop(event); return false; }, false);
        controls = $(this.formulario).getElements() ;
        break;
    }
    
    // Una vez que tenemos los parámetros, configuramos los tiempos de cambio para el envío
    //    var controls = $(this.formulario).getElements();
    for (i=0; i < controls.length; i++)
      {
      if (controls[i].tagName.toUpperCase() == 'INPUT' && controls[i].getAttribute('type').toUpperCase() == 'TEXT')
      {
        Event.observe(controls[i], 'keydown', this.cancelarBusqueda.bindAsEventListener(this), true);
        Event.observe(controls[i], 'keyup', this.planificarBusqueda.bindAsEventListener(this), true);
      }
      else
      {
        Event.observe(controls[i], 'change', this.planificarBusquedaControl.bindAsEventListener(this), true);
      }
    }
    
    if (this.load)
    {
      var f = this.formulario;
      Event.observe(window, 'load', this.buscar.bindAsEventListener(this), true);
    }
    
  },
  
  /**
   * planificarBusquedaControl
   * Para el temporizador e inicia otro con el intervalo de espera para acciones del ratón
   */
  planificarBusquedaControl : function (event)
  {
    clearTimeout(this.temporizador);
    this.temporizador = setTimeout("$('" + this.formulario + "').buscador.buscar();", this.IntervaloRaton);
  },
  
  /**
   * cancelarBusqueda
   * Para el temporizador
   */
  cancelarBusqueda : function (event)
  {
    clearTimeout(this.temporizador);
  },
  
  /**
   * planificarBusqueda
   * Establece el intervalo de espera para buscar, salvo si se pulsó enter o una tecla no alfanumérica.
   */
  planificarBusqueda : function (event)
  {
    switch (event.keyCode)
    {
      case Event.KEY_TAB:
      case Event.KEY_MAYUS:
      case Event.KEY_CONTROL:
      case Event.KEY_ALT:
      case Event.KEY_ESC:
      case Event.KEY_LEFT:
      case Event.KEY_RIGHT:
      case Event.KEY_UP:
      case Event.KEY_DOWN:
        return false;
      case Event.KEY_RETURN:
        this.buscar();
        break;
      default:
        break;
    }
    
    this.temporizador = setTimeout("$('" + this.formulario + "').buscador.buscar();", this.IntervaloTecla);
  },
  
  /**
   * buscar
   * Serializa el formulario y ejecuta la consulta AJAX.
   */
  buscar : function ()
  {
    var opciones = {
      onlyLatestOfClass : this.formulario,
      evalScripts: true,
      encoding: 'utf-8',
      parameters: Form.serialize(this.formulario)
    };
    
    if (this.callback)
    {
      //      Object.extend(opciones, { onSuccess: this.callback });
      Object.extend(opciones, { onComplete: this.callback });
    }
    new Ajax.Updater({ success: this.contenedor }, this.url, opciones);
  },
  
  reset : function ()
  {
    $(this.formulario).reset();
    this.buscar();
  }
  
};

function setObserversEnCalendario(buscador)
{
  var days = document.getElementsByClassName('day');
  for (i=0; i<days.length; i++)
  {
    Event.observe(days[i], 'click', function(){buscador.buscar();});
  }
}


/**
 * orderBy y setPage establecen las opciones de paginación y presentación del listado.
 */
function orderBy(campo)
{
  var listadoVarName = arguments.length > 1 ? arguments[1] : 'listado' ;
  var defaultListado = listadoVarName != 'listado' ? false : true ;
  var evalString = "var myListado = "+listadoVarName+";";
  eval(evalString) ;
  var c = !defaultListado ? Element.down(myListado.formulario,'input[name="campoOrden"]') : $('campoOrden') ;
  var o = !defaultListado ? Element.down(myListado.formulario,'input[name="orden"]') : $('orden') ;

  if(o && o.tagName.toUpperCase() == 'INPUT' && o.getAttribute('type').toUpperCase() == 'HIDDEN')
  {
    o.value = (o.value >= 0) ? -1 : 1;
  }
  
  if(c && c.tagName.toUpperCase() == 'INPUT' && c.getAttribute('type').toUpperCase() == 'HIDDEN')
  {
    if(c.value != campo)
    {
      o.value = 1;
    }
    setPage(1,listadoVarName);
    c.value = campo;
  }
}

function setPage(pagina)
{
  var listadoVarName = arguments.length > 1 ? arguments[1] :  'listado' ;
  eval ("var myListado = "+listadoVarName+";");
  var p = listadoVarName != 'listado' ? Element.down(myListado.formulario,'input[name="pagina"]') : $('pagina');
  if (p && p.tagName.toUpperCase() == 'INPUT' && p.getAttribute('type').toUpperCase() == 'HIDDEN')
    {
      p.value = pagina;
    }
}
