/*
 * Copyright (c) 2011 TWIMPACT UG (haftungsbeschraenkt). All rights reserved.
 */

(function() {

  $.prettyDate = {

    template: function(source, params) {
      if (arguments.length == 1)
        return function() {
          var args = $.makeArray(arguments);
          args.unshift(source);
          return $.prettyDate.template.apply(this, args);
        };
      if (arguments.length > 2 && params.constructor != Array) {
        params = $.makeArray(arguments).slice(1);
      }
      if (params.constructor != Array) {
        params = [ params ];
      }
      $.each(params, function(i, n) {
        source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
      });
      return source;
    },

    now: function() {
      return Date.now();
    },

    // Takes a Date object and returns a string representing how
    // long ago the date represents.
    format: function(date) {
      var diff = ($.prettyDate.now() - date) / 1000;
      var day_diff = Math.floor(diff / 86400);

      if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31)
        return;

      var messages = $.prettyDate.messages;
      return day_diff == 0 && (
          diff < 60 && messages.now ||
              diff < 120 && messages.minute ||
              diff < 3600 && messages.minutes(Math.floor(diff / 60)) ||
              diff < 7200 && messages.hour ||
              diff < 86400 && messages.hours(Math.floor(diff / 3600))) ||
          day_diff == 1 && messages.yesterday ||
          day_diff < 7 && messages.days(day_diff) ||
          day_diff < 31 && messages.weeks(Math.ceil(day_diff / 7));
    }

  };

  $.prettyDate.messages = {
    now: "just now",
    minute: "1 minute ago",
    minutes: $.prettyDate.template("{0} minutes ago"),
    hour: "1 hour ago",
    hours: $.prettyDate.template("{0} hours ago"),
    yesterday: "Yesterday",
    days: $.prettyDate.template("{0} days ago"),
    weeks: $.prettyDate.template("{0} weeks ago")
  };

  $.fn.prettyDate = function(options) {
    options = $.extend({
      value: function() {
        return $(this).attr("title");
      },
      interval: 10000
    }, options);
    var elements = this;

    function format() {
      elements.each(function() {
        var date = $.prettyDate.format(options.value.apply(this));
        if (date && $(this).text() != date)
          $(this).text(date);
      });
    }

    format();
    if (options.interval)
      setInterval(format, options.interval);
    return this;
  };

})();
