
	// MouseEvent ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	MouseEvent = Class.create();
	MouseEvent.prototype =
	{
	    iType : -1,
	    oTarget : null,
	    iX : -1,
	    iY : -1,
	    iButton : -1,
	
	    initialize : function(p_oEvent, p_iType)
	    {
	        this.iType = p_iType;
	
	        // Target
	        {
	            this.oTarget = Event.element(p_oEvent);
	        }
	
	        // Position
	        {
	            this.iX = Event.pointerX(p_oEvent);
	            this.iY = Event.pointerY(p_oEvent);
	        }
	
	        // Button
	        {
	            this.iButton = p_oEvent.which || p_oEvent.button;
	            // :TODO: Set the correct button value by using MouseEvent constants.
	        }
	    },
	
	    getType : function()
	    {
	        return this.iType;
	    },
	
	    getTarget : function()
	    {
	        return this.oTarget;
	    },
	
	    getX : function()
	    {
	        return this.iX;
	    },
	
	    getY : function()
	    {
	        return this.iY;
	    },
	
	    getButton : function()
	    {
	        return this.iButton;
	    },
	
	    toString : function()
	    {
	        return "MouseEvent[type=\"" + this.iType + "\", x=\"" + this.iX + "\", y=\"" + this.iY + "\", button=\"" + this.iButton + "]";
	    }
	};
	
	MouseEvent.Type = new Object();
	MouseEvent.Type.PRESSED = 1;
	MouseEvent.Type.RELEASED = 2;
	MouseEvent.Type.CLICKED = 3;
	// Following values allow to test combinations like MouseEvent.LEFT | MouseEvent.RIGHT
	MouseEvent.LEFT = 1;
	MouseEvent.MIDDLE = 4;
	MouseEvent.RIGHT = 2;
	
	
	
	// Mouse ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	Mouse = Class.create();
	Mouse.prototype =
	{
	    aListeners : null,
	
	    initialize : function()
	    {
	        this.aListeners = [];
	    },
	
	    addListener : function(p_oListener)
	    {
	        this.aListeners.push(p_oListener);
	    },
	
	    dispatch : function(p_oEvent)
	    {
	        var iIndex;
	        switch(p_oEvent.getType())
	        {
	            case MouseEvent.Type.PRESSED:
	            {
	                for(iIndex = 0; iIndex < this.aListeners.length; ++iIndex)
	                {
	                    if(this.aListeners[iIndex]["onMousePressed"])
	                    {
	                        this.aListeners[iIndex].onMousePressed(p_oEvent);
	                    }
	                }
	                break;
	            }
	
	            case MouseEvent.Type.RELEASED:
	            {
	                for(iIndex = 0; iIndex < this.aListeners.length; ++iIndex)
	                {
	                    if(this.aListeners[iIndex]["onMouseReleased"])
	                    {
	                        this.aListeners[iIndex].onMouseReleased(p_oEvent);
	                    }
	                }
	                break;
	            }
	
	            case MouseEvent.Type.CLICKED:
	            {
	                for(iIndex = 0; iIndex < this.aListeners.length; ++iIndex)
	                {
	                    if(this.aListeners[iIndex]["onMouseClicked"])
	                    {
	                        this.aListeners[iIndex].onMouseClicked(p_oEvent);
	                    }
	                }
	                break;
	            }
	        }
	    }
	};
	
	Mouse.oInstance = null;
	Mouse.getInstance = function()
	{
	    if(Mouse.oInstance == null)
	    {
	        Mouse.oInstance = new Mouse();
	    }
	    return Mouse.oInstance;
	};
	
	Mouse.addListener = function(p_oListener)
	{
	    Mouse.getInstance().addListener(p_oListener);
	};
	
	// Default listeners
	{
	
	    Event.observe(document, "mousedown", function(p_oEvent)
	    {
	        Mouse.getInstance().dispatch(new MouseEvent(p_oEvent, MouseEvent.Type.PRESSED));
	    });
	
	    Event.observe(document, "mouseup", function(p_oEvent)
	    {
	        Mouse.getInstance().dispatch(new MouseEvent(p_oEvent, MouseEvent.Type.RELEASED));
	    });
	
	    Event.observe(document, "click", function(p_oEvent)
	    {
	        Mouse.getInstance().dispatch(new MouseEvent(p_oEvent, MouseEvent.Type.CLICKED));
	    });
	}

