<!--

    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

-->

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

<sun:page id="page1">
    <!beforeCreate
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings");
    getRequestValue(key="dirPathId" value=>$page{dirPathId});
    getRequestValue(key="appNameId" value=>$page{appNameId});
    getRequestValue(key="folderOnly" value=>$page{folderOnly});
    getRequestValue(key="ctxRootId" value=>$page{ctxRootId});
    getRequestValue(key="typeId" value=>$page{typeId});
    getRequestValue(key="extensionId" value=>$page{extensionId});
    getRequestValue(key="dropDownProp" value=>$page{dropDownProp});
    testExists(attr="$pageSession{folderOnly}" defined=>$attribute{optionExist});
    if (${optionExist}){
        setPageSessionAttribute(key="folderOnly" value="#{true}");
        setPageSessionAttribute(key="buttonLabel" value="$resource{i18n.button.ChooseFolder}");
    }
    if (!${optionExist}){
        setPageSessionAttribute(key="folderOnly" value="#{false}");
        setPageSessionAttribute(key="buttonLabel" value="$resource{i18n.button.ChooseFile}");
    }
    />
<sun:html id="html2">
    <sun:head id="propertyhead">
        <sun:script url="/resource/common/js/adminjsf.js" />
    </sun:head>
    <sun:body id="body3">
        <sun:form id="propertyForm">
            <!-- PropertySheet .... -->
            <sun:propertySheet id="propertySheet">			 
                <sun:propertySheetSection id="propSec">
                    <sun:property id="fileChooseProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}">
                        <sun:fileChooser id="folderChooser"
                                         selected="#{fileSelected}"
                                         sortField="alphabetic" descending="#{false}"
                                         multiple="#{false}" folderChooser="#{folderOnly}">
                            <!afterCreate
                            getClientId(component="$this{component}" clientId=>$page{fileChooserId});
                            />
                        </sun:fileChooser>
                   </sun:property>   
                <sun:property>
                    <sun:panelGroup id="topButtons" >
                        <sun:button id="selectButton"
                             text="$pageSession{buttonLabel}" 
                             onClick="admingui.deploy.populateDirAndAppName('#{fileChooserId}', '#{dirPathId}', '#{appNameId}','#{typeId}',  '#{dropDownProp}', '#{ctxRootId}', '#{extensionId}', '#{sessionScope.appTypeString}' ); window.close(); " >
                              <!afterCreate
                                getClientId(component="$this{component}" clientId=>$page{selectButtonId});
                              />
                          </sun:button>
                          <sun:button id="cancelButton" immediate="#{true}" primary="#{false}" 
                                text="$resource{i18n.button.Cancel}" onClick="javascript:window.close();" />
                    </sun:panelGroup>
                </sun:property>
            </sun:propertySheetSection>
        </sun:propertySheet> 
    </sun:form>
    </sun:body>
</sun:html>
</sun:page>
