function SuggestionProvider(SuggestionsURL, TableName)
{
  this.SuggestionsURL = SuggestionsURL;
  this.TableName = TableName;
  this.httpRequest = CreateHttpRequest();
}

function CreateHttpRequest()
{
  var Result = null;
  if(window.XMLHttpRequest)     // Mozilla, Safari, ...
  {
    Result = new XMLHttpRequest();
    if(Result.overrideMimeType)
      Result.overrideMimeType('text/xml');
  }
//  else if(window.createRequest) {
//    try
//    {
//     Result = window.createRequest();
//    }
//    catch (e) {}
//  }
  if(!Result && window.ActiveXObject) // IE
  {
    try
    {
      Result = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      try
      {
        Result = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e) {}
    }
  }
  return Result;
}

SuggestionProvider.prototype.Abort = function ()
{
  if(this.httpRequest.readyState!=0)
  {
    this.httpRequest.onreadystatechange = null;
    this.httpRequest.abort();
  }
}

SuggestionProvider.prototype.RequestSuggestions = function (ComboBox, TypeAhead)
{
  if(this.httpRequest.readyState!=0)
  {
    this.httpRequest.onreadystatechange = null;
    this.httpRequest.abort();
  }
  this.ComboBox = ComboBox;
  this.TypeAhead = TypeAhead;
  var URL = this.SuggestionsURL+'?'+this.TableName+'='+encodeURIComponent(ComboBox.Textbox.value);
  var Self = this;
  this.httpRequest.onreadystatechange = function() {
    if(Self.httpRequest.readyState==4 && Self.httpRequest.status==200)
    {
      Self.ComboBox.AutoSuggest(ParseOutArray(Self.httpRequest.responseText), Self.TypeAhead);
    }
  };
  this.httpRequest.open('GET', URL, true);
  this.httpRequest.send('');
}

function RemoveDuplicateAmpersands(s)
{
  var Result = '';
  for(var i = 0; i<s.length; i++)
  {
    Result += s.substr(i, 1);
    if(s.substr(i, 1)=='&')
      i++;
  }
  return Result;
}

function ParseOutArray(s)
{
  var Result = [];
  var p = 0;
  for(var i = 0; i<=s.length; i++)
    if(i==s.length
       || (s.substr(i, 1)=='&'
            && (i<s.length-1 && s.substr(i+1, 1)!='&')
            && (i>0 && s.substr(i-1, 1)!='&')))
    {
      ss = RemoveDuplicateAmpersands(s.substr(p, i-p));
      if(ss)
        Result.push(ss);
      p = i+1;
    }
  return Result;
}
