<!--
Copyright (C) 2015 The Android Open Source Project

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.
-->

<link rel="import" href="../bower_components/polymer/polymer.html">

<dom-module id="gr-date-formatter">
  <template>
    <style>
      :host {
        display: inline;
      }
    </style>
    <span>[[_computeDateStr(dateStr)]]</span>
  </template>
  <script>
  (function() {
    'use strict';

    var Duration = {
      HOUR: 1000 * 60 * 60,
      DAY: 1000 * 60 * 60 * 24,
    };

    var ShortMonthNames = [
      'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct',
      'Nov', 'Dec'
    ];

    Polymer({
      is: 'gr-date-formatter',

      properties: {
        dateStr: {
          type: String,
          value: null,
          notify: true
        }
      },

      _computeDateStr: function(dateStr) {
        return this._dateStr(this._parseDateStr(dateStr), new Date());
      },

      _parseDateStr: function(dateStr) {
        if (!dateStr) { return null; }
        return util.parseDate(dateStr);
      },

      _dateStr: function(t, now) {
        if (!t) { return ''; }
        var diff = now.getTime() - t.getTime();
        if (diff < Duration.DAY && t.getDay() == now.getDay()) {
          // Within 24 hours and on the same day:
          // '2:14 AM'
          var pm = t.getHours() >= 12;
          var hours = t.getHours();
          if (hours == 0) {
            hours = 12;
          } else if (hours > 12) {
            hours = t.getHours() - 12;
          }
          var minutes = t.getMinutes() < 10 ? '0' + t.getMinutes() :
              t.getMinutes();
          return hours + ':' + minutes + (pm ? ' PM' : ' AM');
        } else if ((t.getDay() != now.getDay() || diff >= Duration.DAY) &&
                   diff < 180 * Duration.DAY) {
          // From one to six months:
          // 'Aug 29'
          return ShortMonthNames[t.getMonth()] + ' ' + t.getDate();
        } else if (diff >= 180 * Duration.DAY) {
          // More than six months:
          // 'Aug 29, 1997'
          return ShortMonthNames[t.getMonth()] + ' ' + t.getDate() + ', ' +
              t.getFullYear();
        }
      },

    });
  })();
  </script>
</dom-module>
