
/*! Pusha v1.2.0 | MIT License | https://github.com/slavanga/pusha */

(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(factory);
  } else if (typeof exports === 'object') {
    module.exports = factory(require, exports, module);
  } else {
    root.Pusha = factory();
  }
}(this, function(require, exports, module) {
  'use strict';

  var Pusha = function(element, options) {
    var panel = typeof element === 'string' ? document.querySelector(element) : element;

    if (! panel) return false;

    var html = document.documentElement;
    var blockerElement = document.getElementsByClassName('pusha-blocker')[0];
    var closeElement = panel.querySelector('[data-close]');
    var panelContent = panel.querySelector('.pusha-panel__content');
    var transitionEvent = getTransitionEvent();
    var settings = {
      closeOnEsc: true,
      closeOnClick: true,
      disableOverscroll: true,
      activeClass: 'pusha-active',
      onOpen: function() {},
      onClose: function() {}
    };

    for (var key in options) {
      if (settings.hasOwnProperty(key)) {
        settings[key] = options[key];
      }
    }

    var api = {
      isOpen: false,
      open: function(e) {
        if (! api.isOpen) {
          api.isOpen = true;
          addClass(html, settings.activeClass);
          addClass(panel, 'pusha-panel--active');

          if (! transitionEvent) {
            addClass(html, 'pusha-animated');
          }

          if (e) {
            api.activeElement = e.currentTarget;
            api.activeElement.setAttribute('aria-expanded', true);
          }

          panel.setAttribute('aria-hidden', false);
          panelContent.focus();
          settings.onOpen(panel);
        }
      },
      close: function(e) {
        if (api.isOpen) {
          api.isOpen = false;
          removeClass(html, settings.activeClass);
          removeClass(panel, 'pusha-panel--active');

          if (! transitionEvent) {
            removeClass(html, 'pusha-animated');
          }

          if (api.activeElement) {
            api.activeElement.setAttribute('aria-expanded', false);
            api.activeElement.focus();
          }

          panel.setAttribute('aria-hidden', true);
          settings.onClose(panel);
        }
      },
      toggle: function(e) {
        if (api.isOpen) {
          api.close(e);
        } else {
          api.open(e);
        }
      },
      disableOverscroll: function(el) {
        el.addEventListener('touchstart', function() {
          var currentScroll = el.scrollTop + el.offsetHeight;

          if (el.scrollTop === 0) {
            el.scrollTop = 1;
          } else if (currentScroll === el.scrollHeight) {
            el.scrollTop = el.scrollTop - 1;
          }
        });

        document.body.addEventListener('touchmove', function(e) {
          if (api.isOpen) {
            if (el.scrollHeight <= el.clientHeight) {
              e.preventDefault();
            }
          }
        });
      }
    };

    if (transitionEvent) {
      panel.addEventListener(transitionEvent, function(e) {
        if (e.propertyName == 'opacity') {
          if (api.isOpen) {
            addClass(html, 'pusha-animated');
          } else {
            removeClass(html, 'pusha-animated');
          }
        }
      });
    }

    if (settings.disableOverscroll) {
      api.disableOverscroll(panelContent);
    }

    if (settings.closeOnEsc) {
      document.addEventListener('keydown', function(e) {
        if (e.keyCode === 27) {
          api.close(e);
        }
      });
    }

    if (typeof blockerElement === 'undefined') {
      blockerElement = document.createElement('div');
      blockerElement.className = 'pusha-blocker';
      document.body.appendChild(blockerElement);
    }

    if (settings.closeOnClick) {
      blockerElement.addEventListener('click', api.close);
      blockerElement.addEventListener('touchstart', api.close);
    }

    if (closeElement) {
      closeElement.addEventListener('click', api.close);
    }

    panelContent.setAttribute('tabindex', '-1');

    return api;
  };

  var regExp = function(name) {
    return new RegExp('(^| )' + name + '( |$)');
  };

  function addClass(element, className) {
    if (element.classList) {
      element.classList.add(className);
    } else {
      element.className += ' ' + className;
    }
  }

  function removeClass(element, className) {
    if (element.classList) {
      element.classList.remove(className);
    } else {
      element.className = element.className.replace(regExp(className), '');
    }
  }

  function getTransitionEvent() {
    var element = document.createElement('div');

    var transitions = {
      'transition': 'transitionend',
      'WebkitTransition': 'webkitTransitionEnd'
    };

    for (var t in transitions) {
      if (element.style[t] !== undefined) {
        return transitions[t];
      }
    }
  }

  return Pusha;
}));

var BreakpointHelper = {
    check: function () {
        var helperElement = document.getElementById('js-breakpointhelper');
        var breakpoint = 'none';

        if(helperElement) {
            breakpoint = window.getComputedStyle(helperElement, ':before').content;
        }

        return breakpoint;
    }
};

var Cookienotice = {
    element: document.getElementById('js-cookienotice'),
    spacer: document.getElementById('js-cookienotice-spacer'),
    btnAccept: document.getElementById('js-cookienotice-accept'),
    btnDeny: document.getElementById('js-cookienotice-deny'),
    init: function () {
        if (!localStorage.cookieAccept && !sessionStorage.cookieAccept && Cookienotice.element) {
            Cookienotice.element.classList.remove('hidden');
            Cookienotice.setSpacerHeight();
        }

        if (Cookienotice.btnAccept) {
            Cookienotice.btnAccept.addEventListener('click', Cookienotice.setAccept);
        }

        if (Cookienotice.btnDeny) {
            Cookienotice.btnDeny.addEventListener('click', Cookienotice.setDeny);
        }
    },
    setAccept: function () {
        localStorage.setItem('cookieAccept', 'true');
        Cookienotice.element.classList.add('hidden');
        Cookienotice.resetSpacerHeight();
    },
    setDeny: function () {
        sessionStorage.setItem('cookieDeny', 'true');
        Cookienotice.element.classList.add('hidden');
        Cookienotice.resetSpacerHeight();
    },
    setSpacerHeight: function () {
        Cookienotice.spacer.style.height = Cookienotice.element.offsetHeight + 'px';
    },
    resetSpacerHeight: function () {
        Cookienotice.spacer.style.height = '';
    }
};

Cookienotice.init();

var GlobalEventThrottle = {
    scrollEvent: null,
    resizeEvent: null,
    readyEvent: null,
    throttleScroll: false,
    throttleResize: false,
    init: function(event) {
        if (typeof scrollEvent === 'function') {
            window.addEventListener('scroll', GlobalEventThrottle.throttleScrollTrigger);
        }

        if (typeof loadEvent === 'function') {
            window.addEventListener('load', loadEvent);
        }

        if (typeof resizeEvent === 'function') {
            window.addEventListener('resize', GlobalEventThrottle.throttleResizeTrigger);
        }

        if (typeof readyEvent === 'function') {
            GlobalEventThrottle.readyEvent = event;
            GlobalEventThrottle.execute(readyEvent);
        }
    },
    throttleScrollTrigger: function(event) {
        GlobalEventThrottle.scrollEvent = event;
        GlobalEventThrottle.throttleScroll = GlobalEventThrottle.throttleScroll || setTimeout(GlobalEventThrottle.execute, 200, scrollEvent, 'throttleScroll');
    },
    throttleResizeTrigger: function(event) {
        GlobalEventThrottle.resizeEvent = event;
        GlobalEventThrottle.throttleResize = GlobalEventThrottle.throttleResize || setTimeout(GlobalEventThrottle.execute, 200, resizeEvent, 'throttleResize');
    },
    execute: function(func, throttle) {
        GlobalEventThrottle[throttle] = (typeof window.requestAnimationFrame === 'function' && window.requestAnimationFrame(func)) || func();
    }
};

GlobalEventThrottle.init();

var VimeoLoader = {
    jsLoaded: false,
    players: [],
    init: function() {
        if (document.getElementsByClassName('js-start-vimeo').length > 0) {
            if (!VimeoLoader.jsLoaded) {
                VimeoLoader.assignPlayerEvent();
                VimeoLoader.initVimeoJS();
            } else {
                VimeoLoader.assignPlayerEvent();
            }
        }
    },
    assignPlayerEvent: function() {
        Array.prototype.slice.call(document.getElementsByClassName('js-start-vimeo')).forEach(function(item) {
            item.onclick = VimeoLoader.initVideoPlayer;
        });
    },
    initVideoPlayer: function() {
        if (this.parentNode.className.indexOf('is-video-initialized') === -1) {
            var data = JSON.parse(this.getAttribute('data-params'));
            var player = new Vimeo.Player(this.previousElementSibling, data);

            VimeoLoader.players.push(player);
            this.parentNode.className += ' is-video-initialized';
        }
    },
    initVimeoJS: function() {
        var tag = document.createElement('script');
        tag.src = 'https://player.vimeo.com/api/player.js';
        var firstScriptTag = document.getElementsByTagName('script')[0];
        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
        VimeoLoader.jsLoaded = true;
    }
};

VimeoLoader.init();

function onYouTubeIframeAPIReady() {
    YouTubeLoader.assignPlayerEvent();
}

var YouTubeLoader = {
    jsLoaded: false,
    players: [],
    init: function() {
        if (document.getElementsByClassName('js-start-youtube').length > 0) {
            if (!YouTubeLoader.jsLoaded) {
                YouTubeLoader.initYouTubeJS();
            } else {
                YouTubeLoader.assignPlayerEvent();
            }
        }
    },
    assignPlayerEvent: function() {
        Array.prototype.slice.call(document.getElementsByClassName('js-start-youtube')).forEach(function(item) {
            item.onclick = YouTubeLoader.initVideoPlayer;
        });
    },
    initVideoPlayer: function() {
        if (this.parentNode.className.indexOf('is-video-initialized') === -1) {
            var data = JSON.parse(this.getAttribute('data-params'));
            data.events = {
                'onReady': YouTubeLoader.playVideo,
                'onStateChange': YouTubeLoader.stateChange
            };

            YouTubeLoader.players.push(new YT.Player(this.previousElementSibling, data));
            this.parentNode.className += ' is-video-initialized';
        }
    },
    stateChange: function(event) {
        if (event.data === YT.PlayerState.PLAYING) {
            YouTubeLoader.players.forEach(YouTubeLoader.pauseVideo, event);
        }
    },
    initYouTubeJS: function() {
        var tag = document.createElement('script');
        tag.src = 'https://www.youtube.com/iframe_api';
        var firstScriptTag = document.getElementsByTagName('script')[0];
        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
        YouTubeLoader.jsLoaded = true;
    },
    pauseVideo: function(player) {
        if (player !== this.target) {
            player.pauseVideo();
        }
    },
    pauseAllVideos: function() {
        YouTubeLoader.players.forEach(YouTubeLoader.pauseVideo);
    },
    playVideo: function(event) {
        event.target.playVideo();
    },
    resetVideo: function(player) {
        var videoWrapper = player.getIframe().parentNode;
        var className = videoWrapper.className;

        videoWrapper.className = className.slice(0, className.length - ' is-video-initialized'.length);
        player.destroy();
        YouTubeLoader.players.pop();
    },
    resetVideos: function() {
        YouTubeLoader.players.forEach(YouTubeLoader.resetVideo);
    }
};

YouTubeLoader.init();


// Remove function if it shouldn't be called
function scrollEvent() {
	/* Put your code here */
	//Paginate.scrollCheck(); // use this if you want to trigger pagination on scrolling
	//Lazyloader.loadHighRes(); // triggers the load event

    HeaderScroll.check();

	GlobalEventThrottle.throttleScroll = false;
	//console.log(GlobalEventThrottle.scrollEvent);
}

// Remove function if it shouldn't be called
function resizeEvent() {
	/* Put your code here */

    if (document.getElementsByClassName('js-masonry').length > 0) {
        Masonry.resizeAllMasonryItems();
    }

	GlobalEventThrottle.throttleResize = false;
	//console.log(GlobalEventThrottle.resizeEvent);
}

// Remove function if it shouldn't be called
function loadEvent() {
	/* Put your code here */
	// LazyLoader.init();
	//console.log(GlobalEventThrottle.loadEvent);
}

// Remove function if it shouldn't be called
function readyEvent() {
	/* Put your code here */
	// LazyLoader.init();
	//console.log(GlobalEventThrottle.loadEvent);
}

var Flyout = {
    init: function () {
        Array.prototype.slice.call(document.getElementsByClassName('js-flyout')).forEach(Flyout.attachEventListeners);
    },
    attachEventListeners: function (item) {
        item.addEventListener('click', Flyout.openFlyout);
        document.addEventListener('click', Flyout.closeAllFlyoutWithEvent);
        document.addEventListener('keyup', Flyout.closeAllFlyoutWithEvent);
        window.addEventListener('resize', Flyout.closeAllFlyout);
    },
    openFlyout: function (event) {
        var item = document.querySelector('.js-flyout-' + this.getAttribute('data-flyout'));

        if (BreakpointHelper.check() !== '"mobile"' && BreakpointHelper.check() !== '"mobile landscape"') {
            event.preventDefault();

            if (!item.classList.contains('is-visible')) {
                Flyout.closeAllFlyout();

                document.body.classList.add('is-flyout-visible');
                item.classList.add('is-visible');
                item.style.height = 'auto';

                var height = item.clientHeight + 'px';
                item.style.height = '0px';

                setTimeout(function () {
                    item.style.height = height
                }, 0);
            } else {
                Flyout.closeFlyout(item);
            }
        }

        if (this.getAttribute('data-flyout-focus')) {
            item.addEventListener('transitionend', function () {
                item.querySelector('input[type="text"]').focus();
            });
        }
    },
    closeFlyout: function (item) {
        if (item instanceof Event) {
            item = document.querySelector('.js-flyout-' + this.getAttribute('data-flyout'));
        }

        item.style.height = '0px';
        document.body.classList.remove('is-flyout-visible');
        item.classList.remove('is-visible');
    },
    closeAllFlyout: function () {
        Array.prototype.slice.call(document.getElementsByClassName('js-flyout-target')).forEach(Flyout.closeFlyout);
    },
    closeAllFlyoutWithEvent: function (event) {
        if ((event.key === 27 || event.key === 'Escape' || event.key === 'Esc' || !event.target.closest('.js-flyout, .js-flyout-target')) && document.body.classList.contains('is-flyout-visible')) {
            Array.prototype.slice.call(document.getElementsByClassName('js-flyout-target')).forEach(Flyout.closeFlyout);
        }
    }
};

window.addEventListener('DOMContentLoaded', Flyout.init);

var HeaderScroll = {
    check: function () {
        if (BreakpointHelper.check() === '"desktop"') {
            HeaderScroll.setScroller(150);
        } else if(BreakpointHelper.check() === '"tablet"') {
            HeaderScroll.setScroller(100);
        } else {
            HeaderScroll.setScroller(50);
        }
    },
    setScroller: function (height) {
        if (window.pageYOffset > height) {
            HeaderScroll.addBodyClass();
        } else {
            HeaderScroll.removeBodyClass();
        }
    },
    addBodyClass: function () {
        document.body.classList.add('is-scrolled');
    },
    removeBodyClass: function () {
        document.body.classList.remove('is-scrolled');
    }
};

var Menu = {
    panel: new Pusha('#pusha-main'),
    init: function () {
        Array.prototype.slice.call(document.getElementsByClassName('js-open-panel')).forEach(Menu.attachEventListeners);
    },
    attachEventListeners: function (item) {
        item.addEventListener('click', Menu.panel.open);
    }
};

window.addEventListener('DOMContentLoaded', Menu.init);
/*
var news = document.getElementsByClassName('js-partial-news');
if(news.length > 0){
    imagesLoaded(document.querySelector('.js-masonry'), function () {
        Masonry.resizeAllMasonryItems();
    });
    Array.prototype.slice.call(news).forEach(function(newsItem){
        newsItem.addEventListener('paginate.after', function() {
            imagesLoaded(document.querySelector('.js-masonry'), function () {
                Masonry.resizeAllMasonryItems();
            });
        });
    });
}
 */

// Element.prototype.closest Polyfill

if (!Element.prototype.matches) {
    Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}

if (!Element.prototype.closest) {
    Element.prototype.closest = function (s) {
        var el = this;
        if (!document.documentElement.contains(el)) return null;
        do {
            if (el.matches(s)) return el;
            el = el.parentElement || el.parentNode;
        } while (el !== null && el.nodeType === 1);
        return null;
    };
}

var news = document.getElementsByClassName('js-partial-references');
if(news.length > 0){
    imagesLoaded(document.querySelector('.js-masonry'), function () {
        Masonry.resizeAllMasonryItems();
    });
    Array.prototype.slice.call(news).forEach(function(newsItem){
        newsItem.addEventListener('paginate.after', function() {
            imagesLoaded(document.querySelector('.js-masonry'), function () {
                Masonry.resizeAllMasonryItems();
            });
        });
    });
}


var Materialize = {
    init: function() {
        HTMLLabelElement.prototype.isActive = Materialize.isActive;
        HTMLLabelElement.prototype.setActive = Materialize.setActive;
        HTMLLabelElement.prototype.removeActive = Materialize.removeActive;
        Array.prototype.slice.call(document.getElementsByClassName('form-group--materialize')).forEach(Materialize.attachEvents);
    },
    attachEvents: function(item) {
        var field = item.querySelector('input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea');

        if (field) {
            var label = item.getElementsByTagName('label').item(0);

            if (field.value !== '') {
                label.setActive();
            }

            field.label = label;
            field.addEventListener('focus', Materialize.onfocus);
            field.addEventListener('blur', Materialize.onblur);
        }
    },
    onfocus: function() {
        this.label.setActive();
    },
    onblur: function() {
        if (this.value === '') {
            this.label.removeActive();
        }
    },
    removeActive: function() {
        if (this.isActive()) {
            this.className = this.className.replace(' active', '');
        }
    },
    setActive: function() {
        if (!this.isActive()) {
            this.className += ' active';
        }
    },
    isActive: function() {
        return this.className.indexOf('active') !== -1
    }
};

Materialize.init();

var Toggler = {
    init: function () {
        Array.prototype.slice.call(document.getElementsByClassName('js-toggle')).forEach(Toggler.attachShowOnClick);
    },
    attachShowOnClick: function (item) {
        item.addEventListener('click', Toggler.toggleElements);
    },
    toggleElements: function (event) {
        if (this.nodeName === 'A') {
            event.preventDefault();
        }

        var triggerClassName = this.className;
        var targetClassName = 'js-toggle-' + this.getAttribute('data-toggle');

        if (this.on) {
            if (this.getAttribute('data-label-off')) {
                this.textContent = this.getAttribute('data-label-off');
            }

            this.className = triggerClassName.slice(0, triggerClassName.length - ' is-active'.length);

            this.on = false;
        } else {
            if (this.getAttribute('data-label-on')) {
                this.textContent = this.getAttribute('data-label-on');
            }

            this.className += ' is-active';

            this.on = true;
        }

        Array.prototype.slice.call(document.getElementsByClassName(targetClassName)).forEach(Toggler.toggleElement);
    },
    toggleElement: function (item) {
        var targetClassName = item.className;

        if (targetClassName.indexOf('is-toggled') === -1) {
            item.className += ' is-toggled';
        } else {
            item.className = targetClassName.slice(0, targetClassName.length - ' is-toggled'.length);
        }
    }
};

Toggler.init();
