var qsearch = {timer: null, last: null, flowerTimer: null, apiVersion: 2};

window.addEvent("domready", function() {
  var input = $("qsearch-q");

  input.addEvent("keyup", function() {
    qsearch.startProcess(qsearch.getValue());
  });


  $("qsearch-form").addEvent("submit", function(e) {
    new Event(e).stop();
  });

  input.focus();
});

qsearch.getValue = function() {
  return $("qsearch-q").value;
}

qsearch.startProcess = function(value) {
  if(qsearch.last == value)
    return;
  qsearch.last = value;

  if($defined(qsearch.timer)) {
    $clear(qsearch.timer);
    qsearch.timer = null;
  }

  if($defined(qsearch.flowerTimer)) {
    $clear(qsearch.flowerTimer);
    qsearch.flowerTimer = null;
  }

  if(value == "") {
    qsearch.processXML();
    return;
  }

  qsearch.timer = qsearch.getResults.delay(300, null, value);
  qsearch.flowerTimer = qsearch.displayFlower.delay(700, null, true);
}

qsearch.displayFlower = function(b) {
  if(qsearch.flowerTimer) {
    $clear(qsearch.flowerTimer);
    qsearch.flowerTimer = null;
  }

  var ind = $("qsearch-ind");
  if(b) {
    ind.setStyle("display", "inline");
  } else {
    ind.setStyle("display", "none");
  }
}

qsearch.getResults = function(terms) {
  if(qsearch.request) {
    qsearch.request.cancel();
    qsearch.request = null;
  }

  var r = new Request({url: '/api/qsearch' + qsearch.apiVersion + '.php?xml=1&q=' + escape(terms), link: "cancel"}).addEvent("success", function(text, xml) {
    if($defined(qsearch.flowerTimer)) {
      $clear(qsearch.flowerTimer);
      qsearch.flowerTimer = null;
    }
    qsearch.displayFlower(false);

    qsearch.processXML(xml);
  }).send();
}

qsearch.processXML = function(x) {
  var q = qsearch.getValue();
  var p = $("qsearch-results");

  var s = "";
  var t = "";

  var table = $("qsearch-table");
  while(table.childNodes.length > 0)
    table.removeChild(table.firstChild);

  if(qsearch.trunc) {
    p.removeChild(qsearch.trunc);
    qsearch.trunc = null;
  }

  if(!x || !x.documentElement)
    return;

  x = x.documentElement;
  var t = x.getElementsByTagName("stats");
  if(t[0].getAttribute("query") != escape(q))
    return;

  var trunc = t[0].getAttribute("trunc");
  if(trunc) {
    qsearch.trunc = new Element("p", {html: "<b>Truncated to 50 results (originally " + trunc + ").</b>"})
    p.insertBefore(qsearch.trunc, table);
  }

  var tbody = new Element("tbody");
  table.appendChild(tbody);

  function newRow(x, a, b, c, s) {
    var tr = new Element("tr");
    tbody.appendChild(tr);

    var r = [x, a, b, c];
    var re = [];

    for(var i=0;i<r.length;i++) {
      var x = new Element("td", r[i]);
      tr.appendChild(x);

      for(var j=0;j<s.length;j++) {
        var y = s[j];
        x.setStyle(y[0], y[1]);
      }
      re[i] = x;
    }

    return re;
  }

  newRow({}, {text: "Channel"}, {text: "Users"}, {text: "Topic"}, [["font-size", "10px"], ["font-weight", "bold"]]);

  var r = x.getElementsByTagName("r");
  for (var i=0;i<r.length;i++) {
    var chan = unescape(r[i].getAttribute("c"));
    var users = unescape(r[i].getAttribute("u"));
    var topic = unescape(r[i].getAttribute("t"));

    var approved = null;
    if(unescape(r[i].getAttribute("qnet")) == "true") {
      approved = "qnet";
    } else if(unescape(r[i].getAttribute("approved")) == "true") {
      approved = "star";
    }

    var row = newRow({}, {}, {"text": users}, {"html": topic}, [["font-size", "10px"]]);

    if(approved)
      row[0].appendChild(new Element("img", {"src": approved + ".gif"}));

    row[1].appendChild(new Element("a", {"href": "http://webchat.quakenet.org/?channels=" + escape(chan), "text": chan, "target": "new"}));
  }
}

