var SearchProvider = Function.extend(
  function ()
  {
    this.oAutoSuggestControl = null;

    this.lastSearchRequest = null;

    this.lastGoodSearchText = null;

    this.currentSearchText = "";

    this._useSearchCache = true;

    this._searchCache = new Array();

    this._searchScope = null;

  },
  {
    requestSuggestions: function (oAutoSuggestControl, bTypeAhead)
    {
      if(null === this.oAutoSuggestControl)
      {
        this.oAutoSuggestControl = oAutoSuggestControl;

      }

      var searchText = oAutoSuggestControl.oTextbox.value.replace(/^\s*|\s*$/g, "");
      this.currentSearchText = searchText;
      if(searchText !== "")
      {
        if((this._useSearchCache) && (this._searchCache[searchText]))
        {
          this.returnResults(this._searchCache[searchText], bTypeAhead);

        }
        else
        {
          this.startSearch(bTypeAhead);

        }
      }
    },

    setSearchScope: function ( searchScope )
    {
      if( searchScope === '' )
      {
        searchScope = null;
      }
      this._searchScope = searchScope;

      /**
       * To allow for calling this method when instantiating the
       * object.
       */
      return this;
    },

    getSearchScope: function ()
    {
      return this._searchScope;
    },

    startSearch: function ()
    {
      alert("This is an abstract method");

    },

    processSearchResults: function ()
    {
      alert("This is an abstract method");

    },

    failedSearch: function ( oXHR, sTextStatus )
    {
      var newArray = new Array();
      this.oAutoSuggestControl.autosuggest( newArray, false);
    },

    returnResults: function (aSuggestions, bTypeAhead)
    {
      if(aSuggestions.length > 0)
      {
        this.lastGoodSearchText = this.currentSearchText;
        if(!this._searchCache[this.currentSearchText])
        {
          this._searchCache[this.currentSearchText] = aSuggestions;

        }
      }
      else
      {
        if((this.currentSearchText.indexOf(this.lastGoodSearchText, 0) >= 0) && (typeof this._searchCache[this.lastGoodSearchText] !== 'undefined'))
        {
          aSuggestions = this._searchCache[this.lastGoodSearchText];

        }
        else
        {
          this.lastGoodSearchText = '';

        }
      }
      this.oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);

    }
  }
);

