<!--

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

-->

<!-- applications/manageTargets.jsf -->


<!initPage
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings")
    setResourceBundle(key="help_common" bundle="org.glassfish.common.admingui.Helplinks");
/>
<!composition template="/templates/default.layout" guiTitle="$resource{i18n.manageTargets.PageTitle}" >
<!define name="content">
    <event>
        <!beforeCreate
            getRequestValue(key="highLight" value="#{pageSession.highLight}");
            getRequestValue(key="appName" value="#{pageSession.appName}");
            getRequestValue(key="forApp" value="#{pageSession.forApp}");
            urlencode(value="#{pageSession.appName}" encoding="UTF-8" result="#{pageSession.encodedAppName}");
            setPageSessionAttribute(key="setDefaultTarget",  value="false");
            gf.getApplicationTarget(appName="#{pageSession.appName}" result="#{requestScope.sTargets}");
            convertListToArray(list="#{requestScope.sTargets}" array="#{pageSession.selectedTargets}");
            getRequestValue(key="listPageLink" value="#{pageSession.listPageLink}"  default="/common/applications/applications.jsf");
            getRequestValue(key="targetPageLink" value="#{pageSession.targetPageLink}");
            if("#{pageSession.forApp}"){
                setPageSessionAttribute(key="titleHelp", value="$resource{i18n.manageApplicationTargets.PageTitleHelp}");
                setPageSessionAttribute(key="helpKey", value="$resource{help_common.manageApplicationTarget}");
            }
            if("#{pageSession.forApp}=false"){
                setPageSessionAttribute(key="titleHelp", value="$resource{i18n.manageLifecycleTargets.PageTitleHelp}");
                setPageSessionAttribute(key="helpKey", value="$resource{help_common.manageLifecycleTarget}");
            }
        />
    </event>
    <sun:form id="form">
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$attribute{formId})
        />

#include "/common/shared/alertMsg_1.inc"
 <sun:title id="propertyContentPage" title="$resource{i18n.manageTargets.PageTitle}" helpText="#{pageSession.titleHelp}">
 <!facet pageButtonsTop>
        <sun:panelGroup id="topButtons">
            <sun:button id="saveButton"  text="$resource{i18n.button.Save}" 
                    onClick="submitAndDisable(this, '$resource{i18n.button.Processing}'); return false;" >
                <!command
                    gf.changeAppTargets(appName="#{pageSession.appName}" targets="#{pageSession.selectedTargets}");
                    prepareSuccessfulMsg();
                    gf.redirect(page="#{pageSession.targetPageLink}?appName=#{pageSession.encodedAppName}&listPageLink=#{pageSession.listPageLink}&alertType=${alertType}&alertSummary=${alertSummary}&alertDetail=${alertDetail}");
                />
            </sun:button>
            <sun:button id="cancelButton" immediate="#{true}" primary="#{false}" rendered="#{pageSession.showCancelButton}" text="$resource{i18n.button.Cancel}" >
                <!command

                    gf.redirect(page="#{pageSession.targetPageLink}?appName=#{pageSession.encodedAppName}&listPageLink=#{pageSession.listPageLink}");
                />
            </sun:button>
        </sun:panelGroup>
    </facet>
</sun:title>
<event>
    <!afterCreate
        getUIComponent(clientId="#{formId}"  component=>$attribute{component})
        setPageSessionAttribute(key="setDefaultTarget" value="false");
        includeIntegrations(type="org.glassfish.admingui:uploadPropertySheetTargetSection" );
    />
</event>

<sun:hidden id="helpKey" value="#{pageSession.helpKey}" />
    </sun:form>

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