/*global YAHOO */

/*jslint white: true, onevar: true, browser: true, on: true, undef: true,
         eqeqeq: true, plusplus: true, bitwise: true, regexp: true,
         newcap: true, immed: true, indent: 2, nomen: false */

YAHOO.namespace("search");

YAHOO.search.AutoComplete = function (args) {
  if (args) {
    this.init(args);
  }
};

if (!YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown_orig) {
  YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown_orig = YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown;
}

YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function (v, oSelf) {
  if (!oSelf._bContainerOpen && v.keyCode === 40) {
    oSelf.sendQuery(this.value);
    oSelf._moveSelection(38);
  } else if (!oSelf._bContainerOpen && v.keyCode === 13 && oSelf.searchFunc) {
    oSelf.searchFunc.fn.call(oSelf.searchFunc.scope);
    return false;
  }
  return oSelf._onTextboxKeyDown_orig(v, oSelf);
};

YAHOO.extend(YAHOO.search.AutoComplete, YAHOO.widget.AutoComplete);

function createAutoComplete(args) {
  var fixPosition, dataArray, myAutoComp;
  if (args.searchFieldID && args.autoCompleteDivID && args.dataURL && args.dataStructure) {
    fixPosition = function () {
      var elText, elContainer;
      elText = this._elTextbox;
      elContainer = this._elContainer;
      elContainer.style.top = YAHOO.util.Dom.getY(elText) + elText.offsetHeight + "px";
      elContainer.style.left = YAHOO.util.Dom.getX(elText) + "px";
    };

    dataArray = new YAHOO.util.XHRDataSource(args.dataURL, {
      responseType: YAHOO.util.DataSourceBase.TYPE_JSON,
      scriptQueryParam: args.scriptQueryParam || "word",
      maxCacheEntries: args.maxCacheEntries || 100,
      responseSchema: args.dataStructure
    });

    myAutoComp = new YAHOO.widget.AutoComplete(args.searchFieldID, args.autoCompleteDivID, dataArray);
    myAutoComp.queryDelay = args.queryDelay || 0.05;
    myAutoComp.queryMatchSubset = args.queryMatchSubset || true;
    myAutoComp.delimChar = args.delimChar || " ";
    myAutoComp.maxResultsDisplayed = args.maxResultsDisplayed || 10;
    myAutoComp.minQueryLength = args.minQueryLength || 2;
    myAutoComp.useShadow = args.useShadow || true;
    myAutoComp.useIFrame = args.useIFrame || true;
    myAutoComp.textboxFocusEvent.subscribe(fixPosition);
    myAutoComp.searchFunc = args.searchFunc;
  }
}
