// source --> https://www.rennsteig-bike-tour.de/wp-content/plugins/nextgen-gallery/static/Lightbox/lightbox_context.js?ver=4.1.3 
function nextgen_lightbox_filter_selector($, selector)
{
		if (nextgen_lightbox_settings && nextgen_lightbox_settings.context) {
			var context = nextgen_lightbox_settings.context;
			
			if (context == 'all_images') {
				 selector = selector.add($('a > img').parent());
			}
			else if (context == 'all_images_direct') {
				selector = selector.add($('a[href] > img').parent()
				 		.filter(function() {
							var href = $(this).attr('href').toLowerCase();
							var ext = href.substring(href.length - 3);
							var ext2 = href.substring(href.length - 4);
							
							return (ext == 'jpg' || ext == 'gif' || ext == 'png' || ext2 == 'tiff' || ext2 == 'jpeg' || ext2 == 'webp');
						}));
			}
			else if (context == 'nextgen_and_wp_images') {
				 selector = selector.add($('a > img[class*="wp-image-"]').parent());
			}
			
			selector = selector.not('.gallery_link');
            selector = selector.not('.use_imagebrowser_effect');
		}
		
		return selector;
};
// source --> https://www.rennsteig-bike-tour.de/wp-content/plugins/nextgen-gallery/static/Lightbox/nextgen_tiktok_helper.js?ver=4.1.3 
(function($) {
    "use strict";

    window.NextGEN_TikTok = {
        extract_id: function(url) {
            if (!url) return null;
            url = url.trim();

            var patterns = [
                /tiktok\.com\/@[^\/]+\/video\/(\d+)/i,
                /tiktok\.com\/v\/(\d+)/i,
                /tiktok\.com\/embed\/v2\/(\d+)/i,
                /tiktok\.com\/.*[?&]v=(\d+)/i,
                /\/video\/(\d+)/i,
                /^(\d{15,25})$/,
            ];

            for (var i = 0; i < patterns.length; i++) {
                var match = url.match(patterns[i]);
                if (match && match[1]) {
                    return match[1];
                }
            }

            if (url.match(/vm\.tiktok\.com|tiktok\.com\/t\//i)) {
                var idMatch = url.match(/(\d{15,25})/);
                if (idMatch) {
                    return idMatch[1];
                }
                return null;
            }

            return null;
        },

        create_player: function(videoUrl, containerClass, videoClass) {
            var container = document.createElement("div");
            container.className = containerClass || "ngg-tiktok-container";

            var video = document.createElement("video");
            video.className = videoClass || "ngg-tiktok-video";
            video.controls = true;
            video.autoplay = true;
            video.playsInline = true;
            video.muted = true;
            video.loop = true;
            video.preload = "auto";
            video.setAttribute("playsinline", "");
            video.setAttribute("webkit-playsinline", "");
            video.src = videoUrl;

            video.addEventListener("loadedmetadata", function () {
                var naturalWidth = video.videoWidth;
                var naturalHeight = video.videoHeight;

                if (naturalWidth && naturalHeight) {
                    var container = video.closest('.ngg-tiktok-container');
                    var displayWidth = naturalWidth;
                    var displayHeight = naturalHeight;

                    if (container) {
                        var fancyboxContent = container.closest('#fancybox-content');
                        var tbWindow = container.closest('#TB_window');
                        var slImage = container.closest('.sl-image');
                        var shWrap = container.closest('#shWrap');

                        if (shWrap) {
                            var wiH = window.innerHeight || 0;
                            var dbH = document.body.clientHeight || 0;
                            var deH = document.documentElement ? document.documentElement.clientHeight : 0;
                            var wHeight;

                            if (wiH > 0) {
                                wHeight = ((wiH - dbH) > 1 && (wiH - dbH) < 30) ? dbH : wiH;
                                wHeight = ((wHeight - deH) > 1 && (wHeight - deH) < 30) ? deH : wHeight;
                            } else {
                                wHeight = (deH > 0) ? deH : dbH;
                            }

                            if (document.getElementsByTagName("body")[0].className.match(/admin-bar/)
                                && document.getElementById('wpadminbar') !== null) {
                                wHeight = wHeight - document.getElementById('wpadminbar').offsetHeight;
                            }

                            var shHeight = wHeight - 50;
                            var deW = document.documentElement ? document.documentElement.clientWidth : 0;
                            var dbW = window.innerWidth || document.body.clientWidth;
                            var wWidth = (deW > 1) ? deW : dbW;

                            // Apply EXACT same scaling logic as Shutter images (lines 239-249)
                            if (displayHeight > shHeight) {
                                displayWidth = displayWidth * (shHeight / displayHeight);
                                displayHeight = shHeight;
                            }
                            if (displayWidth > (wWidth - 16)) {
                                displayHeight = displayHeight * ((wWidth - 16) / displayWidth);
                                displayWidth = wWidth - 16;
                            }

                            video.style.width = displayWidth + "px";
                            video.style.height = displayHeight + "px";
                            video.style.maxWidth = "none";
                            video.style.maxHeight = "none";
                            video.setAttribute("width", displayWidth);
                            video.setAttribute("height", displayHeight);
                        } else if (fancyboxContent) {
                            setTimeout(function() {
                                var contentRect = fancyboxContent.getBoundingClientRect();
                                if (contentRect.width > 10 && contentRect.height > 10) {
                                    var maxW = contentRect.width;
                                    var maxH = contentRect.height;

                                    if (displayWidth > maxW || displayHeight > maxH) {
                                        var ratio = displayWidth / displayHeight > maxW / maxH
                                            ? displayWidth / maxW
                                            : displayHeight / maxH;
                                        displayWidth = displayWidth / ratio;
                                        displayHeight = displayHeight / ratio;
                                    }

                                    video.style.width = displayWidth + "px";
                                    video.style.height = displayHeight + "px";
                                    video.setAttribute("width", displayWidth);
                                    video.setAttribute("height", displayHeight);
                                }
                            }, 50);
                            return;
                        } else if (tbWindow) {
                            // Thickbox: replicate EXACT same image sizing logic from thickbox.js lines 204-224
                            var pageWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
                            var pageHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
                            var x = pageWidth - 150;  // Same as Thickbox: pagesize[0] - 150
                            var y = pageHeight - 150; // Same as Thickbox: pagesize[1] - 150

                            if (displayWidth > x) {
                                displayHeight = displayHeight * (x / displayWidth);
                                displayWidth = x;
                                if (displayHeight > y) {
                                    displayWidth = displayWidth * (y / displayHeight);
                                    displayHeight = y;
                                }
                            } else if (displayHeight > y) {
                                displayWidth = displayWidth * (y / displayHeight);
                                displayHeight = y;
                                if (displayWidth > x) {
                                    displayHeight = displayHeight * (x / displayWidth);
                                    displayWidth = x;
                                }
                            }

                            video.style.width = displayWidth + "px";
                            video.style.height = displayHeight + "px";
                            video.setAttribute("width", displayWidth);
                            video.setAttribute("height", displayHeight);
                        } else if (slImage) {
                            var widthRatio = 0.8;
                            var heightRatio = 0.9;
                            var windowWidth = window.innerWidth;
                            var windowHeight = window.innerHeight;
                            var maxWidth = windowWidth * widthRatio;
                            var maxHeight = windowHeight * heightRatio;

                            if (displayWidth > maxWidth || displayHeight > maxHeight) {
                                var ratio = displayWidth / displayHeight > maxWidth / maxHeight
                                    ? displayWidth / maxWidth
                                    : displayHeight / maxHeight;
                                displayWidth /= ratio;
                                displayHeight /= ratio;
                            }

                            video.style.width = displayWidth + "px";
                            video.style.height = displayHeight + "px";
                            video.style.maxWidth = maxWidth + "px";
                            video.style.maxHeight = maxHeight + "px";
                        }
                    }
                }
            });

            video.addEventListener("canplay", function () {
                video.play().catch(function () {});
            });

            container.appendChild(video);
            return container;
        },

        handle_content: function(options) {
            var self = this;
            var playUrl = options.playUrl;
            var $targetContainer = $(options.container);

            if (!playUrl) return null;

            var tiktokContent = null;

            var applyDimensions = function (el) {
                if (options.width) {
                    var w = typeof options.width === "number" ? options.width + "px" : options.width;
                    el.style.width = w;
                    var inner = el.querySelector("video, iframe, .ngg-tiktok-error-content");
                    if (inner) inner.style.width = "100%";
                }
                if (options.height) {
                    var h = typeof options.height === "number" ? options.height + "px" : options.height;
                    el.style.height = h;
                    var inner = el.querySelector("video, iframe, .ngg-tiktok-error-content");
                    if (inner) inner.style.height = "100%";
                }
            };

            if (playUrl) {
                var decodedUrl = playUrl;
                try {
                    decodedUrl = decodeURIComponent(playUrl);
                } catch (e) {}

                tiktokContent = self.create_player(decodedUrl, options.containerClass, options.videoClass);
                if (tiktokContent) {
                    applyDimensions(tiktokContent);
                    var video = tiktokContent.querySelector("video");
                    if (video) {
                        video.onerror = function () {
                            $(tiktokContent).remove();
                            var errorMsg = self.create_error("Video failed to load", options.errorClass);
                            applyDimensions(errorMsg);
                            if (typeof options.onBeforeAppend === "function") options.onBeforeAppend(errorMsg);
                            $targetContainer.append(errorMsg);
                        };
                    }
                    if (typeof options.onBeforeAppend === "function") options.onBeforeAppend(tiktokContent);
                    $targetContainer.append(tiktokContent);
                }
            } else {
                var errorMsg = self.create_error("Video not available", options.errorClass);
                applyDimensions(errorMsg);
                if (typeof options.onBeforeAppend === "function") options.onBeforeAppend(errorMsg);
                $targetContainer.append(errorMsg);
                tiktokContent = errorMsg;
            }

            return tiktokContent;
        },

        create_error: function(message, containerClass) {
            var container = document.createElement("div");
            container.className = containerClass || "ngg-tiktok-error";
            container.innerHTML =
                '<div class="ngg-tiktok-error-content">' +
                '<span class="ngg-tiktok-error-icon">&#9888;</span>' +
                '<span class="ngg-tiktok-error-text">' +
                (message || "Video failed to load") +
                "</span>" +
                "</div>";
            return container;
        }
    };
})(jQuery);
// source --> https://www.rennsteig-bike-tour.de/wp-content/plugins/nextgen-gallery/static/Lightbox/nextgen_custom_lightbox_tiktok_init.js?ver=4.1.3 
/**
 * NextGEN Gallery - Custom Lightbox TikTok & Video Support
 * 
 * This script provides TikTok and video playback support for custom lightboxes.
 * It intercepts clicks on TikTok/video images and displays content in a simple overlay
 * that works alongside any custom lightbox library.
 */
(function($) {
    "use strict";

    var DEBUG = false;
    var initialized = false;

    var log = function() {
        if (DEBUG && window.console) {
            console.log.apply(console, ['[NGG Custom Lightbox TikTok]'].concat(Array.prototype.slice.call(arguments)));
        }
    };

    /**
     * Get TikTok data from anchor element
     */
    var getTikTokData = function($anchor) {
        var playUrl = $anchor.attr('data-tiktok-play-url');
        var shareUrl = $anchor.attr('data-tiktok-share-url');
        var embedUrl = $anchor.attr('data-tiktok-embed-url');
        
        if (playUrl || shareUrl || embedUrl) {
            return {
                playUrl: playUrl || '',
                shareUrl: shareUrl || '',
                embedUrl: embedUrl || ''
            };
        }
        
        // Check window.ngg_tiktok_images
        var imageId = $anchor.attr('data-image-id');
        if (imageId && window.ngg_tiktok_images && window.ngg_tiktok_images[imageId]) {
            return window.ngg_tiktok_images[imageId];
        }
        
        return null;
    };

    /**
     * Get video URL from anchor element
     */
    var getVideoUrl = function($anchor) {
        return $anchor.attr('data-video-url') || null;
    };

    /**
     * Get gallery ID from element
     */
    var getGalleryId = function($element) {
        var $galleryContainer = $element.closest('[data-gallery-id]');
        if ($galleryContainer.length) {
            return $galleryContainer.attr('data-gallery-id') || $galleryContainer.data('gallery-id');
        }
        
        $galleryContainer = $element.closest('.ngg-galleryoverview, .ngg-imagebrowser, .ngg-slideshow');
        if ($galleryContainer.length) {
            return $galleryContainer.attr('data-gallery-id') || 
                   $galleryContainer.data('gallery-id') ||
                   $galleryContainer.attr('data-nextgen-gallery-id') ||
                   $galleryContainer.data('nextgen-gallery-id');
        }
        return null;
    };

    /**
     * Get TikTok settings for gallery
     */
    var getTikTokSettings = function(galleryId) {
        if (window.NggTikTokVideo && typeof window.NggTikTokVideo.getTikTokSettings === 'function') {
            return window.NggTikTokVideo.getTikTokSettings(galleryId);
        }
        
        if (window.ngg_tiktok_gallery_settings) {
            if (galleryId && window.ngg_tiktok_gallery_settings['gallery_' + galleryId]) {
                return window.ngg_tiktok_gallery_settings['gallery_' + galleryId];
            }
            if (window.ngg_tiktok_gallery_settings.global) {
                return window.ngg_tiktok_gallery_settings.global;
            }
        }
        
        return { link: '0', link_target: '0' };
    };

    /**
     * Get video settings for gallery
     */
    var getVideoSettings = function(galleryId) {
        if (!window.ngg_video_gallery_settings) {
            return {
                show_video_controls: true,
                show_play_pause_controls: true,
                autoplay_videos: false
            };
        }

        var settings = window.ngg_video_gallery_settings;
        var galleryIdStr = galleryId ? String(galleryId) : null;

        if (galleryIdStr && settings['gallery_' + galleryIdStr]) {
            return settings['gallery_' + galleryIdStr];
        }

        return settings.global || {
            show_video_controls: true,
            show_play_pause_controls: true,
            autoplay_videos: false
        };
    };

    /**
     * Create and show the TikTok/Video overlay
     */
    var showOverlay = function(contentElement) {
        // Remove existing overlay
        $('#ngg-custom-lightbox-overlay').remove();
        
        var $overlay = $('<div id="ngg-custom-lightbox-overlay"></div>').css({
            position: 'fixed',
            top: 0,
            left: 0,
            width: '100%',
            height: '100%',
            backgroundColor: 'transparent',
            zIndex: 999999,
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center',
            cursor: 'pointer'
        });
        
        var $closeBtn = $('<button type="button" class="ngg-custom-lightbox-close">&times;</button>').css({
            position: 'absolute',
            top: '20px',
            right: '20px',
            background: 'transparent',
            border: 'none',
            color: '#fff',
            fontSize: '40px',
            cursor: 'pointer',
            zIndex: 1000000,
            padding: '10px',
            lineHeight: 1
        });
        
        var $content = $('<div class="ngg-custom-lightbox-content"></div>').css({
            position: 'relative',
            maxWidth: '90vw',
            maxHeight: '90vh',
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center'
        });
        
        $content.append(contentElement);
        $overlay.append($closeBtn).append($content);
        
        // Close handlers
        var closeOverlay = function() {
            // Stop video/cleanup before removing
            var $video = $overlay.find('video');
            if ($video.length) {
                $video[0].pause();
                $video.attr('src', '');
            }
            var $iframe = $overlay.find('iframe');
            if ($iframe.length) {
                $iframe.attr('src', '');
            }
            $overlay.remove();
        };
        
        $closeBtn.on('click', function(e) {
            e.stopPropagation();
            closeOverlay();
        });
        
        $overlay.on('click', function(e) {
            if (e.target === this) {
                closeOverlay();
            }
        });
        
        $(document).on('keydown.nggCustomLightbox', function(e) {
            if (e.keyCode === 27) { // ESC
                closeOverlay();
                $(document).off('keydown.nggCustomLightbox');
            }
        });
        
        $('body').append($overlay);
        
        return $overlay;
    };

    /**
     * Handle TikTok content display
     */
    var handleTikTokClick = function($anchor, tiktokData) {
        log('Handling TikTok click', tiktokData);
        
        if (!tiktokData.playUrl && !tiktokData.shareUrl) {
            return false;
        }
        
        // Create container for TikTok content
        var $container = $('<div class="ngg-tiktok-container"></div>').css({
            position: 'relative',
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center'
        });
        
        // Use NextGEN_TikTok helper if available
        if (window.NextGEN_TikTok && window.NextGEN_TikTok.handle_content) {
            window.NextGEN_TikTok.handle_content({
                playUrl: tiktokData.playUrl,
                shareUrl: tiktokData.shareUrl,
                container: $container
            });
            showOverlay($container);
            return true;
        }
        
        // Fallback: create video element directly
        if (tiktokData.playUrl) {
            var $video = $('<video></video>').attr({
                src: tiktokData.playUrl,
                controls: true,
                autoplay: true,
                playsinline: true,
                muted: true,
                loop: true
            }).css({
                maxWidth: '90vw',
                maxHeight: '90vh',
                width: 'auto',
                height: 'auto'
            });
            
            $container.append($video);
            showOverlay($container);
            
            // Try to unmute after user interaction
            $video.on('click', function() {
                this.muted = false;
            });
            
            return true;
        }
        
        return false;
    };

    /**
     * Handle video content display
     */
    var handleVideoClick = function($anchor, videoUrl, galleryId) {
        log('Handling video click', videoUrl);
        
        if (!videoUrl) {
            return false;
        }
        
        // Check if NextGEN_Video can handle this platform
        if (!window.NextGEN_Video || !window.NextGEN_Video.detect_platform(videoUrl)) {
            return false;
        }
        
        var videoSettings = getVideoSettings(galleryId);
        
        var $container = $('<div class="ngg-video-container"></div>').css({
            position: 'relative',
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center'
        });
        
        if (window.NextGEN_Video.handle_content) {
            window.NextGEN_Video.handle_content({
                videoUrl: videoUrl,
                container: $container[0],
                settings: videoSettings,
                containerClass: 'ngg-video-container',
                videoClass: 'ngg-video-player',
                errorClass: 'ngg-video-error'
            });
            showOverlay($container);
            return true;
        }
        
        return false;
    };

    /**
     * Main click handler
     */
    var handleClick = function(e) {
        var $target = $(e.target);
        var $anchor = $target.is('a') ? $target : $target.closest('a');
        
        if (!$anchor.length) {
            return;
        }
        
        // Check if this is a NextGEN gallery image
        if (!$anchor.attr('data-image-id')) {
            return;
        }
        
        var tiktokData = getTikTokData($anchor);
        var videoUrl = getVideoUrl($anchor);
        var galleryId = getGalleryId($anchor);
        
        // Handle TikTok
        if (tiktokData && (tiktokData.playUrl || tiktokData.shareUrl)) {
            var tiktokSettings = getTikTokSettings(galleryId);
            var linkSetting = String(tiktokSettings.link || '0');
            
            // If link setting is to redirect, don't intercept
            if (linkSetting === '1' || linkSetting === '2') {
                return;
            }
            
            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();
            
            handleTikTokClick($anchor, tiktokData);
            return;
        }
        
        // Handle Video
        if (videoUrl && window.NextGEN_Video && window.NextGEN_Video.detect_platform(videoUrl)) {
            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();
            
            handleVideoClick($anchor, videoUrl, galleryId);
            return;
        }
    };

    /**
     * Initialize the handler
     */
    var init = function() {
        if (initialized) {
            return;
        }
        initialized = true;
        
        log('Initializing custom lightbox TikTok/video handler');
        
        // Use capture phase to intercept clicks before other lightbox handlers
        document.addEventListener('click', handleClick, true);
    };

    // Initialize on DOM ready
    $(function() {
        init();
    });

    // Reinitialize on refreshed event (AJAX navigation)
    $(window).on('refreshed', function() {
        log('Refreshed event - reinitializing');
    });

    // Expose API
    window.NggCustomLightboxTikTok = {
        showOverlay: showOverlay,
        handleTikTokClick: handleTikTokClick,
        handleVideoClick: handleVideoClick
    };

})(jQuery);