<!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>Configuration</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/jquery.js?1.4.2"></script>
    <script src="script/jquery.couch.js?0.11.0"></script>
    <script src="script/jquery.dialog.js?0.11.0"></script>
    <script src="script/futon.js?0.11.0"></script>
    <script src="script/jquery.editinline.js?0.11.0"></script>
    <script>
      $(function() {
        $.couch.config({
          success: function(resp) {
            var sections = [];
            for (var sectionName in resp) {
              sections.push(sectionName);
            }
            sections.sort();
            $.each(sections, function(idx, sectionName) {
              var row = $("<tr><th></th></tr>")
                .find("th").text(sectionName).end()
                .appendTo("#config tbody.content");
              var section = resp[sectionName]
              var options = [];
              for (var option in section) {
                options.push(option);
              }
              options = options.sort();
              var prev = null;
              $.each(options, function(idx, optionName) {
                var cur = idx == 0 ? row : $("<tr></tr>");
                $("<td class='name' section="+sectionName+"><b></b></td>")
                  .find("b").text(optionName).end().appendTo(cur);
                $("<td class='value'><code></code></td>")
                  .find("code").text(section[optionName]).end().appendTo(cur);
                cur.data("section", sectionName).data("option", optionName);
                if (cur !== row) cur.insertAfter(prev);
                prev = cur;
              });
              row.find("th").attr("rowspan", options.length);
            });
            $("#config tbody tr").removeClass("odd").filter(":odd").addClass("odd");
            $("#config tbody td.value code").makeEditable({
              accept: function(newValue) {
                var row = $(this).parents("tr").eq(0);
                $.couch.config({
                  success: function(resp) {
                    row.find("td.value code").text(newValue);
                }}, row.data("section"), row.data("option"), newValue);
              }
            }).parent().parent()
              .append($('<td><div style="text-align:center;""><a class="remove" href="#remove">x</a></div></td>'))
              .click(function (ev) {
                // There is a listener that stops all events below this element which is
                // why the remove link listener has to be here
                var n = $(ev.target).parent().parent().parent();
                if ($(ev.target).attr('href') === "#remove" ) {
                  $.couch.config({ success: function () {location = location.href.split('#')[0];} }
                                 , n.find('td.name').attr("section"), n.find('td.name').text(), null);
                }
            })
            var add = $('<a href="#add">Add a new section</a>').click(function () {
              $.showDialog("dialog/_create_config.html", {
                submit: function(data, callback) {
                  var fail = false;
                  if (!data.section || data.section.length == 0) {
                    callback({section: "Please enter a section."});
                    fail = true;
                  }
                  if (!data.option || data.option.length == 0) {
                    callback({option: "Please enter a option."});
                    fail = true;
                  }
                  if (!data.val || data.val.length == 0) {
                    callback({val: "Please enter a value."});
                    fail = true;
                  }
                  if (fail) {return}
                  $.couch.config({ success: function () {callback();location = location.href.split('#')[0]} }
                                 , data.section, data.option, data.val);
                }
              });
            })
            $("div#content").append(add)
          }
        });

      });
    </script>
  </head>
  <body><div id="wrap">
    <h1>
      <a href="index.html">Overview</a>
      <strong>Configuration</strong>
    </h1>
    <div id="content">
      <p class="help">
        <strong>Note:</strong> Some configuration options may require
        restarting the server to take effect after modification.
      </p>
      <p class="help">
       For the strongest consistency guarantees, <tt>delayed_commits</tt> should be set to <tt>false</tt>. The default value of <tt>true</tt> is designed for single-user performance. For more details see <a href="http://wiki.apache.org/couchdb/Durability_Matrix">a discussion of durability on the CouchDB wiki</a>.
      </p>
      <table id="config" class="listing" cellspacing="0">
        <caption>Configuration</caption>
        <thead><tr>
          <th>Section</th>
          <th>Option</th>
          <th>Value</th>
          <th>Delete</th>
        </tr></thead>
        <tbody class="content"></tbody>
      </table>

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