var suggest_basicmatch = /[a-zåäö0-9 ]/i;
var suggest_resultsid = 'suggest-results';
var suggest_resultscreated = false;
var suggest_timer = null;
var suggest_elements = [];

function suggest_init() {
	if (!suggest_resultscreated) suggest_createresults();
}

function suggest_createresults() {
	suggest_resultscreated = true;

	var rElt = document.createElement('div');
	rElt.id = suggest_resultsid;
	
	//IE specifics
	if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) { 
		rElt.style.overflowY = 'scroll';
		if (!/msie 8/i.test(navigator.userAgent)) rElt.style.paddingRight = '17px';
		if (/msie 6/i.test(navigator.userAgent)) rElt.style.height = '100px';
	
		//IE doesn't allow modifying the DOM until the document is fully loaded.
		jsOnload(function() { document.body.appendChild(rElt); });
	} else {

		document.body.appendChild(rElt);
	}

	return rElt;
}

function suggest_getquery(qElt) {
	var q = qElt.value;
	q = q.replace(/^\s*/, ''); //ltrim
	q = q.replace('\s+', ' ');
	if (q.length == 0 || !suggest_basicmatch.test(q)) {
		suggest_emptyresults();
		return '';
	}

	if (qElt.currentQuery && (qElt.currentQuery == q || qElt.tempQuery == q))
		return '';

	qElt.currentQuery = q;
	return q;
}

function suggest_hide(elt) {
	if (elt)
		elt.style.visibility = 'hidden';
}

function suggest_ishidden(elt) {
	if (elt)
		return elt.style.visibility == 'hidden';
	else
		return true;
}

function suggest_show(elt, qElt) {
	if (elt) {
		elem = document.getElementById(qElt.id);
		
		px = 0;
		py = elem.clientHeight;

		do {
			if (!/opera/i.test(navigator.userAgent)) { 
				//Opera doesn't like this.
				px += suggest_getnumstyle(elem, 'border-left-width', 'borderLeftWidth');
				py += suggest_getnumstyle(elem, 'border-top-width', 'borderTopWidth');
			}
			px += elem.offsetLeft;
			py += elem.offsetTop;
		} while ((elem = elem.offsetParent) != null)

		elt.style.left = px + 'px';
		elt.style.top = (py + 1) + 'px';
		elt.style.visibility = 'visible';
		elt.scrollTop = 0;
	}
}

function suggest_getnumstyle(el, styleProp, styleAltProp) {
	return parseInt(suggest_getstyle(elem, styleProp) || suggest_getstyle(elem, styleAltProp)) || 0;
}

function suggest_getstyle(el, styleProp) {
	if (el.currentStyle)
		var y = el.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
	return y;
}


function suggest_emptyresults() {
	var elt = document.getElementById(suggest_resultsid);

	if (!elt) return; // if the results box doesn't exist (yet), bail out.

	elt.innerHTML = '';
	elt.numResults = 0;
	elt.selectedIndex = -1;
	elt.results = [];
	suggest_hide(elt);
}

function suggest_addresult(elt, qElt, name, login, id) {
	if (!elt) return;

	idx = elt.numResults;
	elt.results[elt.numResults++] = id;

	var _res = '';
	_res += '<div class="sr"'
		+  ' onmouseover="suggest_mouseover(\'' + elt.id + '\', \'' + qElt.id + '\', ' + idx + ')"'
		+  ' onmouseout="suggest_mouseout(\'' + elt.id + '\', ' + idx + ')"'
		+  ' onclick="suggest_mouseclick(\'' + elt.id + '\', \'' + qElt.id + '\', ' + idx + ')">';
	_res += '<span class="srt">' + name + '</span>';
	if (login.length > 0)
		_res += '<span class="src">' + login + '</span>';
	_res += '</div>';

	elt.innerHTML += _res;
}

function suggest_mouseover(id, qId, idx) {
	elt = document.getElementById(id);
	elt.selectedIndex = idx;
	qElt = document.getElementById(qId);
	qElt.focus();

	suggest_highlightsel(elt);
}

function suggest_mouseout(id, idx) {
	elt = document.getElementById(id);
	elt.selectedIndex = -1;

	suggest_highlightsel(elt);
}

function suggest_mouseclick(id, qId, idx) {
	elt = document.getElementById(id);
	qElt = document.getElementById(qId);

	qElt.value = elt.results[idx];
	suggest_hide(elt);
}

function suggest_handleup(elt, qElt) {
	if (elt.numResults > 0 && suggest_ishidden(elt)) {
		suggest_show(elt);
		return;
	}

	if (elt.selectedIndex == 0) {
		elt.scrollTop = 0;
		return;
	} else if (elt.selectedIndex < 0) {
		elt.selectedIndex = elt.numResults - 1;
		elt.scrollTop = elt.scrollHeight;
	} else {
		elt.selectedIndex--;
		elt.scrollTop -= elt.getElementsByTagName('div')[elt.selectedIndex].offsetHeight - 2;
	}
	suggest_highlightsel(elt, qElt);
}

function suggest_handledown(elt, qElt) {
	if (elt.numResults > 0 && suggest_ishidden(elt)) {
		suggest_show(elt);
		return;
	}

	if (elt.selectedIndex == elt.numResults - 1) {
		elt.scrollTop = elt.scrollHeight;
		return;
	} else if (elt.selectedIndex < 0) {
		elt.selectedIndex = 0;
		elt.scrollTop = 0;
	} else {
		elt.scrollTop += elt.getElementsByTagName('div')[elt.selectedIndex].offsetHeight - 2;
		elt.selectedIndex++;
	}
	suggest_highlightsel(elt, qElt);
}

function suggest_highlightsel(elt, qElt) {
	divs = elt.getElementsByTagName('div');

	for (i = 0; i < divs.length; i++) {
		if (i == elt.selectedIndex) {
			divs[i].className = 'srs';
			if (qElt) {
				qElt.tempQuery = elt.results[i];
				qElt.value = elt.results[i];
			}
		}
		else
			divs[i].className = 'sr';
	}
}

function suggest_handlesuggestions(data) {
	suggest_emptyresults();

	var qElt = suggest_elements.shift();
	var rElt = document.getElementById(suggest_resultsid);
	
	if (!rElt) return; // if the results box doesn't exist (yet), bail out.
	
	if (data.length > 0) {
		for (i = 0; i < data.length; i++) {
			suggest_addresult(rElt, qElt, data[i][0], data[i][1], data[i][2]);
		}
		suggest_show(rElt, qElt);
	}
}
