/*
  config format - part of a defined query.
 <suggestConfig>
    <suggestInput pdqfield="name" elementId="sqlQuery.OwnerSearch.nameInputField" resultElementId="sqlQuery.OwnerSearch.nameInputFieldSuggestList" timeout="500" pdq_dbid="AllenCoOHData" pdq_table="ALLJOINED" pdq_field="ALLJOINED.OWNNAM1" pdq_limit="10" />
 </suggestConfig>
*/

QuerySuggest = function(inputElement,resultElement,timeout,pdq_dbid,pdq_field,pdq_table,pdq_limit){
  var keyCounter = 0;
  var typing=false;
  var focused = false;
  var last_search = '';
  var useHiddenResults = resultElement.style.display == 'none';
  
  //define event callback functions
  function hideResults(){
    if (useHiddenResults)
      resultElement.style.display = 'none';
  };
  
  function blurCallback(){
    keyCounter++;
    hideResults();
  };
  
  function focusCallback(){
    keyCounter++;
    hideResults();
  };
  
  function addResultValueEvents(ele){
    xAddEventListener(ele,'mousedown',function(evt){inputElement.value = ele.firstChild.nodeValue;hideResults();});
    xAddEventListener(ele,'mouseover',function(evt){setClass(ele,'querySuggestListRowActive');});
    xAddEventListener(ele,'mouseout',function(evt){setClass(ele,'querySuggestListRowInactive');});
  };
  
  function keyUpCallback(){
    keyCounter++;
    var currentCount = keyCounter;
    var currentValue = inputElement.value;
    setTimeout(function(){
      if ((keyCounter==currentCount)&&(currentValue == inputElement.value)){
        var searchString = inputElement.value;
        if ((searchString.strtrim()!='')&&(searchString!=last_search)){
          hideResults();
          last_search = searchString;
          var whereClause = 'Upper('+pdq_field+') like \''+searchString.toUpperCase()+'%\'';
          freeance_request(
            function(clientReply){
              if((keyCounter==currentCount)&&(currentValue == inputElement.value)){
                var currentNode = null;
                var noResults = false;
                if (clientReply.XMLRPC_FAULT){
                  if(typeof(console)!='undefined')
                    console.warn(clientReply.XMLRPC_FAULT_MESSAGE);
                  else
                    dprintf(clientReply.XMLRPC_FAULT_MESSAGE);
                }
                else{
                  var results = clientReply.data;
                  var nl=resultElement.childNodes.length;
                  for (var n=0;n<nl;n++){
                    resultElement.removeChild(resultElement.childNodes.item(nl-n-1));
                  };
                  for (var currentResult=0;currentResult < results.length; currentResult++){
                    var currentNode = document.createElement('DIV');
                    currentNode.appendChild(document.createTextNode(results[currentResult][pdq_field]));
                    addResultValueEvents(currentNode);
                    resultElement.appendChild(currentNode);
                  };
                  if (useHiddenResults){
                    resultElement.style.display = 'block';
                  }
                }
              }
            },
            'SQL.query.limitselect',
            pdq_dbid,'distinct '+pdq_field,pdq_table,whereClause,pdq_limit,0);
        }
      }
    },timeout);
  };
  
  this.linkElements=function(inele,outele){
    //make sure that the elements have appropriate data associated with them and that pointers are correct
    inputElement = inele;
    resultElement = outele;
    inputElement.autocomplete = 'off';  //disable native browser autocomplete
    xAddEventListener(inputElement,'keyup',keyUpCallback);
    xAddEventListener(inputElement,'focus',focusCallback);
    xAddEventListener(inputElement,'blur',blurCallback);
  };
  
  this.enabled = true;
  if((!inputElement)||(!resultElement)){
    this.enabled = false;
  }
  else{
    useHiddenResults = resultElement.style.display == 'none';
    this.linkElements(inputElement,resultElement);
  }
};

SuggestControl = function(){
  this.suggestIndex = new Array;
  this.lookupTable = new Object; //find index by element name
  this.addSuggest = function(suggestConfigObject){
    if (this.lookupTable[suggestConfigObject.elementId]==null){
      var newIndex = this.suggestIndex.length;
      //console.dir(suggestConfigObject);
      var newSuggest = this.suggestIndex[newIndex] = new QuerySuggest(
        document.getElementById(suggestConfigObject.elementId),
        document.getElementById(suggestConfigObject.resultElementId),suggestConfigObject.timeout,
        suggestConfigObject.dbid,suggestConfigObject.fieldname,suggestConfigObject.tablename,suggestConfigObject.resultlimit);
      this.lookupTable[suggestConfigObject.elementId] = newIndex;
    }
    else{
      //already built; relink elements just-in-case.
      this.suggestIndex[this.lookupTable[suggestConfigObject.elementId]].linkElements(document.getElementById(suggestConfigObject.elementId),document.getElementById(suggestConfigObject.resultElementId));
    }
  };
};
document.SuggestControl = new SuggestControl();

