/**
 * jQuery Masonry v2.0.110808
 * 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) {
        var b = this.find("img"),
            c = [],
            d = this,
            e = b.length;
        if (!b.length) {
            a.call(this);
            return this
        }
        b.one("load error", function () {
            --e === 0 && (e = b.length, b.one("load error", function () {
                --e === 0 && a.call(d)
            }).each(function () {
                this.src = c.shift()
            }))
        }).each(function () {
            c.push(this.src), this.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="
        });
        return this
    };
    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);

