window.addEvent('domready', function() {
  var tb_qs = $('quick_search'); // textbox
  var res_qs;                    // result div
  var res_sel = null;            // selected result

  tb_qs.addEvent('domready', function(e) {
    tb_qs.set({'value': 'Quick search...'});

    // vytvorim result div a umiestnim ho do body
    res_qs = new Element('div', {'id': 'quick_search_result'});
    res_qs.inject(document.body);
  });

  tb_qs.addEvent('focus', function(e) {
    // vycistim default value textboxu
    if (tb_qs.get('value') == 'Quick search...')
      tb_qs.set({'class': 'qs_active', 'value': ''});

    // ak mam nejake vysledky tak zobrazim div
    if (tb_qs.get('value').length > 0 && res_qs.getElement('a') != null)
      qs_open_result();
  });

  tb_qs.addEvent('keyup', function(e) {
    e.stop();

    if (e.key == 'enter') {
      if (res_sel != null) {
        var link = new URI(res_sel.get('href'));
        link.go();
      }
    }
    else if (e.key == 'up' || e.key == 'down') {
      qs_move(e.key);
    }
    else {
      var tb_qs_val = tb_qs.get('value');
      tb_qs_val.trim();
  
      if (tb_qs_val.length > 0) {
        var qs_request = new Request.JSON({
          url: '/ajax/json_quick_search.php',
          onComplete: function(jsonObj) {
            qs_result(jsonObj.qs);
          }
        }).get({'search':tb_qs_val});
      }
      else {
        qs_clear_result();
      }
    }
  });

  tb_qs.addEvent('blur', function(e) {
    var qs_time = qs_close_result.delay(1000);
  });

  var qs_result = function(nodes) {
    res_qs.empty();
    if (nodes.length > 0) {
      qs_open_result();
      nodes.each(function(node) {
        var res_a   = new Element('a', {'class': 'qs_result', 'href': '/id/'+node.node_id+'/'});
        var res_cnt = new Element('div', {'html': '<span>'+node.node_name+'</span><br />/id/'+node.node_id+'/'});

        res_a.addEvent('mouseover', qs_result_mouse_over);

        res_a.inject(res_qs);
        res_cnt.inject(res_a);
      });

      // zvolim si prvy result
      qs_move('first');
    }
    else {
      qs_clear_result();
    }
  };

  var qs_result_mouse_over = function() {
    // odznacim minuly result
    if (res_sel != null)
      res_sel.set({'class': 'qs_result'});

    // oznacim ten nad ktorym mam teraz mysku
    res_sel = this;
    res_sel.set({'class': 'qs_result_hover'});
  };

  var qs_open_result = function() {
    var tb_qs_coord = tb_qs.getCoordinates();
    res_qs.setStyles({'display': 'block', 'top': tb_qs_coord.bottom + 'px', 'left': tb_qs_coord.left - 82 + 'px'});
  };

  var qs_close_result = function() {
    res_qs.setStyle('display', 'none');
  };

  var qs_clear_result = function() {
    res_qs.setStyle('display', 'none');
    res_qs.empty();
  };

  var qs_move = function(key) {
    // kurzor nastavim na koniec
    tb_qs.setCaretPosition("end");

    // odznacim minuly result
    if (res_sel != null)
      res_sel.set({'class': 'qs_result'});

    // podla keyu zvolim ktory result vyberiem
    if (key == 'first') {
      res_sel = res_qs.getElement('a');
    }
    else if (key == 'down') {
      // ak nie je getNext null tak posuvam dolu, inak idem na prvy result
      res_sel = res_sel.getNext('a');
      if (res_sel == null)
        res_sel = res_qs.getElement('a');
    }
    else if (key == 'up') {
      // ak nie je getPrevious null tak posuvam hore, inak idem na posledny result
      res_sel = res_sel.getPrevious('a');
      if (res_sel == null) {
        res_sel = res_qs.getElement('a');
        var pom = res_sel.getNext('a');
        while (pom != null) {
          res_sel = pom;
          pom = pom.getNext('a');
        }
      }
    }

    // oznacim result
    res_sel.set({'class': 'qs_result_hover'});
  };
});