﻿jQuery.fn.countdown = function (date, settings) {
  var countdown_settings = {
    lang: {
      years:   ['год', 'года', 'лет'],
      months:  ['месяц', 'месяца', 'месяцев'],
      days:    ['день', 'дня', 'дней'],
      hours:   ['час', 'часа', 'часов'],
      minutes: ['минута', 'минуты', 'минут'],
      seconds: ['секунда', 'секунды', 'секунд'],
      plurar:  function(n) {
        return (n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
      }
    },
    prefix: "Осталось: ",
    finish: "Всё",
    finish2: function () { }
  };
  countdown_settings = jQuery.extend(countdown_settings, settings);

  var timeDifference = function(begin, end) {
      if (end < begin) {
        return false;
      }
      var
      days   = end.getDate()  - begin.getDate(),
      months = end.getMonth() - begin.getMonth(),
      years  = end.getYear()  - begin.getYear(),
      hms    = (end / 1000 - begin / 1000) % 86400,
      seconds = Math.floor(hms % 60),
      minutes = Math.floor(hms/60) % 60,
      hours   = Math.floor(hms/3600) % 60,
      date = new Date();
      if (days < 0) {
        date.setFullYear(begin.getYear(), begin.getMonth(), 32);
        days += 32 - date.getDate();
        months--;
      }
      if (months < 0) {
        months += 12;
        years--;
      }
      var diff = {years: years, months: months, days: days, hours: hours, minutes: minutes, seconds: seconds};
      var result = new Array();
      for (i in diff) {
        if(!diff[i]) continue;
        result.push(diff[i] + ' ' + countdown_settings.lang[i][countdown_settings.lang.plurar(diff[i])]);
      }
      return result.join(' ');
  };
  var elem = $(this);
  var timeUpdate = function () {
      var s = timeDifference(new Date(), date);
      if (s.length) {
        elem.html(countdown_settings.prefix + s);
      } else {
          clearInterval(timer);
          countdown_settings.finish2();
          elem.html(countdown_settings.finish);
      }
  };
  timeUpdate();
  var timer = setInterval(timeUpdate, 1000);
};
