<!--

    Copyright (c) 2009, 2020 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!-- grizzly/networkListenerNew.jsf -->


<!initPage
    setResourceBundle(key="i18n_web" bundle="org.glassfish.web.admingui.Strings");
	setResourceBundle(key="help_web" bundle="org.glassfish.web.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18n_web.grizzly.networkListenerNewPageTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="configName" value=>$page{configName});
        urlencode(value="#{pageSession.configName}" encoding="UTF-8" result="#{pageSession.encodedConfigName}");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/web/grizzly/networkListeners.jsf");
        setPageSessionAttribute(key="childType" value="network-listener");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.encodedConfigName}/network-config/network-listeners");
        setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}");
        setPageSessionAttribute(key="rest-api" value="true");
        gf.getDefaultValues(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
        mapPut(map="#{pageSession.valueMap}" key="target" value="#{pageSession.configName}");
        setPageSessionAttribute(key="convertToFalseList" value={"Enabled"});
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{true}" );
        //set the following for including buttons.inc
        setPageSessionAttribute(key="edit" value="#{false}" );
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{true}" );
        setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
        setPageSessionAttribute(key="hasPropertyTable" value="#{false}" );
    />
    </event>

"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":configurations:#{pageSession.encodedConfigName}:networkConfig:networkListeners");</script>

            <sun:form id="propertyForm">
#include "/common/shared/alertMsg.inc"
    <sun:title id="propertyContentPage" title="$resource{i18n_web.grizzly.networkListenerNewPageTitle}" helpText="$resource{i18n_web.grizzly.networkListenerNewPageTitleHelp}">
    <!facet pageButtonsTop>
        <sun:panelGroup id="topButtons">
            <sun:button id="newButton" rendered="#{!edit}" text="$resource{i18n.button.OK}"
                onClick="if (checkRequired()) {submitAndDisable(this, '$resource{i18n.button.Processing}');}; return false;" >
                <!command
                    setPageSessionAttribute(key="protocolUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.encodedConfigName}/network-config/protocols/protocol");
                    urlencode(value="#{pageSession.valueMap['name']}" result="#{requestScope.encodedListenerNameToCheck}");
                    gf.checkIfEndPointExist(endpoint="#{sessionScope.REST_URL}/configs/config/#{pageSession.encodedConfigName}/network-config/network-listeners/network-listener/#{requestScope.encodedListenerNameToCheck}", exists="#{requestScope.exist}");
                    if (#{requestScope.exist}){
                        gf.handleError(detail="$resource{i18n_web.grizzly.networkListener.alreadyExist, #{requestScope.encodedListenerNameToCheck}}");
                    }
                    createMap(result="#{pageSession.protocolMap}");
                    if("#{pageSession.valueMap['securityEnabled']}=#{null}") {
                        mapPut(map="#{pageSession.valueMap}", key="securityEnabled", value="false");
                    }
                    if("#{pageSession.valueMap['jkenabled']}=#{null}") {
                        mapPut(map="#{pageSession.valueMap}", key="jkenabled", value="false");
                    }
                    if("#{pageSession.valueMap['enabled']}=#{null}") {
                        mapPut(map="#{pageSession.valueMap}", key="enabled", value="false");
                    }
                    mapPut(map="#{pageSession.protocolMap}", key="securityEnabled", value="#{pageSession.valueMap['securityEnabled']}");
                    if ("#{pageSession.valueMap['protocolChoice']}=create") {
                        urlencode(value="#{pageSession.valueMap['newProtocolName']}" result="#{requestScope.encodedProtocolToCheck}");
                        gf.checkIfEndPointExist(endpoint="#{pageSession.protocolUrl}/#{requestScope.encodedProtocolToCheck}", exists="#{requestScope.pExist}");
                        if (#{requestScope.pExist}){
                            gf.handleError(detail="$resource{i18n_web.grizzly.protocol.alreadyExist, #{requestScope.encodedProtocolToCheck}}");
                        }
                        mapPut(map="#{pageSession.protocolMap}", key="name", value="#{pageSession.valueMap['newProtocolName']}");
                        mapPut(map="#{pageSession.protocolMap}", key="target", value="#{pageSession.valueMap['target']}");
                        setPageSessionAttribute(key="protocolName", value="#{pageSession.valueMap['newProtocolName']}");


                        gf.createEntity(endpoint="#{pageSession.protocolUrl}", attrs="#{pageSession.protocolMap}");
                        createMap(result="#{pageSession.httpMap}");
                        mapPut(map="#{pageSession.httpMap}", key="defaultVirtualServer", value="#{pageSession.valueMap['defaultVirtualServer']}");
                        mapPut(map="#{pageSession.httpMap}", key="target", value="#{pageSession.valueMap['target']}");

                        gf.createEntity(endpoint="#{pageSession.protocolUrl}/#{pageSession.protocolName}/create-http", attrs="#{pageSession.httpMap}");
                    }
                    if ("!(#{pageSession.valueMap['protocolChoice']}=create)") {
                        createMap(result="#{pageSession.protocolMap}");
                        mapPut(map="#{pageSession.protocolMap}", key="Name", value="#{pageSession.valueMap['existingProtocolName']}");
                        setPageSessionAttribute(key="protocolName", value="#{pageSession.valueMap['existingProtocolName']}");
                        gf.restRequest(endpoint="#{pageSession.protocolUrl}/#{pageSession.protocolName}", attrs="#{pageSession.protocolMap}", method="post");
                    }
                    createMap(result="#{pageSession.networkListenerMap}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="name", value="#{pageSession.valueMap['name']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="address", value="#{pageSession.valueMap['address']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="port", value="#{pageSession.valueMap['port']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="transport", value="#{pageSession.valueMap['transport']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="threadpool", value="#{pageSession.valueMap['threadpool']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="enabled", value="#{pageSession.valueMap['enabled']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="jkenabled", value="#{pageSession.valueMap['jkenabled']}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="protocol", value="#{pageSession.protocolName}");
                    mapPut(map="#{pageSession.networkListenerMap}", key="target", value="#{pageSession.valueMap['target']}");
                    gf.createEntity(endpoint="#{pageSession.parentUrl}/network-listener", attrs="#{pageSession.networkListenerMap}");
                    gf.restRequest(endpoint="#{pageSession.protocolUrl}/#{pageSession.protocolName}/http.json", method="get", result="#{pageSession.protocolAttrHttp}");
                    setPageSessionAttribute(key="vsName" value="#{pageSession.protocolAttrHttp.data.extraProperties.entity['defaultVirtualServer']}");
                    gf.redirect(page="#{pageSession.parentPage}?configName=#{configName}");
                />
            </sun:button>
            <sun:button id="cancelButton" immediate="#{true}" primary="#{false}" rendered="#{pageSession.showCancelButton}" text="$resource{i18n.button.Cancel}" >
                <!command
                    gf.redirect(page="#{parentPage}?configName=#{configName}");
                />
            </sun:button>
        </sun:panelGroup>
    </facet>
        </sun:title>

#include "/web/grizzly/networkListenerAttr.inc"

	<sun:hidden id="helpKey" value="$resource{help_web.networkListenerNew}" />
    </sun:form>

<f:verbatim>
    <script type="text/javascript">

    function radioBtnAction(choice) {
        var compt = getTextElement('#{pageSession.protocolChoiceId}');
        compt.value = choice;
        if (choice == 'create'){
            disableComponent('$pageSession{PdropDownId}', 'select');
            enableComponent('$pageSession{pNameId}', 'text');
            enableComponent('$pageSession{newVsId}', 'select');
        }else{
            enableComponent('$pageSession{PdropDownId}', 'select');
            disableComponent('$pageSession{pNameId}', 'text');
            disableComponent('$pageSession{newVsId}', 'select');
        }
    }
    
    function setProtocolName(){
        var currentChoice = getTextElement('#{pageSession.protocolChoiceId}').value;
        if (currentChoice == 'create'){
            getTextElement('#{pageSession.pNameId}').value = getTextElement('#{pageSession.listenerId}').value+"-protocol";
        }
    }

    function checkRequired(){
        var currentChoice = getTextElement('#{pageSession.protocolChoiceId}').value;
        if (currentChoice == 'create'){
            var component = getTextElement('#{pageSession.pNameId}');
            if (component.value==''){
                component.select();
                component.focus();
                return showAlert('#{reqMsg}' + ' ' + getLabel(component));
            }
        }
        return guiValidate('#{reqMsg}','#{reqInt}','#{reqPort}');
    }
    
    function disableProtocolNameField() {
        var methodType = document.getElementById("$pageSession{protocolChoice}");
        require(['webui/suntheme/field'], function (field) {
        	field.setDisabled("$pageSession{protocolNmField}", methodType.getSelectedValue() != '__create__');
        });        
    }
    </script>
</f:verbatim>
</define>
</composition>
