<!--

Licensed 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.

-->
<form action="" method="post">
  <h2>Create New Config Option</h2>
  <fieldset>
    <p class="help">
      Please enter the section, option, and value.
    </p>
    <table summary="">
      <tbody>
        <tr>
          <th><label>section:</label></th>
          <td><input type="text" name="section" size="24"></td>
        </tr>
        <tr>  
          <th><label>option:</label></th>
          <td><input type="text" name="option" size="24"></td>
        </tr>
        <tr>
            <th><label>value:</label></th>
            <td><input type="text" name="val" size="24"></td>
        </tr>
      </tbody>
    </table>
  </fieldset>
  <div class="buttons">
    <button type="submit">Create</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
