<!--

    Copyright (c) 1997, 2018 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

-->

<!-- configuration/virtualServerNew.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.vs.NewTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="configName" value=>$page{configName} default="server-config");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/web/configuration/virtualServers.jsf");
        setPageSessionAttribute(key="childType" value="virtual-server");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/http-service");
        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}");
        createList(size="0", result="#{pageSession.tableList}");
        mapPut(map="#{pageSession.valueMap}" key="docroot" value="");
        mapPut(map="#{pageSession.valueMap}" key="ssoEnabled" value="inherit");
        mapPut(map="#{pageSession.valueMap}" key="accessLoggingEnabled" value="inherit");
        mapPut(map="#{pageSession.valueMap}" key="accessLog" value="");
        setPageSessionAttribute(key="convertToFalseList" value={"ssoCookieHttpOnly"});
        setPageSessionAttribute(key="edit" value="#{false}" );
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{true}" );
        setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
        setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );
    />
    </event>
    <sun:form id="propertyForm">
#include "/common/shared/alertMsg.inc"

    <sun:title id="propertyContentPage" title="$resource{i18n_web.vs.NewTitle}" helpText="$resource{i18n_web.vs.NewPageHelp}">
#include "/common/shared/editPageLoadDefaultButton.inc"
#include "/web/configuration/virtualServerButtons.inc"
    </sun:title>
#include "/web/configuration/virtualServerAttrs.inc"
#include "/common/shared/propertyDescTable.inc"
    <sun:title id="title2">
#include "/web/configuration/virtualServerButtons.inc"
    </sun:title>
    "<br>
<sun:hidden id="helpKey" value="$resource{help_web.virtualServerNew}" />

    </sun:form>
    "<br/>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>
