<!--

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

-->

<!-- resourceNode/resXmlFileChooser.jsf -->

<sun:page id="page1">
    <!beforeCreate
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings");
    getRequestValue(key="dirPathId" value=>$page{dirPathId});
    />
<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="$resource{i18n.button.ChooseFile}"
                             onClick="if(admingui.deploy.populateDir('#{fileChooserId}', '#{dirPathId}')){ window.close();};return false; " >
                              <!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>
