// PHP Layers Menu 3.2.0-rc (C) 2001-2004 Marco Pratesi - http://www.marcopratesi.it/

useTimeouts = 1;
timeoutLength = 1000;	// time in ms; not significant if useTimeouts = 0;
shutdownOnClick = 0;

loaded = 0;
layersMovedL = 0;
layersMovedV = 0;
layerPoppedUp = '';

timeoutFlag = 0;
if (Opera56 || IE4) {
	useTimeouts = 0;
}
if (NS4 || Opera56 || IE4) {
	shutdownOnClick = 1;
}

currentY = 0;
function grabMouse(e)	// for NS4
{
	currentY = e.pageY;
}
if (NS4) {
	document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE);
	document.onmousemove = grabMouse;
}

function seeThroughElements(show)
{
	if (show) {
		foobar = 'visible';
	} else {
		foobar = 'hidden';
	}
	for (i=0; i<toBeHidden.length; i++) {
		toBeHidden[i].style.visibility = foobar;
	}
}

function shutdown()
{	
	// try {console.log("shutdown","prefix:",prefix,"layerPoppedUp:",layerPoppedUp );} catch (e) {};
	try {
		for (i=0; i<numlL; i++) {
			LMPopUpL(listlL[i], false);
		}
		layerPoppedUp = '';
	} catch	(e) {}
	try {
		for (i=0; i<numlV; i++) {
			LMPopUpL(listlV[i], false);
		}
		layerPoppedUp = '';
	} catch	(e) {}
	
	if (Konqueror || IE5) {
		seeThroughElements(true);
	}
}
if (shutdownOnClick) {
	if (NS4) {
		document.onmousedown = shutdown;
	} else {
		document.onclick = shutdown;
	}
}

function setLMTO()
{
	if (useTimeouts) {
		timeoutFlag = setTimeout('shutdown()', timeoutLength);
	}
}

function clearLMTO()
{
	if (useTimeouts) {
		clearTimeout(timeoutFlag);
	}
}

function moveLayerX(menuName)
{
	prefix = menuName.substring(0,1);
	if (prefix=="L")
	{
		if (!loaded || (isVisible(menuName) && menuName != layerPoppedUp)) {
			return;
		}
		if (fatherL[menuName] != '') {
			if (!Opera5 && !IE4) {
				width0 = lwidth[fatherL[menuName]];
				width1 = lwidth[menuName];
			} else if (Opera5) {
				// Opera 5 stupidly and exaggeratedly overestimates layers widths
				// hence we consider a default value equal to $abscissaStep
				width0 = abscissaStep;
				width1 = abscissaStep;
			} else if (IE4) {
				width0 = getOffsetWidth(fatherL[menuName]);
				width1 = getOffsetWidth(menuName);
			}
			onLeft = getOffsetLeft(fatherL[menuName]) - width1 + menuLeftShift;
			onRight = getOffsetLeft(fatherL[menuName]) + width0 - menuRightShift;
			windowWidth = getWindowWidth();
			windowXOffset = getWindowXOffset();
//		if (NS4 && !DOM) {
//			windowXOffset = 0;
//		}
			if (onLeft < windowXOffset && onRight + width1 > windowWidth + windowXOffset) {
				if (onRight + width1 - windowWidth - windowXOffset > windowXOffset - onLeft) {
					onLeft = windowXOffset;
				} else {
					onRight = windowWidth + windowXOffset - width1;
				}
			}
			if (back[fatherL[menuName]]) {
				if (onLeft < windowXOffset) {
					back[menuName] = 0;
				} else {
					back[menuName] = 1;
				}
			} else {
//alert(onRight + ' - ' + width1 + ' - ' +  windowWidth + ' - ' + windowXOffset);
				if (onRight + width1 > windowWidth + windowXOffset) {
					back[menuName] = 1;
				} else {
					back[menuName] = 0;
				}
			}
			if (back[menuName]) {
				setLeft(menuName, onLeft);
			} else {
				setLeft(menuName, onRight);
			}
		}
		moveLayerY(menuName);	// workaround needed for Mozilla < 1.4 for MS Windows
	}
	prefix = menuName.substring(0,1);
	if (prefix=="V")
	{
	if (!loaded || (isVisible(menuName) && menuName != layerPoppedUp)) {
			return;
		}
		if (fatherV[menuName] != '') {
			if (!Opera5 && !IE4) {
				width0 = lwidth[fatherV[menuName]];
				width1 = lwidth[menuName];
			} else if (Opera5) {
				// Opera 5 stupidly and exaggeratedly overestimates layers widths
				// hence we consider a default value equal to $abscissaStep
				width0 = abscissaStep;
				width1 = abscissaStep;
			} else if (IE4) {
				width0 = getOffsetWidth(fatherV[menuName]);
				width1 = getOffsetWidth(menuName);
			}
			onLeft = getOffsetLeft(fatherV[menuName]) - width1 + menuLeftShift;
			onRight = getOffsetLeft(fatherV[menuName]) + width0 - menuRightShift;
			windowWidth = getWindowWidth();
			windowXOffset = getWindowXOffset();
//		if (NS4 && !DOM) {
//			windowXOffset = 0;
//		}
			if (onLeft < windowXOffset && onRight + width1 > windowWidth + windowXOffset) {
				if (onRight + width1 - windowWidth - windowXOffset > windowXOffset - onLeft) {
					onLeft = windowXOffset;
				} else {
					onRight = windowWidth + windowXOffset - width1;
				}
			}
			if (back[fatherV[menuName]]) {
				if (onLeft < windowXOffset) {
					back[menuName] = 0;
				} else {
					back[menuName] = 1;
				}
			} else {
//alert(onRight + ' - ' + width1 + ' - ' +  windowWidth + ' - ' + windowXOffset);
				if (onRight + width1 > windowWidth + windowXOffset) {
					back[menuName] = 1;
				} else {
					back[menuName] = 0;
				}
			}
			if (back[menuName]) {
				setLeft(menuName, onLeft);
			} else {
				setLeft(menuName, onRight);
			}
		}
		moveLayerY(menuName);	// workaround needed for Mozilla < 1.4 for MS Windows
	}
}

function moveLayerY(menuName)
{
	if (!loaded || (isVisible(menuName) && menuName != layerPoppedUp)) {
		return;
	}
	if (!layersMovedL || !layersMovedV) {
		prefix = menuName.substring(0,1);
		if (prefix=="L"){
			moveLayersHorz();
			layersMovedL = 1;
		} else {
			moveLayersVert();
			layersMovedV = 1;
		}
		
	}
	if (!NS4) {
		newY = getOffsetTop('ref' + menuName);
	} else {
		newY = currentY;
	}
	newY += menuTopShift;
	layerHeight = getOffsetHeight(menuName);
	windowHeight = getWindowHeight();
	windowYOffset = getWindowYOffset();
	if (newY + layerHeight > windowHeight + windowYOffset) {
		if (layerHeight > windowHeight) {
			newY = windowYOffset;
		} else {
			newY = windowHeight + windowYOffset - layerHeight;
		}
	}
	if (Math.abs(getOffsetTop(menuName) - newY) > thresholdY) {
		setTop(menuName, newY);
	}
}

function moveLayerX1(menuName, father)
{
	prefix = menuName.substring(0,1);
	if (prefix=="L")
	{
		if (!lwidthDetectedL) 
		{	
			return;	
		}
		if (!Opera5 && !IE4) {
			width1 = lwidth[menuName];
		} else if (Opera5) {
			// Opera 5 stupidly and exaggeratedly overestimates layers widths
			// hence we consider a default value equal to $abscissaStep
			width1 = abscissaStep;
		}
		foobar = getOffsetLeft(father + menuName);
		if (!IE4) {
			windowWidth = getWindowWidth();
			windowXOffset = getWindowXOffset();
			if (foobar + width1 > windowWidth + windowXOffset) {
				foobar = windowWidth + windowXOffset - width1;
			}
			if (foobar < windowXOffset) {
				foobar = windowXOffset;
			}
		}
		setLeft(menuName, foobar);
	}
	else 
	{
		if (!lwidthDetectedV) 
		{	
			return;	
		}
		if (!Opera5 && !IE4) {
		width1 = lwidth[menuName];
	} else if (Opera5) {
		// Opera 5 stupidly and exaggeratedly overestimates layers widths
		// hence we consider a default value equal to $abscissaStep
		width1 = abscissaStep;
	}
	foobar = getOffsetLeft(father + menuName);
	if (!IE4) {
		windowWidth = getWindowWidth();
		windowXOffset = getWindowXOffset();
		if (foobar + width1 > windowWidth + windowXOffset) {
			foobar = windowWidth + windowXOffset - width1;
		}
		if (foobar < windowXOffset) {
			foobar = windowXOffset;
		}
	}
	setLeft(menuName, foobar);
	}
}

function layersOverlap(layer, i)
{
	if (Konqueror22) {
		return true;
	}

//	xa1 = getOffsetLeft(layer);
//setLeft(layer, xa1);
	xa1 = layerLeft[layer];
	xa2 = xa1 + getOffsetWidth(layer);
//setWidth(layer, xa2-xa1);
//	ya1 = getOffsetTop(layer);
//setTop(layer, ya1);
	ya1 = layerTop[layer];
	ya2 = ya1 + getOffsetHeight(layer);
//setHeight(layer, ya2-ya1);
//alert(':' + xa1 + ':' + xa2 + ':' + ya1 + ':' + ya2 + ':');

	xb1 = toBeHiddenLeft[i];
	xb2 = xb1 + toBeHidden[i].offsetWidth;
	yb1 = toBeHiddenTop[i];
	yb2 = yb1 + toBeHidden[i].offsetHeight;
//alert(':' + xb1 + ':' + xb2 + ':' + yb1 + ':' + yb2 + ':');

	if(xb1>xa1) xa1=xb1; if(xb2<xa2) xa2=xb2;
	if(yb1>ya1) ya1=yb1; if(yb2<ya2) ya2=yb2;

	return (xa2>xa1 && ya2>ya1);
}

function seeThroughWorkaround(menuName, on)
{
	for (i=0; i<toBeHidden.length; i++) {
		if (layersOverlap(menuName, i)) {
			if (on) {
				toBeHidden[i].style.visibility = 'hidden';
			} else {
				toBeHidden[i].style.visibility = 'visible';
			}
		}
	}
}

function LMPopUpL(menuName, on)
{
	//// try {console.log("9","a:",menuName,"b:",layersMovedV,"c:",layersMovedL,"d:",menuName.substring(0,1),"end");} catch (e) {};
	if (!loaded) {
		return;
	}
	
	if (!layersMovedL==1 || !layersMovedV==1) {//alert(menuName);
		prefix = menuName.substring(0,1);
		// try {console.log("if",prefix,"eq L");} catch (e) {};
		if (prefix=="L"){
			// try {console.log(" 9.0.0.1","menuName:",menuName,"layersMovedV:",layersMovedV,"layersMovedL:",layersMovedL,"menuName.substring(0,1):",menuName.substring(0,1));} catch (e) {};
			if (!layersMovedL==1)  {
				// try {console.log("9.1.2","menuName:",menuName,"layersMovedV:",layersMovedV,"layersMovedL:",layersMovedL,"menuName.substring(0,1):",menuName.substring(0,1),"end");} catch (e) {};
				moveLayersHorz();
				layersMovedL = 1;
			}
		} else if (prefix=="V"){
			if (!layersMovedV==1)  {
				// try {console.log(" 9.2","menuName:",menuName,"layersMovedV:",layersMovedV,"layersMovedL:",layersMovedL,"menuName.substring(0,1):",menuName.substring(0,1));} catch (e) {};
				// try {console.log(" 9.2.2","menuName:",menuName,"layersMovedV:",layersMovedV,"layersMovedL:",layersMovedL,"menuName.substring(0,1):",menuName.substring(0,1));} catch (e) {};
				moveLayersVert();
				layersMovedV = 1;
			}
		}
	}
	setVisibility(menuName, on);
}

function LMPopUp(menuName, isCurrent)
{ 
	
	prefix = menuName.substring(0,1);
	if (prefix=="L"){
		if (!loaded || menuName == layerPoppedUp || (isVisible(menuName) && !isCurrent)) {
			return;
		}
		if (menuName == fatherL[layerPoppedUp]) {
			// try {console.log("6","menuName:",menuName,"layerPoppedUp:",layerPoppedUp,"fatherLmenuName:",fatherL[menuName]);} catch (e) {};
			LMPopUpL(layerPoppedUp, false);
		// seeThroughWorkaround(menuName, false);
		} else if (fatherL[menuName] == layerPoppedUp) {
			LMPopUpL(menuName, true);
			seeThroughWorkaround(menuName, true);
		} else {
			shutdown();
			foobar = menuName;
			do {
				LMPopUpL(foobar, true);
				seeThroughWorkaround(foobar, true);
				foobar = fatherL[foobar];
			} while (foobar != '' )
		}
/*
		if (layerPoppedUp == '') {
			seeThroughElements(false);
		}
*/
		layerPoppedUp = menuName;
	
    } else if (prefix=="V"){
		// alert('debugL');
			
		if (!loaded || menuName == layerPoppedUp || (isVisible(menuName) && !isCurrent)) {
			return;
		}
		if (menuName == fatherV[layerPoppedUp]) {
			LMPopUpL(layerPoppedUp, false);
		// seeThroughWorkaround(menuName, false);
		} else if (fatherV[menuName] == layerPoppedUp) {
			LMPopUpL(menuName, true);
			seeThroughWorkaround(menuName, true);
		} else {
			shutdown();
			foobar = menuName;
			do {
				LMPopUpL(foobar, true);
				seeThroughWorkaround(foobar, true);
				foobar = fatherV[foobar];
			} while (foobar != '')
		}
/*
		if (layerPoppedUp == '') {
			seeThroughElements(false);
		}
*/
		layerPoppedUp = menuName;
	}
}

function resizeHandler()
{
	if (NS4) {
		window.location.reload();
	}
	shutdown();
	prefix = menuName.substring(0,1);
	if (prefix=="L"){
		for (i=0; i<numlL; i++) {
			setLeft(listlL[i], 0);
			setTop(listlL[i], 0);
		}
	} else if (prefix=="V"){
		for (i=0; i<numlV; i++) {
			setLeft(listlV[i], 0);
			setTop(listlV[i], 0);
		}
	}
	
	if (toBeHidden != null && toBeHidden.length > 0) {
		seeThroughCoordinatesDetection();
	}
//	moveLayers();
	
	if (prefix=="L"){layersMovedL = 0}else if (prefix=="V"){layersMovedV = 0};
}
window.onresize = resizeHandler;

function yaresizeHandler()
{
	if (window.innerWidth != origWidth || window.innerHeight != origHeight) {
		if (Konqueror22 || Opera5) {
			window.location.reload();	// Opera 5 often fails this
		}
		origWidth  = window.innerWidth;
		origHeight = window.innerHeight;
		resizeHandler();
	}
	setTimeout('yaresizeHandler()', 500);
}
function loadHandler()
{
	if (Konqueror22 || Opera56) {
		origWidth  = window.innerWidth;
		origHeight = window.innerHeight;
		yaresizeHandler();
	}
}
window.onload = loadHandler;

function fixieflm(menuName)
{
	if (DOM) {
		setWidth(menuName, '100%');
	} else {	// IE4 IS SIMPLY A BASTARD !!!
		document.write('</div>');
		document.write('<div id="IE4' + menuName + '" style="position: relative; width: 100%; visibility: visible;">');
	}
}

