package org.greenstone.atlas.client;

import java.util.ArrayList;

import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;

public class Menu
{
	protected Element _parent = null;
	protected ArrayList<Menu> _childMenus = new ArrayList<Menu>();
	protected ArrayList<MenuItem> _menuItems = new ArrayList<MenuItem>();
	protected HTML _menuDiv = new HTML();
	protected MouseOverHandler _onMouseOver = null;
	protected MouseOutHandler _onMouseOut = null;
	
	public Menu(Element parent, MouseOverHandler onMouseOver, MouseOutHandler onMouseOut)
	{
		_parent = parent;
    	parent.appendChild(_menuDiv.getElement());
    	_menuDiv.getElement().getStyle().setProperty("background", "#FFFFFF");
    	_menuDiv.getElement().getStyle().setProperty("padding", "2px");
    	_menuDiv.getElement().getStyle().setProperty("position", "absolute");
    	
    	_onMouseOver = onMouseOver;
    	_onMouseOut = onMouseOut;
	}
	
	public void addMenuItems(ArrayList<MenuItem> menuItems)
	{
		_menuItems = menuItems;
		int maxWidth = -1;
    	for(int i = 0; i < menuItems.size(); i++)
    	{
    		if(!menuItems.get(i).condition())
    		{
    			continue;
    		}
    		Element item = menuItems.get(i).getMenuElement();
    		item.getStyle().setProperty("background", "#FFFFFF");
			item.getStyle().setProperty("color", "#000000");
			item.getStyle().setProperty("border", "1px solid");
			item.getStyle().setProperty("padding", "2px");
    		
    		Label newLabel = Label.wrap(item);	
    		newLabel.addMouseOverHandler(_onMouseOver);
    		newLabel.addMouseOutHandler(_onMouseOut);
    		newLabel.addClickHandler(menuItems.get(i).getClickHandler());
    		
    		_menuDiv.getElement().appendChild(item);
    		
    		if(item.getOffsetWidth() > maxWidth)
    		{
    			maxWidth = item.getOffsetWidth();
    		}
    	}
    	
    	for(int i = 0; i < menuItems.size(); i++)
    	{
    		menuItems.get(i).getMenuElement().getStyle().setProperty("width", maxWidth + "px");
    	}
	}
	
	public void moveMenu(final int x, final int y)
	{
		_menuDiv.setVisible(false);
    	_menuDiv.getElement().getStyle().setProperty("left", x + "px");
    	_menuDiv.getElement().getStyle().setProperty("top", y + "px");
    	
    	Timer pause = new Timer()
    	{
			public void run() 
			{				
				if (_menuDiv.getOffsetHeight() > GS3MapLibrary.getElementById("GSContent").getOffsetHeight())
				{
					_menuDiv.getElement().getStyle().setProperty("top", GS3MapLibrary.getElementById("GSContent").getAbsoluteTop() + "px");
					_menuDiv.getElement().getStyle().setProperty("overflow", "auto");
					_menuDiv.getElement().getStyle().setProperty("height", GS3MapLibrary.getElementById("GSContent").getOffsetHeight() + "px");
				}
				else if(y + _menuDiv.getOffsetHeight() > GS3MapLibrary.getElementById("GSFooter").getAbsoluteTop())
		    	{
		    		_menuDiv.getElement().getStyle().setProperty("top", (y - ( y + _menuDiv.getOffsetHeight() - GS3MapLibrary.getElementById("GSFooter").getAbsoluteTop()) + "px"));
		    	}
				_menuDiv.setVisible(true);
			}
    	};
    	pause.schedule(100);
	}
	
	public void addChildMenu(Menu menu)
	{
		_childMenus.add(menu);
	}
	
	public void hideMenu()
	{
		_menuDiv.setVisible(false);
		
		for(Menu m : _childMenus)
		{
			if(m != null)
			{
				m.hideMenu();
			}
		}
	}
	
	public void refreshMenu()
	{
		_parent.removeChild(_menuDiv.getElement());
		_menuDiv = new HTML();
    	_parent.appendChild(_menuDiv.getElement());
    	_menuDiv.getElement().getStyle().setProperty("background", "#FFFFFF");
    	_menuDiv.getElement().getStyle().setProperty("padding", "2px");
    	_menuDiv.getElement().getStyle().setProperty("position", "absolute");
    	addMenuItems(_menuItems);
	}
	
	public void showMenu()
	{
		_menuDiv.setVisible(true);
	}
	
	public HTML getMenuDiv()
	{
		return _menuDiv;
	}
}
