/** * jQuery Masonry v2.0.110901 * A dynamic layout plugin for jQuery * The flip-side of CSS Floats * http://masonry.desandro.com * * Licensed under the MIT license. * Copyright 2011 David DeSandro */ (function(a, b, c) { var d = b.event, e; d.special.smartresize = { setup: function() { b(this).bind("resize", d.special.smartresize.handler) }, teardown: function() { b(this).unbind("resize", d.special.smartresize.handler) }, handler: function(a, b) { var c = this, d = arguments; a.type = "smartresize", e && clearTimeout(e), e = setTimeout(function() { jQuery.event.handle.apply(c, d) }, b === "execAsap" ? 0 : 100) } }, b.fn.smartresize = function(a) { return a ? this.bind("smartresize", a) : this.trigger("smartresize", ["execAsap"]) }, b.Mason = function(a, c) { this.element = b(c), this._create(a), this._init() }; var f = ["position", "height"]; b.Mason.settings = { isResizable: !0, isAnimated: !1, animationOptions: { queue: !1, duration: 500 }, gutterWidth: 0, isRTL: !1, isFitWidth: !1 }, b.Mason.prototype = { _filterFindBricks: function(a) { var b = this.options.itemSelector; return b ? a.filter(b).add(a.find(b)) : a }, _getBricks: function(a) { var b = this._filterFindBricks(a).css({ position: "absolute" }).addClass("masonry-brick"); return b }, _create: function(c) { this.options = b.extend(!0, {}, b.Mason.settings, c), this.styleQueue = [], this.reloadItems(); var d = this.element[0].style; this.originalStyle = {}; for (var e = 0, g = f.length; e < g; e++) { var h = f[e]; this.originalStyle[h] = d[h] || "" } this.element.css({ position: "relative" }), this.horizontalDirection = this.options.isRTL ? "right" : "left", this.offset = {}; var i = b(document.createElement("div")); this.element.prepend(i), this.offset.y = Math.round(i.position().top), this.options.isRTL ? (i.css({ "float": "right", display: "inline-block" }), this.offset.x = Math.round(this.element.outerWidth() - i.position().left)) : this.offset.x = Math.round(i.position().left), i.remove(); var j = this; setTimeout(function() { j.element.addClass("masonry") }, 0), this.options.isResizable && b(a).bind("smartresize.masonry", function() { j.resize() }) }, _init: function(a) { this._getColumns("masonry"), this._reLayout(a) }, option: function(a, c) { b.isPlainObject(a) && (this.options = b.extend(!0, this.options, a)) }, layout: function(a, c) { var d, e, f, g, h, i; for (var j = 0, k = a.length; j < k; j++) { d = b(a[j]), e = Math.ceil(d.outerWidth(!0) / this.columnWidth), e = Math.min(e, this.cols); if (e === 1) this._placeBrick(d, this.colYs); else { f = this.cols + 1 - e, g = []; for (i = 0; i < f; i++) h = this.colYs.slice(i, i + e), g[i] = Math.max.apply(Math, h); this._placeBrick(d, g) } } var l = {}; l.height = Math.max.apply(Math, this.colYs) - this.offset.y, this.options.isFitWidth && (l.width = this.cols * this.columnWidth - this.options.gutterWidth), this.styleQueue.push({ $el: this.element, style: l }); var m = this.isLaidOut ? this.options.isAnimated ? "animate" : "css" : "css", n = this.options.animationOptions, o; for (j = 0, k = this.styleQueue.length; j < k; j++) o = this.styleQueue[j], o.$el[m](o.style, n); this.styleQueue = [], c && c.call(a), this.isLaidOut = !0 }, _getColumns: function() { var a = this.options.isFitWidth ? this.element.parent() : this.element, b = a.width(); this.columnWidth = this.options.columnWidth || this.$bricks.outerWidth(!0) || b, this.columnWidth += this.options.gutterWidth, this.cols = Math.floor((b + this.options.gutterWidth) / this.columnWidth), this.cols = Math.max(this.cols, 1) }, _placeBrick: function(a, b) { var c = Math.min.apply(Math, b), d = 0; for (var e = 0, f = b.length; e < f; e++) if (b[e] === c) { d = e; break } var g = { top: c }; g[this.horizontalDirection] = this.columnWidth * d + this.offset.x, this.styleQueue.push({ $el: a, style: g }); var h = c + a.outerHeight(!0), i = this.cols + 1 - f; for (e = 0; e < i; e++) this.colYs[d + e] = h }, resize: function() { var a = this.cols; this._getColumns("masonry"), this.cols !== a && this._reLayout() }, _reLayout: function(a) { var b = this.cols; this.colYs = []; while (b--) this.colYs.push(this.offset.y); this.layout(this.$bricks, a) }, reloadItems: function() { this.$bricks = this._getBricks(this.element.children()) }, reload: function(a) { this.reloadItems(), this._init(a) }, appended: function(a, b, c) { if (b) { this._filterFindBricks(a).css({ top: this.element.height() }); var d = this; setTimeout(function() { d._appended(a, c) }, 1) } else this._appended(a, c) }, _appended: function(a, b) { var c = this._getBricks(a); this.$bricks = this.$bricks.add(c), this.layout(c, b) }, remove: function(a) { this.$bricks = this.$bricks.not(a), a.remove() }, destroy: function() { this.$bricks.removeClass("masonry-brick").each(function() { this.style.position = "", this.style.top = "", this.style.left = "" }); var c = this.element[0].style; for (var d = 0, e = f.length; d < e; d++) { var g = f[d]; c[g] = this.originalStyle[g] } this.element.unbind(".masonry").removeClass("masonry").removeData("masonry"), b(a).unbind(".masonry") } }, b.fn.imagesLoaded = function(a) { function h() { --e <= 0 && this.src !== f && (setTimeout(g), d.unbind("load error", h)) } function g() { a.call(b, d) } var b = this, d = b.find("img").add(b.filter("img")), e = d.length, f = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; e || g(), d.bind("load error", h).each(function() { if (this.complete || this.complete === c) { var a = this.src; this.src = f, this.src = a } }); return b }; var g = function(a) { this.console && console.error(a) }; b.fn.masonry = function(a) { if (typeof a == "string") { var c = Array.prototype.slice.call(arguments, 1); this.each(function() { var d = b.data(this, "masonry"); if (!d) g("cannot call methods on masonry prior to initialization; attempted to call method '" + a + "'"); else { if (!b.isFunction(d[a]) || a.charAt(0) === "_") { g("no such method '" + a + "' for masonry instance"); return } d[a].apply(d, c) } }) } else this.each(function() { var c = b.data(this, "masonry"); c ? (c.option(a || {}), c._init()) : b.data(this, "masonry", new b.Mason(a, this)) }); return this } })(window, jQuery);