(function() {

    if (!window.OpenSeadragon) {
        console.error('[openseadragon-svg-overlay] requires OpenSeadragon');
        return;
    }

    var svgNS = 'http://www.w3.org/2000/svg';

    var update = function(viewer) {
        var info = viewer._svgOverlayInfo;

        if (info.containerWidth !== viewer.container.clientWidth) {
            info.containerWidth = viewer.container.clientWidth;
            info.svg.setAttribute('width', info.containerWidth);
        }

        if (info.containerHeight !== viewer.container.clientHeight) {
            info.containerHeight = viewer.container.clientHeight;
            info.svg.setAttribute('height', info.containerHeight);
        }

        var p = viewer.viewport.pixelFromPoint(new OpenSeadragon.Point(0, 0), true);
        var zoom = viewer.viewport.getZoom(true);
        var scale = viewer.container.clientWidth * zoom;
        info.node.setAttribute('transform',
            'translate(' + p.x + ',' + p.y + ') scale(' + scale + ')');
    };

    OpenSeadragon.Viewer.prototype.svgOverlay = function(command) {
        var self = this;

        if (command === undefined) {
            if (this._svgOverlayInfo) {
                console.error('[openseadragon-svg-overlay] already initialized on this viewer');
                return;
            }

            var info = this._svgOverlayInfo = {
                containerWidth: 0,
                containerHeight: 0
            };

            info.svg = document.createElementNS(svgNS, 'svg');
            info.svg.setAttribute('pointer-events', 'none');
            info.svg.style.position = 'absolute';
            info.svg.style.left = 0;
            info.svg.style.top = 0;
            info.svg.style.width = '100%';
            info.svg.style.height = '100%';
            this.container.insertBefore(info.svg, this.canvas.nextSibling);

            info.node = document.createElementNS(svgNS, 'g');
            info.svg.appendChild(info.node);

            this.addHandler('animation', function() {
                update(self);
            });

            this.addHandler('open', function() {
                update(self);
            });

            update(this);
            return info.node;
        } else if (command === 'resize') {
            update(this);
        } else {
            console.error('[openseadragon-svg-overlay] unknown command: ' + command);
        }
    };

})();