/**
 * MarilynBar
 * @version 1.0
 * 2008. 04. 26.
 * @package JavaScripts
 * @subpackage AutoComplete
 * @author E-DOT Interactive Studio <info@e-dot.hu>
 * @copyright Copyright (c) 2008, E-DOT
 */

var autocomplete;

// Autocomple divek összeállítása
function autocompleteInit()
{
  autocomplete = { // Konfigurálásra
  ajaxfile       : getAutoCompleteAjaxFile,      // meghívott AJAX file
  ajaxtypeparam  : "type",                       // AJAX file típus paramétere
  ajaxqueryparam : "q",                          // AJAX file lekérdezés paramétere
  relpattern     : /^autocomplete_([a-z0-9]+)$/, // rel attribútum illeszkedési regexp mintája, típus bezárójelezendő!!!
  // Belső használatra
  div_idx        : 0,
  divs           : new Array(),
  sf_divs        : new Array(),
  inputs         : new Array(),
  html           : false,
  hits           : new Array(),
  hoveritem      : new Array(),
  firstitem      : new Array(),
  cache          : new Array()};
  
  var input = document.getElementsByTagName("input");
  var i;
  
  for (i=0; i<input.length; i++)
  {
    if (input[i].getAttribute("rel") && autocomplete.relpattern.test(input[i].getAttribute("rel")))
    {
      var div = document.createElement("div");
      div.style.position = "relative";
      input[i].parentNode.appendChild(div);
      input[i].setAttribute("autocomplete", "off");
      autocomplete.divs[autocomplete.div_idx] = div;
      autocomplete.inputs[autocomplete.div_idx] = input[i];
      
      var key = input[i].getAttribute("rel").replace(autocomplete.relpattern, "$1");
      var ajaxfile = autocomplete.ajaxfile(key);

      if (!autocomplete.html) ajax_request(ajaxfile, ajaxAutocompleteInsertHTML, autocomplete.div_idx);
      else
      {
        div.innerHTML = autocomplete.html;
        autocompleteAttachEvents(input[i], autocomplete.div_idx);
      }

      autocomplete.div_idx++;
    }
  }
}

// Autocomplete divek tartalmának lekérése (AJAX)
function ajaxAutocompleteInsertHTML(id, text)
{
  autocomplete.html = text;
  if (!autocomplete.divs[id]) return;
  autocomplete.divs[id].innerHTML = autocomplete.html;
  autocompleteAttachEvents(autocomplete.inputs[id], id);
}

// Autocomplete divek méretének beállítása
function autocompleteAttachEvents(obj, idx)
{
  var w = obj.clientWidth;
  var sf_div = autocomplete.divs[idx].getElementsByTagName("div")[0];
  if (!autocomplete.sf_divs[idx]) autocomplete.sf_divs[idx] = sf_div.getElementsByTagName("div")[0];
  sf_inner_div = autocomplete.sf_divs[idx];
  var sf_iframe = sf_div.getElementsByTagName("iframe");
  
  // A divek szelessegenek beallitasa
  sf_div.style.width = w-(-2) + "px";
  sf_inner_div.style.width = w + "px";
  if (sf_iframe.length > 0) sf_iframe[0].style.width = w-(-4) + "px";
  
  obj.onkeydown = autocompletePress;
  obj.onblur = function ()
  {
    autocomplete.divs[idx].style.display = "none";
    autocomplete.sf_divs[idx].style.display = "none";
  }
  
}

// Input mező billentyűleütése
function autocompletePress(e)
{
  var e = e || event;
  
  var target = e.srcElement || e.target;
  
  for (var idx=0; idx<autocomplete.inputs.length; idx++)
  {
    if (target == autocomplete.inputs[idx]) break;
  }
  if (autocomplete.inputs.length <= idx) return;
  
  if (autocomplete.divs[idx].style.display == "block")
  {
    // Le (40) gomb esetén
    if (e.keyCode == 40)
    {
      if (typeof autocomplete.hoveritem[idx] != "number")
      {
        autocomplete.hoveritem[idx] = -1;
        autocomplete.firstitem[idx] = autocomplete.inputs[idx].value;
      }
      autocomplete.hoveritem[idx]++;
      if (autocomplete.hoveritem[idx] >= autocomplete.hits[idx].length) autocomplete.hoveritem[idx] = -1;
    }
    
    // Fel (38) gomb esetén
    if (e.keyCode == 38)
    {
      if (typeof autocomplete.hoveritem[idx] != "number")
      {
        autocomplete.hoveritem[idx] = autocomplete.hits[idx].length-1;
        autocomplete.firstitem[idx] = autocomplete.inputs[idx].value;
      }
      autocomplete.hoveritem[idx]--;
      if (autocomplete.hoveritem[idx] < -1) autocomplete.hoveritem[idx] = autocomplete.hits[idx].length-1;
    }
    
    // Fel vagy le gomb esetén
    if (e.keyCode == 40 || e.keyCode == 38)
    {
      autocomplete.inputs[idx].value = ((autocomplete.hoveritem[idx] != -1)?autocomplete.hits[idx][autocomplete.hoveritem[idx]]:autocomplete.firstitem[idx]);
      var li = autocomplete.sf_divs[idx].getElementsByTagName("li");
      for (var i=0; i<li.length; i++)
      {
        li[i].className = ((i == autocomplete.hoveritem[idx])?"hover":"");
      }
    }

    // Enter (13)
    if (e.keyCode == 13)
    {
      autocomplete.divs[idx].style.display = "none";
      autocomplete.sf_divs[idx].style.display = "none";
      return false;
      // TODO: Opera is megszakítsa az eseményt (e.preventDefault() nem működik)
    }
    
    // Esc
    if (e.keyCode == 27)
    {
      autocomplete.divs[idx].style.display = "none";
      autocomplete.sf_divs[idx].style.display = "none";
      autocomplete.inputs[idx].value = autocomplete.firstitem[idx];
    }
  }

  
  if (e.keyCode != 40 && e.keyCode != 38 && e.keyCode != 13)
  {
    setTimeout("autocompletePress2(" + idx + ", '" + autocomplete.inputs[idx].value + "')", 20);
  }

}

// Késleltetett input mező billentyűleütése
function autocompletePress2(idx, oldvalue)
{
  if (autocomplete.inputs[idx].value == oldvalue) return;
  if (autocomplete.inputs[idx].value == "")
  {
    autocomplete.divs[idx].style.display = "none";
    autocomplete.sf_divs[idx].style.display = "none";
    return;
  }

  var type = autocomplete.inputs[idx].getAttribute("rel").replace(autocomplete.relpattern, "$1");
  
  if (!autocomplete.cache[idx] || !autocomplete.cache[idx][autocomplete.inputs[idx].value])
  {
    var ajaxfile = autocomplete.ajaxfile(type);
    ajax_request(ajaxfile + (ajaxfile.indexOf("?") > -1?"&":"?") + autocomplete.ajaxtypeparam + "=" + type + "&" + autocomplete.ajaxqueryparam + "=" + autocomplete.inputs[idx].value, autocompleteProgressAjax, idx);
  }
  else
  {
    ajaxAutocompleteFill(idx, autocomplete.cache[idx][autocomplete.inputs[idx].value]);
  }
}

// Találatok betöltése ajaxtól
function autocompleteProgressAjax(idx, text)
{
  var text = text.split("\n");

  if (text.length == 1)
  {
    autocomplete.divs[idx].style.display = "none";
    autocomplete.sf_divs[idx].style.display = "none";
    return;
  }
  if (text[0] != autocomplete.inputs[idx].value) return;
  
  if (!autocomplete.cache[idx]) autocomplete.cache[idx] = new Array();
  autocomplete.cache[idx][text[0]] = text;

  ajaxAutocompleteFill(idx, text);
}

function ajaxAutocompleteFill(idx, text)
{
  if (!autocomplete.hits[idx]) autocomplete.hits[idx] = new Array();
  else autocomplete.hits[idx].length = 0;
  autocomplete.hoveritem[idx] = new Array();
  
  for(var i=1; i<text.length; i++)
  {
    autocomplete.hits[idx][i-1] = text[i];
  }
  autocompleteCreateHTML(idx);

  autocomplete.divs[idx].style.display = "block";
  autocomplete.sf_divs[idx].style.display = "block";
  
}

// Találatok HTML kirajzolása
function autocompleteCreateHTML(idx)
{
  var ul = document.createElement("ul");
  var li;
  for(var i=0; i<autocomplete.hits[idx].length; i++)
  {
    li = document.createElement("li");
    li.innerHTML = autocomplete.hits[idx][i];
    li.acpidx = idx;
    li.acpi = i;
    li.onmouseover = autocompleteSetHover;
    ul.appendChild(li);
  }
  autocomplete.sf_divs[idx].innerHTML = "";
  autocomplete.sf_divs[idx].appendChild(ul);
}

function autocompleteSetHover(e)
{
  var e = e || event;
  var t = e.target || e.srcElement;
  
  var idx = t.acpidx;
  var i = t.acpi;
  var li = autocomplete.sf_divs[idx].getElementsByTagName("li");
 
  // ha még nincs kijelölve semmi, elmentjük a jelenlegit elsőnek 
  var sel = false;
  for (var j=0; j<li.length; j++)
  {
    if (li[j].className == "hover")
    {
      sel = true;
      break;
    }
  }
  if (!sel)
  {
    autocomplete.firstitem[idx] = autocomplete.inputs[idx].value
  }
  
  autocomplete.inputs[idx].value = autocomplete.hits[idx][i];
  for (var j=0; j<li.length; j++)
  {
    li[j].className = ((j == i)?"hover":"");
  }
}

