
function SearchMoreOptionsButtonController(portletNamespace, searchInputEnabledOnAdvanced) {
    //constants
    var QUERY_TEXT_INPUT_ID = "queryText";
    var CONTAINER_ID = "wiwSearchMoreOptionContainer";
    var MORE_COMPONENT_ID = "wiwSearchMoreOptions";
    var LESS_COMPONENT_ID = "wiwSearchLessOptions";
    var ADVANCED_SEARCH_OPEN = "advancedSearchOpen";
    var SEARCH_BUTTON_ADVANCED_ID = "search-button-advanced";
    var SEARCH_BUTTON_TEXT_VALUE_ID = "wiwSearchButtonTextValue";
    var SEARCH_BUTTON_ICON_ID = "wiwSearchButtonIcon";
    var SEARCH_INPUT_ADVANCED_ID =  "queryText";
    var isOpen = false;

    this.setup = function() {
        var searchMoreButton = AUI().one('#' + portletNamespace + MORE_COMPONENT_ID);
        var searchLessButton = AUI().one('#' + portletNamespace + LESS_COMPONENT_ID);
        var searchButtonAdvanced = AUI().one('#' + portletNamespace + SEARCH_BUTTON_ADVANCED_ID);
        var searchInputAdvanced = document.getElementById(portletNamespace + SEARCH_INPUT_ADVANCED_ID);
        var inputHtmlElemWrapper = searchInputAdvanced.closest(".input-text-wrapper");
        var searchInputTextValue = document.getElementById(SEARCH_BUTTON_TEXT_VALUE_ID);
        var searchButtonIcon = document.getElementById(SEARCH_BUTTON_ICON_ID);

        isOpen = document.getElementById(ADVANCED_SEARCH_OPEN).getAttribute("value") == 'true';

        var mainSearchWrapper = AUI().one('.main-search-block-wrapper');

        var handler = function() {
            isOpen = !isOpen;
            AUI().one('#' + portletNamespace + CONTAINER_ID).setStyle("display", isOpen ? "block" : "none");
            if(!searchInputEnabledOnAdvanced) {
                AUI().one('#' + portletNamespace + QUERY_TEXT_INPUT_ID).set("disabled", isOpen ? "true" : "");
            }

            searchMoreButton.setStyle("display", isOpen ? "none" : "");
            searchLessButton.setStyle("display", isOpen ? "" : "none");
            searchButtonAdvanced.setAttribute("class", isOpen ?
                "btn btn-mobile-screen input-group-addon btn-primary btn-default wiw-search-button-expanded" :
                "btn btn-mobile-screen input-group-addon btn-primary btn-default");
            inputHtmlElemWrapper.setAttribute("style", isOpen ?
                "max-width:100%;width:100% !important" : "");
            searchInputTextValue.setAttribute("style", isOpen ? "" : "display: none");
            searchButtonIcon.setAttribute("style", isOpen ? "position:absolute; left:3px" : "");
            mainSearchWrapper.setStyle("width", isOpen ? "100%" : "");

            if(isOpen){
              AUI().one('#_eu_europa_publications_portlet_wiw_searchportlet_SearchPortlet_entityName').focus();

        }

        }

        searchMoreButton.on(
            'click', handler
        );

        searchLessButton.on(
            'click', handler
        );

        var enablePerson = function(){
            enableControl('entityName', false);
            enableControl('lastName', true);
            enableControl('firstName', true);
            enableControl('searchPosition', true);
        };

        var enableEntity = function(){
            enableControl('entityName', true);
            enableControl('lastName', false);
            enableControl('firstName', false);
            enableControl('searchPosition', false);
        };
        var enableControl = function (controlName, status) {
            var controlInput = AUI().one('#' + portletNamespace + controlName);
            if (controlInput) {
                if (status) {
                    controlInput.removeAttribute('disabled');
                }
                else {
                    controlInput.setAttribute('disabled', true);
                }
            }
        };

        var setCheckBoxOnChange=function(controlName, checkBoxControl, enableFunction ){
            var controlInput = AUI().one('#' + portletNamespace + controlName);
            if(controlInput){
                controlInput.on('change', function(e){
                    checkBoxControl.set('checked',true);
                    enableFunction();
                });
            }
        }

        var limitPerson = AUI().one('#' + portletNamespace + 'limitPerson');
        if(limitPerson){
            limitPerson.on('change', function(e){
                var val = e.currentTarget.get('checked');
                if(val===true){
                    enablePerson();
                }
                else{
                    enableEntity();
                }
            });

            setCheckBoxOnChange( 'lastName', limitPerson, enablePerson);
            setCheckBoxOnChange( 'firstName', limitPerson,enablePerson);
            setCheckBoxOnChange( 'searchPosition', limitPerson, enablePerson);

            if(limitPerson.get('checked')){
                enablePerson();
            }
        }

        var limitEntity = AUI().one('#' + portletNamespace + 'limitEntity');
        if(limitEntity){
            limitEntity.on('change', function(e){
                var val = e.currentTarget.get('checked');
                if(val===true){
                    enableEntity();
                }
                else{
                    enablePerson();
                }
            });
            setCheckBoxOnChange( 'entityName', limitEntity,enableEntity );
            if(limitEntity.get('checked')){
                enableEntity();
            }
        }

    };

    this.getState = function () {
        return isOpen;
    };

    this.shouldTextBeFilled = function () {
        //return (isOpen && searchInputEnabledOnAdvanced) || !isOpen;
        if (!searchInputEnabledOnAdvanced) {
            return false;
        }
        return !isOpen;
    }
}

function QueryTextAutocompleteController(portletNamespace, maxResults, dataSourceUrl) {
    //constants
    var SEARCH_NODE_ID = 'queryText';

    this.setup = function() {
        AUI().use('autocomplete-list', 'datasource-io', function (A) {

            var datasource = new A.DataSource.IO({
                source: A.one('#' + portletNamespace + 'autocompleteEUOrganizationURL').val()
            });

            var nodeId = '#' + portletNamespace + SEARCH_NODE_ID;

            var autoComplete = new A.AutoCompleteList({
                allowBrowserAutocomplete: false,
                activateFirstItem: true,
                inputNode: nodeId,
                maxResults: maxResults,
                on: {
                    select: function(event) {
                        var result = event.result.raw;
                        A.one(nodeId).val(result.code);
                    }
                },
                render: true,
                source: datasource,
                requestTemplate: '&'+ portletNamespace + 'keywords={query}',
                resultListLocator: function (response) {
                    var responseData = A.JSON.parse(response[0].responseText);
                    return responseData.response;
                },
                resultTextLocator: function (result) {
                    return result.label;
                },
                width: 400
            });
        });


    }
}

AUI().ready('*', function(A) {
    var portletNamespace = A.one('#wiwSearchPortalNamespace').val();
    var searchInputEnabledOnAdvanced = A.one('#' + portletNamespace + 'searchInputEnabledOnAdvanced').val() === "true";

    var searchMoreOptionsController = new SearchMoreOptionsButtonController(portletNamespace, searchInputEnabledOnAdvanced);
    searchMoreOptionsController.setup();

    var maxResults = A.one('#' + portletNamespace + 'maxNoOfDisplayResultsAtAutocomplete').val();
    // var queryTextAutocompleteController = new QueryTextAutocompleteController(portletNamespace, maxResults);
    // queryTextAutocompleteController.setup();

    validateMainSearch = function(namespace, queryTextParam, minSearchChars, errorContainerClassName){
        var result = false;
        AUI().use('node', 'classnamemanager', 'selector-css3', function(Y){
            var ipt = Y.one('#' + namespace + queryTextParam);
            var queryTextInput = document.getElementById(namespace + queryTextParam);

            var getCN = Y.ClassNameManager.getClassName,
                SEARCH_CLS_PH_TEXT = getCN('placeholder', 'text');

            if(!ipt.hasClass(SEARCH_CLS_PH_TEXT)) {
                minSearchChars = (minSearchChars != undefined ? minSearchChars : 2);
                if (queryTextInput != undefined ) {
                    changeInput(queryTextInput.value, minSearchChars, queryTextInput, errorContainerClassName);
                }
                if (ipt.get('value').length >= minSearchChars || !searchMoreOptionsController.shouldTextBeFilled()) {
                    result = true;
                    return;
                }
            }

            result = false;
        });

        return result;
    };

    changeInput = function (value, minSearchChars, element, errorContainerClassName) {
        AUI().use('opportal-labels', function(A){

            if (value) {
                inputLength = value.length;
            } else {
                inputLength = 0;
            }

                if (inputLength >= minSearchChars) {
                    removeValidationMessage(undefined, undefined, undefined, undefined, errorContainerClassName);
                    element.parentNode.className = 'control-group search-text-input';
                } else if (inputLength > 0) {
                    removeValidationMessage(undefined, undefined, undefined, undefined, errorContainerClassName);

                    var errorContainer = document.createElement('div');
                    errorContainer.className = errorContainerClassName;
                    errorContainer.innerHTML = '<div role="alert" class="search-input-alert minLength">' +
                        'Please\x20enter\x20at\x20least\x20\x7b0\x7d\x20characters\x21'.replaceAll("{0}",minSearchChars) + '</div>';

                    element.parentNode.className = 'control-group search-text-input error';
                    element.parentNode.appendChild(errorContainer);
                } else {
                    removeValidationMessage(undefined, undefined, undefined, undefined, errorContainerClassName);
                    if(searchMoreOptionsController.shouldTextBeFilled()) {

                        var errorContainer = document.createElement('div');
                        errorContainer.className = errorContainerClassName;
                        errorContainer.innerHTML = '<div role="alert" class="search-input-alert custom">' +
                            'Enter\x20text\x20to\x20search' + '</div>';

                        element.parentNode.className = 'control-group search-text-input error';
                        element.parentNode.appendChild(errorContainer);
                    }
                }
        });
    }
});

var buttonAdvancedSearch = document.querySelector(".who-search-btn");
if(buttonAdvancedSearch) {
    buttonAdvancedSearch.setAttribute("aria-label", "Search button");
    buttonAdvancedSearch.setAttribute("role", "button");
}


