var wr_ss_foundValue;
function wr_searchSelect(search)
{
  var name, comboName, combo, status;
  name = search.name;
  if (name.substr(0,10) == "wr_search_") comboName = name.substr(10);
  combo = search.form.elements[comboName];
  status = wr_searchSelectDoit(combo, search.value);
  wr_searchSelectHighlight(search, status);
}
function wr_cleanMSsql(astring)
{
  return astring.toLowerCase().replace("w","v").replace("-","");
}
function wr_searchSelectDoit(combo, value)
{
  var status, wr_sso;
  wr_sso = new searchSelectClass(combo, value);
  if (wr_sso.getIndex()>-1) combo.selectedIndex = wr_sso.getIndex();
  status = wr_sso.getState();
  return status;
}

function wr_searchSelectHighlight(ip, state)
{  
  switch (state) 
  {
    case wr_e_CS.empty : 
      ip.style.backgroundColor = "";
      break;
    case wr_e_CS.found : 
      ip.style.backgroundColor = "AAAAFF";
      break;
    case wr_e_CS.error : 
      ip.style.backgroundColor = "FFAAAA";
      break;
    case wr_e_CS.floating : 
      ip.style.backgroundColor = "";
      break;
  }
  if (state==wr_e_CS.found) {
    //ip.blur();
  }
}

var wr_ab = new Array();
function wr_loadAlphabet() {
  var ab, i, a;
  // if hidden input wr_alphabet is missing - browser collision is used.
  ab = document.getElementById("wr_alphabet");
  if (ab == null) return;

  for (i=0; i<ab.value.length; i++)
  {
    a = ab.value.substr(i,1).toLowerCase();
    wr_ab[a] = i+1;
  }  
}

var wr_e_CS = //combo state enum
{
  empty:0, 
  found:1, 
  error:2, 
  floating:3
};
function searchSelectClass(combo, value)
{
  this.getIndex = function() { return selected; }
  this.getState = function() { return state; }
  var value, selected, n, state;
  n = combo.length-1;
  selected = getIndex_i();
  state = getState_i();
  this.setValue = setValue_i;
  
  function setValue_i(newValue)
  {
    value = newValue;
  }
  function getIndex_i()
  {
    var i, j, k, v, partly, part;

    if (checkFound_i()) return combo.selectedIndex;
    if (value=="") return -1;
    i = 1;
    j = n;  
    while (i+1<j) {
      k = i + Math.floor((j-i) / 2);
      v = combo.options[k].text;
  //alert(isBeforeLanguage(value,v) + ' ' + value + ' ' + v);
      if (isBeforeLanguage(value, v))
        j = k;
      else 
        i = k;
    }
    if (i==1 && isBeforeLanguage(value, combo.options[1].text))
    {
      j = 1;
      k = 1;
    }
    if (j==n && isBeforeLanguage(combo.options[n].text, value))
    {
      i = n;
      k = n;
    }

    partly = false;
    part = value;
    while (part > "" && !partly) 
    {
      if (isSub(combo.options[i].text, part)) 
      {
        k = i;
        partly = true;
      } else if (isSub(combo.options[j].text, part)) 
      {
          k = j;
          partly = true;
      } else
      {
        part = part.substr(0, part.length-1);
      }
    }
    return k;
  }
  
  function checkFound_i() 
  {
    if (wr_ss_foundValue > "") 
    {
      if (value.substr(0, wr_ss_foundValue.length) == wr_ss_foundValue) 
      {
        return true;
      }
      else 
      {
        wr_ss_foundValue = "";
        return false;
      }
    } else
    {
      return false;
    }
  }

  function getState_i()
  {
    var state_i;
    
    if (selected == -1) return wr_e_CS.empty;
    if (checkFound_i()) return wr_e_CS.found;
    if (isSub(combo.options[selected].text, value)) 
    {
      if (selected<n)
      {
        if (!(isSub(combo.options[selected+1].text, value))) 
        {
          state_i = wr_e_CS.found;
        } else
        {
          state_i = wr_e_CS.floating;
        }
      } else
      {
        state_i = wr_e_CS.found;
      }
    } else
    {
      state_i = wr_e_CS.error;
    }
    if (state_i == wr_e_CS.found) wr_ss_foundValue = value;
    return state_i;
  }

  function isSub(a, b) 
  {
    a = wr_cleanMSsql(a);
    b = wr_cleanMSsql(b);
    return ( (a.toLowerCase()).substr(0, b.length) == b );
  }  
  
  function isBeforeLanguage(a, b) 
  {
    // if wr_loadAlphabet() is not run - browser collision is used.   //alert(a+ ' ' +b);
    if (typeof(wr_ab) != "object") return (a < b);
    
    var i, ap, bp, diff, l;
    a = wr_cleanMSsql(a);
    b = wr_cleanMSsql(b);
    l = a.length;
    if (b.length < l) l = b.length; // l = minimum length
    
    i = 0;
    diff = false;
    while (!diff && i < l)
    {
      ap = a.substr(i,1);
      bp = b.substr(i,1);
      diff = (ap != bp);
      i++;
    }
    if (i=l && !diff) 
      return a.length < b.length;
    if (isNaN(wr_ab[ap]) || isNaN(wr_ab[bp])) 
    {
      return (ap < bp); // all other symbols
    } else
    {
      return (wr_ab[ap] < wr_ab[bp]); // desired Dictionary order
    }
  }
}

