<!--

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

-->

<!-- enableSecurityAdmin.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{i18nc.domainLogs.PageTitle}"
	guiOnLoad="admingui.nav.selectTreeNodeWithURL('#{request.contextPath}/common/appServer/serverInstDomainAttrs.jsf');">
<!define name="content">
    <sun:form id="form">
#include "/common/appServer/domainTabs.inc"
#include "/common/shared/alertMsg.inc"

        <!-- Page Title -->
        <sun:title id="propertyContentPage" title="$resource{i18nc.domainLogs.PageTitle}" helpText="$resource{i18nc.domainLogs.PageHelp}">
            <!facet pageButtonsTop>
                <sun:panelGroup id="topButtons">
                    <sun:button id="collectLogFiles" text="$resource{i18n.button.collectLogFiles}"
                            onClick="return download(event);" >
					</sun:button>
                </sun:panelGroup>
            </facet>
            
        </sun:title>
		<sun:hidden id="targetName" name="targetName" value="#{targetName}">
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{targetNameId});
        />
		</sun:hidden>
		<sun:propertySheet id="propertySheetLogResults">
		    <sun:propertySheetSection id="propertSectionLogResults">
			<sun:property id="clusterProp" labelAlign="left" noWrap="true" overlapLabel="false" rendered="#{requestScope.clusters.size() != 0}">
                <sun:radioButton 
                    id="clusterRB" 
                    label="$resource{i18n.common.Cluster}"
                    name="targetType"
                    selected="#{targetType}"  
                    selectedValue="cluster"
                    onChange="$('#{targetNameId}').value = $('#{clusterNameId}').value"/>
			    <sun:dropDown id="clusterDropDown" selected="#{clusterName}" labels="#{requestScope.clusters}" submitForm="true">
		        <!afterCreate
		            getClientId(component="$this{component}" clientId=>$page{clusterNameId});
		        />
				<!beforeCreate
				    /* Get the cluster list */
				    gf.restRequest(
					endpoint="#{sessionScope.REST_URL}/clusters/cluster.json"
					method="GET"
					result="#{requestScope.resp}");
                    setAttribute(key="clusters" value="#{requestScope.resp.data.extraProperties.childResources}");
                    gf.getMapKeys(Map="#{requestScope.resp.data.extraProperties.childResources}" Keys="#{requestScope.clusters}" );
				/>
				<!command
					setAttribute(key="targetType" value="cluster");
					setAttribute(key="targetName" value="$attribute{clusterName}");
				    gf.navigate(page="#{request.contextPath}/common/appServer/domainLogs.jsf");
				/>
			    </sun:dropDown>
			</sun:property>
			<sun:property id="instanceProp" labelAlign="left" noWrap="true" overlapLabel="false">
                <sun:radioButton 
                    id="instanceRB" 
                    name="targetType"  
                    label="$resource{i18n.common.Instance}"
                    selected="#{targetType}"  
                    selectedValue="instance"
                    onChange="$('#{targetNameId}').value = $('#{instanceNameId}').value" />
			    <sun:dropDown id="instanceDropDown" name="instanceName" selected="#{instanceName}" labels="#{requestScope.servers}" submitForm="true">
		        <!afterCreate
		            getClientId(component="$this{component}" clientId=>$page{instanceNameId});
		        />
    			<!beforeCreate
				    /* Get the server list */
				    gf.listInstances(optionKeys={"standaloneonly"} optionValues={"true"}, instances="#{requestScope.servers}" );
				    listAdd(list="#{requestScope.servers}", value="server" index="0");
				    if ($attribute{targetType}=#{null}) {
						setAttribute(key="targetType" value="instance");
						setAttribute(key="targetName" value="server");
					}
				/>
				<!command
					setAttribute(key="targetType" value="instance");
					setAttribute(key="targetName" value="$attribute{instanceName}");
				    gf.navigate(page="#{request.contextPath}/common/appServer/domainLogs.jsf");
				/>
			    </sun:dropDown>
			</sun:property>
		    </sun:propertySheetSection>
		
		</sun:propertySheet>
    <sun:hidden id="helpKey" value="$resource{help_common.serverInstDomainLogs}" />
    </sun:form>
    <f:verbatim>
        <script type="text/javascript">
          function download(event) {
            if (event.preventDefault) {
              event.preventDefault();
            }
            var url = '#{request.contextPath}/download/log-files-' + $('#{targetNameId}').value + '.zip?contentSourceId=LogFiles&target=' + $('#{targetNameId}').value + '&restUrl=#{sessionScope.REST_URL}';
            if(location.protocol != 'https:' &&
              navigator.appName.indexOf("Internet Explorer") != -1 &&
              navigator.appVersion.indexOf("MSIE 10") != -1) {
              // bug#16542371 IE10 is super secure. Because of https community page, it throws
              // SEC7111: HTTPS security is compromised by http://localhost:4848/download/log-files-server.zip?contentSourceId=LogFiles&target=server&restUrl=http://localhost:4848/management/domainindex.jsf
              // and then iframe is loaded with res:// page, so it throws
              // SCRIPT5: Access is denied
              // for iframe.contentWindow
              // thus GLASSFISH-17921 is not fixed for the case, let user see raw 500 error, if any.
              window.location = url;
            } else {
              var iframe = $('download'); 
              iframe.src = url;
              setTimeout(function() {
                  var doc = iframe.contentWindow.document; 
                  var matches = doc.body.innerHTML.match('Exception: (.+)?</pre>');
                  if (matches) {
                      matches = matches[1].match('Exception: (.+)$') || matches;
                      alert(matches[1]);
                  }
              }, 1000);
              return false;
            }
          }
        </script>
        <iframe id="download" src="#" style="display: none"></iframe>
    </f:verbatim>
    
</define>
</composition>

