var m_menu_initialised;
m_menu_initialised = false;


function CloseParents(menu)
{
  var menu;
  
  menu.open = false;
  
  //alert('close ' + menu_id);
  
  if(menu.parent)
    CloseParents(menu.parent);
}


function GetOffsetLeft(element)
{
  var offsetLeft;
  
  offsetLeft = 0;
  
  for(; element.offsetParent; element = element.offsetParent) 
  {
    offsetLeft += element.offsetLeft;
  }
  
  return offsetLeft;
}


function GetOffsetTop(element)
{
  var offsetTop;
  
  offsetTop = 0;
  
  for(; element.offsetParent; element = element.offsetParent) 
  {
    //if(element.id.search(/_link/) == -1)
    
    //alert(element.id + ' ' + parseInt(element.offsetTop))
    offsetTop += element.offsetTop;
  }
  
  //alert('total is ' + parseInt(offsetTop));
  
  return offsetTop;
}


function HideMenu(menu_id)
{ 
  var menu; 
   
  menu = document.getElementById(menu_id);
  
  if(!menu.open && menu.parent)
  {
    if(menu.parent_cell.parent_menu.cell_colour)
    {
      menu.parent_cell.style.color = menu.parent_cell.parent_menu.cell_text_colour;
    }

    if(menu.parent_cell.parent_menu.cell_text_colour)
    {
      menu.parent_cell.style.backgroundColor = menu.parent_cell.parent_menu.cell_colour;
    }  
    
    menu.style.visibility = 'hidden';
    
    if(!menu.parent.open)
    {
      HideMenu(menu.parent.id)
    }
  }
}


function InitialiseMenus(menu)
{
  var i, j, m;
  
  if(menu.id != 'root')
  {
    menu.style.visibility = "hidden";
    menu.open = false;
  }
  else
  {
    menu.parent = null;
    menu.open = true;
  }
    
  //alert('a ' + menu.id);

  for(i = 0; i < menu.menuitems.length; i++)
  {
    if(menu.cell_colour)
    {
      menu.menuitems[i].style.color = menu.cell_text_colour;
    }

    if(menu.cell_text_colour)
    {
      menu.menuitems[i].style.backgroundColor = menu.cell_colour;
    }
  
    if(menu.menuitems[i].menu != null)
    {
      menu.menuitems[i].menu.parent = menu;
      InitialiseMenus(menu.menuitems[i].menu);
    }

  }
  
  m_menu_initialised = true;
}


function MouseOverCell(cell_id)
{
  if(m_menu_initialised)
    MouseOverCellDirect(cell_id);
}


function MouseOverCellDirect(cell_id)
{
  var cell;

  cell = document.getElementById(cell_id);
  
  if(cell.parent_menu.mo_cell_colour)
  {
    cell.style.color = cell.parent_menu.mo_cell_text_colour;
  }

  if(cell.parent_menu.mo_cell_text_colour)
  {
    cell.style.backgroundColor = cell.parent_menu.mo_cell_colour;
  }
  
  
  if(cell.menu)
  {
    PositionMenu(cell, cell.parent_menu);
    cell.menu.style.visibility = 'visible';
    cell.menu.open = true;
  }
    
  cell.parent_menu.open = true;
  
  OpenParents(cell.parent_menu);
}


function MouseOutCell(cell_id)
{
  if(m_menu_initialised)
    MouseOutCellDirect(cell_id);
}


function MouseOutCellDirect(cell_id)
{
  var cell;
  
  cell = document.getElementById(cell_id);
  
  //alert('it is ' + cell.parent_menu.cell_colour);

  if(cell.menu)
  {
    cell.menu.open = false; //flag child menu for closing
    CloseParents(cell.parent_menu); //flag parents for closing
    window.setTimeout('HideMenu(\'' + cell.menu.id + '\');', 100); //close the child menu which will close all parents
  }
  else
  {
    CloseParents(cell.parent_menu); //flag parents for closing
    window.setTimeout('HideMenu(\'' + cell.parent_menu.id + '\');', 100); //close this menu which will close all parents
    
    if(cell.parent_menu.cell_colour)
    {
      cell.style.color = cell.parent_menu.cell_text_colour;
    }

    if(cell.parent_menu.cell_text_colour)
    {
      cell.style.backgroundColor = cell.parent_menu.cell_colour;
    }

  }
  
  
}


function OpenParents(menu)
{
  var menu;
  
  menu.open = true;
  
  //if(menu.id != 'root' && menu.id != 'yart_tree_5')
  //  alert(menu.id)

  //alert(menu.id)
  
  if(menu.parent)
    OpenParents(menu.parent)
}


function PageHeight()
{
  return window.innerHeight != null ? window.innerHeight: document.body != null? document.body.clientHeight:null;
}


function PositionMenu(cell_mouse_over, menu)
{
  var cell_height, left, no_cells, top, x;
  
  if(cell_mouse_over.menu.position == 'under')
  {
    if(cell_mouse_over.parent_menu.menu_orientation == 'horizontal')
    {
      top = GetOffsetTop(cell_mouse_over) + cell_mouse_over.offsetHeight
      left = GetOffsetLeft(cell_mouse_over);
    }
    else
    {
      top = GetOffsetTop(cell_mouse_over);
      left = GetOffsetLeft(cell_mouse_over) + cell_mouse_over.offsetWidth;
    }
  }
  else if(cell_mouse_over.menu.position == 'right')
  {
    top = GetOffsetTop(cell_mouse_over);
    left = GetOffsetLeft(cell_mouse_over) + cell_mouse_over.offsetWidth - 1;

    if((top + cell_mouse_over.menu.offsetHeight) > PageHeight())
    {
      cell_height = cell_mouse_over.menu.menuitems[0].offsetHeight;
      no_cells = Math.ceil((top + cell_mouse_over.menu.offsetHeight - PageHeight()) / cell_height);
      top = top - (cell_height * no_cells);
    }
  }
  
  
  cell_mouse_over.menu.style.top = top.toString() + "px";
  cell_mouse_over.menu.style.left = left.toString() + "px";
}
