<!--

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="view-save-as" onload="initForm(this)">
  <h2>Save View As&hellip;</h2>
  <fieldset>
    <p class="help">
      You can save this function code as a permanent view in the database. Just
      enter or select the design document and the name of the view below. Note
      that if you choose an existing view, it will be overwritten!
    </p>
    <table summary=""><tbody><tr>
      <th><label for="input_docid">Design Document:</label></th>
      <td><tt>_design/</tt><input type="text" id="input_docid" name="docid" size="20"></td>
    </tr><tr>
      <th><label for="input_name">View Name:<label></th>
      <td><input type="text" id="input_name" name="name" size="30"></td>
    </tr></table>
  </fieldset>
  <div class="buttons">
    <button type="submit">Save</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
