function updateSuggestions(search, section, event) {

   if(is_int(event))
      keyCode = event;
   else {
      var event = event ? event : window.event;
      var keyCode = event.which ? event.which : event.keyCode;
   }

	switch(keyCode) {
      case 13 : // Enter
         pickSuggestion(section);
         return;
      case 38 : // Arrow up
         if(hiddenSuggestions)
            showSuggestions();
         else
            selectSuggestion(--markedSuggestion, ',');
         return;
      case 40 : // Arrow down
         if(hiddenSuggestions)
            showSuggestions();
         else
            selectSuggestion(++markedSuggestion, ',');
         return;
      case 27 : // Esc
         hideSuggestions();

         position = getCaretPosition(document.getElementById('suggestion_search'));

         if(position !== false) {
            searchStartPos = strrpos(document.getElementById('suggestion_search').value, ',', position - 1);
            searchEndPos = strpos(document.getElementById('suggestion_search').value, ',', position);

            if(searchStartPos !== false)
               ++searchStartPos;

            if(searchEndPos === false)
               searchEndPos = document.getElementById('suggestion_search').value.length;
         }

         document.getElementById('suggestion_search').value = document.getElementById('suggestion_search').value.substr(0, searchStartPos) + typedSearch + document.getElementById('suggestion_search').value.substr(searchEndPos);
         markedSuggestion = -1;
         return;
   }

   position = getCaretPosition(document.getElementById('suggestion_search'));

   if(position !== false) {
      searchStartPos = strrpos(document.getElementById('suggestion_search').value, ',', position - 1);
      searchEndPos = strpos(document.getElementById('suggestion_search').value, ',', position);

      if(searchStartPos !== false)
         ++searchStartPos;

      if(searchEndPos !== false)
         search = document.getElementById('suggestion_search').value.substr(searchStartPos, searchEndPos - searchStartPos);
      else
         search = document.getElementById('suggestion_search').value.substr(searchStartPos);
   }

   typedSearch = search;
   selectedSuggestion = -1;
   markedSuggestion = -1;

   xmlHttp = GetXmlHttpObject();
   if(xmlHttp == null)
      return;
   xmlHttp.onreadystatechange = function() {
      if(xmlHttp.readyState == 4) {

         document.getElementById('suggestions').innerHTML = '';
         tag_id = xmlHttp.responseXML.documentElement.getElementsByTagName('tag_id');
         tag_name = xmlHttp.responseXML.documentElement.getElementsByTagName('tag_name');
         tag_count = xmlHttp.responseXML.documentElement.getElementsByTagName('tag_count');

         for(i = 0; xmlHttp.responseXML.documentElement.getElementsByTagName('tag')[i]; ++i)
            document.getElementById('suggestions').innerHTML += '<span id="suggestion_' + i + '" onmouseover="markSuggestion(' + i + ')" onclick="pickSuggestion(' + section + ')"><span id="tag_' + tag_id[i].firstChild.nodeValue + '">' + tag_name[i].firstChild.nodeValue + '</span></span>';

         showSuggestions();
      }
   }
   xmlHttp.open('GET', 'forum/includes/suggest_tag.php?q=' + search + '&sect=' + section, true);
   xmlHttp.send(null);
}

function pickSuggestion(section) {
   selectSuggestion(markedSuggestion, ',');
   document.getElementById('suggestion_search').focus();
   if(document.getElementById('suggestion_search').value.substr(document.getElementById('suggestion_search').value.length - 1) != ',')
      document.getElementById('suggestion_search').value += ',';
   updateSuggestions(document.getElementById('suggestion_search').value, section, 188);
   showSuggestions();
}
