<!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>Replicator</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">
    <link rel="stylesheet" href="style/jquery-ui-1.8.11.custom.css" type="text/css">
    <script src="script/json2.js"></script>
    <script src="script/sha1.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-ui-1.8.11.custom.min.js"></script>
    <script>
      $(document).ready(function() {
        var allDatabases;

        $("fieldset input[type=radio]").click(function() {
          var radio = this;
          var fieldset = $(this).parents("fieldset").get(0);
          $("input[type=text]", fieldset).each(function() {
            this.disabled = radio.value == "local";
            if (!this.disabled) this.focus();
          });
          $('.local', fieldset).each(function() {
            this.disabled = radio.value == "remote";
            if (!this.disabled) this.focus();
          });
        });

        var getDatabases = function() {
          $.couch.allDbs({
            success: function(dbs) {
              allDatabases = dbs.sort();

              $("fieldset select").each(function() {
                var select = this;
                $.each(dbs, function(idx, dbName) {
                  $("<option></option>").text(dbName).appendTo(select);
                });
                select.selectedIndex = 0;
              });

              $('#to_name').autocomplete({ source: dbs });
            }
          });
        };
        getDatabases();

        $("button#swap").click(function() {
          var fromName = $("#source select").val();
          $("#source select").val($("#target select").val());
          $("#target select").val(fromName);

          var fromUrl = $("#source input[type=text]").val();
          $("#source input[type=text]").val($("#target input[type=text]").val());
          $("#target input[type=text]").val(fromUrl);

          var fromType = $("#source input[type=radio]").filter(function() {
            return this.checked;
          }).val();
          var toType = $("#target input[type=radio]").filter(function() {
            return this.checked;
          }).val();
          $("#source input[value=" + toType + "]").click();
          $("#target input[value=" + fromType + "]").click();

          $("#replicate").get(0).focus();
          return false;
        });

        $("button#replicate").click(function() {
          $("#records tbody.content").empty();
          var targetIsLocal = $('#to_local:checked').length > 0;
          var source = $("#from_local")[0].checked ? $("#from_name").val() : $("#from_url").val();
          var target = targetIsLocal ? $("#to_name").val() : $("#to_url").val();
          var repOpts = {};

          if (targetIsLocal && $.inArray(target, allDatabases) < 0) {
            if(!confirm('This will create a database named '+target+'. Ok?')) {
              return;
            }
            else {
              repOpts.create_target = true;
            }
          }

          if ($("#continuous")[0].checked) {
            repOpts.continuous = true;
          }
          $.couch.replicate(source, target, {
            success: function(resp) {
              if (resp._local_id) {
                $("<tr><th></th></tr>")
                  .find("th").text(JSON.stringify(resp)).end()
                  .appendTo("#records tbody.content");
                $("#records tbody tr").removeClass("odd").filter(":odd").addClass("odd");
              } else {
                $.each(resp.history, function(idx, record) {
                  $("<tr><th></th></tr>")
                    .find("th").text(JSON.stringify(record)).end()
                    .appendTo("#records tbody.content");
                });
                $("#records tbody tr").removeClass("odd").filter(":odd").addClass("odd");
                $("#records tbody.footer td").text("Replication session " + resp.session_id);

                if (repOpts.create_target) {
                  getDatabases();
                }
              }
            }
          }, repOpts);
        });
      });
    </script>
  </head>
  <body><div id="wrap">
    <h1>
      <a href="index.html">Overview</a>
      <strong>Replicator</strong>
    </h1>
    <div id="content">

      <form id="replicator">
        <fieldset id="source">
          <legend>Replicate changes from:</legend>
          <p>
            <input type="radio" id="from_local" name="from_type" value="local" checked> 
            <label for="from_local">Local Database: </label>
            <select id="from_name" name="from_name" class="local"></select>
          </p><p>
            <input type="radio" id="from_to_remote" name="from_type" value="remote"> 
            <label for="from_to_remote">Remote database: </label>
            <input type="text" id="from_url" name="from_url" size="30" value="http://" disabled>
          </p>
        </fieldset>
        <p class="swap"><button id="swap" tabindex="99">⇄</button></p>
        <fieldset id="target">
          <legend>to:</legend>
          <p>
            <input type="radio" id="to_local" name="to_type" value="local" checked> 
            <label for="to_local">Local database: </label>
            <input type="text" id="to_name" name="to_name" class="local"></select>
          </p><p>
            <input type="radio" id="to_remote" name="to_type" value="remote"> 
            <label for="to_remote">Remote database: </label>
            <input type="text" id="to_url" name="to_url" size="30" value="http://" disabled>
          </p>
        </fieldset>
        <p class="actions">
          <label><input type="checkbox" name="continuous" value="continuous" id="continuous"> Continuous</label>
          <button id="replicate" type="button">Replicate</button>
        </p>
      </form>

      <table id="records" class="listing" cellspacing="0">
        <caption>Replication History</caption>
        <thead><tr>
          <th>Event</th>
        </tr></thead>
        <tbody class="content"></tbody>
        <tbody class="footer"><tr>
          <td colspan="4">No replication</td>
        </tr></tbody>
      </table>

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