﻿function setParam(select, remove)
{
  var qs = new QueryString();
  qs.set(select.name, select.options[select.selectedIndex].value);
  if (remove)
    qs.remove(remove);
  qs.load();
}

window.addEvent('domready', function() {
  $(document.body).addEvent("click", closeSuggest);

  if (!$("suggest"))
    return;

  $("suggest").set("load", { asyn: true });

  $("suggest").get('load').addEvents({
    "request": function() { setSuggestState("suggest-loading") },
    "success": function() { setSuggestState("suggest-done"); $("suggestbox").removeClass("suggest-unused"); }
  });
  
  $$("#author", "#keyword").addEvents({
    "keyup": function(evt)
    {
      evt = new Event(evt);

      if (evt.key.length == 1 && evt.target.value.length > 2)
        suggest(evt.target.name, evt.target.value);
    },
    "keydown": function(evt)
    {
      evt = new Event(evt);

      if (evt.key == "up" || evt.key == "down")
        setSuggestionSelected(evt, evt.key);
      else if (evt.key == "enter")
      {
        if (suggestIsOpen())
          evt.stop();
        closeSuggest(evt);
      }
      else if (evt.key == "tab" && suggestIsOpen())
        tabToNextInput(evt, evt.shift);
    }
  });

  $("suggest").addEvents({
    "mouseover": function(evt)
    {
      evt = new Event(evt);

      if ($(evt.target).hasClass("suggestListItem"))
      {
        selectSuggestItem(evt.target);
      }
    },
    "click": function(evt)
    {
      closeSuggest(evt);
    }
  });
});

var suggestParams = {};
function loadSuggest()
{
  $("suggest").load("/adlibsuggest", suggestParams);
}

var states = ["suggest-done","suggest-hidden","suggest-loading"];
function setSuggestState(state)
{
  var otherStates = states.filter(function(s){return s != state});
  $("suggestbox")
    .removeClass(otherStates[0])
    .removeClass(otherStates[1])
    .addClass(state);
}

var selectedInputName = "";

function suggest(name, value, page)
{
  // replace suggestbox to correct place in DOM
  $(name).getParent().appendChild($("suggestbox").getParent().removeChild($("suggestbox")));
  selectedInputName = name;
  $("searchpanel").addClass("entry-selected-"+selectedInputName);
  suggestParams = { 'field': name, 'value': value, 'page': page || 1, 'dummy': new Date() };  
  loadSuggest();
}

function navSuggest(evt, dir)
{
  if (dir == "back")
    suggestParams.page--;
  else if (dir == "forward")
    suggestParams.page++;

  loadSuggest();
  new Event(evt).stop();
}

function suggestIsOpen()
{
  return !$("suggestbox").hasClass("suggest-hidden");
}

function closeSuggest(evt)
{
  if ($("suggest"))
  {
    $("suggest").get("load").cancel();
    $("suggestbox").addClass("suggest-hidden");
    $("searchpanel").removeClass("entry-selected-"+selectedInputName);
  }
}

function tabToNextInput(evt, reverse)
{
  $("searchpanel").removeClass("entry-selected-"+selectedInputName);
  
  var el = $(evt.target.name).getParent();

  var tabEl = reverse ? el.getPrevious() : el.getNext();
  tabEl.getElement("input").focus();

  closeSuggest();
  
  evt.stop();
}

function setSuggestionSelected(evt, dir)
{
  evt = new Event(evt);
  var selected = getSelectedSuggestItem();
  if (!selected)
  {
    var firstListItem = $("suggest").getElement(".suggestListItem");
    if (firstListItem)
      selectSuggestItem(firstListItem);
  }
  else if (dir == "up" && selected.getPrevious())
    selectSuggestItem(selected.getPrevious());
  else if (dir == "down" && selected.getNext())
    selectSuggestItem(selected.getNext());
  
  evt.stop();
}

function getSelectedSuggestItem()
{
  return $("suggest").getElement(".suggestListItemSelected");
}

function selectSuggestItem(el)
{
  if (!el) return;
  var s = getSelectedSuggestItem();
  el.addClass("suggestListItemSelected");
  if (s)
  {
    s.removeClass("suggestListItemSelected");
    $(selectedInputName).value = el.innerHTML;
  }
}