﻿/*****************************************************************************\
 Scolling Submenu
 
 @version: 1.0
 @author: Danny Hage 
\*****************************************************************************/

function GetPosition(obj)
{
  var x = obj.offsetLeft;
  var y = obj.offsetTop;
  while((obj = obj.offsetParent) != null)
  {
  	if(obj.tagName!='HTML')
  	{
  	  x += obj.offsetLeft;
  	  y += obj.offsetTop;
    }
  }
  return {x: x, y: y};
}

/******************
 *    Settings    *
 ******************/
var SubMenuVars = {
  SubMenuBind : [],  // setting for the menu, should not be edited
  TimerId : -1,      // setting for the menu, should not be edited
  MenuTimeOut : 300, //number of milliseconds before it closes on mouse out
  topMargin: 21, //margin between submenu and the main menu
  scrollSpeed: 15, //higher = faster
  openTimeSpeed: 25, //higher = slower
  closeTimeSpeed: 25 //higher = slower
};

var mousePos = {x: 0, y: 0};

//SubMenuObj: The submenu
//Item:       The hovered item which shows the popup
//position: (obj{x,y}) location where to put the submenu
function InitPopup(SubMenuObj, Item, position)
{
  SubMenuVars.SubMenuBind[SubMenuVars.SubMenuBind.length] = {SubMenu: SubMenuObj, ItemTrigger: Item};
  Item.hover(//On mouse over:
    function()
    {
      ShowPopup(position);
    },//On mouse out:
    function()
    {
      HidePopup(position)
    }
  );
  SubMenuObj.mouseout(
    function()
    {
	    if (SubMenuVars.TimerId != -1)
		    clearTimeout(SubMenuVars.TimerId);
	    SubMenuVars.TimerId = setTimeout('HideMe(' + position + ')', SubMenuVars.MenuTimeOut);
    }
  );
}

function ShowPopup(SubMenuIndex){
		if (SubMenuVars.TimerId != -1)
		{
			clearTimeout (SubMenuVars.TimerId);
			HideAll(SubMenuIndex);
	  }
		var ElementPos = GetPosition(SubMenuVars.SubMenuBind[SubMenuIndex].ItemTrigger[0]);

		SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu[0].style.left = ElementPos.x + 'px';
		SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu[0].style.top = (ElementPos.y + SubMenuVars.SubMenuBind[SubMenuIndex].ItemTrigger.parent()[0].clientHeight + SubMenuVars.topMargin) + 'px';
		SlideDown(SubMenuIndex);
}

function HideAll(SubMenuIndex)
{
  for (var i = 0; i < SubMenuVars.SubMenuBind.length; i++)
  {
    if (SubMenuIndex == i) continue;
	  SlideUp(i);
    //SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.hide("slide", {direction: "up"}, SubMenuVars.closeTimeSpeed);
  }
}

function HidePopup(SubMenuIndex)
{
	if (SubMenuVars.TimerId != -1)
		clearTimeout(SubMenuVars.TimerId);
	SubMenuVars.TimerId = setTimeout('HideMe(' + SubMenuIndex+ ')', SubMenuVars.MenuTimeOut);
}

function HideMe(SubMenuIndex)
{
  var SubMenuObj = SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu;
	if ((mousePos.x < SubMenuObj[0].offsetLeft || mousePos.x > SubMenuObj[0].offsetLeft + SubMenuObj[0].clientWidth)
	  || (mousePos.y < SubMenuObj[0].offsetTop || mousePos.y > SubMenuObj[0].offsetTop + SubMenuObj[0].clientHeight)){
	  SubMenuVars.TimerId = -1;
	  SlideUp(SubMenuIndex);
    //SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.hide("slide", {direction: "up"}, SubMenuVars.closeTimeSpeed);
  }
}

function InitMenu()
{
  var  PopupCount = 0;
  jQuery("div.SubMenu").each(
    function()
    {
      InitPopup(jQuery(this), jQuery("#" + this.getAttribute("for")), PopupCount++);
    }
  );
  jQuery().mousemove(
		  function(e){
			  mousePos.x = e.pageX;
			  mousePos.y = e.pageY;
		  }
	  );
	  jQuery(document).bind("click",
	    function(){
	      for (var i; i < SubMenuVars.SubMenuBind.length; i++)
	      {
	        HideMe(i);
	      }
	    }
	  );
}
function SlideDown(SubMenuIndex)
{
  var objHeight = SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.height();
  SubMenuVars.SubMenuBind[SubMenuIndex].height = objHeight;
  SubMenuVars.SubMenuBind[SubMenuIndex].top = (-1) * objHeight;
  SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.children("ul")[0].style.top = ((-1) * objHeight) + "px";
  SubMenuVars.SubMenuBind[SubMenuIndex].slideDirection = 1; //1 as in opening, -1 as in closing
  if (SubMenuVars.SubMenuBind[SubMenuIndex].intervalId != -1)
  {
    clearInterval(SubMenuVars.SubMenuBind[SubMenuIndex].intervalId);
    SubMenuVars.SubMenuBind[SubMenuIndex].intervalId = -1;    
  }
  SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu[0].style.display = 'block';
  SubMenuVars.SubMenuBind[SubMenuIndex].intervalId = setInterval("Slide(" + SubMenuIndex + ")", SubMenuVars.openTimeSpeed);
}

function SlideUp(SubMenuIndex)
{
  if (SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu[0].style.display == 'none')
  {
    SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.children("ul")[0].style.top = '0';
    return;
  }
  var objHeight = SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.height();
  SubMenuVars.SubMenuBind[SubMenuIndex].height = objHeight;
  SubMenuVars.SubMenuBind[SubMenuIndex].slideDirection = "up";
  SubMenuVars.SubMenuBind[SubMenuIndex].slideDirection = -1; //1 as in opening, -1 as in closing
  if (SubMenuVars.SubMenuBind[SubMenuIndex].intervalId == -1)
  {
    SubMenuVars.SubMenuBind[SubMenuIndex].intervalId = setInterval("Slide(" + SubMenuIndex + ")", SubMenuVars.closeTimeSpeed);
  }
}

function Slide(SubMenuIndex)
{
  SubMenuVars.SubMenuBind[SubMenuIndex].top = SubMenuVars.SubMenuBind[SubMenuIndex].top + (SubMenuVars.SubMenuBind[SubMenuIndex].slideDirection * SubMenuVars.scrollSpeed);
  SubMenuVars.SubMenuBind[SubMenuIndex].top = Math.max(SubMenuVars.SubMenuBind[SubMenuIndex].top, (-1) * SubMenuVars.SubMenuBind[SubMenuIndex].height);
  SubMenuVars.SubMenuBind[SubMenuIndex].top = Math.min(SubMenuVars.SubMenuBind[SubMenuIndex].top, 0);
  SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu.children("ul")[0].style.top = SubMenuVars.SubMenuBind[SubMenuIndex].top + "px";
  if (SubMenuVars.SubMenuBind[SubMenuIndex].top == (-1) * SubMenuVars.SubMenuBind[SubMenuIndex].height)
  {
    clearInterval(SubMenuVars.SubMenuBind[SubMenuIndex].intervalId);
    SubMenuVars.SubMenuBind[SubMenuIndex].intervalId = -1;
    SubMenuVars.SubMenuBind[SubMenuIndex].SubMenu[0].style.display = 'none';
  }
  if (SubMenuVars.SubMenuBind[SubMenuIndex].top == 0)
  {
    clearInterval(SubMenuVars.SubMenuBind[SubMenuIndex].intervalId);
    SubMenuVars.SubMenuBind[SubMenuIndex].intervalId = -1;
  }
}

jQuery(InitMenu());