// ZSite Widget Library
// Popup Menu
// (c) AISystems, Zagorodnikov Anton 2009

// locks clicks on menu items while menu is hiding
// for user not to click occasionally on several items
var z_widget_popupmenu_lock = false;

function z_widget_popupmenu_show_at(id, x, y)
{
	dojo.byId(id).style.visibility='visible';
	dojo.byId(id).style.top = y+"px";
	dojo.byId(id).style.left = x+"px";

	//theese may change?
	dojo._setOpacity(dojo.byId(id), 0);
	dojo.byId(id).style.display='block';

	dojo.fadeIn({node:id, duration: 400}).play();
}

function z_widget_popupmenu_show_node(id, node)
{
	dojo.byId(id).style.visibility='visible';

	dojo.byId(id).style.top = (dojo._abs(node, true).y+dojo._getMarginBox(node).h)+"px";
	dojo.byId(id).style.left = (dojo._abs(node, true).x+dojo._getMarginBox(node).w)+"px";

	//theese may change?
	dojo._setOpacity(dojo.byId(id), 0);
	dojo.byId(id).style.display='block';

	dojo.fadeIn({node:id, duration: 400}).play();
}

function z_widget_popupmenu_hide(id)
{
	z_widget_popupmenu_lock = true;

	dojo.byId(id).style.visibility = 'visible';

	dojo._setOpacity(dojo.byId(id), 100);

	dojo.fadeOut({node:id, duration: 400}).play();

	setTimeout("z_widget_popupmenu_lock = false; dojo.byId('"+id+"').style.display='none'; dojo.byId('"+id+"').style.top = '0px'; dojo.byId('"+id+"').style.left = '0px';", 400);
}

//class for client-side programmatical creation
dojo.declare("zsite_widget_popupmenu", null, {
	menuitems: null,
	id: null,
	dirty: true,	//if we are to recreate html element
	html: null,

	constructor: function(id)
	{
		if(id == "")
			id = ZSite_GetID();
		this.id = id;

		this.menuItems = new zsite_arraylist();
		this.dirty = true;
	},

	createHTML: function()
	{
		if(dirty)
		{
			var item = document.createElement("div");

			item.style.position="absolute";
			item.style.left   = this.x+"px";
			item.style.top    = this.y+"px";

			this.createList();

			this.html = item;
		}
	},

	appendMenuItem: function(/* zsite_menuitem */ item)
	{
		this.menuItems.add(item);
		item.parentMenu = this;
		this.dirty = true;
	},

	getHTML: function()
	{
		return this.html;
	},

	// Create the figure list and add to all entries an onClick event.
	createList: function()
	{
		this.dirty = false;
		this.html.innerHTML="";
		var oThis = this;
		for(var i=0;i<this.menuItems.getSize();i++)
		{
			var item = this.menuItems.get(i);

			var li = document.createElement("a");
			li.innerHTML = item.getLabel();
			li.style.display="block";
			li.style.cursor="pointer";
			this.html.appendChild(li);

			li.menuItem = item;
			if(li.addEventListener) 
			{
				li.addEventListener("click",  function(event)
				{
					var oEvent = arguments[0] || window.event;
					oEvent.cancelBubble = true; 
					oEvent.returnValue = false;
					var diffX = oEvent.clientX;// - oThis.html.offsetLeft;
					var diffY = oEvent.clientY;// - oThis.html.offsetTop;
					var scrollLeft= document.body.parentNode.scrollLeft;
					var scrollTop = document.body.parentNode.scrollTop;
					this.menuItem.execute(diffX+scrollLeft, diffY+scrollTop);
				}, false);
				li.addEventListener("mouseup",  function(event){event.cancelBubble = true; event.returnValue = false;}, false);
				li.addEventListener("mousedown",  function(event){event.cancelBubble = true; event.returnValue = false;}, false);
				li.addEventListener("mouseover", function(event){this.style.backgroundColor="silver";},false);
				li.addEventListener("mouseout", function(event){this.style.backgroundColor="transparent";},false);
      			} 
      			else if(li.attachEvent) 
			{
				li.attachEvent("onclick",  function(event)
         			{
					var oEvent = arguments[0] || window.event;
					oEvent.cancelBubble = true; 
					oEvent.returnValue = false;
					var diffX = oEvent.clientX;// - oThis.html.offsetLeft;
					var diffY = oEvent.clientY;// - oThis.html.offsetTop;
					var scrollLeft= document.body.parentNode.scrollLeft;
					var scrollTop = document.body.parentNode.scrollTop;
					event.srcElement.menuItem.execute(diffX+scrollLeft, diffY+scrollTop);
         			});
				li.attachEvent("onmousedown",  function(event){event.cancelBubble = true; event.returnValue = false;});
				li.attachEvent("onmouseup",  function(event){event.cancelBubble = true; event.returnValue = false;});
				li.attachEvent("onmouseover", function(event){event.srcElement.style.backgroundColor="silver";});
				li.attachEvent("onmouseout", function(event){event.srcElement.style.backgroundColor="transparent";});
			}
		}
	}
});

