<!--
  This in an HTML Import-able file that contains the JS and HTML Templates for
  the human-date-sk element.

  To use this file import it:

    <link href="/res/imp/human-date-sk.html" rel="import" />

  Properties:
    date - The date to make human-readable.

    diff - Rather than displaying the date, display the difference between the
        current date and the given date.

    seconds - Indicates that the given date is expressed in seconds.

  Methods:
    None.

  Events:
    None.
-->
<link rel="import" href="/res/imp/bower_components/polymer/polymer.html">
<dom-module id="human-date-sk">
  <template>
    <span>{{_humanDate}}</span>
  </template>
  <script>
  (function() {
    Polymer({
      is: "human-date-sk",

      properties: {
        date: {
          value: 0,
        },

        diff: {
          type: Boolean,
          value: false,
        },

        seconds: {
          type: Boolean,
          value: false,
        },

        _humanDate: {
          type: String,
          computed: "_humanFormat(date, diff, seconds)",
        },
      },

      _humanFormat: function(date, diff, seconds) {
        // Take the input and convert it to milliseconds.
        var intDate = parseInt(date);
        if (intDate.toString() != date) {
          // date is a string. Parse it into a Date object and get the millis.
          date = new Date(date).getTime();
        } else {
          // date is a number wrapped in a string. Use the value from parseInt.
          date = intDate;
          if (seconds) {
            date *= 1000;
          }
        }

        if (diff) {
          return sk.human.diffDate(date);
        }
        var d = new Date(date);
        return d.toLocaleDateString() + ", " + d.toLocaleTimeString();
      }
    });
  }());
  </script>
</dom-module>
