/* KeyTyper.js														*/

/* COPYRIGHT 2004 QUICK TECHNOLOGIES INC.  ALL RIGHTS RESERVED.     */
/* THIS ENTIRE PAGE IS COPYRIGHTED BY QUICK TECHNOLOGIES INC.       */
/* COPYING, MODIFICATION, OR DISTRIBUTION OF THIS PROPRIETARY       */
/* SOURCE CODE IS STRICTLY PROHIBITED.                              */

function SmartSelect(oInput, oSelect)
{
 var sInput = String(oInput.value).toUpperCase();
 var iLength = sInput.length;

 if (iLength <= 0)
  return 0;

 var oOptions = oSelect.options;
 var i, diff, bFound, sTemp;

 var iHigh = oSelect.length - 1;
 var iLow = 0;
 var iCurrent = Math.floor((iHigh + 1) / 2);

 bFound = false;
 do
 {
  // Get the current option
  sTemp = oOptions[iCurrent].text.toUpperCase();
  var sSubstr = sTemp.substr(0, iLength);

  if (sSubstr < sInput)
  {
   // Search the upper half of the branch
   iLow = iCurrent + 1;
  }
  else if (sSubstr > sInput)
  {
   // Search the lower half of the branch
   iHigh = iCurrent - 1;
  }
  else
  {
   bFound = true;
   break;
  }

  // Pick the middle of the branch again
  iCurrent = Math.floor(iLow + ((iHigh + 1) - iLow) / 2);

 } while (iHigh >= iLow)

 // Is there a better prefix match?
 if (iLength < sTemp.length)
 {
  // Store the current old value
  var iOld = iCurrent--;

  // Now go back until we find one that doesn't match the prefix
  while (iCurrent >= 0)
  {
   // Gone too far -- the prefix no longer matches.
   if (oOptions[iCurrent].text.toUpperCase().substr(0, iLength) != sInput)
    break;

   iOld = iCurrent--;
  }

  iCurrent = iOld;
 }

 if (bFound)
  return iCurrent;
 else
  return -1;
}

function DumbSelect(oInput, oSelect)
{
 var sInput = String(oInput.value).toUpperCase();
 var iLength = sInput.length;

 if (iLength <= 0)
  return 0;

 var oOptions = oSelect.options;
 var nElements = oSelect.length;

 for (var iCurrent = 0; iCurrent < nElements; iCurrent++)
 {
  if (oOptions[iCurrent].text.substr(0, iLength).toUpperCase() == sInput)
  {
   break;
  }
 }

 if (iCurrent < nElements)
  return iCurrent;
 else
  return -1;
}

function BinarySearch(txt,list)
{
 var i = SmartSelect(txt,list);
 list.selectedIndex = i;
}

function LinearSearch(txt,list)
{
   var i = DumbSelect(txt,list);
   list.selectedIndex = i;
}
