var setupFullScreenModal = function() {
  // Setup full screen image modal.
  // Executed from HTMLModule in display.js.
    $('a.modal-content').each(function() {
        var smallImageObject = $(this).children();
        var largeImageSRC = $(this).attr('href');

    // if contents of zoomable link is image and large image link exists: setup modal
        if (smallImageObject.is('img') && largeImageSRC) {
            var data = {
                smallHTML: $(this).html(),
                largeALT: smallImageObject.attr('alt'),
                largeSRC: largeImageSRC
            };
            var html = _.template($('#image-modal-tpl').text())(data);
            $(this).replaceWith(html);
        }
    });
    $('.wrapper-modal-image .image-wrapper img').each(function() {
        var draggie = new Draggabilly(this, {containment: true});
        draggie.disable();
        $(this).closest('.image-modal').data('draggie', draggie);
    });

  // Opening and closing image modal on clicks
    $('.wrapper-modal-image .image-link').click(function() {
        $(this).siblings('.image-modal').addClass('image-is-fit-to-screen');
        $('body').css('overflow', 'hidden');
    });

  // variable to detect when modal is being "hovered".
  // Done this way as jquery doesn't support the :hover psudo-selector as expected.
    var imageModalImageHover = false;
    $('.wrapper-modal-image .image-content img, .wrapper-modal-image .image-content .image-controls').hover(function() {
        imageModalImageHover = true;
    }, function() {
        imageModalImageHover = false;
    });

  // prevent image control button links from scrolling
    $('.modal-ui-icon').click(function(event) {
        event.preventDefault();
    });

  // Define function to close modal
    function closeModal(imageModal) {
        imageModal.removeClass('image-is-fit-to-screen').removeClass('image-is-zoomed');
        $('.wrapper-modal-image .image-content .image-controls .modal-ui-icon.action-zoom-in').removeClass('is-disabled').attr('aria-disabled', false);
        $('.wrapper-modal-image .image-content .image-controls .modal-ui-icon.action-zoom-out').addClass('is-disabled').attr('aria-disabled', true);
        var currentDraggie = imageModal.data('draggie');
        currentDraggie.disable();
        $('body').css('overflow', 'auto');
    }

  // Click outside of modal to close it.
    $('.wrapper-modal-image .image-modal').click(function() {
        if (!imageModalImageHover) {
            closeModal($(this));
        }
    });

  // Click close icon to close modal.
    $('.wrapper-modal-image .image-content .action-remove').click(function() {
        closeModal($(this).closest('.image-modal'));
    });

  // zooming image in modal and allow it to be dragged
  // Make sure it always starts zero position for below calcs to work
    $('.wrapper-modal-image .image-content .image-controls .modal-ui-icon').click(function() {
        if (!$(this).hasClass('is-disabled')) {
            var mask = $(this).closest('.image-content');

            var imageModal = $(this).closest('.image-modal');
            var img = imageModal.find('img');
            var currentDraggie = imageModal.data('draggie');

            if ($(this).hasClass('action-zoom-in')) {
                imageModal.removeClass('image-is-fit-to-screen').addClass('image-is-zoomed');

                var imgWidth = img.width();
                var imgHeight = img.height();

                var imgContainerOffsetLeft = imgWidth - mask.width();
                var imgContainerOffsetTop = imgHeight - mask.height();
                var imgContainerWidth = imgWidth + imgContainerOffsetLeft;
                var imgContainerHeight = imgHeight + imgContainerOffsetTop;

        // Set the width and height of the image's container so that the dimensions are equal to the image dimensions + view area dimensions to limit dragging
        // Set image container top and left to center image at load.
                img.parent().css({
                    left: -imgContainerOffsetLeft,
                    top: -imgContainerOffsetTop,
                    width: imgContainerWidth,
                    height: imgContainerHeight
                });
                img.css({top: imgContainerOffsetTop / 2, left: imgContainerOffsetLeft / 2});

                currentDraggie.enable();
            } else if ($(this).hasClass('action-zoom-out')) {
                imageModal.removeClass('image-is-zoomed').addClass('image-is-fit-to-screen');

                currentDraggie.disable();
            }

            $('.wrapper-modal-image .image-content .image-controls .modal-ui-icon').toggleClass('is-disabled').attr('aria-disabled', $(this).hasClass('is-disabled'));
        }
    });
};
