<!--

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

-->

<!-- /common/commonTask.jsf -->

<!initPage
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
    setResourceBundle(key="help_common" bundle="org.glassfish.common.admingui.Helplinks");
/>
<!composition template="/templates/default.layout" guiTitle="$resource{i18n.commonTasks.title}"
      <!-- GLASSFISH-20207 guiOnLoad="if (frameOnload) {frameOnload();};"  -->
    >
<!define name="guiExtraHead">
<f:verbatim>
    <style type="text/css">
	div .guiPageContent {padding-left:0px; padding-right:0px;}
    </style>
<!--[if IE]>
    <style type="text/css">
	.Btn1_sun4, .Btn1Hov_sun4, .Btn1Dis_sun4, .Btn2_sun4, .Btn2Hov_sun4, .Btn2Dis_sun4 {padding: 1px 0px 1px 0px;}
    </style>
<![endif]-->
</f:verbatim>
</define>
<!define name="content">
    "<div style="height:100%; background-color:#B6C6D6; #{pageSession.contentCSS}">
      <sun:form id="form">
        <sun:commonTasksSection id="commonTasksSection" helpText="$resource{i18n.commonTasks.help}"  title="$resource{i18n.commonTasks.title}" columns="$int{2}" style="visibility: #{commonTaskVisibility}">
          <sun:commonTasksGroup title="$resource{i18n.commonTasks.task.glassfishNews}">
            <!-- GLASSFISH-21123, GLASSFISH-21124
            <sun:commonTask
              text="$resource{i18n.commonTasks.task.support}"
              toolTip="$resource{i18n.commonTasks.task.support.toolTip}"
              onClick="javascript:var win=window.open('$resource{i18n.commonTasks.task.supportLink}','_blank');if (win) {win.focus();}; return false;">
            </sun:commonTask>
            <sun:commonTask
                rendered="#{pageSession.isRegistrationEnabled}"
                text="$resource{i18n.tree.registration}"
                toolTip="$resource{i18n.tree.registration}"
                onClick="javascript:var win=window.open('#{request.contextPath}/common/registration.jsf','_blank');if (win) {win.focus();}; return false;">
            </sun:commonTask>
            -->
            <sun:commonTask
                rendered="#{!sessionScope._noNetwork}"
                text="$resource{i18n.commonTasks.task.aquarium}"
                toolTip="$resource{i18n.commonTasks.task.aquarium.toolTip}"
                onClick="javascript:var win=window.open('$resource{i18n.commonTasks.task.aquariumLink}','_blank');if (win) {win.focus();}; return false;">
            </sun:commonTask>
            <event>
                <!beforeCreate
                    <!-- gf.isRegistrationEnabled(isEnabled="#{pageSession.isRegistrationEnabled}");   -->
                    gf.isAIX(result="#{pageSession.isAIX}");
                    setSessionAttribute(key="gf_application_cancel_page" value="/common/commonTask.jsf");
                />
            </event>
          </sun:commonTasksGroup>

          <sun:commonTasksGroup id="deployment" title="$resource{i18n.commonTasks.group.Deployment}" >
            <sun:commonTask
                text="$resource{i18n.commonTasks.task.listApp}"
                toolTip="$resource{i18n.commonTasks.task.listApp.toolTip}"
                onClick="return admingui.woodstock.commonTaskHandler('treeForm:tree:applications','#{request.contextPath}/common/applications/applications.jsf');">
            </sun:commonTask>
            <sun:commonTask
                text="$resource{i18n.commonTasks.task.deployEAR}"
                toolTip="$resource{i18n.commonTasks.task.deployEAR.toolTip}"
                onClick="return admingui.woodstock.commonTaskHandler('treeForm:tree:applications','#{request.contextPath}/common/applications/upload.jsf?appType=webApp&cancelPage=#{request.contextPath}/common/commonTask.jsf');">
            </sun:commonTask>
            <event>
                <!beforeCreate
                    setSessionAttribute(key="gf_application_list_page" value="/common/applications/applications.jsf");
                    setSessionAttribute(key="gf_application_cancel_page" value="/common/commonTask.jsf");
                />
            </event>
        </sun:commonTasksGroup>

        <sun:commonTasksGroup id="administration" title="$resource{i18n.commonTasks.group.Administration}" >
            <sun:commonTask
                text="$resource{i18n.commonTasks.task.adminPassword}"
                toolTip="$resource{i18n.commonTasks.task.adminPassword}"
                onClick="return admingui.woodstock.commonTaskHandler('treeForm:tree:nodes','#{request.contextPath}/common/appServer/serverInstAdminPassword.jsf');">
            </sun:commonTask>
            <sun:commonTask
                text="$resource{i18n.commonTasks.task.pswdAliases}"
                toolTip="$resource{i18n.commonTasks.task.pswdAliases.toolTip}"
                onClick="return admingui.woodstock.commonTaskHandler('treeForm:tree:nodes','#{request.contextPath}/common/appServer/pswdAliases.jsf');">
            </sun:commonTask>
        </sun:commonTasksGroup>

          <sun:commonTasksGroup id="monitoring"  title="$resource{i18n.commonTasks.group.Monitoring}" >
              <sun:commonTask
                text="$resource{i18nc.tree.monitorData}"
                toolTip="$resource{i18nc.tree.monitorData}"
                onClick="return admingui.woodstock.commonTaskHandler('treeForm:tree:applicationServerMonitoring','#{request.contextPath}/common/monitor/monitoringInfo.jsf');">
            </sun:commonTask>
          </sun:commonTasksGroup>

#include "/common/commonTaskDoc.inc"
        </sun:commonTasksSection>
        <event>
          <!afterCreate
          getUIComponent(clientId="form:commonTasksSection"  component=>$attribute{component})
          includeIntegrations(type="org.glassfish.admingui:commonTask" root="#{component}");
          />
        </event>
        <sun:hidden id="helpKey" value="$resource{help_common.commonTask}" />
      </sun:form>
    "</div>

<sun:script>
<f:verbatim>
    admingui.nav.clearTreeSelection(admingui.nav.TREE_ID);
</f:verbatim>
</sun:script>



      <!--  Customizing pe bottom frame -->
      <!--  Remove promotion frame.  Refer to GLASSFISH-20207; also look at guiOnLoad() above.
          <event>
          <!afterCreate
              if (!#{sessionScope._noNetwork}) {
                  getClientId(component="$this{component}" clientId=>$attribute{homeId})
                  getUIComponent(clientId="#{homeId}"  component=>$attribute{component})
                  includeFirstIntegrationPoint(type="org.glassfish.admingui:upsellframepe" root="#{component}");
              }
          />
          </event>
          -->
</define>
</composition>

