var text = '';
var suggest = new Array();
var request = new Array();
var times = new Array();

var start = false;

var qs = new Querystring(location.search);

function updateSuggestList (){
  // don't start until user is typing:
  if(!start){ return }

  var tag_input = document.getElementById('tag');

  var newtext = tag_input.value;

  if(newtext == ''){
    clearList();
  }else if(newtext != text){
    if(suggest[newtext]){
      tag_input.style.background = "";
      updateList( newtext );
      clearProgress();
      text = newtext;
    }else if( !request[newtext] ){
      updateArray( newtext );
      var vote = document.getElementById('vote');
      if(vote != null){
	vote.style.visibility = 'hidden';
      }

    }else{
      tag_input.style.background = "url("+site_root+"/images/progress_bar.gif)";
      request[newtext]++;
      //updateProgress();
    }
  }
}

function updateArray( text ){
  clearProgress();

  var now = Date.parse(new Date());
  //    var url = '/cgi-bin/funnyr.cgi?action=tag_suggest&tag=';
  var url = '/cgi-bin/suggest.cgi?tag=';
  url += escape(text);
  url += '&time='+now;

  // keep track of requests
  request[text] = 1;

  debug('Getting url: '+url);
  var script = document.createElement('script');
  script.id = 'updateSuggest';
  script.src = url;
  script.type = 'text/javascript';

  var head = document.getElementsByTagName('head').item(0);
  var old = document.getElementById('updateSuggest');
  if (old){
    head.removeChild(old);
  }

  head.appendChild(script);
    
}

function selectNext( evt ){
  var e = evt ? evt : window.event;
  var keyCode = e.keyCode;
  var ul = document.getElementById('suggestionList');

  if(!ul.childNodes[0]){
    return;
  }

  if(keyCode == 40){
    // down
    if(activeElement.id == 'tag'){
      // set focus to first element of list:
      ul.childNodes[0].childNodes[0].focus();
    }else{
      var thisNode = activeElement;
      var next = 0;
      for(var i=0; i < ul.childNodes.length; i++){
	if(ul.childNodes[i].childNodes[0] == thisNode){
	  next = i+1;
	}
      }
      if(next < ul.childNodes.length){
	ul.childNodes[next].childNodes[0].focus();
      }
    }
  }else if(keyCode == 38 &&
	   activeElement.id != 'tag'){
    // or up
    var thisNode = activeElement;
    var next = 0;
    for(var i=0; i < ul.childNodes.length; i++){
      if(ul.childNodes[i].childNodes[0] == thisNode){
	next = i-1;
      }
    }
    if(next >= 0){
      ul.childNodes[next].childNodes[0].focus();
    }else{
      document.getElementsByTagName('tag').focus();
    }
  }

}
function updateList( text ){
  if(!suggest[text]){
    debug('ERROR: '+text+' not found in array.');
    return;
  }

  // How long did it take?
  var now = Date.parse(new Date());
  var posted = now - times[text];
  debug(posted+' millisecond round-trip');

  var ul = document.getElementById('suggestionList');
  var s = suggest[text];
  //    debug( s );

  clearList();
  var homeURL = document.URL.replace( document.location.search, '' );
  homeURL += '?tag='

    // add tag value:
    var newtext = document.getElementById('tag').value;	
  var li = document.createElement('li');
  var link = document.createElement('a');
  link.id = 'suggest_-1';
  link.innerHTML = newtext;
  link.href = homeURL+escape(newtext);
  link.onfocus = focusHandler;
  link.onblur = blurHandler;
  link.onkeypress = selectNext;
  li.appendChild( link );
  ul.appendChild( li );

  for(var i=0; i < s.length; i += 3){
    if(block_offensive_tags == 0 || s[i+1] == 'N'){
      var li = document.createElement('li');
      var link = document.createElement('a');
      link.id = 'suggest_'+i;
      link.innerHTML = s[i]+' ('+s[i+2]+')';
      link.href = homeURL+escape(s[i]);
      link.onfocus = focusHandler;
      link.onblur = blurHandler;
      link.onkeypress = selectNext;
      li.appendChild( link );
      ul.appendChild( li );
    }else{
      debug('blocked tag '+s[i]);
    }
  }

  ul.style.visibility = "visible";

  return true;
}

function clearProgress(){
  var ptable = document.getElementById('progress');
  var pbody = ptable.getElementsByTagName("tbody")[0];

  while(pbody.childNodes.length > 1){
    pbody.removeChild( pbody.childNodes[0] );
  }
    
  if(pbody.childNodes.length == 1){
    var tr = pbody.childNodes[0];
    while(tr.childNodes.length > 1){
      debug('removing child '+tr.childNodes.length-1);
      tr.removeChild( tr.childNodes[ tr.childNodes.length-1 ] );
    }

    if(tr.childNodes.length == 1){
      var c = tr.childNodes[0];
      c.style.backgroundColor = '';
    }
  }
  //    pbody.visibility = "hidden";
}

function updateProgress(){
  var ptable = document.getElementById('progress');
  var pbody = ptable.getElementsByTagName("tbody")[0];
  var rows = pbody.getElementsByTagName('tr');

  var maxcols = 20;
  var maxrows = 5;

  if(rows.length > maxrows){
    clearProgress();
    return;
  }

  if(rows.length == 0 
     || rows[ rows.length-1 ].childNodes.length >= maxcols){
    pbody.appendChild( document.createElement('tr') );
  }

  var tr = rows[ rows.length-1 ];

  if(rows.length == 1 && tr.childNodes.length == 1){
    var c = tr.childNodes[0];
    c.style.backgroundColor = '#660099';
  }

  var c = document.createElement('td');
  var i = document.createElement('img');
  i.style.width = 5;
  i.style.height = 5;
  i.src = site_root+'/images/spacer.gif';
  c.appendChild( i );
  c.style.backgroundColor = "#660099";

  tr.appendChild( c );
  ptable.visibility = "visible";

}

function clearList(){
  var ul = document.getElementById('suggestionList');
  while( ul.childNodes.length > 0 ){
    ul.removeChild( ul.childNodes.item(0) );
  }
  ul.style.visibility = "hidden";
}

function debug( message ){
  if(debug_level > 0){
    var debug = document.getElementById('debug');
    debug.innerHTML += message + "<br>";	
  }
}

function clearDebug(){
  var debug = document.getElementById('debug');
  debug.innerHTML = '<a href="" onclick="clearDebug();">[CLEAR]</a><br>';	
}

// Code for getting active element
// borrowed from
// http://jalbum.net/forum/thread.jspa?forumID=4&threadID=3975&messageID=24532
var activeElement = null;
function blurHandler(evt) {
  activeElement = null;
}
function focusHandler(evt) {
  var e = evt ? evt : window.event;
  if (!e) return;
  if (e.target)
    activeElement = e.target;
  else if(e.srcElement) activeElement = e.srcElement;
  //debug('ACTIVE: '+activeElement.id);
}
function loadHandler() {
  var i, j;
	
  for (i = 0; i < document.forms.length; i++)
    for (j = 0; j < document.forms[i].elements.length; j++) {
      document.forms[i].elements[j].onfocus = focusHandler
	document.forms[i].elements[j].onblur  = blurHandler
	}
}

function setstart(textbox){
  if(!start){
    textbox.value = '';
    start= true;
  }
}

function initStuff(){
  var qs_debug = qs.get("debug", 0);

  if(debug_level > 0 || qs_debug > 0){
    var debug_win = document.getElementById('debug');
    debug_win.style.visibility = "visible";
    debug("DEBUG: "+debug_level);

    for(var i=0; i < debug_output.length; i++){
      debug(debug_output[i]);
    }

  }
}

window.onload = loadHandler

setInterval('updateSuggestList()', 100);

