{"id":115658,"date":"2024-02-13T14:43:18","date_gmt":"2024-02-13T12:43:18","guid":{"rendered":"https:\/\/eu4moldova.eu\/?page_id=115658"},"modified":"2024-11-19T08:11:49","modified_gmt":"2024-11-19T06:11:49","slug":"opportunities","status":"publish","type":"page","link":"https:\/\/eu4moldova.eu\/en\/opportunities\/","title":{"rendered":"Opportunities"},"content":{"rendered":"<div>\n<\/div>\n<h1>Opportunities<\/h1>\n<div>\n<\/div>\n<div>OPPORTUNITIES<\/div>\n<div>\n<div class=\"container-box\">\n<div class=\"filter-box\">\n<div class=\"type-box\">\n<h4>Opportunity type<\/h4>\n<ul>\n<li><input type=\"checkbox\" id=\"1947\"><label for=\"1947\">Call for proposals<\/label><\/li>\n<li><input type=\"checkbox\" id=\"1946\"><label for=\"1946\">Training and courses<\/label><\/li>\n<li><input type=\"checkbox\" id=\"1945\"><label for=\"1945\">Exchange<\/label><\/li>\n<li><input type=\"checkbox\" id=\"1944\"><label for=\"1944\">Events<\/label><\/li>\n<li><input type=\"checkbox\" id=\"2016\"><label for=\"2016\">Grants<\/label><\/li>\n<\/ul><\/div>\n<div class=\"topics-box\">\n<h4>Topics<\/h4>\n<div class=\"loader-container topics_loader\">\n<div class=\"loader\"><\/div>\n<\/p><\/div>\n<ul id=\"topicList\">\n            <\/ul>\n<\/p><\/div>\n<\/p><\/div>\n<p>    <!--    \n\n<div class=\"news_loader\">--><br \/>\n    <!--        \n\n<div class=\"loader_n\"><\/div>\n\n--><br \/>\n    <!--    <\/div>\n\n--><\/p>\n<div class=\"news-container\">\n<div class=\"news-box\">\n        <\/div>\n<\/p><\/div>\n<\/div>\n<div class=\"pagination-container\">\n<div class=\"pagination\"><\/div>\n<\/div>\n<p><script src=\"https:\/\/cdn.jsdelivr.net\/npm\/axios\/dist\/axios.min.js\"><\/script><br \/>\n<script>\n    let currentPage = 1;\n    const perPage = 10;\n    const apiUrl = \"https:\/\/eu4moldova.eu\/wp-json\/wp\/v2\/posts\";\n    let totalPosts;\n    let totalPages;\n    let queryParams = new URLSearchParams(window.location.search);\n    const topics_loader = document.querySelector('.topics_loader');\n    \/\/ const news_loader = document.querySelector('.news_loader');\n    \/\/ Capture the 'topics' parameter from the URL and split it into an array\n    let topicsParam = queryParams.get('topics');\n    let topicIds = topicsParam ? topicsParam.split(',') : [];<\/p>\n<p>    \/\/GET TOPICS\n    function getTopics() {\n        axios\n            .get(\"https:\/\/eu4moldova.eu\/wp-json\/wp\/v2\/topics?per_page=100&lang=en&_fields=name,id\")\n            .then((response) => {\n                topics_loader.style.display = 'none';\n                const topics = response.data;\n                const topicList = document.getElementById(\"topicList\");\n                topics.forEach((topic) => {\n                    const listItem = document.createElement(\"li\");\n                    listItem.textContent = topic.name;\n                    listItem.dataset.topicId = topic.id; \/\/ Store topic ID in a data attribute for easy access\n                    \/\/ Mark the topic as active if it matches any of the IDs in the topicIds array\n                    if (topicIds.includes(topic.id.toString())) {\n                        listItem.classList.add(\"active\");\n                    }<\/p>\n<p>                    listItem.addEventListener(\"click\", function () {\n                        const topicId = this.dataset.topicId;\n                        let selectedTopics = queryParams.get(\"topics\") ? queryParams.get(\"topics\").split(',') : [];\n                        const topicIndex = selectedTopics.indexOf(topicId);<\/p>\n<p>                        \/\/ Toggle topic selection\n                        if (topicIndex > -1) {\n                            \/\/ Topic is already selected, remove it\n                            selectedTopics.splice(topicIndex, 1);\n                            this.classList.remove(\"active\");\n                        } else {\n                            \/\/ Topic is not selected, add it\n                            selectedTopics.push(topicId);\n                            this.classList.add(\"active\");\n                        }<\/p>\n<p>                        \/\/ Update URL parameters\n                        if (selectedTopics.length > 0) {\n                            queryParams.set(\"topics\", selectedTopics.join(','));\n                        } else {\n                            queryParams.delete(\"topics\");\n                        }\n                        queryParams.set(\"page\", 1);\n                        history.replaceState(null, null, \"?\" + queryParams.toString());\n                        clearPosts();\n                        fetchData(1);\n                    });\n                    topicList.appendChild(listItem);\n                });\n            })\n            .catch((error) => {\n                console.error(\"Error fetching topics:\", error);\n            });<\/p>\n<p>        topics_loader.style.display = 'flex';\n    }<\/p>\n<p>    \/\/GET POSTS\n    function fetchData(page) {\n        renderSkeletons(); \/\/ Display skeletons before fetching data\n        let url;\n        const params = new URLSearchParams(window.location.search);\n        const topics = params.get('topics');\n        const pag = params.get('page');\n        const categories = params.get('categories')<\/p>\n<p>        if (topics) {\n            url = `${apiUrl}?categories=${categories ? categories : 6}&topics=${topics}&per_page=${perPage}&page=${pag ? pag : page}&_embed&lang=en&_fields=title,excerpt,acf.event_end_date,link,_links.wp:featuredmedia,_embedded.wp:featuredmedia`;\n        } else {\n            url = `${apiUrl}?categories=${categories ? categories : 6}&per_page=${perPage}&page=${pag ? pag : page}&_embed&lang=en&_fields=title,excerpt,acf.event_end_date,link,_links.wp:featuredmedia,_embedded.wp:featuredmedia`;\n        }<\/p>\n<p>        axios\n            .get(url)\n            .then((response) => {\n                \/\/ news_loader.style.display = 'none';\n                renderPosts(response.data);\n                totalPosts = response.headers[\"x-wp-total\"];\n                totalPages = Math.ceil(totalPosts \/ perPage);\n                renderPagination();\n            })\n            .catch((error) => {\n                console.error(\"Error fetching data:\", error);\n            });\n        \/\/ news_loader.style.display = 'flex';\n    }<\/p>\n<p>    function renderPagination() {\n        const paginationContainer = document.querySelector(\".pagination\");\n        paginationContainer.innerHTML = \"\";\n        const queryParams = new URLSearchParams(window.location.search);\n        const currentPage = Number(queryParams.get(\"page\")) || 1;\n        const visiblePages = 5;\n        const halfVisiblePages = Math.floor(visiblePages \/ 2);\n        let startPage = Math.max(1, currentPage - halfVisiblePages);\n        let endPage = Math.min(startPage + visiblePages - 1, totalPages);<\/p>\n<p>        if (endPage - startPage + 1 < visiblePages) {\n            if (currentPage > totalPages \/ 2) {\n                startPage = Math.max(1, totalPages - visiblePages + 1);\n            } else {\n                startPage = Math.max(1, endPage - visiblePages + 1);\n            }\n        }<\/p>\n<p>        if (startPage > 1) {\n            const firstPage = document.createElement(\"div\");\n            firstPage.classList.add(\"page\");\n            firstPage.textContent = \"1\";\n            firstPage.addEventListener(\"click\", () => {\n                queryParams.set(\"page\", 1);\n                history.replaceState(null, null, \"?\" + queryParams.toString());\n                fetchData(1);\n            });\n            paginationContainer.appendChild(firstPage);<\/p>\n<p>            if (startPage > 2) {\n                const prevEllipsis = document.createElement(\"div\");\n                prevEllipsis.textContent = \"...\";\n                prevEllipsis.classList.add(\"ellipsis\");\n                paginationContainer.appendChild(prevEllipsis);\n            }\n        }<\/p>\n<p>        for (let i = startPage; i <= endPage; i++) {\n            const pageLink = document.createElement(\"div\");\n            pageLink.classList.add(\"page\");\n            pageLink.textContent = i;\n            if (i === currentPage) {\n                pageLink.classList.add(\"active\");\n            }\n            pageLink.addEventListener(\"click\", () => {\n                clearPosts();\n                queryParams.set(\"page\", i);\n                history.replaceState(null, null, \"?\" + queryParams.toString());\n                fetchData(i);\n                document.body.scrollTop = 0; \/\/ For Safari\n                document.documentElement.scrollTop = 0; \/\/ For Chrome, Firefox, IE and Opera\n            });\n            paginationContainer.appendChild(pageLink);\n        }<\/p>\n<p>        if (endPage < totalPages) {\n            if (endPage < totalPages - 1) {\n                const nextEllipsis = document.createElement(\"div\");\n                nextEllipsis.textContent = \"...\";\n                nextEllipsis.classList.add(\"ellipsis\");\n                paginationContainer.appendChild(nextEllipsis);\n            }\n\n            const lastPage = document.createElement(\"div\");\n            lastPage.classList.add(\"page\");\n            lastPage.textContent = totalPages;\n            lastPage.addEventListener(\"click\", () => {\n                queryParams.set(\"page\", totalPages);\n                history.replaceState(null, null, \"?\" + queryParams.toString());\n                fetchData(totalPages);\n            });\n            paginationContainer.appendChild(lastPage);\n        }\n    }<\/p>\n<p>    function renderPosts(posts) {\n        const newsContainer = document.querySelector(\".news-container\");<\/p>\n<p>        newsContainer.innerHTML = \"\";<\/p>\n<p>        posts.forEach((post) => {\n            const newsBox = document.createElement(\"div\");\n            newsBox.classList.add(\"news-box\");<\/p>\n<p>            const imageLayout = document.createElement(\"div\");\n            imageLayout.classList.add(\"image-layout\");<\/p>\n<p>            const imgElement = document.createElement(\"img\");\n            imgElement.classList.add(\"news-img\");\n            imgElement.src = post._embedded[\"wp:featuredmedia\"] ? post._embedded[\"wp:featuredmedia\"][0]?.source_url : '';\n            imgElement.alt = \"\";<\/p>\n<p>            imageLayout.appendChild(imgElement);\n            newsBox.appendChild(imageLayout);<\/p>\n<p>            const content = document.createElement(\"div\");\n            content.classList.add(\"content\");<\/p>\n<p>            const layoutDiv = document.createElement(\"div\");\n            layoutDiv.classList.add(\"layout\");<\/p>\n<p>            if (post.acf.event_end_date) {\n                const dateParagraph = document.createElement(\"p\");\n                dateParagraph.classList.add(\"date\");\n                let event_end_date = post.acf.event_end_date;\n                let end_date;\n                let dateObj = new Date(event_end_date.replace(\/(\\d{4})(\\d{2})(\\d{2})\/, '$1-$2-$3'));\n                let options = {month: 'long', day: 'numeric', year: 'numeric'};\n                end_date = 'CLOSING DATE: ' + dateObj.toLocaleDateString('en-GB', options).toUpperCase();\n                dateParagraph.textContent = end_date;\n                layoutDiv.appendChild(dateParagraph);\n            }<\/p>\n<p>            const titleParagraph = document.createElement(\"p\");\n            titleParagraph.classList.add(\"title\");\n            const tempD = document.createElement(\"div\");\n            tempD.innerHTML = post.title.rendered;\n            titleParagraph.textContent = tempD.textContent;<\/p>\n<p>            const descriptionParagraph = document.createElement(\"p\");\n            descriptionParagraph.classList.add(\"description\");\n            const tempDiv = document.createElement(\"div\");\n            tempDiv.innerHTML = post.excerpt.rendered;\n            descriptionParagraph.textContent = tempDiv.textContent;\n            document.body.appendChild(descriptionParagraph);<\/p>\n<p>            const seeMoreLink = document.createElement(\"a\");\n            seeMoreLink.href = post.link;\n            seeMoreLink.textContent = \"See more\";<\/p>\n<p>                        layoutDiv.appendChild(titleParagraph);\n            layoutDiv.appendChild(descriptionParagraph);\n            content.appendChild(layoutDiv);\n            content.appendChild(seeMoreLink);\n            newsBox.appendChild(content);<\/p>\n<p>            const postLink = document.createElement(\"a\");\n            postLink.href = post.link;\n            postLink.appendChild(newsBox);\n            newsContainer.appendChild(postLink);\n        });\n    }<\/p>\n<p>    const checkboxes = document.querySelectorAll('.type-box input[type=\"checkbox\"]');\n    const categoryId6 = '6';<\/p>\n<p>    function getPostsByCheckboxCategory() {\n        const selectedCategories = Array.from(checkboxes)\n            .filter(checkbox => checkbox.checked && checkbox.id !== categoryId6)\n            .map(checkbox => checkbox.id);\n        \/\/ if (!selectedCategories.includes(categoryId6)) {\n        \/\/     selectedCategories.push(categoryId6);\n        \/\/ }\n        clearPosts();\n        const categoriesParam = selectedCategories.join(',');\n        queryParams.set(\"categories\", categoriesParam);\n        queryParams.set(\"page\", 1);\n        history.replaceState(null, null, \"?\" + queryParams.toString());\n        fetchData(1);\n    }<\/p>\n<p>    checkboxes.forEach(checkbox => {\n        checkbox.addEventListener('change', getPostsByCheckboxCategory);\n    });<\/p>\n<p>    document.addEventListener('DOMContentLoaded', function () {\n        const categoriesParam = queryParams.get('categories');\n        if (categoriesParam) {\n            const categoryIds = categoriesParam.split(',');\n            categoryIds.forEach(id => {\n                const checkbox = document.getElementById(id);\n                if (checkbox) {\n                    checkbox.checked = true;\n                }\n            });\n        }\n    });<\/p>\n<p>    function renderSkeletons(count = 5) {\n        const newsContainer = document.querySelector(\".news-container\");\n        newsContainer.innerHTML = \"\"; \/\/ Clear the news container<\/p>\n<p>        for (let i = 0; i < count; i++) {\n            const skeletonWrapper = document.createElement(\"div\");\n            skeletonWrapper.classList.add(\"news-box\");\n            skeletonWrapper.style.display = \"flex\";\n            skeletonWrapper.style.alignItems = \"flex-start\";\n\n            const skeletonImage = document.createElement(\"div\");\n            skeletonImage.classList.add(\"skeleton-img\");\n            skeletonWrapper.appendChild(skeletonImage);\n\n            const skeletonContent = document.createElement(\"div\");\n            skeletonContent.style.flexGrow = \"1\";\n\n            const skeletonTitle = document.createElement(\"div\");\n            skeletonTitle.classList.add(\"skeleton\", \"skeleton-title\");\n            skeletonContent.appendChild(skeletonTitle);\n\n            const skeletonDescription = document.createElement(\"div\");\n            skeletonDescription.classList.add(\"skeleton\", \"skeleton-description\");\n            skeletonContent.appendChild(skeletonDescription);\n\n            const skeletonSeeMore = document.createElement(\"div\");\n            skeletonSeeMore.classList.add(\"skeleton\", \"skeleton-see-more\");\n            skeletonContent.appendChild(skeletonSeeMore);\n\n            skeletonWrapper.appendChild(skeletonContent);\n            newsContainer.appendChild(skeletonWrapper);\n        }\n    }\n\n    function clearPosts() {\n        renderSkeletons(5); \/\/ Optionally pass the number of skeletons you want to render\n\n        const postsContainer = document.querySelector(\".news-container\");\n        postsContainer.innerHTML = \"\";\n    }\n\n    getTopics();\n    fetchData(currentPage);\n\n<\/script><\/p>\n<\/div>\n<p><!--more--><br \/>\n<!-- {\"type\":\"layout\",\"children\":[{\"type\":\"section\",\"props\":{\"image_position\":\"center-center\",\"padding\":\"xsmall\",\"padding_remove_top\":false,\"style\":\"default\",\"title_breakpoint\":\"xl\",\"title_position\":\"top-left\",\"title_rotation\":\"left\",\"vertical_align\":\"middle\",\"width\":\"expand\"},\"children\":[{\"type\":\"row\",\"props\":{\"layout\":\"1-5,4-5\"},\"children\":[{\"type\":\"column\",\"props\":{\"image_position\":\"center-center\",\"position_sticky_breakpoint\":\"m\",\"width_medium\":\"1-5\"},\"children\":[{\"type\":\"list\",\"props\":{\"column_breakpoint\":\"m\",\"css\":\".el-element {\\n    list-style: none;\\n    display: flex;\\n    flex-wrap: wrap;\\n    padding-left: 0px;\\n}\\n\\n\\n.el-element .el-item {\\n    padding: 9px 21px;\\n    border-radius: 12px;\\n    border: 1px solid #817D7D;\\n    color: #000;\\n    font-size: 12px;\\n    font-weight: 400;\\n    line-height: normal;\\n    margin-right: 12px;\\n    margin-bottom: 15px;\\n\\n}\\n\\n.el-element .el-item:hover {\\n    background-color: #013EB4; \\n \\tcolor: #FFFFFF !important; \\n}\\n\\n\\n\\\/* Adjusted: Specify that .el-link color changes when .el-item is hovered *\\\/\\n.el-element .el-item :hover .el-link {\\n    color: white;\\n}\\n\\n.el-element .with-icon a span{\\n    top: 0;\\n    left: 0;\\n    border-radius: 16px;\\n    height: 100%;\\n    color: #fff;\\n    background: #000;\\n    min-width: 28px;\\n    text-align: left;\\n    display: flex;\\n    align-items: left;\\n    justify-content: left;\\n    line-height: 1;\\n}\\n.el-element .el-link {\\n    color: #000;\\n    text-decoration: none;\\n}\\n\\n}\\n\",\"icon\":\"hashtag\",\"image_align\":\"left\",\"image_svg_color\":\"emphasis\",\"image_vertical_align\":true,\"link_style\":\"reset\",\"list_element\":\"ul\",\"list_horizontal_separator\":\"\",\"list_type\":\"horizontal\",\"margin\":\"default\",\"show_image\":true,\"show_link\":true,\"text_align\":\"left\"},\"children\":[{\"type\":\"list_item\",\"source\":{\"query\":{\"name\":\"topicss.customTopicss\",\"arguments\":{\"id\":0,\"offset\":0,\"limit\":40,\"order\":\"term_order\",\"order_direction\":\"ASC\"}},\"props\":{\"content\":{\"filters\":{\"search\":\"\"},\"name\":\"name\"},\"link\":{\"filters\":{\"search\":\"\"},\"name\":\"link\"}}}}]}]},{\"type\":\"column\",\"props\":{\"image_position\":\"center-center\",\"position_sticky_breakpoint\":\"m\",\"width_medium\":\"4-5\"},\"children\":[{\"type\":\"headline\",\"props\":{\"content\":\"Opportunities\",\"title_color\":\"secondary\",\"title_element\":\"h1\"},\"name\":\"Opportunities\"},{\"type\":\"grid\",\"props\":{\"content_align\":false,\"content_column_breakpoint\":\"m\",\"filter\":true,\"filter_align\":\"left\",\"filter_all\":true,\"filter_animation\":\"false\",\"filter_grid_breakpoint\":\"m\",\"filter_grid_width\":\"auto\",\"filter_position\":\"top\",\"filter_style\":\"subnav-pill\",\"grid_column_align\":true,\"grid_column_gap\":\"collapse\",\"grid_default\":\"1\",\"grid_divider\":true,\"grid_large\":\"1\",\"grid_medium\":\"1\",\"grid_row_gap\":\"large\",\"grid_small\":\"1\",\"grid_xlarge\":\"1\",\"icon_width\":\"\",\"image_align\":\"left\",\"image_border\":\"rounded\",\"image_grid_breakpoint\":\"m\",\"image_grid_column_gap\":\"collapse\",\"image_grid_row_gap\":\"large\",\"image_grid_width\":\"1-2\",\"image_height\":\"250\",\"image_svg_color\":\"emphasis\",\"image_width\":\"450\",\"item_animation\":true,\"link_style\":\"text\",\"link_text\":\"Read more\",\"margin\":\"default\",\"meta_align\":\"below-title\",\"meta_element\":\"div\",\"meta_style\":\"text-meta\",\"panel_link\":true,\"panel_padding\":\"default\",\"panel_style\":\"tile-default\",\"show_content\":true,\"show_image\":true,\"show_link\":true,\"show_meta\":true,\"show_title\":true,\"title_align\":\"top\",\"title_element\":\"h3\",\"title_grid_breakpoint\":\"m\",\"title_grid_width\":\"1-2\",\"title_hover_style\":\"reset\"},\"children\":[{\"type\":\"grid_item\",\"source\":{\"query\":{\"name\":\"#parent\"},\"props\":{\"title\":{\"filters\":{\"search\":\"\"},\"name\":\"title\"},\"meta\":{\"filters\":{\"search\":\"\",\"date\":\"\",\"before\":\"Closing date: \"},\"name\":\"field.event_end_date\"},\"content\":{\"filters\":{\"search\":\"\",\"limit\":160},\"arguments\":{\"show_intro_text\":true},\"name\":\"content\"},\"image\":{\"filters\":{\"search\":\"\"},\"name\":\"featuredImage.url\"},\"link\":{\"filters\":{\"search\":\"\"},\"name\":\"link\"}}}}],\"source\":{\"query\":{\"name\":\"posts.customPosts\",\"arguments\":{\"terms\":[6],\"category_operator\":\"IN\",\"post_tag_operator\":\"IN\",\"topics_operator\":\"IN\",\"users\":[],\"users_operator\":\"IN\",\"offset\":0,\"limit\":10,\"order\":\"date\",\"order_direction\":\"DESC\",\"category_include_children\":\"include\"}}}},{\"type\":\"pagination\",\"props\":{\"pagination_type\":\"numeric\",\"text_align\":\"center\"}}]}]}]},{\"type\":\"section\",\"props\":{\"css\":\".el-section {\\n    padding-left: 35px;\\n    padding-right: 35px;\\n}\\n@media screen and (min-width: 1930px) {\\n.el-section {\\n    max-width: 1660px;\\n    margin-left: auto;\\n    margin-right:  auto;\\n}\\n}\\n\\n@media screen and (max-width: 768px) {\\n.el-section {\\n    padding-left: 0;\\n    padding-right: 0;\\n}\\n}\",\"image_position\":\"center-center\",\"padding\":\"xsmall\",\"style\":\"default\",\"title_breakpoint\":\"xl\",\"title_position\":\"top-left\",\"title_rotation\":\"left\",\"vertical_align\":\"\",\"width\":\"expand\"},\"children\":[{\"type\":\"row\",\"children\":[{\"type\":\"column\",\"props\":{\"image_position\":\"center-center\",\"position_sticky_breakpoint\":\"m\"},\"children\":[{\"type\":\"headline\",\"props\":{\"content\":\"OPPORTUNITIES\",\"title_color\":\"secondary\",\"title_element\":\"div\",\"title_style\":\"h1\"}}]}]}]},{\"type\":\"section\",\"props\":{\"css\":\".el-section {\\n    padding-left: 35px;\\n    padding-right: 35px;\\n}\\n\\n@media screen and (min-width: 1930px) {\\n.el-section {\\n    max-width: 1660px;\\n    margin-left: auto;\\n    margin-right:  auto;\\n}\\n}\\n@media screen and (max-width: 768px) {\\n.el-section {\\n    padding-left: 0;\\n    padding-right: 0;\\n}\\n}\",\"image_position\":\"center-center\",\"padding\":\"none\",\"style\":\"default\",\"title_breakpoint\":\"xl\",\"title_position\":\"top-left\",\"title_rotation\":\"left\",\"vertical_align\":\"\",\"width\":\"expand\"},\"children\":[{\"type\":\"row\",\"children\":[{\"type\":\"column\",\"props\":{\"image_position\":\"center-center\",\"position_sticky_breakpoint\":\"m\"},\"children\":[{\"type\":\"html\",\"props\":{\"content\":\"\n\n<div class=\\\"container-box\\\">\\n    \n\n<div class=\\\"filter-box\\\">\\n        \\n        \\n        \n\n<div class=\\\"type-box\\\">\\n            \n\n<h4>Opportunity type<\\\/h4>\\n            \\n\\t    \n\n<ul>\\n                \n\n<li><input type=\\\"checkbox\\\" id=\\\"1947\\\"><label for=\\\"1947\\\">Call for proposals<\\\/label><\\\/li>\\n                \n\n<li><input type=\\\"checkbox\\\" id=\\\"1946\\\"><label for=\\\"1946\\\">Training and courses<\\\/label><\\\/li>\\n                \n\n<li><input type=\\\"checkbox\\\" id=\\\"1945\\\"><label for=\\\"1945\\\">Exchange<\\\/label><\\\/li>\\n                \n\n<li><input type=\\\"checkbox\\\" id=\\\"1944\\\"><label for=\\\"1944\\\">Events<\\\/label><\\\/li>\\n                \n\n<li><input type=\\\"checkbox\\\" id=\\\"2016\\\"><label for=\\\"2016\\\">Grants<\\\/label><\\\/li>\\n\\n            <\\\/ul>\\n        <\\\/div>\\n    \\t\n\n<div class=\\\"topics-box\\\">\\n            \n\n<h4>Topics<\\\/h4>\\n            \n\n<div class=\\\"loader-container topics_loader\\\">\\n                \n\n<div class=\\\"loader\\\"><\\\/div>\\n            <\\\/div>\\n            \n\n<ul id=\\\"topicList\\\">\\n            <\\\/ul>\\n        <\\\/div>\\n\\t<\\\/div>\\n    <!--    \n\n<div class=\\\"news_loader\\\">-->\\n    <!--        \n\n<div class=\\\"loader_n\\\"><\\\/div>-->\\n    <!--    <\\\/div>-->\\n    <\/p>\n<div class=\\\"news-container\\\">\\n        <\/p>\n<div class=\\\"news-box\\\">\\n        <\\\/div>\\n    <\\\/div>\\n\\n<\\\/div>\\n<\/p>\n<div class=\\\"pagination-container\\\">\\n    <\/p>\n<div class=\\\"pagination\\\"><\\\/div>\\n<\\\/div>\\n\\n\\n<script src=\\\"https:\\\/\\\/cdn.jsdelivr.net\\\/npm\\\/axios\\\/dist\\\/axios.min.js\\\"><\\\/script>\\n<script>\\n    let currentPage = 1;\\n    const perPage = 10;\\n    const apiUrl = \\\"https:\\\/\\\/eu4moldova.eu\\\/wp-json\\\/wp\\\/v2\\\/posts\\\";\\n    let totalPosts;\\n    let totalPages;\\n    let queryParams = new URLSearchParams(window.location.search);\\n    const topics_loader = document.querySelector('.topics_loader');\\n    \\\/\\\/ const news_loader = document.querySelector('.news_loader');\\n    \\\/\\\/ Capture the 'topics' parameter from the URL and split it into an array\\n    let topicsParam = queryParams.get('topics');\\n    let topicIds = topicsParam ? topicsParam.split(',') : [];\\n\\n    \\\/\\\/GET TOPICS\\n    function getTopics() {\\n        axios\\n            .get(\\\"https:\\\/\\\/eu4moldova.eu\\\/wp-json\\\/wp\\\/v2\\\/topics?per_page=100&lang=en&_fields=name,id\\\")\\n            .then((response) => {\\n                topics_loader.style.display = 'none';\\n                const topics = response.data;\\n                const topicList = document.getElementById(\\\"topicList\\\");\\n                topics.forEach((topic) => {\\n                    const listItem = document.createElement(\\\"li\\\");\\n                    listItem.textContent = topic.name;\\n                    listItem.dataset.topicId = topic.id; \\\/\\\/ Store topic ID in a data attribute for easy access\\n                    \\\/\\\/ Mark the topic as active if it matches any of the IDs in the topicIds array\\n                    if (topicIds.includes(topic.id.toString())) {\\n                        listItem.classList.add(\\\"active\\\");\\n                    }\\n\\n                    listItem.addEventListener(\\\"click\\\", function () {\\n                        const topicId = this.dataset.topicId;\\n                        let selectedTopics = queryParams.get(\\\"topics\\\") ? queryParams.get(\\\"topics\\\").split(',') : [];\\n                        const topicIndex = selectedTopics.indexOf(topicId);\\n\\n                        \\\/\\\/ Toggle topic selection\\n                        if (topicIndex > -1) {\\n                            \\\/\\\/ Topic is already selected, remove it\\n                            selectedTopics.splice(topicIndex, 1);\\n                            this.classList.remove(\\\"active\\\");\\n                        } else {\\n                            \\\/\\\/ Topic is not selected, add it\\n                            selectedTopics.push(topicId);\\n                            this.classList.add(\\\"active\\\");\\n                        }\\n\\n                        \\\/\\\/ Update URL parameters\\n                        if (selectedTopics.length > 0) {\\n                            queryParams.set(\\\"topics\\\", selectedTopics.join(','));\\n                        } else {\\n                            queryParams.delete(\\\"topics\\\");\\n                        }\\n                        queryParams.set(\\\"page\\\", 1);\\n                        history.replaceState(null, null, \\\"?\\\" + queryParams.toString());\\n                        clearPosts();\\n                        fetchData(1);\\n                    });\\n                    topicList.appendChild(listItem);\\n                });\\n            })\\n            .catch((error) => {\\n                console.error(\\\"Error fetching topics:\\\", error);\\n            });\\n\\n        topics_loader.style.display = 'flex';\\n    }\\n\\n    \\\/\\\/GET POSTS\\n    function fetchData(page) {\\n        renderSkeletons(); \\\/\\\/ Display skeletons before fetching data\\n        let url;\\n        const params = new URLSearchParams(window.location.search);\\n        const topics = params.get('topics');\\n        const pag = params.get('page');\\n        const categories = params.get('categories')\\n\\n        if (topics) {\\n            url = `${apiUrl}?categories=${categories ? categories : 6}&topics=${topics}&per_page=${perPage}&page=${pag ? pag : page}&_embed&lang=en&_fields=title,excerpt,acf.event_end_date,link,_links.wp:featuredmedia,_embedded.wp:featuredmedia`;\\n        } else {\\n            url = `${apiUrl}?categories=${categories ? categories : 6}&per_page=${perPage}&page=${pag ? pag : page}&_embed&lang=en&_fields=title,excerpt,acf.event_end_date,link,_links.wp:featuredmedia,_embedded.wp:featuredmedia`;\\n        }\\n\\n        axios\\n            .get(url)\\n            .then((response) => {\\n                \\\/\\\/ news_loader.style.display = 'none';\\n                renderPosts(response.data);\\n                totalPosts = response.headers[\\\"x-wp-total\\\"];\\n                totalPages = Math.ceil(totalPosts \\\/ perPage);\\n                renderPagination();\\n            })\\n            .catch((error) => {\\n                console.error(\\\"Error fetching data:\\\", error);\\n            });\\n        \\\/\\\/ news_loader.style.display = 'flex';\\n    }\\n\\n    function renderPagination() {\\n        const paginationContainer = document.querySelector(\\\".pagination\\\");\\n        paginationContainer.innerHTML = \\\"\\\";\\n        const queryParams = new URLSearchParams(window.location.search);\\n        const currentPage = Number(queryParams.get(\\\"page\\\")) || 1;\\n        const visiblePages = 5;\\n        const halfVisiblePages = Math.floor(visiblePages \\\/ 2);\\n        let startPage = Math.max(1, currentPage - halfVisiblePages);\\n        let endPage = Math.min(startPage + visiblePages - 1, totalPages);\\n\\n        if (endPage - startPage + 1 < visiblePages) {\\n            if (currentPage > totalPages \\\/ 2) {\\n                startPage = Math.max(1, totalPages - visiblePages + 1);\\n            } else {\\n                startPage = Math.max(1, endPage - visiblePages + 1);\\n            }\\n        }\\n\\n        if (startPage > 1) {\\n            const firstPage = document.createElement(\\\"div\\\");\\n            firstPage.classList.add(\\\"page\\\");\\n            firstPage.textContent = \\\"1\\\";\\n            firstPage.addEventListener(\\\"click\\\", () => {\\n                queryParams.set(\\\"page\\\", 1);\\n                history.replaceState(null, null, \\\"?\\\" + queryParams.toString());\\n                fetchData(1);\\n            });\\n            paginationContainer.appendChild(firstPage);\\n\\n            if (startPage > 2) {\\n                const prevEllipsis = document.createElement(\\\"div\\\");\\n                prevEllipsis.textContent = \\\"...\\\";\\n                prevEllipsis.classList.add(\\\"ellipsis\\\");\\n                paginationContainer.appendChild(prevEllipsis);\\n            }\\n        }\\n\\n        for (let i = startPage; i <= endPage; i++) {\\n            const pageLink = document.createElement(\\\"div\\\");\\n            pageLink.classList.add(\\\"page\\\");\\n            pageLink.textContent = i;\\n            if (i === currentPage) {\\n                pageLink.classList.add(\\\"active\\\");\\n            }\\n            pageLink.addEventListener(\\\"click\\\", () => {\\n                clearPosts();\\n                queryParams.set(\\\"page\\\", i);\\n                history.replaceState(null, null, \\\"?\\\" + queryParams.toString());\\n                fetchData(i);\\n                document.body.scrollTop = 0; \\\/\\\/ For Safari\\n                document.documentElement.scrollTop = 0; \\\/\\\/ For Chrome, Firefox, IE and Opera\\n            });\\n            paginationContainer.appendChild(pageLink);\\n        }\\n\\n        if (endPage < totalPages) {\\n            if (endPage < totalPages - 1) {\\n                const nextEllipsis = document.createElement(\\\"div\\\");\\n                nextEllipsis.textContent = \\\"...\\\";\\n                nextEllipsis.classList.add(\\\"ellipsis\\\");\\n                paginationContainer.appendChild(nextEllipsis);\\n            }\\n\\n            const lastPage = document.createElement(\\\"div\\\");\\n            lastPage.classList.add(\\\"page\\\");\\n            lastPage.textContent = totalPages;\\n            lastPage.addEventListener(\\\"click\\\", () => {\\n                queryParams.set(\\\"page\\\", totalPages);\\n                history.replaceState(null, null, \\\"?\\\" + queryParams.toString());\\n                fetchData(totalPages);\\n            });\\n            paginationContainer.appendChild(lastPage);\\n        }\\n    }\\n\\n\\n    function renderPosts(posts) {\\n        const newsContainer = document.querySelector(\\\".news-container\\\");\\n\\n        newsContainer.innerHTML = \\\"\\\";\\n\\n        posts.forEach((post) => {\\n            const newsBox = document.createElement(\\\"div\\\");\\n            newsBox.classList.add(\\\"news-box\\\");\\n\\n            const imageLayout = document.createElement(\\\"div\\\");\\n            imageLayout.classList.add(\\\"image-layout\\\");\\n\\n            const imgElement = document.createElement(\\\"img\\\");\\n            imgElement.classList.add(\\\"news-img\\\");\\n            imgElement.src = post._embedded[\\\"wp:featuredmedia\\\"] ? post._embedded[\\\"wp:featuredmedia\\\"][0]?.source_url : '';\\n            imgElement.alt = \\\"\\\";\\n\\n            imageLayout.appendChild(imgElement);\\n            newsBox.appendChild(imageLayout);\\n\\n            const content = document.createElement(\\\"div\\\");\\n            content.classList.add(\\\"content\\\");\\n\\n            const layoutDiv = document.createElement(\\\"div\\\");\\n            layoutDiv.classList.add(\\\"layout\\\");\\n\\n            if (post.acf.event_end_date) {\\n                const dateParagraph = document.createElement(\\\"p\\\");\\n                dateParagraph.classList.add(\\\"date\\\");\\n                let event_end_date = post.acf.event_end_date;\\n                let end_date;\\n                let dateObj = new Date(event_end_date.replace(\\\/(\\\\d{4})(\\\\d{2})(\\\\d{2})\\\/, '$1-$2-$3'));\\n                let options = {month: 'long', day: 'numeric', year: 'numeric'};\\n                end_date = 'CLOSING DATE: ' + dateObj.toLocaleDateString('en-GB', options).toUpperCase();\\n                dateParagraph.textContent = end_date;\\n                layoutDiv.appendChild(dateParagraph);\\n            }\\n\\n\\n            const titleParagraph = document.createElement(\\\"p\\\");\\n            titleParagraph.classList.add(\\\"title\\\");\\n            const tempD = document.createElement(\\\"div\\\");\\n            tempD.innerHTML = post.title.rendered;\\n            titleParagraph.textContent = tempD.textContent;\\n\\n            const descriptionParagraph = document.createElement(\\\"p\\\");\\n            descriptionParagraph.classList.add(\\\"description\\\");\\n            const tempDiv = document.createElement(\\\"div\\\");\\n            tempDiv.innerHTML = post.excerpt.rendered;\\n            descriptionParagraph.textContent = tempDiv.textContent;\\n            document.body.appendChild(descriptionParagraph);\\n\\n            const seeMoreLink = document.createElement(\\\"a\\\");\\n            seeMoreLink.href = post.link;\\n            seeMoreLink.textContent = \\\"See more\\\";\\n\\n          \\n                        layoutDiv.appendChild(titleParagraph);\\n            layoutDiv.appendChild(descriptionParagraph);\\n            content.appendChild(layoutDiv);\\n            content.appendChild(seeMoreLink);\\n            newsBox.appendChild(content);\\n\\n            const postLink = document.createElement(\\\"a\\\");\\n            postLink.href = post.link;\\n            postLink.appendChild(newsBox);\\n            newsContainer.appendChild(postLink);\\n        });\\n    }\\n\\n    const checkboxes = document.querySelectorAll('.type-box input[type=\\\"checkbox\\\"]');\\n    const categoryId6 = '6';\\n\\n    function getPostsByCheckboxCategory() {\\n        const selectedCategories = Array.from(checkboxes)\\n            .filter(checkbox => checkbox.checked && checkbox.id !== categoryId6)\\n            .map(checkbox => checkbox.id);\\n        \\\/\\\/ if (!selectedCategories.includes(categoryId6)) {\\n        \\\/\\\/     selectedCategories.push(categoryId6);\\n        \\\/\\\/ }\\n        clearPosts();\\n        const categoriesParam = selectedCategories.join(',');\\n        queryParams.set(\\\"categories\\\", categoriesParam);\\n        queryParams.set(\\\"page\\\", 1);\\n        history.replaceState(null, null, \\\"?\\\" + queryParams.toString());\\n        fetchData(1);\\n    }\\n\\n    checkboxes.forEach(checkbox => {\\n        checkbox.addEventListener('change', getPostsByCheckboxCategory);\\n    });\\n\\n    document.addEventListener('DOMContentLoaded', function () {\\n        const categoriesParam = queryParams.get('categories');\\n        if (categoriesParam) {\\n            const categoryIds = categoriesParam.split(',');\\n            categoryIds.forEach(id => {\\n                const checkbox = document.getElementById(id);\\n                if (checkbox) {\\n                    checkbox.checked = true;\\n                }\\n            });\\n        }\\n    });\\n\\n    function renderSkeletons(count = 5) {\\n        const newsContainer = document.querySelector(\\\".news-container\\\");\\n        newsContainer.innerHTML = \\\"\\\"; \\\/\\\/ Clear the news container\\n\\n        for (let i = 0; i < count; i++) {\\n            const skeletonWrapper = document.createElement(\\\"div\\\");\\n            skeletonWrapper.classList.add(\\\"news-box\\\");\\n            skeletonWrapper.style.display = \\\"flex\\\";\\n            skeletonWrapper.style.alignItems = \\\"flex-start\\\";\\n\\n            const skeletonImage = document.createElement(\\\"div\\\");\\n            skeletonImage.classList.add(\\\"skeleton-img\\\");\\n            skeletonWrapper.appendChild(skeletonImage);\\n\\n            const skeletonContent = document.createElement(\\\"div\\\");\\n            skeletonContent.style.flexGrow = \\\"1\\\";\\n\\n            const skeletonTitle = document.createElement(\\\"div\\\");\\n            skeletonTitle.classList.add(\\\"skeleton\\\", \\\"skeleton-title\\\");\\n            skeletonContent.appendChild(skeletonTitle);\\n\\n            const skeletonDescription = document.createElement(\\\"div\\\");\\n            skeletonDescription.classList.add(\\\"skeleton\\\", \\\"skeleton-description\\\");\\n            skeletonContent.appendChild(skeletonDescription);\\n\\n            const skeletonSeeMore = document.createElement(\\\"div\\\");\\n            skeletonSeeMore.classList.add(\\\"skeleton\\\", \\\"skeleton-see-more\\\");\\n            skeletonContent.appendChild(skeletonSeeMore);\\n\\n            skeletonWrapper.appendChild(skeletonContent);\\n            newsContainer.appendChild(skeletonWrapper);\\n        }\\n    }\\n\\n    function clearPosts() {\\n        renderSkeletons(5); \\\/\\\/ Optionally pass the number of skeletons you want to render\\n\\n        const postsContainer = document.querySelector(\\\".news-container\\\");\\n        postsContainer.innerHTML = \\\"\\\";\\n    }\\n\\n    getTopics();\\n    fetchData(currentPage);\\n\\n<\\\/script>\\n\",\"css\":\"\\n    .container-box {\\n        display: flex;\\n        \\n        margin-top: 0px;\\n        position: relative;\\n    }\\n\\n    .filter-box {\\n        flex-basis: 25%;\\n    }\\n\\n    .news-container {\\n        flex-basis: 74%;\\n        margin-top: 0px;\\n        padding-left: 0px;\\n    }\\n\\n    .news-container a {\\n        text-decoration: none;\\n    }\\n\\n\\n\\n    .topics-box ul {\\n        display: flex;\\n        flex-wrap: wrap;\\n        margin-top: 10px;\\n        margin-bottom: 32px;\\n        padding: 0;\\n    }\\n\\n    .topics-box ul li {\\n        text-wrap: nowrap;\\n        border: 1px solid #817d7d;\\n        border-radius: 10px;\\n        padding: 10px 25px;\\n        line-height: normal;\\n        margin-right: 5px;\\n        display: flex;\\n        align-items: center;\\n        justify-content: center;    \\n        margin-top: 5px !important;\\n        cursor: pointer;\\n    }\\n\\n    .type-box ul {\\n        list-style-type: none;\\n        padding: 0;\\n        margin-top: 10px;\\n    }\\n\\n    .type-box li {\\n        display: flex;\\n        align-items: center;\\n        margin-bottom: 5px;\\n    }\\n\\n    .type-box input[type=\\\"checkbox\\\"] {\\n        margin-right: 10px;\\n        margin-bottom: 5px;\\n    }\\n\\n  \\n\\n    .news-box {\\n        display: flex;\\n        margin-bottom: 35px;\\n    }\\n\\n    .news-box .news-img {\\n        border-radius: 5px;\\n        width: 100%;\\n        height: 100%;\\n        object-fit: cover;\\n    }\\n\\n    .news-box .image-layout {\\n        min-width: 290px;\\n        max-width: 290px;\\n        height: 171px;\\n        margin-right: 20px;\\n        margin-left: 20px;\\n    }\\n\\n    .news-box .content p {\\n        margin: 0;\\n    }\\n\\n    .news-box .content .date {\\n        font-size: 9px;\\n        color: #817d7d;\\n        padding-bottom: 10px;\\n        font-weight: 800;\\n    }\\n\\n    .news-box .content .title {\\n        \\n        font-size: 25px;\\n        line-height: 32px;\\n        color: #413e3e;\\n        padding-bottom: 10px;\\n        font-weight: 800;\\n    }\\n\\n    .news-box .content .description {\\n        \\n       \\n        line-height: normal;\\n        color: #413e3e;\\n        padding-bottom: 20px;\\n        overflow: hidden;\\n        text-overflow: ellipsis;\\n        display: -webkit-box;\\n        -webkit-box-orient: vertical;\\n        -webkit-line-clamp: 3;\\n        max-height: 40px;\\n    }\\n\\n    .news-box .content {\\n        display: flex;\\n        flex-direction: column;\\n        justify-content: space-between;\\n    }\\n\\n    .news-box .content a {\\n        \\n        font-size: 17px;\\n        line-height: normal;\\n        color: #8C8888;\\n        text-decoration: none;\\n        display: flex;\\n        align-items: center;\\n    }\\n\\n    .news-box .content a img {\\n        margin-left: 20px;\\n    }\\n\\n    .pagination-container {\\n        display: flex;\\n    }\\n\\n    .pagination {\\n        flex-basis: 74%;\\n        margin-top: 30px;\\n        padding-left: 30px;\\n        display: flex;\\n        margin-left: auto;\\n    }\\n\\n    .pagination .page {\\n        margin-right: 5px;\\n        cursor: pointer;\\n       \\n    \\n        font-size: 20px;\\n        line-height: 30px;\\n        color: #817d7d;\\n    }\\n\\n    .pagination .active {\\n        color: #000000 !important;\\n        border-bottom: 1px solid black;\\n    }\\n\\n    .divide-items {\\n        width: 100%;\\n        height: 1px;\\n        background: #F1F1F1;\\n    }\\n\\n    .topics_loader {\\n        display: none;\\n    }\\n\\n    \\\/*.news_loader {*\\\/\\n    \\\/*    display: none;*\\\/\\n    \\\/*    position: absolute;*\\\/\\n    \\\/*    top: 50%;*\\\/\\n    \\\/*    left: 50%;*\\\/\\n    \\\/*    transform: translate(-50%, -50%);*\\\/\\n    \\\/*}*\\\/\\n\\n    \\\/*.news_loader .loader_n {*\\\/\\n    \\\/*    width: 40px;*\\\/\\n    \\\/*    height: 40px;*\\\/\\n    \\\/*    border: 6px solid #f3f3f3;*\\\/\\n    \\\/*    border-top: 6px solid #003398;*\\\/\\n    \\\/*    border-radius: 50%;*\\\/\\n    \\\/*    animation: spin 1s linear infinite;*\\\/\\n    \\\/*    margin: auto;*\\\/\\n    \\\/*}*\\\/\\n\\n    .loader {\\n        border: 4px solid #f3f3f3;\\n        border-top: 4px solid #003398;\\n        border-radius: 50%;\\n        width: 20px;\\n        height: 20px;\\n        animation: spin 1s linear infinite;\\n        margin: auto;\\n    }\\n\\n    @keyframes spin {\\n        0% {\\n            transform: rotate(0deg);\\n        }\\n        100% {\\n            transform: rotate(360deg);\\n        }\\n    }\\n\\n    @media screen and (max-width: 1024px) {\\n        .container-box {\\n            display: grid;\\n        }\\n\\n        .news-container {\\n            margin: 0;\\n            padding: 0;\\n        }\\n\\n      \\n    }\\n\\n    @media screen and (max-width: 768px) {\\n        .news-box .image-layout {\\n            min-width: 230px;\\n            max-width: 230px;\\n            height: 150px;\\n            margin-right: 10px;\\n        }\\n\\n        .news-box .content .title {\\n            font-size: 13px;\\n            line-height: normal;\\n        }\\n\\n        .news-box .content .description {\\n            font-size: 11px;\\n            max-height: 20px;\\n        }\\n\\n        .news-box .content a {\\n            font-size: 11px;\\n            margin-top: 10px;\\n        }\\n\\n        .pagination .page {\\n            font-size: 13px;\\n        }\\n\\n        .topics-box ul li {\\n            padding: 5px 15px;\\n        }\\n\\n        .news-box .image-layout {\\n            margin-bottom: 10px;\\n        }\\n    }\\n\\n    @media screen and (max-width: 500px) {\\n        .news-box {\\n            display: grid;\\n        }\\n\\n        .news-box .image-layout {\\n            min-width: 100%;\\n            max-width: 100%;\\n            height: 240px;\\n            margin-right: 10px;\\n        }\\n\\n        .container-box {\\n            margin-top: 20px;\\n        }\\n\\n        .topics-box h2 {\\n            font-size: 15px;\\n        }\\n\\n        .type-box h2 {\\n            font-size: 15px;\\n            margin-bottom: 10px;\\n            margin-top: 20px;\\n        }\\n\\n        .topics-box ul {\\n            margin-bottom: 20px;\\n        }\\n\\n        .type-box ul li {\\n            font-size: 12px;\\n        }\\n\\n        .type-box input[type=\\\"checkbox\\\"] {\\n            margin-bottom: 3px;\\n        }\\n    }\\n\\n    \\\/* Skeleton Loader Styles *\\\/\\n    .skeleton {\\n        background-color: #eee;\\n        border-radius: 4px;\\n        margin: 8px 0;\\n        animation: shimmer 1.5s infinite linear;\\n    }\\n\\n    .skeleton-img, .skeleton-title, .skeleton-description, .skeleton-see-more {\\n        height: 20px;\\n        background-color: #eee;\\n        animation: shimmer 1.5s infinite linear;\\n    }\\n\\n    .skeleton-img {\\n        width: 100%;\\n        max-width: 290px;\\n        height: 171px;\\n        margin-right: 20px;\\n        border-radius: 5px;\\n    }\\n\\n    .skeleton-title {\\n        width: 70%;\\n        height: 25px;\\n    }\\n\\n    .skeleton-description {\\n        width: 90%;\\n        height: 20px;\\n    }\\n\\n    .skeleton-see-more {\\n        width: 80px;\\n        height: 20px;\\n        border-radius: 10px;\\n    }\\n\\n    @keyframes shimmer {\\n        0% {\\n            background-color: #e0e0e0;\\n        }\\n        50% {\\n            background-color: #c0c0c0;\\n        }\\n        100% {\\n            background-color: #e0e0e0;\\n        }\\n    }\\n\\n    \\\/* Mobile adjustments *\\\/\\n    @media screen and (max-width: 768px) {\\n        .skeleton-img {\\n            max-width: 100%; \\\/* Full width on mobile *\\\/\\n            height: 150px; \\\/* Adjust height as needed *\\\/\\n            margin-right: 0;\\n            margin-bottom: 10px;\\n        }\\n\\n        .skeleton-content {\\n            width: 100%; \\\/* Full width for content *\\\/\\n            padding: 0 15px; \\\/* Add some padding *\\\/\\n        }\\n\\n        .skeleton-title, .skeleton-description, .skeleton-see-more {\\n            width: 90%; \\\/* Adjust width for smaller screens *\\\/\\n        }\\n    }\\n\\n\"}}]}]}]}],\"version\":\"4.4.7\"} --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Opportunities OPPORTUNITIES Opportunity type Call for proposals Training and courses Exchange Events Grants Topics<\/p>\n","protected":false},"author":35,"featured_media":12407,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-115658","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Opportunities - EU for Moldova<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/eu4moldova.eu\/opportunities\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Opportunities - EU for Moldova\" \/>\n<meta property=\"og:description\" content=\"Opportunities OPPORTUNITIES Opportunity type Call for proposals Training and courses Exchange Events Grants Topics\" \/>\n<meta property=\"og:url\" content=\"https:\/\/eu4moldova.eu\/opportunities\/\" \/>\n<meta property=\"og:site_name\" content=\"EU for Moldova\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/EUDelegationMoldova\/\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-19T06:11:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/eu4moldova.eu\/wp-content\/uploads\/youth-computer-opportunities-technology.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1\" \/>\n\t<meta property=\"og:image:height\" content=\"1\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@euinmoldova\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/\",\"url\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/\",\"name\":\"Opportunities - EU for Moldova\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/eu4moldova.eu\\\/wp-content\\\/uploads\\\/youth-computer-opportunities-technology.jpg\",\"datePublished\":\"2024-02-13T12:43:18+00:00\",\"dateModified\":\"2024-11-19T06:11:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/#primaryimage\",\"url\":\"https:\\\/\\\/eu4moldova.eu\\\/wp-content\\\/uploads\\\/youth-computer-opportunities-technology.jpg\",\"contentUrl\":\"https:\\\/\\\/eu4moldova.eu\\\/wp-content\\\/uploads\\\/youth-computer-opportunities-technology.jpg\",\"caption\":\"youth computer opportunities technology\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/opportunities\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/eu4moldova.eu\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Opportunities\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/#website\",\"url\":\"https:\\\/\\\/eu4moldova.eu\\\/\",\"name\":\"EU for Moldova\",\"description\":\"European Union for the Republic of Moldova\",\"publisher\":{\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/eu4moldova.eu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/#organization\",\"name\":\"European Union in the Republic of Moldova\",\"url\":\"https:\\\/\\\/eu4moldova.eu\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/eu4moldova.eu\\\/wp-content\\\/uploads\\\/eu-moldova-logo-1.png\",\"contentUrl\":\"https:\\\/\\\/eu4moldova.eu\\\/wp-content\\\/uploads\\\/eu-moldova-logo-1.png\",\"width\":5057,\"height\":870,\"caption\":\"European Union in the Republic of Moldova\"},\"image\":{\"@id\":\"https:\\\/\\\/eu4moldova.eu\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/EUDelegationMoldova\\\/\",\"https:\\\/\\\/x.com\\\/euinmoldova\",\"https:\\\/\\\/www.instagram.com\\\/euinmoldova\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/EUDelegationMoldova\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Opportunities - EU for Moldova","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/eu4moldova.eu\/opportunities\/","og_locale":"en_US","og_type":"article","og_title":"Opportunities - EU for Moldova","og_description":"Opportunities OPPORTUNITIES Opportunity type Call for proposals Training and courses Exchange Events Grants Topics","og_url":"https:\/\/eu4moldova.eu\/opportunities\/","og_site_name":"EU for Moldova","article_publisher":"https:\/\/www.facebook.com\/EUDelegationMoldova\/","article_modified_time":"2024-11-19T06:11:49+00:00","og_image":[{"url":"https:\/\/eu4moldova.eu\/wp-content\/uploads\/youth-computer-opportunities-technology.jpg","width":1,"height":1,"type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@euinmoldova","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/eu4moldova.eu\/opportunities\/","url":"https:\/\/eu4moldova.eu\/opportunities\/","name":"Opportunities - EU for Moldova","isPartOf":{"@id":"https:\/\/eu4moldova.eu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/eu4moldova.eu\/opportunities\/#primaryimage"},"image":{"@id":"https:\/\/eu4moldova.eu\/opportunities\/#primaryimage"},"thumbnailUrl":"https:\/\/eu4moldova.eu\/wp-content\/uploads\/youth-computer-opportunities-technology.jpg","datePublished":"2024-02-13T12:43:18+00:00","dateModified":"2024-11-19T06:11:49+00:00","breadcrumb":{"@id":"https:\/\/eu4moldova.eu\/opportunities\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/eu4moldova.eu\/opportunities\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/eu4moldova.eu\/opportunities\/#primaryimage","url":"https:\/\/eu4moldova.eu\/wp-content\/uploads\/youth-computer-opportunities-technology.jpg","contentUrl":"https:\/\/eu4moldova.eu\/wp-content\/uploads\/youth-computer-opportunities-technology.jpg","caption":"youth computer opportunities technology"},{"@type":"BreadcrumbList","@id":"https:\/\/eu4moldova.eu\/opportunities\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/eu4moldova.eu\/en\/"},{"@type":"ListItem","position":2,"name":"Opportunities"}]},{"@type":"WebSite","@id":"https:\/\/eu4moldova.eu\/#website","url":"https:\/\/eu4moldova.eu\/","name":"EU for Moldova","description":"European Union for the Republic of Moldova","publisher":{"@id":"https:\/\/eu4moldova.eu\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/eu4moldova.eu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/eu4moldova.eu\/#organization","name":"European Union in the Republic of Moldova","url":"https:\/\/eu4moldova.eu\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/eu4moldova.eu\/#\/schema\/logo\/image\/","url":"https:\/\/eu4moldova.eu\/wp-content\/uploads\/eu-moldova-logo-1.png","contentUrl":"https:\/\/eu4moldova.eu\/wp-content\/uploads\/eu-moldova-logo-1.png","width":5057,"height":870,"caption":"European Union in the Republic of Moldova"},"image":{"@id":"https:\/\/eu4moldova.eu\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/EUDelegationMoldova\/","https:\/\/x.com\/euinmoldova","https:\/\/www.instagram.com\/euinmoldova","https:\/\/www.youtube.com\/c\/EUDelegationMoldova"]}]}},"_links":{"self":[{"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/pages\/115658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/comments?post=115658"}],"version-history":[{"count":137,"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/pages\/115658\/revisions"}],"predecessor-version":[{"id":129109,"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/pages\/115658\/revisions\/129109"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/media\/12407"}],"wp:attachment":[{"href":"https:\/\/eu4moldova.eu\/en\/wp-json\/wp\/v2\/media?parent=115658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}