// source --> https://diekulturmacherin.de/wp-content/plugins/responsive-lightbox/js/front.js?ver=2.7.7 
(e=>{const t=(e,t)=>{const a=new RegExp("[?&]"+e.replace(/[\[\]]/g,"\\$&")+"(=([^&#]*)|&|#|$)").exec("&"+t);return a&&a[2]?decodeURIComponent(a[2].replace(/\+/g," ")):""},a=(e,t,a)=>{"undefined"!=typeof MutationObserver&&new MutationObserver((e,l)=>{t?e[0].addedNodes.length&&a():(e[0].addedNodes.length||e[0].removedNodes.length)&&a()}).observe(e,{childList:!0,subtree:!0})};e(()=>{l()}),e(document).on(rlArgs.customEvents,()=>{l()});const l=()=>{const t=[];if(e(".rl-gallery-container").each((a,l)=>{const r=e(l);r.hasClass("rl-pagination-infinite")?t.push(r):r.removeClass("rl-loading")}),t.length>0){const a=[];for(let l=0;l<t.length;l++){const r=t[l],i=r.find(".rl-gallery"),o=parseInt(r.data("gallery_id")),n=r.find(".rl-pagination-bottom").data("button"),s=void 0!==n&&"manually"===n;a[l]={container:r,gallery:i,galleryId:o,galleryButton:s},a[l].gallery.infiniteScroll({path:`.rl-gallery-container[data-gallery_id="${a[l].galleryId}"] .rl-pagination-bottom .next`,append:`.rl-gallery-container[data-gallery_id="${a[l].galleryId}"] .rl-gallery-item`,status:!1,hideNav:`.rl-gallery-container[data-gallery_id="${a[l].galleryId}"] .rl-pagination-bottom`,prefill:!a[l].galleryButton,loadOnScroll:!0,scrollThreshold:!a[l].galleryButton&&400,button:!!a[l].galleryButton&&`.rl-gallery-container[data-gallery_id="${a[l].galleryId}"] .rl-load-more`,debug:!1,history:!1,responseBody:"text",onInit(){const t=a[l];t.container.hasClass("rl-pagination-infinite")&&t.galleryButton&&t.container.removeClass("rl-loading"),this.on("request",()=>{t.container.addClass("rl-loading")}),this.on("append",(a,l,r,i)=>{t.container.removeClass("rl-loading"),e.event.trigger({type:"doResponsiveLightbox",script:rlArgs.script,selector:rlArgs.selector,args:rlArgs,pagination_type:"infinite",gallery_id:t.galleryId,masonry:t.gallery.hasClass("rl-masonry-gallery")||t.gallery.hasClass("rl-basicmasonry-gallery"),delayLightbox:t.gallery.hasClass("rl-expander-gallery"),infinite:{gallery:t.gallery,body:a,items:r,response:i}})})}})}}e.event.trigger({type:"doResponsiveLightbox",script:rlArgs.script,selector:rlArgs.selector,args:rlArgs})};e(document).on("click",".rl-pagination a.page-numbers",a=>{const l=e(a.currentTarget),r=l.closest(".rl-gallery-container");if(r.hasClass("rl-pagination-ajax")){a.preventDefault(),a.stopPropagation();const i=r.data("gallery_id"),o=r.find(".rl-gallery").data("gallery_no");return r.addClass("rl-loading"),e.post(rlArgs.ajaxurl,{action:"rl-get-gallery-page-content",gallery_id:i,gallery_no:o,post_id:rlArgs.postId,page:t("rl_page",l.prop("href")),nonce:rlArgs.nonce,preview:rlArgs.preview?"true":"false",lightbox:rlArgs.script}).done(t=>{r.replaceWith(e(t).removeClass("rl-loading")),e.event.trigger({type:"doResponsiveLightbox",script:rlArgs.script,selector:rlArgs.selector,args:rlArgs,pagination_type:"ajax",gallery_id:i,gallery_no:o})}).always(()=>{r.removeClass("rl-loading")}),!1}}),e(document).on("doResponsiveLightbox",t=>{if(void 0!==t.masonry&&!0===t.masonry)return!1;const a=t.script,l=t.selector;if(void 0===a||void 0===l)return!1;const i=t.args;let o=!1;void 0!==t.delayLightbox&&!0===t.delayLightbox&&(o=!0),rl_view_image=(t,a)=>{e.event.trigger({type:"doLightboxViewImage",script:t,url:a})},rl_hide_image=(t,a)=>{e.event.trigger({type:"doLightboxHideImage",script:t,url:a})},setTimeout(()=>{const t=e(".flex-viewport");if(i.woocommerce_gallery){const l=e(".woocommerce-product-gallery");0===l.find(".woocommerce-product-gallery__trigger").length&&(l.prepend('<a href="#" class="woocommerce-product-gallery__trigger">🔍</a>'),l.on("click",".woocommerce-product-gallery__trigger",e=>{if(e.preventDefault(),e.stopPropagation(),"lightgallery"===a)if(t.length){const e=t.find(".flex-active-slide a[data-rel] img"),a=t.find(".flex-active-slide a[data-rel]").data("lg-id");e.trigger("click.lgcustom-item-"+a)}else{const e=l.find("a[data-rel]").first();e.find("img").trigger("click.lgcustom-item-"+e.data("lg-id"))}else if("fancybox_pro"===a)if(t.length){const e=t.find(".flex-active-slide").index(),a=t.find(".flex-active-slide a[data-rel]").data("fancybox");Fancybox.fromOpener(`[data-fancybox="${a}"]`,{startIndex:e})}else{const e=l.find("a[data-rel]").first();Fancybox.fromOpener(`[data-fancybox="${e.data("fancybox")}"]`,{startIndex:0})}else t.length?t.find(".flex-active-slide a[data-rel]").trigger("click"):l.find("a[data-rel]").first().trigger("click")}))}},10),o?setTimeout(()=>{r(t)},0):r(t)});const r=t=>{const l=t.script,r=t.selector,i=t.args;switch(l){case"swipebox":let o=e("#swipebox-overlay").find(".slide.current"),n="",s=!1,d=!1;e(`a[rel*="${r}"], a[data-rel*="${r}"]`).swipebox({useCSS:i.animation,useSVG:i.useSVG,hideCloseButtonOnMobile:i.hideCloseButtonOnMobile,removeBarsOnMobile:i.removeBarsOnMobile,hideBarsDelay:i.hideBars?parseInt(i.hideBarsDelay):0,videoMaxWidth:parseInt(i.videoMaxWidth),loopAtEnd:i.loopAtEnd,afterOpen:()=>{d=!1,o=e("#swipebox-overlay").find(".slide.current");const t=o.find("img").attr("src");void 0!==t?(n=t,rl_view_image(l,n)):n="",a(document.getElementById("swipebox-slider"),!1,()=>{if(""===n){const e=o.find("img").attr("src");void 0!==e?(n=e,rl_view_image(l,n)):n=""}})},nextSlide:()=>{o=e("#swipebox-overlay").find(".slide.current");const t=o.find("img").attr("src");void 0!==t?(n=t,rl_view_image(l,n)):n=""},prevSlide:()=>{o=e("#swipebox-overlay").find(".slide.current");const t=o.find("img").attr("src");void 0!==t?(n=t,rl_view_image(l,n)):n=""},afterClose:()=>{d=!0,s&&(rl_hide_image(l,n),s=!1)}}),e(window).on("resize",()=>{d||(s=!0)});break;case"prettyphoto":let c=!1,g="";e(`a[rel*="${r}"], a[data-rel*="${r}"]`).each((t,a)=>{const l=e(a);let r=l.data("rl_title"),i=l.data("rl_caption");if(r=r?r.replace(/[^]/g,e=>"&#"+e.charCodeAt(0)+";"):"",i=i?i.replace(/[^]/g,e=>"&#"+e.charCodeAt(0)+";"):"",l.attr("title",i),r){const e=l.find("img"),t=e.attr("alt");void 0!==t&&""!==t||e.attr("alt",r)}}),e(`a[rel*="${r}"], a[data-rel*="${r}"]`).prettyPhoto({hook:"data-rel",animation_speed:i.animationSpeed,slideshow:!!i.slideshow&&parseInt(i.slideshowDelay),autoplay_slideshow:i.slideshowAutoplay,opacity:i.opacity,show_title:i.showTitle,allow_resize:i.allowResize,allow_expand:i.allowExpand,default_width:parseInt(i.width),default_height:parseInt(i.height),counter_separator_label:i.separator,theme:i.theme,horizontal_padding:parseInt(i.horizontalPadding),hideflash:i.hideFlash,wmode:i.wmode,autoplay:i.videoAutoplay,modal:i.modal,deeplinking:i.deeplinking,overlay_gallery:i.overlayGallery,keyboard_shortcuts:i.keyboardShortcuts,social_tools:i.social?`<div class="pp_social"><div class="twitter"><a href="//twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="//platform.twitter.com/widgets.js"><\/script></div><div class="facebook"><iframe src="//www.facebook.com/plugins/like.php?locale=en_US&href=${location.href}&amp;layout=button_count&amp;show_faces=true&amp;width=500&amp;action=like&amp;font&amp;colorscheme=light&amp;height=23" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:23px;" allowTransparency="true"></iframe></div></div>`:"",ie6_fallback:!0,changepicturecallback:()=>{c?c=!1:(g=e("#pp_full_res").find("img").attr("src"),rl_view_image(l,g),i.allowExpand&&e("a.pp_expand").on("click",()=>{c=!0}))},callback:()=>{rl_hide_image(l,g)}});break;case"nivo":e.each(e(`a[rel*="${r}"], a[data-rel*="${r}"]`),(t,a)=>{const l=e(a);let i=l.attr("data-rel");void 0!==i&&0!=i||(i=l.attr("rel")),void 0!==i&&!1!==i&&i.startsWith(r+"-gallery-")&&l.attr("data-lightbox-gallery",i)});let p=!1,h=!0,m="";e(`a[rel*="${r}"], a[data-rel*="${r}"]`).nivoLightbox({effect:i.effect,clickOverlayToClose:i.clickOverlayToClose,keyboardNav:i.keyboardNav,errorMessage:i.errorMessage,afterShowLightbox:t=>{const r=e(t)[0].find(".nivo-lightbox-content");p||(p=!0,a(document.getElementsByClassName("nivo-lightbox-content")[0],!0,()=>{h&&(m=r.find(".nivo-lightbox-image img").attr("src"),rl_view_image(l,m),h=!1)}))},afterHideLightbox:()=>{h=!0,rl_hide_image(l,m)},onPrev:e=>{h=!1,m=e[0].attr("href"),rl_view_image(l,m)},onNext:e=>{h=!1,m=e[0].attr("href"),rl_view_image(l,m)}});break;case"imagelightbox":let f=[],u="";e(`a[rel*="${r}"], a[data-rel*="${r}"]`).each((t,a)=>{let l=e(a).attr("data-rel");void 0!==l&&!1!==l&&"norl"!==l?f.push(l):(l=e(a).attr("rel"),void 0!==l&&!1!==l&&"norl"!==l&&f.push(l))}),f.length>0&&(f=_.uniq(f),e(f).each((a,r)=>{void 0!==t.pagination_type&&e(`a[data-rel="${r}"], a[rel="${r}"]`).each((t,a)=>{e(a).off("click.imageLightbox")}),e(`a[data-rel="${r}"], a[rel="${r}"]`).imageLightbox({animationSpeed:parseInt(i.animationSpeed),preloadNext:i.preloadNext,enableKeyboard:i.enableKeyboard,quitOnEnd:i.quitOnEnd,quitOnImgClick:i.quitOnImageClick,quitOnDocClick:i.quitOnDocumentClick,onLoadEnd:()=>{u=e("#imagelightbox").attr("src"),rl_view_image(l,u)},onEnd:()=>{rl_hide_image(l,u)}})}));break;case"tosrus":let y=[],w="";e(`a[rel*="${r}"], a[data-rel*="${r}"]`).each((t,a)=>{let l=e(a).attr("data-rel");void 0!==l&&!1!==l&&"norl"!==l?y.push(l):(l=e(a).attr("rel"),void 0!==l&&!1!==l&&"norl"!==l&&y.push(l))}),y.length>0&&(y=_.uniq(y),e(y).each((a,r)=>{void 0!==t.pagination_type&&(e("body").find(".tosrus-"+r).remove(),e(`a[data-rel="${r}"], a[rel="${r}"]`).each((t,a)=>{e(a).off("click.tos")}));const o=e(`a[data-rel="${r}"], a[rel="${r}"]`).tosrus({drag:!0,infinite:i.infinite,autoplay:{play:i.autoplay,pauseOnHover:i.pauseOnHover,timeout:i.timeout},effect:i.effect,keys:{prev:i.keys,next:i.keys,close:i.keys},pagination:{add:i.pagination,type:i.paginationType},show:!1,buttons:!0,caption:{add:!0,attributes:["title"]},wrapper:{classes:"tosrus-"+r,onClick:i.closeOnClick?"close":"toggleUI"}});o.on("sliding.tos",(t,a)=>{w=e(e(t.target).find(".tos-slider .tos-slide")[a]).find("img").attr("src"),rl_view_image(l,w)}),o.on("closing.tos",()=>{rl_hide_image(l,w)})}));break;case"featherlight":{delete e.featherlight.contentFilters.jquery,e.extend(e.featherlight.contentFilters,{html:{regex:/[^]/,process:t=>e("<div>",{text:t})}}),e.featherlight.contentFilters.ajax.process=function(t){var a=e("<div/>");return e.get(t).done(function(e){a.html(window.RLG&&window.RLG.sanitizeHtml?window.RLG.sanitizeHtml(e):e)}).fail(function(){a.text("No content found.")}).promise(a)},e.featherlight.contentFilters.iframe.process=function(t){if(window.RLG&&window.RLG.isAllowedEmbedUrl&&!window.RLG.isAllowedEmbedUrl(t)){var a=e("<div/>");return a.text("Iframe not allowed."),a.contents()}var l=e("<div/>"),r=e("<iframe>",{src:t});return r.attr({allowfullscreen:"",webkitallowfullscreen:"",mozallowfullscreen:""}),l.append(r),l.contents()},e.featherlight.contentFilters.image.process=function(t){if(window.RLG&&window.RLG.isAllowedMediaUrl&&!window.RLG.isAllowedMediaUrl(t)){var a=e("<div/>");return a.text("Image not allowed."),a.contents()}var l=e.Deferred(),r=new Image,i=e("<img>",{alt:"",class:this.namespace+"-image"});return r.onload=function(){i.naturalWidth=r.width,i.naturalHeight=r.height,l.resolve(i)},r.onerror=function(){l.reject(i)},i.attr("src",t),r.src=t,l.promise()},e.featherlight.readElementConfig=function(e,t){return{}};let a=[],o="";e('a[rel*="'+r+'"], a[data-rel*="'+r+'"]').each((t,l)=>{let r=e(l).attr("data-rel");void 0!==r&&!1!==r&&"norl"!==r?a.push(r):(r=e(l).attr("rel"),void 0!==r&&!1!==r&&"norl"!==r&&a.push(r))}),a.length>0&&(a=_.uniq(a),e.extend(e.featherlight.defaults,{contentFilters:["image","html","ajax","iframe","text"],openSpeed:parseInt(i.openSpeed),closeSpeed:parseInt(i.closeSpeed),closeOnClick:i.closeOnClick,closeOnEsc:i.closeOnEsc,afterOpen:e=>{o=e.currentTarget.href,rl_view_image(l,o)},afterClose:()=>{rl_hide_image(l,o)}}),e(a).each((a,l)=>{void 0!==t.pagination_type&&e('a[data-rel="'+l+'"], a[rel="'+l+'"]').each((t,a)=>{e(a).off("click.featherlight")}),/-gallery-/.test(l)?e('a[data-rel="'+l+'"], a[rel="'+l+'"]').featherlightGallery({galleryFadeIn:parseInt(i.galleryFadeIn),galleryFadeOut:parseInt(i.galleryFadeOut),previousIcon:"&#10094;",nextIcon:"&#10095;"}):(/-video-/.test(l),e('a[data-rel="'+l+'"], a[rel="'+l+'"]').featherlight())}));break}case"magnific":{let t=[];e('a[rel*="'+r+'"], a[data-rel*="'+r+'"]').each((a,l)=>{let r=e(l).attr("data-rel");void 0!==r&&!1!==r&&"norl"!==r?t.push(r):(r=e(l).attr("rel"),void 0!==r&&!1!==r&&"norl"!==r&&t.push(r))}),t.length>0&&(t=_.uniq(t),e(t).each((t,a)=>{const r=e('a[data-rel="'+a+'"], a[rel="'+a+'"]'),o=e(r[0]);let n=o.data("magnific_type");const s=o.data("rl_content");void 0!==s&&(n=s),void 0===n&&(n="image");let d="auto",c="auto";"true"===i.fixedContentPos?d=!0:"false"===i.fixedContentPos&&(d=!1),"true"===i.fixedBgPos?c=!0:"false"===i.fixedBgPos&&(c=!1),r.magnificPopup({allowHTMLInStatusIndicator:!1,allowHTMLInTemplate:!0,type:"gallery"===n?"image":"video"===n?"iframe":n,disableOn:i.disableOn,midClick:i.midClick,preloader:i.preloader,closeOnContentClick:i.closeOnContentClick,closeOnBgClick:i.closeOnBgClick,closeBtnInside:i.closeBtnInside,showCloseBtn:i.showCloseBtn,enableEscapeKey:i.enableEscapeKey,alignTop:i.alignTop,autoFocusLast:i.autoFocusLast,fixedContentPos:d,fixedBgPos:c,image:{titleSrc:e=>{let t=e.el.data("rl_title"),a=e.el.data("rl_caption");return t=t?t.replace(/[^]/g,e=>"&#"+e.charCodeAt(0)+";"):"",a=a?a.replace(/[^]/g,e=>"&#"+e.charCodeAt(0)+";"):"",t+"<small>"+a+"</small>"}},gallery:{enabled:r.length>1&&"gallery"===n,navigateByImgClick:!0,preload:[0,1]},callbacks:{close(){rl_hide_image(l,this.currItem.src)},imageLoadComplete(){rl_view_image(l,this.currItem.src)},elementParse:e=>{e.src.trim().includes("<")&&("inline"===e.type?e.src="<div>HTML is disallowed.</div>":"iframe"!==e.type&&"ajax"!==e.type||(e.src=""))}}})}));break}case"glightbox":{void 0!==window.rl_glightbox&&null!==window.rl_glightbox&&window.rl_glightbox.destroy();const t=`a[rel*="${r}"]:not([rel*="-video-"]), a[data-rel*="${r}"]:not([data-rel*="-video-"])`;e(t).each((t,a)=>{const l=e(a),r=l.data("rl_title"),i=l.data("rl_caption");r&&l.attr("data-title",window.RLG&&window.RLG.sanitizeHtml?window.RLG.sanitizeHtml(r):r),i&&l.attr("data-description",window.RLG&&window.RLG.sanitizeHtml?window.RLG.sanitizeHtml(i):i);const o=l.attr("data-rel")||l.attr("rel");o&&l.attr("data-gallery",o)}),window.rl_glightbox=GLightbox({selector:t,slideEffect:i.slideEffect,closeButton:i.closeButton,touchNavigation:i.touchNavigation,keyboardNavigation:i.keyboardNavigation,closeOnOutsideClick:i.closeOnOutsideClick,loop:i.loop,zoomable:i.zoomable,moreLength:0,preload:!1}),window.rl_glightbox.on("slide_after_load",e=>{rl_view_image(l,e.slideConfig.href)}),window.rl_glightbox.on("close",()=>{const e=window.rl_glightbox.index,t=window.rl_glightbox.elements[e];t&&t.href&&rl_hide_image(l,t.href)});break}}}})(jQuery);
// source --> https://diekulturmacherin.de/wp-content/themes/twentytwenty/assets/js/index.js?ver=1.0.0.1573713758 
/*	-----------------------------------------------------------------------------------------------
	Namespace
--------------------------------------------------------------------------------------------------- */

var twentytwenty = twentytwenty || {};

// Set a default value for scrolled.
twentytwenty.scrolled = 0;

// polyfill closest
// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
if ( ! Element.prototype.closest ) {
	Element.prototype.closest = function( s ) {
		var el = this;

		do {
			if ( el.matches( s ) ) {
				return el;
			}

			el = el.parentElement || el.parentNode;
		} while ( el !== null && el.nodeType === 1 );

		return null;
	};
}

// polyfill forEach
// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Polyfill
if ( window.NodeList && ! NodeList.prototype.forEach ) {
	NodeList.prototype.forEach = function( callback, thisArg ) {
		var i;
		var len = this.length;

		thisArg = thisArg || window;

		for ( i = 0; i < len; i++ ) {
			callback.call( thisArg, this[ i ], i, this );
		}
	};
}

// event "polyfill"
twentytwenty.createEvent = function( eventName ) {
	var event;
	if ( typeof window.Event === 'function' ) {
		event = new Event( eventName );
	} else {
		event = document.createEvent( 'Event' );
		event.initEvent( eventName, true, false );
	}
	return event;
};

// matches "polyfill"
// https://developer.mozilla.org/es/docs/Web/API/Element/matches
if ( ! Element.prototype.matches ) {
	Element.prototype.matches =
		Element.prototype.matchesSelector ||
		Element.prototype.mozMatchesSelector ||
		Element.prototype.msMatchesSelector ||
		Element.prototype.oMatchesSelector ||
		Element.prototype.webkitMatchesSelector ||
		function( s ) {
			var matches = ( this.document || this.ownerDocument ).querySelectorAll( s ),
				i = matches.length;
			while ( --i >= 0 && matches.item( i ) !== this ) {}
			return i > -1;
		};
}

// Add a class to the body for when touch is enabled for browsers that don't support media queries
// for interaction media features. Adapted from <https://codepen.io/Ferie/pen/vQOMmO>.
twentytwenty.touchEnabled = {

	init: function() {
		var matchMedia = function() {
			// Include the 'heartz' as a way to have a non-matching MQ to help terminate the join. See <https://git.io/vznFH>.
			var prefixes = [ '-webkit-', '-moz-', '-o-', '-ms-' ];
			var query = [ '(', prefixes.join( 'touch-enabled),(' ), 'heartz', ')' ].join( '' );
			return window.matchMedia && window.matchMedia( query ).matches;
		};

		if ( ( 'ontouchstart' in window ) || ( window.DocumentTouch && document instanceof window.DocumentTouch ) || matchMedia() ) {
			document.body.classList.add( 'touch-enabled' );
		}
	}
}; // twentytwenty.touchEnabled

/*	-----------------------------------------------------------------------------------------------
	Cover Modals
--------------------------------------------------------------------------------------------------- */

twentytwenty.coverModals = {

	init: function() {
		if ( document.querySelector( '.cover-modal' ) ) {
			// Handle cover modals when they're toggled.
			this.onToggle();

			// When toggled, untoggle if visitor clicks on the wrapping element of the modal.
			this.outsideUntoggle();

			// Close on escape key press.
			this.closeOnEscape();

			// Hide and show modals before and after their animations have played out.
			this.hideAndShowModals();
		}
	},

	// Handle cover modals when they're toggled.
	onToggle: function() {
		document.querySelectorAll( '.cover-modal' ).forEach( function( element ) {
			element.addEventListener( 'toggled', function( event ) {
				var modal = event.target,
					body = document.body;

				if ( modal.classList.contains( 'active' ) ) {
					body.classList.add( 'showing-modal' );
				} else {
					body.classList.remove( 'showing-modal' );
					body.classList.add( 'hiding-modal' );

					// Remove the hiding class after a delay, when animations have been run.
					setTimeout( function() {
						body.classList.remove( 'hiding-modal' );
					}, 500 );
				}
			} );
		} );
	},

	// Close modal on outside click.
	outsideUntoggle: function() {
		document.addEventListener( 'click', function( event ) {
			var target = event.target;
			var modal = document.querySelector( '.cover-modal.active' );

			// if target onclick is <a> with # within the href attribute
			if ( event.target.tagName.toLowerCase() === 'a' && event.target.hash.includes( '#' ) && modal !== null ) {
				// untoggle the modal
				this.untoggleModal( modal );
				// wait 550 and scroll to the anchor
				setTimeout( function() {
					var anchor = document.getElementById( event.target.hash.slice( 1 ) );
					anchor.scrollIntoView();
				}, 550 );
			}

			if ( target === modal ) {
				this.untoggleModal( target );
			}
		}.bind( this ) );
	},

	// Close modal on escape key press.
	closeOnEscape: function() {
		document.addEventListener( 'keydown', function( event ) {
			if ( event.keyCode === 27 ) {
				event.preventDefault();
				document.querySelectorAll( '.cover-modal.active' ).forEach( function( element ) {
					this.untoggleModal( element );
				}.bind( this ) );
			}
		}.bind( this ) );
	},

	// Hide and show modals before and after their animations have played out.
	hideAndShowModals: function() {
		var _doc = document,
			_win = window,
			modals = _doc.querySelectorAll( '.cover-modal' ),
			htmlStyle = _doc.documentElement.style,
			adminBar = _doc.querySelector( '#wpadminbar' );

		function getAdminBarHeight( negativeValue ) {
			var height,
				currentScroll = _win.pageYOffset;

			if ( adminBar ) {
				height = currentScroll + adminBar.getBoundingClientRect().height;

				return negativeValue ? -height : height;
			}

			return currentScroll === 0 ? 0 : -currentScroll;
		}

		function htmlStyles() {
			var overflow = _win.innerHeight > _doc.documentElement.getBoundingClientRect().height;

			return {
				'overflow-y': overflow ? 'hidden' : 'scroll',
				position: 'fixed',
				width: '100%',
				top: getAdminBarHeight( true ) + 'px',
				left: 0
			};
		}

		// Show the modal.
		modals.forEach( function( modal ) {
			modal.addEventListener( 'toggle-target-before-inactive', function( event ) {
				var styles = htmlStyles(),
					offsetY = _win.pageYOffset,
					paddingTop = ( Math.abs( getAdminBarHeight() ) - offsetY ) + 'px',
					mQuery = _win.matchMedia( '(max-width: 600px)' );

				if ( event.target !== modal ) {
					return;
				}

				Object.keys( styles ).forEach( function( styleKey ) {
					htmlStyle.setProperty( styleKey, styles[ styleKey ] );
				} );

				_win.twentytwenty.scrolled = parseInt( styles.top, 10 );

				if ( adminBar ) {
					_doc.body.style.setProperty( 'padding-top', paddingTop );

					if ( mQuery.matches ) {
						if ( offsetY >= getAdminBarHeight() ) {
							modal.style.setProperty( 'top', 0 );
						} else {
							modal.style.setProperty( 'top', ( getAdminBarHeight() - offsetY ) + 'px' );
						}
					}
				}

				modal.classList.add( 'show-modal' );
			} );

			// Hide the modal after a delay, so animations have time to play out.
			modal.addEventListener( 'toggle-target-after-inactive', function( event ) {
				if ( event.target !== modal ) {
					return;
				}

				setTimeout( function() {
					var clickedEl = twentytwenty.toggles.clickedEl;

					modal.classList.remove( 'show-modal' );

					Object.keys( htmlStyles() ).forEach( function( styleKey ) {
						htmlStyle.removeProperty( styleKey );
					} );

					if ( adminBar ) {
						_doc.body.style.removeProperty( 'padding-top' );
						modal.style.removeProperty( 'top' );
					}

					if ( clickedEl !== false ) {
						clickedEl.focus();
						clickedEl = false;
					}

					_win.scrollTo({
						top: Math.abs( _win.twentytwenty.scrolled + getAdminBarHeight() ),
						behavior: 'instant'
					});

					_win.twentytwenty.scrolled = 0;
				}, 500 );
			} );
		} );
	},

	// Untoggle a modal.
	untoggleModal: function( modal ) {
		var modalTargetClass,
			modalToggle = false;

		// If the modal has specified the string (ID or class) used by toggles to target it, untoggle the toggles with that target string.
		// The modal-target-string must match the string toggles use to target the modal.
		if ( modal.dataset.modalTargetString ) {
			modalTargetClass = modal.dataset.modalTargetString;

			modalToggle = document.querySelector( '*[data-toggle-target="' + modalTargetClass + '"]' );
		}

		// If a modal toggle exists, trigger it so all of the toggle options are included.
		if ( modalToggle ) {
			modalToggle.click();

			// If one doesn't exist, just hide the modal.
		} else {
			modal.classList.remove( 'active' );
		}
	}

}; // twentytwenty.coverModals

/*	-----------------------------------------------------------------------------------------------
	Intrinsic Ratio Embeds
--------------------------------------------------------------------------------------------------- */

twentytwenty.intrinsicRatioVideos = {

	init: function() {
		this.makeFit();

		window.addEventListener( 'resize', function() {
			this.makeFit();
		}.bind( this ) );
	},

	makeFit: function() {
		document.querySelectorAll( 'iframe, object, video' ).forEach( function( video ) {
			var ratio, iTargetWidth,
				container = video.parentNode;

			// Skip videos we want to ignore.
			if ( video.classList.contains( 'intrinsic-ignore' ) || video.parentNode.classList.contains( 'intrinsic-ignore' ) ) {
				return true;
			}

			if ( ! video.dataset.origwidth ) {
				// Get the video element proportions.
				video.setAttribute( 'data-origwidth', video.width );
				video.setAttribute( 'data-origheight', video.height );
			}

			iTargetWidth = container.offsetWidth;

			// Get ratio from proportions.
			ratio = iTargetWidth / video.dataset.origwidth;

			// Scale based on ratio, thus retaining proportions.
			video.style.width = iTargetWidth + 'px';
			video.style.height = ( video.dataset.origheight * ratio ) + 'px';
		} );
	}

}; // twentytwenty.intrinsicRatioVideos

/*	-----------------------------------------------------------------------------------------------
	Modal Menu
--------------------------------------------------------------------------------------------------- */
twentytwenty.modalMenu = {

	init: function() {
		// If the current menu item is in a sub level, expand all the levels higher up on load.
		this.expandLevel();
		this.keepFocusInModal();
	},

	expandLevel: function() {
		var modalMenus = document.querySelectorAll( '.modal-menu' );

		modalMenus.forEach( function( modalMenu ) {
			var activeMenuItem = modalMenu.querySelector( '.current-menu-item' );

			if ( activeMenuItem ) {
				twentytwentyFindParents( activeMenuItem, 'li' ).forEach( function( element ) {
					var subMenuToggle = element.querySelector( '.sub-menu-toggle' );
					if ( subMenuToggle ) {
						twentytwenty.toggles.performToggle( subMenuToggle, true );
					}
				} );
			}
		} );
	},

	keepFocusInModal: function() {
		var _doc = document;

		_doc.addEventListener( 'keydown', function( event ) {
			var toggleTarget, modal, selectors, elements, menuType, bottomMenu, activeEl, lastEl, firstEl, tabKey, shiftKey,
				clickedEl = twentytwenty.toggles.clickedEl;

			if ( clickedEl && _doc.body.classList.contains( 'showing-modal' ) ) {
				toggleTarget = clickedEl.dataset.toggleTarget;
				selectors = 'input, a, button';
				modal = _doc.querySelector( toggleTarget );

				elements = modal.querySelectorAll( selectors );
				elements = Array.prototype.slice.call( elements );

				if ( '.menu-modal' === toggleTarget ) {
					menuType = window.matchMedia( '(min-width: 1000px)' ).matches;
					menuType = menuType ? '.expanded-menu' : '.mobile-menu';

					elements = elements.filter( function( element ) {
						return null !== element.closest( menuType ) && null !== element.offsetParent;
					} );

					elements.unshift( _doc.querySelector( '.close-nav-toggle' ) );

					bottomMenu = _doc.querySelector( '.menu-bottom > nav' );

					if ( bottomMenu ) {
						bottomMenu.querySelectorAll( selectors ).forEach( function( element ) {
							elements.push( element );
						} );
					}
				}

				lastEl = elements[ elements.length - 1 ];
				firstEl = elements[0];
				activeEl = _doc.activeElement;
				tabKey = event.keyCode === 9;
				shiftKey = event.shiftKey;

				if ( ! shiftKey && tabKey && lastEl === activeEl ) {
					event.preventDefault();
					firstEl.focus();
				}

				if ( shiftKey && tabKey && firstEl === activeEl ) {
					event.preventDefault();
					lastEl.focus();
				}
			}
		} );
	}
}; // twentytwenty.modalMenu

/*	-----------------------------------------------------------------------------------------------
	Primary Menu
--------------------------------------------------------------------------------------------------- */

twentytwenty.primaryMenu = {

	init: function() {
		this.focusMenuWithChildren();
	},

	// The focusMenuWithChildren() function implements Keyboard Navigation in the Primary Menu
	// by adding the '.focus' class to all 'li.menu-item-has-children' when the focus is on the 'a' element.
	focusMenuWithChildren: function() {
		// Get all the link elements within the primary menu.
		var links, i, len,
			menu = document.querySelector( '.primary-menu-wrapper' );

		if ( ! menu ) {
			return false;
		}

		links = menu.getElementsByTagName( 'a' );

		// Each time a menu link is focused, update focus.
		for ( i = 0, len = links.length; i < len; i++ ) {
			links[i].addEventListener( 'focus', updateFocus, true );
		}

		menu.addEventListener( 'focusout', removeFocus, true );

		// Remove focus classes from menu.
		function removeFocus(e){
			const leavingMenu = ! menu.contains( e.relatedTarget );

			if ( leavingMenu ) {
				// Remove focus from all li elements of primary-menu.
				menu.querySelectorAll( 'li' ).forEach( function( el ) {
					if ( el.classList.contains( 'focus' ) ) {
						el.classList.remove( 'focus', 'closed' );
					}
				});
			}
		}

		// Update focus class on an element.
		function updateFocus() {
			var self = this;

			// Remove focus from all li elements of primary-menu.
			menu.querySelectorAll( 'li' ).forEach( function( el ){
				if ( el.classList.contains( 'closed' ) ) {
					el.classList.remove( 'closed' );
				}
				if ( el.classList.contains( 'focus' ) ) {
					el.classList.remove( 'focus' );
				}
			});
			
			// Set focus on current `a` element's parent `li`.
			self.parentElement.classList.add( 'focus' );
			// If current element is inside sub-menu find main parent li and add focus.
			if ( self.closest( '.menu-item-has-children' ) ) {
				twentytwentyFindParents( self, 'li.menu-item-has-children' ).forEach( function( element ) {
					element.classList.add( 'focus' );
				});
			}
		}

		// When the `esc` key is pressed while in menu, move focus up one level.
		menu.addEventListener( 'keydown', removeFocusEsc, true );

		// Remove focus when `esc` key pressed.
		function removeFocusEsc( e ) {
			e = e || window.event;
			var isEscape = false,
				focusedElement = e.target;

			// Find if pressed key is `esc`.
			if ( 'key' in e ) {
				isEscape = ( e.key === 'Escape' || e.key === 'Esc' );
			} else {
				isEscape = ( e.keyCode === 27 );
			}

			// If pressed key is esc, remove focus class from parent menu li.
			if ( isEscape ) {
				var parentLi = focusedElement.closest( 'li' ),
					nestedParent = closestExcludingSelf( parentLi, 'li.menu-item-has-children' ),
					focusPosition = nestedParent ? nestedParent.querySelector('a') : false;

					if ( null !== nestedParent ) {
						nestedParent.classList.add( 'focus' );
						focusPosition.focus();
					} else {
						parentLi.classList.remove( 'focus' );
						parentLi.classList.add( 'closed' );
					}
			}
		}

		function closestExcludingSelf(element, selector) {
			if ( ! element || ! selector ) {
				return null;
			}
			const parent = element.parentElement;

			return parent ? parent.closest(selector) : null;
		}
	}
}; // twentytwenty.primaryMenu

/*	-----------------------------------------------------------------------------------------------
	Toggles
--------------------------------------------------------------------------------------------------- */

twentytwenty.toggles = {

	clickedEl: false,

	init: function() {
		// Do the toggle.
		this.toggle();

		// Check for toggle/untoggle on resize.
		this.resizeCheck();

		// Check for untoggle on escape key press.
		this.untoggleOnEscapeKeyPress();
	},

	performToggle: function( element, instantly ) {
		var target, timeOutTime, classToToggle,
			self = this,
			_doc = document,
			// Get our targets.
			toggle = element,
			targetString = toggle.dataset.toggleTarget,
			activeClass = 'active';

		// Elements to focus after modals are closed.
		if ( ! _doc.querySelectorAll( '.show-modal' ).length ) {
			self.clickedEl = _doc.activeElement;
		}

		if ( targetString === 'next' ) {
			target = toggle.nextSibling;
		} else {
			target = _doc.querySelector( targetString );
		}

		// Trigger events on the toggle targets before they are toggled.
		if ( target.classList.contains( activeClass ) ) {
			target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-before-active' ) );
		} else {
			target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-before-inactive' ) );
		}

		// Get the class to toggle, if specified.
		classToToggle = toggle.dataset.classToToggle ? toggle.dataset.classToToggle : activeClass;

		// For cover modals, set a short timeout duration so the class animations have time to play out.
		timeOutTime = 0;

		if ( target.classList.contains( 'cover-modal' ) ) {
			timeOutTime = 10;
		}

		setTimeout( function() {
			var focusElement,
				subMenued = target.classList.contains( 'sub-menu' ),
				newTarget = subMenued ? toggle.closest( '.menu-item' ).querySelector( '.sub-menu' ) : target,
				duration = toggle.dataset.toggleDuration;

			// Toggle the target of the clicked toggle.
			if ( toggle.dataset.toggleType === 'slidetoggle' && ! instantly && duration !== '0' ) {
				twentytwentyMenuToggle( newTarget, duration );
			} else {
				newTarget.classList.toggle( classToToggle );
			}

			// If the toggle target is 'next', only give the clicked toggle the active class.
			if ( targetString === 'next' ) {
				toggle.classList.toggle( activeClass );
			} else if ( target.classList.contains( 'sub-menu' ) ) {
				toggle.classList.toggle( activeClass );
			} else {
				// If not, toggle all toggles with this toggle target.
				_doc.querySelector( '*[data-toggle-target="' + targetString + '"]' ).classList.toggle( activeClass );
			}

			// Toggle aria-expanded on the toggle.
			twentytwentyToggleAttribute( toggle, 'aria-expanded', 'true', 'false' );

			if ( self.clickedEl && -1 !== toggle.getAttribute( 'class' ).indexOf( 'close-' ) ) {
				twentytwentyToggleAttribute( self.clickedEl, 'aria-expanded', 'true', 'false' );
			}

			// Toggle body class.
			if ( toggle.dataset.toggleBodyClass ) {
				_doc.body.classList.toggle( toggle.dataset.toggleBodyClass );
			}

			// Check whether to set focus.
			if ( toggle.dataset.setFocus ) {
				focusElement = _doc.querySelector( toggle.dataset.setFocus );

				if ( focusElement ) {
					if ( target.classList.contains( activeClass ) ) {
						focusElement.focus();
					} else {
						focusElement.blur();
					}
				}
			}

			// Trigger the toggled event on the toggle target.
			target.dispatchEvent( twentytwenty.createEvent( 'toggled' ) );

			// Trigger events on the toggle targets after they are toggled.
			if ( target.classList.contains( activeClass ) ) {
				target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-after-active' ) );
			} else {
				target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-after-inactive' ) );
			}
		}, timeOutTime );
	},

	// Do the toggle.
	toggle: function() {
		var self = this;

		document.querySelectorAll( '*[data-toggle-target]' ).forEach( function( element ) {
			element.addEventListener( 'click', function( event ) {
				event.preventDefault();
				self.performToggle( element );
			} );
		} );
	},

	// Check for toggle/untoggle on screen resize.
	resizeCheck: function() {
		if ( document.querySelectorAll( '*[data-untoggle-above], *[data-untoggle-below], *[data-toggle-above], *[data-toggle-below]' ).length ) {
			window.addEventListener( 'resize', function() {
				var winWidth = window.innerWidth,
					toggles = document.querySelectorAll( '.toggle' );

				toggles.forEach( function( toggle ) {
					var unToggleAbove = toggle.dataset.untoggleAbove,
						unToggleBelow = toggle.dataset.untoggleBelow,
						toggleAbove = toggle.dataset.toggleAbove,
						toggleBelow = toggle.dataset.toggleBelow;

					// If no width comparison is set, continue.
					if ( ! unToggleAbove && ! unToggleBelow && ! toggleAbove && ! toggleBelow ) {
						return;
					}

					// If the toggle width comparison is true, toggle the toggle.
					if (
						( ( ( unToggleAbove && winWidth > unToggleAbove ) ||
							( unToggleBelow && winWidth < unToggleBelow ) ) &&
							toggle.classList.contains( 'active' ) ) ||
						( ( ( toggleAbove && winWidth > toggleAbove ) ||
							( toggleBelow && winWidth < toggleBelow ) ) &&
							! toggle.classList.contains( 'active' ) )
					) {
						toggle.click();
					}
				} );
			} );
		}
	},

	// Close toggle on escape key press.
	untoggleOnEscapeKeyPress: function() {
		document.addEventListener( 'keyup', function( event ) {
			if ( event.key === 'Escape' ) {
				document.querySelectorAll( '*[data-untoggle-on-escape].active' ).forEach( function( element ) {
					if ( element.classList.contains( 'active' ) ) {
						element.click();
					}
				} );
			}
		} );
	}

}; // twentytwenty.toggles

/**
 * Is the DOM ready?
 *
 * This implementation is coming from https://gomakethings.com/a-native-javascript-equivalent-of-jquerys-ready-method/
 *
 * @since Twenty Twenty 1.0
 *
 * @param {Function} fn Callback function to run.
 */
function twentytwentyDomReady( fn ) {
	if ( typeof fn !== 'function' ) {
		return;
	}

	if ( document.readyState === 'interactive' || document.readyState === 'complete' ) {
		return fn();
	}

	document.addEventListener( 'DOMContentLoaded', fn, false );
}

twentytwentyDomReady( function() {
	twentytwenty.toggles.init();              // Handle toggles.
	twentytwenty.coverModals.init();          // Handle cover modals.
	twentytwenty.intrinsicRatioVideos.init(); // Retain aspect ratio of videos on window resize.
	twentytwenty.modalMenu.init();            // Modal Menu.
	twentytwenty.primaryMenu.init();          // Primary Menu.
	twentytwenty.touchEnabled.init();         // Add class to body if device is touch-enabled.
} );

/*	-----------------------------------------------------------------------------------------------
	Helper functions
--------------------------------------------------------------------------------------------------- */

/* Toggle an attribute ----------------------- */

function twentytwentyToggleAttribute( element, attribute, trueVal, falseVal ) {
	var toggles;

	if ( ! element.hasAttribute( attribute ) ) {
		return;
	}

	if ( trueVal === undefined ) {
		trueVal = true;
	}
	if ( falseVal === undefined ) {
		falseVal = false;
	}

	/*
	 * Take into account multiple toggle elements that need their state to be
	 * synced. For example: the Search toggle buttons for desktop and mobile.
	 */
	toggles = document.querySelectorAll( '[data-toggle-target="' + element.dataset.toggleTarget + '"]' );

	toggles.forEach( function( toggle ) {
		if ( ! toggle.hasAttribute( attribute ) ) {
			return;
		}

		if ( toggle.getAttribute( attribute ) !== trueVal ) {
			toggle.setAttribute( attribute, trueVal );
		} else {
			toggle.setAttribute( attribute, falseVal );
		}
	} );
}

/**
 * Toggle a menu item on or off.
 *
 * @since Twenty Twenty 1.0
 *
 * @param {HTMLElement} target
 * @param {number} duration
 */
function twentytwentyMenuToggle( target, duration ) {
	var initialParentHeight, finalParentHeight, menu, menuItems, transitionListener,
		initialPositions = [],
		finalPositions = [];

	if ( ! target ) {
		return;
	}

	menu = target.closest( '.menu-wrapper' );

	// Step 1: look at the initial positions of every menu item.
	menuItems = menu.querySelectorAll( '.menu-item' );

	menuItems.forEach( function( menuItem, index ) {
		initialPositions[ index ] = { x: menuItem.offsetLeft, y: menuItem.offsetTop };
	} );
	initialParentHeight = target.parentElement.offsetHeight;

	target.classList.add( 'toggling-target' );

	// Step 2: toggle target menu item and look at the final positions of every menu item.
	target.classList.toggle( 'active' );

	menuItems.forEach( function( menuItem, index ) {
		finalPositions[ index ] = { x: menuItem.offsetLeft, y: menuItem.offsetTop };
	} );
	finalParentHeight = target.parentElement.offsetHeight;

	// Step 3: close target menu item again.
	// The whole process happens without giving the browser a chance to render, so it's invisible.
	target.classList.toggle( 'active' );

	/*
	 * Step 4: prepare animation.
	 * Position all the items with absolute offsets, at the same starting position.
	 * Shouldn't result in any visual changes if done right.
	 */
	menu.classList.add( 'is-toggling' );
	target.classList.toggle( 'active' );
	menuItems.forEach( function( menuItem, index ) {
		var initialPosition = initialPositions[ index ];
		if ( initialPosition.y === 0 && menuItem.parentElement === target ) {
			initialPosition.y = initialParentHeight;
		}
		menuItem.style.transform = 'translate(' + initialPosition.x + 'px, ' + initialPosition.y + 'px)';
	} );

	/*
	 * The double rAF is unfortunately needed, since we're toggling CSS classes, and
	 * the only way to ensure layout completion here across browsers is to wait twice.
	 * This just delays the start of the animation by 2 frames and is thus not an issue.
	 */
	requestAnimationFrame( function() {
		requestAnimationFrame( function() {
			/*
			 * Step 5: start animation by moving everything to final position.
			 * All the layout work has already happened, while we were preparing for the animation.
			 * The animation now runs entirely in CSS, using cheap CSS properties (opacity and transform)
			 * that don't trigger the layout or paint stages.
			 */
			menu.classList.add( 'is-animating' );
			menuItems.forEach( function( menuItem, index ) {
				var finalPosition = finalPositions[ index ];
				if ( finalPosition.y === 0 && menuItem.parentElement === target ) {
					finalPosition.y = finalParentHeight;
				}
				if ( duration !== undefined ) {
					menuItem.style.transitionDuration = duration + 'ms';
				}
				menuItem.style.transform = 'translate(' + finalPosition.x + 'px, ' + finalPosition.y + 'px)';
			} );
			if ( duration !== undefined ) {
				target.style.transitionDuration = duration + 'ms';
			}
		} );

		// Step 6: finish toggling.
		// Remove all transient classes when the animation ends.
		transitionListener = function() {
			menu.classList.remove( 'is-animating' );
			menu.classList.remove( 'is-toggling' );
			target.classList.remove( 'toggling-target' );
			menuItems.forEach( function( menuItem ) {
				menuItem.style.transform = '';
				menuItem.style.transitionDuration = '';
			} );
			target.style.transitionDuration = '';
			target.removeEventListener( 'transitionend', transitionListener );
		};

		target.addEventListener( 'transitionend', transitionListener );
	} );
}

/**
 * Traverses the DOM up to find elements matching the query.
 *
 * @since Twenty Twenty 1.0
 *
 * @param {HTMLElement} target
 * @param {string} query
 * @return {NodeList} parents matching query
 */
function twentytwentyFindParents( target, query ) {
	var parents = [];

	// Recursively go up the DOM adding matches to the parents array.
	function traverse( item ) {
		var parent = item.parentNode;
		if ( parent instanceof HTMLElement ) {
			if ( parent.matches( query ) ) {
				parents.push( parent );
			}
			traverse( parent );
		}
	}

	traverse( target );

	return parents;
};