<!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.9.0" type="text/css">
    <script src="script/json2.js"></script>
    <script src="script/jquery.js?1.3.1"></script>
    <script src="script/jquery.cookies.js?0.9.0"></script>
    <script src="script/jquery.couch.js?0.9.0"></script>
    <script src="script/jquery.dialog.js?0.9.0"></script>
    <script src="script/jquery.editinline.js?0.9.0"></script>
    <script src="script/jquery.form.js?0.9.0"></script>
    <script src="script/jquery.resizer.js?0.9.0"></script>
    <script src="script/futon.js?0.9.0"></script>
    <script src="script/futon.browse.js?0.9.0"></script>
    <script src="script/futon.format.js?0.9.0"></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>
