<!--

    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

-->

<!-- jca/jcaResourceEdit.jsf -->
<!initPage
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings")
    setResourceBundle(key="i18njca" bundle="org.glassfish.jca.admingui.Strings");
    setResourceBundle(key="help_jca" bundle="org.glassfish.jca.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18njca.connectorConnectionPool.advancePageTitle}" guiOnLoad="enableDisableLazyConnection('#{associateId}');" >
<!define name="content">
<event>
    <!beforeCreate
    getRequestValue(key="name" value="#{pageSession.Name}");
    urlencode(value="#{pageSession.Name}" encoding="UTF-8" result="#{pageSession.encodedName}");
    getRequestValue(key="isAppScopedRes" value="#{pageSession.isAppScopedRes}");
    if(#{pageSession.isAppScopedRes}){
        getRequestValue(key="appName" value="#{pageSession.encodedAppName}");
        getRequestValue(key="moduleName" value="#{pageSession.moduleName}");
        if(#{pageSession.moduleName}) {
            urlencode(value="#{pageSession.moduleName}" encoding="UTF-8" result="#{pageSession.encodedModuleName}");
            setPageSessionAttribute(key="selfPageArgs" value="&isAppScopedRes=$boolean{true}&appName=#{pageSession.encodedAppName}&moduleName=#{pageSession.encodedModuleName}");
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedAppName}/module/#{pageSession.encodedModuleName}/resources");
        }
        if(!#{pageSession.moduleName}) {
            setPageSessionAttribute(key="selfPageArgs" value="&isAppScopedRes=$boolean{true}&appName=#{pageSession.encodedAppName}");
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedAppName}/resources");
        }
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/common/applications/resources/appScopedResources.jsf?appName=#{pageSession.encodedAppName}&listPageLink=/common/applications/applications.jsf");
    }
    if(!#{pageSession.isAppScopedRes}){        
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jca/connectorConnectionPools.jsf");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
    }
    setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/jca/connectorConnectionPoolAdvance.jsf?name=#{pageSession.encodedName}#{pageSession.selfPageArgs}");
    setPageSessionAttribute(key="childType" value="connector-connection-pool");
    //REST related
    setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}/#{pageSession.encodedName}");
    setPageSessionAttribute(key="rest-api" value="true");
    setPageSessionAttribute(key="poolGeneralAttrs" value={"resourceAdapterName" "connectionDefinitionName"
            "ping" "description" "steadyPoolSize" "maxPoolSize" "poolResizeQuantity"
            "idleTimeoutInSeconds" "maxWaitTimeInMillis" "isConnectionValidationRequired"
            "failAllConnections" "transactionSupport"});
    gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
    gf.filterMap(map="#{pageSession.valueMap}" attrNames="#{pageSession.poolGeneralAttrs}" keep="#{false}" resultMap="#{pageSession.valueMap}");

    setPageSessionAttribute(key="convertToFalseList" value={"pooling" "failAllConnections" "isConnectionValidationRequired" "associateWithThread" "connectionLeakReclaim" "lazyConnectionAssociation" "lazyConnectionEnlistment" "matchConnections"});
    setPageSessionAttribute(key="skipAttrsList", value={"jndiName"});
    //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="#{false}" );
    />
</event>
<sun:form id="propertyForm">
#include "/jca/connectorConnectionPoolTabs.inc"
#include "/common/shared/alertMsg_1.inc"
    
    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njca.connectorConnectionPool.advancePageTitle}" helpText="$resource{i18njca.connectorConnectionPool.advancePageTitleHelp}" >

#include "/common/shared/editPageLoadDefaultButton.inc"
#include "/jca/connectorConnectionPoolAdvanceButtons.inc"
    </sun:title>
    "<br>
    
#include "/jca/connectorConnectionPoolAdvancedAttr.inc"

"<br>
<sun:title>
#include "/jca/connectorConnectionPoolAdvanceButtons.inc"
</sun:title>

    <sun:hidden id="helpKey" value="$resource{help_jca.connectorConnectionPoolAdvance}" />
</sun:form>
<f:verbatim>
<script type="text/javascript">
    function enableDisableLazyConnection(la){
        var c = getTextElement(la);
        var selected = c.checked;
        if(selected) {
            #{themeJavascript.JS_PREFIX}.checkbox.setChecked('#{enlistId}', true);
            disableComponent('#{enlistId}', 'text');
        }
        if(!selected) {
            enableComponent('#{enlistId}', 'text');
        }
    }
    </script>
</f:verbatim>
            "<br/>
#include "/common/shared/changeButtonsJS.inc" 
</define>
</composition>


