var divSuggest;
var divArrow;
var httpSuggest;
var words;

var divContent;
var divTempSuggest;

var selIndex = 0;

var donthide = false;

var mouseTimer;
var keyTimer;

addLoadEvent(loadSuggest);

function preload(strFile) {
	var tempImg = new Image();
	tempImg.src = strFile;
	delete tempImg;
}

function loadSuggest() {
	words = $('words');
	
	if (words) {
		if (document.images) {
			preload('/images/suggest/suggest-arrow.gif');
			preload('/images/suggest/suggest-win-tlbl.gif');
			preload('/images/suggest/suggest-win-trbr.gif');
			preload('/images/suggest/suggest-sel-blbr.gif');
			preload('/images/suggest/suggest-sel-tltr.gif');
			preload('/images/suggest/suggest-header-blbr.gif');
			preload('/images/suggest/suggest-header-tltr.gif');
			
			preload('/images/suggest/suggest-close.gif');
			preload('/images/suggest/suggest-close-hover.gif');
		}
		
		words.setAttribute("autocomplete","off");
		words.onkeyup = keyUp;
		words.onclick = suggestWords;
		window.onresize = function() { hideSuggest(true) };
	}
}

function suggestWords() {
	suggest(words);
}

function keyUp(e) {

	clearTimeout(mouseTimer);

	var keyID = (window.event) ? event.keyCode : e.keyCode;
	
	if (keyID == 40) {
		// Key: DOWNARROW
		if (divSuggest && divSuggest.style.visibility == 'hidden') {
			suggestWords();
		} else {
			selItem(1);
		}
		return false;

	} else if (keyID == 38) {
		// Key: UPARROW
		if (divSuggest && divSuggest.style.visibility == 'hidden') {
			suggestWords();
		} else {
			selItem(-1);
		}
		
		if (selIndex <= 0) {
			allowHide();
			keyTimer = setTimeout('hideSuggest(true);', 2000);
		}
		
		return false;

	} else if (keyID == 13) {
		if (selIndex > 0) {
			window.location.href = getItem(selIndex).href;
			return false;
		} else {
			return true;
		}
	} else {
		timeIt();
	}
	
	return;
}

function selItem(selDiff) {
	if (selIndex > 0) unsel(getItem(selIndex));
	
	if (selDiff == 0) { selIndex = 0; }
	else { selIndex += selDiff; }
	
	if (selIndex > 0) sel(getItem(selIndex));
	
	if (selIndex <= 0) selIndex = 0;
	
}

function getItem(itemIndex) {

	var curIndex = 0;
	var totalIndex = 0;
	var curGroup = divContent.firstChild;
		
	if (curGroup) {
		var theLI;

		while (curGroup && !theLI) {
			if (curGroup.tagName == 'LI') {
				curIndex = 0;

				var listItems = curGroup.getElementsByTagName('li');

				if (listItems) {
					for (var listItem = 0; listItem < listItems.length; listItem++) {
						curIndex++;
						totalIndex++;

						if (totalIndex == itemIndex) {
							theLI = listItems[curIndex - 1];
							break;
						}
					}
				}

			}

			if (theLI) break;
			
			curGroup = curGroup.nextSibling;
		}


		// Return the anchor in the li
		if (theLI) {
			var as = theLI.getElementsByTagName('a');		
			if (as) return as[0];
			else return null;
		} else {
			if (itemIndex > 0) {
				selIndex = totalIndex;
				sel(getItem(totalIndex));
			}
		}
	}
	return null;
}

function sel(divObj) { if (divObj) divObj.className = 'sel'; }
function unsel(divObj) { if (divObj) divObj.className = ''; }

function timeIt() {
	clearTimeout(keyTimer);
	if (words.value.length > 2) {
		keyTimer = setTimeout('suggestWords();', 200);
		//suggestWords();
	}
}

function suggest(divObj) {
	if (words.value.length > 2) {
		createSuggestWin(divObj);
	} else {
		hideSuggest();
	}
}

function createSuggestWin(divObj) {
	var locX = getX(divObj) + getWidth(divObj);
	var locY = getY(divObj) + (getHeight(divObj) / 2);

	selIndex = 0;
	
	if (!divArrow) {
		divArrow = document.createElement('div');
		divArrow.setAttribute('id', 'suggest_arrow');
		divArrow.style.left = (locX + 8) + 'px';
		divArrow.style.top = (locY - 11) + 'px';
		
		divArrow.style.visibility = 'hidden';
		
		document.body.appendChild(divArrow);
	} else {
		divArrow.style.left = (locX + 8) + 'px';
		divArrow.style.top = (locY - 11) + 'px';
	}
	
	
	if (!divSuggest) {
		divSuggest = document.createElement('div');
		divSuggest.setAttribute('id', 'suggest_win');
		divSuggest.style.left = (locX + 20) + 'px';
		divSuggest.style.top = locY + 'px';

		divSuggest.innerHTML = '<div id="suggest_win"><div id="suggest_tr"></div><div id="suggest_top"></div><ul id="suggest_content"><li><a href="1"><span class="sel_right"><span class="sel_right_top">&nbsp;</span></span><span class="sel_left"><span class="sel_left_top">&nbsp;</span></span>No results found.</a></li></ul><div id="suggest_br"></div><div id="suggest_bottom"></div></div>';

		divSuggest.style.visibility = 'hidden';
		
		document.body.appendChild(divSuggest);
		
		divSuggest.onmouseover = function () { selItem(0); keepOpen(); clearTimeout(mouseTimer); };
		divSuggest.onmouseout = function () { allowHide(); mouseTimer = setTimeout('hideSuggest();', 2500); };
	}
	
	keepOpen();
	mouseTimer = setTimeout('allowHide();', 2500);

	if (!divContent) divContent = $('suggest_content');
	
	if (!divTempSuggest) {
		divTempSuggest = document.createElement('div');
		divTempSuggest.setAttribute('id', 'suggest_temp')
		
		divTempContent = document.createElement('ul');
		divTempContent.setAttribute('id', 'suggest_tempcontent')
		
		divTempSuggest.appendChild(divTempContent);
		document.body.appendChild(divTempSuggest);
	}

	loadContent('/suggest.html?q=' + words.value, locX, locY);
	return false;
}

function loadContent(strURL, locX, locY) {
	
	httpSuggest = null;
	httpSuggest = createNewXMLObject();

	httpSuggest.open('GET', strURL, true);

	httpSuggest.onreadystatechange = function() {
		if ((httpSuggest.readyState == 4) && (httpSuggest.status == 200)) {
			if (httpSuggest.responseText && httpSuggest.responseText.length > 100) {
			
				divTempContent.innerHTML = httpSuggest.responseText;
				
				autoPos(locX, locY);
				
				divContent.innerHTML = divTempContent.innerHTML;
				selItem(0);
				
				divSuggest.style.visibility = 'visible';
				divArrow.style.visibility = 'visible';
				
				clearTimeout(mouseTimer);
				clearTimeout(keyTimer);
				
				mouseTimer = setTimeout('hideSuggest();', 4000);		
			} else {
				allowHide();
				hideSuggest();
			}
		}
	}
	
	httpSuggest.send(null);
}

function hideSuggest(force) {
	if (divSuggest && divArrow && ((!donthide && !selIndex) || force)) {
		divSuggest.style.visibility = 'hidden';
		divArrow.style.visibility = 'hidden';
		selItem(0);
	}
}

function allowHide() { donthide = false; }

function keepOpen() { donthide = true; }

function createNewXMLObject() {
	if (window.XMLHttpRequest) {
	  return(new XMLHttpRequest());
	}	else if (window.ActiveXObject) {
	  return(new ActiveXObject("Msxml2.XMLHTTP"));
	}
}

// Move divMove based on divBase's height
// with respect to locY

function autoPos(locX, locY) {
	divArrow.style.left = (locX + 8) + 'px';
	divArrow.style.top = (locY - 11) + 'px';

	divSuggest.style.left = (locX + 20) + 'px';
	divSuggest.style.top = locY - ((divTempSuggest.offsetHeight / 2) + 6) + 'px';
	
	return;
}

function setWidth(divObj, numWidth) { divObj.style.width = numWidth + 'px'; }

function setHeight(divObj, numHeight) {	divObj.style.height = numHeight + 'px'; }

function getWidth(divObj) { return divObj.offsetWidth; }

function getHeight(divObj) { return divObj.offsetHeight; }

function getX(obj) {
	var curleft = 0;
	if(obj.offsetParent)
	while(1) 
	{
	  curleft += obj.offsetLeft;
	  if(!obj.offsetParent)
	    break;
	  obj = obj.offsetParent;
	}
	else if(obj.x)
	curleft += obj.x;
	return curleft;
}

function getY(obj) {
	var curtop = 0;
	if(obj.offsetParent)
	while(1)
	{
	  curtop += obj.offsetTop;
	  if(!obj.offsetParent)
	    break;
	  obj = obj.offsetParent;
	}
	else if(obj.y)
	curtop += obj.y;
	return curtop;
}


function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}

function $(div) { return document.getElementById(div); }
