<!--

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

-->

<!initPage
    setResourceBundle(key="i18njms" bundle="org.glassfish.jms.admingui.Strings");
    setResourceBundle(key="i18ncs" bundle="org.glassfish.cluster.admingui.Strings")
    setResourceBundle(key="helpjms" bundle="org.glassfish.jms.admingui.Helplinks")
/>

<!composition template="/templates/default.layout"  guiTitle="$resource{i18njms.availability.jmsAvailability}" >

<!define name="content">
    <event>
    <!beforeCreate
        setSessionAttribute(key="availabilityTabs" value="jmsAvailabilityTab");
        getRequestValue(key="configName" value=>$page{configName} default="server-config");
        setPageSessionAttribute(key="childType" value="jms-availability");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/availability-service");
        setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}");
        setPageSessionAttribute(key="rest-api" value="true");
        gf.checkIfEndPointExist(endpoint="#{pageSession.selfUrl}/property" exists="#{pageSession.edit}");
        if(!#{edit}) {
            gf.restRequest(endpoint="#{pageSession.selfUrl}" method="POST");
        }
        gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}.json", valueMap="#{pageSession.valueMap}");
        gf.restRequest(endpoint="#{pageSession.selfUrl}/property.json" method="GET" result="#{requestScope.propTable}");
        setPageSessionAttribute(key="tableList" value="#{requestScope.propTable.data.extraProperties.properties}");
        setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/jms/jmsAvailabilityService.jsf?configName=#{pageSession.configName}");
        setPageSessionAttribute(key="convertToFalseList" value={"availabilityEnabled"});
        //set the following for including buttons.inc
        setPageSessionAttribute(key="edit" value="#{true}" );
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{false}" );
        setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
        setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );
    />
    </event>
    <sun:form id="propertyForm">
#include "/cluster/availability/availabilityTabs.inc"
#include "/common/shared/alertMsg.inc"
    <sun:title id="propertyContentPage" title="$resource{i18njms.availability.jmsAvailability}" helpText="$resource{i18njms.availability.jmsAvailabilityInfo}">
#include "/common/shared/editPageButtons.inc"
    </sun:title>
        <sun:propertySheet id="propertySheet">
#include "/common/shared/configNameSection.inc"
            <sun:propertySheetSection id="propertSectionTextField">
                <sun:property id="AvailabilityEnabledProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18ncs.availability.availabilityService}" helpText="$resource{i18njms.availability.jmsAvailabilityInfoHelp}">
                    <sun:checkbox id="avail"  selected="#{pageSession.valueMap['availabilityEnabled']}" selectedValue="true" />
                </sun:property>
                <sun:property id="ConfigStoreTypeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18njms.availability.configStoreType}" helpText="$resource{i18njms.availability.configStoreTypeHelp}">
                    <sun:dropDown id="ConfigStoreType" selected="#{pageSession.valueMap['configStoreType']}" labels={"masterbroker" , "shareddb"} />
                </sun:property>
                <sun:property id="MessageStoreTypeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18njms.availability.messageStoreType}" helpText="$resource{i18njms.availability.messageStoreTypeHelp}">
                    <sun:dropDown id="MessageStoreType" selected="#{pageSession.valueMap['messageStoreType']}" labels={"file" , "jdbc"} />
                </sun:property>
                <sun:property id="DbVendorProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18njms.availability.dbVendor}" helpText="$resource{i18njms.availability.dbVendorHelp}">
                    <sun:textField id="DbVendor" columns="$int{15}" maxLength="#{sessionScope.fieldLengths['maxLength.availabilty.dbVendor']}" text="#{pageSession.valueMap['dbVendor']}" />
                </sun:property>
                <sun:property id="DbUserNameProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18njms.availability.dbUserName}" helpText="$resource{i18njms.availability.dbUserNameHelp}">
                    <sun:textField id="DbUserName" columns="$int{15}" maxLength="#{sessionScope.fieldLengths['maxLength.availabilty.dbUserName']}" text="#{pageSession.valueMap['dbUsername']}" />
                </sun:property>
                <sun:property id="DbPasswordProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18njms.availability.dbPassword}" helpText="$resource{i18njms.availability.dbPasswordHelp}">
                    <sun:textField id="DbPassword" columns="$int{15}" maxLength="#{sessionScope.fieldLengths['maxLength.availabilty.dbPassword']}" text="#{pageSession.valueMap['dbPassword']}" />
                </sun:property>
                <sun:property id="DbUrlProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18njms.availability.dbUrl}" helpText="$resource{i18njms.availability.dbUrlHelp}">
                    <sun:textField id="DbUrl" columns="$int{15}" maxLength="#{sessionScope.fieldLengths['maxLength.availabilty.dbUrl']}" text="#{pageSession.valueMap['dbUrl']}" />
                </sun:property>
                "<br /><br />
            </sun:propertySheetSection>
        </sun:propertySheet>
#include "/common/shared/propertyDescTable.inc"
    <sun:title id="propertyContentPage2">
#include "/common/shared/editPageButtons_2.inc"
    </sun:title>
        <sun:hidden id="helpKey" value="$resource{helpjms.jmsAvailabilityService}" />
    </sun:form>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>
