{"id":1283,"date":"2025-04-20T09:45:32","date_gmt":"2025-04-20T09:45:32","guid":{"rendered":"https:\/\/jeterecherche.com\/?page_id=1283"},"modified":"2025-05-29T14:24:55","modified_gmt":"2025-05-29T14:24:55","slug":"retrouvailles-remerciements-2","status":"publish","type":"page","link":"https:\/\/jeterecherche.com\/en\/retrouvailles-remerciements-2\/","title":{"rendered":"Reunions &amp; Thanks"},"content":{"rendered":"            \n            <div style=\"max-width: 98%; margin: 0 auto; padding: 20px 1%;\">\n                <!-- Filtres avec design moderne -->\n                <div style=\"display: flex; flex-wrap: wrap; align-items: center; gap: 15px; margin-bottom: 30px; padding: 20px; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); border-radius: 10px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);\">\n                    <select id=\"jtr_genre_select\" style=\"padding: 12px 40px 12px 16px; border: 2px solid #dee2e6; border-radius: 8px; background: white; font-size: 14px; font-weight: 500; color: #495057; cursor: pointer; transition: all 0.3s ease; min-width: 200px; appearance: none; background-image: url('data:image\/svg+xml,%3Csvg xmlns=%22http:\/\/www.w3.org\/2000\/svg%22 width=%2212%22 height=%228%22%3E%3Cpath d=%22M0 0l6 8 6-8z%22 fill=%22%23666%22\/%3E%3C\/svg%3E'); background-repeat: no-repeat; background-position: right 12px center;\">\n                        <option value=\"\">\ud83c\udfad Tous les genres<\/option>\n                        <option value=\"advanced-genealogical-assistance\">Advanced Genealogical Assistance<\/option><option value=\"miscellaneous\">Miscellaneous<\/option><option value=\"reunions-of-parents-children-born-under-x\">Reunions of Parents \/ Children Born Under X<\/option><option value=\"reunions-of-separated-families\">Reunions of Separated Families<\/option><option value=\"reunions-with-friends-buddies-acquaintances\">Reunions with Friends \/ Buddies \/ Acquaintances<\/option>                    <\/select>\n                    \n                    <select id=\"jtr-sort-order\" style=\"padding: 12px 40px 12px 16px; border: 2px solid #dee2e6; border-radius: 8px; background: white; font-size: 14px; font-weight: 500; color: #495057; cursor: pointer; transition: all 0.3s ease; min-width: 200px; appearance: none; background-image: url('data:image\/svg+xml,%3Csvg xmlns=%22http:\/\/www.w3.org\/2000\/svg%22 width=%2212%22 height=%228%22%3E%3Cpath d=%22M0 0l6 8 6-8z%22 fill=%22%23666%22\/%3E%3C\/svg%3E'); background-repeat: no-repeat; background-position: right 12px center;\">\n                        <option value=\"DESC\">\ud83d\udcc5 Plus r\u00e9cents<\/option>\n                        <option value=\"ASC\">\u23f0 Plus anciens<\/option>\n                    <\/select>\n                    \n                    <select id=\"jtr-country-select\" style=\"padding: 12px 40px 12px 16px; border: 2px solid #dee2e6; border-radius: 8px; background: white; font-size: 14px; font-weight: 500; color: #495057; cursor: pointer; transition: all 0.3s ease; min-width: 200px; appearance: none; background-image: url('data:image\/svg+xml,%3Csvg xmlns=%22http:\/\/www.w3.org\/2000\/svg%22 width=%2212%22 height=%228%22%3E%3Cpath d=%22M0 0l6 8 6-8z%22 fill=%22%23666%22\/%3E%3C\/svg%3E'); background-repeat: no-repeat; background-position: right 12px center;\">\n                        <option value=\"\">\ud83c\udf0d Tous les pays<\/option>\n                                                        <option value=\"BE\">\n                                    Belgique (5)                                <\/option>\n                                                            <option value=\"FR\">\n                                    France (1036)                                <\/option>\n                                                            <option value=\"DE\">\n                                    Allemagne (1)                                <\/option>\n                                                            <option value=\"IT\">\n                                    Italie (4)                                <\/option>\n                                                            <option value=\"LV\">\n                                    Lettonie (1)                                <\/option>\n                                                            <option value=\"NL\">\n                                    Pays-Bas (1)                                <\/option>\n                                                            <option value=\"PL\">\n                                    Pologne (1)                                <\/option>\n                                                            <option value=\"PT\">\n                                    Portugal (1)                                <\/option>\n                                                            <option value=\"SK\">\n                                    Slovaquie (1)                                <\/option>\n                                                            <option value=\"CH\">\n                                    Suisse (2)                                <\/option>\n                                                            <option value=\"ES\">\n                                    Espagne (2)                                <\/option>\n                                                            <option value=\"SE\">\n                                    Su\u00e8de (1)                                <\/option>\n                                                            <option value=\"EU\">\n                                    Autre (7)                                <\/option>\n                                                <\/select>\n                    \n                    <select id=\"jtr-media-filter\" style=\"padding: 12px 40px 12px 16px; border: 2px solid #dee2e6; border-radius: 8px; background: white; font-size: 14px; font-weight: 500; color: #495057; cursor: pointer; transition: all 0.3s ease; min-width: 200px; appearance: none; background-image: url('data:image\/svg+xml,%3Csvg xmlns=%22http:\/\/www.w3.org\/2000\/svg%22 width=%2212%22 height=%228%22%3E%3Cpath d=%22M0 0l6 8 6-8z%22 fill=%22%23666%22\/%3E%3C\/svg%3E'); background-repeat: no-repeat; background-position: right 12px center;\">\n                        <option value=\"\">\ud83d\udcf7 Tous les contenus<\/option>\n                        <option value=\"with\">\u2705 Avec photo\/vid\u00e9o<\/option>\n                        <option value=\"without\">\u274c Sans photo\/vid\u00e9o<\/option>\n                    <\/select>\n                    \n                    <span style=\"background: white; padding: 12px 20px; border-radius: 8px; font-weight: 600; color: #495057; border: 2px solid #dee2e6; white-space: nowrap;\">\n                        \ud83d\udcca Retrouvailles : 1069                    <\/span>\n                <\/div>\n\n                <!-- Grille des r\u00e9sultats -->\n                <div id=\"jtr-remerciements-list\" style=\"display: grid; grid-template-columns: repeat(5, 1fr); gap: 15px;\">\n                <\/div>\n\n                <!-- Messages d'erreur -->\n                <div id=\"jtr-error-container\" style=\"display:none; background: #ffebee; color: #c62828; padding: 12px; border-radius: 6px; margin: 12px 0; text-align: center; border: 1px solid #ffcdd2;\">\n                <\/div>\n\n                <!-- Barre de progression -->\n                <div id=\"jtr-progress-container\" style=\"display:none; max-width: 600px; width: 100%; margin: 24px auto 0;\">\n                    <div id=\"jtr-progress-bar\" style=\"background: #e3e3e3; border-radius: 6px; height: 18px; overflow: hidden;\">\n                        <div id=\"jtr-progress-inner\" style=\"background: #99cc33; height: 100%; width: 0%; transition: width 0.5s;\"><\/div>\n                    <\/div>\n                    <div id=\"jtr-progress-text\" style=\"font-size: 0.95em; margin-top: 4px; text-align: center; color: #444;\">Chargement...<\/div>\n                <\/div>\n            <\/div>\n\n            <script>\n            jQuery(function($) {\n                var page = 1, loading = false, noMore = false;\n                var ajaxurl = jtr_ajax_obj.ajaxurl;\n                var nonce = jtr_ajax_obj.nonce;\n                var current_lang = jtr_ajax_obj.current_lang;\n                var maxPage = parseInt(jtr_ajax_obj.max_page) || 100;\n                var requestCount = 0;\n                var maxRequestsPerMinute = 60;\n\n                \/\/ Rate limiting c\u00f4t\u00e9 client\n                function checkRateLimit() {\n                    requestCount++;\n                    if (requestCount > maxRequestsPerMinute) {\n                        showError('Trop de requ\u00eates. Veuillez patienter.');\n                        return false;\n                    }\n                    setTimeout(function() { requestCount = Math.max(0, requestCount - 1); }, 60000);\n                    return true;\n                }\n\n                function showError(message) {\n                    $('#jtr-error-container').text(message).slideDown();\n                    setTimeout(function() {\n                        $('#jtr-error-container').slideUp();\n                    }, 5000);\n                }\n\n                function hideError() {\n                    $('#jtr-error-container').slideUp();\n                }\n\n                function showProgressBarForPage(pageNum) {\n                    $('#jtr-progress-container').show();\n                    var min = (pageNum - 1) * 50 + 1;\n                    var max = pageNum * 50;\n                    var steps = [25, 50, 75, 100];\n                    var texts = [\n                        min + ' \u00e0 ' + (min + Math.floor(50 * 0.33)),\n                        (min + Math.floor(50 * 0.33) + 1) + ' \u00e0 ' + (min + Math.floor(50 * 0.66)),\n                        (min + Math.floor(50 * 0.66) + 1) + ' \u00e0 ' + (min + Math.floor(50 * 0.99)),\n                        min + ' \u00e0 ' + max\n                    ];\n                    let currentStep = 0;\n                    function animateStep() {\n                        if (currentStep < steps.length) {\n                            $('#jtr-progress-inner').css('width', steps[currentStep] + '%');\n                            $('#jtr-progress-text').text(texts[currentStep]);\n                            currentStep++;\n                            setTimeout(animateStep, 500);\n                        }\n                    }\n                    animateStep();\n                }\n                \n                function hideProgressBar() {\n                    $('#jtr-progress-container').fadeOut();\n                }\n\n                function loadRem(genre, order, country, pageNum, mediaFilter) {\n                    if(loading || noMore) return;\n                    \n                    if (!checkRateLimit()) return;\n                    if (pageNum > maxPage) {\n                        showError('Limite de pages atteinte.');\n                        return;\n                    }\n                    \n                    hideError();\n                    loading = true;\n                    \n                    if(pageNum > 1) {\n                        showProgressBarForPage(pageNum);\n                    }\n                    \n                    var minDelay = pageNum > 1 ? 2000 : 0;\n                    var startTime = Date.now();\n\n                    $.ajax({\n                        url: ajaxurl,\n                        type: 'POST',\n                        timeout: 15000,\n                        data: {\n                            action: 'jtr_load_remerciements',\n                            genre: genre,\n                            order: order,\n                            country: country,\n                            page: pageNum,\n                            media_filter: mediaFilter,\n                            nonce: nonce,\n                            lang: current_lang\n                        },\n                        success: function(r) {\n                            function finishLoad() {\n                                if(pageNum === 1) {\n                                    $('#jtr-remerciements-list').html(r);\n                                    noMore = $(r).filter('.jtr-item').length < 50;\n                                } else {\n                                    var items = $(r).filter('.jtr-item');\n                                    if(items.length) {\n                                        $('#jtr-remerciements-list').append(r);\n                                    } else {\n                                        noMore = true;\n                                    }\n                                }\n                                loading = false; \n                                page = pageNum;\n                                if(pageNum > 1) {\n                                    setTimeout(hideProgressBar, 400);\n                                }\n                            }\n                            var elapsed = Date.now() - startTime;\n                            if(pageNum > 1 && elapsed < minDelay) {\n                                setTimeout(finishLoad, minDelay - elapsed);\n                            } else {\n                                finishLoad();\n                            }\n                        },\n                        error: function(xhr, status, error) {\n                            loading = false;\n                            hideProgressBar();\n                            \n                            var errorMessage = 'Erreur de chargement.';\n                            if (status === 'timeout') {\n                                errorMessage = 'D\u00e9lai d\\'attente d\u00e9pass\u00e9.';\n                            } else if (xhr.status === 403) {\n                                errorMessage = 'Acc\u00e8s non autoris\u00e9.';\n                            } else if (xhr.status === 500) {\n                                errorMessage = 'Erreur serveur.';\n                            }\n                            \n                            showError(errorMessage);\n                            console.error('AJAX Error:', status, error);\n                        }\n                    });\n                }\n                \n                \/\/ Chargement initial\n                loadRem('', 'DESC', '', 1, '');\n                \n                \/\/ Gestion des filtres\n                $('#jtr_genre_select, #jtr-sort-order, #jtr-country-select, #jtr-media-filter').on('change', function() {\n                    var genre = $('#jtr_genre_select').val();\n                    var order = $('#jtr-sort-order').val();\n                    var country = $('#jtr-country-select').val();\n                    var mediaFilter = $('#jtr-media-filter').val();\n                    \n                    if (order !== 'ASC' && order !== 'DESC') {\n                        order = 'DESC';\n                    }\n                    if (mediaFilter !== 'with' && mediaFilter !== 'without') {\n                        mediaFilter = '';\n                    }\n                    \n                    noMore = false;\n                    loadRem(genre, order, country, 1, mediaFilter);\n                });\n                \n                \/\/ Infinite scroll\n                var scrollTimeout;\n                $(window).on('scroll', function() {\n                    clearTimeout(scrollTimeout);\n                    scrollTimeout = setTimeout(function() {\n                        if(!noMore && !loading && $(window).scrollTop() + $(window).height() >= $(document).height() - 100) {\n                            loadRem(\n                                $('#jtr_genre_select').val(),\n                                $('#jtr-sort-order').val(),\n                                $('#jtr-country-select').val(),\n                                page + 1,\n                                $('#jtr-media-filter').val()\n                            );\n                        }\n                    }, 250);\n                });\n\n                \/\/ Gestion des clics sur les vid\u00e9os\n                $(document).on('click', '.jtr-video-wrapper', function(e) {\n                    if ($(e.target).hasClass('jtr-video-btn')) return;\n                    \n                    e.preventDefault();\n                    var $wrapper = $(this);\n                    var $video = $wrapper.find('video');\n                    var $allVideos = $('.jtr-video-wrapper video');\n                    \n                    $allVideos.not($video).each(function() {\n                        this.pause();\n                        $(this).closest('.jtr-video-wrapper').removeClass('playing');\n                    });\n                    \n                    if ($video[0].paused) {\n                        $video[0].play();\n                        $wrapper.addClass('playing');\n                        \n                        if ($video[0].muted && $video[0].currentTime === 0) {\n                            $video[0].muted = false;\n                            $video[0].volume = 0.7;\n                            $wrapper.find('.jtr-mute-btn').text('\ud83d\udd07');\n                        }\n                    } else {\n                        $video[0].pause();\n                        $wrapper.removeClass('playing');\n                    }\n                });\n                \n                \/\/ Bouton mute\n                $(document).on('click', '.jtr-mute-btn', function(e) {\n                    e.stopPropagation();\n                    var $video = $(this).closest('.jtr-video-wrapper').find('video');\n                    if ($video[0].muted) {\n                        $video[0].muted = false;\n                        $(this).text('\ud83d\udd07');\n                    } else {\n                        $video[0].muted = true;\n                        $(this).text('\ud83d\udd0a');\n                    }\n                });\n                \n                \/\/ Bouton fullscreen\n                $(document).on('click', '.jtr-fullscreen-btn', function(e) {\n                    e.stopPropagation();\n                    var video = $(this).closest('.jtr-video-wrapper').find('video')[0];\n                    if (video.requestFullscreen) {\n                        video.requestFullscreen();\n                    } else if (video.webkitRequestFullscreen) {\n                        video.webkitRequestFullscreen();\n                    } else if (video.mozRequestFullScreen) {\n                        video.mozRequestFullScreen();\n                    }\n                });\n                \n                \/\/ Barre de progression vid\u00e9o\n                $(document).on('timeupdate', '.jtr-video-wrapper video', function() {\n                    var progress = (this.currentTime \/ this.duration) * 100;\n                    $(this).siblings('.jtr-video-progress').find('.jtr-video-progress-bar').css('width', progress + '%');\n                });\n                \n                \/\/ Fin de vid\u00e9o\n                $(document).on('ended', '.jtr-video-wrapper video', function() {\n                    $(this).closest('.jtr-video-wrapper').removeClass('playing');\n                    this.currentTime = 0;\n                    $(this).siblings('.jtr-video-progress').find('.jtr-video-progress-bar').css('width', '0%');\n                });\n                \n                \/\/ Double-clic fullscreen\n                $(document).on('dblclick', '.jtr-video-wrapper video', function(e) {\n                    e.stopPropagation();\n                    if (this.requestFullscreen) {\n                        this.requestFullscreen();\n                    } else if (this.webkitRequestFullscreen) {\n                        this.webkitRequestFullscreen();\n                    } else if (this.mozRequestFullScreen) {\n                        this.mozRequestFullScreen();\n                    }\n                });\n                \n                \/\/ Pr\u00e9chargement au survol\n                $(document).on('mouseenter', '.jtr-video-wrapper', function() {\n                    var video = $(this).find('video')[0];\n                    if (video && video.preload === 'metadata') {\n                        video.preload = 'auto';\n                    }\n                });\n                \n                \/\/ Navigation dans la vid\u00e9o\n                $(document).on('click', '.jtr-video-progress', function(e) {\n                    e.stopPropagation();\n                    var $video = $(this).siblings('video');\n                    var clickX = e.offsetX;\n                    var width = $(this).width();\n                    var percentage = clickX \/ width;\n                    $video[0].currentTime = $video[0].duration * percentage;\n                });\n\n                \/\/ CSS responsive\n                var style = $('<style>').attr('type', 'text\/css');\n                style.text(`\n                    @media (max-width: 1400px) {\n                        #jtr-remerciements-list {\n                            grid-template-columns: repeat(4, 1fr) !important;\n                        }\n                    }\n                    @media (max-width: 1200px) {\n                        #jtr-remerciements-list {\n                            grid-template-columns: repeat(3, 1fr) !important;\n                        }\n                    }\n                    @media (max-width: 768px) {\n                        #jtr-remerciements-list {\n                            grid-template-columns: repeat(2, 1fr) !important;\n                        }\n                    }\n                    @media (max-width: 576px) {\n                        #jtr-remerciements-list {\n                            grid-template-columns: 1fr !important;\n                        }\n                    }\n                    .jtr-item {\n                        background: #fff;\n                        border: 1px solid #ddd;\n                        border-radius: 8px;\n                        overflow: hidden;\n                        display: flex;\n                        flex-direction: column;\n                        transition: all 0.3s ease;\n                        position: relative;\n                    }\n                    .jtr-item:hover {\n                        transform: translateY(-5px);\n                        box-shadow: 0 8px 25px rgba(0,0,0,0.15);\n                    }\n                    .jtr-item img,\n                    .jtr-item video {\n                        width: 100%;\n                        height: 190px;\n                        object-fit: cover;\n                        cursor: pointer;\n                    }\n                    .jtr-video-wrapper {\n                        position: relative;\n                        cursor: pointer;\n                    }\n                    .jtr-video-icon {\n                        position: absolute;\n                        top: 50%;\n                        left: 50%;\n                        transform: translate(-50%, -50%);\n                        width: 60px;\n                        height: 60px;\n                        background: rgba(0,0,0,0.7);\n                        border-radius: 50%;\n                        display: flex;\n                        align-items: center;\n                        justify-content: center;\n                        transition: all 0.3s ease;\n                        pointer-events: none;\n                    }\n                    .jtr-video-icon::after {\n                        content: '\u25b6';\n                        color: white;\n                        font-size: 24px;\n                        margin-left: 4px;\n                    }\n                    .jtr-video-wrapper:hover .jtr-video-icon {\n                        background: rgba(0,0,0,0.9);\n                        transform: translate(-50%, -50%) scale(1.1);\n                    }\n                    .jtr-video-wrapper.playing .jtr-video-icon {\n                        display: none;\n                    }\n                    .jtr-video-progress {\n                        position: absolute;\n                        bottom: 0;\n                        left: 0;\n                        width: 100%;\n                        height: 4px;\n                        background: rgba(255,255,255,0.3);\n                        opacity: 0;\n                        transition: opacity 0.3s;\n                    }\n                    .jtr-video-wrapper:hover .jtr-video-progress,\n                    .jtr-video-wrapper.playing .jtr-video-progress {\n                        opacity: 1;\n                    }\n                    .jtr-video-progress-bar {\n                        height: 100%;\n                        background: #99cc33;\n                        width: 0%;\n                        transition: width 0.1s linear;\n                    }\n                    .jtr-video-controls {\n                        position: absolute;\n                        bottom: 10px;\n                        right: 10px;\n                        display: flex;\n                        gap: 8px;\n                        opacity: 0;\n                        transition: opacity 0.3s;\n                    }\n                    .jtr-video-wrapper:hover .jtr-video-controls,\n                    .jtr-video-wrapper.playing .jtr-video-controls {\n                        opacity: 1;\n                    }\n                    .jtr-video-btn {\n                        background: rgba(0,0,0,0.7);\n                        color: white;\n                        border: none;\n                        padding: 5px 10px;\n                        border-radius: 4px;\n                        cursor: pointer;\n                        font-size: 12px;\n                        transition: background 0.3s;\n                    }\n                    .jtr-video-btn:hover {\n                        background: rgba(0,0,0,0.9);\n                    }\n                    .jtr-content {\n                        padding: 12px;\n                        display: flex;\n                        flex-direction: column;\n                        flex: 1;\n                    }\n                    .jtr-info {\n                        display: flex;\n                        flex-wrap: wrap;\n                        gap: 8px;\n                        margin-bottom: 8px;\n                        font-size: 12px;\n                    }\n                    .jtr-date, .jtr-country, .jtr-genre {\n                        background: #f0f0f0;\n                        padding: 4px 8px;\n                        border-radius: 4px;\n                    }\n                    .jtr-title {\n                        font-size: 16px;\n                        margin: 8px 0;\n                        font-weight: 600;\n                    }\n                    .jtr-desc {\n                        font-size: 14px;\n                        color: #666;\n                        line-height: 1.4;\n                    }\n                `);\n                $('head').append(style);\n            });\n            <\/script>\n            \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1283","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/pages\/1283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/comments?post=1283"}],"version-history":[{"count":5,"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/pages\/1283\/revisions"}],"predecessor-version":[{"id":2747,"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/pages\/1283\/revisions\/2747"}],"wp:attachment":[{"href":"https:\/\/jeterecherche.com\/en\/wp-json\/wp\/v2\/media?parent=1283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}