<!--

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" id="upload-form">
  <h2>Upload Attachment</h2>
  <fieldset>
    <p class="help">
      Please select the file you want to upload as an attachment to this
      document. Please note that this will result in the immediate creation of
      a new revision of the document, so it's not necessary to save the
      document after the upload.
    </p>
    <table summary=""><tbody><tr>
      <th><label>File:</label></th>
      <td><input type="file" name="_attachments"></td>
    </tr><tr>
      <td id="progress" colspan="2">&nbsp;</td>
    </tr></table>
  </fieldset>
  <div class="buttons">
    <input type="hidden" name="_rev" value="">
    <button type="submit">Upload</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
