<!-- The <instance-status-sk> custom element declaration.

  Polls the backend for how long the instance has been running, which it
  displays in a human friendly manner, and also presents a button to restart
  the instance.

  Attributes:
    None.

  Events:
    None.

  Methods:
    None.
-->
<link rel="stylesheet" href="/res/common/css/md.css" type="text/css" media="all">

<dom-module id="instance-status-sk">
  <style>
    form {
      display: inline-block;
      margin-left: 0.5em;
      margin-right: 1em;
    }

    a {
      color: white;
      text-decoration: none;
      border: solid white 1px;
      border-radius: 3px;
      padding: 0.6em 1.2em;
      margin: 0.6em;
      text-transform: uppercase;
    }

    a:hover {
      opacity: 0.5;
    }
  </style>
  <template>
    <content>
      Your instance has been running <span id=duration></span>.
      <form id=form action="./instanceStatus" method="post" accept-charset="utf-8">
        <input type="submit" value="Restart">
      </form>
      <form action="/instanceNew" method="post" accept-charset="utf-8">
        <input type="submit" value="New">
      </form>
    </content>
  </template>
</dom-module>

<script>
  Polymer({
    is: "instance-status-sk",

    ready: function() {
      this.async(this._updateDuration.bind(this), 1000);
      window.setInterval(function() {
        this._updateDuration();
      }.bind(this), 60*1000);
      this.$.form.action = this._correctedOrigin() + "instanceStatus";
    },

    _updateDuration: function() {
      if (!this.classList.contains("hidden")) {
        sk.get(this._correctedOrigin() + "instanceStatus").then(JSON.parse).then(function(json){
          this.$.duration.innerText = sk.human.diffDate(json.started*1000);
        }.bind(this));
      }
    },

    _correctedOrigin: function() {
      // TODO(jcgregorio) Extract from here and app.html into a common code file.
      // Since we always use relative URLs, i.e. "./foo" we need to make
      // sure the base URL ends with a "/".
      var origin = window.location.href;
      if (origin[origin.length-1] != "/") {
        origin += "/";
      }
      return origin;
    },

  });
</script>
