<!--

    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

-->

<!-- full/customResourceEdit.jsf -->

<!initPage
    setResourceBundle(key="i18njmail" bundle="org.glassfish.full.admingui.Strings");
    setResourceBundle(key="help_jmail" bundle="org.glassfish.full.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18njmail.customResource.editPageTitle}">
<!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="selfPage" value="#{request.contextPath}/full/customResourceEdit.jsf?name=#{pageSession.encodedName}&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="selfPage" value="#{request.contextPath}/full/customResourceEdit.jsf?name=#{pageSession.encodedName}&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="selfPage" value="#{request.contextPath}/full/customResourceEdit.jsf?name=#{pageSession.encodedName}");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/full/customResources.jsf");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
    }
    setPageSessionAttribute(key="childType" value="custom-resource");
    //For resourceEditTabs.inc
    setSessionAttribute(key="resEditTabs" value="general");
    setPageSessionAttribute(key="generalPage" value="#{pageSession.selfPage}");
    setPageSessionAttribute(key="targetPage" value="#{request.contextPath}/common/resourceNode/resourceEditTargets.jsf?name=#{pageSession.encodedName}");
    //REST related
    setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}/#{pageSession.encodedName}");
    gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");

    setPageSessionAttribute(key="convertToFalseList" value={"enabled"});
    setPageSessionAttribute(key="skipAttrsList", value={"jndiName"});
    setPageSessionAttribute(key="factoryClassHelpText" value="$resource{i18njmail.customResource.factoryClassHelp}");
    setPageSessionAttribute(key="showJndiLookup" value="#{false}");
    gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/get-built-in-custom-resources"
                   method="GET"
                   result="#{requestScope.result}");
    setPageSessionAttribute(key="propsMap" value="#{requestScope.result.data.extraProperties.builtInCustomResources}");
    
    if(#{resChosen}) {
            setPageSessionAttribute(key="factoryClass", value="#{pageSession.propsMap['$attribute{resChosen}']");
            mapPut(map="#{pageSession.valueMap}" key="jndiName" value="#{jndiName}")
            mapPut(map="#{pageSession.valueMap}" key="description" value="#{desc}")
            mapPut(map="#{pageSession.valueMap}" key="enabled" value="true")
            mapPut(map="#{pageSession.valueMap}" key="factoryClass" value="#{pageSession.factoryClass}")
            mapPut(map="#{pageSession.valueMap}" key="resType" value="#{resChosen}")
            mapPut(map="#{pageSession.valueMap2}" key="enabled" value="#{status}")
            setAttribute(key="tableList" value="#{newList}");
        }
   gf.getJndiResourceAttrForEdit(resources="#{pageSession.propsMap}" resType="#{pageSession.valueMap['resType']}", result="#{pageSession.builtInEntries}", classnameOption=>$page{classnameOption}, attrMap="#{pageSession.attrMap}", factoryMap="#{pageSession.factoryMap}");
   setPageSessionAttribute(key="myOption" value="$pageSession{classnameOption}");
   gf.restRequest(endpoint="#{pageSession.selfUrl}/property.json" method="GET" result="#{requestScope.propTable}");
   setPageSessionAttribute(key="tableList" value="#{requestScope.propTable.data.extraProperties.properties}");

    //set the following for including buttons.inc
    setPageSessionAttribute(key="edit" value="#{true}" );
    setPageSessionAttribute(key="showCancelButton" value="#{true}" );
    setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
    setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );

    setPageSessionAttribute(key="convertToFalseList2" value={"enabled"});
    />
</event>
<sun:form id="form1">
#include "/common/resourceNode/resourceEditTabs.inc"
#include "/common/shared/alertMsg_1.inc"

    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njmail.customResource.editPageTitle}" helpText="$resource{i18njmail.customResource.editPageTitleHelp}" >
#include "/full/jndiButtons.inc"
    </sun:title>
    "<br><br>

#include "/full/jndiResourceAttr.inc"
#include "/common/shared/propertyDescTable.inc"
    
    <sun:hidden id="helpKey" value="$resource{help_jmail.customResourceEdit}" />
</sun:form>

            "<br/>
#include "/full/jndijs.inc"
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>
