<!--

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

-->

<!-- standalone/standaloneInstanceConfigProperties.jsf -->

<!initPage
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
    setResourceBundle(key="i18ncs" bundle="org.glassfish.cluster.admingui.Strings")
    setResourceBundle(key="help_cluster" bundle="org.glassfish.cluster.admingui.Helplinks");

/>
<!composition template="/templates/default.layout"  guiTitle="Standalone Instance #{pageSession.instanceName} $resource{i18ncs.SystemPropertiesTitle}" >
<!define name="content">
    <event>
        <!beforeCreate
            getRequestValue(key="instanceName" value="#{pageSession.instanceName}");
            urlencode(value="#{pageSession.instanceName}" encoding="UTF-8" result="#{pageSession.encodedInstanceName}");
            gf.isInstanceName(instanceName="#{pageSession.instanceName}" exists="#{requestScope.exists}" );
            if (! #{requestScope.exists}){
                gf.redirect("#{request.contextPath}/cluster/standalone/standaloneInstances.jsf");
            }
            setSessionAttribute(key="standaloneInstanceTabs" value="configProps");
            setPageSessionAttribute(key="parentPage", value="#{request.contextPath}/cluster/standalone/standaloneInstanceGeneral.jsf?instanceName=#{pageSession.encodedInstanceName}");
            setPageSessionAttribute(key="selfPage", value="#{request.contextPath}/cluster/standalone/standaloneInstanceConfigProperties.jsf?instanceName=#{pageSession.encodedInstanceName}");
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/servers/server/#{pageSession.encodedInstanceName}");
            setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/system-properties");
        />
    </event>
    <sun:form id="propertyForm">
#include "/cluster/standalone/standaloneInstanceTabs.inc"

        <sun:title id="clusterSysPropsPage" title="$resource{i18ncs.SystemPropertiesTitle}" >
            <!facet pageButtonsTop>
                <sun:panelGroup id="topButtons">
#include "/common/configuration/systemPropertiesButtons.jsf"
                </sun:panelGroup>
            </facet>
        </sun:title>
#include "/common/shared/alertMsg_1.inc"
#include "/common/shared/nameSection.inc"
#include "/common/configuration/systemProperties.jsf"

        <sun:title>
            <!facet pageButtonsTop>
                <sun:panelGroup id="bottomButtons">
#include "/common/configuration/systemPropertiesButtons.jsf"
                </sun:panelGroup>
            </facet>
        </sun:title>

<sun:hidden id="helpKey" value="$resource{help_cluster.standaloneInstanceConfigPropperties}" />

    </sun:form>


</define>
</composition>
