
//////////////////////////////////////////////////////////////////////////////////
// dropDownMenu.js
// Implementa um menu em javascript que desce a partir do elemento onde for criado.
//////////////////////////////////////////////////////////////////////////////////

var timeout	= 500;
var closetimer	= 0;
var ddmenuitem	= 0;

// abre layer escondida
function mopen(obj, id)
{	
	// cancelar timer de fechar menu
	mcancelclosetime();

	// fechar possível layer aberta
	if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';

	// mostrar a nova layer
	ddmenuitem = document.getElementById(id);
	ddmenuitem.style.visibility = 'visible';
	
	// posicionar o layer flutuante por baixo do objecto que o evocou
	ddmenuitem.style.left = zxcPos(obj)[0] + "px";
	ddmenuitem.style.top  = zxcPos(obj)[1] + obj.offsetHeight + "px";
}


// fechar layer aberta
function mclose()
{
	if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';
}

// timer de fechar layer
function mclosetime()
{
	closetimer = window.setTimeout(mclose, timeout);
}

// cancelar timer de fechar layer
function mcancelclosetime()
{
	if(closetimer)
	{
		window.clearTimeout(closetimer);
		closetimer = null;
	}
}

// fechar layer quando alg clicar fora, algures na página.
//  - pode ter problemas com outros scripts que necessitem de eventos onclick do Document.
//  - nesse caso, tentar fazer event bubbling
document.onclick = mclose; 



//http://www.webdeveloper.com/forum/showthread.php?t=115590
// devolve um array com posições left, top, de um objecto mesmo que se encontre dentro de DIVS flutuantes, etc.
function zxcPos(zxcobj){
 zxclft=zxcobj.offsetLeft;
 zxctop=zxcobj.offsetTop;
 while(zxcobj.offsetParent!=null){
  zxcpar=zxcobj.offsetParent;
  zxclft+=zxcpar.offsetLeft;
  zxctop+=zxcpar.offsetTop;
  zxcobj=zxcpar;
 }
 return [zxclft,zxctop];
}
