<!--

    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

-->

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

<!composition template="/templates/default.layout"
    guiTitle="$resource{i18njms.connectionFactories.pageTitle}"
    guiTemplateOnLoad="
        admingui.nav.refreshTree('treeForm:tree:resources:Connectors:connectorResources');
        admingui.nav.refreshTree('treeForm:tree:resources:Connectors:connectorConnectionPools');
        admingui.nav.refreshTree('treeForm:tree:resources:jmsResources:jmsConnectionFactories');
        setTimeout('admingui.table.toggleButtons(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\'); admingui.table.initAllRows(\\\\\'#{pageSession.tableId}\\\\\');', 0);"
>
<!define name="content">
    <event>
        <!beforeCreate
            setPageSessionAttribute(key="isConnPage" value="#{true}");
            
            setPageSessionAttribute(key="tableTitle" value="$resource{i18njms.resourcesTable.connectionFactories}");
            setPageSessionAttribute(key="editLink" value="/jms/jmsConnectionEdit.jsf");
            setPageSessionAttribute(key="createLink" value="/jms/jmsConnectionNew.jsf");
            setPageSessionAttribute(key="listLink" value="/jms/jmsConnections.jsf");
            setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18njms.resourcesTable.deleteConnMessage}");
            
            setPageSessionAttribute(key="generalPage" value="#{request.contextPath}/jms/jmsConnectionEdit.jsf");
            setPageSessionAttribute(key="targetPage" value="#{request.contextPath}/common/resourceNode/resourceEditTargets.jsf");
            
            setPageSessionAttribute(key="viewKeyValue" value="jmsConnectionSummaryView");
      //#include "/common/shared/viewSummaryDetail.inc"
        />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:jmsResources:jmsConnectionFactories");</script>
    <sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
        <sun:title id="propertyContentPage" title="$resource{i18njms.connectionFactories.pageTitle}" helpText="$resource{i18njms.connectionFactories.pageTitleHelp}"/>
        "<br /> <br />
#include "/jms/shared/resourcesTable.inc"
        <sun:hidden id="helpKey" value="$resource{helpjms.jmsConnections}" />
    </sun:form>
</define>
</composition>
