
var Cost = {
  
	LiveSearch: {
    _s: null,
    _r: null,
    _f: null,
    
    s: function() {
      if(this._s == null) {
        this._s = $('input-search');
      }
      return this._s;
    },
    
    r: function() {
      if(this._r == null) {
        this._r = $('search-results')
      }
      return this._r;
    },
    
    f: function() {
      if(this._f == null) {
        this._f = $('search').select('form')[0];
      }
      return this._f;
    },
    
    over: function(e) {
      $(e).removeClassName('off');
      $(e).addClassName('over');
    },
    
    off: function(e) {
      $(e).removeClassName('over');
      $(e).addClassName('off');
    },
    
    go: function(e) {
			if ($(e)) {
				window.location = $(e).select('a');
			}
    },
    
    keyListener: function(e) {
      var lis = Cost.LiveSearch.r().select('li');
      lis.over = function() {
        return this.select(function(e) {
					return e.hasClassName('over');
        }).first();
      };
      switch(e.keyCode) {
      case Event.KEY_DOWN:
        var element = null;
        if(lis.over()) {
          element = lis[lis.indexOf(lis.over()) + 1];
          Cost.LiveSearch.off(lis.over());
          if(element == null) {
            element = lis.first();
          }
        } else {
          element = lis.first();
        }
        Cost.LiveSearch.over(element);
        break;
      case Event.KEY_UP:
        var element = null;
        if(lis.over()) {
          element = lis[lis.indexOf(lis.over()) - 1];
          Cost.LiveSearch.off(lis.over());
          if(element == null) {
            element = lis.last();
          }
        } else {
          element = lis.last();
        }
        Cost.LiveSearch.over(element);
        break;
      case Event.KEY_RETURN:
        e.returnValue = false;
        Cost.LiveSearch.go(lis.over());
        break;
      }
    },
    
    showSpinner : function() {
      Cost.LiveSearch.s().addClassName('spinner');
    },
    
    hideSpinner : function() {
      Cost.LiveSearch.s().removeClassName('spinner');
      Cost.LiveSearch.r().show();
    },
    
    showResults : function() {
      Cost.LiveSearch.r().appear( { duration: 0.25, fps: 100 });
    },
    
    hideResults : function() {
      Cost.LiveSearch.r().fade( { duration: 0.25, fps: 100 });
    },
    
    addListeners : function() {
      Event.observe(this.s(), 'focus', this.showResults);
      Event.observe(this.s(), 'blur', this.hideResults);
      Event.observe(this.s(), 'keydown', this.keyListener);
    }
  }
  
  
  
};
