// :folding=explicit:collapseFolds=1:

// {{{ Constructor
function PhantomListener()
{
    var self = this;
    // {{{ Members
    this.PhantomDB = new Array();
    // }}} Members

    // {{{ Methods
    this.addPhantom = phlAddPhantom;
    this.getActivePhantom = getActivePhantom;
    // }}} Methods

    // {{{ Event handlers
    this.onClick = phlOnClick;
    this.onMouseOver = phlOnMouseOver;
    this.onMouseOut = phlOnMouseOut;
    this.onMouseDown = phlOnMouseDown;
    this.onMouseUp = phlOnMouseUp;
    this.onMouseMove = phlOnMouseMove;
    // }}} Event handlers

    // {{{ Init
    window.document.onmousemove = function (evt) {
        if (!evt) { evt = window.event; };
        self.onMouseMove(evt);
    };
    window.document.onmouseup = function (evt) {
        if (!evt) { evt = window.event; };
        self.onMouseUp(evt);
    };
    // }}} Init
}
// }}} Constructor

// {{{ Methods

    // {{{ phlAddPhantom()
    function phlAddPhantom(p)
    {
        var self = this;

        this.PhantomDB[this.PhantomDB.length] = p;

        p.Node.onclick = function() { PhListener.onClick(p); };
        p.Node.onmouseover = function() { PhListener.onMouseOver(p); };
        p.Node.onmouseout = function() { PhListener.onMouseOut(p); };
        p.Node.onmousedown = function(evt) {
            if (!evt) { evt = window.event; };

            var node = evt.target ? evt.target : evt.srcElement;

            var is_p = false;
            while (!is_p && node.parentNode)
            {
                if (node == p.Node) {
                    is_p = true;
                }
                node = node.parentNode;
            }

            if (is_p) self.onMouseDown(evt, p);
        };
    }
    // }}} phlAddPhantom()

    // {{{ getActivePhantom()
    function getActivePhantom()
    {
        for (var i = 0; i < this.PhantomDB.length; i++)
        {
            if (this.PhantomDB[i].getFocus() == true)
            {
                return this.PhantomDB[i];
            }
        }

        return null;
    }
    // }}} getActivePhantom()

// }}} Methods

// {{{ Event handlers

    // {{{ phlOnClick()
    function phlOnClick(p)
    {

    }
    // }}} phlOnClick()

    // {{{ phlOnMouseOver()
    function phlOnMouseOver()
    {

    }
    // }}} phlOnMouseOver()

    // {{{ phlOnMouseOut()
    function phlOnMouseOut()
    {

    }
    // }}} phlOnMouseOut()

    // {{{ phlOnMouseDown()
    function phlOnMouseDown(evt, p)
    {
        p.setFocus();
        p.Node.style.zIndex = this.PhantomDB.length;

        for (var i = 0; i < this.PhantomDB.length; i++)
        {
            if (this.PhantomDB[i] != p)
            {
                this.PhantomDB[i].setBlur();
                this.PhantomDB[i].Node.style.zIndex = 1;
            }
        }

        p.onMouseDown(evt);
    }
    // }}} phlOnMouseDown()

    // {{{ phlOnMouseUp()
    function phlOnMouseUp(evt)
    {
        p = this.getActivePhantom();
        if (p != null) p.onMouseUp(evt);
    }
    // }}} phlOnMouseUp()

    // {{{ phlOnMouseMove()
    function phlOnMouseMove(evt)
    {
        p = this.getActivePhantom();
        if (p != null) p.onMouseMove(evt);
    }
    // }}} phlOnMouseMove()

// }}} Event handlers

