var doCache = true; //turn to false while development
var frontendURL = "suggest/front-end.php"; //script that return results of search
var spyTimeout = 250; // how fast the user's input should be checked
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>";
  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
}
window.onload = suggester_start;
document.onkeydown = keyPressed;
document.onclick=function(event){completeDiv.style.display="none"}
