document.onmousemove = mouseMoved;
function mouseMoved(e) { resultsOnMouseOver = true; }
var resultsOnMouseOver = false;








function ltrim(argvalue) {

  while (1) {
    if (argvalue.substring(0, 1) != " ")
      break;
    argvalue = argvalue.substring(1, argvalue.length);
  }

  return argvalue;
}


var arrayCreated = false;

var serverArray;

function initarray()
{
  if(arrayCreated == false)
  {
    //alert("initarray called");
    serverArray=keywordData.split("^");
    arrayCreated=true;



  }


}

function getQueryResults(q)
{
  initarray();

  q = q.toLowerCase();
  q = q.replace("'", "&#39;");

  var answer = new Array();

  var z=0;
  var c=0;
  while(z<serverArray.length)
  {

    if(c>35)
    {
      return sort_by_prefix(answer,q); //we have too many results
    }
    //if( ( (z%3)==0) && (q.length>0))
    if(q.length>0)
    {
      if(serverArray[z].toLowerCase().indexOf(q)==0  )
      {
        // var myArray = new Array();
        // myArray.push(serverArray[z]);
        // answer.push(myArray);
        answer.push(serverArray[z]);
        c++;
      }
    }

    //let's populate with non-begin matches, mid-section matches, etc only for 2 letters in length or greater
    if(q.length>1)
    {
      if(serverArray[z].toLowerCase().indexOf(q)!=-1 && serverArray[z].toLowerCase().indexOf(q) != 0 )
      {

        // var myArray = new Array();
        // myArray.push(serverArray[z]);
        // answer.push(myArray);
        answer.push(serverArray[z]);
        c++;
      }
    }




    z++;
  }



  return sort_by_prefix(answer, q);
}

function sort_by_prefix(myarray, q)
{
  //answer is the array
  //q is the query string
  //we want results that match q at beginning to come first
  //let's just do passes of the result set and build a new result array
  var z = 0;

  var answer1 = new Array();  //the prefix matches
  var answer2 = new Array();  //the other matches
  while( z < myarray.length )
  {
    if(myarray[z].toLowerCase().indexOf(q) == 0) answer1.push(myarray[z]);
    z++;
  }

  z=0;
  while( z < myarray.length )
  {
    if(myarray[z].toLowerCase().indexOf(q) != 0) answer1.push(myarray[z]);
    z++;
  }



  return answer1;

}



var gsc_basicmatch = /[a-z0-9]/i;
var newQuery = false;

function ez_clearquery(elt)
{
  elt.currentQuery='';
  elt.tempQuery='';
}

function gsc_getquery(elt, q)
{
  q = ltrim(q);
  q = q.replace('\s+', ' ');
  if (q.length == 0 || !gsc_basicmatch.test(q)) {
    gsc_emptyresults(elt);
    return '';
  }

  if (elt.currentQuery && (elt.currentQuery == q || elt.tempQuery == q))
    return '';

  elt.currentQuery = q;
  return q;
}

function gsc_hide(elt)
{
  if (elt) elt.style.display = 'none';
}

function gsc_ishidden(elt)
{
  return elt.style.display == 'none';
}

function gsc_show(elt)
{
  if (elt) elt.style.display = 'block';
}

function gsc_emptyresults(elt)
{

  if (!elt) return;


  elt.innerHTML = '';
  elt.numResults = 0;
  elt.selectedIndex = 0;
  elt.results = [];
  gsc_hide(elt);
}

function gsc_addresult(elt, qElt, q, c, n, sel)
{

  if (!elt) return;

  //old stuff
  if(newQuery)
  {
    document.getElementById('keyword').value = c;
    newQuery=false;
  }

  if (sel) elt.selectedIndex = elt.numResults;

  idx = elt.numResults;
  elt.results[elt.numResults++] = q;

  var _res = '';
  _res += '<div keyworddiv="'+c+'" class="' + (sel ? 'srs' : 'sr') + '"'
    +  ' onmouseover="gsc_mouseover(\'' + elt.id + '\', \'' + qElt.id + '\', ' + idx + ')"'
    +  ' onmouseout="gsc_mouseout(\'' + elt.id + '\', ' + idx + ')"'
    +  ' onclick="gsc_mouseclick(\'' + elt.id + '\', \'' + qElt.id + '\', ' + idx + ')">';
  _res += '<span class="srt">' + q + '</span>';
  if (c.length > 0)
    _res += '<span class="src">' + n + '</span>';
  _res += '</div>';

  elt.innerHTML += _res;
}

var lastResult;
function gsc_mouseover(id, qId, idx)
{
  elt = document.getElementById(id);
  elt.selectedIndex = idx;
  qElt = document.getElementById(qId);
  qElt.focus();

  //we don't show results on a mouseover
  //unless the person has moved the mouse
  //this is so you can type and use backspace without
  //your search being overwritten by a mouseover event
  if(resultsOnMouseOver)
    if(lastResult != elt.results[idx])
    {
      lastResult = elt.results[idx];
      qElt.value = elt.results[idx];
    }
  gsc_highlightsel(elt);
}

function gsc_mouseout(id, idx)
{
  elt = document.getElementById(id);
  elt.selectedIndex = -1;

  gsc_highlightsel(elt);
}

function gsc_mouseclick(id, qId, idx)
{
  elt = document.getElementById(id);
  qElt = document.getElementById(qId);

  qElt.value = elt.results[idx];
  //  if(!document.suggestnosubmit)
  //  qElt.form.submit();
  //  else
  gsc_hide(__results);
}

function gsc_handleup(elt, qElt)
{
  resultsOnMouseOver = false;

  if (elt.numResults > 0 && gsc_ishidden(elt)) {
    gsc_show(elt);
    return;
  }

  if (elt.selectedIndex == 0)
    return;
  else if (elt.selectedIndex < 0)
    elt.selectedIndex = elt.numResults - 1;
  else
    elt.selectedIndex--;
  gsc_highlightsel(elt, qElt);
}

function gsc_handledown(elt, qElt)
{
  resultsOnMouseOver = false;
  if (elt.numResults > 0 && gsc_ishidden(elt)) {
    gsc_show(elt);
    return;
  }

  if (elt.selectedIndex == elt.numResults - 1)
    return;
  else if (elt.selectedIndex < 0)
    elt.selectedIndex = 0;
  else
    elt.selectedIndex++;


  gsc_highlightsel(elt, qElt);
}

function gsc_highlightsel(elt, qElt)
{
  divs = elt.getElementsByTagName('div');

  for (i = 0; i < divs.length; i++) {
    if (i == elt.selectedIndex) {


      document.getElementById('keyword').value=divs[i].getAttribute("keyword");

      divs[i].className = 'srs';
      elt.tempQuery = elt.results[i];

      if (qElt) {
        qElt.value = elt.results[i];
        if (qElt.createTextRange) {
          r = qElt.createTextRange();
          r.moveStart('character', elt.currentQuery.length);
          r.moveEnd('character', qElt.value.length);
          r.select();
        }
      }
    }
    else
      divs[i].className = 'sr';
  }
}




function ltrim(str)
{
  return str.replace(/^\s*/, '');
}

function ajaxac_getkeycode(e)
{
  if (document.layers)
    return e.which;
  else if (document.all)
    return event.keyCode;
  else if (document.getElementById)
    return e.keyCode;
  return 0;
}








function processQuery()
{
  //   alert("prcessing query");

  var _q = gsc_getquery(__results, __query.value);
  if (_q.length == 0)
    return false;



  //_data = ajaxac_receivejsarray(__gscfetch.responseText);
  // alert(_q);
  var _data = getQueryResults(_q);
  // alert(_data);

  gsc_emptyresults(__results);
  if (_data.length > 0) {
    for (i = 0; i < _data.length; i++) {
      //gsc_addresult(__results, __query, _data[i][0], _data[i][1], _data[i][2], i == 0);
      gsc_addresult(__results, __query, _data[i], "", "", i == 0);
    }
    gsc_show(__results);
  }
}





__query.onkeyup = function(e)
{
  processQuery();
}

__query.onkeypress = function(e)
{

  resultsOnMouseOver = false;
  //if(document.suggestnosubmit) {

  key = ajaxac_getkeycode(e);
  switch (key) {
    case 13: //enter

   //   gsc_highlightsel(__results, __query);
      gsc_hide(__results);
    //  if(!e) var e = window.event;
   //   e.cancelBubble=true;
   //   if(e.stopPropagation)e.stopPropagation();
   //   return false;
      break;
    default:
      break;
  }
  //}
}



//this used to be onkeydown
__query.onkeydown = function(e)
{
  resultsOnMouseOver=false;
  newQuery=true;

  key = ajaxac_getkeycode(e);

//   if(key == 13)
//   {
//     document.suggestform.submit();
//   }

  switch (key) {
    case 8: //backspace
      //      alert("case 46");
      ez_clearquery(__results);
      return true;
      break;
    case 46: //delete
      //   alert("case 46");
      ez_clearquery(__results);
      return true;
      break;
    case 27: // escape
      gsc_hide(__results);
      return false;
      break;
    case 38: // up arrow
      gsc_handleup(__results, __query);
      return false;
      break;
    case 40: // down arrow
      gsc_handledown(__results, __query);
      return false;
      break;
       default:
      //                                        __gsctimer.start();
  }
  return true;
}




