//+-----------------------------------------------------+
//|     Chasqui(r)                                      |
//|     http://www.chasqui.cu/                          |
//|     chasqui@chasqui.cu                              |
//+-----------------------------------------------------+
//|     Chasqui(r) Contents Management Division         |
//|     http://www.chasqui.cu/gestcont/                 |
//|     contents@chasqui.cu                             |
//+-----------------------------------------------------+
//|     (c) Copyright 1999-2003 Chasqui(r)              |
//+-----------------------------------------------------+

//
// $Id$
//

//
//  Implementación del los menús de Antiterroristas.cu
//
//  Probado en MSIE6 y Opera 7.21
//

//
//  Sobre Netscape, la documentación del Netscape es muy dispersa
//  y lo que he interpretado de ella no funciona correctamente.
//


navGecko = 1;
navIExplorer = 2;
navOpera = 3;

/*	Pixel differences between others UA and IE	*/
navTopDiff = new Array(null, -4, 0, 0);
navLeftDiff = new Array(null, 120, 0, -4);


if (navigator.userAgent.indexOf('Gecko') > -1)
    qnBrowser = navGecko;
else if(navigator.userAgent.indexOf('Opera') > -1)
    qnBrowser = navOpera;
else
    qnBrowser = navIExplorer;       //  Did I forget something?

//  Tiempo (en milisegundos) que se mantiene visible un menú
//  cuando el mouse sale de los menúes.
var qn_menu_timeout = 250;

//  Variables que usan para almacenar los menues y hacerlos
//  accesibles cuando ocurren eventos externos a ellos
//  (click en el documento, etc)
var qn_registered_menus = new Array();
var qn_timeout_id = null;
var qn_last_expanded_menu = null;

function AttachEvent(targetObj, eventName, functionDecl)
{
	if (qnBrowser == navGecko)
		targetObj.addEventListener(eventName.substring(2, eventName.length), functionDecl, false);
	else
		targetObj.attachEvent(eventName, functionDecl);
}

/// Clase QN_Menu

function QN_Menu(anObj, regMenu)
{
    anObj.qn_menu = this;
    this.theObj = anObj;

    this.items = new Array();
    this.currItem = null;

    this.CreateItem = QN_Menu_CreateItem;
    this.AddItem = QN_Menu_AddItem;
    this.Colapse = QN_Menu_Colapse;
    this.Hide = QN_Menu_Hide;
    this.Show = QN_Menu_Show;


    //  Añadir este menú a la lista global de menues.
    if (regMenu == null || regMenu || regMenu+"" == "undefined")
        qn_registered_menus[qn_registered_menus.length] = this;

    AttachEvent(document.body, 'onmouseover', QN_Menu_BODYMouseOver);
    AttachEvent(document.body, 'onclick', QN_Menu_ColapseAll);
}

function QN_Menu_BODYMouseOver(event)
{
    if (qn_timeout_id != null)
        window.clearTimeout(qn_timeout_id);

    qn_timeout_id = window.setTimeout(QN_Menu_ColapseAll, qn_menu_timeout);
}

function QN_Menu_ColapseAll()
{
    qn_timeout_id = null;
    if (qn_last_expanded_menu != null)
        qn_last_expanded_menu.Hide();
    else
    {
        var i;
        for(i=0; i<qn_registered_menus.length; i++)
        {
            qn_registered_menus[i].Hide();
            qn_registered_menus[i].qn_menu_parent.SwitchToNormal();
        }
    }
}

function QN_Menu_CreateItem(vclObject, imgNormal, imgOver, imgExpanded)
{
    result = new QN_MenuItem(this, vclObject, imgNormal, imgOver, imgExpanded);
    this.AddItem(result);

    return result;
}

function QN_Menu_AddItem(aMenuItem)
{
    this.items[this.items.length] = aMenuItem;
}


function QN_Menu_Colapse()
{
    var i;
    for(i=0; i<this.items.length; i++)
        this.items[i].Hide();
}

function QN_Menu_Hide()
{
    this.Colapse();
    this.theObj.style.display = 'none';
}

function QN_Menu_Show()
{
    this.theObj.style.display = '';
}

/// }}}
/// {{{ Clase QN_MenuItem

function QN_MenuItem(owner, imgObj, imgNormal, imgOver, imgExpanded)
{
    imgObj.qn_menu_item = this;
    imgObj.qn_owner = owner;

    this.qn_owner = owner;
    this.vclImage = imgObj;
    this.imgNormal = imgNormal;
    this.imgOver = imgOver;
    this.imgExpanded = imgExpanded;

    this.isExpanded = false;
    this.expandOnClick = false;
    this.colapseSibling = true;
    this.attachedMenu = null;
    this.preloadedNormal = null;
    this.preloadedOver = null;
    this.preloadedExpanded = null;
    this.theURL = null;

    this.onclick = null;
    this.onmouseover = null;
    this.onmouseout = null;

    AttachEvent(imgObj, 'onclick', QN_MenuItem_Click);
    AttachEvent(imgObj, 'onmouseover', QN_MenuItem_MouseOver);
    AttachEvent(imgObj, 'onmouseout', QN_MenuItem_MouseOut);

    this.Hide = QN_MenuItem_Hide;
    this.CreateAttachedMenu = QN_MenuItem_CreateAttachedMenu;
    this.AttachMenu = QN_MenuItem_AttachMenu;
    this.SwitchToNormal = QN_MenuItem_SwitchToNormal;
    this.SwitchToOver = QN_MenuItem_SwitchToOver;
    this.SwitchToExpanded = QN_MenuItem_SwitchToExpanded;
}


function QN_MenuItem_SwitchToNormal()
{
    if (this.preloadedNormal == null)
    {
        this.preloadedNormal = new Image;
        this.preloadedNormal.src = this.imgNormal;

        this.vclImage.src = this.imgNormal;
    }
    else
        this.vclImage.src = this.preloadedNormal.src;
}

function QN_MenuItem_SwitchToOver()
{
    if (this.preloadedOver == null)
    {
        this.preloadedOver = new Image;
        this.preloadedOver.src = this.imgOver;

        this.vclImage.src = this.imgOver;
    }
    else
        this.vclImage.src = this.preloadedOver.src;
}

function QN_MenuItem_SwitchToExpanded()
{
    if (this.preloadedExpanded == null)
    {
        this.preloadedExpanded = new Image();
        this.preloadedExpanded.src = this.imgExpanded;

        this.vclImage.src = this.imgExpanded;
    }
    else
        this.vclImage.src = this.preloadedExpanded.src;
}

function QN_MenuItem_Click(event)
{
    event.cancelBubble = true;

	if (!event.srcElement && event.currentTarget)
		srcElement = event.currentTarget;
	else
		srcElement = event.srcElement;

    with(srcElement)
    {
        if (qn_menu_item.onclick != null)
            qn_menu_item.onclick();

        if (qn_menu_item.attachedMenu != null && qn_menu_item.expandOnClick && !qn_menu_item.isExpanded)
        {
            if (qn_menu_item.colapseSibling)
                qn_menu_item.qn_owner.Colapse();

            qn_menu_item.isExpanded = true;
            qn_menu_item.SwitchToExpanded();
            qn_menu_item.attachedMenu.Show();

            return;
        }

        if (qn_menu_item.attachedMenu != null && qn_menu_item.expandOnClick && qn_menu_item.isExpanded)
        {
            qn_menu_item.isExpanded = false;
            qn_menu_item.SwitchToNormal();
            qn_menu_item.attachedMenu.Hide();

            return;
        }

        if (qn_menu_item.theURL != null)
            location.href = qn_menu_item.theURL;
    }
}

function QN_MenuItem_MouseOver(event)
{
    //  Cancela la expansión del evento; todo el procesamiento
    //  del evento debe realizarse aquí:
    event.cancelBubble = true;

    //  Cancelar el timeout
    if (qn_timeout_id != null)
        window.clearTimeout(qn_timeout_id);

	if (!event.srcElement && event.currentTarget)
		srcElement = event.currentTarget;
	else
		srcElement = event.srcElement;

    with(srcElement)
    {
        if (qn_menu_item.attachedMenu == null)
            qn_menu_item.SwitchToOver();

        if (qn_menu_item.colapseSibling && !qn_menu_item.expandOnClick)
            qn_menu_item.qn_owner.Colapse();

        if (qn_menu_item.attachedMenu != null && !qn_menu_item.expandOnClick)
        {
            qn_menu_item.SwitchToExpanded();
            qn_menu_item.attachedMenu.Show();

            return;
        }

        if (qn_menu_item.expandOnClick && !qn_menu_item.isExpanded)
            qn_menu_item.SwitchToOver();
    }
}

function QN_MenuItem_MouseOut(event)
{
	if (!event.srcElement && event.currentTarget)
		srcElement = event.currentTarget;
	else
		srcElement = event.srcElement;

    with(srcElement)
    {
        if (qn_menu_item.attachedMenu == null || (qn_menu_item.expandOnClick && !qn_menu_item.isExpanded))
            qn_menu_item.SwitchToNormal();
    }
}

function QN_MenuItem_CreateAttachedMenu(vclObj, fix_nonIE, registerMenu, TopDiff, LeftDiff)
{
    result = new QN_Menu(vclObj, registerMenu);
    this.attachedMenu = result;
    this.attachedMenu.qn_menu_parent = this;

    if (fix_nonIE != null && fix_nonIE && qnBrowser != navIExplorer)
    {
    	if (TopDiff == null)
    		TopDiff = navTopDiff;
    	if (LeftDiff == null)
    		LeftDiff = navLeftDiff;

        matches = vclObj.style.top.match(/^(\d+)px$/);
        vclObj.style.top = matches[1] - 0 + TopDiff[qnBrowser];

        matches = vclObj.style.left.match(/^(\d+)px$/);
        vclObj.style.left = matches[1] - 0 + LeftDiff[qnBrowser];
    }


    return result;
}

function QN_MenuItem_AttachMenu(aMenu)
{
    this.attachedMenu = aMenu;
}

function QN_MenuItem_Hide()
{
    if (this.attachedMenu != null)
    {
        this.attachedMenu.Hide();
        this.vclImage.src = this.imgNormal;
        this.isExpanded = false;
    }
}

/// }}}