/*
YUI().use(
        'aui-pagination',
        function (Y) {
            new Y.Pagination(
                    {
                        containers: '.resultPagination',
                        maxPageLinks: 10,
                        firstPageLinkLabel: 'First',
                        nextPageLinkLabel: '>',
                        prevPageLinkLabel:'<',
                        lastPageLinkLabel:'Last',
                        on: {
                            changeRequest: function (event) {
                                var currentPage = event.state.page;

                            }},
                        page : 3,
                        total: 100
                    }
            ).render();
        }
);*/


AUI().ready(function () {

    if(typeof searchCriteria_loadJavascript !== 'undefined') {
        // return;
        AUI().use('node', function(A){
            A.all(searchCriteria_portletNamespace+"show-more-button_search_criteria").on("click", function(e){
                e.preventDefault();
                var _this = A.one(e.target);
                var parentNode = _this.get("parentNode");
                _this.remove();
                parentNode.one(searchCriteria_portletNamespace + "more-options_search_criteria").show();
                return false;
            });
        });

        showHideContinuation = function () {
            AUI().use('node',
                function (aui) {
                    var cont = aui.one('#search-term-continuation-sc');
                    var href = aui.one('#search-term-href-sc');
                    var style = cont.getAttribute('style');
                    if (style.indexOf("none") > 0) {
                        cont.setAttribute('style', 'display:inline;');
                        href.setAttribute('style', 'display:none;');
                    } else {
                        cont.setAttribute('style', 'display:none;');
                    }
                });
        }
    }
});


AUI().ready(
    function () {

        var response;
        sendSortBy = function (portletNamespace) {
            AUI().use('node',
                function (setSortBy) {
                    var sortByParam = setSortBy.one('#'+portletNamespace+'sortBy').get('value');
                    if (sortByParam != "select") {
                        getSortByParam(sortByParam,portletNamespace);
                    }
                });
        }

        getSortByParam = function (sortByParam,portletNamespace) {
            AUI().use('aui-io-request', function (A) {
                 A.io.request('/o/search-order-by/getSortByParam.jsp', {
                    method: 'POST',
                    data: {sortBy: sortByParam },
                    on: {
                        success: function () {
                            response = this.get('responseData');
                            AUI().use('node',
                                function (setSortByParameter) {
                                    var form = setSortByParameter.one('#'+portletNamespace+'doOrderBy'),
                                        action = form.getAttribute('action'),
                                        action = action.concat("sortBy=" + response);
                                    form.setAttribute('action', action);
                                    form.submit();
                                    //submitForm(document.doOrderBy);
                                });
                        },
                        failure: function () {
                        }
                    }
                });
            });
        }

        if(typeof orderBy_loadJavascript === 'undefined')
            return;

        submitOrderBy = function(portletNamespace){
            AUI().use('node', 'opportal-tools', function(A){
                var value = A.one(portletNamespace).get('value');
                var url = orderBy_fullURL + value;
                A.opportalTools.addCookie('PORTAL2012_SEARCH', 'sortBy', value, function(){
                    window.location.href = url;
                });
            });
        }
    }
);

AUI().ready(
    function () {
        var response;
        sendPerPage = function () {
            AUI().use('node',
                function (page) {
                    var perPageParam = page.one('#rezultsPerPage').get('value');

                     getPerPageParam(perPageParam);

                });
        }

        getPerPageParam = function (perPageParam) {
            AUI().use('aui-io-request', function (A) {

                A.io.request('/o/eu.europa.publications.portlet.search_result_summary/getPerPageParam.jsp', {
                    method: 'POST',
                    data: {resultsPerPage: perPageParam },
                    on: {
                        success: function () {
                            response = this.get('responseData');
                            AUI().use('node',
                                function (setPerPageParameter) {
                                    var form = setPerPageParameter.one('#perpage'),
                                        action = form.getAttribute('action'),
                                        action = action.concat("resultsPerPage=" + response);

                                    form.setAttribute('action', action);
                                    submitForm(document.perpage);
                                });
                        },
                        failure: function () {
                        }
                    }
                });
            });
        }

        if(typeof searchResultSummary_loadJavascript === 'undefined')
            return;

        submitResultsPerPage = function(searchResultSummary_this) {

            AUI().use('node', 'opportal-tools', function(A){
                var value = A.one(searchResultSummary_this).get('value');
                var url = searchResultSummary_fullURL + value;
                A.opportalTools.addCookie('PORTAL2012_SEARCH', 'perPage', value, function(){
                    window.location.href = url;
                });
            });
        }
    }
);

$(document).ready(function () {

    if (updateSearchHitExport) {

        const toralNumberOfhits = 0;
        const queryString = window.location.search;
        let pageNo = 1;
        let sortByDownloadPdf = '';
        let sortBy = '';
        let collections = '';
        let searchterm = '';
        if (queryString) {
            const urlParams = new URLSearchParams(queryString);
            if (urlParams) {
                try {
                    let startRow = urlParams.get('startRow') ? parseInt(urlParams.get('startRow')) : 1;
                    let resultsPerPage = urlParams.get('resultsPerPage') ? parseInt(urlParams.get('resultsPerPage')) : 10;
                    pageNo = Math.floor(startRow / resultsPerPage) + 1;
                    sortByDownloadPdf = urlParams.get('sortBy');
                    sortBy = $('.portlet-boundary_eu_europa_publications_portlet_orderby_OrderByPortlet_ select option:selected').text().trim();
                    //collections = urlParams.get('facet.collection');
                    let colectionsElement = document.querySelectorAll(".filter-category .filter-content .criteria-label, .filter-category .filter-content .search_criteria_links");
                    colectionsElement.forEach(
                        function(item, index) {
                            if(item.classList.contains("criteria-label")){
                                collections = collections + "search_criteria_links_" + "criteria-label_" + item.innerText;
                            }else if(item.classList.contains("search_criteria_links")){
                                collections = collections + "search_criteria_links_" + item.innerText;
                            }
                        });
                    searchterm = $('.search-term-row .find-term').text().trim();
                } catch (e) {
                    console.log('Invalid startRow url parameter');
                }
            }
        }

        if (actionCheckResetAttributes) {
            resetSearchResultsList([{
                collections: collections,
                searchterm: searchterm,
                sortBy: sortBy
            }]);
        }

        if (selectedHitsIds && selectedHitsIds.length > 0) {
            setExportDDMActive();
        }else{
            setExportDDMInActive();
        }

        $('.export-serp-pdf').on('click', function () {

            window.location.href = urlDownloadPDF.replace('_param_placeholder_filename', $('.export-filename').val().trim())
                                                    .replace('_param_placeholder_sortby', sortByDownloadPdf)
                                                    .replace('_param_placeholder_searchterm', searchterm)
                                                    .replace('_param_placeholder_resultinfo', $('.search-term-row .results-number-info').text().trim())
                                                    .replace('_param_placeholder_searchurl', encodeURIComponent(window.location.href))
                                                    .replace('_param_placeholder_collections', collections);
        });
        $('.export-serp-csv').on('click', function () {
            window.location.href = urlDownloadCSV.replace('_param_placeholder_filename', $('.export-filename').val().trim());
        });

        $('.export-serp-csv-export-all').on('click', function (e) {

            //debugger;
            let loadingExportAllContainer =
                '                 <div id="responseContainerExportAll-loading" ' +
                '                      class="ecl-spinner ecl-spinner--primary ecl-spinner--large ecl-spinner--centered ecl-spinner--visible" ' +
                '                      style="padding-top: 10px; min-width: 100%; min-height: 110px; bottom: unset; top: 0; background: #fff;">' +
                '                     <svg class="ecl-spinner__loader" viewBox="25 25 50 50">' +
                '                         <circle class="ecl-spinner__circle" cx="50" cy="50" r="20" fill="none" stroke-width="4px"' +
                '                                 stroke-miterlimit="10" vector-effect="non-scaling-stroke" />' +
                '                     </svg>' +
                '                     <div class="ecl-spinner__text">' +
                '                         ' + 'Loading\x2c\x20please\x20wait\x2e\x2e\x2e' +
                '                     </div>' +
                '                 </div>';


            const downloadUrl = urlDownloadFull.replace('_param_placeholder_filename', $('.export-filename-export-all').val().trim());

            // Optionally show a loading indicator
            console.log("Preparing your file for download...");
            document.querySelector('.export-serp-menu-export-all .dropdown-menu').insertAdjacentHTML('beforeend', loadingExportAllContainer);

            e.preventDefault();
            e.stopPropagation();

            fetch(downloadUrl)
                .then(response => {
                    if (!response.ok) {
                        throw new Error(`Network response was not ok (status: ${response.status})`);
                    }

                    // Extract the Content-Disposition header
                    const contentDisposition = response.headers.get("Content-Disposition");
                    let filename = "download.xlsx"; // default filename if parsing fails

                    if (contentDisposition && contentDisposition.indexOf("filename=") !== -1) {
                        // The header is typically in the format: attachment;filename=your_filename.xlsx
                        // Use a regular expression or simple string split to extract the filename.
                        const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
                        const matches = filenameRegex.exec(contentDisposition);
                        if (matches != null && matches[1]) {
                            filename = matches[1].replace(/['"]/g, '');
                        }
                    }

                    // Convert response into a Blob
                    return response.blob().then(blob => ({ blob, filename }));
                })
                .then(({ blob, filename }) => {
                    console.log("File download response received, filename:", filename);
                    document.querySelector('#responseContainerExportAll-loading').remove();

                    // Create a temporary URL for the Blob
                    const blobUrl = window.URL.createObjectURL(blob);

                    // Create a hidden anchor element and trigger the download
                    const a = document.createElement("a");
                    a.style.display = "none";
                    a.href = blobUrl;
                    a.download = filename;  // Use the filename extracted from the header
                    document.body.appendChild(a);
                    a.click();

                    // Cleanup: remove the anchor element and revoke the Blob URL
                    document.body.removeChild(a);
                    window.URL.revokeObjectURL(blobUrl);
                })
                .catch(error => {
                    console.error("Download error:", error);
                    alert("There was an error downloading the file.");
                })
                .finally(() => {
                    // Optionally hide your loading indicator here.
                    console.log("Download process finished.");
                });
        });

        /*$('#selectAllResultsCheckbox').on('click', function () {
            document.querySelector(".portlet-boundary_SearchResults_SearchResultsPortlet_").prepend(errorMessageSelectExportSERP);
        });*/

        $("#selectAllResultsCheckbox").on("click", function() {
            let allCheckboxesChecked = true;
            selectAllResultsCheckbox(allCheckboxesChecked);
            setAllResultsOnThisPageState();
            if ($('.select-all-checkbox-holder')[0].classList.contains("d-none")){
                $('.deselect-all-checkbox-holder .form-check-input')[0].focus();
            } else {
                $('.select-all-checkbox-holder .form-check-input')[0].focus();
            }
        });
        $("#deselectAllResultsCheckbox").on("click", function() {
            let allCheckboxesChecked = false;
            selectAllResultsCheckbox(allCheckboxesChecked);
            setAllResultsOnThisPageState();
            if ($('.select-all-checkbox-holder')[0].classList.contains("d-none")){
                $('.deselect-all-checkbox-holder .form-check-input')[0].focus();
            } else {
                $('.select-all-checkbox-holder .form-check-input')[0].focus();
            }
        });

        function selectAllResultsCheckbox ( allCheckboxesChecked ) {
            /*let allCheckboxesChecked = this.checked;*/
            let changedCheckboxes = [];
            $('.input-serp-export').each(function (index, element) {
                let checked = this.checked;
                let searchHitElement = $(element);

                if (allCheckboxesChecked && !checked) {
                    if(selectedHitsIds.length + index < configMaxNumberOfHits){
                        searchHitElement.prop("checked", allCheckboxesChecked);
                    }else{
                        maxNumberOfItemsSelected();
                        return;
                    }
                } else if (!allCheckboxesChecked && checked) {
                    searchHitElement.prop("checked", allCheckboxesChecked);
                } else {
                    return;
                }

                let hitIndex = (pageNo * 1000) + index;
                if (searchHitElement.parents('#personCarousel').length) {
                    hitIndex += 1000000;
                } else if (searchHitElement.parents('#organizationCarousel').length) {
                    hitIndex += 2000000;
                }

                let countItems = 0;
                $('.input-serp-export').each(function(  indexCount, elementCount  ) {
                    if (elementCount.getAttribute("data-hit-id") == searchHitElement.data('hit-id')){
                        countItems++;
                    }
                    if(index == indexCount){
                        return false;
                    }
                });

                if(countItems < 2){
                    changedCheckboxes.push({
                        id: searchHitElement.data('hit-id'),
                        type: searchHitElement.data('hit-type'),
                        checked: allCheckboxesChecked,
                        index: hitIndex,
                        content: allCheckboxesChecked ? JSON.stringify(searchHitElement.data('content')) : ''
                    });
                }
            });
            updateCheckboxes(changedCheckboxes);
        }

        $('.input-serp-export').each(function (index, element) {
            let searchHitElement = $(element);

            let hitId = searchHitElement.data('hit-id');
            let hitType = searchHitElement.data('hit-type');

            let hitIndex = (pageNo * 1000) + index;
            if (searchHitElement.parents('#personCarousel').length) {
                hitIndex += 1000000;
            } else if (searchHitElement.parents('#organizationCarousel').length) {
                hitIndex += 2000000;
            }

            // mark hits as selected if they are saved on session
            if (selectedHitsIds && selectedHitsIds.includes(searchHitElement.data('hit-id'))) {
                searchHitElement.prop("checked", true);
            }

            searchHitElement.on('change', function () {
                if(searchHitElement[0].getAttribute("data-hit-type") == "PERSON" ||
                    searchHitElement[0].getAttribute("data-hit-type") == "ORGANIZATION"){
                    updateCheckboxes([{
                        id: hitId,
                        type: hitType,
                        checked: this.checked,
                        index: hitIndex,
                        content: this.checked ? JSON.stringify(searchHitElement.data('content')) : ''
                    }]);

                    $('.input-serp-export[data-hit-id="'+ searchHitElement[0].getAttribute("data-hit-id") +'"]').each(
                        function(  index, element  ) {
                            element.checked = searchHitElement[0].checked;
                        });
                }else{
                    if((this.checked && selectedHitsIds.length < configMaxNumberOfHits) || !this.checked){
                        updateCheckboxes([{
                            id: hitId,
                            type: hitType,
                            checked: this.checked,
                            index: hitIndex,
                            content: this.checked ? JSON.stringify(searchHitElement.data('content')) : ''
                        }]);
                    }else{
                        maxNumberOfItemsSelected();
                        this.checked = false;
                    }
                }

                setAllResultsOnThisPageState();
            });
        });
    }

    function updateCheckboxes(checkboxesArray) {
        fetch(updateSearchHitExport, {method: 'POST', body: JSON.stringify(checkboxesArray)})
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    /*$('#dropdownMenuLink-export-serp').prop("disabled", !data.listCount);*/
                    if(!data.listCount){
                        /*$('#dropdownMenuLink-export-serp')[0].classList.remove("active");*/
                        setExportDDMInActive();
                    }else{
                        /*$('#dropdownMenuLink-export-serp')[0].classList.add("active");*/
                        setExportDDMActive();
                    }
                    selectedHitsIds = data.selectedHitsIds;
                    toralNumberOfhits = data.listCount;
                    //console.log(toralNumberOfhits);
                } else {
                    console.error('Request failed: ' + data.message);
                }
            })
            .catch(error => console.error('Error:', error));
    }

    function resetSearchResultsList(resetAttributesArray) {
        fetch(actionCheckResetAttributes, {method: 'POST', body: JSON.stringify(resetAttributesArray)})
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    if(data.selectedHitsIds == "0"){
                        selectedHitsIds = [];
                        setExportDDMInActive();
                    }
                } else {
                    console.error('Request failed: ' + data.message);
                }
            })
            .catch(error => console.error('Error:', error));
    }

    var errorMessageSelectExportSERP = document.querySelector("#error-select-export-serp");
    $("#dropdownMenuLink-export-serp.inactive").on("click", function() {
        if($("#dropdownMenuLink-export-serp.inactive").length == 1){
            document.querySelector(".container-export-serp-menu").append(errorMessageSelectExportSERP);
            errorMessageSelectExportSERP.classList.remove('hide');
        }
    });

    var errorMessageSelectExportSERPMaxItems = document.querySelector("#error-select-export-serp-max-items");
    function maxNumberOfItemsSelected() {
        document.querySelector(".container-export-serp-menu").append(errorMessageSelectExportSERPMaxItems);
        errorMessageSelectExportSERPMaxItems.classList.remove('hide');
    }

    setAllResultsOnThisPageState();
});



function setExportDDMActive(){
    document.querySelector(".container-export-serp-menu .dropdown-menu").classList.remove('d-none');
    document.querySelector(".container-export-serp-menu .btn.dropdown-toggle").classList.remove('inactive');
    document.querySelector(".container-export-serp-menu .btn.dropdown-toggle").classList.add('active');
}
function setExportDDMInActive(){
    document.querySelector(".container-export-serp-menu .dropdown-menu").classList.add('d-none');
    document.querySelector(".container-export-serp-menu .btn.dropdown-toggle").classList.add('inactive');
    document.querySelector(".container-export-serp-menu .btn.dropdown-toggle").classList.remove('active');
}
function setAllResultsOnThisPageState(){
    let countItems = 0;
    $(".input-serp-export").each(function(indexCount, elementCount) {
        if (elementCount.checked){
            countItems++;
        }
    });

    if(countItems == 0){
        //console.log("zero");
        //$('.select-all-checkbox-holder')[0].classList.remove('is-checked');
        $('.select-all-checkbox-holder')[0].classList.remove('d-none');
        $('.deselect-all-checkbox-holder')[0].classList.add('d-none');


        $("#selectAllResultsCheckbox")[0].checked = false;
        $("#deselectAllResultsCheckbox")[0].checked = false;


    }else if(countItems == $(".input-serp-export").length){
        //console.log("all");
        $('.select-all-checkbox-holder')[0].classList.add('d-none');
        $('.deselect-all-checkbox-holder')[0].classList.remove('d-none');
        $('.deselect-all-checkbox-holder')[0].classList.add('is-checked');
        $('.deselect-all-checkbox-holder')[0].classList.remove('is-partially-checked');

        $("#selectAllResultsCheckbox")[0].checked = false;
        $("#deselectAllResultsCheckbox")[0].checked = true;

    }else{
        //console.log("some");
        $('.select-all-checkbox-holder')[0].classList.add('d-none');
        $('.deselect-all-checkbox-holder')[0].classList.remove('d-none');
        $('.deselect-all-checkbox-holder')[0].classList.remove('is-checked');
        $('.deselect-all-checkbox-holder')[0].classList.add('is-partially-checked');

        $("#selectAllResultsCheckbox")[0].checked = false;
        $("#deselectAllResultsCheckbox")[0].checked = false;
    }
}




AUI().ready(function () {

    removeOtherPermanentLinkDialogs = function (lastDialogOpened) {
        AUI().use('node', function (A) {
            A.all('.permalink-preview').each(function (crtPermanentLinkDialog) {
                if(crtPermanentLinkDialog !== lastDialogOpened) {
                    crtPermanentLinkDialog.remove();
                }
            });
        });
    }

    AUI().use('node', function (A) {
        A.all('.authorSuccessorLink').on('click', function (e) {
            var crtSuccessorElement = A.one(e.currentTarget);
            if (crtSuccessorElement.hasClass('successorLinkActive')) {
                e.preventDefault();
                crtSuccessorElement.removeClass('successorLinkActive');
                crtSuccessorElement.all('.authorSuccessor').each(function () {
                    this.removeClass('hidden');
                });
                crtSuccessorElement.all('.show-more').each(function () {
                    this.addClass('hidden');
                });
            }
        });

        A.all('.show-hit-data-link').on('click', function (e) {
            e.preventDefault();
            var crtHitLink = A.one(e.currentTarget);
            var crtHitLinkIcon = crtHitLink.one('i');
            if (crtHitLink.hasClass('show-hit-data-link-open')) {
                crtHitLink.removeClass('show-hit-data-link-open');
                crtHitLinkIcon.addClass('icon-chevron-down');
                crtHitLinkIcon.removeClass('icon-chevron-up');

                crtHitLink.ancestor().ancestor().all(".search-hit-hidden-content").each(function () {
                    this.addClass('hidden');
                });

            } else {
                crtHitLink.addClass('show-hit-data-link-open');
                crtHitLinkIcon.removeClass('icon-chevron-down');
                crtHitLinkIcon.addClass('icon-chevron-up');

                crtHitLink.ancestor().ancestor().all(".search-hit-hidden-content").each(function () {
                    this.removeClass('hidden');
                });
            }

        });

        A.all('.show-snipet').on('click', function (e) {
            e.preventDefault();
            var crtHitLink = A.one(e.currentTarget);
            var crtHitLinkIcon = crtHitLink.one('i');

            if (crtHitLink.hasClass('show-elif-open')) {
                crtHitLink.removeClass('show-elif-open');
                crtHitLink.html("<i class=\"icon-chevron-down\"></i> " + 'Show\x20text\x20snippet' + "");
                crtHitLinkIcon.addClass('icon-chevron-down');
                crtHitLinkIcon.removeClass('icon-chevron-up');

                crtHitLink.ancestor().ancestor().all(".elif-content-snipet").each(function () {
                    this.addClass('hidden');
                });

            } else {
                crtHitLink.addClass('show-elif-open');
                crtHitLink.html("<i class=\"icon-chevron-up\"></i> " + 'Hide\x20text\x20snippet' + "");
                crtHitLinkIcon.removeClass('icon-chevron-down');
                crtHitLinkIcon.addClass('icon-chevron-up');

                crtHitLink.ancestor().ancestor().all(".elif-content-snipet").each(function () {
                    this.removeClass('hidden');
                });
            }
        });
    });


    AUI().use('node', function (A) {
        var viewTypeContainer = A.one('.container-serp-view-type');
        var serpExportContainer = A.one('.search-results-export-portlet');
        var bbsFacetsContainer = A.one('.page-class-browse-by-subject .faced-search-results');
        var bbsSCPContainer = A.one('.page-class-browse-by-subject .portlet-boundary_eu_europa_publications_portlet_search_criteria_SearchCriteriaPanelPortlet_');

        if(typeof orderBy_loadJavascript === 'undefined' || typeof searchResultSummary_loadJavascript === 'undefined') {
            if(viewTypeContainer){
                viewTypeContainer.addClass("d-none");
            }
            if(serpExportContainer){
                serpExportContainer.addClass("d-none");
            }
            if(bbsFacetsContainer){
                bbsFacetsContainer.addClass("d-none");
            }
            if(bbsSCPContainer){
                bbsSCPContainer.addClass("d-none");
            }
        }else{
            if(viewTypeContainer) {
                viewTypeContainer.removeClass("d-none");
            }
            if(serpExportContainer) {
                serpExportContainer.removeClass("d-none");
            }
            if(bbsFacetsContainer) {
                bbsFacetsContainer.removeClass("d-none");
            }
            if(bbsSCPContainer) {
                bbsSCPContainer.removeClass("d-none");
            }
        }

    });

});


$('.carousel').on('touchstart', function(event){
    const xClick = event.originalEvent.touches[0].pageX;
    $(this).one('touchmove', function(event){
        const xMove = event.originalEvent.touches[0].pageX;
        const sensitivityInPx = 5;

        if( Math.floor(xClick - xMove) > sensitivityInPx ){
            $(this).carousel('next');
        }
        else if( Math.floor(xClick - xMove) < -sensitivityInPx ){
            $(this).carousel('prev');
        }
    });
    $(this).on('touchend', function(){
        $(this).off('touchmove');
    });
});
AUI().ready(function () {

    var POP_UP_CONTENT_ID = 'popup-content';
    var dialogCloseButton = "<button onclick='closeDialog();'>OK</button>";

    var ACTION_SAVE_QUERY = "saveQuery";
    var ACTION_CREATE_RSS = "createRss";
    var ACTION_ALERT_ME = "alertMe";

    var CONTAINER_SAVE_QUERY = "saveQuery-number";
    var CONTAINER_CREATE_RSS = "createRss-number";
    var CONTAINER_ALERT_ME = "alertMe-number";

    showPopUp = function(renderUrl, title, dialogHeight) {
        AUI().use('node', 'opportal-dialog', function(A){
            A.opportalDialog.show(renderUrl, title, 'auto');
            var el = A.one(".myportalwrapper ul.worpmenu");
            if (el != null && el != undefined) {
                el.addClass('colapsed');
            }
        });
    }

    asyncSubmitSearchActionsForm = function(portletNamespace, actionName, actionURL) {
        var checkMail = false;
        AUI().use('node', function(myAui){
            var emailInput = myAui.one(".form_user_email input[type='text']");
            if(emailInput != null && emailInput != "null") {
                if(emailInput.get('value') == '') {
                    checkMail = false;
                    myAui.one(".form_user_email .control-group").addClass('error');
                    emailInput.focus();
                } else {
                    checkMail = true;
                    myAui.one(".form_user_email .control-group").removeClass('error');
                }
            } else {
                checkMail = true;
            }

        });

        AUI().use('aui-io-request', 'opportal-dialog', function (A) {
            if(checkMail) {
                A.io.request(actionURL, {
                    method: 'POST',
                    data: {actionName: actionName},
                    form: {
                        id: portletNamespace + 'sa_fm'
                    },
                    on: {
                        success: function () {
                            var responseData = this.get('responseData');
                            if (A.opportalDialog.getDialog() != undefined) {
                                A.opportalDialog.getDialog().set('bodyContent', "<br/><p>" + responseData + "</p><p>" + dialogCloseButton + "</p>" );
                                refreshMyPortalNumbers(actionName);
                            }
                        }
                    }
                });
            }

        });
    }

    showPopUp = function(renderUrl, title, dialogHeight, actionName) {
        window.location.hash=actionName;
        AUI().use('node', 'opportal-dialog', function(A){
            A.opportalDialog.show(renderUrl, title, 'auto');
            var el = A.one(".myportalwrapper ul.worpmenu");
            if (el != null && el != undefined) {
                el.addClass('colapsed');
            }
        });
    }

    refreshMyPortalNumbers = function(actionName) {
        if (actionName === "") {
            return;
        }

        var containerId = "";
        if (ACTION_SAVE_QUERY === actionName) {
            containerId = CONTAINER_SAVE_QUERY;
        } else if (ACTION_ALERT_ME === actionName) {
            containerId = CONTAINER_ALERT_ME;
        } else if (ACTION_CREATE_RSS === actionName) {
            containerId = CONTAINER_CREATE_RSS;
        }

        if (containerId === "") {
            return;
        }

        var container = document.getElementById(containerId);
        if (container != undefined && container.firstChild != undefined) {
            var value = container.innerHTML;
            try {
                var number = parseInt(value);
                number = number + 1;
                container.replaceChild(container.firstChild, document.createTextNode(number + ""));
            } catch (exception) {
            }
        }
    }

    closeDialog = function() {

        AUI().use('node', 'opportal-dialog', function(A){
            if (A.opportalDialog.getDialog() != undefined) {
                A.opportalDialog.getDialog().hide();
            }
        });

    }

    checkFrequencyType = function(element) {
		if(element.value == "WEEKLY") {
			document.getElementById("dayOfWeek_Selector").style.display = "block";
		} else {
			document.getElementById("dayOfWeek_Selector").style.display = "none";
		}
    }

});



AUI().ready(function () {
            var DOMAIN_URL='';
            var SUBDOMAIN_URL='';
            var SUBJECT_URL='';

            var PAGE_RENDERED=false;

            var PORTLET_NAMESPACE_PARAM = "_portletNamespace";
            var PORTLET_ID_PARAM = "_portlet_id";
            var LANGUAGE_PARAM = "_language";
            var SUBJECT_SELECTED_ACTION_URL_PARAM = "selectedSubjectActionURL";
            var SELECTED_CODES_PARAM = 'selectedCodes';
            var SELECTED_SUBJECT_LABEL_PARAM = 'selectedSubjectLabel';
            var SELECTED_SUBJECT_ID_PARAM = 'selectedSubjectId';
            var USER_LOCALE_PARAM = 'userLocale';
            var SEARCH_TYPE_PARAM = 'SEARCH_TYPE';
            var ELEMENT_TYPE_PARAM = 'elementType';
            var EUROVOC_DOMAIN_FACET = 'facet.eurovoc.domain';//'/XML/DOCUMENT/DRECONTENT/EURLEX_DOCUMENT/NOTICE/WORK/WORK_IS_ABOUT_CONCEPT_EUROVOC/WORK_IS_ABOUT_CONCEPT_EUROVOC_DOM/IDENTIFIER';
            var EUROVOC_SUBDOMAIN_FACET = 'facet.eurovoc.subdomain';//'/XML/DOCUMENT/DRECONTENT/EURLEX_DOCUMENT/NOTICE/WORK/WORK_IS_ABOUT_CONCEPT_EUROVOC/WORK_IS_ABOUT_CONCEPT_EUROVOC_MTH/IDENTIFIER';
            var EUROVOC_SUBJECT_FACET = 'facet.eurovoc.subject';//'/XML/DOCUMENT/DRECONTENT/EURLEX_DOCUMENT/NOTICE/WORK/WORK_IS_ABOUT_CONCEPT_EUROVOC/WORK_IS_ABOUT_CONCEPT_EUROVOC_CONCEPT/IDENTIFIER';

            var DOMAINS_CONTAINER = 'document-domain';
            var SUB_DOMAINS_CONTAINER = 'document-sub-domain';
            var SUBJECTS_CONTAINER = 'document-subject';
            var MOBILE_SELECTED_SUBJECT_CONTAINER = 'mobile-selected-subject';

            var DOMAINS_LISTBOX = 'domainsListBox';
            var SUB_DOMAINS_LISTBOX = 'subDomainsListBox';
            var SUBJECTS_LISTBOX = 'subjectsListBox';

            var DOMAINS_LABEL = "domainsLabel";
            var SUBDOMAINS_LABEL = "subDomainsLabel";
            var SUBJECTS_LABEL = "subjectsLabel";

            var SEARCH_BUTTON = "executeBBSSearch";
            var SEARCH_LINK = "executeBBSearchLink";

            var domainsListBox;
            var subDomainsListBox;
            var subjectsListBox;
            var language;
            var subjectSelectedActionURL;

            var DOMAINS_LISTBOX_INTERNAL = undefined;
            var SUB_DOMAINS_LISTBOX_INTERNAL = undefined;
            var SUBJECTS_LISTBOX_INTERNAL = undefined;

            var SUBJECT_QUERY_HANDLER_PATH = "/o/eu.europa.publications.portlet.subject_filter/subjectQueryHandler.jsp";
            var ACTION_ALL = "ALL";

            var PORTLET_ID = '';
            var DOMAINS_CACHE = [];
            var SELECTED_CODES = [];
            var SELECTED_ELEMENT_ID = '';
            var SELECTED_ELEMENT_LABEL = '';

            var IDENTIFIER = 'identifier';
            var CODE = 'code';
            var LABEL = 'label';
            var ELEMENT_TYPE = 'elementType';
            var CHILDREN_COUNT = 'childrenCount';

            var NESTED_TEMPLATE_ICON = '<span class="icon-container icon-op-bullet-small-light-gray">&nbsp;</span>';
            var NESTED_TEMPLATE_OPTION_ICON = '<span class="icon-container icon-round-bullet-small-light-gray">&nbsp;</span>';
            var CHILDREN_COUNT_REPLACE = '_childrenCount_';
            var NESTED_TEMPLATE_CHILDREN_COUNT = '<span class="childrenCount">&nbsp;(' + CHILDREN_COUNT_REPLACE + ')</span>';
            var TABINDEX = 0;
            var TABINDEX_REPLACE = "_tabindex_";
            var CODE_REPLACE = '_code_';
            var PORTLET_ID_REPLACE = '_portletId_';
            var LANGUAGE_REPLACE = '_language_';
            var ELEMENT_TYPE_REPLACE = '_elementType_';
            var LABEL_REPLACE = '_label_';
            var DOMAIN_REPLACE = '_domain_';
            var SUBDOMAIN_REPLACE = '_subdomain_';
            var SUBJECT_REPLACE = '_subjectid_';
            var EVENT_REPLACE = '_event_';

            //var NESTED_TEMPLATE_ANCHOR = '<a rel="nofollow" tabindex="' + TABINDEX_REPLACE + '" href="/browse-by-subject?' +
            var NESTED_TEMPLATE_ANCHOR = '<a rel="nofollow" tabindex="-1" href="./browse-by-subject?' +
                    'p_p_id=' + PORTLET_ID_REPLACE + '&' +
                    'p_p_lifecycle=1&' +
                    'p_p_state=normal&' +
                    'p_p_mode=view&' +
                    'p_p_col_id=maintop&' +
                    'p_p_col_count=1&' +
                    '_' + PORTLET_ID_REPLACE + '_javax.portlet.action=subject&' +
                    'userLocale=' + LANGUAGE_REPLACE + '&' +
                    'elementType=' + ELEMENT_TYPE_REPLACE + '&' +
                    'SEARCH_TYPE=' + 'BROWSE_BY_SUBJECT' + '&' +
                    'selectedSubjectId=' + CODE_REPLACE +
                    DOMAIN_REPLACE +
                    SUBDOMAIN_REPLACE +
                    SUBJECT_REPLACE +
                    '" ' + EVENT_REPLACE + '>' + LABEL_REPLACE + '</a>';
            var ON_CLICK_ANCHOR = './browse-by-subject?' +
                    'p_p_id=' + PORTLET_ID_REPLACE + '&' +
                    'p_p_lifecycle=1&' +
                    'p_p_state=normal&' +
                    'p_p_mode=view&' +
                    'p_p_col_id=maintop&' +
                    'p_p_col_count=1&' +
                    '_' + PORTLET_ID_REPLACE + '_javax.portlet.action=subject&' +
                    'userLocale=' + LANGUAGE_REPLACE + '&' +
                    'elementType=' + ELEMENT_TYPE_REPLACE + '&' +
                    'SEARCH_TYPE=' + 'BROWSE_BY_SUBJECT' + '&' +
                    'selectedSubjectId=' + CODE_REPLACE +
                    DOMAIN_REPLACE +
                    SUBDOMAIN_REPLACE +
                    SUBJECT_REPLACE;

            var NESTED_TEMPLATE_LABEL = '' + LABEL_REPLACE + '';

            isMobile = function (Y) {
                if (Y == undefined || Y == null) {
                    return false;
                }
                //console.log('width is ' + Y.one("body").get("winWidth"));
                return Y.one("body").get("winWidth") <= 992;
            }

            isSubjectSelectedAfterMobileQuery = function (Y) {
                //console.log('isSubjectSelectedAfterMobileQuery ? ' + (isMobile(Y) && (SELECTED_ELEMENT_LABEL != undefined && SELECTED_ELEMENT_LABEL != null && SELECTED_ELEMENT_LABEL != '')));
                return isMobile(Y) && (SELECTED_ELEMENT_LABEL != undefined && SELECTED_ELEMENT_LABEL != null && SELECTED_ELEMENT_LABEL != '');
            }

            YUI().use('node', 'widget', 'widget-parent', 'widget-child', 'node-focusmanager', 'json-parse', 'aui-io-request', 'node-event-simulate', function (Y) {
                Y.ListBox = Y.Base.create("listbox", Y.Widget, [Y.WidgetParent, Y.WidgetChild], {

                    // The default content box for ListBoxes will be a UL (Widget uses a DIV by default)
                    BOUNDING_TEMPLATE: '<li class="yui3-listbox-option list-item"></li>',
                    CONTENT_TEMPLATE: '<ul class="div-block-mob item-list vertical hidden"></ul>',

                    // Setup Custom Listeners
                    bindUI: function () {

                        if (this.isRoot()) {

                            // Setup custom focus handling, using the NodeFocusManager plugin
                            // This will help us easily crete next/previous item handling using the arrow keys

                            this.get("contentBox").plug(Y.Plugin.NodeFocusManager, {
                                descendants: ".yui3-option",
                                keys: {
                                    next: "down:40",    // Down arrow
                                    previous: "up:38" // Up arrow
                                },
                                circular: true
                            });
                        }

                        /*this.get("contentBox").on("contextmenu", function (event) {
                         event.preventDefault();
                         });*/

                        // Setup listener to control keyboard based single/multiple item selection
                        this.on("option:keydown", function (event) {

                            var item = event.target,
                                    domEvent = event.domEvent,
                                    keyCode = domEvent.keyCode,
                                    direction = (keyCode == 40);

                            if (this.get("multiple")) {
                                if (keyCode == 40 || keyCode == 38) {
                                    if (domEvent.shiftKey) {
                                        this._selectNextSibling(item, direction);
                                    }
                                    else {
                                        this.deselectAll();
                                        this._selectNextSibling(item, direction);
                                    }
                                }
                            }
                            else {
                                if (keyCode == 13 || keyCode == 32) {
                                    domEvent.preventDefault();
                                    item.set("selected", 1);
                                }
                            }
                        });

                        // Setup listener to control mouse based single/multiple item selection
                        this.on("option:mousedown", function (event) {
                            event.stopPropagation();
                            //console.log('option:mousedown...');
                            event.target.set("frommousedown", "1");
                            event.target.frommousedown = "1";
                            this._selectOnMouseDown(this, event.target, event.domEvent);
                        });
                    },

                    // Helper Method, to find the correct next sibling, taking into account nested ListBoxes
                    _selectNextSibling: function (item, direction) {

                        var parent = item.get("parent"),
                                method = (direction) ? "next" : "previous",

                        // Only go circular for the root listbox
                                circular = (parent === this),
                                sibling = item[method](circular);

                        if (sibling) {
                            // If we found a sibling, it's either an Option or a ListBox
                            if (sibling instanceof Y.ListBox || sibling instanceof Y.RootListBox) {
                                // If it's a ListBox, select it's first child (in the direction we're headed)
                                sibling.selectChild((direction) ? 0 : sibling.size() - 1);
                            }
                            else {
                                // If it's an Option, select it
                                sibling.set("selected", 1);
                            }
                        }
                        else {
                            // If we didn't find a sibling, we're at the last leaf in a nested ListBox
                            parent[method](true).set("selected", 1);
                        }
                    },

                    _selectOnMouseDown: function (root, item, domEvent) {
                        //console.log('_selectOnMouseDown: ');
                        //console.log('root: ' + root);
                        //console.log('item: ' + item);
                        if (root.get("multiple")) {
                            if (domEvent.metaKey) {
                                item.set("selected", 1);
                            }
                            else {
                                root.deselectAll();
                                item.set("selected", 1);
                            }
                        }
                        else {
                            try {
                                root.deselectAll();
                                //console.log('item set selected');
                                item.set("selected", 1);
                            } catch (exception) {
                                //console.log(exception);
                            }
                        }
                    },

                    // The markup template we use internally to render nested ListBox children
                    NESTED_TEMPLATE: '<li></li>',

                    renderUI: function () {
                        var content = getIconAndLabel(this);
                        if (content != undefined) {
                            var boundingBox = this.get("boundingBox");
                            boundingBox.addClass('level' + this.get("depth"));
                            boundingBox.setAttribute("tabindex","0");
                            var contentBox = this.get("contentBox");

                            var contentWrapper = Y.Node.create('<div tabindex="0" role="button" class="listbox-content-wrapper list-subject-dispatcher"></div>');
                            contentWrapper.setContent(content);

                            boundingBox.insertBefore(contentWrapper, contentBox);

                            var t = this;
                            contentWrapper.on('mousedown', function (event) {
                                //console.log('mousedown on contentwrapper...');
                                t.set("frommousedown", "1");
                                return subjectSelectionChange(event, t, true);
                            });

                            this.after("render", function (event) {
                                PAGE_RENDERED = true;
                                afterListElementRender(this);

                                var elementsDispatch = document.querySelectorAll(".list-subject-dispatcher");
                                elementsDispatch.forEach(
                                    function(item, index) {
                                        item.addEventListener("keydown", function(event) {
                                            if (event.key === "Enter") {
                                                item.dispatchEvent(new Event('mousedown'));
                                            }
                                        });
                                    });

                            })
                        }
                    }

                }, {
                    // Define any new attributes, or override existing ones
                    ATTRS: {

                        // We need to define the default child class to use,
                        // when we need to create children from the configuration
                        // object passed to add or to the "children" attribute (which is provided by WidgetParent)

                        // In this case, when a configuration object (e.g. { label:"My Option" }),
                        // is passed into the add method,or as the value of the "children"
                        // attribute, we want to create instances of Y.Option
                        defaultChildType: {
                            value: "Option"
                        },

                        // Setup Label Attribute
                        identifier: {
                        },
                        code: {
                            validator: Y.Lang.isString
                        },
                        label: {
                            validator: Y.Lang.isString
                        },
                        elementType: {

                        },
                        childrenCount: {

                        },
                        frommousedown: {

                        }
                    }
                });

                Y.RootListBox = Y.Base.create("rootlistbox", Y.ListBox, [Y.WidgetParent, Y.WidgetChild], {
                    BOUNDING_TEMPLATE: '<div></div>',
                    CONTENT_TEMPLATE: '<ul class="div-block-mob item-list vertical"></ul>'
                }, {});


                Y.Option = Y.Base.create("option", Y.Widget, [Y.WidgetChild], {

                    // Override the default DIVs used for rendering the bounding box and content box.
                    //CONTENT_TEMPLATE: "<span></span>",
                    BOUNDING_TEMPLATE: "<li class='list-item'></li>",

                    // Handle rendering the label attribute
                    renderUI: function () {
                        var contentBox = this.get("contentBox");
                        contentBox.setContent(getIconAndLabel(this));

                        this.after("render", function (event) {
                            afterListElementRender(this);

                            var elementsDispatch = document.querySelectorAll(".list-subject-dispatcher");
                            elementsDispatch.forEach(
                                function(item, index) {
                                    item.addEventListener("keydown", function(event) {
                                        if (event.key === "Enter") {
                                            item.dispatchEvent(new Event('mousedown'));
                                        }
                                    });
                                });
                        })
                    }

                }, {

                    ATTRS: {

                        // Setup Label Attribute
                        identifier: {
                        },
                        code: {
                            validator: Y.Lang.isString
                        },
                        label: {
                            validator: Y.Lang.isString
                        },
                        elementType: {

                        },
                        childrenCount: {

                        },

                        // Override the default tabIndex for an Option,
                        // since we want FocusManager to control keyboard
                        // based focus
                        tabIndex: {
                            value: 0
                        },
                        frommousedown: {

                        }
                    }

                });

                afterListElementRender = function (element) {
                    try {
                        if (!SELECTED_CODES) {
                            return;
                        }

                        var code = element.get(CODE);
                        var elementType = element.get(ELEMENT_TYPE);

                        if (SELECTED_CODES.length >= (elementType + 1) && SELECTED_CODES[elementType] == code) {
                            //console.log('preparing to select code ' + code + ' of elementType ' + elementType);
                            if (element instanceof Y.ListBox) {
                                //console.log('afterRender SELECTED Y.ListBox code: ' + code + ', id: ' + element.get('id') + ' > ' + element + ' > boundingbox is ' + element.get('boundingBox'));
                                var d = document.getElementById(element.get('id')).children[0];
                                d.className = d.className + ' yui3-option-selected';
                                //Add ARIA tag
                                d.setAttribute("aria-selected", "true");
                                //console.log('added class.');
                                toggleChildrenContentBox(element);
                                toggleParentsContentBox(element);
                            }
                            else {
                                setTimeout(function () {
                                    element.set('selected', 1); // working only for option -> trigger parent selectionChange event
                                }, 50);
                            }

                            if (elementType == 0) {
                                setTimeout(function () {
                                    autoScrollIntoView(DOMAINS_LISTBOX, element.get('id'), element.get('code'), true);
                                }, 200);
                            }
                            else if (elementType == 1) {
                                setTimeout(function () {
                                    autoScrollIntoView(SUB_DOMAINS_LISTBOX, element.get('id'), element.get('code'), true);
                                }, 150);
                            }
                            else {
                                setTimeout(function () {
                                    autoScrollIntoView(SUBJECTS_LISTBOX, element.get('id'), element.get('code'), true);
                                }, 150);
                            }

                            //console.log('selected option code=' + code + ', id=' + this.get("id"));
                            return;
                        }

                    } catch (exception) {
                        //console.log(exception);
                    }
                };
                setSearchButtonAction = function (Y, widget) {
                    try {
                        //console.log('2');
                        var code = widget.get(CODE);
                        if (code == undefined) {
                            //console.log('code undefined');
                            return undefined;
                        }
                        //console.log('code:' + code);

                        var isOption = widget.name == 'option';
                        var label = widget.get(LABEL);
                        var elementType = widget.get(ELEMENT_TYPE);
                        var childrenCount = widget.get(CHILDREN_COUNT);

                        var newLocation = '';
                        newLocation = ON_CLICK_ANCHOR.replace(CODE_REPLACE, code).replace(LABEL_REPLACE, label).replace(ELEMENT_TYPE_REPLACE, elementType)
                                .replace(PORTLET_ID_REPLACE, PORTLET_ID).replace(PORTLET_ID_REPLACE, PORTLET_ID).replace(LANGUAGE_REPLACE, language);

                        var domainstring = (elementType > 0 ? '&' + EUROVOC_DOMAIN_FACET + '=' + SELECTED_CODES[0] : (elementType == 0 ? '&' + EUROVOC_DOMAIN_FACET + '=' + code : ''));
                        var subdomainstring = (elementType > 1 ? '&' + EUROVOC_SUBDOMAIN_FACET + '=' + SELECTED_CODES[1] : (elementType == 1 ? '&' + EUROVOC_SUBDOMAIN_FACET + '=' + code : ''));
                        var subjectstring = (elementType == 2 ? '&' + EUROVOC_SUBJECT_FACET + '=' + code : '');
                        //console.log('domainString=' + domainstring);
                        //console.log('subdomainstring=' + subdomainstring);
                        //console.log('subjectstring =' + subjectstring);

                        if (PAGE_RENDERED == true) {
                            if (elementType == 0) {
                                SELECTED_CODES = [code];
                            } else if (elementType == 1) {
                                SELECTED_CODES = [SELECTED_CODES[0], code];
                            } else if (elementType == 2) {
                                SELECTED_CODES = [SELECTED_CODES[0], SELECTED_CODES[1], code];
                            }
                        }

//                        if (elementType == 0) {
//                            DOMAIN_URL = domainstring;
//                            SUBDOMAIN_URL='';
//                            SUBJECT_URL='';
//                        } else if (elementType == 1) {
//                            SUBDOMAIN_URL = subdomainstring;
//                            SUBJECT_URL='';
//                        } else if (elementType == 2) {
//                            SUBJECT_URL = subjectstring;
//                        }


                        newLocation = newLocation.replace(DOMAIN_REPLACE, domainstring).replace(SUBDOMAIN_REPLACE, subdomainstring).replace(SUBJECT_REPLACE, subjectstring);

                        //console.log('new location2=' + newLocation);

                        //console.log(Y.one('#' + SEARCH_LINK));
                        Y.one("#" + SEARCH_LINK).set("href", newLocation);

                    } catch (exception) {
                        //console.log(exception);
                    }
                };


                getIconAndLabel = function (widget) {
                    var code = widget.get(CODE);
                    if (code == undefined) {
                        return undefined;
                    }

                    var isOption = widget.name == 'option';
                    var label = widget.get(LABEL);
                    var elementType = widget.get(ELEMENT_TYPE);
                    var childrenCount = widget.get(CHILDREN_COUNT);

                    if (elementType != 2 || elementType == 2 && childrenCount != undefined && childrenCount > 0) {
                        label = NESTED_TEMPLATE_LABEL.replace(CODE_REPLACE, code).replace(LABEL_REPLACE, label).replace(ELEMENT_TYPE_REPLACE, elementType)
                                .replace(PORTLET_ID_REPLACE, PORTLET_ID).replace(PORTLET_ID_REPLACE, PORTLET_ID).replace(LANGUAGE_REPLACE, language);
                    }
                    else {
                        label = NESTED_TEMPLATE_ANCHOR.replace(CODE_REPLACE, code).replace(LABEL_REPLACE, label).replace(ELEMENT_TYPE_REPLACE, elementType)
                                .replace(PORTLET_ID_REPLACE, PORTLET_ID).replace(PORTLET_ID_REPLACE, PORTLET_ID).replace(LANGUAGE_REPLACE, language);
                    }
                    //label = NESTED_TEMPLATE_ANCHOR.replace(TABINDEX_REPLACE, '' + TABINDEX).replace(CODE_REPLACE, code).replace(LABEL_REPLACE, label).replace(ELEMENT_TYPE_REPLACE, elementType);
                    //TABINDEX++;

                    var domainstring = (elementType > 0 ? '&' + EUROVOC_DOMAIN_FACET + '=' + SELECTED_CODES[0] : (elementType == 0 ? '&' + EUROVOC_DOMAIN_FACET + '=' + code : ''));
                    var subdomainstring = (elementType > 1 ? '&' + EUROVOC_SUBDOMAIN_FACET + '=' + SELECTED_CODES[1] : (elementType == 1 ? '&' + EUROVOC_SUBDOMAIN_FACET + '=' + code : ''));
                    var subjectstring = (elementType == 2 ? '&' + EUROVOC_SUBJECT_FACET + '=' + code : '');
                    label = label.replace(DOMAIN_REPLACE, domainstring).replace(SUBDOMAIN_REPLACE, subdomainstring).replace(SUBJECT_REPLACE, subjectstring);

                    if (isMobile(Y)) {
                        var onclick = (elementType != 2 ||
                                (elementType == 2 && childrenCount != undefined && childrenCount > 0) ? 'onclick="event.preventDefault();"' : '');
                        label = label.replace(EVENT_REPLACE, onclick);
                    }

                    var icon = (isOption != undefined && isOption ? NESTED_TEMPLATE_OPTION_ICON : NESTED_TEMPLATE_ICON);
                    var childrenCountDisplay = (childrenCount == undefined || childrenCount == 0 ? '' : NESTED_TEMPLATE_CHILDREN_COUNT.replace(CHILDREN_COUNT_REPLACE, childrenCount));

                    return icon + label + childrenCountDisplay;
                };

                getSubDomains = function (domainId) {
                    for (var i = 0; i < DOMAINS_CACHE.length; i++) {
                        var domain = DOMAINS_CACHE[i];
                        if (domain.id == domainId) {
                            return domain.subDomains;
                        }
                    }
                    return [];
                };

                getSubjects = function (domainId, subDomainId) {
                    var subDomains = getSubDomains(domainId);
                    for (var i = 0; i < subDomains.length; i++) {
                        var subDomain = subDomains[i];
                        if (subDomain.id == subDomainId) {
                            return subDomain.subjects;
                        }
                    }
                    return [];
                };

                getOptionElements = function (list) {
                    var optionElements = [];
                    for (var i = 0; i < list.length; i++) {
                        var element = list[i];
                        var childrenCount = getChildrenCount(element);
                        var optionElement = getOptionElement(element.id, element.code, element.label, element.elementType, element.children, childrenCount);
                        optionElements.push(optionElement);
                    }
                    return optionElements;
                };

                getChildrenCount = function (element) {
                    if (element == undefined || element == null) {
                        return 0;
                    }
                    var children = element.children;
                    if (children != undefined && children != null) {
                        return children.length;

                    }
                    else {
                        var subDomains = element.subDomains;
                        var subjects = element.subjects;
                        if (subDomains != undefined && subDomains != null) {
                            return subDomains.length;
                        }
                        else if (subjects != undefined && subjects != null) {
                            return subjects.length;
                        }
                    }

                    return 0;
                }

                getOptionElement = function (id, code, label, elementType, children, childrenCount) {
                    if (children == undefined || children == null || children.length == 0) {
                        return {
                            type: "Option",
                            identifier: id,
                            code: code,
                            label: label,
                            elementType: elementType,
                            childrenCount: childrenCount
                        };
                    }
                    else {
                        return {
                            type: "ListBox",
                            identifier: id,
                            code: code,
                            label: label,
                            elementType: elementType,
                            childrenCount: childrenCount,
                            children: getOptionElements(children)
                        };
                    }
                };

                getSelection = function (object) {
                    if (object == undefined || object == null) {
                        return object;
                    }

                    var selection = object.get("selection");
                    if (selection == undefined || selection == null) {
                        return object;
                    }

                    if (selection instanceof Y.ListBox) {
                        selection = getSelection(selection);
                    }

                    return selection;
                };

                storeSubjects = function (data) {
                    if (data != undefined && data != null) {
                        try {
                            DOMAINS_CACHE = Y.JSON.parse(data);
                        } catch (e) {
                            //console.log("Error at json parsing and processing. " + e);
                        }
                    }
                    else {
                        //console.log('empty response from server');
                    }
                }

                fillBoxesWithDataFromCache = function (domainsListBox) {
                    try {
                        var optionElements = getOptionElements(DOMAINS_CACHE);
                        for (var i = 0; i < optionElements.length; i++) {
                            domainsListBox.add(optionElements[i]);
                        }
                    } catch (e) {
                        //console.log("Error at filling boxes from cache. " + e);
                    }

                    setTimeout(function () {
                        YUI().use('node', 'widget', function (Y) {
                            Y.one('#browse-by-subject-loader').hide();
                            Y.all('.document-domain').removeClass('hide');
                        });
                    }, 150);
                }

                autoScrollIntoView = function (containerId, childId, childCode, useRealdirtyhack) {
                    try {
                        var target = document.getElementById(childId);
                        var container = document.getElementById(containerId);

                        var targetOffsetTop = (useRealdirtyhack != undefined && useRealdirtyhack ? (target.offsetTop < 150 ? 0 : target.offsetTop - 150) : target.offsetTop);

                        targetOffsetTop = (useRealdirtyhack != undefined && useRealdirtyhack &&
                                parseInt(childCode) < 100 && parseInt(childCode) > 40 ? 200 : targetOffsetTop);

                        //console.log(childCode + ': container.scrollTop=' + container.scrollTop + ', target.offsetTop=' + targetOffsetTop + ' vs ' + target.offsetTop);
                        container.scrollTop = targetOffsetTop;
                    } catch (exception) {
                        //console.log(exception)
                    }

                }

                /**
                 *
                 * @param Y - yui instance
                 * @param identifier
                 * @param code
                 * @param language
                 * @param subjectSelectedActionURL
                 * @param elementType - 0 for domain, 1 for subdomain, 2 for subject
                 * @param selection
                 */
                handleQuery = function (Y, event, language, subjectSelectedActionURL, elementType, selection) {
                    var code = selection.get(CODE);
                    if (code == undefined) {
                        //console.log('return false no code');
                        return false;
                    }

                    //console.log('handle query for ' + elementType);

                    var identifier = selection.get(IDENTIFIER);

                    var isAlreadySelectedCode = SELECTED_CODES && SELECTED_CODES[elementType] == code;
                    //console.log('with code: ' + code + '. already selected codes: ' + SELECTED_CODES);
                    if (isMobile(Y) && isAlreadySelectedCode) { // 0 domain, 1 subdomain, 2 subject
                        return false;
                    }

                    var hasChildren = selection.name == 'listbox';
                    //console.log('isMobile(Y) ? ' + isMobile(Y) + '. elementType=' + elementType + '. hasChildren ? ' + hasChildren);
                    if (isMobile(Y) && (elementType != 2 || hasChildren)) {
                        return false;
                    }


                    if ((elementType != 2 || hasChildren)) {
                        return false;
                    }


                    var frommousedown = selection.get("frommousedown") == "1" || selection.frommousedown == "1";
                    //console.log('frommousedown ? ' + frommousedown);
                    var allowReselectionOfHigherElementInDesktopVersion = frommousedown;
                    //console.log('allowReselectionOfHigherElementInDesktopVersion ? ' + allowReselectionOfHigherElementInDesktopVersion);
                    if (!isMobile(Y) && !allowReselectionOfHigherElementInDesktopVersion) {
                        return false;
                    }

                    //console.log('SELECTED_ELEMENT_ID != code ? ' + SELECTED_ELEMENT_ID + ' != ' + code);
                    if (identifier && code && SELECTED_ELEMENT_ID != code) {
                        /*var domainstring = (elementType > 0 ? '&' + EUROVOC_DOMAIN_FACET + '=' + SELECTED_CODES[0] : (elementType == 0 ? '&' + EUROVOC_DOMAIN_FACET + '=' + code : ''));
                         var subdomainstring = (elementType > 1 ? '&' + EUROVOC_SUBDOMAIN_FACET + '=' + SELECTED_CODES[1] : (elementType == 1 ? '&' + EUROVOC_SUBDOMAIN_FACET + '=' + code : ''));
                         var subjectstring = (elementType == 2 ? '&' + EUROVOC_SUBJECT_FACET + '=' + code : '');

                         var url = subjectSelectedActionURL +
                         '&' + USER_LOCALE_PARAM + '=' + language +
                         '&' + ELEMENT_TYPE_PARAM + '=' + elementType +
                         '&' + SELECTED_SUBJECT_ID_PARAM + '=' + code +
                         domainstring +
                         subdomainstring +
                         subjectstring;
                         window.location = url;*/
                        return true;
                    }

                    return false;
                }

                subjectSelectionChange = function (event, target, isListBox) {
                    //console.log('subjectSelectionChange... with target.frommousedown=' + target.get("frommousedown"));
                    var selection = /*target;*/isListBox ? target : getSelection(target);
                    setSearchButtonAction(Y, selection);
                    selection.set("frommousedown", target.get("frommousedown"));
                    //console.log('after subject selectionChange (isListBox=' + isListBox + ')');

                    Y.one("#" + SUB_DOMAINS_CONTAINER).removeClass("active");
                    //console.log('removed subdomain active 3');

                    if (selection) {
                        var executed = handleQuery(Y, event, language, subjectSelectedActionURL, 2, selection);
                        if (executed || selection.get(CODE) == undefined) {
                            return true;
                        }

                        toggleChildrenContentBox(selection);
                        toggleParentsContentBox(selection);
                    }

                    return true;
                }

                mobileHideSubjectsAfterQuery = function (Y) {
                    if (isSubjectSelectedAfterMobileQuery(Y)) {
                        Y.one("#" + MOBILE_SELECTED_SUBJECT_CONTAINER).addClass("active");

                        Y.one("#" + MOBILE_SELECTED_SUBJECT_CONTAINER + " .back-button").setHTML(SELECTED_ELEMENT_LABEL);
                        Y.one("#" + MOBILE_SELECTED_SUBJECT_CONTAINER + " .back-button").on("click", function (ev) {
                            ev.preventDefault();
                            SELECTED_ELEMENT_LABEL = '';
                            SELECTED_CODES = [];
                            //console.log('reset SELECTED_CODES');

                            Y.one("#" + MOBILE_SELECTED_SUBJECT_CONTAINER).removeClass("active");
                            Y.one("#" + SUBJECTS_CONTAINER).addClass("active");
                            //console.log('added subjects active 3');

                            subjectsListBox.set("selection", "")
                        });
                    }
                }

                toggleChildrenContentBox = function (target) {
                    var contentBox = target.get('contentBox');
                    if (contentBox == undefined) {
                        return;
                    }

                    if (contentBox.hasClass('hidden')) {
                        contentBox.removeClass("hidden");
                        contentBox.addClass("visible");
                        //console.log('set children visible ' + target.get('label'));
                    }
                    else if (contentBox.hasClass('visible')) {
                        contentBox.removeClass("visible");
                        contentBox.addClass("hidden");
                        //console.log('set children hidden ' + target.get('label'));
                    }

                    var boundingBox = target.get('boundingBox');
                    if (boundingBox == undefined) {
                        return;
                    }
                    var wrapper = boundingBox.one('.listbox-content-wrapper');
                    if (wrapper == undefined || wrapper == null) {
                        return;
                    }
                    if (!wrapper.hasClass('expanded')) {
                        wrapper.addClass("expanded");
                    }
                    else {
                        wrapper.removeClass("expanded");
                    }
                }

                toggleParentsContentBox = function (target) {
                    if (target == undefined) {
                        return target;
                    }

                    var parent = target.get('parent');
                    if (parent == undefined || parent.name != 'listbox') {
                        return target;

                    }
                    else {
                        var contentBox = parent.get('contentBox');
                        if (contentBox == undefined) {
                            return;
                        }

                        if (contentBox.hasClass('hidden')) {
                            contentBox.removeClass("hidden");
                            contentBox.addClass("visible");
                            //console.log('set parent visible ' + parent.get('label'));
                        }

                        var boundingBox = parent.get('boundingBox');
                        if (boundingBox == undefined) {
                            return;
                        }
                        var wrapper = boundingBox.one('.listbox-content-wrapper');
                        if (wrapper == undefined || wrapper == null) {
                            return;
                        }
                        if (!wrapper.hasClass('expanded')) {
                            wrapper.addClass("expanded");
                        }
                    }

                    return toggleParentsContentBox(parent);
                }

                renderListbox = function () {
                    var portletNamespaceElement = Y.one('#' + PORTLET_NAMESPACE_PARAM);
                    if(portletNamespaceElement==null){
                        //config page so nothing to be done.Not the best solution but I did not find another issue
                        return;
                    }

                    var portletNamespace = Y.one('#' + PORTLET_NAMESPACE_PARAM).get('value');
                    PORTLET_ID = Y.one('#' + PORTLET_ID_PARAM).get('value');
                    language = Y.one('#' + LANGUAGE_PARAM).get('value');
                    subjectSelectedActionURL = Y.one('#' + SUBJECT_SELECTED_ACTION_URL_PARAM).get('value');
                    var selectedCodes = Y.one('#' + SELECTED_CODES_PARAM).get('value');
                    if (selectedCodes && selectedCodes.length > 0) {
                        SELECTED_CODES = selectedCodes.split(',');
                    }
                    //console.log('render: SELECTED_CODES: ' + SELECTED_CODES);
                    SELECTED_ELEMENT_LABEL = Y.one('#' + SELECTED_SUBJECT_LABEL_PARAM).get('value');
                    SELECTED_ELEMENT_ID = Y.one('#' + SELECTED_SUBJECT_ID_PARAM).get('value');

                    domainsListBox = new Y.RootListBox({
                        id: DOMAINS_LISTBOX
                    });

                    subDomainsListBox = new Y.RootListBox({
                        id: SUB_DOMAINS_LISTBOX
                    });

                    subjectsListBox = new Y.RootListBox({
                        id: SUBJECTS_LISTBOX
                    });

                    domainsListBox.after("selectionChange", function (e) {
                        var selection = getSelection(this);

                        if (selection) {
                            setSearchButtonAction(Y, selection);
                            //console.log('selecting domain: SELECTED_CODES: ' + SELECTED_CODES);
                            if (SELECTED_CODES.length == 0) {
                                SELECTED_CODES.push(selection.get("code"));
                            }

                            var executed = handleQuery(Y, e, language, subjectSelectedActionURL, 0, selection);
                            if (executed || selection.get(CODE) == undefined) {
                                return;
                            }

                            subjectsListBox.removeAll();
                            SUBJECTS_LISTBOX_INTERNAL.get('childNodes').remove();
                            subDomainsListBox.removeAll();
                            SUB_DOMAINS_LISTBOX_INTERNAL.get('childNodes').remove();
                            var optionElements = getOptionElements(getSubDomains(selection.get(IDENTIFIER)));
                            for (var i = 0; i < optionElements.length; i++) {
                                subDomainsListBox.add(optionElements[i]);
                            }

                            Y.one("#" + SUBJECTS_CONTAINER).removeClass("active");
                            Y.one("#" + DOMAINS_CONTAINER).removeClass("active");
                            if (!isSubjectSelectedAfterMobileQuery(Y)) {
                                Y.one("#" + SUB_DOMAINS_CONTAINER).addClass("active");
                                //console.log('added subdomain active 1');
                            }

                            Y.one("#" + SUB_DOMAINS_CONTAINER + " .back-button").setHTML(getIconAndLabel(selection));
                            Y.one("#" + SUB_DOMAINS_CONTAINER + " .back-button").on("click", function (ev) {
                                ev.preventDefault();
                                Y.one("#" + SUB_DOMAINS_CONTAINER).removeClass("active");
                                Y.one("#" + DOMAINS_CONTAINER).addClass("active");
                                //console.log('removed subdomain active 11');
                                domainsListBox.set("selection", "")
                            });
                        }
                    });

                    subDomainsListBox.after("selectionChange", function (e) {
                        var selectedDomain = getSelection(domainsListBox);
                        var selection = getSelection(this);

                        if (selection) {
                            setSearchButtonAction(Y, selection);
                            //console.log('selecting subdomain: SELECTED_CODES: ' + SELECTED_CODES);
                            if (SELECTED_CODES.length == 1) {
                                SELECTED_CODES.push(selection.get("code"));
                            }

                            var executed = handleQuery(Y, e, language, subjectSelectedActionURL, 1, selection);
                            if (executed || selection.get(CODE) == undefined) {
                                return;
                            }
                            //console.log('subdomain not return ');
                            subjectsListBox.removeAll();
                            SUBJECTS_LISTBOX_INTERNAL.get('childNodes').remove();
                            var optionElements = getOptionElements(getSubjects(selectedDomain.get(IDENTIFIER), selection.get(IDENTIFIER)));
                            for (var i = 0; i < optionElements.length; i++) {
                                subjectsListBox.add(optionElements[i]);
                            }

                            Y.one("#" + SUB_DOMAINS_CONTAINER).removeClass("active");
                            //console.log('removed subdomain active 2');
                            if (!isSubjectSelectedAfterMobileQuery(Y)) {
                                Y.one("#" + SUBJECTS_CONTAINER).addClass("active");
                            }

                            Y.one("#" + SUBJECTS_CONTAINER + " .back-button").setHTML(getIconAndLabel(selection));
                            Y.one("#" + SUBJECTS_CONTAINER + " .back-button").on("click", function (ev) {
                                ev.preventDefault();
                                Y.one("#" + SUBJECTS_CONTAINER).removeClass("active");
                                Y.one("#" + SUB_DOMAINS_CONTAINER).addClass("active");
                                //console.log('added subdomain active 22');
                                subDomainsListBox.set("selection", "")
                            });
                        }
                    });

                    subjectsListBox.after("selectionChange", function (e) {
                        return subjectSelectionChange(e, this, false);
                    });

                    domainsListBox.after('render', function (e) {
                        domainsListBox.get('boundingBox').addClass('subject-browser');
                    });
                    subDomainsListBox.after('render', function (e) {
                        subDomainsListBox.get('boundingBox').addClass('subject-browser');
                    });
                    subjectsListBox.after('render', function (e) {
                        subjectsListBox.get('boundingBox').addClass('subject-browser');
                    });

                    var domainsLabel = Y.one("#" + DOMAINS_LABEL).get('value');
                    var subDomainsLabel = Y.one("#" + SUBDOMAINS_LABEL).get('value');
                    var subjectsLabel = Y.one("#" + SUBJECTS_LABEL).get('value');

                    Y.one('#' + DOMAINS_CONTAINER).one('h3').setContent(domainsLabel);
                    Y.one('#' + SUB_DOMAINS_CONTAINER).one('h3').setContent(subDomainsLabel);
                    Y.one('#' + SUBJECTS_CONTAINER).one('h3').setContent(subjectsLabel);

                    //mariuss

                    Y.one('#' + SEARCH_BUTTON).on('click', function () {
                        window.location.href = document.getElementById(SEARCH_LINK).href;
                        return false;//
                    });

                    domainsListBox.render("#" + DOMAINS_CONTAINER);
                    subDomainsListBox.render("#" + SUB_DOMAINS_CONTAINER);
                    subjectsListBox.render("#" + SUBJECTS_CONTAINER);

                    DOMAINS_LISTBOX_INTERNAL = Y.one('#' + DOMAINS_LISTBOX).one('ul');
                    SUB_DOMAINS_LISTBOX_INTERNAL = Y.one('#' + SUB_DOMAINS_LISTBOX).one('ul');
                    SUBJECTS_LISTBOX_INTERNAL = Y.one('#' + SUBJECTS_LISTBOX).one('ul');

                    if (DOMAINS_CACHE.length > 0) {
                        //console.log('domains cache already has content.');
                    }
                    else {
                        Y.io.request(SUBJECT_QUERY_HANDLER_PATH, {
                            method: 'POST',
                            data: {userLocale: language, action: ACTION_ALL},
                            on: {
                                success: function () {
                                    var responseData = this.get('responseData');
                                    storeSubjects(responseData);

                                    if (!isSubjectSelectedAfterMobileQuery(Y)) {
                                        Y.one("#" + DOMAINS_CONTAINER).addClass("active");
                                    }

                                    mobileHideSubjectsAfterQuery(Y);

                                    fillBoxesWithDataFromCache(domainsListBox);
                                }
                            }
                        });
                    }
                };

                renderListbox();


            });
});

AUI().use('node', 'io-base', function (Y) {
    var facetsMap = new Map();
    var applyFiltersLabel = 'Apply\x20Filters' + ' ';
    var lessLabel = 'less\x2e\x2e\x2e';
    var searchMoreLabel = 'More';
    var moreLabel = 'More\x20of\x20category';
    var noResultsLabel = 'No\x20results\x20have\x20been\x20found\x2e';
    
    var searchFacets = function(completeValueUrl, currentFacet, doesBuildHtml, inputValue, facetValuesContainer) {
        var timeStamp = new Date().getTime();
        Y.io(completeValueUrl, {
            method: 'GET',
            data: t=timeStamp,
            on: {
                success: function (id, result) {
                    var facets = Y.JSON.parse(result.responseText);
                    if (facets.length == 0)
                        return;

                    facetsMap.set(currentFacet, facets);
                    allFacetValues = facetsMap;

                    var facetsValues = facetsMap.get(currentFacet);
                    var currentFacetValues = facetsValues[0];

                    if (doesBuildHtml) {
                        buildHtml(currentFacetValues, lessLabel, moreLabel, applyFiltersLabel, searchMoreLabel, false);
                    } else {
                        if (document.getElementsByClassName('ajax-loader')) {
                            document.getElementsByClassName('ajax-loader')[0].remove();
                        }
                        buildHtmlOnFilterFacetValues(currentFacet, inputValue, facetsValues, facetValuesContainer);
                    }

                },
                failure: function (id, result) {
                }
            }
        });
    }

    Y.all('.facets-lists-container .facetSearchResultSelect').each(function (element) {
        element.on('click', function (e) {
            var currentTarget = e.currentTarget;

            var currentId = currentTarget.getAttribute('id');
            if (!currentId) {
                return;
            }
            var currentFacet = currentId.replace('-facetSearchResultSelect', '');
            var completeValueUrl = window.facetRequestURL + currentFacet;
            var timeStamp = new Date().getTime();

            var facetValuesContainer = document.getElementById(currentFacet + ".values");

            if (viewMore(facetValuesContainer, currentFacet, lessLabel, searchMoreLabel)) {
                return;
            }

            if (facetsMap.has(currentFacet)) {
                var facetsValues = facetsMap.get(currentFacet);
                buildHtml(facetsValues[0], lessLabel, moreLabel, applyFiltersLabel, searchMoreLabel, false);

               return;
            }
            searchFacets(completeValueUrl, currentFacet, true, null, null);

        });

        function updateAlreadyDisplayedValues(moreValuesNode, currentFacet) {
            var alreadyDisplayedCodes = [];

            var existingItems = moreValuesNode.ancestor().ancestor().ancestor().all('> li');
            for (var existingItemIndex = 0; existingItemIndex < existingItems.size(); existingItemIndex++) {
                var valueNode = existingItems.item(existingItemIndex);
                var existingFacetCode = valueNode.getAttribute('facetValue');
                alreadyDisplayedCodes.push(existingFacetCode);

                var facetValue = "";
                for (var valueIndex = 0; valueIndex < currentFacet.values.length; valueIndex++) {
                    if (currentFacet.values[valueIndex].code === existingFacetCode) {
                        facetValue = currentFacet.values[valueIndex];
                        break;
                    }
                }
                if (facetValue === "") {
                    continue;
                }

                var childValues = facetValue.childValues;
                if (childValues && childValues.length > 0) {
                    // the existing facet has value so we need to see if they are displayed

                    var childBtn = valueNode.one('.facet-childs-btn');
                    var facetChildrenNode = "";
                    var startIndex = 0;
                    if (childBtn) {
                        startIndex = valueNode.all('.child-facet').size();
                        facetChildrenNode = valueNode.one('.facet-child-values');
                    }
                    else {
                        var facetChildNodeButton = "";
                        facetChildNodeButton = builtFacetControlButton(facetChildNodeButton, facetValue.code);
                        valueNode.appendChild(facetChildNodeButton);
                        facetChildrenNode = getFacetChildNode(facetChildrenNode, facetValue.code);
                        valueNode.appendChild(facetChildrenNode);
                    }
                    for (var c = startIndex; c < childValues.length; c++) {
                        var facetChild = childValues[c];
                        var isChildFacetChecked = (facetChild.checked === "true"||facetChild.checked === true)?true:false;

                        isChildFacetChecked = checkSelectedFacet(facetChild, currentFacet, isChildFacetChecked);
                        var facetChildLabel = createNodeFacet(facetChildLabel, facetChild, isChildFacetChecked, currentFacet, false);

                        //facetChildNode.appendChild(facetChildLabel);
                        facetChildrenNode.appendChild(facetChildLabel);

                    }
                }
            }
            return alreadyDisplayedCodes;
        }

        function checkSelectedFacet(facetChild,currentFacet,isChildFacetChecked){
            var currentFacetConditionChild;
            var hasFacetsChild = false;
            var hasFacetCodeChild = false;
            var isFacetCodeChild = false;
            var hasFacetValuesChild = false;

            for (var k = 0; k < window.searchMetadata.facetValues.length && !isChildFacetChecked; k++) {
                currentFacetConditionChild = window.searchMetadata.facetValues[k];

                hasFacetsChild = currentFacetConditionChild && currentFacetConditionChild.facet;
                hasFacetCodeChild = hasFacetsChild && currentFacetConditionChild.facet.code;
                isFacetCodeChild = hasFacetCodeChild && currentFacetConditionChild.facet.code == currentFacet.facet.code;
                hasFacetValuesChild = isFacetCodeChild && currentFacetConditionChild.values && currentFacetConditionChild.values.length > 0;

                if (hasFacetValuesChild) {
                    for (var l = 0; l < currentFacetConditionChild.values.length && !isChildFacetChecked; l++) {
                        if (currentFacetConditionChild.values[l].code && currentFacetConditionChild.values[l].code == facetChild.code) {
                            isChildFacetChecked = true;
                        }
                    }

                }
            }

            return isChildFacetChecked;
        }


        function createNodeFacet(facetChildLabel, facetChild, isChildFacetChecked, currentFacet, inMorePopup){
            facetChildLabel = Y.Node.create('<div>');

            var childLabel = Y.Node.create('<label>');

            var onclick = " onclick=\"addFilterParameter('"+currentFacet.facet.code+"', '"+facetChild.code+"', '"+isChildFacetChecked+"', this )\"";

            childLabel.setHTML('<input type="checkbox" ' + (isChildFacetChecked ? 'checked="true" checkbox-state="t"' : '') +  onclick +
                + ' data-facet-type="' + currentFacet.facet.code + '" '
                + ' data-facet-code="' + facetChild.code + '" '
                + '/>'
                + (inMorePopup?"":" ") +facetChild.label + ' (' + facetChild.countNumber + ')');

            if (inMorePopup===true) {
                facetChildLabel.addClass("list-item");
            }
            else {
                childLabel.addClass("child-facet");
                childLabel.setAttribute("aria-label", facetChild.label + ' (' + facetChild.countNumber + ')');
            }
            facetChildLabel.appendChild(childLabel);

            return facetChildLabel;
        }

        function builtFacetControlButton(facetChildNodeButton, code) {
            var childSpanMinus =  Y.Node.create('<span>');
            childSpanMinus.addClass("glyphicon glyphicon-plus");
            var childSpanPlus =  Y.Node.create('<span>');
            childSpanPlus.addClass("glyphicon glyphicon-minus");

            facetChildNodeButton = Y.Node.create('<button>');
            facetChildNodeButton.addClass('btn facet-childs-btn collapsed');
            facetChildNodeButton.setAttribute("data-target", "#" + getChildNodeIdentifier(code));
            facetChildNodeButton.setAttribute("type", "button");
            facetChildNodeButton.setAttribute("data-toggle", "collapse");

            facetChildNodeButton.appendChild(childSpanPlus);
            facetChildNodeButton.appendChild(childSpanMinus);

            return facetChildNodeButton;
        }

        function getFacetChildNode(facetChildNode, code) {
            facetChildNode = Y.Node.create('<div>');
            facetChildNode.addClass('collapse facet-child-values facet-child-values-level-2');
            facetChildNode.setAttribute("id", getChildNodeIdentifier(code));
            return facetChildNode;
        }

        function getChildNodeIdentifier(code) {
            return "facet_child_" + code.replaceAll("/","").replaceAll(".","").replaceAll(":","") + "_facet_child_collapse";
        }

    });

    var viewMore = function (facetValuesContainer, currentFacet, lessLabel, searchMoreLabel) {
        var viewLess = false;
        if (facetValuesContainer.classList.contains("collapsed-values")) {
            facetValuesContainer.classList.remove("collapsed-values");
            facetValuesContainer.classList.add("expanded-values");

            document.getElementById(currentFacet + "-facetSearchResultSelect").innerHTML = lessLabel + '<span class="caret" style="transform: rotate(180deg);"></span>';
        } else if (facetValuesContainer.classList.contains("expanded-values")) {
            facetValuesContainer.classList.remove("expanded-values");
            facetValuesContainer.classList.add("collapsed-values");

            const ul = document.getElementById(currentFacet + ".values");
            var start = currentFacet === 'facet.language' ? 6 : 5;
            while (ul.children.length > start) {
                ul.removeChild(ul.children[start]);
            }
            document.getElementById(currentFacet + "-facetSearchResultSelect").innerHTML = searchMoreLabel + '<span class="caret"></span>';
            viewLess = true;
        }
        return viewLess;
    }

    var buildHtml = function (currentFacetValuesInput, lessLabel, moreLabel, applyFiltersLabel, searchMoreLabel, filtered) {
        var facetValuesContainer = document.getElementById(currentFacetValuesInput.facet.code + ".values");

       // viewMore(facetValuesContainer, currentFacet, lessLabel, searchMoreLabel);


        var loadMoreItems = function() {
            var currentFacetValues = {...currentFacetValuesInput};
            var inputValue;

            if (facetValuesContainer.parentElement.querySelector('form input')) {
                inputValue = facetValuesContainer.parentElement.querySelector('form input').value;

                if (currentFacetValuesInput.values.length > 0 && inputValue && inputValue != '') {
                    currentFacetValues.values = currentFacetValuesInput.values.filter(entry => {
                        const matchesEntryLabel = entry.label.toLowerCase().includes(inputValue.toLowerCase());
                        const filteredChildValues = entry.childValues.filter(childValue => childValue.label.toLowerCase().includes(inputValue.toLowerCase()));

                        if (matchesEntryLabel || filteredChildValues.length > 0) {
                            return {
                                ...entry,
                                childValues: filteredChildValues
                            };
                        }

                        return false;
                    });
                }

            }

            var start = facetValuesContainer.children.length;
            var end = start + 20; // Load 20 items at a time

            if (document.getElementsByClassName('no-results') && document.getElementsByClassName('no-results').length > 0) {
                document.getElementsByClassName('no-results')[0].parentElement.remove();
            }

            if (currentFacetValues.values.length == 0) {
                var divItem = Y.Node.create('<div>');
                var label = Y.Node.create('<label>');
                label.addClass('no-results');
                label.setHTML(noResultsLabel);
                divItem.addClass('facet-label');
                divItem.appendChild(label);

                facetValuesContainer.parentElement.insertBefore(divItem.getDOMNode(), facetValuesContainer.parentElement.lastElementChild);
                return;
                }

            for (var j = start; j < end && j < currentFacetValues.values.length; j++) {
                var facetValue = currentFacetValues.values[j];
                if (!facetValue) {
                    return;
                }

                var isFacetChecked = false;
                var currentFacetCondition;
                var hasFacets = false;
                var hasFacetCode = false;
                var isFacetCode = false;
                var hasFacetValues = false;

                for (var k = 0; k < window.searchMetadata.facetValues.length && !isFacetChecked; k++) {
                    currentFacetCondition = window.searchMetadata.facetValues[k];
                    hasFacets = currentFacetCondition && currentFacetCondition.facet;
                    hasFacetCode = hasFacets && currentFacetCondition.facet.code;
                    isFacetCode = hasFacetCode && currentFacetCondition.facet.code == currentFacetValues.facet.code;
                    hasFacetValues = isFacetCode && currentFacetCondition.values && currentFacetCondition.values.length > 0;

                    if (hasFacetValues) {
                        for (var l = 0; l < currentFacetCondition.values.length && !isFacetChecked; l++) {
                            if (currentFacetCondition.values[l].code && currentFacetCondition.values[l].code == facetValue.code) {
                                isFacetChecked = true;
                            }
                        }
                    }
                }

                if (!isFacetChecked) {
                    for (var i = 0; i < filterSearchParam.length; i++) {
                        if (filterSearchParam[i].facet === currentFacetValues.facet.code && filterSearchParam[i].code === facetValue.code) {
                            isFacetChecked = !(filterSearchParam[i].value);
                            break;
                        }
                    }
                }

                var childValues = facetValue.childValues;
                var labelValue = facetValue.label;

                var label = Y.Node.create('<label' + ' aria-label="' + applyFiltersLabel + labelValue + '(' + facetValue.countNumber + ')' + '"'
                    + (childValues.length > 0 ? ' class="parent-facet"' : '')
                    + '>');

                if ("MOBILE" === labelValue.toUpperCase()) {
                    labelValue = "EU APPS";
                }

                let facetCodeId = facetValue.code;
                facetCodeId = facetCodeId.replaceAll("/", "").replaceAll(".", "").replaceAll(":", "");

                label.setHTML('<input onclick="addFilterParameter(\'' + currentFacetValues.facet.code + '\',\'' + facetValue.code + '\',' + isFacetChecked + ',this)" type="checkbox" '
                    + ' data-facet-type="' + currentFacetValues.facet.code + '" '
                    + ' data-facet-code="' + facetValue.code + '" '
                    + ' data-facet-value="' + isFacetChecked + '" '
                    + (isFacetChecked ? 'checked="true" checkbox-state="t"' : '') + '/> '
                    + '<span class="checkbox-label">' + labelValue + ' (' + facetValue.countNumber + ')' +
                    '</span>');

                var divItem = Y.Node.create('<div>');
                divItem.addClass('facet-label');
                divItem.setHTML((childValues.length > 0 ? '<button class="btn facet-childs-btn collapsed" ' +
                    ' type="button" ' +
                    ' data-toggle="collapse" ' +
                    ' onclick="ariaBtnExpand(\'' + facetCodeId + '_facet_collapse\',\'' + labelValue + '\')" ' +
                    ' aria-label="' + moreLabel + labelValue + '"' +
                    ' data-target="#dt_' + facetCodeId + '_facet_collapse" >' +
                    '<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>' +
                    '<span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span>' +
                    '</button>' : ''));
                divItem.appendChild(label);
                var listItem = Y.Node.create('<li>');
                listItem.addClass('list-item ' + currentFacetValues.facet.code.replaceAll(".", "-") + "-value");
                listItem.attr('facetValue', facetValue.code);
                //listItem.appendChild(divItem);

                if (childValues.length > 0) {
                    var html = '<ul class="collapse facet-child-values" id="dt_' + facetCodeId + '_facet_collapse">';
                    for (var f = 0; f < childValues.length; f++) {
                        var childValue = childValues[f];
                        var hasFilter = childValue.checked;
                        var facetCode = currentFacetValues.facet.code;
                        var childCode = childValue.code;
                        var isChildCk = childValue.checked;
                        var childLabel = childValue.label;
                        var childVal = childValue.countNumber;

                        if (isFacetChecked) {
                            hasFilter = true;
                        }
                        if (!hasFilter) {
                            for (var i = 0; i < filterSearchParam.length; i++) {
                                if (filterSearchParam[i].facet === facetCode && filterSearchParam[i].code === childCode) {
                                    hasFilter = !(filterSearchParam[i].value);
                                    break;
                                }
                            }
                        }
                        if (!isFacetChecked && hasFilter) {
                            divItem.addClass('partial-checked');
                        }

                        html += '<li>';
                        html += '<label class="child-facet"' + ' aria-label="' + applyFiltersLabel + childLabel + '(' + childVal + ')' + '">';
                        html +=  '<input onclick="addFilterParameter(\'' + facetCode + '\',\'' + childCode + '\',' + isChildCk + ',this)" type="checkbox"  class="facetCheckbox"'
                            + ' data-facet-type="' + facetCode + '" '
                            + ' data-facet-code="' + childCode + '" '
                            + ' data-facet-value="' + hasFilter + '" '
                            + (hasFilter ? 'checked="true" checkbox-state="t"' : '') + '/> '
                            + '<span class="checkbox-label">'  + childLabel + '(' + childVal + ')' +
                            '</span></label>';
                        html += '</li>';
                    }
                    html += '</ul>';
                    divItem.appendChild(html);
                }
                listItem.appendChild(divItem);
                facetValuesContainer.appendChild(listItem.getDOMNode());
            }
        };

        // Initial load
        loadMoreItems();

        // Scroll event handler
        var onScroll = function() {
            if ((facetValuesContainer.scrollTop + facetValuesContainer.clientHeight) + 1 >= facetValuesContainer.scrollHeight) {

                if (document.querySelector(".menu-list.vertical.level1." + currentFacetValuesInput.facet.code.replaceAll(".", "-") + "-values.expanded-values")) {
                    loadMoreItems();
                }
            }
        };

        // Attach scroll event listener to the container
        facetValuesContainer.addEventListener('scroll', onScroll);
    };
    var buildHtmlOnFilterFacetValues = function(facetCode, inputValue, facetsValues, facetValuesContainer) {
        var filteredValues;
        if (facetsValues && inputValue) {
            filteredValues = facetsValues[0].values
                .map(entry => {
                    // Filter childValues based on inputValue
                    const filteredChildValues = entry.childValues.filter(childValue =>
                        childValue.label.toLowerCase().includes(inputValue.toLowerCase())
                    );

                    // Check if entry label or any of the filtered child values match the inputValue
                    if (entry.label.toLowerCase().includes(inputValue.toLowerCase()) || filteredChildValues.length > 0) {
                        return {
                            ...entry,
                            childValues: filteredChildValues
                        };
                    }

                    return null;
                })
                .filter(entry => entry !== null);

        }

        if (!inputValue) {
            buildHtml(facetsValues[0], lessLabel, moreLabel, applyFiltersLabel, searchMoreLabel, false);
        } else {
            if (filteredValues) {
                var currentFacetValues = {
                    ...facetsValues[0],
                    values: filteredValues
                };
                buildHtml(currentFacetValues, lessLabel, moreLabel, applyFiltersLabel, searchMoreLabel, true);
            }
        }


        if (facetValuesContainer.classList.contains("collapsed-values")) {
            facetValuesContainer.classList.remove("collapsed-values");
            facetValuesContainer.classList.add("expanded-values");

            document.getElementById(facetCode.replaceAll("-", ".") + "-facetSearchResultSelect").innerHTML = lessLabel + '<span class="caret" style="transform: rotate(180deg);"></span>';
        }
    }
    var filterFacetValues = function (facetCode, inputId) {
        const facetValuesContainer = document.getElementById(facetCode.replaceAll("-", ".") + ".values");

        while (facetValuesContainer.children.length  > 0) {
            facetValuesContainer.removeChild(facetValuesContainer.children[0]);
        }
        var inputValue = Y.one('#' + inputId).get('value').toLowerCase();

        var facetsValues = facetsMap.get(facetCode.replaceAll("-", "."));

        if (!facetsValues) {
            var completeValueUrl = window.facetRequestURL + facetCode.replaceAll("-", ".");

            var divItem = Y.Node.create('<div>');
            divItem.addClass('ajax-loader')

            facetValuesContainer.parentElement.insertBefore(divItem.getDOMNode(), facetValuesContainer.parentElement.lastElementChild);

            searchFacets(completeValueUrl, facetCode.replaceAll("-", "."), false, inputValue, facetValuesContainer);

        } else {
            buildHtmlOnFilterFacetValues(facetCode, inputValue, facetsValues, facetValuesContainer);
        }

    }
    if ( Y.one('#searchSubject-button')) {
        Y.one('#searchSubject-button').on('click', function (e) {
            e.preventDefault();
            filterFacetValues("facet-eurovoc-subject", "searchSubject");
        });
    }
    if (Y.one('#searchAuthor-button')) {
        Y.one('#searchAuthor-button').on('click', function (e) {
            e.preventDefault();
            filterFacetValues("facet-authorHierarchy", "searchAuthor");
        });
    }
});

function getFacetSearchURL(code, value, checked) {
    var facetSearchURL = '<%=facetSearchURL%>';
    if (!checked) {
        facetSearchURL = facetSearchURL.replace('code_placeholder', code);
        facetSearchURL = facetSearchURL.replace('value_placeholder', value);
    }
    else {
        facetSearchURL = facetSearchURL.replace('&code_placeholder=value_placeholder,', '');
        if (facetSearchURL.indexOf(code) != -1) {
            var regex = new RegExp("(?:" + code + "=)([^&]*)");
            var match = regex.exec(facetSearchURL);
            if (match && match.length > 0) {
                var foundedGroup = match[1].split(',');
                for (var i = foundedGroup.length - 1; i >= 0; i--) {
                    if (foundedGroup[i] == value) {
                        foundedGroup.splice(i, 1);
                    }
                }
                facetSearchURL = facetSearchURL.replace(match[1], foundedGroup.join(','));
            }
        }
    }
    return facetSearchURL;
}

var enableDisableRangeParameter = function(facetType, rangeCode, object) {
    var crtObj = AUI().one(object);
    var checkbox_state = crtObj.getAttribute("checkbox-state");
    if (checkbox_state === "t") {
        checkbox_state = "f";
    } else {
        checkbox_state = "t";
    }

    var ulParent = crtObj.ancestor("ul");
    if (ulParent) {
        var liChildren = ulParent.all("li");
        liChildren.each(function(elem) {
            var liFacetCode = elem.getAttribute("facetvalue");
            if (liFacetCode !== rangeCode) {
                var checkbox = elem.one("input");
                checkbox.set("checked", false);
                checkbox.setAttribute("checkbox-state", "f");
            } else {
                clearRangeFacet(elem);
            }
        });
        for(var j = 0; j< filterSearchParam.length; j++) {
            if(filterSearchParam[j].facet === facetType) {
                filterSearchParam[j].value = true;
                filterSearchParam[j].code = '';
                crtObj.setAttribute('checkbox-state', 'f');
                break;
            }
        }
    }
    crtObj.setAttribute('checkbox-state', checkbox_state);
    var slider = sliders[rangeCode];
    if (checkbox_state === "t") {
        slider.enable();
    } else {
        slider.disable();
    }
};
var clearRangeFacet = function(elem){
    var minProperty = elem.getData('min-property');
    var maxProperty = elem.getData('max-property');
    for(var j = 0; j< filterSearchParam.length; j++) {
        if(filterSearchParam[j].facet === minProperty || filterSearchParam[j].facet === maxProperty) {
            filterSearchParam[j].value = true;
            filterSearchParam[j].code = '';
        }
    }
};

var addOperatorParameter = function(facetType, facetCode, facetValue, object) {
    var crtObj = AUI().one(object);
    var facetExists = false;
    let checked = crtObj.get('checked');
    for (var i = 0; i < filterSearchParam.length; i++) {
        if (filterSearchParam[i].facet === facetType && filterSearchParam[i].code === facetCode) {
            filterSearchParam[i].value = facetValue;
            facetExists = true;
            break;
        }
    }

    if(!facetExists) {
        filterSearchParam.push({
            'facet': facetType,
            'code': facetCode,
            'value': facetValue,
            'type': ""
        });
    }

}

var addFilterParameter = function(facetType, facetCode, facetValue, object, exclusiveValue, rangeCode) {
    var crtObj = AUI().one(object);
    var facetExists = false;
    let checked = crtObj.get('checked');
    var checkbox_state = crtObj.getAttribute("checkbox-state");
    if (checkbox_state === "t") {
        checkbox_state = "f";
    } else {
        checkbox_state = "t";
    }

    // sync other checkboxes with the same facetCode
    const valuesList = document.getElementById(facetType + '.values');
    if (valuesList) {
        const identicalValues = valuesList.querySelectorAll('input[type="checkbox"][data-facet-code="' + facetCode + '"]');
        identicalValues.forEach(elem => {
            if (elem === object) return;

            elem.checked = checked;
            elem.setAttribute('checkbox-state', checkbox_state);
            elem.setAttribute('data-facet-value', checked);

            if (checked) {
                elem.setAttribute('checked', 'checked');
            } else {
                elem.removeAttribute('checked');
            }
        });
    }

    if (exclusiveValue){
        var ulParent = crtObj.ancestor("ul");
        if (ulParent) {
            var liChildren = ulParent.all("li");
            liChildren.each(function(elem) {
                var liFacetCode = elem.getAttribute("facetvalue");
                if (liFacetCode !== facetCode) {
                    var checkbox = elem.one("input");
                    checkbox.set("checked", false);
                    checkbox.setAttribute("checkbox-state", "f");
                    if (rangeCode && rangeCode !== '' && liFacetCode === rangeCode) {
                        sliders[rangeCode].disable();
                        clearRangeFacet(elem);
                    }
                }
            });
            for(var j = 0; j< filterSearchParam.length; j++) {
                if(filterSearchParam[j].facet === facetType) {
                    filterSearchParam[j].value = !checked;
                    filterSearchParam[j].code = facetCode;
                    facetExists = true;
                    crtObj.setAttribute('checkbox-state', checkbox_state);
                    break;
                }
            }
        }
    } else {
        for (var i = 0; i < filterSearchParam.length; i++) {
            if (filterSearchParam[i].facet === facetType && filterSearchParam[i].code === facetCode) {

                if (filterSearchParam[i].value) {
                    filterSearchParam[i].value = false;
                    crtObj.setAttribute('checkbox-state', checkbox_state);
                } else {
                    filterSearchParam[i].value = true;
                    crtObj.setAttribute('checkbox-state', checkbox_state);
                }

                facetExists = true;
                break;
            }
        }
    }

    if(!facetExists) {
        crtObj.setAttribute('checkbox-state', checkbox_state);
        var mappedType = mappedFacets[facetType];
        filterSearchParam.push({
            'facet': facetType,
            'code': facetCode,
            'value': !checked,
            'type': (mappedType === "COMBINED_CONDITION" ? "AND" : "")
        });
    }

    if (crtObj.ancestor(".facet-child-values")) {
        const siblingFacetValues = [];
        crtObj.ancestor(".facet-child-values").all('input').each(function (siblingCheckbox) {
            let facetType = siblingCheckbox.attr('data-facet-type');
            let facetCode = siblingCheckbox.attr('data-facet-code');
            let facetChecked = siblingCheckbox.get('checked');
            siblingFacetValues.push({
                'facet': facetType,
                'code': facetCode,
                'value': !facetChecked,
                'type': mappedFacets[facetType] === "COMBINED_CONDITION" ? "AND" : ""
            });
        });

        let addFacetValuesTosearchParam = true;
        if (siblingFacetValues) {
            let allChildValuesSelected = true;
            if (allFacetValues && allFacetValues.size > 0) {
                if (crtObj.ancestor(".facet-child-values")._node.closest(".facet-label")) {
                    crtObj.ancestor(".facet-child-values")._node.closest(".facet-label").classList.remove("partial-checked");
                }

                var allValues = allFacetValues.get('facet.authorHierarchy')[0].values;
                for (var f = 0; f < allValues.length; f++) {
                    if ((allValues[f].code === crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code")) &&
                        (siblingFacetValues.length < allValues[f].childValues.length) ) {
                        allChildValuesSelected = false;
                        break;
                    }
                }
            }

            if (siblingFacetValues.every(entry => entry.value === true) && allChildValuesSelected) {
                if (crtObj.ancestor(".facet-child-values")._node.closest(".facet-label")) {
                    crtObj.ancestor(".facet-child-values")._node.closest(".facet-label").classList.remove("partial-checked");
                }
                if (crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]')) {
                    crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').set("checked", false);
                    crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').setAttribute("checkbox-state", "f");

                    const parentExist = filterSearchParam.some(entry => entry.code === crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code"));
                    if (parentExist) {
                        filterSearchParam = filterSearchParam.filter(entry => entry.code !== crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code"));
                    }

                }
            } else if (siblingFacetValues.every(entry => entry.value === false) && allChildValuesSelected) {

                if (crtObj.ancestor(".facet-child-values")._node.closest(".facet-label")) {
                    crtObj.ancestor(".facet-child-values")._node.closest(".facet-label").classList.remove("partial-checked");
                }
                if (crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]')) {
                    crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').set("checked", true);
                    crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').setAttribute("checkbox-state", "t");

                    const parentExist = filterSearchParam.some(entry => entry.code === crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code"));
                    if (!parentExist) {
                        var mappedType = mappedFacets[crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-type")];
                        filterSearchParam.push({
                            'facet': crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-type"),
                            'code': crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code"),
                            'value': false,
                            'type': (mappedType === "COMBINED_CONDITION" ? "AND" : "")
                        });
                    }
                    siblingFacetValues.forEach(childEntry => {
                        filterSearchParam = filterSearchParam.filter(entry => entry.code !== childEntry.code);
                    });
                    addFacetValuesTosearchParam = false;
                }
            } else if (siblingFacetValues.some(entry => entry.value === true) || !allChildValuesSelected) {
                if (checked || (!checked && allChildValuesSelected)) {
                    if (crtObj.ancestor(".facet-child-values")._node.closest(".facet-label")) {
                        crtObj.ancestor(".facet-child-values")._node.closest(".facet-label").classList.add("partial-checked");
                    }
                    if (crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]')) {
                        crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').set("checked", false);
                        crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').setAttribute("checkbox-state", "f");
                    }

                    const parentExist = filterSearchParam.some(entry => entry.code === crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code"));
                    if (parentExist) {
                        filterSearchParam = filterSearchParam.filter(entry => entry.code !== crtObj.ancestor(".facet-child-values").ancestor().one('input[type="checkbox"]').getAttribute("data-facet-code"));
                    }

                }
            }

        }

        if (addFacetValuesTosearchParam) {
            for (let i = 0; i < siblingFacetValues.length; i++) {
                let siblingFacet = siblingFacetValues[i];

                let childFacetExists = false;
                for (let j = 0; j < filterSearchParam.length; j++) {
                    if (filterSearchParam[j].facet === facetType && filterSearchParam[j].code === siblingFacet.code) {
                        filterSearchParam[j].value = siblingFacet.value;
                        childFacetExists = true;
                        break;
                    }
                }
                if (!childFacetExists) {
                    filterSearchParam.push(siblingFacet);
                }
            }
        }
    }
    if (('facet.organisationHierarchy' === facetType || 'facet.authorHierarchy' === facetType || 'publicProcurement.cpv' === facetType || 'publicProcurement.nuts'  === facetType ) &&
        crtObj.ancestor('label') && crtObj.ancestor('label').hasClass('parent-facet')) {
        let childFacetValuesContainer = crtObj.ancestor('.parent-facet').ancestor().one('.facet-child-values');
        let childrenCheckboxes = childFacetValuesContainer.all('input[type="checkbox"]');
        let childrenCheckboxesChecked = childFacetValuesContainer.all('input[type="checkbox"]:checked').size();

        if ('facet.authorHierarchy' === facetType && crtObj._node.closest(".facet-label")) {
            crtObj._node.closest(".facet-label").classList.remove("partial-checked");
        }

        let allChildrenCheckboxesChanged = false;
        if (checked) {
            /*if (childrenCheckboxesChecked === 0) {*/
                childrenCheckboxes.each(function (checkbox) {
                    checkbox.set("checked", true);
                    checkbox.setAttribute("checkbox-state", "t");
                });
                allChildrenCheckboxesChanged = true;
           /* }*/
        } else {
            /*if (childrenCheckboxesChecked === childrenCheckboxes.size()) {*/
                childrenCheckboxes.each(function (checkbox) {
                    checkbox.set("checked", false);
                    checkbox.setAttribute("checkbox-state", "f");
                });
                allChildrenCheckboxesChanged = true;
           /* }*/
        }

        if (allChildrenCheckboxesChanged) {
            let filterValuesToBeRemoved = [];
            childrenCheckboxes.each(function (checkbox) {
                filterValuesToBeRemoved.push({
                    'facet': checkbox.attr('data-facet-type'),
                    'code': checkbox.attr('data-facet-code')
                });
            });
            filterSearchParam = filterSearchParam.filter(filterParameter =>
                filterValuesToBeRemoved.filter(filterValueToBeRemoved =>
                    filterValueToBeRemoved.facet === filterParameter.facet && filterValueToBeRemoved.code === filterParameter.code).length === 0);
        }
    }

    udateSelectedElementsCounter(crtObj);
}


var udateSelectedElementsCounter = function(currentOject) {
    var objAncestor = currentOject.ancestor('.portlet-body > .level0.facets-lists-container > .list-item.first.prime-facet');
    var selectedItemsSize = objAncestor.all('input[checkbox-state="t"]').size();
    var selectedItemsContainer = objAncestor.one('.mobile-facet-number-container');

    if(selectedItemsSize != 0){
        objAncestor.one('.mobile-facet-number').setHTML(selectedItemsSize.toString());
        selectedItemsContainer.removeClass('d-none');
    }else{
        selectedItemsContainer.addClass("d-none");
    }

    var applyFiltersButton = AUI().one('.mob-second-op-filter-btn');
    if(filterSearchParamInitial != filterSearchParam){
        applyFiltersButton.removeClass("d-none");
    }else{
        applyFiltersButton.add("d-none");
    }

};

var applyFilterParameter = function() {
    YUI().use('node', 'aui-io-request', 'json-parse', 'opportal-dispatcher', function (Y) {
        if(filterSearchParam.length > 0){
            var timeStamp = new Date().getTime();

            if (filterRanges.length > 0){
                for (var j = 0; j < filterRanges.length; j++) {
                    var filterRange = filterRanges[j];
                    var slider = filterRange.slider;
                    var minProperty = filterRange.minProperty;
                    var maxProperty = filterRange.maxProperty;
                    var value = slider.getValue();
                    var isEnabled = slider.isEnabled();
                    var minPropertyValue = value[0] + '-01-01';
                    var maxPropertyValue = value[1] + '-12-31';
                    var facetExists = false;
                    for (var i = 0; i < filterSearchParam.length; i++) {
                        if (filterSearchParam[i].facet === minProperty ) {
                            filterSearchParam[i].code = isEnabled ? minPropertyValue : '';
                            filterSearchParam[i].value = !isEnabled;
                            facetExists = true;
                            break;
                        }
                    }
                    if (!facetExists && isEnabled){
                        filterSearchParam.push({'facet': minProperty, 'code': minPropertyValue, 'value': false});
                    }
                    facetExists = false;
                    for (i = 0; i < filterSearchParam.length; i++) {
                        if (filterSearchParam[i].facet === maxProperty ) {
                            filterSearchParam[i].code = isEnabled ? maxPropertyValue : '';
                            filterSearchParam[i].value = !isEnabled;
                            facetExists = true;
                            break;
                        }
                    }
                    if (!facetExists && isEnabled){
                        filterSearchParam.push({'facet': maxProperty, 'code': maxPropertyValue, 'value': false});
                    }
                }
            }
            /*
            filterSearchParam.push({'facet': 'elif.publicationDateTo', 'code': '2020-12-31', 'value': false});*/
            Y.io.request(FILTER_REQUEST_PATH, {
                method: 'POST',
                data: {filterList: JSON.stringify(filterSearchParam), t:timeStamp},
                on: {
                    success: function () {
                        var responseData = this.get('responseData');
                        if(responseData != null && responseData != undefined){
                            responseData = responseData.replace("\\u0027", "'");
                            responseData = responseData.replace("\\u0027", "'");
                        }

                        if(responseData != null && responseData != undefined){
                            try{
                                doFacetSearch(responseData);
                            } catch (err){
                                responseData = document.createTextNode(responseData);
                            }
                        } else {
                            location.reload();
                        }


                    }
                }
            });

            const doFacetSearch = (url) => {
                const bodyNode = Y.one(document.body);

                if(bodyNode.hasClass('overlayed')){
                    return;
                }
                bodyNode.addClass('overlayed');

                function isIE () {
                    var myNav = navigator.userAgent.toLowerCase();
                    return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
                }

                if(isIE() && history && history.pushState){
                    history.pushState(null, null, url);
                    var dispatcher = new Y.Dispatcher ({
                        node: bodyNode,
                        normalize: false,
                        ioConfig: {}
                    });

                    dispatcher.on('ready', function(){
                        bodyNode.removeClass('overlayed');
                    });

                    setTimeout(function(){
                        dispatcher.set('uri', url);
                    }, 10);
                } else {
                    setTimeout(function () {
                        window.location.href = url;
                    }, 500);
                }
            }
        }
    });
}


var addStatusParameter = function(facetType, facetCode) {
    var statusFacet = false;
    let filterValuesToBeRemoved = [];
    for (var i = 0; i < filterSearchParam.length; i++) {
        if("ALL" === facetCode && filterSearchParam[i].facet === facetType) {
            filterValuesToBeRemoved.push({
                'facet': facetType,
                'code': filterSearchParam[i].code
            });
            filterSearchParam = filterSearchParam.filter(filterParameter =>
                filterValuesToBeRemoved.filter(filterValueToBeRemoved =>
                    filterValueToBeRemoved.facet === filterParameter.facet && filterValueToBeRemoved.code === filterParameter.code).length === 0);
        break;
        }
        if (filterSearchParam[i].facet === facetType) {
            filterSearchParam[i].code = facetCode;
            statusFacet = true;
            break;
        }
    }
    if (!statusFacet && "ALL" != facetCode) {
        filterSearchParam.push({'facet': facetType, 'code': facetCode, 'value': false, 'type': ""});
    }
}

