(function (w,d){
    var OPP = w.OPP;
    var Modal = OPP.Modal;
    // Return unless required deps are available.
    if (!Modal || !d.addEventListener) return;
    (function () {
        var zoomModal = d.getElementById('zoom-modal');
        var zoomCorner = d.getElementById('zoom-corner');
        var zoomDelay = 100;
        var zoomTS = Date.now();

        var handleSwipeLeft, handleSwipeRight, handleArrowLeft, handleArrowRight, mc;

        function killEvent() { return false }

        function showZoomModal(evt) {
            var ts = evt.timestamp || Date.now();
            var delta = ts - zoomTS;
            if (!Modal.isOpen() && delta > zoomDelay) {
                zoomTS = ts;
                OPP.addClass(d.body, 'zoom-modal-open');
                Modal.show(zoomModal);
            }
        }

        function hideZoomModal(evt) {
            var ts = evt.timestamp || Date.now();
            var delta = ts - zoomTS;
            if (Modal.isOpen() && delta > zoomDelay) {
                zoomTS = ts;
                OPP.removeClass(d.body, 'zoom-modal-open');
                Modal.hide();
            }
        }

        function makeLinkHandler(id) {
            return function () {
                var a;
                if (Modal.isOpen()) {
                    Modal.hide();
                } else {
                    a = d.getElementById(id);
                    if (a && a.href) {
                        w.location.href = a.href
                    }
                }
            }
        }

        handleArrowLeft  = handleSwipeRight = makeLinkHandler('artwork-prev');
        handleArrowRight = handleSwipeLeft  = makeLinkHandler('artwork-next');

        // Handle left/right arrow keys
        d.addEventListener('keydown', function (evt) {
            // Ignore repeated events and event with active modifier keys.
            if (evt.repeat || evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;

            // Prefer the standard `key` property if supported. Otherwise, use
            // deprecated `which` or `keyCode` methods to match numeric code.
            switch (evt.key || evt.which || evt.keyCode) {
            case 'Escape': // key
            case 27: // which or keyCode
                hideZoomModal(evt);
                break;
            case 'ArrowLeft': // key
            case 37: // which or keyCode
                handleArrowLeft();
                break;
            case 'ArrowRight': // key
            case 39: // which or keyCode
                handleArrowRight();
                break;
            default:
                return;
            }

            // prevent scrolling, etc.
            evt.preventDefault();
        }, true);

        // Use Hammer.js to setup swipe left/right handlers
        delete Hammer.defaults.cssProps.userSelect; // Do not disable text selection.
        delete Hammer.defaults.cssProps.touchCallout; // Do not disable touch callout.
        mc = new Hammer.Manager(d.documentElement, { recognizers: [
            // RecognizerClass, [options], [recognizeWith, ...], [requireFailure, ...]
            [Hammer.Swipe, { direction: Hammer.DIRECTION_HORIZONTAL }],
            [Hammer.Tap]
        ]});

        mc.on("swipeleft", handleSwipeLeft);
        mc.on("swiperight", handleSwipeRight);

        // Return unless this page supports the zoom modal.
        if (!zoomModal || !zoomCorner) return;

        // Attach zoom modal show/hide event handlers.
        zoomCorner.addEventListener('click', showZoomModal);
        zoomModal.addEventListener('click', hideZoomModal);

        // Listen for tap on (or in) artwork media element.
        mc.on("tap", function (evt) {
            var target = evt.target;
            var mediaElem;
            if (evt.pointerType !== 'touch') return;
            if (target.id === 'media' || (
                (mediaElem = d.getElementById('media')) &&
                    mediaElem.contains(target)
            )) {
                // Disable click on media element if tap is detected.
                target.onclick = killEvent;
                showZoomModal(evt);
            }
        });
    })();
}(window,document));
