﻿// ------------------------------------------------------- //
// CLASSE: PopupMenuHandler                                //
// Rappresenta il gestore dei menu registrati nella pagina //
// ------------------------------------------------------- //
function PopupMenuHandler()
{
	this.isActive = false;
	this.menus = new Array();
	this.activeMenu = null;
}

// Registra un menu nel gestore
PopupMenuHandler.prototype.register = function(controlID)
{
    var popupMenu = getObject(controlID + '_Menu');
    
    if (popupMenu && getObjects(popupMenu, 'a').length > 0)
    {
	    this.menus[controlID] = new PopupMenu(controlID);
	}
};

// Attiva un menu registrato nel gestore
PopupMenuHandler.prototype.activate = function(isActive)
{
	this.isActive = isActive;
};

// Nasconde un menu registrato nel gestore
PopupMenuHandler.prototype.hide = function()
{
	if (this.activeMenu != null)
	{
		this.menus[this.activeMenu].hide();
	}
};

// ------------------------- //
// CLASSE: PopupMenu         //
// Rappresenta un menu popup //
// ------------------------- //
function PopupMenu(controlID)
{
	this.controlID = controlID;
	this.menuID = controlID + "_Menu";

	this.initControl();
};

// Inizializza l'oggetto che controlla l'attivazione del menu
PopupMenu.prototype.initControl = function()
{
	this.controlObject = getObject(this.controlID);
	this.controlObject.unselectable = true;
	this.controlObject.onclick = PopupEvents.prototype.controlObject_onclick;
	this.controlObject.onmouseover = PopupEvents.prototype.controlObject_onmouseover;
	this.menuObject = getObject(this.menuID);
};

// Mostra il menu
PopupMenu.prototype.show = function(element) {
    if (!PopupMenus.isActive) {
        return false;
    }

    if (!this.menuObject) {
        return false;
    }

    if (PopupMenus.activeMenu != null) {
        PopupMenus.menus[PopupMenus.activeMenu].hide();
    }

    PopupMenus.activeMenu = this.controlID;

    this.menuObject.style.display = 'block';

    var position = getOffset(element);
    var left = position['left'];
    var top = position['top'] + element.offsetHeight;

    if ((left + this.menuObject.offsetWidth) >= document.body.clientWidth && (left + element.offsetWidth - this.menuObject.offsetWidth) > 0) {
        left = left + element.offsetWidth - this.menuObject.offsetWidth;
    }

    this.menuObject.style.left = left + 'px';
    this.menuObject.style.top = top + 'px';
};

// Nasconde il menu
PopupMenu.prototype.hide = function(e)
{
	this.menuObject.style.display = 'none';

	PopupMenus.activeMenu = null;
};

// Passa sopra a un menu mentre un altro menu è già attivo
PopupMenu.prototype.hover = function(element)
{
	if (PopupMenus.activeMenu != null)
	{
		if (PopupMenus.menus[PopupMenus.activeMenu].controlID != this.id)
		{
			this.show(element);
		}
	}
};

// ------------------------------------- //
// CLASSE: PopupEvents                   //
// Rappresenta gli eventi del menu popup //
// ------------------------------------- //
function PopupEvents() { };

// Gestisce il click sull'oggetto di controllo di un menu
PopupEvents.prototype.controlObject_onclick = function(e)
{
	getEvent(e);

	if (PopupMenus.activeMenu == null || PopupMenus.menus[PopupMenus.activeMenu].controlID != this.id)
	{
		PopupMenus.menus[this.id].show(this);
	}
	else
	{
		PopupMenus.menus[this.id].hide();
	}
};

// Gestisce il passaggio sull'oggetto di controllo di un menu
PopupEvents.prototype.controlObject_onmouseover = function(e)
{
	getEvent(e);
	
	PopupMenus.menus[this.id].hover(this);
};
