/*! jQuery Mosaic Flow v0.2.5 by Artem Sapegin - http://sapegin.github.io/jquery.mosaicflow/ - Licensed MIT */
!function(a) {
"function" == typeof define && define.amd ? define(["jquery"], a) : a(jQuery)
}(function(a) {
"use strict";
function b(a, b) {
this.container = a, this.options = b, this.container.trigger("start"), this.init(), this.container.trigger("ready")
}
function c(a) {
function b(a, b) {
return b.toUpper()
}
var c = {}, d = a.data();
for (var e in d)
c[e.replace(/-(\w)/g, b)] = d[e];
return c
}
function d(a) {
var b = {};
if (b.height = parseInt(a.attr("height"), 10), b.width = parseInt(a.attr("width"), 10), 0 === b.height || 0 === b.width) {
var c = new Image;
c.src = a.attr("src"), b.width = c.width, b.height = c.height
}
return b
}
var e = 0;
a.fn.mosaicflow = function(d) {
var e = Array.prototype.slice.call(arguments, 0);
return this.each(function() {
var f = a(this), g = f.data("mosaicflow");
g ? "string" == typeof d && g[d](e[1]) : (d = a.extend({}, a.fn.mosaicflow.defaults, d, c(f)), g = new b(f, d), f.data("mosaicflow", g))
})
}, a.fn.mosaicflow.defaults = {itemSelector: "> *", columnClass: "mosaicflow__column", minItemWidth: 240, itemHeightCalculation: "auto"}, b.prototype = {init: function() {
this.__uid = e++, this.__uidItemCounter = 0, this.items = this.container.find(this.options.itemSelector), this.columns = a([]), this.columnsHeights = [], this.itemsHeights = {}, this.tempContainer = a("
").css({visibility: "hidden", width: "100%"}), this.workOnTemp = !1, this.autoCalculation = "auto" === this.options.itemHeightCalculation, this.container.append(this.tempContainer);
var b = this;
this.items.each(function() {
var c = a(this), d = c.attr("id");
d || (d = b.generateUniqueId(), c.attr("id", d))
}), this.container.css("visibility", "hidden"), this.autoCalculation ? a(window).load(a.proxy(this.refill, this)) : this.refill(), a(window).resize(a.proxy(this.refill, this))
}, refill: function() {
this.container.trigger("fill"), this.numberOfColumns = Math.floor(this.container.width() / this.options.minItemWidth), this.numberOfColumns < 1 && (this.numberOfColumns = 1);
var a = this.ensureColumns();
a && (this.fillColumns(), this.columns.filter(":hidden").remove()), this.container.css("visibility", "visible"), this.container.trigger("filled")
}, ensureColumns: function() {
var b = this.columns.length, c = this.numberOfColumns;
if (this.workingContainer = 0 === b ? this.tempContainer : this.container, c > b)
for (var d = c - b, e = 0; d > e; e++) {
var f = a("
", {"class": this.options.columnClass});
this.workingContainer.append(f)
}
else if (b > c) {
for (var g = b; g >= c; )
this.columns.eq(g).hide(), g--;
var h = b - c;
this.columnsHeights.splice(this.columnsHeights.length - h, h)
}
return c !== b ? (this.columns = this.workingContainer.find("." + this.options.columnClass), this.columns.css("width", 100 / c + "%"), !0) : !1
}, fillColumns: function() {
for (var a = this.numberOfColumns, b = this.items.length, c = 0; a > c; c++) {
var d = this.columns.eq(c);
this.columnsHeights[c] = 0;
for (var e = c; b > e; e += a) {
var f = this.items.eq(e), g = 0;
d.append(f), g = this.autoCalculation ? f.outerHeight() : parseInt(f.find("img").attr("height"), 10), this.itemsHeights[f.attr("id")] = g, this.columnsHeights[c] += g
}
}
this.levelBottomEdge(this.itemsHeights, this.columnsHeights), this.workingContainer === this.tempContainer && this.container.append(this.tempContainer.children()), this.container.trigger("mosaicflow-layout")
}, levelBottomEdge: function(b, c) {
for (; ; ) {
var d = a.inArray(Math.min.apply(null, c), c), e = a.inArray(Math.max.apply(null, c), c);
if (d === e)
return;
var f = this.columns.eq(e).children().last(), g = b[f.attr("id")], h = c[d], i = c[e], j = h + g;
if (j >= i)
return;
this.columns.eq(d).append(f), c[e] -= g, c[d] += g
}
}, add: function(b) {
this.container.trigger("add");
var c = a.inArray(Math.min.apply(null, this.columnsHeights), this.columnsHeights), e = 0;
if (this.autoCalculation) {
b.css({position: "static", visibility: "hidden", display: "block"}).appendTo(this.columns.eq(c)), e = b.outerHeight();
var f = b.find("img");
0 !== f.length && f.each(function() {
var b = a(this), c = d(b), f = b.width() * c.height / c.width;
e += f
}), b.detach().css({position: "static", visibility: "visible"})
} else
e = parseInt(b.find("img").attr("height"), 10);
b.attr("id") || b.attr("id", this.generateUniqueId());
var g = this.items.toArray();
g.push(b), this.items = a(g), this.itemsHeights[b.attr("id")] = e, this.columnsHeights[c] += e, this.columns.eq(c).append(b), this.levelBottomEdge(this.itemsHeights, this.columnsHeights), this.container.trigger("mosaicflow-layout"), this.container.trigger("added")
}, remove: function(a) {
this.container.trigger("remove");
var b = a.parents("." + this.options.columnClass);
this.columnsHeights[b.index() - 1] -= this.itemsHeights[a.attr("id")], a.detach(), this.items = this.items.not(a), this.levelBottomEdge(this.itemsHeights, this.columnsHeights), this.container.trigger("mosaicflow-layout"), this.container.trigger("removed")
}, empty: function() {
var b = this.numberOfColumns;
this.items = a([]), this.itemsHeights = {};
for (var c = 0; b > c; c++) {
var d = this.columns.eq(c);
this.columnsHeights[c] = 0, d.empty()
}
this.container.trigger("mosaicflow-layout")
}, recomputeHeights: function() {
function b(b, d) {
d = a(d);
var f = 0;
f = c.autoCalculation ? d.outerHeight() : parseInt(d.find("img").attr("height"), 10), c.itemsHeights[d.attr("id")] = f, c.columnsHeights[e] += f
}
for (var c = this, d = this.numberOfColumns, e = 0; d > e; e++) {
var f = this.columns.eq(e);
this.columnsHeights[e] = 0, f.children().each(b)
}
}, generateUniqueId: function() {
return this.__uidItemCounter++, "mosaic-" + this.__uid + "-itemid-" + this.__uidItemCounter
}}, a(function() {
a(".mosaicflow").mosaicflow()
})
});