<!--

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

-->

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

<sun:propertySheetSection id="section1" >
<sun:property id="prop1" labelAlign="left" noWrap="#{false}" overlapLabel="#{false}" label="$resource{i18n.common.location}">                           
    <!afterCreate
        getClientId(component="$this{component}" clientId=>$page{locationPropId});
    />
    <sun:radioButton id="uploadRdBtn" name="uploadRdBtn" label="$resource{i18n.deploy.chooseJarLabel}" selected="#{uploadRdBtn}" selectedValue="client"
        onClick="admingui.deploy.uploadRdBtnAction('#{dirPathId}','#{dirSelectBtnId}','#{filSelectBtnId}','#{fileuploadId}','#{pageSession.radioChoosenId}')"
    >
        <!beforeCreate
            setPageSessionAttribute(key="uploadRdBtn", value="client");
        />
   </sun:radioButton>
    "<br />
    <sun:upload id="fileupload" style="margin-left: 17pt" columns="$int{50}" maxLength="#{sessionScope.fieldLengths['maxLength.deploy.uploadedFile']}" uploadedFile="#{requestScope.uploadedFile}"
        onChange="javascript:admingui.deploy.setFieldValue('#{appNameId}', this.value,  '#{dropDownProp}', '#{typeId}', '#{contextRootId}', '#{extensionId}', window, '#{sessionScope.appTypeString}');">
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{fileuploadId});
        />
    </sun:upload>


    "<br /><br/><br/>
    <sun:radioButton id="fileChooseRdBtn" name="uploadRdBtn" selected="#{uploadRdBtn}"  selectedValue="serverSide" label="$resource{i18n.deploy.chooseLocal}" 
        onClick="admingui.deploy.fileChooseAction('#{dirPathId}','#{dirSelectBtnId}','#{filSelectBtnId}','#{fileuploadId}','#{pageSession.radioChoosenId}')"
    />
    "<br />

    <sun:textField id="dirPath" required="#{false}" text="#{dirPath}" submitForm="false" style="margin-left: 17pt" columns="$int{50}" maxLength="#{sessionScope.fieldLengths['maxLength.deploy.dirPath']}" 
        onChange="javascript:admingui.deploy.setFieldValue('#{appNameId}', this.value, '#{dropDownProp}', '#{typeId}', '#{contextRootId}', '#{extensionId}', window, '#{sessionScope.appTypeString}'); ">
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{dirPathId});
        />
    </sun:textField>

    <sun:button id="filSelectBtn" text="$resource{i18n.button.BrowseFile}" disabled="true" primary="false"
        onClick="javascript: var win = window.open('#{request.contextPath}/common/applications/fileChooser.jsf?dirPathId=#{dirPathId}&appNameId=#{appNameId}&ctxRootId=#{contextRootId}&typeId=#{typeId}&extensionId=#{extensionId}&dropDownProp=#{dropDownProp}', 'fileChooserPopup', 'height=580, width=650, top='+((screen.height - (screen.height/1.618))-(500/2))+',left='+((screen.width-650)/2)+', scrollbars, resizable');win.focus(); return false" >
         <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{filSelectBtnId});
        />
    </sun:button>
    "&nbsp;
    <sun:button id="dirSelectBtn" text="$resource{i18n.button.BrowseFolder}" disabled="#{true}" primary="#{false}"
         onClick="javascript: var win = window.open('#{request.contextPath}/common/applications/fileChooser.jsf?folderOnly=true&dirPathId=#{dirPathId}&appNameId=#{appNameId}&ctxRootId=#{contextRootId}&typeId=#{typeId}&extensionId=#{extensionId}&dropDownProp=#{dropDownProp}', 'fileChooserPopup', 'height=580, width=650, top='+((screen.height - (screen.height/1.618))-(500/2))+',left='+((screen.width-650)/2)+', scrollbars, resizable');win.focus(); return false" >
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{dirSelectBtnId});
        />
    </sun:button>
    <sun:textField  id="extension" visible="$boolean{false}" text="#{extension}">
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{extensionId});
        />
    </sun:textField>

    <sun:textField  id="action" visible="$boolean{false}" text="#{pageSession.radioChoosen}">
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{radioChoosenId});
            setPageSessionAttribute(key="radioChoosen" value="client");
        />
    </sun:textField>

</sun:property>
</sun:propertySheetSection>


  
