<!DOCTYPE html>
<!--

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.

-->
<html lang="en">
  <head>
    <title>View Document</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <link rel="stylesheet" href="style/layout.css?0.11.0" type="text/css">
    <script src="script/json2.js"></script>
    <script src="script/sha1.js"></script>
    <script src="script/base64.js"></script>
    <script src="script/jquery.js"></script>
    <script src="script/jquery.couch.js"></script>
    <script src="script/jquery.dialog.js"></script>
    <script src="script/futon.js"></script>
    <script src="script/jquery.resizer.js"></script>
    <script src="script/futon.browse.js"></script>
    <script src="script/futon.format.js"></script>    
    <script src="script/jquery.editinline.js"></script>
    <script src="script/jquery.form.js"></script>
    <script>
      var page = new $.futon.CouchDocumentPage();

      $.futon.navigation.ready(function() {
        this.addDatabase(page.db.name);
        this.updateSelection(
          location.pathname.replace(/document\.html/, "database.html"),
          "?" + page.db.name
        );
      });

      $(function() {
        $("h1 a.dbname").text(page.dbName)
          .attr("href", "database.html?" + encodeURIComponent(page.db.name));
        $("h1 strong").text(page.docId);
        $("h1 a.raw").attr("href", "/" + encodeURIComponent(page.db.name) +
          "/" + encodeURIComponent(page.docId));
        page.updateFieldListing();

        $("#tabs li.tabular a").click(page.activateTabularView);
        $("#tabs li.source a").click(page.activateSourceView);

        $("#toolbar button.save").click(page.saveDocument);
        $("#toolbar button.add").click(page.addField);
        $("#toolbar button.load").click(page.uploadAttachment);
        if (page.isNew) {
          $("#toolbar button.delete").hide();
        } else {
          $("#toolbar button.delete").click(page.deleteDocument);
        }
      });
    </script>
  </head>

  <body><div id="wrap">
    <h1>
      <a href="index.html">Overview</a>
      <a class="dbname" href="#">?</a>
      <strong>?</strong>
      <a class="raw" title="Raw document"></a>
    </h1>
    <div id="content">
      <ul id="toolbar">
        <li><button class="save">Save Document</button></li>
        <li><button class="add">Add Field</button></li>
        <li><button class="load">Upload Attachment…</button></li>
        <li><button class="delete">Delete Document…</button></li>
      </ul>

      <ul id="tabs">
        <li class="active tabular"><a href="#tabular">Fields</a></li>
        <li class="source"><a href="#source">Source</a></li>
      </ul>
      <table id="fields" class="listing" cellspacing="0">
        <col class="field"><col class="value">
        <caption>Fields</caption>
        <thead>
          <tr>
            <th>Field</th>
            <th>Value</th>
          </tr>
        </thead>
        <tbody class="content">
        </tbody>
        <tbody class="source" style="display: none">
          <tr><td colspan="2"></td></tr>
        </tbody>
        <tbody class="footer">
          <tr>
            <td colspan="2">
              <div id="paging">
                <a class="prev">← Previous Version</a> | <a class="next">Next Version →</a>
              </div>
              <span></span>
            </td>
          </tr>
        </tbody>
      </table>

    </div>
  </div></body>
</html>
