/*

Ethereal by HTML5 UP
html5up.net | @ajlkn
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)

*/

(function($) {

// Settings.
        var settings = {
                // Keyboard shortcuts.
                        keyboardShortcuts: {
                                // If true, enables scrolling via keyboard shortcuts.
                                        enabled: true,
                                // Sets the distance to scroll when using the left/right arrow keys.
                                        distance: 50
                        },
                // Scroll wheel.
                        scrollWheel: {
                                // If true, enables scrolling via the scroll wheel.
                                        enabled: true,
                                // Sets the scroll wheel factor. (Ideally) a value between 0 and 1 (lower = slower scroll, higher = faster scroll).
                                        factor: 1
                        },
                // Scroll zones.
                        scrollZones: {
                                // If true, enables scrolling via scroll zones on the left/right edges of the scren.
                                        enabled: true,
                                // Sets the speed at which the page scrolls when a scroll zone is active (higher = faster scroll, lower = slower scroll).
                                        speed: 15
                        },
                // Dragging.
                        dragging: {
                                // If true, enables scrolling by dragging the main wrapper with the mouse.
                                        enabled: true,
                                // Sets the momentum factor. Must be a value between 0 and 1 (lower = less momentum, higher = more momentum, 0 = disable momentum scrolling).
                                        momentum: 0.875,
                                // Sets the drag threshold (in pixels).
                                        threshold: 10
                        },
                // If set to a valid selector , prevents key/mouse events from bubbling from these elements.
                        excludeSelector: 'input:focus, select:focus, textarea:focus, audio, video, iframe',
                // Link scroll speed.
                        linkScrollSpeed: 1000
        };
// Skel.
        skel.breakpoints({
                xlarge: '(max-width: 1680px)',
                large: '(max-width: 1280px)',
                medium: '(max-width: 980px)',
                small: '(max-width: 736px)',
                xsmall: '(max-width: 480px)',
                xxsmall: '(max-width: 360px)',
                short: '(min-aspect-ratio: 16/7)',
                xshort: '(min-aspect-ratio: 16/6)'
        });
// Ready event.
        $(function() {
                // Vars.
                        var     $window = $(window),
                                $document = $(document),
                                $body = $('body'),
                                $html = $('html'),
                                $bodyHtml = $('body,html'),
                                $wrapper = $('#wrapper');
                // Disable animations/transitions until the page has loaded.
                        $body.addClass('is-loading');
                        $window.on('load', function() {
                                window.setTimeout(function() {
                                        $body.removeClass('is-loading');
                                }, 100);
                        });
                // Tweaks/fixes.
                        // Mobile: Disable scroll stuff.
                                if (skel.vars.mobile) {
                                        settings.keyboardShortcuts.enabled = false;
                                        settings.scrollWheel.enabled = false;
                                        settings.scrollZones.enabled = false;
                                        settings.dragging.enabled = false;
                                }
                        // IE: Various fixes.
                                if (skel.vars.browser == 'ie') {
                                        // Enable IE mode.
                                                $body.addClass('is-ie');
                                        // Page widths.
                                                $window
                                                        .on('load resize', function() {
                                                                // Calculate wrapper width.
                                                                        var w = 0;
                                                                        $wrapper.children().each(function() {
                                                                                w += $(this).width();
                                                                        });
                                                                // Apply to page.
                                                                        $html.css('width', w + 'px');
                                                        });
                                }
                        // Polyfill: Object fit.
                                if (!skel.canUse('object-fit')) {
                                        $('.image[data-position]').each(function() {
                                                var $this = $(this),
                                                        $img = $this.children('img');
                                                // Apply img as background.
                                                        $this
                                                                .css('background-image', 'url("' + $img.attr('src') + '")')
                                                                .css('background-position', $this.data('position'))
                                                                .css('background-size', 'cover')
                                                                .css('background-repeat', 'no-repeat');
                                                // Hide img.
                                                        $img
                                                                .css('opacity', '0');
                                        });
                                }
                // Keyboard shortcuts.
                        if (settings.keyboardShortcuts.enabled)
                                (function() {
                                        $wrapper
                                                // Prevent keystrokes inside excluded elements from bubbling.
                                                        .on('keypress keyup keydown', settings.excludeSelector, function(event) {
                                                                // Stop propagation.
                                                                        event.stopPropagation();
                                                        });
                                        $window
                                                // Keypress event.
                                                        .on('keydown', function(event) {
                                                                var scrolled = false;
                                                                switch (event.keyCode) {
                                                                        // Left arrow.
                                                                                case 37:
                                                                                        $document.scrollLeft($document.scrollLeft() - settings.keyboardShortcuts.distance);
                                                                                        scrolled = true;
                                                                                        break;
                                                                        // Right arrow.
                                                                                case 39:
                                                                                        $document.scrollLeft($document.scrollLeft() + settings.keyboardShortcuts.distance);
                                                                                        scrolled = true;
                                                                                        break;
                                                                        // Page Up.
                                                                                case 33:
                                                                                        $document.scrollLeft($document.scrollLeft() - $window.width() + 100);
                                                                                        scrolled = true;
                                                                                        break;
                                                                        // Page Down, Space.
                                                                                case 34:
                                                                                case 32:
                                                                                        $document.scrollLeft($document.scrollLeft() + $window.width() - 100);
                                                                                        scrolled = true;
                                                                                        break;
                                                                        // Home.
                                                                                case 36:
                                                                                        $document.scrollLeft(0);
                                                                                        scrolled = true;
                                                                                        break;
                                                                        // End.
                                                                                case 35:
                                                                                        $document.scrollLeft($document.width());
                                                                                        scrolled = true;
                                                                                        break;
                                                                }
                                                                // Scrolled?
                                                                        if (scrolled) {
                                                                                // Prevent default.
                                                                                        event.preventDefault();
                                                                                        event.stopPropagation();
                                                                                // Stop link scroll.
                                                                                        $bodyHtml.stop();
                                                                        }
                                                        });
                                })();
                // Scroll wheel.
                        if (settings.scrollWheel.enabled)
                                (function() {
                                        // Based on code by @miorel + @pieterv of Facebook (thanks guys :)
                                        // github.com/facebook/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js
                                                var normalizeWheel = function(event) {
                                                        var     pixelStep = 10,
                                                                lineHeight = 40,
                                                                pageHeight = 800,
                                                                sX = 0,
                                                                sY = 0,
                                                                pX = 0,
                                                                pY = 0;
                                                        // Legacy.
                                                                if ('detail' in event)
                                                                        sY = event.detail;
                                                                else if ('wheelDelta' in event)
                                                                        sY = event.wheelDelta / -120;
                                                                else if ('wheelDeltaY' in event)
                                                                        sY = event.wheelDeltaY / -120;
                                                                if ('wheelDeltaX' in event)
                                                                        sX = event.wheelDeltaX / -120;
                                                        // Side scrolling on FF with DOMMouseScroll.
                                                                if ('axis' in event
                                                                &&      event.axis === event.HORIZONTAL_AXIS) {
                                                                        sX = sY;
                                                                        sY = 0;
                                                                }
                                                        // Calculate.
                                                                pX = sX * pixelStep;
                                                                pY = sY * pixelStep;
                                                                if ('deltaY' in event)
                                                                        pY = event.deltaY;
                                                                if ('deltaX' in event)
                                                                        pX = event.deltaX;
                                                                if ((pX || pY)
                                                                &&      event.deltaMode) {
                                                                        if (event.deltaMode == 1) {
                                                                                pX *= lineHeight;
                                                                                pY *= lineHeight;
                                                                        }
                                                                        else {
                                                                                pX *= pageHeight;
                                                                                pY *= pageHeight;
                                                                        }
                                                                }
                                                        // Fallback if spin cannot be determined.
                                                                if (pX && !sX)
                                                                        sX = (pX < 1) ? -1 : 1;
                                                                if (pY && !sY)
                                                                        sY = (pY < 1) ? -1 : 1;
                                                        // Return.
                                                                return {
                                                                        spinX: sX,
                                                                        spinY: sY,
                                                                        pixelX: pX,
                                                                        pixelY: pY
                                                                };
                                                };
                                        // Wheel event.
                                                $body.on('wheel', function(event) {
                                                        // Disable on <=small.
                                                                if (skel.breakpoint('small').active)
                                                                        return;
                                                        // Prevent default.
                                                                event.preventDefault();
                                                                event.stopPropagation();
                                                        // Stop link scroll.
                                                                $bodyHtml.stop();
                                                        // Calculate delta, direction.
                                                                var     n = normalizeWheel(event.originalEvent),
                                                                        x = (n.pixelX != 0 ? n.pixelX : n.pixelY),
                                                                        delta = Math.min(Math.abs(x), 150) * settings.scrollWheel.factor,
                                                                        direction = x > 0 ? 1 : -1;
                                                        // Scroll page.
                                                                $document.scrollLeft($document.scrollLeft() + (delta * direction));
                                                });
                                })();
                // Scroll zones.
                        if (settings.scrollZones.enabled)
                                (function() {
                                        var     $left = $('<div class="scrollZone left"></div>'),
                                                $right = $('<div class="scrollZone right"></div>'),
                                                $zones = $left.add($right),
                                                paused = false,
                                                intervalId = null,
                                                direction,
                                                activate = function(d) {
                                                        // Disable on <=small.
                                                                if (skel.breakpoint('small').active)
                                                                        return;
                                                        // Paused? Bail.
                                                                if (paused)
                                                                        return;
                                                        // Stop link scroll.
                                                                $bodyHtml.stop();
                                                        // Set direction.
                                                                direction = d;
                                                        // Initialize interval.
                                                                clearInterval(intervalId);
                                                                intervalId = setInterval(function() {
                                                                        $document.scrollLeft($document.scrollLeft() + (settings.scrollZones.speed * direction));
                                                                }, 25);
                                                },
                                                deactivate = function() {
                                                        // Unpause.
                                                                paused = false;
                                                        // Clear interval.
                                                                clearInterval(intervalId);
                                                };
                                        $zones
                                                .appendTo($wrapper)
                                                .on('mouseleave mousedown', function(event) {
                                                        deactivate();
                                                });
                                        $left
                                                .css('left', '0')
                                                .on('mouseenter', function(event) {
                                                        activate(-1);
                                                });
                                        $right
                                                .css('right', '0')
                                                .on('mouseenter', function(event) {
                                                        activate(1);
                                                });
                                        $wrapper
                                                .on('---pauseScrollZone', function(event) {
                                                        // Pause.
                                                                paused = true;
                                                        // Unpause after delay.
                                                                setTimeout(function() {
                                                                        paused = false;
                                                                }, 500);
                                                });
                                })();
                // Dragging.
                        if (settings.dragging.enabled)
                                (function() {
                                        var dragging = false,
                                                dragged = false,
                                                distance = 0,
                                                startScroll,
                                                momentumIntervalId, velocityIntervalId,
                                                startX, currentX, previousX,
                                                velocity, direction;
                                        $wrapper
                                                // Prevent image drag and drop.
                                                        .on('mouseup mousemove mousedown', '.image, img', function(event) {
                                                                event.preventDefault();
                                                        })
                                                // Prevent mouse events inside excluded elements from bubbling.
                                                        .on('mouseup mousemove mousedown', settings.excludeSelector, function(event) {
                                                                // Prevent event from bubbling.
                                                                        event.stopPropagation();
                                                                // End drag.
                                                                        dragging = false;
                                                                        $wrapper.removeClass('is-dragging');
                                                                        clearInterval(velocityIntervalId);
                                                                        clearInterval(momentumIntervalId);
                                                                // Pause scroll zone.
                                                                        $wrapper.triggerHandler('---pauseScrollZone');
                                                        })
                                                // Mousedown event.
                                                        .on('mousedown', function(event) {
                                                                // Disable on <=small.
                                                                        if (skel.breakpoint('small').active)
                                                                                return;
                                                                // Clear momentum interval.
                                                                        clearInterval(momentumIntervalId);
                                                                // Stop link scroll.
                                                                        $bodyHtml.stop();
                                                                // Start drag.
                                                                        dragging = true;
                                                                        $wrapper.addClass('is-dragging');
                                                                // Initialize and reset vars.
                                                                        startScroll = $document.scrollLeft();
                                                                        startX = event.clientX;
                                                                        previousX = startX;
                                                                        currentX = startX;
                                                                        distance = 0;
                                                                        direction = 0;
                                                                // Initialize velocity interval.
                                                                        clearInterval(velocityIntervalId);
                                                                        velocityIntervalId = setInterval(function() {
                                                                                // Calculate velocity, direction.
                                                                                        velocity = Math.abs(currentX - previousX);
                                                                                        direction = (currentX > previousX ? -1 : 1);
                                                                                // Update previous X.
                                                                                        previousX = currentX;
                                                                        }, 50);
                                                        })
                                                // Mousemove event.
                                                        .on('mousemove', function(event) {
                                                                // Not dragging? Bail.
                                                                        if (!dragging)
                                                                                return;
                                                                // Velocity.
                                                                        currentX = event.clientX;
                                                                // Scroll page.
                                                                        $document.scrollLeft(startScroll + (startX - currentX));
                                                                // Update distance.
                                                                        distance = Math.abs(startScroll - $document.scrollLeft());
                                                                // Distance exceeds threshold? Disable pointer events on all descendents.
                                                                        if (!dragged
                                                                        &&      distance > settings.dragging.threshold) {
                                                                                $wrapper.addClass('is-dragged');
                                                                                dragged = true;
                                                                        }
                                                        })
                                                // Mouseup/mouseleave event.
                                                        .on('mouseup mouseleave', function(event) {
                                                                var m;
                                                                // Not dragging? Bail.
                                                                        if (!dragging)
                                                                                return;
                                                                // Dragged? Re-enable pointer events on all descendents.
                                                                        if (dragged) {
                                                                                setTimeout(function() {
                                                                                        $wrapper.removeClass('is-dragged');
                                                                                }, 100);
                                                                                dragged = false;
                                                                        }
                                                                // Distance exceeds threshold? Prevent default.
                                                                        if (distance > settings.dragging.threshold)
                                                                                event.preventDefault();
                                                                // End drag.
                                                                        dragging = false;
                                                                        $wrapper.removeClass('is-dragging');
                                                                        clearInterval(velocityIntervalId);
                                                                        clearInterval(momentumIntervalId);
                                                                // Pause scroll zone.
                                                                        $wrapper.triggerHandler('---pauseScrollZone');
                                                                // Initialize momentum interval.
                                                                        if (settings.dragging.momentum > 0) {
                                                                                m = velocity;
                                                                                momentumIntervalId = setInterval(function() {
                                                                                        // Scroll page.
                                                                                                $document.scrollLeft($document.scrollLeft() + (m * direction));
                                                                                        // Decrease momentum.
                                                                                                m = m * settings.dragging.momentum;
                                                                                        // Negligible momentum? Clear interval and end.
                                                                                                if (Math.abs(m) < 1)
                                                                                                        clearInterval(momentumIntervalId);
                                                                                }, 15);
                                                                        }
                                                        });
                                })();
                // Link scroll.
                        $wrapper
                                .on('mousedown mouseup', 'a[href^="#"]', function(event) {
                                        // Stop propagation.
                                                event.stopPropagation();
                                })
                                .on('click', 'a[href^="#"]', function(event) {
                                        var     $this = $(this),
                                                href = $this.attr('href'),
                                                $target, x, y;
                                        // Get target.
                                                if (href == '#'
                                                ||      ($target = $(href)).length == 0)
                                                        return;
                                        // Prevent default.
                                                event.preventDefault();
                                                event.stopPropagation();
                                        // Calculate x, y.
                                                if (skel.breakpoint('small').active) {
                                                        x = $target.offset().top - (Math.max(0, $window.height() - $target.outerHeight()) / 2);
                                                        y = { scrollTop: x };
                                                }
                                                else {
                                                        x = $target.offset().left - (Math.max(0, $window.width() - $target.outerWidth()) / 2);
                                                        y = { scrollLeft: x };
                                                }
                                        // Scroll.
                                                $bodyHtml
                                                        .stop()
                                                        .animate(
                                                                y,
                                                                settings.linkScrollSpeed,
                                                                'swing'
                                                        );
                                });
                // Gallery.
                        $('.gallery')
                                .on('click', 'a', function(event) {
                                        var $a = $(this),
                                                $gallery = $a.parents('.gallery'),
                                                $modal = $gallery.children('.modal'),
                                                $modalImg = $modal.find('img'),
                                                href = $a.attr('href');
                                        // Not an image? Bail.
                                                if (!href.match(/\.(jpg|gif|png|mp4)$/))
                                                        return;
                                        // Prevent default.
                                                event.preventDefault();
                                                event.stopPropagation();
                                        // Locked? Bail.
                                                if ($modal[0]._locked)
                                                        return;
                                        // Lock.
                                                $modal[0]._locked = true;
                                        // Set src.
                                                $modalImg.attr('src', href);
                                        // Set visible.
                                                $modal.addClass('visible');
                                        // Focus.
                                                $modal.focus();
                                        // Delay.
                                                setTimeout(function() {
                                                        // Unlock.
                                                                $modal[0]._locked = false;
                                                }, 600);
                                })
                                .on('click', '.modal', function(event) {
                                        var $modal = $(this),
                                                $modalImg = $modal.find('img');
                                        // Locked? Bail.
                                                if ($modal[0]._locked)
                                                        return;
                                        // Already hidden? Bail.
                                                if (!$modal.hasClass('visible'))
                                                        return;
                                        // Stop propagation.
                                                event.stopPropagation();
                                        // Lock.
                                                $modal[0]._locked = true;
                                        // Clear visible, loaded.
                                                $modal
                                                        .removeClass('loaded')
                                        // Delay.
                                                setTimeout(function() {
                                                        $modal
                                                                .removeClass('visible')
                                                        // Pause scroll zone.
                                                                $wrapper.triggerHandler('---pauseScrollZone');
                                                        setTimeout(function() {
                                                                // Clear src.
                                                                        $modalImg.attr('src', '');
                                                                // Unlock.
                                                                        $modal[0]._locked = false;
                                                                // Focus.
                                                                        $body.focus();
                                                        }, 475);
                                                }, 125);
                                })
                                .on('keypress', '.modal', function(event) {
                                        var $modal = $(this);
                                        // Escape? Hide modal.
                                                if (event.keyCode == 27)
                                                        $modal.trigger('click');
                                })
                                .on('mouseup mousedown mousemove', '.modal', function(event) {
                                        // Stop propagation.
                                                event.stopPropagation();
                                })
                                .prepend('<div class="modal" tabIndex="-1"><div class="inner"><img src="" /></div></div>')
                                        .find('img')
                                                .on('load', function(event) {
                                                        var $modalImg = $(this),
                                                                $modal = $modalImg.parents('.modal');
                                                        setTimeout(function() {
                                                                // No longer visible? Bail.
                                                                        if (!$modal.hasClass('visible'))
                                                                                return;
                                                                // Set loaded.
                                                                        $modal.addClass('loaded');
                                                        }, 275);
                                                });
        });

})(jQuery);