<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

#if($TabName == $ResourceBundle.getString('SolrIngester.SolrIngesterTabName'))

<table class="displaytable">
  <tr><td class="separator" colspan="2"><hr/></td></tr>
  <tr>
     <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SolrIngester.SolrAddress'))</nobr></td>
    <td class="value"><input name="solrAddress" type="text"
      value="$Encoder.attributeEscape($SOLRADDRESS)" size="40" />
    </td>
  </tr>
   <tr>
     <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SolrIngester.SolrUsername'))</nobr></td>
    <td class="value"><input name="solrUsername" type="text"
      value="$Encoder.attributeEscape($SOLRUSERNAME)" size="40" />
    </td>
  </tr>
   <tr>
     <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SolrIngester.SolrPassword'))</nobr></td>
    <td class="value"><input name="solrPassword" type="password"
      value="$Encoder.attributeEscape($SOLRPASSWORD)" size="40" />
    </td>
  </tr>
  <tr>
    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SolrIngester.ConnectionTimeout'))</nobr></td>
    <td class="value"><input name="connectionTimeout" type="text"
      value="$Encoder.attributeEscape($CONNECTIONTIMEOUT)" size="20" />
    </td>
  </tr>
  <tr>
    <td class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('SolrIngester.SocketTimeout'))</nobr></td>
    <td class="value"><input name="socketTimeout" type="text"
      value="$Encoder.attributeEscape($SOCKETTIMEOUT)" size="20" />
    </td>
  </tr>
  
</table>
#else
<input type="hidden" name="solrAddress" value="$SOLRADDRESS"/>
<input type="hidden" name="solrUsername" value="$SOLRUSERNAME"/>
<input type="hidden" name="solrPassword" value="$SOLRPASSWORD"/>
<input type="hidden" name="connectionTimeout" value="$CONNECTIONTIMEOUT"/>
<input type="hidden" name="socketTimeout" value="$SOCKETTIMEOUT"/>

#end