<!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);
        $("#toolbar button.copy").click(page.copyDocument);
        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="copy">Copy Document…</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>
