var searchReq = getXmlHttpRequestObject();
var lexBoxWidth = 300;
var lastSearchTerm;
var lastSearchResult;
var lexbox = document.getElementById("lexbox");
var moveInLexBox = false;
var hideTimeout = 0;

function getXmlHttpRequestObject() //Gets the browser specific XmlHttpRequest Object
{
	if (window.XMLHttpRequest)
	{
		return new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
                return false;
	}
}

function RTrimAll(str)	//removes whiteSpaces at the string end
{
	if (str==null)
		return str;

	for(var i=str.length-1; str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t"; i--);

	return str.substring(0,i+1);
}

function searchSuggest(term)	//Starts the AJAX request
{
	str = term;
	str = RTrimAll(str);

	if (searchReq.readyState == 4 || searchReq.readyState == 0)
	{
                last_request_ss=str;  
   	        searchReq.open("GET", '/s/lexikon/getlexitem/term/' + str, true);
		searchReq.onreadystatechange = handleSearchSuggest; 
		searchReq.send(null);
  	}		
}

function handleSearchSuggest()	//Called when the AJAX response is returned.
{
	if (searchReq.readyState == 4) 
	{
		data = searchReq.responseText;
		setBoxText(data);
		showBox();
	}
}

function lex(element, begriff)	//calles from a span element (Startpoint)
{
	lexlink = element;
	element.onmouseout = delayedhideBox;
	setElement(element);
	lastSearchTerm = begriff;
	searchSuggest(begriff);
}

function setElement(obj)
{
        var coors = findPos(obj);
        var x = document.getElementById("lexbox");
	var boxLeft = coors[0];
	var boxTop = coors[1] + 5;
        var leftPadding = 40;	//abstand - wird bei überlappung wegen padding hinzugerechnet
        var toleranzPadding = 20;
        var rightCornerPos = Number(boxLeft) + Number(lexBoxWidth) + toleranzPadding;
	var finalLeft = 0;

        if(rightCornerPos > getWindowProp('width'))        //wenn der Platz nach rechts für die Box nicht ausreicht.
        {
                var overLapping = (Number(lexBoxWidth) + Number(boxLeft)) - getWindowProp('width') + leftPadding;
                newleft = Number(boxLeft) - Number(overLapping);
		finalLeft = newleft;
        }
	else	//rechts ist genug Platz
	{
		finalLeft = boxLeft + toleranzPadding;
	}

	x.style.left = finalLeft + 'px';
	x.style.top = boxTop + 'px';
}

function findPos(obj)
{
        var curleft = curtop = 0;
        if (obj.offsetParent)
        {
                curleft = obj.offsetLeft
                curtop = obj.offsetTop
                while (obj = obj.offsetParent)
                {
                        curleft += obj.offsetLeft
                        curtop += obj.offsetTop
                }
                curtop += 18;
        }
        return [curleft,curtop];
}

function lexEvt(type)
{
        switch(type)
        {
                case "move":
                {
                        moveInLexBox = true;
                        showBox();
                        break;
                }
                case "out":
                {
                        moveInLexBox = false;
			BoxoutDelayHideBox();
                        break;
                }
        }
}

function setBoxText(message)
{
        box = document.getElementById("lexbox");
        box.innerHTML = message;
}

function getWindowProp(name)	 //ermittelt die fensterbreite und höhe (ohne scrolling) für alle Browser
{
	var x,y;
	if (self.innerHeight) // all except Explorer
	{
		x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}

	switch(name)
	{
		case "width":
			return Number(x);
			break;
		case "height":
			return Number(y);
			break;
	}
}

function showBox()	//zeigt die Lexikon box an
{
	if(hideTimeout != 0)
	{
		window.clearTimeout(hideTimeout);
		hideTimeout = 0;
	}

        box = document.getElementById("lexbox");
	box.style.display = "block";
}

/*Blendet die Lexikon Box verzögert aus (wenn ein mouseout vom span erfolgt. Mouseouts von der Lexikon box blenden sofort aus)*/
function delayedhideBox()
{
	hideTimeout = window.setTimeout("hideBox()", 500);	//box nach intervall verbergen
}

function BoxoutDelayHideBox()	//verhindert das flackern der box wenn von der box zurück ins span gewechselt wird
{
	hideTimeout = window.setTimeout("hideBox()", 100);
}

function hideBox()	//blendet die Lexikon-Box aus
{
	if(hideTimeout != 0)
	{
		window.clearTimeout(hideTimeout);
		hideTimeout = 0;
	}

        if(!moveInLexBox)       //wenn maus außerhalb von Lexikon-link und Lexikon-Box
        {
                lexbox = document.getElementById("lexbox");
                lexbox.style.display = "none";
        }
}



