var LiveSearch = Class.create();
LiveSearch.ButtonClasses = ['search', 'spinner', 'cancel'];

LiveSearch.prototype = {
  initialize: function(options) {
    this.setOptions(options);
    this.registerCallbacks();
    this.setButtonClass('search');
  },
  
  setOptions: function(options) {
    this.options = {}
    for (key in options)
      this[key] = 
        key.match(/Element$/) ? $(options[key]) : options[key];

    Element.cleanWhitespace(this.resultsElement);
    this.resultsWrapper = this.resultsElement.parentNode;
    this.resultsContent = this.resultsElement.childNodes[0];
  },
  
  registerCallbacks: function() {
    this.buttonElement.onclick = 
	this.onButtonClick.bindAsEventListener(this);
    this.observer = new Form.Observer(this.formElement, 
	1, this.onFormChanged.bind(this));
	Event.observe('search-string', 'blur', this.loseTheBloodyFocus.bind(this));
  },
  
  onFormChanged: function(element, value) {
    if (this.inputElement.value == '') 
      return this.closeResults();

    new Ajax.Updater(this.resultsContent, this.searchURL+this.inputElement.value, {
      onLoading:  this.onResultsLoading.bind(this),
      onComplete: this.onResultsLoaded.bind(this),
      parameters: value
    });
  },
  
  onResultsLoading: function(request) {
    this.setButtonClass('spinner');
    if (!this.resultsVisible) {
      this.resultsVisible = true;
      this.resultsContent.innerHTML = '<br/><p>Searching...</p>';
      new Effect.SlideDown(this.resultsElement, {duration: 0.25});
    }
  },
  
  onResultsLoaded: function(request) {
    this.setButtonClass('cancel');
  },
  
  onButtonClick: function() {
    switch (this.buttonElement.className) {
      case 'search':
        this.inputElement.focus();
      case 'cancel':
        this.inputElement.value = '';
        this.closeResults();
    }
  },
  
  setButtonClass: function(klass) {
    this.buttonElement.className = klass;
  },
  
  clearResults: function() {
    this.resultsVisible = false;
  },
 
  loseTheBloodyFocus: function(event) {
       this.inputElement.value = '';	
    /*     this.closeResults();*/
  },
	  
  closeResults: function() {
    if (this.resultsVisible) {
      this.resultsVisible = false;
      Effect.Fade(this.resultsElement, {delay: 0.25, duration: 0.25});
    }
    this.setButtonClass('search');
  }
}
