var jpopup_show, jpopup_mousedown, jpopup_document_mousedown, jpopup_over, jpopup_init;

function showpopup(id, el, pos)
{
  id = (typeof(id)=='object' ? id : $(id));
	if (!id.ispopup) id = jpopup(id);
	if (id.isPopupVisible) return;
	
  jpopup_mousedown=document.body;
	id.showByRect(rect(el), pos);
	setTimeout('jpopup_mousedown=null',5);
}

//exibe o menu faz com que ele suma se o mouse estiver fora do menu e submenu
function showpopupover(id, el, pos)
{
  id = (typeof(id)=='object' ? id : $(id));
	if (!id.ispopup)
		id = jpopup(id);
	
	el.onmouseout=id.onmouseout=function()//quando sai do menu ou do submenu
	{		  
		id.mouse_in=false;
		id.tm=setTimeout(function(){id.hide();},40);//oculta o submenu
	}
	
	id.onmouseover=function()//quando entra no submenu
	{
		id.mouse_in=true;
		clearTimeout(id.tm);//cancela a ocultação de si mesmo
  }
	
	if (id.tm) clearTimeout(id.tm);//cancela a ocultação do submenu atraves do timer
	id.showByRect(rect(el), pos);
}

function showmenu(elmenu, elref, pos)
{
  elmenu = (typeof(elmenu)=='object' ? elmenu : $(elmenu));
	elmenu = menu(elmenu);	
	elref.onmouseout=function()//quando o mouse sai do elemento que chamou o menu
	{		  
		elmenu.timer.start();
	}
	
	elmenu.timer.stop();
	elmenu.parentMenu = parentMenu(elref);
	if (elmenu.parentMenu)
	{
	  elmenu.parentMenu.childMenu = elmenu;
		elmenu.parentMenu.elref = elref;
	}
	
	elmenu.showByRect( rect(elref) , pos );
}

//cria um menu
function menu(el)
{
  if ( el.ismenu ) return el;
	if (!el.ispopup) el = jpopup(el);
	
	el.ismenu=true;
	el.mouse_in=false;
	el.timer=new timer(50);
	
	//eventos nativos
	el.onmouseover=function() //o mouse entra no menu
	{		
		el.mouse_in=true;
		if (el.parentMenu)
		  addClass(el.parentMenu.elref, 'menu-item-parent');
	}	
	el.onmouseout=function() //o mouse sai do menu
	{			
		el.mouse_in=false;
		if (el.parentMenu)
		  removeClass(el.parentMenu.elref, 'menu-item-parent');
		el.timer.start();
	}	
		
	//outros eventos
	el.timer.onTimer=function()
	{
	  el.timer.stop();
	  if (!el.mouse_in) //o mouse tá fora do menu
		  if (!el.childMenu) //o menu não tem filho visível
			  el.hide();
			else if (!el.childMenu.mouse_in) //o menu tem filho e o mouse tá fora do menu filho
			  el.hide();
	}
	el.onhide=function()
	{	  
		if (el.parentMenu) //se tem um menu pai
		{
		  removeClass(el.parentMenu.elref, 'menu-item-parent');
			if (!el.parentMenu.mouse_in  ) // e o mouse não está no menu pai
			  el.parentMenu.hide();		  
		}
	}		
	return el;
}

function parentMenu(el)
{
  while (el)
	{
	  if (el.ismenu)
		  return el;
		el=el.parentNode;
	}
	return null;
}

function hidePopups()
{
	var i, nodes = document.body.childNodes;
	for ( i=0; i<nodes.length; i++ )
		if ( nodes[i].isPopupVisible )
			nodes[i].hide();
	jpopup_show=jpopup_mousedown=null;
}

function jpopup(el)
{
	el.bg=document.body.appendChild(createElement('div','display:none;', 'jpopup-bg-1') );
	el.bg.innerHTML='<div class="jpopup-bg-2"></div><div class="jpopup-bg-3"></div><div class="jpopup-bg-4"></div>';
	el.show=function(x,y)
	{
		x=x?x:0;
		y=y?y:0;
		el.style.display='';
		el.style.visibility='hidden';
		
		//Ajusta o popup para não passar da janela
		if (x+el.offsetWidth+5>el.parentNode.offsetWidth ) x-=(el.offsetWidth+5);
		if (y+el.offsetHeight+5>el.parentNode.offsetHeight ) y-=(el.offsetHeight+5);
		if (x<0)x=0;
		if (y<0)y=0;
		
		el.style.left=x;
		el.style.top=y;
		el.style.visibility='';
		
		el.isPopupVisible=true;
		el.style.zIndex=ZINDEX++;
		
		with(el.bg.style){
			top=y+5;
			left=x+5;
			width=this.offsetWidth;
			height=this.offsetHeight;
			zIndex=ZINDEX-2;
			position='absolute';
			display='block';
			//background='red';
			//alert(this.bg);
		}
		

    if ( !jpopup_show)
		{
		  jpopup_document_mousedown = document.onmousedown;
		  document.onmousedown=function()
			{				
			  if ( jpopup_mousedown ) return;
				hidePopups();
	      jpopup_show=jpopup_mousedown=null;
				document.onmousedown=jpopup_document_mousedown;
				jpopup_document_mousedown=null;
			}
		}    
		jpopup_show=el;
  }
		
	el.showByRect=function(rec, pos)
	{
		el.style.visibility='hidden';
		el.style.top=-1000;
		el.style.display='';
		
		if (pos.length>7)
		{
			var p = pos.split(' ');
			var x=0, y=0;
			for (var i=0; i<p.length; i++)
			{
				switch( p[i] )
				{
					case 'left':   x=rec.left; break;
					case 'top':    y=rec.top; break;
					case 'bottom': y=rec.top +rec.height; break;
					case 'right':  x=rec.left+rec.width; break;
				}
			}
			this.show( x, y );
		}
		else
		{
			switch(pos)
			{
				case 'left':   el.show(rec.left-el.offsetWidth, rec.top); break;
				case 'top':    el.show(rec.left, rect.top-el.offsetHeight); break;
				case 'bottom': el.show(rec.left, rec.top+rec.height); break;
				case 'right':  el.show(rec.left+rec.width, rec.top); break;
			}
		}
	}
	el.hide=function()
	{
		el.style.display='none';		
		el.isPopupVisible=false;
		el.bg.style.display='none';
		if (el.onhide) el.onhide();
	}	
	el.onmousedown=function(evt)
	{
		jpopup_mousedown=el;
		setTimeout('jpopup_mousedown=null', 10);//stopPropagation(evt)
	}
	el.onclick=function(evt)
	{
		setTimeout('if (document.onmousedown) document.onmousedown();',10);
	}
	el.ispopup=true;
	el.isPopupVisible=false;
	el.style.position='absolute';
	el.style.display='none';
	document.body.appendChild(el);
	return el;
}
