/**

* Countdown wrapper.
*
* @author Htmlstream
* @version 1.0
* @requires Countdown (v2.2.0, http://hilios.github.io/jQuery.countdown), circles.js (v0.0.6)
*
*/

;(function ($) {

'use strict';

$.HSCore.components.HSCountdown = {

  /**
   *
   *
   * @var Object _baseConfig
   */
  _baseConfig: {
    yearsElSelector: '.years',
    monthElSelector: '.month',
    daysElSelector: '.days',
    hoursElSelector: '.hours',
    minutesElSelector: '.minutes',
    secondsElSelector: '.seconds',
    // circles
    circles: false,
    wrpClass: 'wrpClass',
    textClass: 'textClass',
    valueStrokeClass: 'valueStrokeClass',
    maxValueStrokeClass: 'maxValueStrokeClass',
    styleWrapper: 'styleWrapper',
    styleText: 'styleText'
  },

  /**
   *
   *
   * @var jQuery pageCollection
   */
  pageCollection: $(),

  /**
   *
   *
   * @var
   */
  _circlesIds: [0],

  /**
   * Initialization of Countdown wrapper.
   *
   * @param String selector (optional)
   * @param Object config (optional)
   *
   * @return jQuery pageCollection - collection of initialized items.
   */
  init: function (selector, config) {

    this.collection = selector && $(selector).length ? $(selector) : $();
    if (!$(selector).length) return;

    this.config = config && $.isPlainObject(config) ?
      $.extend({}, this._baseConfig, config) : this._baseConfig;

    this.config.itemSelector = selector;

    this.initCountdowns();

    return this.pageCollection;

  },

  /**
   * Initialization of each Countdown of the page.
   *
   * @return undefined
   */
  initCountdowns: function () {

    var self = this;

    this.collection.each(function (i, el) {

      var $this = $(el),

        options = {
          endDate: $this.data('end-date') ? new Date($this.data('end-date')) : new Date(),
          startDate: $this.data('start-date') ? new Date($this.data('start-date')) : new Date(),
          yearsEl: $this.find(self.config['yearsElSelector']),
          yearsFormat: $this.data('years-format'),
          monthEl: $this.find(self.config['monthElSelector']),
          monthFormat: $this.data('month-format'),
          daysEl: $this.find(self.config['daysElSelector']),
          daysFormat: $this.data('days-format'),
          hoursEl: $this.find(self.config['hoursElSelector']),
          hoursFormat: $this.data('hours-format'),
          minutesEl: $this.find(self.config['minutesElSelector']),
          minutesFormat: $this.data('minutes-format'),
          secondsEl: $this.find(self.config['secondsElSelector']),
          secondsFormat: $this.data('seconds-format')
        };

      if (self.config['circles'] && $this.data('start-date')) self._initPiesImplementation($this, options);
      else self._initBaseImplementation($this, options);

      self.pageCollection = self.pageCollection.add($this);

    });

  },

  /**
   *
   * @param jQuery container
   * @param Object options
   *
   * @return undefined
   */
  _initBaseImplementation: function (container, options) {

    container.countdown(options.endDate, function (e) {

      if (options.yearsEl.length) {
        options.yearsEl.text(e.strftime(options.yearsFormat));
      }

      if (options.monthEl.length) {
        options.monthEl.text(e.strftime(options.monthFormat));
      }

      if (options.daysEl.length) {
        options.daysEl.text(e.strftime(options.daysFormat));
      }

      if (options.hoursEl.length) {
        options.hoursEl.text(e.strftime(options.hoursFormat));
      }

      if (options.minutesEl.length) {
        options.minutesEl.text(e.strftime(options.minutesFormat));
      }

      if (options.secondsEl.length) {
        options.secondsEl.text(e.strftime(options.secondsFormat));
      }

    });

  },

  /**
   *
   * @param jQuery container
   * @param Object options
   *
   * @return undefined
   */
  _initPiesImplementation: function (container, options) {

    var self = this,
      id,
      oneDay = 24 * 60 * 60 * 1000;

    // prepare elements

    if (options.yearsEl.length) {

      self._preparePieItem(options.yearsEl, {
        maxValue: (options.endDate.getFullYear() - options.startDate.getFullYear()),
        radius: container.data('circles-radius'),
        width: container.data('circles-stroke-width'),
        'fg-color': container.data('circles-fg-color'),
        'bg-color': container.data('circles-bg-color'),
        'additional-text': container.data('circles-additional-text'),
        'font-size': container.data('circles-font-size')
      });

    }

    if (options.monthEl.length) {

      self._preparePieItem(options.monthEl, {
        maxValue: Math.round(Math.abs((options.endDate.getTime() - options.startDate.getTime()) / (oneDay))) / 12,
        radius: container.data('circles-radius'),
        width: container.data('circles-stroke-width'),
        'fg-color': container.data('circles-fg-color'),
        'bg-color': container.data('circles-bg-color'),
        'additional-text': container.data('circles-additional-text'),
        'font-size': container.data('circles-font-size')
      });

    }

    if (options.daysEl.length) {

      self._preparePieItem(options.daysEl, {
        maxValue: self._getDaysMaxValByFormat(options.daysFormat, options.startDate, options.endDate),
        radius: container.data('circles-radius'),
        width: container.data('circles-stroke-width'),
        'fg-color': container.data('circles-fg-color'),
        'bg-color': container.data('circles-bg-color'),
        'additional-text': container.data('circles-additional-text'),
        'font-size': container.data('circles-font-size')
      });

    }

    if (options.hoursEl.length) {

      self._preparePieItem(options.hoursEl, {
        maxValue: 60,
        radius: container.data('circles-radius'),
        width: container.data('circles-stroke-width'),
        'fg-color': container.data('circles-fg-color'),
        'bg-color': container.data('circles-bg-color'),
        'additional-text': container.data('circles-additional-text'),
        'font-size': container.data('circles-font-size')
      });

    }

    if (options.minutesEl.length) {

      self._preparePieItem(options.minutesEl, {
        maxValue: 60,
        radius: container.data('circles-radius'),
        width: container.data('circles-stroke-width'),
        'fg-color': container.data('circles-fg-color'),
        'bg-color': container.data('circles-bg-color'),
        'additional-text': container.data('circles-additional-text'),
        'font-size': container.data('circles-font-size')
      });

    }

    if (options.secondsEl.length) {

      self._preparePieItem(options.secondsEl, {
        maxValue: 60,
        radius: container.data('circles-radius'),
        width: container.data('circles-stroke-width'),
        'fg-color': container.data('circles-fg-color'),
        'bg-color': container.data('circles-bg-color'),
        'additional-text': container.data('circles-additional-text'),
        'font-size': container.data('circles-font-size')
      });

    }

    // init countdown
    container.countdown(options.endDate, function (e) {

      // years
      if (options.yearsEl.length) {
        options.yearsEl.data('circle').update(e.strftime(options.yearsFormat));
      }

      // months
      if (options.monthEl.length) {

        options.monthEl.data('circle').update(e.strftime(options.monthFormat));
      }

      // days
      if (options.daysEl.length) {
        options.daysEl.data('circle').update(e.strftime(options.daysFormat));
      }

      // hours
      if (options.hoursEl.length) {
        options.hoursEl.data('circle').update(e.strftime(options.hoursFormat));
      }

      // minutes
      if (options.minutesEl.length) {
        options.minutesEl.data('circle').update(e.strftime(options.minutesFormat));
      }

      // seconds
      if (options.secondsEl.length) {
        options.secondsEl.data('circle').update(e.strftime(options.secondsFormat));
      }

    });

  },

  /**
   *
   * @param jQuery el
   * @param Object options
   *
   * @return undefined
   */
  _preparePieItem: function (el, options) {

    var self = this,
      id = self._circlesIds[self._circlesIds.length - 1] + 1;
    self._circlesIds.push(id);

    el.attr('id', 'hs-countdown-element-' + id);

    el.data('circle', Circles.create({
      id: 'hs-countdown-element-' + id,
      radius: options['radius'] || 80,
      value: 0,
      maxValue: options['maxValue'] || 100,
      width: options['width'] || 10,
      text: function (value) {
        return value + (options['additional-text'] || '');
      },
      colors: [options['bg-color'] || '#eeeeee', options['fg-color'] || '#72c02c'],
      duration: 0,
      wrpClass: self.config['wrpClass'],
      textClass: self.config['textClass'],
      valueStrokeClass: self.config['valueStrokeClass'],
      maxValueStrokeClass: self.config['maxValueStrokeClass'],
      styleWrapper: self.config['styleWrapper'],
      styleText: self.config['styleText']
    }));

    if (options['font-size']) {
      el.find('.' + self.config['textClass']).css('font-size', options['font-size'] + 'px');
    }

  },

  /**
   *
   * @param String format
   * @param Date startDate
   * @param Date endDate
   *
   * @return Number
   */
  _getDaysMaxValByFormat: function (format, startDate, endDate) {

    var oneDay = 24 * 60 * 60 * 1000;

    switch (format) {

      case '%D':

        return Math.round(Math.abs((endDate.getTime() - startDate.getTime()) / (oneDay)));

        break;

      default:

        return 31;

    }

  }

}

})(jQuery);