/**
 * Copyright (C) 2009-2010 SoftCorporation LLC. All Rights Reserved.
 * Version: 0.0.1
 */
var timeoutId;
var http;
var baseURL = "/suggester/typeahead.cgi?t=e&n=10";
var maxSugg = 10;

var UD = new Array();
var undoMax = 100;
var undoCount = 0;
UD[undoCount] = new Array(0,0,'',0);

function saveSettings()
{
  if (text != null)
  {
    createCookie("txt", escape(text), 30);
  }
  createCookie("lng", language, 30);
}

function getArrayPos(obj, arr, def)
{
  for(var i = 0; i < arr.length; i++)
  {
    if (arr[i] == obj)
    {
      return i;
    }
  }
  return def;
}

function init()
{
  suggest = false;
  var txt = readCookie("txt");
  if (txt != null)
  {
    text = unescape(txt);
  }
  var lng = readCookie("lng");
  if (lng != null)
  {
    language = lng;
  }
  setSuggestionProvider();
}

function ignoreEvent()
{
  var evt = window.event;
  if (evt.preventDefault) 
  {
    evt.preventDefault();
  }
  if (evt.stopPropagation) 
  {
    evt.stopPropagation();
  }
  evt.cancelBubble = true;
  return false;
}

function getSuggestions(text)
{
  // Suggestions are for English and Russian only
  if (lang.indexOf('en') == 0 || 
      lang.indexOf('ru') == 0) 
  {
    var query = getTypeAheadQuery(text, 4);
    if (query.length > 0)
    {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(function ()
      {
        requestSuggestions(query);
      }, 600);
    }
    else
    {
      if (suggest) showSuggestions("")
    }
  }
}

// return up to max words
function getTypeAheadQuery(text, max)
{
  var i = text.length;
  var wasSpace = false;
  var c;
  while (--i >= 0)
  {
    c = text.charAt(i);
    if (isSpace(c))
    {
      wasSpace = true;
    }
    else
    {
      if (wasSpace)
      {
        if (c == '.' || c == '!' || c == '?' || c == '"' || c == '/' || c == '\\' || 
            c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}' ||
            c == '<' || c == '>' || c == '+' || c == ';' || c == ':' || c == '|')
        {
          break;
        }
        if (--max == 0)
        {
          break;
        }        
        wasSpace = false;
      }
    }
  }
  return text.substring(i + 1).replace(/^\s*/, "");
}

function isSpace(chr)
{
  if (chr == ' ' || chr == '\n' || chr == '\t')
  {
    return true;
  }
  return false;
}

function encodeChar(chr)
{
  if (chr == '&')
  {
    chr = '&amp;';
  }
  else if (chr == '<')
  {
    chr = '&lt;';
  }
  else if (chr == '>')
  {
    chr = '&gt;';
  }
  return chr;
}

function decodeChar(chr)
{
  if (chr == '&amp;')
  {
	chr = '&';
  }
  else if (chr == '&lt;')
  {
	chr = '<';
  }
  else if (chr == '&gt;')
  {
	chr = '>';
  }
  return chr;
}

function doUndo()
{
  if (undoCount > 0)
  {
    undoCount--;
    var undoItem = UD[undoCount];
    curPos = undoItem[3];
    text = text.substring(0, undoItem[0]) + undoItem[2] + text.substring(undoItem[1]);
    drawText(text, curPos, true);
  }
}

function addUndo(undoItem)
{
  UD[undoCount] = undoItem;
  if (undoCount < undoMax)
  {
    undoCount++;
  }
  else
  {
    UD.splice(0, 1);
  }  
}

function createCookie(name, value, days)
{
  var expires = "";
  if (days)
  {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    expires = "; expires="+date.toGMTString();
  } 
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
  var nam = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0; i < ca.length; i++)
  {
    var c = ca[i];
    c = trim(c);
    if (c.indexOf(nam) == 0)
    {
      return c.substring(nam.length, c.length);
    }
  }
  return null;
}

function eraseCookie(name)
{
  createCookie(name, "", -1);
}

// called from init
function setSuggestionProvider()
{
  if (typeof XMLHttpRequest != "undefined")
  {
    http = new XMLHttpRequest();
  }
  else if (typeof ActiveXObject != "undefined")
  {
    http = new ActiveXObject("MSXML2.XmlHttp");
  }
  else
  {
    alert("Type-ahead functionality is not available on your browser.");
  }
}

/**
 * Request suggestions 
 */
function requestSuggestions(query)
{
  var aSuggestions = [];
  if (query.length > 0)
  {     
    //if there is already a live request, cancel it
    if (http.readyState != 0)
    {
      http.abort();
    }                 
    var sURL = baseURL + "&l=" + lang + "&q=" + encodeURIComponent(query);
    http.open("get", sURL , true);
    http.onreadystatechange = function ()
    {
      if (http.readyState == 4)
      {
        var queries = eval(http.responseText);
        var j = 1;
        for (var i = 0; i < queries.length; i++)
        { 
          aSuggestions.push(queries[i]);
          if (++j > maxSugg)
          {
            break;
          }
        }
        showSuggestions(aSuggestions);
      }    
    };
    http.send(null);
  }
};

function showSuggestions(suggestions)
{
  var div = document.getElementById("suggestions");
  div.innerHTML = "";
  if (suggestions.length == 0)
  {
    return;
  }
  for (var i = 0; i < suggestions.length; i++)
  {
    if ( i > 0)
    {
      div.appendChild(document.createTextNode(" | "));
    }
    var oDiv = document.createElement("span");
    oDiv.appendChild(document.createTextNode(suggestions[i]));
    oDiv.onclick = function ()
    {
      insertSuggestionAtCursor(this);
    }
    oDiv.setAttribute("tabindex", 100 + i + 1);
    div.appendChild(oDiv);
  }
};

function insertSuggestionAtCursor(oDiv)
{
//  var val = decodeText(oDiv.innerHTML);
  var val = oDiv.innerHTML + " "; // separate suggestions
  var fld = window.document.cyr.text;
  var text = fld.value;
  var curPos2 = 0; // cursor position
  fld.focus();  
  if (fld.selectionStart)
  {
    curPos2 = fld.selectionStart;
  }
  else if (document.selection) // IE
  {
    var bookmark = document.selection.createRange().getBookmark();
    var sel = fld.createTextRange();
    var bfr = sel.duplicate();
    sel.moveToBookmark(bookmark);
    bfr.setEndPoint("EndToStart", sel);
    curPos2 = bfr.text.length;
  }
  else
  {
    curPos2 = fld.value;
  }
  var curPos1 = curPos2;
  var i = curPos1 - 1;
  while (i >= 0 && !isSpace(text.charAt(i)))
  {
    i--;
  }
  curPos1 = i + 1;
  fld.value = text.substring(0, curPos1) + val + text.substring(curPos2);
  // move cursor
  if (fld.selectionStart)
  { 
    fld.setSelectionRange(curPos1 + val.length, curPos1 + val.length); 
  } 
  else if (fld.createTextRange) // IE
  { 
    var range = fld.createTextRange(); 
    range.move("character", curPos1 + val.length); 
    range.select(); 
  }  
  getSuggestion(fld); 
}

