var doCache = true; //turn to false while development
var frontendURL = "../user-search.php"; //script that return results of search
var spyTimeout = 250; // how fast the user's input should be checked

window.onload = suggester_start;
document.onkeydown = keyPressed;
document.onclick=function(event){completeDiv.style.display="none"}
var oldText = "";
var requestCache = new Object;
var inc = 0;
var typo;
var completeDiv;
var makeAutoComplete = true;
var resultsContainerID = 'completeDiv';  //ID of DIV with resluts

//adjusts the main container
function suggester_start()
{
  completeDiv = document.createElement("DIV");
  completeDiv.id = resultsContainerID;
  completeDiv.name = completeDiv.id;
  completeDiv.className = "container";
  typo = document.getElementById(textInputID);

  if(null != typo)
  {
    with(completeDiv.style)
    {
      top  = getTop(typo)+typo.offsetHeight-1+"px";
      left = getLeft(typo)+"px";
      width= getWidth(typo, 300)+"px";
      display = "none";
  }
    document.body.appendChild(completeDiv);
  
    typo.select();
    completeDiv = document.getElementById(resultsContainerID);
    startSpy(typo);
  }
  else
    alert("can NOT initialize results container!");
}

//starts to look if value of text is changed
function startSpy()
{
  var textInput = document.getElementById(textInputID);
  if(null != textInput)
  {
    if(oldText != textInput.value)
    {
//      window.status = textInput.value;
      if("" != trim(textInput.value))
      {
        searchFor(textInput.value)
      }
      else
      {
        switchContainer(0);
        setTimeout("startSpy()", spyTimeout);
      }
      oldText = textInput.value;
    }
    else
    {
      setTimeout("startSpy()", spyTimeout);
    }
  }
}

//looks in cache for query results. If none - asks server for a one
function searchFor(text)
{
    do_request({qu: text});
}

//processes the server answer and starts spying
function processAnswer(text)
{
  if(null != text)
  {
    clearContainer();
//  fnShowProps(text);
    var hl = false; //highlight has been done?
    
    theExp1 = new RegExp("%index%", "g");
    theExp2 = new RegExp("%value%", "g");
    
    for(i in text)
    {
//        alert(i)
      if(doAutoComplete && makeAutoComplete && !hl)
      {
        var start = typo.value.length;
        typo.value = i;
        oldText = i;
        highlightText(typo, start);
        hl = true;
      }
      var pat = i;
      if(null != resultPattern && "" != trim(resultPattern))
      {
        pat = resultPattern;
        pat = pat.replace(theExp1, i);
        pat = pat.replace(theExp2, text[i]);
      }
      addToContainer(pat);
    }
    switchContainer(1);
  }
  setTimeout("startSpy()", spyTimeout);
}

//makes server query for data result
function do_request(thash)
{
  var req = new Subsys_JsHttpRequest_Js();
  req.serviceName = thash.serviceName;
  req.onreadystatechange = function()
  {
    if (req.readyState == 4)
    {
      if (req.responseJS)
      {
//        requestCache[thash["qu"]] = req.responseJS.text;
        processAnswer(req.responseJS.text)
      }//if
    }
  }
  req.caching = doCache;
  req.open('GET', frontendURL, true);
  req.send(thash);
}

function compile_hash(name, pass, service, serviceName)
{
  return {ready:false, login:name, pass:pass, service:service, serviceName:serviceName};
}

//hightlisghts the text into text input from [startPos] up to the end
function highlightText(d, startPos)
{
  if(d.createTextRange)
  {
    var t=d.createTextRange();
    t.moveStart("character", startPos);
    t.select() 
  }
  else if(d.setSelectionRange)
  {
    d.setSelectionRange(startPos, d.value.length)
  }
}

//counts absolute coordinate (parent loop)
//direction ca be 'offsetTop', 'offsetLeft'
function countCoord(obj, direction)
{
  var kb=0;
  while(obj)
  {
    kb+=obj[direction]; 
    obj=obj.offsetParent
  }
  return kb;
}

function getTop(obj)
{
  return countCoord(obj, 'offsetTop');
}

function getLeft(obj)
{
  return countCoord(obj,'offsetLeft');
}

function getWidth(obj, def)
{
  if(null!=obj)
  {
    ca = 2.5;
    if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1)
    {
      return obj.offsetWidth-ca*2;
    }
    else
    {
      return obj.offsetWidth;
    }
  }
  else
  {
    return def;
  }
}

function trim(st)
{
  var len = st.length;
  var begin = 0, end = len - 1;
  while (st.charAt(begin) == " " && begin < len)
  {
    begin++;
  }
  while (st.charAt(end) == " " && begin < end)
  {
    end--;
  }
  return st.substring(begin, end+1);
}


function fnShowProps(obj)
{
  var objName="obj";
  var result = "";
  for (var i in obj)
      result += objName + "." + i + " = " + obj[i] + "\n";
  alert(result);
}

function clearContainer()
{
  inc = 0;
//  alert("clearContainer: " + completeDiv.innerHTML);
  completeDiv.innerHTML = "";
}

function addToContainer(text)
{
//  alert("addToContainer got " + text);
  completeDiv.innerHTML += "<span class=\"span" + inc%2 + "\">" + text + "</span><br/>";
  inc++;
}

  function switchContainer(state)
{
  completeDiv.style.display = (state ? 'block' : 'none');
}


function keyPressed(event) 
{
  var Key;
  makeAutoComplete = true;
  if(!event && window.event) 
  {
    event=window.event;
  }
  
  if(event) 
  {
    Key=event.keyCode;
  //  window.status = Key;
    if(8 == Key || 46 == Key) //backspace or del
    {
      makeAutoComplete = false;
    } //if key 8
  } //if event
}