{"id":834,"date":"2022-04-27T13:40:20","date_gmt":"2022-04-27T13:40:20","guid":{"rendered":"https:\/\/www.ipleiria.pt\/estg\/?page_id=834"},"modified":"2025-01-20T17:14:42","modified_gmt":"2025-01-20T17:14:42","slug":"lorem-ipsum-3","status":"publish","type":"page","link":"https:\/\/www.ipleiria.pt\/estg\/inovar\/lorem-ipsum-3\/","title":{"rendered":"Lorem ipsum"},"content":{"rendered":"    <section aria-describedby=\"postss-section-title\">\n        <h2 id=\"postss-section-title\" class=\"sr-only\">Pesquisa de not\u00edcias<\/h2>\n        <form id=\"postss-search\" name=\"postss-search\" class=\"postss-as-list\" data-api-url=\"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\" aria-controls=\"postss-list\">\n                        <div class=\"container\">\n                <div class=\"row\">\n                                        <div class=\"col-sm p-0 mb-1\">\n                        <label for=\"category\" class=\"sr-only\">Tipo: <\/label>\n                        <select id=\"category\" name=\"categories\" class=\"custom-select custom-select-sm posts-taxonomy-filter disabled-filter\" data-api-url=\"${apiUrl}\/${taxonomy}?type=posts\" data-include=\"evento,aula-aberta,seminario,workshop\" data-exclude=\"without-category\" data-selected=\"evento\" style=\"-webkit-appearance: none;-moz-appearance: none; appearance: none;\">\n                            <option value=\"43\" class=\"font-weight-bold taxonomy-label\">Tipo<\/option>\n                        <\/select>\n                    <\/div>\n                    \n                    <div class=\"col-sm mb-1 pl-2 pr-2 pr-sm-0 d-flex flex-sm-grow-0 justify-content-center mt-2 mt-sm-0\">\n                        <div class=\"btn-group postss-layout-btn-group\" role=\"radiogroup\" aria-label=\"Disposi\u00e7\u00e3o\">\n                            <button type=\"button\" role=\"radio\" aria-checked=\"false\" id=\"postss-as-list\" class=\"bg-transparent postss-layout-btn btn btn-light btn-sm active\">\n                                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" height=\"100%\" width=\"100%\" viewBox=\"0 -256 1800 1800\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M0 984h1800v400H0zm0-520h1800v400H0zM0-56h1800v400H0z\"\/><\/svg>\n                                <span class=\"sr-only\">Lista<\/span><\/button>\n                            <input type=\"hidden\" name=\"postss-layout\" id=\"postss-layout\" value=\"postss-as-list\">\n                        <\/div>\n                    <\/div>\n                <\/div>\n                \n                <div class=\"row\">\n                    <label for=\"search-field\" class=\"sr-only\">Campo de pesquisa<\/label>\n                    <input id=\"search-field\" type=\"text\" class=\"postss-search-input form-control form-control-xs mt-2 posts-search-filter disabled-filter\" name=\"search\" value=\"\" placeholder=\"Pesquisa...\" data-api-url=\"${apiUrl}\/posts\" >\n                <\/div>\n                \n                <input style=\"display: none;\" type=\"submit\" value=\"Executar pesquisa\">\n            <\/div>\n            \n            <div id=\"postss-container\">\n                <h3 id=\"postss-list-title\" class=\"postss-list-title sr-only\">Not\u00edcias<span class=\"sr-only\">: <\/span><\/h3>\n                <div id=\"postss-list\" class=\"\" aria-live=\"polite\" >\n                    <div class=\"container\">A carregar&#8230;<\/div>\n                <\/div>\n                <div>\n                    <div class=\"wp-block-button is-style-theme-button-solid mt-4 mt-lg-0 text-center\">\n                        <button id=\"loading-button\" class=\"hide-if-no-js wp-block-button__link\"><span class=\"loading-label\">Mostrar mais<\/span>\u00a0<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/form>\n    <\/section>\n    <script>\n        (function(isSupported){\n        'use strict';\n        \n        document.head.insertAdjacentHTML(\"beforeend\", `\n            <style>\n                #postss-search .posts-search-filter,\n                #postss-search .posts-taxonomy-filter{\n                    transition: opacity 0.5s;\n                    font-size: 1rem;\n                    text-transform: uppercase;\n                }\n                #postss-search .disabled-filter{\n                    visibility: hidden;\n                    opacity: 0;\n                }\n                #postss-search .enabled-filter{\n                    visibility: visible;\n                    opacity: 1;\n                }\n                \n                #postss-search .postss-layout-btn-group{\n                    padding-top: calc(0.25rem - 1px);\n                }\n                #postss-search .postss-layout-btn svg{\n                    fill: #030303;\n                    height: calc(1.5em - 0.25rem);\n                    width: auto;\n                    pointer-events: none;\n                }\n                #postss-search .btn-light:not(:disabled):not(.disabled):active, \n                #postss-search .show>.btn-light.dropdown-toggle {\n                    color: #FFFFFF;\n                    background-color: #030303;\n                    border-color: #000000;\n                }\n                \n                #postss-search .btn-light:not(:disabled):not(.disabled):active svg{\n                    fill: #FFFFFF\n                }\n                \n                #postss-search .postss-list-title{\n                    background-color: #f2f2f2;\n                    color: #666666;\n                    vertical-align: middle;\n                    padding: .75rem;\n                    font-size: 1rem;\n                    margin: 40px 0 30px;\n                }#postss-list{\n                    min-height: 60px;\n                }\n                .loading{\n                    position: relative;\n                }\n                                .loading:after {\n                    content: '';\n                    display: inline-block;\n                    width: 1.5rem;\n                    height: 1.5rem;\n                    vertical-align: text-bottom;\n                    border: .25em solid currentColor;\n                    border-right-color: transparent;\n                    border-radius: 50%;\n                    animation: spinner-border .75s linear infinite;\n                    position: absolute;\n                    z-index: 3;\n                    left: calc(50% - 0.75rem);\n                    top: 0.75rem;\n                }.postss-as-list #postss-list ul{\n                    list-style: none;\n                    padding: 0;\n                }\n                .postss-as-list #postss-list ul li {\n                    display: flex;\n                    flex-direction: column;\n                }\n                .postss-as-list #postss-list a {\n                    line-height: 1.7rem;\n                    padding: 15px 75px 15px 0;\n                    margin: 0;\n                    border-bottom: 1px solid var(--gray);\n                    font-weight: 700;\n                    display: flex;\n                    flex-direction: column;\n                }\n                .postss-as-list #postss-list a,\n                .postss-as-list #postss-list a:link,\n                .postss-as-list #postss-list a:visited{\n                    color: #545454;\n                    text-decoration: none;\n                }\n                .postss-as-list #postss-list a:hover,\n                .postss-as-list #postss-list a:focus,\n                .postss-as-list #postss-list a:active,\n                .postss-as-list #postss-list a:hover .meta,\n                .postss-as-list #postss-list a:focus .meta,\n                .postss-as-list #postss-list a:active .meta{\n                    color: #1B7B3E;\n                }\n                .postss-as-list #postss-list a:hover:before,\n                .postss-as-list #postss-list a:focus:before,\n                .postss-as-list #postss-list a:active:before{\n                    border-color: #1B7B3E;\n                }\n                .postss-as-list #postss-list a:before {\n                    display: block;\n                    width: 15px;\n                    height: 15px;\n                    border-color: var(--dark);\n                    border-right: 1px solid;\n                    border-top: 1px solid;\n                    transform: rotate(45deg);\n                    margin: 20px;\n                    content: ' ';\n                    position: absolute;\n                    right: 0;\n                    top: calc(50% - 23px);\n                }\n                \n                .postss-as-list #postss-list a .title{\n                    display: block;\n                    font-weight: 600;\n                    text-transform: none;\n                    font-size: 1.6rem;\n                    line-height: 2.2rem;\n                    order: 2;\n                    color: var(--dark);\n                }\n                .postss-as-list #postss-list a .meta{\n                    display: flex;\n                    color: #545454;;\n                    order: 1;\n                    gap: 0 15px;\n                    margin-bottom: 0.4rem;\n                }\n                .postss-as-list #postss-list a .meta .taxonomy{\n                    font-size: 0.9rem;\n                    line-height: 1rem;\n                }\n                .postss-as-list #postss-list a .meta .taxonomy-label,\n                .postss-as-list #postss-list a .date-label,\n                .postss-as-list #postss-list a .excerpt-label{\n                    width: 1px;\n                    height: 1px;\n                    padding: 0;\n                    overflow: hidden;\n                    clip: rect(0, 0, 0, 0);\n                    white-space: nowrap;\n                    border: 0;\n                }\n                .postss-as-list #postss-list a .meta .taxonomies-separator {\n                    padding: 0;\n                }\n                .postss-as-list #postss-list a .meta .taxonomy:not([style*=\"display:none\"]):last-child:after,\n                .postss-as-list #postss-list a .posts-thumbnail-wrapper{\n                    display: none;\n                }\n                \n                .postss-as-list #postss-list a .taxonomy.taxonomy-label,\n                .postss-as-list #postss-list a .date-label,\n                .postss-as-list #postss-list a .excerpt-label{\n                    position: absolute;\n                    width: 1px;\n                    height: 1px;\n                    padding: 0;\n                    overflow: hidden;\n                    clip: rect(0, 0, 0, 0);\n                    white-space: nowrap;\n                    border: 0;\n                }\n                .postss-as-list #postss-list a .taxonomy.taxonomy-value {\n                    vertical-align: middle;\n                    font-weight: normal;\n                    text-transform: uppercase;\n                    margin-top: 0.6rem;\n                    white-space: nowrap;\n                    text-overflow: ellipsis;\n                    overflow: hidden;\n                    color: var(--dark);\n                    padding: 0.4rem 0;\n                }\n                .postss-as-list #postss-list a .taxonomy.taxonomy-categories-value {\n                    background-color: #1B7B3E;\n                    color: var(--white);\n                    padding: 0.4rem 0.6rem !important;\n                    font-size: 0.8rem;\n                }\n                .postss-as-list #postss-list a .taxonomy-tags-wrapper{\n                    flex-grow: 1;\n                    min-width: 0;\n                }\n                .postss-as-list #postss-list a .date-wrapper{\n                    order: 3;\n                    margin: 0.4rem 0 0;\n                }\n                .postss-as-list #postss-list a .date-value {\n                    font-size: 0.9rem;\n                    font-weight: 600;;\n                }\n                .postss-as-list #postss-list a .excerpt-value {\n                    font-size: 1rem;\n                    font-weight: normal;\n                    line-height: 2rem;\n                }\n                \n                \n                #postss-search.postss-as-list .postss-list-title{\n                    margin-bottom: 0;\n                }\n                \n                #postss-search.postss-as-list .new-icon{\n                    margin-top: -15px;\n                    margin-right: -10px;\n                    width: 1.5rem;\n                }.postss-as-grid #postss-list ul{\n                    display: flex;\n                    flex-wrap: wrap;\n                    margin-right: -15px;\n                    margin-left: -15px;\n                    list-style: none;\n                    padding: 0;\n                }\n                .postss-as-grid #postss-list ul li{\n                    position: relative;\n                    width: 100%;\n                    padding-right: 15px;\n                    padding-left: 15px;\n                }\n                .postss-as-grid #postss-list a{\n                    display: flex;\n                    flex-direction: column;\n                    width: 100%;\n                    margin-bottom: 30px;\n                    position: relative;\n                    color: var(--dark);\n                    font-weight: 700;\n                    text-decoration: none;\n                    \/*aspect-ratio: 1\/1;*\/\n                }\n                .postss-as-grid #postss-list a:hover,\n                .postss-as-grid #postss-list a:focus,\n                .postss-as-grid #postss-list a:active{\n                    color: var(--thumbnail-background-color, #1B7B3E);\n                }\n                .postss-as-grid #postss-list a>.title{\n                    display: block;\n                    width: 100%;\n                    text-align: left;\n                    overflow: hidden;\n                    text-overflow: ellipsis;\n                    word-break: break-word;\n                    padding: 0;\n                    z-index: 2;\n                    font-weight: 600;\n                    text-transform: none;\n                    font-size: 1.6rem;\n                    line-height: 2.2rem;\n                    order: 3;\n                }\n                .postss-as-grid #postss-list a>.meta{\n                    order: 2;\n                    gap: 0 15px;\n                    margin-bottom: 0.4rem;\n                }\n                .postss-as-grid #postss-list a .taxonomy.taxonomy-label,\n                .postss-as-grid #postss-list a .date-label,\n                .postss-as-grid #postss-list a .excerpt-label{\n                    position: absolute;\n                    width: 1px;\n                    height: 1px;\n                    padding: 0;\n                    overflow: hidden;\n                    clip: rect(0, 0, 0, 0);\n                    white-space: nowrap;\n                    border: 0;\n                }\n                .postss-as-grid #postss-list a .taxonomy.taxonomy-value {\n                    vertical-align: middle;\n                    font-weight: normal;\n                    text-transform: uppercase;\n                    margin-top: 0.6rem;\n                    white-space: nowrap;\n                    text-overflow: ellipsis;\n                    overflow: hidden;\n                    color: var(--dark);\n                }\n                .postss-as-grid #postss-list a .taxonomy.taxonomy-categories-value {\n                    background-color: #1B7B3E;\n                    color: var(--white);\n                    padding: 0rem 0.8rem !important;\n                }\n                .postss-as-grid #postss-list a .taxonomy-tags-wrapper{\n                    flex-grow: 1;\n                    min-width: 0;\n                }\n                .postss-as-grid #postss-list a .posts-thumbnail-wrapper{\n                    display: block;\n                    width: 100%;\n                    height: 100%;\n                    color: var(--white, white);\n                    background-color: var(--thumbnail-background-color, var(--dark));\n                    order: 1;\n                    border: 1px solid #ebebec;\n                    aspect-ratio: 1\/1;\n                }\n                .postss-as-grid #postss-list a .posts-thumbnail-wrapper .posts-thumbnail-text{\n                    display: flex;\n                    flex-direction: column;\n                    justify-content: center;\n                    align-items: flex-start;\n                    height: 100%;\n                    padding: 3rem;\n                    font-weight: 800;\n                    font-size: 2rem;\n                    line-height: 2.5rem;\n                    text-transform: none;\n                }\n                .postss-as-grid #postss-list a .posts-thumbnail{\n                    display: block;\n                    width: 100%;\n                    height: auto;\n                    max-width: none;\n                }\n                .postss-as-grid #postss-list a .date-wrapper{\n                    order: 4;\n                    margin: 0.4rem 0 0;\n                }\n                .postss-as-grid #postss-list a .date-value {\n                    font-size: 0.9rem;\n                    font-weight: normal;\n                }\n                .taxonomy-wrapper.taxonomy-school-wrapper,\n                .taxonomy-wrapper.taxonomy-tags-wrapper{\n                    overflow: hidden;\n                    text-overflow: ellipsis;\n                    display: none;\n                }\n                @media (min-width: 576px){\n                    .postss-as-grid #postss-list ul li{\n                        flex: 0 0 50%;\n                        max-width: 50%;\n                    }\n                }\n                @media (min-width: 768px){\n                    .postss-as-grid #postss-list ul li{\n                        flex: 0 0 33.33333%;\n                        max-width: 33.33333%;\n                    }\n                }\n                @media (min-width: 992px){\n                    .postss-as-grid #postss-list ul li{\n                        flex: 0 0 25%;\n                        max-width: 25%;\n                    }\n                }\n                \n                .postss-as-grid #postss-list .new-icon{\n                    position: absolute;\n                    top: 0;\n                    left: 0;\n                    width: 3rem;\n                }\n                \n                .postss-layout-btn{\n                    border-color: transparent;\n                }\n                \n                #loading-button{\n                    line-height: 1.3rem;\n                }\n            <\/style>\n        `);\n        \n        const taxonomiesInfo = {};\n        \n        const getForm = () => {\n            return document.querySelector('form#postss-search');\n        };\n        \n        const getContainer = ()=>{\n            const form = getForm();\n            return !!form?form.querySelector('#postss-list'):null;\n        };\n        \n        const getLoading = () => {\n            const form = getForm();\n            return !!form?form.querySelector('#loading-button'):null;\n        };\n        \n        const enableLoading = (loading=false) => {\n            const loadingButton = getLoading();\n            if(loadingButton){\n                const loadingLabel = loadingButton.querySelector('.loading-label');\n                if(!!loadingLabel){\n                    loadingLabel.style.display = loading?'none':'initial';\n                }\n                if(loading){\n                    loadingButton.classList.add(\"loading\");\n                    loadingButton.style.display = 'inline-block';\n                }else{\n                    if(ofPages()<=currentPage()){\n                        loadingButton.style.display = 'none';\n                    }\n                    loadingButton.classList.remove(\"loading\");\n                }\n                loadingButton.setAttribute(\"aria-busy\", Boolean(loading));\n                loadingButton.dataset.loading =  Boolean(loading);\n            }\n        };\n        \n        const isLoading = () => {\n            const loadingButton = getLoading();\n            return !!loadingButton && String(loadingButton.dataset.loading).toLowerCase() === \"true\";\n        };\n        \n        const currentPage = () => {\n            const loadingButton = getLoading();\n            return !!loadingButton && !!loadingButton.dataset.page ? parseInt(loadingButton.dataset.page) : 0 ;\n        };\n        \n        const ofPages = () => {\n            const loadingButton = getLoading();\n            return !!loadingButton && !!loadingButton.dataset.totalPages ? loadingButton.dataset.totalPages : 0 ;\n        };\n        \n        const doGetApiRequest = (url, page=1, allPages=false) => {\n            let totalPages = 0;\n            \n            const loadingButton = getLoading();\n            if(loadingButton && !allPages){\n                loadingButton.dataset.page = page;\n            }\n            \n            return fetch( url, {\n                \/\/credentials: 'omit',\n                mode: 'cors'\n            })\n            .then( response => {\n                if (response.status === 200) {\n                    const contentType = response.headers.get('content-type');\n                    totalPages = response.headers.get('X-WP-TotalPages');\n                    if(loadingButton && !allPages){\n                        loadingButton.dataset.totalPages = totalPages;\n                    }\n                    if (!contentType || !contentType.includes('application\/json')) {\n                        throw new TypeError(\"Resposta JSON inv\u00e1lida\");\n                    }\n                    return response.json();\n                }\n            })\n            .then( response => {\n                if (page>1 || totalPages<=1) {\n                    return response;\n                }else if(allPages){\n                    let pageUrl = new URL(url);\n                    let params = new URLSearchParams(url.search);\n                    const requests = Array.from({length:(totalPages-1)},(v,k)=>k+1+1).map(page=>{\n                        params.set('page', page);\n                        pageUrl.search = params.toString();\n                        return doGetApiRequest(pageUrl.toString(), page, allPages);\n                    });\n                    return Promise.all(requests)\n                        .then(responses => {\n                            return response.concat(responses.flat());\n                        });\n                }\n                return response;\n            })\n            .catch(err => {\n                \/\/console.error('Erro: ', err);\n                const container = document.getElementById('postss-list');\n                if(!!container){\n                    container.innerHTML = `Erro`;\n                }\n                enableLoading(false);\n                return err;\n            });\n        };\n        \n        \n        const syncState = () => {\n            const form = getForm();\n            history.replaceState({ 'postsSearch': Object.fromEntries(new FormData(form)) }, '');\n        };\n        \n        const doSearch = (page=1) => {\n            const form = getForm();\n            const input = form.querySelector('.postss-search-input');\n            const container = getContainer();\n            const url = new URL(input.dataset.apiUrl.replace(\/\\${apiUrl}\/,form.dataset.apiUrl));\n            const taxonomies = Object.keys(taxonomiesInfo);\n            \n            const urlSearchParameters = new URLSearchParams({\n                                '_fields': 'id,title,content,excerpt,date,link,_links,_embedded.wp:featuredmedia,meta.custompostfields_front-page-gallery-thumbnails,'+taxonomies.join(\",\"),\n                '_embed':'wp:term,wp:featuredmedia',\n                'context': 'view',\n                'per_page': 12,\n                'page': page,\n                'orderby':'date',\n                'order':'desc',\n            });\n            \n            enableLoading(true);\n            syncState();\n            \n            const formData = new FormData(form);\n            for (let [key, value] of formData.entries()) { \n                if(!!value && value.length>0){\n                    urlSearchParameters.append(key, value);\n                }\n            }\n            url.search = urlSearchParameters.toString();\n            \n            if(page<=1){\n                container.innerHTML = '<ul class=\"postss-list-items-container no-bullets\" role=\"group\" aria-describedby=\"postss-list-title\"><\/ul>';\n            }\n            \n            return doGetApiRequest(url, page).then(posts => {\n                if(!posts || typeof posts[Symbol.iterator] !== 'function'){\n                    if(page<=1){\n                        container.innerHTML = '';\n                    }\n                    return posts;\n                }\n                if(posts.length<=0){\n                    container.innerHTML = 'Sem dados a apresentar.';\n                }else{\n                    const itemsContainer = container.querySelector('.postss-list-items-container');\n                    if(!!itemsContainer){\n                        let output = '';\n                        \n                        const metaExcludeTaxonomy = [\n                            'resource_status'\n                        ];\n                        \n                                                \n                        for ( let post of posts ) {\n                            \n                                                        \n                            let meta = '';\/\/`<dl title=\"Informa\u00e7\u00f5es adicionais:\" class=\"meta d-md-flex pt-2\">`;\n                            meta += taxonomies.map(taxonomy=>{\n                                if(metaExcludeTaxonomy.includes(taxonomy)){\n                                    return '';\n                                }\n                                \n                                let taxonomiesAux = {};\n                                taxonomiesAux[taxonomy] = {};\n                            \n                                for (let i in post[taxonomy]) {\n                                    taxonomiesInfo[taxonomy][post[taxonomy][i]] ? taxonomiesAux[taxonomy][post[taxonomy][i]]=taxonomiesInfo[taxonomy][post[taxonomy][i]]:null;               \n                                }\n                                \n                                                                \n                                let info = (taxonomiesAux[taxonomy])?Object.values(taxonomiesAux[taxonomy]).map(id=>{\n                                    return (id.description);\n                                }).join('<span class=\"taxonomy-separator\">, <\/span>'):false;\n                                \n                                \n                                return (info && taxonomiesInfo[taxonomy].label && taxonomiesInfo[taxonomy].label.length>0) ? (`\n                                    <div class=\"taxonomy-wrapper taxonomy-${taxonomy}-wrapper mt-3\">\n\t\t\t                            <span class=\"py-1 taxonomy taxonomy-label taxonomy-${taxonomy} taxonomy-${taxonomy}-label\">${taxonomiesInfo[taxonomy].label}<\/span> \n\t\t\t                            <span class=\"taxonomy taxonomy-value taxonomy-${taxonomy}-value\">${info}<span class=\"taxonomies-separator\"><\/span><\/span>\n\t                                <\/div>\n                                    `):'';\n                            }).join('');\n                            \/\/meta += '<\/dl>';\n                            \n                                                        let event ='<dl class=\"date-wrapper\">'\n                            \n                                                        event += `<dt class=\"excerpt-label\">Excerto: <\/dt><dd class=\"excerpt-value\">${post.excerpt.rendered}<\/dd>`;\n                            event +='<\/dl>';\n                            post.meta[\"custompostfields_front-page-gallery-thumbnails\"]?fetch(\"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/media\/\" + post.meta[\"custompostfields_front-page-gallery-thumbnails\"]).then((response) => response.json()).then((json) => {\n                                let featuredMedia = '';\n                                \n                                let featuredMediaInfo = json;\n                                \n                                if(featuredMediaInfo.source_url){\n                                    \n                                    const srcSet = [];\n                                    const sizes = '';\n                                    if(featuredMediaInfo.media_details && typeof featuredMediaInfo.media_details.sizes === 'object' && featuredMediaInfo.media_details.sizes !== null){\n                                        for (let [key, size] of Object.entries(featuredMediaInfo.media_details.sizes)) {\n                                            if(size.source_url && size.width){\n                                                srcSet.push(`${size.source_url} 100w`);\n                                            }\n                                        }\n                                        if(srcSet.length>0){\n                                            featuredMedia += ` srcset=\"${srcSet.join(', ')}\"`;\n                                        }\n                                    }\n                                    if(featuredMediaInfo.media_details.width){\n                                        featuredMedia +=` sizes=\"(max-width: 100px) 100vw, 100px\"`;\n                                    }\n                                    featuredMedia = `<img class=\"posts-thumbnail mr-md-3\" loading=\"lazy\" alt=\"\" src=\"${featuredMediaInfo.source_url}\" ${featuredMedia}>`;\n                                    document.getElementById('event-thumbnail-'+json.id).innerHTML=featuredMedia;\n                                }\n                            }):'';\n\n                            \n                            output += `\n                                <li id=\"event-${post.id}\">\n                                \n                                    <a href=\"${post.link}\" class=\"position-relative\" >\n                                        ${meta}\n                                        <span class=\"d-flex flex-row entry-link h-100 m-0 mb-4 mr-0 mr-md-3 mt-4\">\n                                            <span id=\"event-thumbnail-${post.meta[\"custompostfields_front-page-gallery-thumbnails\"]}\" class=\"block\">                    \n                                                \n                                            <\/span>\n                                            <span class=\"d-flex flex-column info\">\n                                                <span class=\"title\">${post.title.rendered}<span class=\"sr-only\">.<\/span><\/span>\n                                                ${event}\n                                            <\/span>\n                                        <\/span>\n                                    <\/a>\n                                <\/li>\n                            `;\n                        }\n                        itemsContainer.insertAdjacentHTML(\"beforeend\", output);\n                    }\n                }\n                enableLoading(false);\n                return posts;\n            });\n        };\n        \n        document.addEventListener('DOMContentLoaded', () => {\n            const form = getForm();\n            if(!isSupported || form===undefined || form.dataset.apiUrl===undefined){\n                return;\n            }\n            \n            enableLoading(true);\n            \n            if (form.querySelector('.postss-layout-btn')) {\n                form.querySelectorAll('.postss-layout-btn').forEach((button) => {\n                    button.addEventListener(\"click\", function(event) {\n                        const input = form.querySelector('#postss-layout');\n                        if(event.target.tagName === \"BUTTON\" && !form.classList.contains(event.target.id)){\n                            form.classList.remove(event.target.id===\"postss-as-grid\"?\"postss-as-list\":\"postss-as-grid\");\n                            form.classList.add(event.target.id);\n                            if(input){\n                                input.value = event.target.id;\n                            }\n                            form.querySelectorAll('.postss-layout-btn.active').forEach((button) => {\n                                button.classList.remove('active');\n                                button.setAttribute('aria-checked', 'false');\n                            });\n                            button.classList.add('active');\n                            button.setAttribute('aria-checked', 'true');\n                        }\n                        syncState();\n                    });\n                });\n            }\n            \n            const loadingButton = getLoading();\n            if(loadingButton){\n                loadingButton.addEventListener(\"click\", function(event) {\n                    if(!isLoading() && (ofPages()>0 && ofPages()>currentPage())){\n                        doSearch(currentPage()+1).then(posts => {});\n                    }\n                    event.preventDefault();\n                });\n            }\n            \n            const container = document.getElementById('postss-list');\n            const taxonomiesRequests = Array.from(form.querySelectorAll(\".posts-taxonomy-filter\")).map(taxonomy => {\n            \n                if(! \"apiUrl\" in taxonomy.dataset || ! \"taxonomy\" in taxonomy.dataset){\n                    return;\n                }\n                const taxonomySlug = taxonomy.getAttribute(\"name\");\n                const taxonomyLabel = taxonomy.querySelector(\".taxonomy-label\");\n                const taxonomySelected = taxonomy.dataset.selected||'';\n                const taxonomyInclude = taxonomy.dataset.include?taxonomy.dataset.include.split(','):[];\n                const taxonomyExclude = taxonomy.dataset.exclude?taxonomy.dataset.exclude.split(','):[];\n                taxonomiesInfo[taxonomySlug] = {};\n                \n                let url = new URL(taxonomy.dataset.apiUrl.replace(\/\\${apiUrl}\/, form.dataset.apiUrl).replace(\/\\${taxonomy}\/, taxonomySlug));\n                url.search = new URLSearchParams({\n                    '_fields': 'id,slug,name,taxonomy,link,description,count',\n                    'context': 'view'\n                }).toString();\n                \n                return doGetApiRequest(url, 1, true).then(terms => {\n                    if(typeof terms[Symbol.iterator] !== 'function'){\n                        return;\n                    }\n                    if(taxonomyLabel && taxonomyLabel.text){\n                        taxonomiesInfo[taxonomySlug]['label'] = taxonomyLabel.text;\n                    }\n                    for ( let term of terms ) {\n                        if((taxonomyInclude.length>0 && !taxonomyInclude.includes(term.slug)) || (taxonomyExclude.length>0 && taxonomyExclude.includes(term.slug))){\n                            continue;\n                        }\n                        \n                        taxonomiesInfo[taxonomySlug][term.id] = term;\n                        \n                        let option = document.createElement(\"option\");\n                        option.text = term.description;\n                        option.value = term.id;\n                        option.id = `select-${taxonomySlug}-${term.slug}`;\n                        if(term.slug===taxonomySelected){\n                            option.selected = true;\n                            option.setAttribute('selected', 'selected');\n                        }\n                        taxonomy.appendChild(option);\n                    }\n                    \n                    taxonomy.addEventListener('change', ()=>doSearch());\n                    taxonomy.classList.replace(\"disabled-filter\", \"enabled-filter\");\n                });\n            });\n            \n            Promise.all(taxonomiesRequests).then(()=>{\n                form.addEventListener('submit',  event => {\n                    doSearch();\n                    \n                    event.preventDefault();\n                });\n                \n                \n                const input = form.querySelector('.postss-search-input');\n                input.timeout = null;\n                input.addEventListener('keyup', function (e) {\n                    clearTimeout(input.timeout);\n                \n                    input.timeout = setTimeout(()=>{\n                        doSearch();\n                    }, 350);\n                });\n                input.addEventListener('blur', function (e) {\n                    clearTimeout(input.timeout);\n                });\n                input.classList.replace(\"disabled-filter\", \"enabled-filter\");if(history.state && history.state.postsSearch){\n                    let formItem, formItemKey;\n                    for ( formItemKey in history.state.postsSearch ) {\n                        if(history.state.postsSearch[formItemKey] && history.state.postsSearch[formItemKey].length>0 && (formItem = form.querySelector(`[name=\"${formItemKey}\"]:not([data-selected])`) )){\n                            formItem.value = history.state.postsSearch[formItemKey];\n                        }\n                    }\n                    const input = form.querySelector('#postss-layout');\n                    if(input && input.value.length>0 && !form.classList.contains(input.value)){\n                        form.classList.remove(input.value===\"postss-as-grid\"?\"postss-as-list\":\"postss-as-grid\");\n                        form.classList.add(input.value);\n                        form.querySelectorAll('.postss-layout-btn').forEach((button) => {\n                            if(button.id == input.value){\n                                button.classList.add('active');\n                                button.setAttribute('aria-checked', 'true');\n                            }else{\n                                button.classList.remove('active');\n                                button.setAttribute('aria-checked', 'false');\n                            }\n                        });\n                    }\n                }\n                doSearch().then(posts => {const loadingButton = getLoading();\n                    if(loadingButton){\n                        (new IntersectionObserver((targets)=>{\n                            targets.forEach((target) => {\n                                if (target.isIntersecting && target.intersectionRatio >= 0.75 && !isLoading() && (ofPages()>0 && ofPages()>currentPage())) {\n                                    target.target.dispatchEvent(new MouseEvent('click', {\n                                        view: window,\n                                        bubbles: true,\n                                        cancelable: true\n                                    }));\n                                }\n                            });\n                        }, {\n                          root: null,\n                          rootMargin: '0px',\n                          threshold: 1.0\n                        })).observe(loadingButton);\n                    }\n                });\n            });\n        });\n    })(\n           \"fetch\" in window \n        && \"URL\" in window \n        && \"URLSearchParams\" in window \n        && \"FormData\" in window\n        && \"Promise\" in window\n        && \"history\" in window\n        && \"querySelector\" in document\n        && \"querySelectorAll\" in document\n        && \"includes\" in Array()\n        && \"from\" in Array\n        && (function(){\n            try{\n                Function(\"() => {};\"); \n                Function(\"class Feature {};\");\n                return true;\n            }catch(exception){\n                return false;\n            }\n        })()\n    );\n        <\/script>\n    <noscript>\n        O JavaScript n\u00e3o \u00e9 suportado pelo seu navegador.\n        <a href=\"&#x2F;estg&#x2F;wp-json&#x2F;wp&#x2F;v2&#x2F;pages&#x2F;834&#x3F;nojs&#x3D;true\">\n             Por favor, consulte uma vers\u00e3o alternativa.\n        <\/a>\n    <\/noscript>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":4,"featured_media":0,"parent":453,"menu_order":30,"comment_status":"closed","ping_status":"closed","template":"","meta":{"custompostfields_banners":""},"_links":{"self":[{"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/pages\/834"}],"collection":[{"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/comments?post=834"}],"version-history":[{"count":4,"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/pages\/834\/revisions"}],"predecessor-version":[{"id":9036,"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/pages\/834\/revisions\/9036"}],"up":[{"embeddable":true,"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/pages\/453"}],"wp:attachment":[{"href":"https:\/\/www.ipleiria.pt\/estg\/wp-json\/wp\/v2\/media?parent=834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}