﻿// Grexis.Speedy.Menu
// (c) 2007 GreXis.NET

function dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;
if(level > 2) return;

//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j<level+1;j++) level_padding += "    ";

if(typeof(arr) == 'object') { //Array/Hashes/Objects
 for(var item in arr) {
  var value = arr[item];
 
  if(typeof(value) == 'object') { //If it is an array,
   dumped_text += level_padding + "'" + item + "' ...\n";
   dumped_text += dump(value,level+1);
  } else {
   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
  }
 }
} else { //Stings/Chars/Numbers etc.
 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
} 

function trace( msg ){
  if( typeof( jsTrace ) != 'undefined' ){
    jsTrace.send( msg );
  }
}

function createMethodReference(object, methodName) {
    return function () {
        object[methodName].apply(object, arguments);
    };
};

function SpeedyMenuItem(menuelement, parentitem, menuobject)
{
  this.MenuElement = menuelement;
  this.ParentItem = parentitem;
  this.Level = parentitem ? (parentitem.Level + 1) : 1;
  this.MenuObject = menuobject;
  this.SubItems = new Array();
  this.SubMenusFrame = null;
  this.CloseWait = false;

  this.MenuMouseOver = function()
  {
    this.CloseWait = false;
    if(this.SubMenusFrame)
    {
      this.SubMenusFrame.style.display = 'block';
    }
  }
  
  this.MenuMouseOut = function()
  {
    if(!this.CloseWait)
    {
      this.CloseWait = true;
      window.setTimeout(createMethodReference(this, "Close"), 100);
    }
  }
  
  this.Close = function()
  {
    if(this.CloseWait)
      this.SubMenusFrame.style.display = 'none';
  }
  
  // Pokud ma tato polozka nejaka podmenu zpravujeme je
  var uls = menuelement.getElementsByTagName('ul');
  if(uls.length > 0)
  {
    this.SubMenusFrame = uls[0];
    this.SubMenusFrame.style.position = 'absolute';
    var lis = menuelement.getElementsByTagName('li');
    
	  for(var i=0;i<lis.length;i++)
	  {
	    if(lis[i].parentNode != uls[0]) continue; 
	    var MenuItem = new SpeedyMenuItem(lis[i], this, this.MenuObject);
	    this.SubItems.push(MenuItem);
    }
    
    menuelement.onmouseout = createMethodReference(this, "MenuMouseOut");
    this.SubMenusFrame.onmouseout = createMethodReference(this, "MenuMouseOut");
    
    var left = this.MenuElement.offsetLeft;
    var top = this.MenuElement.offsetTop; 
    var Elm = this.MenuElement;
    // while ((Elm = Elm.offsetParent) && (Elm.tagName.toLowerCase() != "body")) {
    if(this.Level == 1)
    {
      while (Elm = Elm.offsetParent)
      {
        left += Elm.offsetLeft;
        top += Elm.offsetTop;
      }
    } else {
      top -= 10;
      if(this.MenuElement.offsetParent) left += this.MenuElement.offsetParent.offsetWidth;
    }    
    // if(this.Level > 1) left += this.ParentItem.offsetWidth;
    
    
    top += this.MenuElement.offsetHeight;

    this.SubMenusFrame.style.position = 'absolute';
    this.SubMenusFrame.style.left = left + 'px';
    this.SubMenusFrame.style.top = top + 'px';

    this.SubMenusFrame.style.display = 'none';
    
    trace("----------");
    trace("Text:" + this.MenuElement.innerText);
    trace("Level:" + this.Level);
    trace("Top:" + top);
    trace("Left:" + left);
    trace("----------");
  }

  menuelement.onmouseover = createMethodReference(this, "MenuMouseOver");
}

function SpeedyMenu(mainelement)
{
  this.MainElement = mainelement;
  this.MenuItems = new Array();
  
  var uls = mainelement.getElementsByTagName('ul');
  
  if(uls.length < 1) return;
  
  var lis = uls[0].getElementsByTagName('li');
	for(var i =0;i<lis.length;i++)
	{
	  trace(lis[i].parentNode);
	  if(lis[i].parentNode != uls[0]) continue;
	  var MenuItem = new SpeedyMenuItem(lis[i], null, this);
	  this.MenuItems.push(MenuItem);
  }
}

function SpeedyMenuOnLoad()
{
  if(!document.getElementsByTagName('body')[0])
  {
    window.setTimeout(SpeedyMenuOnLoad, 100);
    return;
  }
  
  var divs = document.getElementsByTagName('div');
  
  for(var i=0; i<divs.length; i++)
  {
    if(divs[i].className.indexOf('speedymenu') != -1)
    {
      // Mame menu - musime sestavit strukturu
      var Menu = new SpeedyMenu(divs[i]);
      SpeedyMenus.push(Menu);
    }
  }
}

var SpeedyMenus = new Array();
SpeedyMenuOnLoad();
