﻿//Autor: Darlan O. da Luz - 30/10/2008

//funções auxiliares de DOM
function getById(id) {
  return document.getElementById(id);
}
//Cria um novo elemento
//Obs.: Não funciona no IE p/ elementos de tabela como td, tr e etc.
//Utilizar insertCell ou insertRow que é o método padrão do elemento.
function addElement(tipo, id) {
   obj = document.createElement(tipo);
   if(id != "") obj.id = id;
   return obj;
}
function getWidthUl(ul)
{
  var w=0;
  //ul li ul
  if(ul.childNodes.length >0 && ul.childNodes[0].childNodes.length>1)
  {
    w += getWidthUl(ul.childNodes[0].childNodes[1]);
    return w+ul.offsetWidth;
  }
  else
    return ul.offsetWidth;  
}
////////////////

////// Itentifica o navegador
var version=0
if (navigator.appVersion.indexOf("MSIE")!=-1){
temp=navigator.appVersion.split("MSIE")
version=parseFloat(temp[1])
}
var msie=document.all
var ie6=typeof dropmenuiframe=='undefined'? 0 : 1
var ns6=document.getElementById&&!document.all
var netscape=navigator.vendor=="Netscape";
var safari=(navigator.userAgent.indexOf('Safari')!=-1)?true:false;
///////////

//Retorna a posição absoluta de um elemento
//what - É o elemento
//offsettype - É o tipo de posição: top, left...
function getposOffset(what, offsettype){
  var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
  var parentEl=what.offsetParent;
  while (parentEl!=null){
    if (msie) {
      totaloffset=(offsettype=="left" )? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
    }
    else {
      totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
    }
    (offsettype=="left") ? leftOffset=parentEl.offsetLeft : topOffset=parentEl.offsetTop;
    parentEl=parentEl.offsetParent;
  }
  if (ie6){
   if (offsettype=="left") totaloffset -= leftOffset;
  }
  if (msie){
   if (offsettype=="left") totaloffset += 1;
  }
  return totaloffset;
}

//Variáveis de controle do menu
var _GrupoOver = false;
var _ItensOver = false;
var _LastGrupo = null;
var nClose = 0;
////////////////

//Verifica se esta com mouse encima dos itens,
//se não estiver destroi os elementos de dentro da div de itens
function CloseMenu()
{
  if(_GrupoOver == false && _ItensOver == false)
  {
    nClose=0;
    var divItens = getById("_divItens_nemu2");
    divItens.style.display = "none";
    divItens.innerHTML = "";
    
    if(_LastGrupo != null)
      _LastGrupo.updateStyleOut();
    
    _LastGrupo = null;
  }
  else if(nClose < 10)
  {
    nClose++;
    setTimeout("CloseMenu();",1000);
  }
}


////// MenuItem - Inicio ////////////
function MenuItem(texto,link)
{
  this.Link = link;
  this.Texto = texto;
}
MenuItem.prototype.draw = function(ul)
{
  var li = addElement("li","");
  var link = addElement("a","");
  
  link.innerHTML = this.Texto;
  link.href = this.Link;
  
  link.rel = this;
  //link.onmouseover = this.LinkMouseOver;
  //link.onmouseout = this.LinkMouseOut; 
  
  ul.appendChild(li);
  li.appendChild(link);
}
MenuItem.prototype.LinkMouseOut = function()
{
  var a = this;
  var Item = this.rel;
  
}

MenuItem.prototype.LinkMouseOver = function()
{
  var a = this;
  var Item = this.rel;
  
}
////// MenuItem - Fim ////////////


////// GrupoItem - Inicio ////////////
function GrupoItem()
{ 
  this.Itens = [];
  this.CssLink = "";
  this.Css = "";
  this.CssItens = "";
  this.Link = "";
  this.Div = null;
  this.ImgSepar = "";
  this.innerHTML = "";
  this.Selecionado = false;
  this.DivMenu = "";
  this.tbMenu = "";
  this.trMenu = "";
  this.IdDiv = "";
 
}
GrupoItem.prototype.AddItem = function(item)
{
  if (!(item instanceof MenuItem)) return false;

  item.parent = this;
  this.Itens[this.Itens.length] = item; 
  return true;
}
GrupoItem.prototype.Render = function()
{
  var divMenu = getById(this.DivMenu);
  var tr = getById(this.trMenu);  
  var td = tr.insertCell(tr.childNodes.length);
  var div = addElement("div","");
  var link = addElement("a","");  

  td.appendChild(div);  
  div.innerHTML = this.innerHTML;
  //link.innerHTML = this.innerHTML;
  //if(this.Link != "")
  //  link.href = this.Link;
  
  //div.appendChild(link);
  div.rel = this;
  this.Div = div;
  
  this.updateStyleOut();
  
  div.onmouseover = this.mouseover;
  div.onmouseout = this.mouseout;
}
GrupoItem.prototype.updateStyleOut = function()
{
  var div = this.Div;
  var grupo = this;
  var tb = div.parentNode;
  var css2 = "";
  
  if(grupo.Selecionado)
  {
    grupo.updateStyleOver();
    return;
  }
  
  css2 = this.Css;
  if(css2 == "")
    css2 = this.parent.CssMenuGrupoItens;
  
  tb.className = this.CssLink +" "+css2;  
}
GrupoItem.prototype.updateStyleOver = function()
{
		//alert(this.divId);
  var div = this.Div;
  var grupo = this;
  var tb = div.parentNode;
  var css2 = "";
  
  css2 = this.Css;
  if(css2 == "")
    css2 = this.parent.CssMenuGrupoItens;
    
  tb.className = this.CssLink +"hover  "+css2+"hover";
}
GrupoItem.prototype.ItensOver = function()
{
  _ItensOver = true;
}
GrupoItem.prototype.ItensOut = function()
{
  _ItensOver = false;
  setTimeout("CloseMenu();",500);
}

//Cria os itens dentro da div dinamicamente.
//Ele leva em consideração e tamanho da tela
GrupoItem.prototype.mouseover = function(IdDiv)
{
  _GrupoOver = true;
  	 
  var grupo = this.rel;
  var divItens = getById("_divItens_nemu2");
  var div = this;
  
  divItens.innerHTML = "";
  divItens.className = grupo.CssItens+" "+grupo.parent.CssItens;
  divItens.style.display = "block";
  if(_LastGrupo != null)  
    _LastGrupo.updateStyleOut();
  
  grupo.updateStyleOver();
  _LastGrupo=grupo;
  
  divItens.onmouseover = grupo.ItensOver;
  divItens.onmouseout = grupo.ItensOut;
  
  
  //Posicionar a div de itens
  var y = null;
  var x = null;
  
  var TamItensH = null;
  var TamDisponivelH = document.documentElement.clientHeight;
  var TamDisponivelW = document.documentElement.clientWidth;
  
  var ul = addElement("ul","");
  divItens.appendChild(ul);
  var topLi = null;
  var limiteBalanceamento = null;
  var b=0;//Indice de Balanceamento de colunas
  for(var i=0;grupo.Itens.length>i;i++,b++)
  {
    grupo.Itens[i].draw(ul);
    if(topLi ==null)
      topLi = ul.childNodes[0];
    
    if(limiteBalanceamento != null && b == limiteBalanceamento)
    {
        ul = addElement("ul","");
        topLi.appendChild(ul);
        topLi = null;
        b = 0;
        continue;
    }
    else if(limiteBalanceamento != null)
      continue;
    
    y = getposOffset(divItens, "top");
    TamItensH = ul.offsetHeight+y;    

    //Pergunter de coube se não couber
    //cria um nível a mais
    if(TamDisponivelH <= TamItensH)
    {
      //Resolução muito baixa. Mecanismo p/ evitar loop infinito
      if(ul.childNodes.length <= 3)
      {
        if(ul.childNodes.length <= 2)
          limiteBalanceamento = -1; //Desconsiderar balancemento
        else
          limiteBalanceamento = ul.childNodes.length;
        
        continue;
      }
      //Balanceamento 
      if(limiteBalanceamento == null)
      {
        var limite = i;
        var col =2;
        
        while(true)
        {
          var resto = grupo.Itens.length % col;
          if(resto == 0)
            limiteBalanceamento = grupo.Itens.length/col;
          else
            limiteBalanceamento = (grupo.Itens.length-resto)/col;

          
          if(limite < limiteBalanceamento)
            col++;
          else
          {
            if(resto > 0 && (limiteBalanceamento+resto)<=limite)
              limiteBalanceamento += resto;
            break;
          }
        }       
        
        b=0;
        for(;i >= limiteBalanceamento;i--)
        {
          var li= ul.childNodes[i];
          ul.removeChild(li);
        }
      }
      else
      {      
        var li= ul.childNodes[ul.childNodes.length-1];
        ul.removeChild(li);//Remove o ultimo
        i--;
      }
      
      ul = addElement("ul","");
      topLi.appendChild(ul);      
      
      topLi = null;
    }   
  }
  
  x = getposOffset(div, "left");
  ul = divItens.childNodes[0];
  
  var w=0;
  w = getWidthUl(ul);
  var difX = TamDisponivelW - w;
    
  if(difX <=0)
    divItens.style.left = "0px";
  else if(x <= difX)
    divItens.style.left = x+"px";
  else    
    divItens.style.left = difX+"px";
    
  if(grupo.Itens.length == 0)
  {
    _ItensOver = false;
    divItens.style.display = "none";
  }
}

//Remove todos os itens de dentro da div
GrupoItem.prototype.mouseout = function()
{
  _GrupoOver = false;
  
  //Posicionar a div de itens
  var grupo = this.rel;  
  var div = this;
  
  setTimeout("CloseMenu();",1000);
}
////// GrupoItem - Fim ////////////

////// Menu - Inicio ////////////
function Menu(CodDiv)
{
  this.GrupoItens = [];
  this.Css = "";
  this.CssMenuGrupoItens = "";
  this.CssItens = "";
  this.ImgSepar = "";
  this.DivMenu = "";
  this.tbMenu = "";
  this.trMenu = "";
  this.IdDiv= "";
}

Menu.prototype.AddGrupoItem = function(grupo)
{
  if (!(grupo instanceof GrupoItem)) return false;

  grupo.parent = this;
  this.GrupoItens[this.GrupoItens.length] = grupo;
  
  return true;
}

//Monta a Tabela com os GrupoItens
//Obs.: Os itens só serão montado ao passar o mouse encima do GrupoItens
Menu.prototype.Render = function(CodDiv)
{
	
  var divMenu = getById(this.DivMenu);
  var tabela = addElement("table",this.tbMenu);
  var tr = tabela.insertRow(0);
  tr.id = this.trMenu;  
  divMenu.className = this.Css;
  tabela.cellPadding = 0;
  tabela.cellSpacing = 0;

  divMenu.appendChild(tabela);
  var iSepar = null;
  var primeiro = true;
  var ultimo = false;
  var td = null;
  for(var i=0;this.GrupoItens.length>i;i++)
  {
    this.GrupoItens[i].Render();
  }
  //alert(CodDiv);
  var divItens = addElement("div",CodDiv); //Div p/ aplicar os estilos do CSS
  divMenu.appendChild(divItens);  
}
////// Menu - Fim ////////////
