<!--

    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

-->

<!-- web/configuration/virtualServerAttrs.inc -->
#include "/common/applications/applicationHandlers.inc"
<sun:propertySheet id="propertySheet">
#include "/common/shared/configNameSection.inc"
    <sun:propertySheetSection id="propertSectionTextField">
        <sun:property id="IdStaticProp"  rendered="#{edit}" labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.Id}" >
            <sun:staticText id="IdStatic" text="#{pageSession.Name}"/>
        </sun:property>

        <sun:property id="IdTextProp"  rendered="#{!edit}" labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.Id}">
            <sun:textField id="IdText" styleClass="required" text="#{pageSession.valueMap['id']}" columns="$int{55}" maxLength="#{sessionScope.fieldLengths['maxLength.vs.Id']}" required="#{true}" />
        </sun:property>

        <sun:property id="hostsProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.Hosts}" helpText="$resource{i18n_web.vs.HostsHelp}">
            <sun:textField id="Hosts" styleClass="required" columns="$int{55}" maxLength="#{sessionScope.fieldLengths['maxLength.vs.Hosts']}" text="#{pageSession.valueMap['hosts']}" required="#{true}"/>
        </sun:property>

        <sun:property id="stateProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.State}">
            <sun:dropDown id="state"  selected="#{pageSession.valueMap['state']}" labels={"$resource{i18n_web.vs.StateOn}","$resource{i18n_web.vs.StateOff}","$resource{i18n_web.vs.StateDisabled}"} values={"on","off","disabled"} />
        </sun:property>

        <sun:property id="enableLog"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.sso}">
            <sun:dropDown id="state"  selected="#{pageSession.valueMap['ssoEnabled']}" labels={"$resource{i18n_web.vs.controlByHS}","$resource{i18n_web.vs.alwaysEnable}","$resource{i18n_web.vs.alwaysDisable}"} values={"inherit","true","false"} />
        </sun:property>

        <sun:property id="ssoCookieHttpOnly"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.ssoCookieHttpOnly}" helpText="$resource{i18n_web.vs.ssoCookieHttpOnlyHelp}">
            <sun:checkbox  selected="#{pageSession.valueMap['ssoCookieHttpOnly']}"  selectedValue="true" />
        </sun:property>

        <sun:property id="nwProps"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.NetworkListeners}" helpText="$resource{i18n_web.vs.NetworkListenersHelp}">
            <sun:listbox id="nw" immediate="#{true}" multiple="#{true}"  rows="$int{4}" 
                labels="$pageSession{availableNetworkListeners}"
                selected="#{pageSession.selectedNetworkListeners}" >
                <!beforeCreate
                    gf.getChildrenNamesList(endpoint="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/network-config/network-listeners/network-listener"
                          result="#{pageSession.networkListeners}");
                    getListBoxOptions(
                        availableList="#{pageSession.networkListeners}",
                        selectedCommaString="#{pageSession.valueMap['networkListeners']}",
                        availableListResult="#{pageSession.availableNetworkListeners}",
                        selectedOptions="#{pageSession.selectedNetworkListeners}"
                        addEmptyFirstChoice="true");
                />
                </sun:listbox>
            </sun:property>

        <sun:property id="webProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.DefaultWeb}" helpText="$resource{i18n_web.vs.DefaultWebHelp}">
            <sun:dropDown id="Web" labels="$pageSession{modules}" selected="#{pageSession.valueMap['defaultWebModule']}" />
            <!beforeCreate
                setPageSessionAttribute(key="snifferType" value="web");
                gfr.getApplicationsBySnifferType();
                setAttribute(key="modList" value="#{pageSession.snifferTypeApplicationsList}");
                addEmptyFirstElement(in="$attribute{modList}"  out="#{pageSession.modules}")
            />
        </sun:property>
        <sun:property id="logFileProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.LogFile}" helpText="$resource{i18n_web.vs.LogFileHelp}">
            <sun:textField id="LogFile" columns="$int{55}" maxLength="#{sessionScope.fieldLengths['maxLength.vs.LogFile']}" text="#{pageSession.valueMap['logFile']}" />
        </sun:property>

        <sun:property id="docroot"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.docroot}" helpText="$resource{i18n_web.vs.docrootHelp}">
            <sun:textField id="docroot" columns="$int{55}" maxLength="#{sessionScope.fieldLengths['maxLength.vs.docroot']}" text="#{pageSession.valueMap['docroot']}" />
        </sun:property>

    </sun:propertySheetSection>

    <sun:propertySheetSection id="al" label="$resource{i18n_web.vs.accessLog}">

        <sun:property id="enableLog"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.accessLogging}">
             <sun:dropDown id="log"  selected="#{pageSession.valueMap['accessLoggingEnabled']}" labels={"$resource{i18n_web.vs.controlByHS}","$resource{i18n_web.vs.alwaysEnable}","$resource{i18n_web.vs.alwaysDisable}"} values={"inherit","true","false"} />
         </sun:property>

        <sun:property id="accesslog"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_web.vs.path}" helpText="$resource{i18n_web.vs.pathHelp}">
            <sun:textField id="accesslog" columns="$int{55}" maxLength="#{sessionScope.fieldLengths['maxLength.vs.path']}" text="#{pageSession.valueMap['accessLog']}" />
        </sun:property>

    </sun:propertySheetSection>
</sun:propertySheet>
"<br><br>

