/*
 * Define setCapture()/releaseCapture() methods for browsers that don't implement them
 */

if (window.HTMLElement)
{
    var __element = HTMLElement.prototype;
    var __capture = ['click','mousedown','mouseup','mousemove','mouseover','mouseout'];
    var __capturedElement;

    __element.setCapture = function ()
    {
        if (__capturedElement)
        {
            __capturedElement.releaseCapture();
        }

        var self = this;
        var flag = false;

        this.__capture = function(e)
        {
            if (flag)
            {
                return;
            }
            flag = true;

            var event = document.createEvent('MouseEvents');

            event.initMouseEvent(e.type, e.cancelBubble, e.cancelable, e.view, e.detail,
                                e.screenX, e.screenY, e.clientX, e.clientY,
                                e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);
            self.dispatchEvent(event);

            flag = false;
        };

        var i = __capture.length;

        while (--i>=0)
        {
            window.addEventListener(__capture[i], this.__capture, true);
        }

        __capturedElement = this;
    };

    __element.releaseCapture = function()
    {
        var i = __capture.length;
        while (--i >= 0)
        {
            window.removeEventListener(__capture[i], this.__capture, true);
        }
        this.__capture = null;
        __capturedElement = null;
    };

    // Add releaseCapture() for document element.
    // The method should release capture from current captured element.
    // E.g., used by Google Maps API.
    document.releaseCapture = function ()
    {
        if (__capturedElement)
        {
            __capturedElement.releaseCapture();
        }
    };
};