/*
Проверяет, зашла ли мышка в элемент landmark или нет.
Возвращает 1 если вышла, 0 - если нет.
*/
function MouseBoundaryCrossing(evt, landmark)
{
	evt = evt || window.event;
 
	var eventType = evt.type;
 
	this.inLandmark = false;
	this.leftLandmark = false;
	this.enteredLandmark = false;
 
	if(eventType == "mouseout")
	{
		this.toElement = evt.relatedTarget || evt.toElement;
		this.fromElement = evt.target || evt.srcElement;
	}
	else if(eventType == "mouseover")
	{
		this.toElement = evt.target || evt.srcElement;
		this.fromElement = evt.relatedTarget || evt.fromElement;
	}
	else throw (new Error("Event type \""+eventType+"\" is irrelevant"));	//irrelevant event type
 
	//target is unknown
	//this seems to happen on the mouseover event when the mouse is already inside the element when the page loads and
	// the mouse is moved: fromElement is undefined
	if(!this.toElement || !this.fromElement) throw (new Error("Event target(s) undefined"));
 
	//determine whether from-element is inside or outside of landmark (i.e., does tmpFrom == the landmark or the document?)
	var tmpFrom = this.fromElement;
	while(tmpFrom.nodeType == 1)	//while tmpFrom is an element node
	{
		if(tmpFrom == landmark) break;
		tmpFrom = tmpFrom.parentNode;
	}
 
	//determine whether to-element is inside or outside of landmark (i.e., does tmpTo == the landmark or the document?)
	var tmpTo = this.toElement;
	while(tmpTo.nodeType == 1)	//while tmpTo is an element node
	{
		if(tmpTo == landmark) break;
		tmpTo = tmpTo.parentNode;
	}
 
	if(tmpFrom == landmark && tmpTo == landmark) this.inLandmark = true;	//mouse is inside landmark; didn't enter or leave
	else if(tmpFrom == landmark && tmpTo != landmark)	//mouse left landmark
	{
		this.leftLandmark = true;
		this.inLandmark = (eventType == "mouseout");	//mouseout: currently inside landmark, but leaving now
		return 1;
														//mouseover: currently outside of landmark; just left
	}
	else if(tmpFrom != landmark && tmpTo == landmark)	//mouse entered landmark
	{
		this.enteredLandmark = true;
		this.inLandmark = (eventType == "mouseover");	//mouseover: currently inside landmark; just entered
														//mouseout: currently outside of landmark, but entering now
		return 0;												
	}
	//else	//mouse is outside of landmark; didn't enter or leave
}

/*
Возвращает абсолютные координаты объекта
В виде объекта с полями x, y, width и height
*/
function GetAbsPosition(object) {
	var position = new Object;
	position.x = 0;
	position.y = 0;
	
	if( object ) {
	position.x = object.offsetLeft;
	position.y = object.offsetTop;
	
	if( object.offsetParent ) {
	var parentpos = GetAbsPosition(object.offsetParent);
	position.x += parentpos.x;
	position.y += parentpos.y;
	}
	}
	
	position.cx = object.offsetWidth;
	position.cy = object.offsetHeight;
	
	if(object.clientHeight) {
		position.height = object.clientHeight;
	} else {
		if(object.offsetHeight) {
			position.height = object.offsetHeight;
		}
	}
	
	if(object.clientWidth) {
		position.width = object.clientWidth;
	} else {
		if(object.offsetWidth) {
			position.width = object.offsetWidth;
		}
	}
	
	return position;
}


/*
Некоторые утверждают, что предыдущая функция может не работать. Не знаю, у меня всё работает.
Но на всякий случай привожу пример функции, которая делает то же самое, и при этом
как будто бы работает лучше.
*/
/*function GetAbsPosition(zxcobj){
	var position = new Object;
	position.x = 0;
	position.y = 0;
	
	zxclft=zxcobj.offsetLeft;
	zxctop=zxcobj.offsetTop;
	while(zxcobj.offsetParent!=null){
	 zxcpar=zxcobj.offsetParent;
	 zxclft+=zxcpar.offsetLeft;
	 zxctop+=zxcpar.offsetTop;
	 zxcobj=zxcpar;
	}
	
	position.x = zxclft;
	position.y = zxctop;

	return position;
}*/

/*
Определяет, в какую сторону мышка движется по надписи "новости"
(наружу или снаружи), и производит соответствующие случаю действия.
*/
function infoSpanMouseMove(span, panel, evt) {
	id = document.getElementById(span);
	id2 = document.getElementById(panel);
	position = GetAbsPosition(id);
	position2 = GetAbsPosition(id2);
	
	result = MouseBoundaryCrossing(evt,id);
	
	if (result) {
		toElement = evt.relatedTarget || evt.toElement;
		
		if (toElement!=id2) {
			id2.style.visibility = "hidden";
		}
	} else {
		id2.style.top = position.y + position.height;
		id2.style.left = (position.x + position.width/2)-position2.width/2;
		id2.style.visibility = "visible";
	}
}

/*
Определяет, движается ли мышка наружу, и если да - делает невидимым
*/
function infoPanelMouseMove(panel, evt) {
	id = document.getElementById(panel);
	if (MouseBoundaryCrossing(evt,id)) {
		id.style.visibility = "hidden";
	}
}
