<!--

    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/mailResourceNew.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.javaMail.newPageTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="target" value="#{pageSession.targetValue}");
        setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/full/mailResourceNew.jsf");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/full/mailResources.jsf");
        setPageSessionAttribute(key="childType" value="mail-resource");
        
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        gf.getDefaultValues(endpoint="#{pageSession.parentUrl}/#{pageSession.childType}", valueMap="#{pageSession.valueMap}");

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

        createMap(result="#{pageSession.valueMap2}")
        mapPut(map="#{pageSession.valueMap}" key="enabled" value="true");
        mapPut(map="#{pageSession.valueMap2}" key="enabled" value="true");
    />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:mailResources");</script>

            <sun:form id="form">
#include "/common/shared/alertMsg_1.inc"

    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njmail.javaMail.newPageTitle}" helpText="$resource{i18njmail.javaMail.newPageTitleHelp}">
#include "/common/resourceNode/resourceEditPageButtons.inc"
    </sun:title>
#include "/full/mailResourceAttr.inc"
#include "/common/shared/propertyDescTable.inc"
<event>
<!afterCreate
    setPageSessionAttribute(key="setDefaultTarget" value="true");
    includeIntegrations(type="org.glassfish.admingui:TargetSectionForResource" );
/>
</event>

	<sun:hidden id="helpKey" value="$resource{help_jmail.javaMailSessionNew}" />
            </sun:form>
                        "<br/>
#include "/common/shared/changeButtonsJS.inc" 
</define>
</composition>
