;(function ($, window, document, undefined) {

'use strict';

Tennpipes.libs.equalizer = {
  name : 'equalizer',

  version : '5.5.1',

  settings : {
    use_tallest : true,
    before_height_change : $.noop,
    after_height_change : $.noop,
    equalize_on_stack : false
  },

  init : function (scope, method, options) {
    Tennpipes.inherit(this, 'image_loaded');
    this.bindings(method, options);
    this.reflow();
  },

  events : function () {
    this.S(window).off('.equalizer').on('resize.fndtn.equalizer', function (e) {
      this.reflow();
    }.bind(this));
  },

  equalize : function (equalizer) {
    var isStacked = false,
        vals = equalizer.find('[' + this.attr_name() + '-watch]:visible'),
        settings = equalizer.data(this.attr_name(true) + '-init');

    if (vals.length === 0) {
      return;
    }
    var firstTopOffset = vals.first().offset().top;
    settings.before_height_change();
    equalizer.trigger('before-height-change').trigger('before-height-change.fndth.equalizer');
    vals.height('inherit');
    vals.each(function () {
      var el = $(this);
      if (el.offset().top !== firstTopOffset) {
        isStacked = true;
      }
    });

    if (settings.equalize_on_stack === false) {
      if (isStacked) {
        return;
      }
    };

    var heights = vals.map(function () { return $(this).outerHeight(false) }).get();

    if (settings.use_tallest) {
      var max = Math.max.apply(null, heights);
      vals.css('height', max);
    } else {
      var min = Math.min.apply(null, heights);
      vals.css('height', min);
    }
    settings.after_height_change();
    equalizer.trigger('after-height-change').trigger('after-height-change.fndtn.equalizer');
  },

  reflow : function () {
    var self = this;

    this.S('[' + this.attr_name() + ']', this.scope).each(function () {
      var $eq_target = $(this);
      self.image_loaded(self.S('img', this), function () {
        self.equalize($eq_target)
      });
    });
  }
};

})(jQuery, window, window.document);