WordPress.org

Make WordPress Core

Ticket #32802: masonry-clean.patch

File masonry-clean.patch, 185.6 KB (added by Ninos Ego, 6 years ago)
  • wp-includes/js/imagesloaded.js

     
     1/*!
     2 * imagesLoaded PACKAGED v3.1.8
     3 * JavaScript is all like "You images are done yet or what?"
     4 * MIT License
     5 */
     6
     7
     8/*!
     9 * EventEmitter v4.2.6 - git.io/ee
     10 * Oliver Caldwell
     11 * MIT license
     12 * @preserve
     13 */
     14
     15(function () {
     16       
     17
     18        /**
     19         * Class for managing events.
     20         * Can be extended to provide event functionality in other classes.
     21         *
     22         * @class EventEmitter Manages event registering and emitting.
     23         */
     24        function EventEmitter() {}
     25
     26        // Shortcuts to improve speed and size
     27        var proto = EventEmitter.prototype;
     28        var exports = this;
     29        var originalGlobalValue = exports.EventEmitter;
     30
     31        /**
     32         * Finds the index of the listener for the event in it's storage array.
     33         *
     34         * @param {Function[]} listeners Array of listeners to search through.
     35         * @param {Function} listener Method to look for.
     36         * @return {Number} Index of the specified listener, -1 if not found
     37         * @api private
     38         */
     39        function indexOfListener(listeners, listener) {
     40                var i = listeners.length;
     41                while (i--) {
     42                        if (listeners[i].listener === listener) {
     43                                return i;
     44                        }
     45                }
     46
     47                return -1;
     48        }
     49
     50        /**
     51         * Alias a method while keeping the context correct, to allow for overwriting of target method.
     52         *
     53         * @param {String} name The name of the target method.
     54         * @return {Function} The aliased method
     55         * @api private
     56         */
     57        function alias(name) {
     58                return function aliasClosure() {
     59                        return this[name].apply(this, arguments);
     60                };
     61        }
     62
     63        /**
     64         * Returns the listener array for the specified event.
     65         * Will initialise the event object and listener arrays if required.
     66         * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.
     67         * Each property in the object response is an array of listener functions.
     68         *
     69         * @param {String|RegExp} evt Name of the event to return the listeners from.
     70         * @return {Function[]|Object} All listener functions for the event.
     71         */
     72        proto.getListeners = function getListeners(evt) {
     73                var events = this._getEvents();
     74                var response;
     75                var key;
     76
     77                // Return a concatenated array of all matching events if
     78                // the selector is a regular expression.
     79                if (typeof evt === 'object') {
     80                        response = {};
     81                        for (key in events) {
     82                                if (events.hasOwnProperty(key) && evt.test(key)) {
     83                                        response[key] = events[key];
     84                                }
     85                        }
     86                }
     87                else {
     88                        response = events[evt] || (events[evt] = []);
     89                }
     90
     91                return response;
     92        };
     93
     94        /**
     95         * Takes a list of listener objects and flattens it into a list of listener functions.
     96         *
     97         * @param {Object[]} listeners Raw listener objects.
     98         * @return {Function[]} Just the listener functions.
     99         */
     100        proto.flattenListeners = function flattenListeners(listeners) {
     101                var flatListeners = [];
     102                var i;
     103
     104                for (i = 0; i < listeners.length; i += 1) {
     105                        flatListeners.push(listeners[i].listener);
     106                }
     107
     108                return flatListeners;
     109        };
     110
     111        /**
     112         * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.
     113         *
     114         * @param {String|RegExp} evt Name of the event to return the listeners from.
     115         * @return {Object} All listener functions for an event in an object.
     116         */
     117        proto.getListenersAsObject = function getListenersAsObject(evt) {
     118                var listeners = this.getListeners(evt);
     119                var response;
     120
     121                if (listeners instanceof Array) {
     122                        response = {};
     123                        response[evt] = listeners;
     124                }
     125
     126                return response || listeners;
     127        };
     128
     129        /**
     130         * Adds a listener function to the specified event.
     131         * The listener will not be added if it is a duplicate.
     132         * If the listener returns true then it will be removed after it is called.
     133         * If you pass a regular expression as the event name then the listener will be added to all events that match it.
     134         *
     135         * @param {String|RegExp} evt Name of the event to attach the listener to.
     136         * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.
     137         * @return {Object} Current instance of EventEmitter for chaining.
     138         */
     139        proto.addListener = function addListener(evt, listener) {
     140                var listeners = this.getListenersAsObject(evt);
     141                var listenerIsWrapped = typeof listener === 'object';
     142                var key;
     143
     144                for (key in listeners) {
     145                        if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {
     146                                listeners[key].push(listenerIsWrapped ? listener : {
     147                                        listener: listener,
     148                                        once: false
     149                                });
     150                        }
     151                }
     152
     153                return this;
     154        };
     155
     156        /**
     157         * Alias of addListener
     158         */
     159        proto.on = alias('addListener');
     160
     161        /**
     162         * Semi-alias of addListener. It will add a listener that will be
     163         * automatically removed after it's first execution.
     164         *
     165         * @param {String|RegExp} evt Name of the event to attach the listener to.
     166         * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.
     167         * @return {Object} Current instance of EventEmitter for chaining.
     168         */
     169        proto.addOnceListener = function addOnceListener(evt, listener) {
     170                return this.addListener(evt, {
     171                        listener: listener,
     172                        once: true
     173                });
     174        };
     175
     176        /**
     177         * Alias of addOnceListener.
     178         */
     179        proto.once = alias('addOnceListener');
     180
     181        /**
     182         * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.
     183         * You need to tell it what event names should be matched by a regex.
     184         *
     185         * @param {String} evt Name of the event to create.
     186         * @return {Object} Current instance of EventEmitter for chaining.
     187         */
     188        proto.defineEvent = function defineEvent(evt) {
     189                this.getListeners(evt);
     190                return this;
     191        };
     192
     193        /**
     194         * Uses defineEvent to define multiple events.
     195         *
     196         * @param {String[]} evts An array of event names to define.
     197         * @return {Object} Current instance of EventEmitter for chaining.
     198         */
     199        proto.defineEvents = function defineEvents(evts) {
     200                for (var i = 0; i < evts.length; i += 1) {
     201                        this.defineEvent(evts[i]);
     202                }
     203                return this;
     204        };
     205
     206        /**
     207         * Removes a listener function from the specified event.
     208         * When passed a regular expression as the event name, it will remove the listener from all events that match it.
     209         *
     210         * @param {String|RegExp} evt Name of the event to remove the listener from.
     211         * @param {Function} listener Method to remove from the event.
     212         * @return {Object} Current instance of EventEmitter for chaining.
     213         */
     214        proto.removeListener = function removeListener(evt, listener) {
     215                var listeners = this.getListenersAsObject(evt);
     216                var index;
     217                var key;
     218
     219                for (key in listeners) {
     220                        if (listeners.hasOwnProperty(key)) {
     221                                index = indexOfListener(listeners[key], listener);
     222
     223                                if (index !== -1) {
     224                                        listeners[key].splice(index, 1);
     225                                }
     226                        }
     227                }
     228
     229                return this;
     230        };
     231
     232        /**
     233         * Alias of removeListener
     234         */
     235        proto.off = alias('removeListener');
     236
     237        /**
     238         * Adds listeners in bulk using the manipulateListeners method.
     239         * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.
     240         * You can also pass it a regular expression to add the array of listeners to all events that match it.
     241         * Yeah, this function does quite a bit. That's probably a bad thing.
     242         *
     243         * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.
     244         * @param {Function[]} [listeners] An optional array of listener functions to add.
     245         * @return {Object} Current instance of EventEmitter for chaining.
     246         */
     247        proto.addListeners = function addListeners(evt, listeners) {
     248                // Pass through to manipulateListeners
     249                return this.manipulateListeners(false, evt, listeners);
     250        };
     251
     252        /**
     253         * Removes listeners in bulk using the manipulateListeners method.
     254         * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.
     255         * You can also pass it an event name and an array of listeners to be removed.
     256         * You can also pass it a regular expression to remove the listeners from all events that match it.
     257         *
     258         * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.
     259         * @param {Function[]} [listeners] An optional array of listener functions to remove.
     260         * @return {Object} Current instance of EventEmitter for chaining.
     261         */
     262        proto.removeListeners = function removeListeners(evt, listeners) {
     263                // Pass through to manipulateListeners
     264                return this.manipulateListeners(true, evt, listeners);
     265        };
     266
     267        /**
     268         * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.
     269         * The first argument will determine if the listeners are removed (true) or added (false).
     270         * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.
     271         * You can also pass it an event name and an array of listeners to be added/removed.
     272         * You can also pass it a regular expression to manipulate the listeners of all events that match it.
     273         *
     274         * @param {Boolean} remove True if you want to remove listeners, false if you want to add.
     275         * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.
     276         * @param {Function[]} [listeners] An optional array of listener functions to add/remove.
     277         * @return {Object} Current instance of EventEmitter for chaining.
     278         */
     279        proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {
     280                var i;
     281                var value;
     282                var single = remove ? this.removeListener : this.addListener;
     283                var multiple = remove ? this.removeListeners : this.addListeners;
     284
     285                // If evt is an object then pass each of it's properties to this method
     286                if (typeof evt === 'object' && !(evt instanceof RegExp)) {
     287                        for (i in evt) {
     288                                if (evt.hasOwnProperty(i) && (value = evt[i])) {
     289                                        // Pass the single listener straight through to the singular method
     290                                        if (typeof value === 'function') {
     291                                                single.call(this, i, value);
     292                                        }
     293                                        else {
     294                                                // Otherwise pass back to the multiple function
     295                                                multiple.call(this, i, value);
     296                                        }
     297                                }
     298                        }
     299                }
     300                else {
     301                        // So evt must be a string
     302                        // And listeners must be an array of listeners
     303                        // Loop over it and pass each one to the multiple method
     304                        i = listeners.length;
     305                        while (i--) {
     306                                single.call(this, evt, listeners[i]);
     307                        }
     308                }
     309
     310                return this;
     311        };
     312
     313        /**
     314         * Removes all listeners from a specified event.
     315         * If you do not specify an event then all listeners will be removed.
     316         * That means every event will be emptied.
     317         * You can also pass a regex to remove all events that match it.
     318         *
     319         * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.
     320         * @return {Object} Current instance of EventEmitter for chaining.
     321         */
     322        proto.removeEvent = function removeEvent(evt) {
     323                var type = typeof evt;
     324                var events = this._getEvents();
     325                var key;
     326
     327                // Remove different things depending on the state of evt
     328                if (type === 'string') {
     329                        // Remove all listeners for the specified event
     330                        delete events[evt];
     331                }
     332                else if (type === 'object') {
     333                        // Remove all events matching the regex.
     334                        for (key in events) {
     335                                if (events.hasOwnProperty(key) && evt.test(key)) {
     336                                        delete events[key];
     337                                }
     338                        }
     339                }
     340                else {
     341                        // Remove all listeners in all events
     342                        delete this._events;
     343                }
     344
     345                return this;
     346        };
     347
     348        /**
     349         * Alias of removeEvent.
     350         *
     351         * Added to mirror the node API.
     352         */
     353        proto.removeAllListeners = alias('removeEvent');
     354
     355        /**
     356         * Emits an event of your choice.
     357         * When emitted, every listener attached to that event will be executed.
     358         * If you pass the optional argument array then those arguments will be passed to every listener upon execution.
     359         * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.
     360         * So they will not arrive within the array on the other side, they will be separate.
     361         * You can also pass a regular expression to emit to all events that match it.
     362         *
     363         * @param {String|RegExp} evt Name of the event to emit and execute listeners for.
     364         * @param {Array} [args] Optional array of arguments to be passed to each listener.
     365         * @return {Object} Current instance of EventEmitter for chaining.
     366         */
     367        proto.emitEvent = function emitEvent(evt, args) {
     368                var listeners = this.getListenersAsObject(evt);
     369                var listener;
     370                var i;
     371                var key;
     372                var response;
     373
     374                for (key in listeners) {
     375                        if (listeners.hasOwnProperty(key)) {
     376                                i = listeners[key].length;
     377
     378                                while (i--) {
     379                                        // If the listener returns true then it shall be removed from the event
     380                                        // The function is executed either with a basic call or an apply if there is an args array
     381                                        listener = listeners[key][i];
     382
     383                                        if (listener.once === true) {
     384                                                this.removeListener(evt, listener.listener);
     385                                        }
     386
     387                                        response = listener.listener.apply(this, args || []);
     388
     389                                        if (response === this._getOnceReturnValue()) {
     390                                                this.removeListener(evt, listener.listener);
     391                                        }
     392                                }
     393                        }
     394                }
     395
     396                return this;
     397        };
     398
     399        /**
     400         * Alias of emitEvent
     401         */
     402        proto.trigger = alias('emitEvent');
     403
     404        /**
     405         * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.
     406         * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.
     407         *
     408         * @param {String|RegExp} evt Name of the event to emit and execute listeners for.
     409         * @param {...*} Optional additional arguments to be passed to each listener.
     410         * @return {Object} Current instance of EventEmitter for chaining.
     411         */
     412        proto.emit = function emit(evt) {
     413                var args = Array.prototype.slice.call(arguments, 1);
     414                return this.emitEvent(evt, args);
     415        };
     416
     417        /**
     418         * Sets the current value to check against when executing listeners. If a
     419         * listeners return value matches the one set here then it will be removed
     420         * after execution. This value defaults to true.
     421         *
     422         * @param {*} value The new value to check for when executing listeners.
     423         * @return {Object} Current instance of EventEmitter for chaining.
     424         */
     425        proto.setOnceReturnValue = function setOnceReturnValue(value) {
     426                this._onceReturnValue = value;
     427                return this;
     428        };
     429
     430        /**
     431         * Fetches the current value to check against when executing listeners. If
     432         * the listeners return value matches this one then it should be removed
     433         * automatically. It will return true by default.
     434         *
     435         * @return {*|Boolean} The current value to check for or the default, true.
     436         * @api private
     437         */
     438        proto._getOnceReturnValue = function _getOnceReturnValue() {
     439                if (this.hasOwnProperty('_onceReturnValue')) {
     440                        return this._onceReturnValue;
     441                }
     442                else {
     443                        return true;
     444                }
     445        };
     446
     447        /**
     448         * Fetches the events object and creates one if required.
     449         *
     450         * @return {Object} The events storage object.
     451         * @api private
     452         */
     453        proto._getEvents = function _getEvents() {
     454                return this._events || (this._events = {});
     455        };
     456
     457        /**
     458         * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.
     459         *
     460         * @return {Function} Non conflicting EventEmitter class.
     461         */
     462        EventEmitter.noConflict = function noConflict() {
     463                exports.EventEmitter = originalGlobalValue;
     464                return EventEmitter;
     465        };
     466
     467        // Expose the class either via AMD, CommonJS or the global object
     468        if (typeof define === 'function' && define.amd) {
     469                define('eventEmitter/EventEmitter',[],function () {
     470                        return EventEmitter;
     471                });
     472        }
     473        else if (typeof module === 'object' && module.exports){
     474                module.exports = EventEmitter;
     475        }
     476        else {
     477                this.EventEmitter = EventEmitter;
     478        }
     479}.call(this));
     480
     481/*!
     482 * eventie v1.0.4
     483 * event binding helper
     484 *   eventie.bind( elem, 'click', myFn )
     485 *   eventie.unbind( elem, 'click', myFn )
     486 */
     487
     488/*jshint browser: true, undef: true, unused: true */
     489/*global define: false */
     490
     491( function( window ) {
     492
     493
     494
     495var docElem = document.documentElement;
     496
     497var bind = function() {};
     498
     499function getIEEvent( obj ) {
     500  var event = window.event;
     501  // add event.target
     502  event.target = event.target || event.srcElement || obj;
     503  return event;
     504}
     505
     506if ( docElem.addEventListener ) {
     507  bind = function( obj, type, fn ) {
     508    obj.addEventListener( type, fn, false );
     509  };
     510} else if ( docElem.attachEvent ) {
     511  bind = function( obj, type, fn ) {
     512    obj[ type + fn ] = fn.handleEvent ?
     513      function() {
     514        var event = getIEEvent( obj );
     515        fn.handleEvent.call( fn, event );
     516      } :
     517      function() {
     518        var event = getIEEvent( obj );
     519        fn.call( obj, event );
     520      };
     521    obj.attachEvent( "on" + type, obj[ type + fn ] );
     522  };
     523}
     524
     525var unbind = function() {};
     526
     527if ( docElem.removeEventListener ) {
     528  unbind = function( obj, type, fn ) {
     529    obj.removeEventListener( type, fn, false );
     530  };
     531} else if ( docElem.detachEvent ) {
     532  unbind = function( obj, type, fn ) {
     533    obj.detachEvent( "on" + type, obj[ type + fn ] );
     534    try {
     535      delete obj[ type + fn ];
     536    } catch ( err ) {
     537      // can't delete window object properties
     538      obj[ type + fn ] = undefined;
     539    }
     540  };
     541}
     542
     543var eventie = {
     544  bind: bind,
     545  unbind: unbind
     546};
     547
     548// transport
     549if ( typeof define === 'function' && define.amd ) {
     550  // AMD
     551  define( 'eventie/eventie',eventie );
     552} else {
     553  // browser global
     554  window.eventie = eventie;
     555}
     556
     557})( this );
     558
     559/*!
     560 * imagesLoaded v3.1.8
     561 * JavaScript is all like "You images are done yet or what?"
     562 * MIT License
     563 */
     564
     565( function( window, factory ) {
     566  // universal module definition
     567
     568  /*global define: false, module: false, require: false */
     569
     570  if ( typeof define === 'function' && define.amd ) {
     571    // AMD
     572    define( [
     573      'eventEmitter/EventEmitter',
     574      'eventie/eventie'
     575    ], function( EventEmitter, eventie ) {
     576      return factory( window, EventEmitter, eventie );
     577    });
     578  } else if ( typeof exports === 'object' ) {
     579    // CommonJS
     580    module.exports = factory(
     581      window,
     582      require('wolfy87-eventemitter'),
     583      require('eventie')
     584    );
     585  } else {
     586    // browser global
     587    window.imagesLoaded = factory(
     588      window,
     589      window.EventEmitter,
     590      window.eventie
     591    );
     592  }
     593
     594})( window,
     595
     596// --------------------------  factory -------------------------- //
     597
     598function factory( window, EventEmitter, eventie ) {
     599
     600
     601
     602var $ = window.jQuery;
     603var console = window.console;
     604var hasConsole = typeof console !== 'undefined';
     605
     606// -------------------------- helpers -------------------------- //
     607
     608// extend objects
     609function extend( a, b ) {
     610  for ( var prop in b ) {
     611    a[ prop ] = b[ prop ];
     612  }
     613  return a;
     614}
     615
     616var objToString = Object.prototype.toString;
     617function isArray( obj ) {
     618  return objToString.call( obj ) === '[object Array]';
     619}
     620
     621// turn element or nodeList into an array
     622function makeArray( obj ) {
     623  var ary = [];
     624  if ( isArray( obj ) ) {
     625    // use object if already an array
     626    ary = obj;
     627  } else if ( typeof obj.length === 'number' ) {
     628    // convert nodeList to array
     629    for ( var i=0, len = obj.length; i < len; i++ ) {
     630      ary.push( obj[i] );
     631    }
     632  } else {
     633    // array of single index
     634    ary.push( obj );
     635  }
     636  return ary;
     637}
     638
     639  // -------------------------- imagesLoaded -------------------------- //
     640
     641  /**
     642   * @param {Array, Element, NodeList, String} elem
     643   * @param {Object or Function} options - if function, use as callback
     644   * @param {Function} onAlways - callback function
     645   */
     646  function ImagesLoaded( elem, options, onAlways ) {
     647    // coerce ImagesLoaded() without new, to be new ImagesLoaded()
     648    if ( !( this instanceof ImagesLoaded ) ) {
     649      return new ImagesLoaded( elem, options );
     650    }
     651    // use elem as selector string
     652    if ( typeof elem === 'string' ) {
     653      elem = document.querySelectorAll( elem );
     654    }
     655
     656    this.elements = makeArray( elem );
     657    this.options = extend( {}, this.options );
     658
     659    if ( typeof options === 'function' ) {
     660      onAlways = options;
     661    } else {
     662      extend( this.options, options );
     663    }
     664
     665    if ( onAlways ) {
     666      this.on( 'always', onAlways );
     667    }
     668
     669    this.getImages();
     670
     671    if ( $ ) {
     672      // add jQuery Deferred object
     673      this.jqDeferred = new $.Deferred();
     674    }
     675
     676    // HACK check async to allow time to bind listeners
     677    var _this = this;
     678    setTimeout( function() {
     679      _this.check();
     680    });
     681  }
     682
     683  ImagesLoaded.prototype = new EventEmitter();
     684
     685  ImagesLoaded.prototype.options = {};
     686
     687  ImagesLoaded.prototype.getImages = function() {
     688    this.images = [];
     689
     690    // filter & find items if we have an item selector
     691    for ( var i=0, len = this.elements.length; i < len; i++ ) {
     692      var elem = this.elements[i];
     693      // filter siblings
     694      if ( elem.nodeName === 'IMG' ) {
     695        this.addImage( elem );
     696      }
     697      // find children
     698      // no non-element nodes, #143
     699      var nodeType = elem.nodeType;
     700      if ( !nodeType || !( nodeType === 1 || nodeType === 9 || nodeType === 11 ) ) {
     701        continue;
     702      }
     703      var childElems = elem.querySelectorAll('img');
     704      // concat childElems to filterFound array
     705      for ( var j=0, jLen = childElems.length; j < jLen; j++ ) {
     706        var img = childElems[j];
     707        this.addImage( img );
     708      }
     709    }
     710  };
     711
     712  /**
     713   * @param {Image} img
     714   */
     715  ImagesLoaded.prototype.addImage = function( img ) {
     716    var loadingImage = new LoadingImage( img );
     717    this.images.push( loadingImage );
     718  };
     719
     720  ImagesLoaded.prototype.check = function() {
     721    var _this = this;
     722    var checkedCount = 0;
     723    var length = this.images.length;
     724    this.hasAnyBroken = false;
     725    // complete if no images
     726    if ( !length ) {
     727      this.complete();
     728      return;
     729    }
     730
     731    function onConfirm( image, message ) {
     732      if ( _this.options.debug && hasConsole ) {
     733        console.log( 'confirm', image, message );
     734      }
     735
     736      _this.progress( image );
     737      checkedCount++;
     738      if ( checkedCount === length ) {
     739        _this.complete();
     740      }
     741      return true; // bind once
     742    }
     743
     744    for ( var i=0; i < length; i++ ) {
     745      var loadingImage = this.images[i];
     746      loadingImage.on( 'confirm', onConfirm );
     747      loadingImage.check();
     748    }
     749  };
     750
     751  ImagesLoaded.prototype.progress = function( image ) {
     752    this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
     753    // HACK - Chrome triggers event before object properties have changed. #83
     754    var _this = this;
     755    setTimeout( function() {
     756      _this.emit( 'progress', _this, image );
     757      if ( _this.jqDeferred && _this.jqDeferred.notify ) {
     758        _this.jqDeferred.notify( _this, image );
     759      }
     760    });
     761  };
     762
     763  ImagesLoaded.prototype.complete = function() {
     764    var eventName = this.hasAnyBroken ? 'fail' : 'done';
     765    this.isComplete = true;
     766    var _this = this;
     767    // HACK - another setTimeout so that confirm happens after progress
     768    setTimeout( function() {
     769      _this.emit( eventName, _this );
     770      _this.emit( 'always', _this );
     771      if ( _this.jqDeferred ) {
     772        var jqMethod = _this.hasAnyBroken ? 'reject' : 'resolve';
     773        _this.jqDeferred[ jqMethod ]( _this );
     774      }
     775    });
     776  };
     777
     778  // -------------------------- jquery -------------------------- //
     779
     780  if ( $ ) {
     781    $.fn.imagesLoaded = function( options, callback ) {
     782      var instance = new ImagesLoaded( this, options, callback );
     783      return instance.jqDeferred.promise( $(this) );
     784    };
     785  }
     786
     787
     788  // --------------------------  -------------------------- //
     789
     790  function LoadingImage( img ) {
     791    this.img = img;
     792  }
     793
     794  LoadingImage.prototype = new EventEmitter();
     795
     796  LoadingImage.prototype.check = function() {
     797    // first check cached any previous images that have same src
     798    var resource = cache[ this.img.src ] || new Resource( this.img.src );
     799    if ( resource.isConfirmed ) {
     800      this.confirm( resource.isLoaded, 'cached was confirmed' );
     801      return;
     802    }
     803
     804    // If complete is true and browser supports natural sizes,
     805    // try to check for image status manually.
     806    if ( this.img.complete && this.img.naturalWidth !== undefined ) {
     807      // report based on naturalWidth
     808      this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
     809      return;
     810    }
     811
     812    // If none of the checks above matched, simulate loading on detached element.
     813    var _this = this;
     814    resource.on( 'confirm', function( resrc, message ) {
     815      _this.confirm( resrc.isLoaded, message );
     816      return true;
     817    });
     818
     819    resource.check();
     820  };
     821
     822  LoadingImage.prototype.confirm = function( isLoaded, message ) {
     823    this.isLoaded = isLoaded;
     824    this.emit( 'confirm', this, message );
     825  };
     826
     827  // -------------------------- Resource -------------------------- //
     828
     829  // Resource checks each src, only once
     830  // separate class from LoadingImage to prevent memory leaks. See #115
     831
     832  var cache = {};
     833
     834  function Resource( src ) {
     835    this.src = src;
     836    // add to cache
     837    cache[ src ] = this;
     838  }
     839
     840  Resource.prototype = new EventEmitter();
     841
     842  Resource.prototype.check = function() {
     843    // only trigger checking once
     844    if ( this.isChecked ) {
     845      return;
     846    }
     847    // simulate loading on detached element
     848    var proxyImage = new Image();
     849    eventie.bind( proxyImage, 'load', this );
     850    eventie.bind( proxyImage, 'error', this );
     851    proxyImage.src = this.src;
     852    // set flag
     853    this.isChecked = true;
     854  };
     855
     856  // ----- events ----- //
     857
     858  // trigger specified handler for event type
     859  Resource.prototype.handleEvent = function( event ) {
     860    var method = 'on' + event.type;
     861    if ( this[ method ] ) {
     862      this[ method ]( event );
     863    }
     864  };
     865
     866  Resource.prototype.onload = function( event ) {
     867    this.confirm( true, 'onload' );
     868    this.unbindProxyEvents( event );
     869  };
     870
     871  Resource.prototype.onerror = function( event ) {
     872    this.confirm( false, 'onerror' );
     873    this.unbindProxyEvents( event );
     874  };
     875
     876  // ----- confirm ----- //
     877
     878  Resource.prototype.confirm = function( isLoaded, message ) {
     879    this.isConfirmed = true;
     880    this.isLoaded = isLoaded;
     881    this.emit( 'confirm', this, message );
     882  };
     883
     884  Resource.prototype.unbindProxyEvents = function( event ) {
     885    eventie.unbind( event.target, 'load', this );
     886    eventie.unbind( event.target, 'error', this );
     887  };
     888
     889  // -----  ----- //
     890
     891  return ImagesLoaded;
     892
     893});
  • wp-includes/js/imagesloaded.min.js

     
     1/*!
     2 * imagesLoaded PACKAGED v3.1.8
     3 * JavaScript is all like "You images are done yet or what?"
     4 * MIT License
     5 */
     6
     7(function(){function e(){}function t(e,t){for(var n=e.length;n--;)if(e[n].listener===t)return n;return-1}function n(e){return function(){return this[e].apply(this,arguments)}}var i=e.prototype,r=this,o=r.EventEmitter;i.getListeners=function(e){var t,n,i=this._getEvents();if("object"==typeof e){t={};for(n in i)i.hasOwnProperty(n)&&e.test(n)&&(t[n]=i[n])}else t=i[e]||(i[e]=[]);return t},i.flattenListeners=function(e){var t,n=[];for(t=0;e.length>t;t+=1)n.push(e[t].listener);return n},i.getListenersAsObject=function(e){var t,n=this.getListeners(e);return n instanceof Array&&(t={},t[e]=n),t||n},i.addListener=function(e,n){var i,r=this.getListenersAsObject(e),o="object"==typeof n;for(i in r)r.hasOwnProperty(i)&&-1===t(r[i],n)&&r[i].push(o?n:{listener:n,once:!1});return this},i.on=n("addListener"),i.addOnceListener=function(e,t){return this.addListener(e,{listener:t,once:!0})},i.once=n("addOnceListener"),i.defineEvent=function(e){return this.getListeners(e),this},i.defineEvents=function(e){for(var t=0;e.length>t;t+=1)this.defineEvent(e[t]);return this},i.removeListener=function(e,n){var i,r,o=this.getListenersAsObject(e);for(r in o)o.hasOwnProperty(r)&&(i=t(o[r],n),-1!==i&&o[r].splice(i,1));return this},i.off=n("removeListener"),i.addListeners=function(e,t){return this.manipulateListeners(!1,e,t)},i.removeListeners=function(e,t){return this.manipulateListeners(!0,e,t)},i.manipulateListeners=function(e,t,n){var i,r,o=e?this.removeListener:this.addListener,s=e?this.removeListeners:this.addListeners;if("object"!=typeof t||t instanceof RegExp)for(i=n.length;i--;)o.call(this,t,n[i]);else for(i in t)t.hasOwnProperty(i)&&(r=t[i])&&("function"==typeof r?o.call(this,i,r):s.call(this,i,r));return this},i.removeEvent=function(e){var t,n=typeof e,i=this._getEvents();if("string"===n)delete i[e];else if("object"===n)for(t in i)i.hasOwnProperty(t)&&e.test(t)&&delete i[t];else delete this._events;return this},i.removeAllListeners=n("removeEvent"),i.emitEvent=function(e,t){var n,i,r,o,s=this.getListenersAsObject(e);for(r in s)if(s.hasOwnProperty(r))for(i=s[r].length;i--;)n=s[r][i],n.once===!0&&this.removeListener(e,n.listener),o=n.listener.apply(this,t||[]),o===this._getOnceReturnValue()&&this.removeListener(e,n.listener);return this},i.trigger=n("emitEvent"),i.emit=function(e){var t=Array.prototype.slice.call(arguments,1);return this.emitEvent(e,t)},i.setOnceReturnValue=function(e){return this._onceReturnValue=e,this},i._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},i._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return r.EventEmitter=o,e},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return e}):"object"==typeof module&&module.exports?module.exports=e:this.EventEmitter=e}).call(this),function(e){function t(t){var n=e.event;return n.target=n.target||n.srcElement||t,n}var n=document.documentElement,i=function(){};n.addEventListener?i=function(e,t,n){e.addEventListener(t,n,!1)}:n.attachEvent&&(i=function(e,n,i){e[n+i]=i.handleEvent?function(){var n=t(e);i.handleEvent.call(i,n)}:function(){var n=t(e);i.call(e,n)},e.attachEvent("on"+n,e[n+i])});var r=function(){};n.removeEventListener?r=function(e,t,n){e.removeEventListener(t,n,!1)}:n.detachEvent&&(r=function(e,t,n){e.detachEvent("on"+t,e[t+n]);try{delete e[t+n]}catch(i){e[t+n]=void 0}});var o={bind:i,unbind:r};"function"==typeof define&&define.amd?define("eventie/eventie",o):e.eventie=o}(this),function(e,t){"function"==typeof define&&define.amd?define(["eventEmitter/EventEmitter","eventie/eventie"],function(n,i){return t(e,n,i)}):"object"==typeof exports?module.exports=t(e,require("wolfy87-eventemitter"),require("eventie")):e.imagesLoaded=t(e,e.EventEmitter,e.eventie)}(window,function(e,t,n){function i(e,t){for(var n in t)e[n]=t[n];return e}function r(e){return"[object Array]"===d.call(e)}function o(e){var t=[];if(r(e))t=e;else if("number"==typeof e.length)for(var n=0,i=e.length;i>n;n++)t.push(e[n]);else t.push(e);return t}function s(e,t,n){if(!(this instanceof s))return new s(e,t);"string"==typeof e&&(e=document.querySelectorAll(e)),this.elements=o(e),this.options=i({},this.options),"function"==typeof t?n=t:i(this.options,t),n&&this.on("always",n),this.getImages(),a&&(this.jqDeferred=new a.Deferred);var r=this;setTimeout(function(){r.check()})}function f(e){this.img=e}function c(e){this.src=e,v[e]=this}var a=e.jQuery,u=e.console,h=u!==void 0,d=Object.prototype.toString;s.prototype=new t,s.prototype.options={},s.prototype.getImages=function(){this.images=[];for(var e=0,t=this.elements.length;t>e;e++){var n=this.elements[e];"IMG"===n.nodeName&&this.addImage(n);var i=n.nodeType;if(i&&(1===i||9===i||11===i))for(var r=n.querySelectorAll("img"),o=0,s=r.length;s>o;o++){var f=r[o];this.addImage(f)}}},s.prototype.addImage=function(e){var t=new f(e);this.images.push(t)},s.prototype.check=function(){function e(e,r){return t.options.debug&&h&&u.log("confirm",e,r),t.progress(e),n++,n===i&&t.complete(),!0}var t=this,n=0,i=this.images.length;if(this.hasAnyBroken=!1,!i)return this.complete(),void 0;for(var r=0;i>r;r++){var o=this.images[r];o.on("confirm",e),o.check()}},s.prototype.progress=function(e){this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded;var t=this;setTimeout(function(){t.emit("progress",t,e),t.jqDeferred&&t.jqDeferred.notify&&t.jqDeferred.notify(t,e)})},s.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";this.isComplete=!0;var t=this;setTimeout(function(){if(t.emit(e,t),t.emit("always",t),t.jqDeferred){var n=t.hasAnyBroken?"reject":"resolve";t.jqDeferred[n](t)}})},a&&(a.fn.imagesLoaded=function(e,t){var n=new s(this,e,t);return n.jqDeferred.promise(a(this))}),f.prototype=new t,f.prototype.check=function(){var e=v[this.img.src]||new c(this.img.src);if(e.isConfirmed)return this.confirm(e.isLoaded,"cached was confirmed"),void 0;if(this.img.complete&&void 0!==this.img.naturalWidth)return this.confirm(0!==this.img.naturalWidth,"naturalWidth"),void 0;var t=this;e.on("confirm",function(e,n){return t.confirm(e.isLoaded,n),!0}),e.check()},f.prototype.confirm=function(e,t){this.isLoaded=e,this.emit("confirm",this,t)};var v={};return c.prototype=new t,c.prototype.check=function(){if(!this.isChecked){var e=new Image;n.bind(e,"load",this),n.bind(e,"error",this),e.src=this.src,this.isChecked=!0}},c.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},c.prototype.onload=function(e){this.confirm(!0,"onload"),this.unbindProxyEvents(e)},c.prototype.onerror=function(e){this.confirm(!1,"onerror"),this.unbindProxyEvents(e)},c.prototype.confirm=function(e,t){this.isConfirmed=!0,this.isLoaded=e,this.emit("confirm",this,t)},c.prototype.unbindProxyEvents=function(e){n.unbind(e.target,"load",this),n.unbind(e.target,"error",this)},s});
     8 No newline at end of file
  • wp-includes/js/jquery/jquery.masonry.min.js

     
    1 -/*!
    2 - * Masonry v2 shim
    3 - * to maintain backwards compatibility
    4 - * as of Masonry v3.1.2
    5 - *
    6 - * Cascading grid layout library
    7 - * http://masonry.desandro.com
    8 - * MIT License
    9 - * by David DeSandro
    10 - */
    11 !function(a){"use strict";var b=a.Masonry;b.prototype._remapV2Options=function(){this._remapOption("gutterWidth","gutter"),this._remapOption("isResizable","isResizeBound"),this._remapOption("isRTL","isOriginLeft",function(a){return!a});var a=this.options.isAnimated;if(void 0!==a&&(this.options.transitionDuration=a?b.prototype.options.transitionDuration:0),void 0===a||a){var c=this.options.animationOptions,d=c&&c.duration;d&&(this.options.transitionDuration="string"==typeof d?d:d+"ms")}},b.prototype._remapOption=function(a,b,c){var d=this.options[a];void 0!==d&&(this.options[b]=c?c(d):d)};var c=b.prototype._create;b.prototype._create=function(){var a=this;this._remapV2Options(),c.apply(this,arguments),setTimeout(function(){jQuery(a.element).addClass("masonry")},0)};var d=b.prototype.layout;b.prototype.layout=function(){this._remapV2Options(),d.apply(this,arguments)};var e=b.prototype.option;b.prototype.option=function(){e.apply(this,arguments),this._remapV2Options()};var f=b.prototype._itemize;b.prototype._itemize=function(a){var b=f.apply(this,arguments);return jQuery(a).addClass("masonry-brick"),b};var g=b.prototype.measureColumns;b.prototype.measureColumns=function(){var a=this.options.columnWidth;a&&"function"==typeof a&&(this.getContainerWidth(),this.columnWidth=a(this.containerWidth)),g.apply(this,arguments)},b.prototype.reload=function(){this.reloadItems.apply(this,arguments),this.layout.apply(this)};var h=b.prototype.destroy;b.prototype.destroy=function(){var a=this.getItemElements();jQuery(this.element).removeClass("masonry"),jQuery(a).removeClass("masonry-brick"),h.apply(this,arguments)}}(window);
    12  No newline at end of file
  • wp-includes/js/masonry.js

     
     1/*!
     2 * Masonry PACKAGED v3.3.2
     3 * Cascading grid layout library
     4 * http://masonry.desandro.com
     5 * MIT License
     6 * by David DeSandro
     7 */
     8
     9/**
     10 * Bridget makes jQuery widgets
     11 * v1.1.0
     12 * MIT license
     13 */
     14
     15( function( window ) {
     16
     17
     18
     19// -------------------------- utils -------------------------- //
     20
     21var slice = Array.prototype.slice;
     22
     23function noop() {}
     24
     25// -------------------------- definition -------------------------- //
     26
     27function defineBridget( $ ) {
     28
     29// bail if no jQuery
     30if ( !$ ) {
     31  return;
     32}
     33
     34// -------------------------- addOptionMethod -------------------------- //
     35
     36/**
     37 * adds option method -> $().plugin('option', {...})
     38 * @param {Function} PluginClass - constructor class
     39 */
     40function addOptionMethod( PluginClass ) {
     41  // don't overwrite original option method
     42  if ( PluginClass.prototype.option ) {
     43    return;
     44  }
     45
     46  // option setter
     47  PluginClass.prototype.option = function( opts ) {
     48    // bail out if not an object
     49    if ( !$.isPlainObject( opts ) ){
     50      return;
     51    }
     52    this.options = $.extend( true, this.options, opts );
     53  };
     54}
     55
     56// -------------------------- plugin bridge -------------------------- //
     57
     58// helper function for logging errors
     59// $.error breaks jQuery chaining
     60var logError = typeof console === 'undefined' ? noop :
     61  function( message ) {
     62    console.error( message );
     63  };
     64
     65/**
     66 * jQuery plugin bridge, access methods like $elem.plugin('method')
     67 * @param {String} namespace - plugin name
     68 * @param {Function} PluginClass - constructor class
     69 */
     70function bridge( namespace, PluginClass ) {
     71  // add to jQuery fn namespace
     72  $.fn[ namespace ] = function( options ) {
     73    if ( typeof options === 'string' ) {
     74      // call plugin method when first argument is a string
     75      // get arguments for method
     76      var args = slice.call( arguments, 1 );
     77
     78      for ( var i=0, len = this.length; i < len; i++ ) {
     79        var elem = this[i];
     80        var instance = $.data( elem, namespace );
     81        if ( !instance ) {
     82          logError( "cannot call methods on " + namespace + " prior to initialization; " +
     83            "attempted to call '" + options + "'" );
     84          continue;
     85        }
     86        if ( !$.isFunction( instance[options] ) || options.charAt(0) === '_' ) {
     87          logError( "no such method '" + options + "' for " + namespace + " instance" );
     88          continue;
     89        }
     90
     91        // trigger method with arguments
     92        var returnValue = instance[ options ].apply( instance, args );
     93
     94        // break look and return first value if provided
     95        if ( returnValue !== undefined ) {
     96          return returnValue;
     97        }
     98      }
     99      // return this if no return value
     100      return this;
     101    } else {
     102      return this.each( function() {
     103        var instance = $.data( this, namespace );
     104        if ( instance ) {
     105          // apply options & init
     106          instance.option( options );
     107          instance._init();
     108        } else {
     109          // initialize new instance
     110          instance = new PluginClass( this, options );
     111          $.data( this, namespace, instance );
     112        }
     113      });
     114    }
     115  };
     116
     117}
     118
     119// -------------------------- bridget -------------------------- //
     120
     121/**
     122 * converts a Prototypical class into a proper jQuery plugin
     123 *   the class must have a ._init method
     124 * @param {String} namespace - plugin name, used in $().pluginName
     125 * @param {Function} PluginClass - constructor class
     126 */
     127$.bridget = function( namespace, PluginClass ) {
     128  addOptionMethod( PluginClass );
     129  bridge( namespace, PluginClass );
     130};
     131
     132return $.bridget;
     133
     134}
     135
     136// transport
     137if ( typeof define === 'function' && define.amd ) {
     138  // AMD
     139  define( 'jquery-bridget/jquery.bridget',[ 'jquery' ], defineBridget );
     140} else if ( typeof exports === 'object' ) {
     141  defineBridget( require('jquery') );
     142} else {
     143  // get jquery from browser global
     144  defineBridget( window.jQuery );
     145}
     146
     147})( window );
     148
     149/*!
     150 * eventie v1.0.6
     151 * event binding helper
     152 *   eventie.bind( elem, 'click', myFn )
     153 *   eventie.unbind( elem, 'click', myFn )
     154 * MIT license
     155 */
     156
     157/*jshint browser: true, undef: true, unused: true */
     158/*global define: false, module: false */
     159
     160( function( window ) {
     161
     162
     163
     164var docElem = document.documentElement;
     165
     166var bind = function() {};
     167
     168function getIEEvent( obj ) {
     169  var event = window.event;
     170  // add event.target
     171  event.target = event.target || event.srcElement || obj;
     172  return event;
     173}
     174
     175if ( docElem.addEventListener ) {
     176  bind = function( obj, type, fn ) {
     177    obj.addEventListener( type, fn, false );
     178  };
     179} else if ( docElem.attachEvent ) {
     180  bind = function( obj, type, fn ) {
     181    obj[ type + fn ] = fn.handleEvent ?
     182      function() {
     183        var event = getIEEvent( obj );
     184        fn.handleEvent.call( fn, event );
     185      } :
     186      function() {
     187        var event = getIEEvent( obj );
     188        fn.call( obj, event );
     189      };
     190    obj.attachEvent( "on" + type, obj[ type + fn ] );
     191  };
     192}
     193
     194var unbind = function() {};
     195
     196if ( docElem.removeEventListener ) {
     197  unbind = function( obj, type, fn ) {
     198    obj.removeEventListener( type, fn, false );
     199  };
     200} else if ( docElem.detachEvent ) {
     201  unbind = function( obj, type, fn ) {
     202    obj.detachEvent( "on" + type, obj[ type + fn ] );
     203    try {
     204      delete obj[ type + fn ];
     205    } catch ( err ) {
     206      // can't delete window object properties
     207      obj[ type + fn ] = undefined;
     208    }
     209  };
     210}
     211
     212var eventie = {
     213  bind: bind,
     214  unbind: unbind
     215};
     216
     217// ----- module definition ----- //
     218
     219if ( typeof define === 'function' && define.amd ) {
     220  // AMD
     221  define( 'eventie/eventie',eventie );
     222} else if ( typeof exports === 'object' ) {
     223  // CommonJS
     224  module.exports = eventie;
     225} else {
     226  // browser global
     227  window.eventie = eventie;
     228}
     229
     230})( window );
     231
     232/*!
     233 * EventEmitter v4.2.11 - git.io/ee
     234 * Unlicense - http://unlicense.org/
     235 * Oliver Caldwell - http://oli.me.uk/
     236 * @preserve
     237 */
     238
     239;(function () {
     240   
     241
     242    /**
     243     * Class for managing events.
     244     * Can be extended to provide event functionality in other classes.
     245     *
     246     * @class EventEmitter Manages event registering and emitting.
     247     */
     248    function EventEmitter() {}
     249
     250    // Shortcuts to improve speed and size
     251    var proto = EventEmitter.prototype;
     252    var exports = this;
     253    var originalGlobalValue = exports.EventEmitter;
     254
     255    /**
     256     * Finds the index of the listener for the event in its storage array.
     257     *
     258     * @param {Function[]} listeners Array of listeners to search through.
     259     * @param {Function} listener Method to look for.
     260     * @return {Number} Index of the specified listener, -1 if not found
     261     * @api private
     262     */
     263    function indexOfListener(listeners, listener) {
     264        var i = listeners.length;
     265        while (i--) {
     266            if (listeners[i].listener === listener) {
     267                return i;
     268            }
     269        }
     270
     271        return -1;
     272    }
     273
     274    /**
     275     * Alias a method while keeping the context correct, to allow for overwriting of target method.
     276     *
     277     * @param {String} name The name of the target method.
     278     * @return {Function} The aliased method
     279     * @api private
     280     */
     281    function alias(name) {
     282        return function aliasClosure() {
     283            return this[name].apply(this, arguments);
     284        };
     285    }
     286
     287    /**
     288     * Returns the listener array for the specified event.
     289     * Will initialise the event object and listener arrays if required.
     290     * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.
     291     * Each property in the object response is an array of listener functions.
     292     *
     293     * @param {String|RegExp} evt Name of the event to return the listeners from.
     294     * @return {Function[]|Object} All listener functions for the event.
     295     */
     296    proto.getListeners = function getListeners(evt) {
     297        var events = this._getEvents();
     298        var response;
     299        var key;
     300
     301        // Return a concatenated array of all matching events if
     302        // the selector is a regular expression.
     303        if (evt instanceof RegExp) {
     304            response = {};
     305            for (key in events) {
     306                if (events.hasOwnProperty(key) && evt.test(key)) {
     307                    response[key] = events[key];
     308                }
     309            }
     310        }
     311        else {
     312            response = events[evt] || (events[evt] = []);
     313        }
     314
     315        return response;
     316    };
     317
     318    /**
     319     * Takes a list of listener objects and flattens it into a list of listener functions.
     320     *
     321     * @param {Object[]} listeners Raw listener objects.
     322     * @return {Function[]} Just the listener functions.
     323     */
     324    proto.flattenListeners = function flattenListeners(listeners) {
     325        var flatListeners = [];
     326        var i;
     327
     328        for (i = 0; i < listeners.length; i += 1) {
     329            flatListeners.push(listeners[i].listener);
     330        }
     331
     332        return flatListeners;
     333    };
     334
     335    /**
     336     * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.
     337     *
     338     * @param {String|RegExp} evt Name of the event to return the listeners from.
     339     * @return {Object} All listener functions for an event in an object.
     340     */
     341    proto.getListenersAsObject = function getListenersAsObject(evt) {
     342        var listeners = this.getListeners(evt);
     343        var response;
     344
     345        if (listeners instanceof Array) {
     346            response = {};
     347            response[evt] = listeners;
     348        }
     349
     350        return response || listeners;
     351    };
     352
     353    /**
     354     * Adds a listener function to the specified event.
     355     * The listener will not be added if it is a duplicate.
     356     * If the listener returns true then it will be removed after it is called.
     357     * If you pass a regular expression as the event name then the listener will be added to all events that match it.
     358     *
     359     * @param {String|RegExp} evt Name of the event to attach the listener to.
     360     * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.
     361     * @return {Object} Current instance of EventEmitter for chaining.
     362     */
     363    proto.addListener = function addListener(evt, listener) {
     364        var listeners = this.getListenersAsObject(evt);
     365        var listenerIsWrapped = typeof listener === 'object';
     366        var key;
     367
     368        for (key in listeners) {
     369            if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {
     370                listeners[key].push(listenerIsWrapped ? listener : {
     371                    listener: listener,
     372                    once: false
     373                });
     374            }
     375        }
     376
     377        return this;
     378    };
     379
     380    /**
     381     * Alias of addListener
     382     */
     383    proto.on = alias('addListener');
     384
     385    /**
     386     * Semi-alias of addListener. It will add a listener that will be
     387     * automatically removed after its first execution.
     388     *
     389     * @param {String|RegExp} evt Name of the event to attach the listener to.
     390     * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.
     391     * @return {Object} Current instance of EventEmitter for chaining.
     392     */
     393    proto.addOnceListener = function addOnceListener(evt, listener) {
     394        return this.addListener(evt, {
     395            listener: listener,
     396            once: true
     397        });
     398    };
     399
     400    /**
     401     * Alias of addOnceListener.
     402     */
     403    proto.once = alias('addOnceListener');
     404
     405    /**
     406     * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.
     407     * You need to tell it what event names should be matched by a regex.
     408     *
     409     * @param {String} evt Name of the event to create.
     410     * @return {Object} Current instance of EventEmitter for chaining.
     411     */
     412    proto.defineEvent = function defineEvent(evt) {
     413        this.getListeners(evt);
     414        return this;
     415    };
     416
     417    /**
     418     * Uses defineEvent to define multiple events.
     419     *
     420     * @param {String[]} evts An array of event names to define.
     421     * @return {Object} Current instance of EventEmitter for chaining.
     422     */
     423    proto.defineEvents = function defineEvents(evts) {
     424        for (var i = 0; i < evts.length; i += 1) {
     425            this.defineEvent(evts[i]);
     426        }
     427        return this;
     428    };
     429
     430    /**
     431     * Removes a listener function from the specified event.
     432     * When passed a regular expression as the event name, it will remove the listener from all events that match it.
     433     *
     434     * @param {String|RegExp} evt Name of the event to remove the listener from.
     435     * @param {Function} listener Method to remove from the event.
     436     * @return {Object} Current instance of EventEmitter for chaining.
     437     */
     438    proto.removeListener = function removeListener(evt, listener) {
     439        var listeners = this.getListenersAsObject(evt);
     440        var index;
     441        var key;
     442
     443        for (key in listeners) {
     444            if (listeners.hasOwnProperty(key)) {
     445                index = indexOfListener(listeners[key], listener);
     446
     447                if (index !== -1) {
     448                    listeners[key].splice(index, 1);
     449                }
     450            }
     451        }
     452
     453        return this;
     454    };
     455
     456    /**
     457     * Alias of removeListener
     458     */
     459    proto.off = alias('removeListener');
     460
     461    /**
     462     * Adds listeners in bulk using the manipulateListeners method.
     463     * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.
     464     * You can also pass it a regular expression to add the array of listeners to all events that match it.
     465     * Yeah, this function does quite a bit. That's probably a bad thing.
     466     *
     467     * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.
     468     * @param {Function[]} [listeners] An optional array of listener functions to add.
     469     * @return {Object} Current instance of EventEmitter for chaining.
     470     */
     471    proto.addListeners = function addListeners(evt, listeners) {
     472        // Pass through to manipulateListeners
     473        return this.manipulateListeners(false, evt, listeners);
     474    };
     475
     476    /**
     477     * Removes listeners in bulk using the manipulateListeners method.
     478     * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.
     479     * You can also pass it an event name and an array of listeners to be removed.
     480     * You can also pass it a regular expression to remove the listeners from all events that match it.
     481     *
     482     * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.
     483     * @param {Function[]} [listeners] An optional array of listener functions to remove.
     484     * @return {Object} Current instance of EventEmitter for chaining.
     485     */
     486    proto.removeListeners = function removeListeners(evt, listeners) {
     487        // Pass through to manipulateListeners
     488        return this.manipulateListeners(true, evt, listeners);
     489    };
     490
     491    /**
     492     * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.
     493     * The first argument will determine if the listeners are removed (true) or added (false).
     494     * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.
     495     * You can also pass it an event name and an array of listeners to be added/removed.
     496     * You can also pass it a regular expression to manipulate the listeners of all events that match it.
     497     *
     498     * @param {Boolean} remove True if you want to remove listeners, false if you want to add.
     499     * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.
     500     * @param {Function[]} [listeners] An optional array of listener functions to add/remove.
     501     * @return {Object} Current instance of EventEmitter for chaining.
     502     */
     503    proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {
     504        var i;
     505        var value;
     506        var single = remove ? this.removeListener : this.addListener;
     507        var multiple = remove ? this.removeListeners : this.addListeners;
     508
     509        // If evt is an object then pass each of its properties to this method
     510        if (typeof evt === 'object' && !(evt instanceof RegExp)) {
     511            for (i in evt) {
     512                if (evt.hasOwnProperty(i) && (value = evt[i])) {
     513                    // Pass the single listener straight through to the singular method
     514                    if (typeof value === 'function') {
     515                        single.call(this, i, value);
     516                    }
     517                    else {
     518                        // Otherwise pass back to the multiple function
     519                        multiple.call(this, i, value);
     520                    }
     521                }
     522            }
     523        }
     524        else {
     525            // So evt must be a string
     526            // And listeners must be an array of listeners
     527            // Loop over it and pass each one to the multiple method
     528            i = listeners.length;
     529            while (i--) {
     530                single.call(this, evt, listeners[i]);
     531            }
     532        }
     533
     534        return this;
     535    };
     536
     537    /**
     538     * Removes all listeners from a specified event.
     539     * If you do not specify an event then all listeners will be removed.
     540     * That means every event will be emptied.
     541     * You can also pass a regex to remove all events that match it.
     542     *
     543     * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.
     544     * @return {Object} Current instance of EventEmitter for chaining.
     545     */
     546    proto.removeEvent = function removeEvent(evt) {
     547        var type = typeof evt;
     548        var events = this._getEvents();
     549        var key;
     550
     551        // Remove different things depending on the state of evt
     552        if (type === 'string') {
     553            // Remove all listeners for the specified event
     554            delete events[evt];
     555        }
     556        else if (evt instanceof RegExp) {
     557            // Remove all events matching the regex.
     558            for (key in events) {
     559                if (events.hasOwnProperty(key) && evt.test(key)) {
     560                    delete events[key];
     561                }
     562            }
     563        }
     564        else {
     565            // Remove all listeners in all events
     566            delete this._events;
     567        }
     568
     569        return this;
     570    };
     571
     572    /**
     573     * Alias of removeEvent.
     574     *
     575     * Added to mirror the node API.
     576     */
     577    proto.removeAllListeners = alias('removeEvent');
     578
     579    /**
     580     * Emits an event of your choice.
     581     * When emitted, every listener attached to that event will be executed.
     582     * If you pass the optional argument array then those arguments will be passed to every listener upon execution.
     583     * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.
     584     * So they will not arrive within the array on the other side, they will be separate.
     585     * You can also pass a regular expression to emit to all events that match it.
     586     *
     587     * @param {String|RegExp} evt Name of the event to emit and execute listeners for.
     588     * @param {Array} [args] Optional array of arguments to be passed to each listener.
     589     * @return {Object} Current instance of EventEmitter for chaining.
     590     */
     591    proto.emitEvent = function emitEvent(evt, args) {
     592        var listeners = this.getListenersAsObject(evt);
     593        var listener;
     594        var i;
     595        var key;
     596        var response;
     597
     598        for (key in listeners) {
     599            if (listeners.hasOwnProperty(key)) {
     600                i = listeners[key].length;
     601
     602                while (i--) {
     603                    // If the listener returns true then it shall be removed from the event
     604                    // The function is executed either with a basic call or an apply if there is an args array
     605                    listener = listeners[key][i];
     606
     607                    if (listener.once === true) {
     608                        this.removeListener(evt, listener.listener);
     609                    }
     610
     611                    response = listener.listener.apply(this, args || []);
     612
     613                    if (response === this._getOnceReturnValue()) {
     614                        this.removeListener(evt, listener.listener);
     615                    }
     616                }
     617            }
     618        }
     619
     620        return this;
     621    };
     622
     623    /**
     624     * Alias of emitEvent
     625     */
     626    proto.trigger = alias('emitEvent');
     627
     628    /**
     629     * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.
     630     * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.
     631     *
     632     * @param {String|RegExp} evt Name of the event to emit and execute listeners for.
     633     * @param {...*} Optional additional arguments to be passed to each listener.
     634     * @return {Object} Current instance of EventEmitter for chaining.
     635     */
     636    proto.emit = function emit(evt) {
     637        var args = Array.prototype.slice.call(arguments, 1);
     638        return this.emitEvent(evt, args);
     639    };
     640
     641    /**
     642     * Sets the current value to check against when executing listeners. If a
     643     * listeners return value matches the one set here then it will be removed
     644     * after execution. This value defaults to true.
     645     *
     646     * @param {*} value The new value to check for when executing listeners.
     647     * @return {Object} Current instance of EventEmitter for chaining.
     648     */
     649    proto.setOnceReturnValue = function setOnceReturnValue(value) {
     650        this._onceReturnValue = value;
     651        return this;
     652    };
     653
     654    /**
     655     * Fetches the current value to check against when executing listeners. If
     656     * the listeners return value matches this one then it should be removed
     657     * automatically. It will return true by default.
     658     *
     659     * @return {*|Boolean} The current value to check for or the default, true.
     660     * @api private
     661     */
     662    proto._getOnceReturnValue = function _getOnceReturnValue() {
     663        if (this.hasOwnProperty('_onceReturnValue')) {
     664            return this._onceReturnValue;
     665        }
     666        else {
     667            return true;
     668        }
     669    };
     670
     671    /**
     672     * Fetches the events object and creates one if required.
     673     *
     674     * @return {Object} The events storage object.
     675     * @api private
     676     */
     677    proto._getEvents = function _getEvents() {
     678        return this._events || (this._events = {});
     679    };
     680
     681    /**
     682     * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.
     683     *
     684     * @return {Function} Non conflicting EventEmitter class.
     685     */
     686    EventEmitter.noConflict = function noConflict() {
     687        exports.EventEmitter = originalGlobalValue;
     688        return EventEmitter;
     689    };
     690
     691    // Expose the class either via AMD, CommonJS or the global object
     692    if (typeof define === 'function' && define.amd) {
     693        define('eventEmitter/EventEmitter',[],function () {
     694            return EventEmitter;
     695        });
     696    }
     697    else if (typeof module === 'object' && module.exports){
     698        module.exports = EventEmitter;
     699    }
     700    else {
     701        exports.EventEmitter = EventEmitter;
     702    }
     703}.call(this));
     704
     705/*!
     706 * getStyleProperty v1.0.4
     707 * original by kangax
     708 * http://perfectionkills.com/feature-testing-css-properties/
     709 * MIT license
     710 */
     711
     712/*jshint browser: true, strict: true, undef: true */
     713/*global define: false, exports: false, module: false */
     714
     715( function( window ) {
     716
     717
     718
     719var prefixes = 'Webkit Moz ms Ms O'.split(' ');
     720var docElemStyle = document.documentElement.style;
     721
     722function getStyleProperty( propName ) {
     723  if ( !propName ) {
     724    return;
     725  }
     726
     727  // test standard property first
     728  if ( typeof docElemStyle[ propName ] === 'string' ) {
     729    return propName;
     730  }
     731
     732  // capitalize
     733  propName = propName.charAt(0).toUpperCase() + propName.slice(1);
     734
     735  // test vendor specific properties
     736  var prefixed;
     737  for ( var i=0, len = prefixes.length; i < len; i++ ) {
     738    prefixed = prefixes[i] + propName;
     739    if ( typeof docElemStyle[ prefixed ] === 'string' ) {
     740      return prefixed;
     741    }
     742  }
     743}
     744
     745// transport
     746if ( typeof define === 'function' && define.amd ) {
     747  // AMD
     748  define( 'get-style-property/get-style-property',[],function() {
     749    return getStyleProperty;
     750  });
     751} else if ( typeof exports === 'object' ) {
     752  // CommonJS for Component
     753  module.exports = getStyleProperty;
     754} else {
     755  // browser global
     756  window.getStyleProperty = getStyleProperty;
     757}
     758
     759})( window );
     760
     761/*!
     762 * getSize v1.2.2
     763 * measure size of elements
     764 * MIT license
     765 */
     766
     767/*jshint browser: true, strict: true, undef: true, unused: true */
     768/*global define: false, exports: false, require: false, module: false, console: false */
     769
     770( function( window, undefined ) {
     771
     772
     773
     774// -------------------------- helpers -------------------------- //
     775
     776// get a number from a string, not a percentage
     777function getStyleSize( value ) {
     778  var num = parseFloat( value );
     779  // not a percent like '100%', and a number
     780  var isValid = value.indexOf('%') === -1 && !isNaN( num );
     781  return isValid && num;
     782}
     783
     784function noop() {}
     785
     786var logError = typeof console === 'undefined' ? noop :
     787  function( message ) {
     788    console.error( message );
     789  };
     790
     791// -------------------------- measurements -------------------------- //
     792
     793var measurements = [
     794  'paddingLeft',
     795  'paddingRight',
     796  'paddingTop',
     797  'paddingBottom',
     798  'marginLeft',
     799  'marginRight',
     800  'marginTop',
     801  'marginBottom',
     802  'borderLeftWidth',
     803  'borderRightWidth',
     804  'borderTopWidth',
     805  'borderBottomWidth'
     806];
     807
     808function getZeroSize() {
     809  var size = {
     810    width: 0,
     811    height: 0,
     812    innerWidth: 0,
     813    innerHeight: 0,
     814    outerWidth: 0,
     815    outerHeight: 0
     816  };
     817  for ( var i=0, len = measurements.length; i < len; i++ ) {
     818    var measurement = measurements[i];
     819    size[ measurement ] = 0;
     820  }
     821  return size;
     822}
     823
     824
     825
     826function defineGetSize( getStyleProperty ) {
     827
     828// -------------------------- setup -------------------------- //
     829
     830var isSetup = false;
     831
     832var getStyle, boxSizingProp, isBoxSizeOuter;
     833
     834/**
     835 * setup vars and functions
     836 * do it on initial getSize(), rather than on script load
     837 * For Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=548397
     838 */
     839function setup() {
     840  // setup once
     841  if ( isSetup ) {
     842    return;
     843  }
     844  isSetup = true;
     845
     846  var getComputedStyle = window.getComputedStyle;
     847  getStyle = ( function() {
     848    var getStyleFn = getComputedStyle ?
     849      function( elem ) {
     850        return getComputedStyle( elem, null );
     851      } :
     852      function( elem ) {
     853        return elem.currentStyle;
     854      };
     855
     856      return function getStyle( elem ) {
     857        var style = getStyleFn( elem );
     858        if ( !style ) {
     859          logError( 'Style returned ' + style +
     860            '. Are you running this code in a hidden iframe on Firefox? ' +
     861            'See http://bit.ly/getsizebug1' );
     862        }
     863        return style;
     864      };
     865  })();
     866
     867  // -------------------------- box sizing -------------------------- //
     868
     869  boxSizingProp = getStyleProperty('boxSizing');
     870
     871  /**
     872   * WebKit measures the outer-width on style.width on border-box elems
     873   * IE & Firefox measures the inner-width
     874   */
     875  if ( boxSizingProp ) {
     876    var div = document.createElement('div');
     877    div.style.width = '200px';
     878    div.style.padding = '1px 2px 3px 4px';
     879    div.style.borderStyle = 'solid';
     880    div.style.borderWidth = '1px 2px 3px 4px';
     881    div.style[ boxSizingProp ] = 'border-box';
     882
     883    var body = document.body || document.documentElement;
     884    body.appendChild( div );
     885    var style = getStyle( div );
     886
     887    isBoxSizeOuter = getStyleSize( style.width ) === 200;
     888    body.removeChild( div );
     889  }
     890
     891}
     892
     893// -------------------------- getSize -------------------------- //
     894
     895function getSize( elem ) {
     896  setup();
     897
     898  // use querySeletor if elem is string
     899  if ( typeof elem === 'string' ) {
     900    elem = document.querySelector( elem );
     901  }
     902
     903  // do not proceed on non-objects
     904  if ( !elem || typeof elem !== 'object' || !elem.nodeType ) {
     905    return;
     906  }
     907
     908  var style = getStyle( elem );
     909
     910  // if hidden, everything is 0
     911  if ( style.display === 'none' ) {
     912    return getZeroSize();
     913  }
     914
     915  var size = {};
     916  size.width = elem.offsetWidth;
     917  size.height = elem.offsetHeight;
     918
     919  var isBorderBox = size.isBorderBox = !!( boxSizingProp &&
     920    style[ boxSizingProp ] && style[ boxSizingProp ] === 'border-box' );
     921
     922  // get all measurements
     923  for ( var i=0, len = measurements.length; i < len; i++ ) {
     924    var measurement = measurements[i];
     925    var value = style[ measurement ];
     926    value = mungeNonPixel( elem, value );
     927    var num = parseFloat( value );
     928    // any 'auto', 'medium' value will be 0
     929    size[ measurement ] = !isNaN( num ) ? num : 0;
     930  }
     931
     932  var paddingWidth = size.paddingLeft + size.paddingRight;
     933  var paddingHeight = size.paddingTop + size.paddingBottom;
     934  var marginWidth = size.marginLeft + size.marginRight;
     935  var marginHeight = size.marginTop + size.marginBottom;
     936  var borderWidth = size.borderLeftWidth + size.borderRightWidth;
     937  var borderHeight = size.borderTopWidth + size.borderBottomWidth;
     938
     939  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
     940
     941  // overwrite width and height if we can get it from style
     942  var styleWidth = getStyleSize( style.width );
     943  if ( styleWidth !== false ) {
     944    size.width = styleWidth +
     945      // add padding and border unless it's already including it
     946      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
     947  }
     948
     949  var styleHeight = getStyleSize( style.height );
     950  if ( styleHeight !== false ) {
     951    size.height = styleHeight +
     952      // add padding and border unless it's already including it
     953      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
     954  }
     955
     956  size.innerWidth = size.width - ( paddingWidth + borderWidth );
     957  size.innerHeight = size.height - ( paddingHeight + borderHeight );
     958
     959  size.outerWidth = size.width + marginWidth;
     960  size.outerHeight = size.height + marginHeight;
     961
     962  return size;
     963}
     964
     965// IE8 returns percent values, not pixels
     966// taken from jQuery's curCSS
     967function mungeNonPixel( elem, value ) {
     968  // IE8 and has percent value
     969  if ( window.getComputedStyle || value.indexOf('%') === -1 ) {
     970    return value;
     971  }
     972  var style = elem.style;
     973  // Remember the original values
     974  var left = style.left;
     975  var rs = elem.runtimeStyle;
     976  var rsLeft = rs && rs.left;
     977
     978  // Put in the new values to get a computed value out
     979  if ( rsLeft ) {
     980    rs.left = elem.currentStyle.left;
     981  }
     982  style.left = value;
     983  value = style.pixelLeft;
     984
     985  // Revert the changed values
     986  style.left = left;
     987  if ( rsLeft ) {
     988    rs.left = rsLeft;
     989  }
     990
     991  return value;
     992}
     993
     994return getSize;
     995
     996}
     997
     998// transport
     999if ( typeof define === 'function' && define.amd ) {
     1000  // AMD for RequireJS
     1001  define( 'get-size/get-size',[ 'get-style-property/get-style-property' ], defineGetSize );
     1002} else if ( typeof exports === 'object' ) {
     1003  // CommonJS for Component
     1004  module.exports = defineGetSize( require('desandro-get-style-property') );
     1005} else {
     1006  // browser global
     1007  window.getSize = defineGetSize( window.getStyleProperty );
     1008}
     1009
     1010})( window );
     1011
     1012/*!
     1013 * docReady v1.0.4
     1014 * Cross browser DOMContentLoaded event emitter
     1015 * MIT license
     1016 */
     1017
     1018/*jshint browser: true, strict: true, undef: true, unused: true*/
     1019/*global define: false, require: false, module: false */
     1020
     1021( function( window ) {
     1022
     1023
     1024
     1025var document = window.document;
     1026// collection of functions to be triggered on ready
     1027var queue = [];
     1028
     1029function docReady( fn ) {
     1030  // throw out non-functions
     1031  if ( typeof fn !== 'function' ) {
     1032    return;
     1033  }
     1034
     1035  if ( docReady.isReady ) {
     1036    // ready now, hit it
     1037    fn();
     1038  } else {
     1039    // queue function when ready
     1040    queue.push( fn );
     1041  }
     1042}
     1043
     1044docReady.isReady = false;
     1045
     1046// triggered on various doc ready events
     1047function onReady( event ) {
     1048  // bail if already triggered or IE8 document is not ready just yet
     1049  var isIE8NotReady = event.type === 'readystatechange' && document.readyState !== 'complete';
     1050  if ( docReady.isReady || isIE8NotReady ) {
     1051    return;
     1052  }
     1053
     1054  trigger();
     1055}
     1056
     1057function trigger() {
     1058  docReady.isReady = true;
     1059  // process queue
     1060  for ( var i=0, len = queue.length; i < len; i++ ) {
     1061    var fn = queue[i];
     1062    fn();
     1063  }
     1064}
     1065
     1066function defineDocReady( eventie ) {
     1067  // trigger ready if page is ready
     1068  if ( document.readyState === 'complete' ) {
     1069    trigger();
     1070  } else {
     1071    // listen for events
     1072    eventie.bind( document, 'DOMContentLoaded', onReady );
     1073    eventie.bind( document, 'readystatechange', onReady );
     1074    eventie.bind( window, 'load', onReady );
     1075  }
     1076
     1077  return docReady;
     1078}
     1079
     1080// transport
     1081if ( typeof define === 'function' && define.amd ) {
     1082  // AMD
     1083  define( 'doc-ready/doc-ready',[ 'eventie/eventie' ], defineDocReady );
     1084} else if ( typeof exports === 'object' ) {
     1085  module.exports = defineDocReady( require('eventie') );
     1086} else {
     1087  // browser global
     1088  window.docReady = defineDocReady( window.eventie );
     1089}
     1090
     1091})( window );
     1092
     1093/**
     1094 * matchesSelector v1.0.3
     1095 * matchesSelector( element, '.selector' )
     1096 * MIT license
     1097 */
     1098
     1099/*jshint browser: true, strict: true, undef: true, unused: true */
     1100/*global define: false, module: false */
     1101
     1102( function( ElemProto ) {
     1103
     1104 
     1105
     1106  var matchesMethod = ( function() {
     1107    // check for the standard method name first
     1108    if ( ElemProto.matches ) {
     1109      return 'matches';
     1110    }
     1111    // check un-prefixed
     1112    if ( ElemProto.matchesSelector ) {
     1113      return 'matchesSelector';
     1114    }
     1115    // check vendor prefixes
     1116    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
     1117
     1118    for ( var i=0, len = prefixes.length; i < len; i++ ) {
     1119      var prefix = prefixes[i];
     1120      var method = prefix + 'MatchesSelector';
     1121      if ( ElemProto[ method ] ) {
     1122        return method;
     1123      }
     1124    }
     1125  })();
     1126
     1127  // ----- match ----- //
     1128
     1129  function match( elem, selector ) {
     1130    return elem[ matchesMethod ]( selector );
     1131  }
     1132
     1133  // ----- appendToFragment ----- //
     1134
     1135  function checkParent( elem ) {
     1136    // not needed if already has parent
     1137    if ( elem.parentNode ) {
     1138      return;
     1139    }
     1140    var fragment = document.createDocumentFragment();
     1141    fragment.appendChild( elem );
     1142  }
     1143
     1144  // ----- query ----- //
     1145
     1146  // fall back to using QSA
     1147  // thx @jonathantneal https://gist.github.com/3062955
     1148  function query( elem, selector ) {
     1149    // append to fragment if no parent
     1150    checkParent( elem );
     1151
     1152    // match elem with all selected elems of parent
     1153    var elems = elem.parentNode.querySelectorAll( selector );
     1154    for ( var i=0, len = elems.length; i < len; i++ ) {
     1155      // return true if match
     1156      if ( elems[i] === elem ) {
     1157        return true;
     1158      }
     1159    }
     1160    // otherwise return false
     1161    return false;
     1162  }
     1163
     1164  // ----- matchChild ----- //
     1165
     1166  function matchChild( elem, selector ) {
     1167    checkParent( elem );
     1168    return match( elem, selector );
     1169  }
     1170
     1171  // ----- matchesSelector ----- //
     1172
     1173  var matchesSelector;
     1174
     1175  if ( matchesMethod ) {
     1176    // IE9 supports matchesSelector, but doesn't work on orphaned elems
     1177    // check for that
     1178    var div = document.createElement('div');
     1179    var supportsOrphans = match( div, 'div' );
     1180    matchesSelector = supportsOrphans ? match : matchChild;
     1181  } else {
     1182    matchesSelector = query;
     1183  }
     1184
     1185  // transport
     1186  if ( typeof define === 'function' && define.amd ) {
     1187    // AMD
     1188    define( 'matches-selector/matches-selector',[],function() {
     1189      return matchesSelector;
     1190    });
     1191  } else if ( typeof exports === 'object' ) {
     1192    module.exports = matchesSelector;
     1193  }
     1194  else {
     1195    // browser global
     1196    window.matchesSelector = matchesSelector;
     1197  }
     1198
     1199})( Element.prototype );
     1200
     1201/**
     1202 * Fizzy UI utils v1.0.1
     1203 * MIT license
     1204 */
     1205
     1206/*jshint browser: true, undef: true, unused: true, strict: true */
     1207
     1208( function( window, factory ) {
     1209  /*global define: false, module: false, require: false */
     1210 
     1211  // universal module definition
     1212
     1213  if ( typeof define == 'function' && define.amd ) {
     1214    // AMD
     1215    define( 'fizzy-ui-utils/utils',[
     1216      'doc-ready/doc-ready',
     1217      'matches-selector/matches-selector'
     1218    ], function( docReady, matchesSelector ) {
     1219      return factory( window, docReady, matchesSelector );
     1220    });
     1221  } else if ( typeof exports == 'object' ) {
     1222    // CommonJS
     1223    module.exports = factory(
     1224      window,
     1225      require('doc-ready'),
     1226      require('desandro-matches-selector')
     1227    );
     1228  } else {
     1229    // browser global
     1230    window.fizzyUIUtils = factory(
     1231      window,
     1232      window.docReady,
     1233      window.matchesSelector
     1234    );
     1235  }
     1236
     1237}( window, function factory( window, docReady, matchesSelector ) {
     1238
     1239
     1240
     1241var utils = {};
     1242
     1243// ----- extend ----- //
     1244
     1245// extends objects
     1246utils.extend = function( a, b ) {
     1247  for ( var prop in b ) {
     1248    a[ prop ] = b[ prop ];
     1249  }
     1250  return a;
     1251};
     1252
     1253// ----- modulo ----- //
     1254
     1255utils.modulo = function( num, div ) {
     1256  return ( ( num % div ) + div ) % div;
     1257};
     1258
     1259// ----- isArray ----- //
     1260 
     1261var objToString = Object.prototype.toString;
     1262utils.isArray = function( obj ) {
     1263  return objToString.call( obj ) == '[object Array]';
     1264};
     1265
     1266// ----- makeArray ----- //
     1267
     1268// turn element or nodeList into an array
     1269utils.makeArray = function( obj ) {
     1270  var ary = [];
     1271  if ( utils.isArray( obj ) ) {
     1272    // use object if already an array
     1273    ary = obj;
     1274  } else if ( obj && typeof obj.length == 'number' ) {
     1275    // convert nodeList to array
     1276    for ( var i=0, len = obj.length; i < len; i++ ) {
     1277      ary.push( obj[i] );
     1278    }
     1279  } else {
     1280    // array of single index
     1281    ary.push( obj );
     1282  }
     1283  return ary;
     1284};
     1285
     1286// ----- indexOf ----- //
     1287
     1288// index of helper cause IE8
     1289utils.indexOf = Array.prototype.indexOf ? function( ary, obj ) {
     1290    return ary.indexOf( obj );
     1291  } : function( ary, obj ) {
     1292    for ( var i=0, len = ary.length; i < len; i++ ) {
     1293      if ( ary[i] === obj ) {
     1294        return i;
     1295      }
     1296    }
     1297    return -1;
     1298  };
     1299
     1300// ----- removeFrom ----- //
     1301
     1302utils.removeFrom = function( ary, obj ) {
     1303  var index = utils.indexOf( ary, obj );
     1304  if ( index != -1 ) {
     1305    ary.splice( index, 1 );
     1306  }
     1307};
     1308
     1309// ----- isElement ----- //
     1310
     1311// http://stackoverflow.com/a/384380/182183
     1312utils.isElement = ( typeof HTMLElement == 'function' || typeof HTMLElement == 'object' ) ?
     1313  function isElementDOM2( obj ) {
     1314    return obj instanceof HTMLElement;
     1315  } :
     1316  function isElementQuirky( obj ) {
     1317    return obj && typeof obj == 'object' &&
     1318      obj.nodeType == 1 && typeof obj.nodeName == 'string';
     1319  };
     1320
     1321// ----- setText ----- //
     1322
     1323utils.setText = ( function() {
     1324  var setTextProperty;
     1325  function setText( elem, text ) {
     1326    // only check setTextProperty once
     1327    setTextProperty = setTextProperty || ( document.documentElement.textContent !== undefined ? 'textContent' : 'innerText' );
     1328    elem[ setTextProperty ] = text;
     1329  }
     1330  return setText;
     1331})();
     1332
     1333// ----- getParent ----- //
     1334
     1335utils.getParent = function( elem, selector ) {
     1336  while ( elem != document.body ) {
     1337    elem = elem.parentNode;
     1338    if ( matchesSelector( elem, selector ) ) {
     1339      return elem;
     1340    }
     1341  }
     1342};
     1343
     1344// ----- getQueryElement ----- //
     1345
     1346// use element as selector string
     1347utils.getQueryElement = function( elem ) {
     1348  if ( typeof elem == 'string' ) {
     1349    return document.querySelector( elem );
     1350  }
     1351  return elem;
     1352};
     1353
     1354// ----- handleEvent ----- //
     1355
     1356// enable .ontype to trigger from .addEventListener( elem, 'type' )
     1357utils.handleEvent = function( event ) {
     1358  var method = 'on' + event.type;
     1359  if ( this[ method ] ) {
     1360    this[ method ]( event );
     1361  }
     1362};
     1363
     1364// ----- filterFindElements ----- //
     1365
     1366utils.filterFindElements = function( elems, selector ) {
     1367  // make array of elems
     1368  elems = utils.makeArray( elems );
     1369  var ffElems = [];
     1370
     1371  for ( var i=0, len = elems.length; i < len; i++ ) {
     1372    var elem = elems[i];
     1373    // check that elem is an actual element
     1374    if ( !utils.isElement( elem ) ) {
     1375      continue;
     1376    }
     1377    // filter & find items if we have a selector
     1378    if ( selector ) {
     1379      // filter siblings
     1380      if ( matchesSelector( elem, selector ) ) {
     1381        ffElems.push( elem );
     1382      }
     1383      // find children
     1384      var childElems = elem.querySelectorAll( selector );
     1385      // concat childElems to filterFound array
     1386      for ( var j=0, jLen = childElems.length; j < jLen; j++ ) {
     1387        ffElems.push( childElems[j] );
     1388      }
     1389    } else {
     1390      ffElems.push( elem );
     1391    }
     1392  }
     1393
     1394  return ffElems;
     1395};
     1396
     1397// ----- debounceMethod ----- //
     1398
     1399utils.debounceMethod = function( _class, methodName, threshold ) {
     1400  // original method
     1401  var method = _class.prototype[ methodName ];
     1402  var timeoutName = methodName + 'Timeout';
     1403
     1404  _class.prototype[ methodName ] = function() {
     1405    var timeout = this[ timeoutName ];
     1406    if ( timeout ) {
     1407      clearTimeout( timeout );
     1408    }
     1409    var args = arguments;
     1410
     1411    var _this = this;
     1412    this[ timeoutName ] = setTimeout( function() {
     1413      method.apply( _this, args );
     1414      delete _this[ timeoutName ];
     1415    }, threshold || 100 );
     1416  };
     1417};
     1418
     1419// ----- htmlInit ----- //
     1420
     1421// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
     1422utils.toDashed = function( str ) {
     1423  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
     1424    return $1 + '-' + $2;
     1425  }).toLowerCase();
     1426};
     1427
     1428var console = window.console;
     1429/**
     1430 * allow user to initialize classes via .js-namespace class
     1431 * htmlInit( Widget, 'widgetName' )
     1432 * options are parsed from data-namespace-option attribute
     1433 */
     1434utils.htmlInit = function( WidgetClass, namespace ) {
     1435  docReady( function() {
     1436    var dashedNamespace = utils.toDashed( namespace );
     1437    var elems = document.querySelectorAll( '.js-' + dashedNamespace );
     1438    var dataAttr = 'data-' + dashedNamespace + '-options';
     1439
     1440    for ( var i=0, len = elems.length; i < len; i++ ) {
     1441      var elem = elems[i];
     1442      var attr = elem.getAttribute( dataAttr );
     1443      var options;
     1444      try {
     1445        options = attr && JSON.parse( attr );
     1446      } catch ( error ) {
     1447        // log error, do not initialize
     1448        if ( console ) {
     1449          console.error( 'Error parsing ' + dataAttr + ' on ' +
     1450            elem.nodeName.toLowerCase() + ( elem.id ? '#' + elem.id : '' ) + ': ' +
     1451            error );
     1452        }
     1453        continue;
     1454      }
     1455      // initialize
     1456      var instance = new WidgetClass( elem, options );
     1457      // make available via $().data('layoutname')
     1458      var jQuery = window.jQuery;
     1459      if ( jQuery ) {
     1460        jQuery.data( elem, namespace, instance );
     1461      }
     1462    }
     1463  });
     1464};
     1465
     1466// -----  ----- //
     1467
     1468return utils;
     1469
     1470}));
     1471
     1472/**
     1473 * Outlayer Item
     1474 */
     1475
     1476( function( window, factory ) {
     1477 
     1478  // universal module definition
     1479  if ( typeof define === 'function' && define.amd ) {
     1480    // AMD
     1481    define( 'outlayer/item',[
     1482        'eventEmitter/EventEmitter',
     1483        'get-size/get-size',
     1484        'get-style-property/get-style-property',
     1485        'fizzy-ui-utils/utils'
     1486      ],
     1487      function( EventEmitter, getSize, getStyleProperty, utils ) {
     1488        return factory( window, EventEmitter, getSize, getStyleProperty, utils );
     1489      }
     1490    );
     1491  } else if (typeof exports === 'object') {
     1492    // CommonJS
     1493    module.exports = factory(
     1494      window,
     1495      require('wolfy87-eventemitter'),
     1496      require('get-size'),
     1497      require('desandro-get-style-property'),
     1498      require('fizzy-ui-utils')
     1499    );
     1500  } else {
     1501    // browser global
     1502    window.Outlayer = {};
     1503    window.Outlayer.Item = factory(
     1504      window,
     1505      window.EventEmitter,
     1506      window.getSize,
     1507      window.getStyleProperty,
     1508      window.fizzyUIUtils
     1509    );
     1510  }
     1511
     1512}( window, function factory( window, EventEmitter, getSize, getStyleProperty, utils ) {
     1513
     1514
     1515// ----- helpers ----- //
     1516
     1517var getComputedStyle = window.getComputedStyle;
     1518var getStyle = getComputedStyle ?
     1519  function( elem ) {
     1520    return getComputedStyle( elem, null );
     1521  } :
     1522  function( elem ) {
     1523    return elem.currentStyle;
     1524  };
     1525
     1526
     1527function isEmptyObj( obj ) {
     1528  for ( var prop in obj ) {
     1529    return false;
     1530  }
     1531  prop = null;
     1532  return true;
     1533}
     1534
     1535// -------------------------- CSS3 support -------------------------- //
     1536
     1537var transitionProperty = getStyleProperty('transition');
     1538var transformProperty = getStyleProperty('transform');
     1539var supportsCSS3 = transitionProperty && transformProperty;
     1540var is3d = !!getStyleProperty('perspective');
     1541
     1542var transitionEndEvent = {
     1543  WebkitTransition: 'webkitTransitionEnd',
     1544  MozTransition: 'transitionend',
     1545  OTransition: 'otransitionend',
     1546  transition: 'transitionend'
     1547}[ transitionProperty ];
     1548
     1549// properties that could have vendor prefix
     1550var prefixableProperties = [
     1551  'transform',
     1552  'transition',
     1553  'transitionDuration',
     1554  'transitionProperty'
     1555];
     1556
     1557// cache all vendor properties
     1558var vendorProperties = ( function() {
     1559  var cache = {};
     1560  for ( var i=0, len = prefixableProperties.length; i < len; i++ ) {
     1561    var prop = prefixableProperties[i];
     1562    var supportedProp = getStyleProperty( prop );
     1563    if ( supportedProp && supportedProp !== prop ) {
     1564      cache[ prop ] = supportedProp;
     1565    }
     1566  }
     1567  return cache;
     1568})();
     1569
     1570// -------------------------- Item -------------------------- //
     1571
     1572function Item( element, layout ) {
     1573  if ( !element ) {
     1574    return;
     1575  }
     1576
     1577  this.element = element;
     1578  // parent layout class, i.e. Masonry, Isotope, or Packery
     1579  this.layout = layout;
     1580  this.position = {
     1581    x: 0,
     1582    y: 0
     1583  };
     1584
     1585  this._create();
     1586}
     1587
     1588// inherit EventEmitter
     1589utils.extend( Item.prototype, EventEmitter.prototype );
     1590
     1591Item.prototype._create = function() {
     1592  // transition objects
     1593  this._transn = {
     1594    ingProperties: {},
     1595    clean: {},
     1596    onEnd: {}
     1597  };
     1598
     1599  this.css({
     1600    position: 'absolute'
     1601  });
     1602};
     1603
     1604// trigger specified handler for event type
     1605Item.prototype.handleEvent = function( event ) {
     1606  var method = 'on' + event.type;
     1607  if ( this[ method ] ) {
     1608    this[ method ]( event );
     1609  }
     1610};
     1611
     1612Item.prototype.getSize = function() {
     1613  this.size = getSize( this.element );
     1614};
     1615
     1616/**
     1617 * apply CSS styles to element
     1618 * @param {Object} style
     1619 */
     1620Item.prototype.css = function( style ) {
     1621  var elemStyle = this.element.style;
     1622
     1623  for ( var prop in style ) {
     1624    // use vendor property if available
     1625    var supportedProp = vendorProperties[ prop ] || prop;
     1626    elemStyle[ supportedProp ] = style[ prop ];
     1627  }
     1628};
     1629
     1630 // measure position, and sets it
     1631Item.prototype.getPosition = function() {
     1632  var style = getStyle( this.element );
     1633  var layoutOptions = this.layout.options;
     1634  var isOriginLeft = layoutOptions.isOriginLeft;
     1635  var isOriginTop = layoutOptions.isOriginTop;
     1636  var xValue = style[ isOriginLeft ? 'left' : 'right' ];
     1637  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
     1638  // convert percent to pixels
     1639  var layoutSize = this.layout.size;
     1640  var x = xValue.indexOf('%') != -1 ?
     1641    ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );
     1642  var y = yValue.indexOf('%') != -1 ?
     1643    ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );
     1644
     1645  // clean up 'auto' or other non-integer values
     1646  x = isNaN( x ) ? 0 : x;
     1647  y = isNaN( y ) ? 0 : y;
     1648  // remove padding from measurement
     1649  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
     1650  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
     1651
     1652  this.position.x = x;
     1653  this.position.y = y;
     1654};
     1655
     1656// set settled position, apply padding
     1657Item.prototype.layoutPosition = function() {
     1658  var layoutSize = this.layout.size;
     1659  var layoutOptions = this.layout.options;
     1660  var style = {};
     1661
     1662  // x
     1663  var xPadding = layoutOptions.isOriginLeft ? 'paddingLeft' : 'paddingRight';
     1664  var xProperty = layoutOptions.isOriginLeft ? 'left' : 'right';
     1665  var xResetProperty = layoutOptions.isOriginLeft ? 'right' : 'left';
     1666
     1667  var x = this.position.x + layoutSize[ xPadding ];
     1668  // set in percentage or pixels
     1669  style[ xProperty ] = this.getXValue( x );
     1670  // reset other property
     1671  style[ xResetProperty ] = '';
     1672
     1673  // y
     1674  var yPadding = layoutOptions.isOriginTop ? 'paddingTop' : 'paddingBottom';
     1675  var yProperty = layoutOptions.isOriginTop ? 'top' : 'bottom';
     1676  var yResetProperty = layoutOptions.isOriginTop ? 'bottom' : 'top';
     1677
     1678  var y = this.position.y + layoutSize[ yPadding ];
     1679  // set in percentage or pixels
     1680  style[ yProperty ] = this.getYValue( y );
     1681  // reset other property
     1682  style[ yResetProperty ] = '';
     1683
     1684  this.css( style );
     1685  this.emitEvent( 'layout', [ this ] );
     1686};
     1687
     1688Item.prototype.getXValue = function( x ) {
     1689  var layoutOptions = this.layout.options;
     1690  return layoutOptions.percentPosition && !layoutOptions.isHorizontal ?
     1691    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
     1692};
     1693
     1694Item.prototype.getYValue = function( y ) {
     1695  var layoutOptions = this.layout.options;
     1696  return layoutOptions.percentPosition && layoutOptions.isHorizontal ?
     1697    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
     1698};
     1699
     1700
     1701Item.prototype._transitionTo = function( x, y ) {
     1702  this.getPosition();
     1703  // get current x & y from top/left
     1704  var curX = this.position.x;
     1705  var curY = this.position.y;
     1706
     1707  var compareX = parseInt( x, 10 );
     1708  var compareY = parseInt( y, 10 );
     1709  var didNotMove = compareX === this.position.x && compareY === this.position.y;
     1710
     1711  // save end position
     1712  this.setPosition( x, y );
     1713
     1714  // if did not move and not transitioning, just go to layout
     1715  if ( didNotMove && !this.isTransitioning ) {
     1716    this.layoutPosition();
     1717    return;
     1718  }
     1719
     1720  var transX = x - curX;
     1721  var transY = y - curY;
     1722  var transitionStyle = {};
     1723  transitionStyle.transform = this.getTranslate( transX, transY );
     1724
     1725  this.transition({
     1726    to: transitionStyle,
     1727    onTransitionEnd: {
     1728      transform: this.layoutPosition
     1729    },
     1730    isCleaning: true
     1731  });
     1732};
     1733
     1734Item.prototype.getTranslate = function( x, y ) {
     1735  // flip cooridinates if origin on right or bottom
     1736  var layoutOptions = this.layout.options;
     1737  x = layoutOptions.isOriginLeft ? x : -x;
     1738  y = layoutOptions.isOriginTop ? y : -y;
     1739
     1740  if ( is3d ) {
     1741    return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
     1742  }
     1743
     1744  return 'translate(' + x + 'px, ' + y + 'px)';
     1745};
     1746
     1747// non transition + transform support
     1748Item.prototype.goTo = function( x, y ) {
     1749  this.setPosition( x, y );
     1750  this.layoutPosition();
     1751};
     1752
     1753// use transition and transforms if supported
     1754Item.prototype.moveTo = supportsCSS3 ?
     1755  Item.prototype._transitionTo : Item.prototype.goTo;
     1756
     1757Item.prototype.setPosition = function( x, y ) {
     1758  this.position.x = parseInt( x, 10 );
     1759  this.position.y = parseInt( y, 10 );
     1760};
     1761
     1762// ----- transition ----- //
     1763
     1764/**
     1765 * @param {Object} style - CSS
     1766 * @param {Function} onTransitionEnd
     1767 */
     1768
     1769// non transition, just trigger callback
     1770Item.prototype._nonTransition = function( args ) {
     1771  this.css( args.to );
     1772  if ( args.isCleaning ) {
     1773    this._removeStyles( args.to );
     1774  }
     1775  for ( var prop in args.onTransitionEnd ) {
     1776    args.onTransitionEnd[ prop ].call( this );
     1777  }
     1778};
     1779
     1780/**
     1781 * proper transition
     1782 * @param {Object} args - arguments
     1783 *   @param {Object} to - style to transition to
     1784 *   @param {Object} from - style to start transition from
     1785 *   @param {Boolean} isCleaning - removes transition styles after transition
     1786 *   @param {Function} onTransitionEnd - callback
     1787 */
     1788Item.prototype._transition = function( args ) {
     1789  // redirect to nonTransition if no transition duration
     1790  if ( !parseFloat( this.layout.options.transitionDuration ) ) {
     1791    this._nonTransition( args );
     1792    return;
     1793  }
     1794
     1795  var _transition = this._transn;
     1796  // keep track of onTransitionEnd callback by css property
     1797  for ( var prop in args.onTransitionEnd ) {
     1798    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
     1799  }
     1800  // keep track of properties that are transitioning
     1801  for ( prop in args.to ) {
     1802    _transition.ingProperties[ prop ] = true;
     1803    // keep track of properties to clean up when transition is done
     1804    if ( args.isCleaning ) {
     1805      _transition.clean[ prop ] = true;
     1806    }
     1807  }
     1808
     1809  // set from styles
     1810  if ( args.from ) {
     1811    this.css( args.from );
     1812    // force redraw. http://blog.alexmaccaw.com/css-transitions
     1813    var h = this.element.offsetHeight;
     1814    // hack for JSHint to hush about unused var
     1815    h = null;
     1816  }
     1817  // enable transition
     1818  this.enableTransition( args.to );
     1819  // set styles that are transitioning
     1820  this.css( args.to );
     1821
     1822  this.isTransitioning = true;
     1823
     1824};
     1825
     1826// dash before all cap letters, including first for
     1827// WebkitTransform => -webkit-transform
     1828function toDashedAll( str ) {
     1829  return str.replace( /([A-Z])/g, function( $1 ) {
     1830    return '-' + $1.toLowerCase();
     1831  });
     1832}
     1833
     1834var transitionProps = 'opacity,' +
     1835  toDashedAll( vendorProperties.transform || 'transform' );
     1836
     1837Item.prototype.enableTransition = function(/* style */) {
     1838  // HACK changing transitionProperty during a transition
     1839  // will cause transition to jump
     1840  if ( this.isTransitioning ) {
     1841    return;
     1842  }
     1843
     1844  // make `transition: foo, bar, baz` from style object
     1845  // HACK un-comment this when enableTransition can work
     1846  // while a transition is happening
     1847  // var transitionValues = [];
     1848  // for ( var prop in style ) {
     1849  //   // dash-ify camelCased properties like WebkitTransition
     1850  //   prop = vendorProperties[ prop ] || prop;
     1851  //   transitionValues.push( toDashedAll( prop ) );
     1852  // }
     1853  // enable transition styles
     1854  this.css({
     1855    transitionProperty: transitionProps,
     1856    transitionDuration: this.layout.options.transitionDuration
     1857  });
     1858  // listen for transition end event
     1859  this.element.addEventListener( transitionEndEvent, this, false );
     1860};
     1861
     1862Item.prototype.transition = Item.prototype[ transitionProperty ? '_transition' : '_nonTransition' ];
     1863
     1864// ----- events ----- //
     1865
     1866Item.prototype.onwebkitTransitionEnd = function( event ) {
     1867  this.ontransitionend( event );
     1868};
     1869
     1870Item.prototype.onotransitionend = function( event ) {
     1871  this.ontransitionend( event );
     1872};
     1873
     1874// properties that I munge to make my life easier
     1875var dashedVendorProperties = {
     1876  '-webkit-transform': 'transform',
     1877  '-moz-transform': 'transform',
     1878  '-o-transform': 'transform'
     1879};
     1880
     1881Item.prototype.ontransitionend = function( event ) {
     1882  // disregard bubbled events from children
     1883  if ( event.target !== this.element ) {
     1884    return;
     1885  }
     1886  var _transition = this._transn;
     1887  // get property name of transitioned property, convert to prefix-free
     1888  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;
     1889
     1890  // remove property that has completed transitioning
     1891  delete _transition.ingProperties[ propertyName ];
     1892  // check if any properties are still transitioning
     1893  if ( isEmptyObj( _transition.ingProperties ) ) {
     1894    // all properties have completed transitioning
     1895    this.disableTransition();
     1896  }
     1897  // clean style
     1898  if ( propertyName in _transition.clean ) {
     1899    // clean up style
     1900    this.element.style[ event.propertyName ] = '';
     1901    delete _transition.clean[ propertyName ];
     1902  }
     1903  // trigger onTransitionEnd callback
     1904  if ( propertyName in _transition.onEnd ) {
     1905    var onTransitionEnd = _transition.onEnd[ propertyName ];
     1906    onTransitionEnd.call( this );
     1907    delete _transition.onEnd[ propertyName ];
     1908  }
     1909
     1910  this.emitEvent( 'transitionEnd', [ this ] );
     1911};
     1912
     1913Item.prototype.disableTransition = function() {
     1914  this.removeTransitionStyles();
     1915  this.element.removeEventListener( transitionEndEvent, this, false );
     1916  this.isTransitioning = false;
     1917};
     1918
     1919/**
     1920 * removes style property from element
     1921 * @param {Object} style
     1922**/
     1923Item.prototype._removeStyles = function( style ) {
     1924  // clean up transition styles
     1925  var cleanStyle = {};
     1926  for ( var prop in style ) {
     1927    cleanStyle[ prop ] = '';
     1928  }
     1929  this.css( cleanStyle );
     1930};
     1931
     1932var cleanTransitionStyle = {
     1933  transitionProperty: '',
     1934  transitionDuration: ''
     1935};
     1936
     1937Item.prototype.removeTransitionStyles = function() {
     1938  // remove transition
     1939  this.css( cleanTransitionStyle );
     1940};
     1941
     1942// ----- show/hide/remove ----- //
     1943
     1944// remove element from DOM
     1945Item.prototype.removeElem = function() {
     1946  this.element.parentNode.removeChild( this.element );
     1947  // remove display: none
     1948  this.css({ display: '' });
     1949  this.emitEvent( 'remove', [ this ] );
     1950};
     1951
     1952Item.prototype.remove = function() {
     1953  // just remove element if no transition support or no transition
     1954  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
     1955    this.removeElem();
     1956    return;
     1957  }
     1958
     1959  // start transition
     1960  var _this = this;
     1961  this.once( 'transitionEnd', function() {
     1962    _this.removeElem();
     1963  });
     1964  this.hide();
     1965};
     1966
     1967Item.prototype.reveal = function() {
     1968  delete this.isHidden;
     1969  // remove display: none
     1970  this.css({ display: '' });
     1971
     1972  var options = this.layout.options;
     1973
     1974  var onTransitionEnd = {};
     1975  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
     1976  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;
     1977
     1978  this.transition({
     1979    from: options.hiddenStyle,
     1980    to: options.visibleStyle,
     1981    isCleaning: true,
     1982    onTransitionEnd: onTransitionEnd
     1983  });
     1984};
     1985
     1986Item.prototype.onRevealTransitionEnd = function() {
     1987  // check if still visible
     1988  // during transition, item may have been hidden
     1989  if ( !this.isHidden ) {
     1990    this.emitEvent('reveal');
     1991  }
     1992};
     1993
     1994/**
     1995 * get style property use for hide/reveal transition end
     1996 * @param {String} styleProperty - hiddenStyle/visibleStyle
     1997 * @returns {String}
     1998 */
     1999Item.prototype.getHideRevealTransitionEndProperty = function( styleProperty ) {
     2000  var optionStyle = this.layout.options[ styleProperty ];
     2001  // use opacity
     2002  if ( optionStyle.opacity ) {
     2003    return 'opacity';
     2004  }
     2005  // get first property
     2006  for ( var prop in optionStyle ) {
     2007    return prop;
     2008  }
     2009};
     2010
     2011Item.prototype.hide = function() {
     2012  // set flag
     2013  this.isHidden = true;
     2014  // remove display: none
     2015  this.css({ display: '' });
     2016
     2017  var options = this.layout.options;
     2018
     2019  var onTransitionEnd = {};
     2020  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
     2021  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;
     2022
     2023  this.transition({
     2024    from: options.visibleStyle,
     2025    to: options.hiddenStyle,
     2026    // keep hidden stuff hidden
     2027    isCleaning: true,
     2028    onTransitionEnd: onTransitionEnd
     2029  });
     2030};
     2031
     2032Item.prototype.onHideTransitionEnd = function() {
     2033  // check if still hidden
     2034  // during transition, item may have been un-hidden
     2035  if ( this.isHidden ) {
     2036    this.css({ display: 'none' });
     2037    this.emitEvent('hide');
     2038  }
     2039};
     2040
     2041Item.prototype.destroy = function() {
     2042  this.css({
     2043    position: '',
     2044    left: '',
     2045    right: '',
     2046    top: '',
     2047    bottom: '',
     2048    transition: '',
     2049    transform: ''
     2050  });
     2051};
     2052
     2053return Item;
     2054
     2055}));
     2056
     2057/*!
     2058 * Outlayer v1.4.2
     2059 * the brains and guts of a layout library
     2060 * MIT license
     2061 */
     2062
     2063( function( window, factory ) {
     2064 
     2065  // universal module definition
     2066
     2067  if ( typeof define == 'function' && define.amd ) {
     2068    // AMD
     2069    define( 'outlayer/outlayer',[
     2070        'eventie/eventie',
     2071        'eventEmitter/EventEmitter',
     2072        'get-size/get-size',
     2073        'fizzy-ui-utils/utils',
     2074        './item'
     2075      ],
     2076      function( eventie, EventEmitter, getSize, utils, Item ) {
     2077        return factory( window, eventie, EventEmitter, getSize, utils, Item);
     2078      }
     2079    );
     2080  } else if ( typeof exports == 'object' ) {
     2081    // CommonJS
     2082    module.exports = factory(
     2083      window,
     2084      require('eventie'),
     2085      require('wolfy87-eventemitter'),
     2086      require('get-size'),
     2087      require('fizzy-ui-utils'),
     2088      require('./item')
     2089    );
     2090  } else {
     2091    // browser global
     2092    window.Outlayer = factory(
     2093      window,
     2094      window.eventie,
     2095      window.EventEmitter,
     2096      window.getSize,
     2097      window.fizzyUIUtils,
     2098      window.Outlayer.Item
     2099    );
     2100  }
     2101
     2102}( window, function factory( window, eventie, EventEmitter, getSize, utils, Item ) {
     2103
     2104
     2105// ----- vars ----- //
     2106
     2107var console = window.console;
     2108var jQuery = window.jQuery;
     2109var noop = function() {};
     2110
     2111// -------------------------- Outlayer -------------------------- //
     2112
     2113// globally unique identifiers
     2114var GUID = 0;
     2115// internal store of all Outlayer intances
     2116var instances = {};
     2117
     2118
     2119/**
     2120 * @param {Element, String} element
     2121 * @param {Object} options
     2122 * @constructor
     2123 */
     2124function Outlayer( element, options ) {
     2125  var queryElement = utils.getQueryElement( element );
     2126  if ( !queryElement ) {
     2127    if ( console ) {
     2128      console.error( 'Bad element for ' + this.constructor.namespace +
     2129        ': ' + ( queryElement || element ) );
     2130    }
     2131    return;
     2132  }
     2133  this.element = queryElement;
     2134  // add jQuery
     2135  if ( jQuery ) {
     2136    this.$element = jQuery( this.element );
     2137  }
     2138
     2139  // options
     2140  this.options = utils.extend( {}, this.constructor.defaults );
     2141  this.option( options );
     2142
     2143  // add id for Outlayer.getFromElement
     2144  var id = ++GUID;
     2145  this.element.outlayerGUID = id; // expando
     2146  instances[ id ] = this; // associate via id
     2147
     2148  // kick it off
     2149  this._create();
     2150
     2151  if ( this.options.isInitLayout ) {
     2152    this.layout();
     2153  }
     2154}
     2155
     2156// settings are for internal use only
     2157Outlayer.namespace = 'outlayer';
     2158Outlayer.Item = Item;
     2159
     2160// default options
     2161Outlayer.defaults = {
     2162  containerStyle: {
     2163    position: 'relative'
     2164  },
     2165  isInitLayout: true,
     2166  isOriginLeft: true,
     2167  isOriginTop: true,
     2168  isResizeBound: true,
     2169  isResizingContainer: true,
     2170  // item options
     2171  transitionDuration: '0.4s',
     2172  hiddenStyle: {
     2173    opacity: 0,
     2174    transform: 'scale(0.001)'
     2175  },
     2176  visibleStyle: {
     2177    opacity: 1,
     2178    transform: 'scale(1)'
     2179  }
     2180};
     2181
     2182// inherit EventEmitter
     2183utils.extend( Outlayer.prototype, EventEmitter.prototype );
     2184
     2185/**
     2186 * set options
     2187 * @param {Object} opts
     2188 */
     2189Outlayer.prototype.option = function( opts ) {
     2190  utils.extend( this.options, opts );
     2191};
     2192
     2193Outlayer.prototype._create = function() {
     2194  // get items from children
     2195  this.reloadItems();
     2196  // elements that affect layout, but are not laid out
     2197  this.stamps = [];
     2198  this.stamp( this.options.stamp );
     2199  // set container style
     2200  utils.extend( this.element.style, this.options.containerStyle );
     2201
     2202  // bind resize method
     2203  if ( this.options.isResizeBound ) {
     2204    this.bindResize();
     2205  }
     2206};
     2207
     2208// goes through all children again and gets bricks in proper order
     2209Outlayer.prototype.reloadItems = function() {
     2210  // collection of item elements
     2211  this.items = this._itemize( this.element.children );
     2212};
     2213
     2214
     2215/**
     2216 * turn elements into Outlayer.Items to be used in layout
     2217 * @param {Array or NodeList or HTMLElement} elems
     2218 * @returns {Array} items - collection of new Outlayer Items
     2219 */
     2220Outlayer.prototype._itemize = function( elems ) {
     2221
     2222  var itemElems = this._filterFindItemElements( elems );
     2223  var Item = this.constructor.Item;
     2224
     2225  // create new Outlayer Items for collection
     2226  var items = [];
     2227  for ( var i=0, len = itemElems.length; i < len; i++ ) {
     2228    var elem = itemElems[i];
     2229    var item = new Item( elem, this );
     2230    items.push( item );
     2231  }
     2232
     2233  return items;
     2234};
     2235
     2236/**
     2237 * get item elements to be used in layout
     2238 * @param {Array or NodeList or HTMLElement} elems
     2239 * @returns {Array} items - item elements
     2240 */
     2241Outlayer.prototype._filterFindItemElements = function( elems ) {
     2242  return utils.filterFindElements( elems, this.options.itemSelector );
     2243};
     2244
     2245/**
     2246 * getter method for getting item elements
     2247 * @returns {Array} elems - collection of item elements
     2248 */
     2249Outlayer.prototype.getItemElements = function() {
     2250  var elems = [];
     2251  for ( var i=0, len = this.items.length; i < len; i++ ) {
     2252    elems.push( this.items[i].element );
     2253  }
     2254  return elems;
     2255};
     2256
     2257// ----- init & layout ----- //
     2258
     2259/**
     2260 * lays out all items
     2261 */
     2262Outlayer.prototype.layout = function() {
     2263  this._resetLayout();
     2264  this._manageStamps();
     2265
     2266  // don't animate first layout
     2267  var isInstant = this.options.isLayoutInstant !== undefined ?
     2268    this.options.isLayoutInstant : !this._isLayoutInited;
     2269  this.layoutItems( this.items, isInstant );
     2270
     2271  // flag for initalized
     2272  this._isLayoutInited = true;
     2273};
     2274
     2275// _init is alias for layout
     2276Outlayer.prototype._init = Outlayer.prototype.layout;
     2277
     2278/**
     2279 * logic before any new layout
     2280 */
     2281Outlayer.prototype._resetLayout = function() {
     2282  this.getSize();
     2283};
     2284
     2285
     2286Outlayer.prototype.getSize = function() {
     2287  this.size = getSize( this.element );
     2288};
     2289
     2290/**
     2291 * get measurement from option, for columnWidth, rowHeight, gutter
     2292 * if option is String -> get element from selector string, & get size of element
     2293 * if option is Element -> get size of element
     2294 * else use option as a number
     2295 *
     2296 * @param {String} measurement
     2297 * @param {String} size - width or height
     2298 * @private
     2299 */
     2300Outlayer.prototype._getMeasurement = function( measurement, size ) {
     2301  var option = this.options[ measurement ];
     2302  var elem;
     2303  if ( !option ) {
     2304    // default to 0
     2305    this[ measurement ] = 0;
     2306  } else {
     2307    // use option as an element
     2308    if ( typeof option === 'string' ) {
     2309      elem = this.element.querySelector( option );
     2310    } else if ( utils.isElement( option ) ) {
     2311      elem = option;
     2312    }
     2313    // use size of element, if element
     2314    this[ measurement ] = elem ? getSize( elem )[ size ] : option;
     2315  }
     2316};
     2317
     2318/**
     2319 * layout a collection of item elements
     2320 * @api public
     2321 */
     2322Outlayer.prototype.layoutItems = function( items, isInstant ) {
     2323  items = this._getItemsForLayout( items );
     2324
     2325  this._layoutItems( items, isInstant );
     2326
     2327  this._postLayout();
     2328};
     2329
     2330/**
     2331 * get the items to be laid out
     2332 * you may want to skip over some items
     2333 * @param {Array} items
     2334 * @returns {Array} items
     2335 */
     2336Outlayer.prototype._getItemsForLayout = function( items ) {
     2337  var layoutItems = [];
     2338  for ( var i=0, len = items.length; i < len; i++ ) {
     2339    var item = items[i];
     2340    if ( !item.isIgnored ) {
     2341      layoutItems.push( item );
     2342    }
     2343  }
     2344  return layoutItems;
     2345};
     2346
     2347/**
     2348 * layout items
     2349 * @param {Array} items
     2350 * @param {Boolean} isInstant
     2351 */
     2352Outlayer.prototype._layoutItems = function( items, isInstant ) {
     2353  this._emitCompleteOnItems( 'layout', items );
     2354
     2355  if ( !items || !items.length ) {
     2356    // no items, emit event with empty array
     2357    return;
     2358  }
     2359
     2360  var queue = [];
     2361
     2362  for ( var i=0, len = items.length; i < len; i++ ) {
     2363    var item = items[i];
     2364    // get x/y object from method
     2365    var position = this._getItemLayoutPosition( item );
     2366    // enqueue
     2367    position.item = item;
     2368    position.isInstant = isInstant || item.isLayoutInstant;
     2369    queue.push( position );
     2370  }
     2371
     2372  this._processLayoutQueue( queue );
     2373};
     2374
     2375/**
     2376 * get item layout position
     2377 * @param {Outlayer.Item} item
     2378 * @returns {Object} x and y position
     2379 */
     2380Outlayer.prototype._getItemLayoutPosition = function( /* item */ ) {
     2381  return {
     2382    x: 0,
     2383    y: 0
     2384  };
     2385};
     2386
     2387/**
     2388 * iterate over array and position each item
     2389 * Reason being - separating this logic prevents 'layout invalidation'
     2390 * thx @paul_irish
     2391 * @param {Array} queue
     2392 */
     2393Outlayer.prototype._processLayoutQueue = function( queue ) {
     2394  for ( var i=0, len = queue.length; i < len; i++ ) {
     2395    var obj = queue[i];
     2396    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant );
     2397  }
     2398};
     2399
     2400/**
     2401 * Sets position of item in DOM
     2402 * @param {Outlayer.Item} item
     2403 * @param {Number} x - horizontal position
     2404 * @param {Number} y - vertical position
     2405 * @param {Boolean} isInstant - disables transitions
     2406 */
     2407Outlayer.prototype._positionItem = function( item, x, y, isInstant ) {
     2408  if ( isInstant ) {
     2409    // if not transition, just set CSS
     2410    item.goTo( x, y );
     2411  } else {
     2412    item.moveTo( x, y );
     2413  }
     2414};
     2415
     2416/**
     2417 * Any logic you want to do after each layout,
     2418 * i.e. size the container
     2419 */
     2420Outlayer.prototype._postLayout = function() {
     2421  this.resizeContainer();
     2422};
     2423
     2424Outlayer.prototype.resizeContainer = function() {
     2425  if ( !this.options.isResizingContainer ) {
     2426    return;
     2427  }
     2428  var size = this._getContainerSize();
     2429  if ( size ) {
     2430    this._setContainerMeasure( size.width, true );
     2431    this._setContainerMeasure( size.height, false );
     2432  }
     2433};
     2434
     2435/**
     2436 * Sets width or height of container if returned
     2437 * @returns {Object} size
     2438 *   @param {Number} width
     2439 *   @param {Number} height
     2440 */
     2441Outlayer.prototype._getContainerSize = noop;
     2442
     2443/**
     2444 * @param {Number} measure - size of width or height
     2445 * @param {Boolean} isWidth
     2446 */
     2447Outlayer.prototype._setContainerMeasure = function( measure, isWidth ) {
     2448  if ( measure === undefined ) {
     2449    return;
     2450  }
     2451
     2452  var elemSize = this.size;
     2453  // add padding and border width if border box
     2454  if ( elemSize.isBorderBox ) {
     2455    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
     2456      elemSize.borderLeftWidth + elemSize.borderRightWidth :
     2457      elemSize.paddingBottom + elemSize.paddingTop +
     2458      elemSize.borderTopWidth + elemSize.borderBottomWidth;
     2459  }
     2460
     2461  measure = Math.max( measure, 0 );
     2462  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
     2463};
     2464
     2465/**
     2466 * emit eventComplete on a collection of items events
     2467 * @param {String} eventName
     2468 * @param {Array} items - Outlayer.Items
     2469 */
     2470Outlayer.prototype._emitCompleteOnItems = function( eventName, items ) {
     2471  var _this = this;
     2472  function onComplete() {
     2473    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
     2474  }
     2475
     2476  var count = items.length;
     2477  if ( !items || !count ) {
     2478    onComplete();
     2479    return;
     2480  }
     2481
     2482  var doneCount = 0;
     2483  function tick() {
     2484    doneCount++;
     2485    if ( doneCount === count ) {
     2486      onComplete();
     2487    }
     2488  }
     2489
     2490  // bind callback
     2491  for ( var i=0, len = items.length; i < len; i++ ) {
     2492    var item = items[i];
     2493    item.once( eventName, tick );
     2494  }
     2495};
     2496
     2497/**
     2498 * emits events via eventEmitter and jQuery events
     2499 * @param {String} type - name of event
     2500 * @param {Event} event - original event
     2501 * @param {Array} args - extra arguments
     2502 */
     2503Outlayer.prototype.dispatchEvent = function( type, event, args ) {
     2504  // add original event to arguments
     2505  var emitArgs = event ? [ event ].concat( args ) : args;
     2506  this.emitEvent( type, emitArgs );
     2507
     2508  if ( jQuery ) {
     2509    // set this.$element
     2510    this.$element = this.$element || jQuery( this.element );
     2511    if ( event ) {
     2512      // create jQuery event
     2513      var $event = jQuery.Event( event );
     2514      $event.type = type;
     2515      this.$element.trigger( $event, args );
     2516    } else {
     2517      // just trigger with type if no event available
     2518      this.$element.trigger( type, args );
     2519    }
     2520  }
     2521};
     2522
     2523// -------------------------- ignore & stamps -------------------------- //
     2524
     2525
     2526/**
     2527 * keep item in collection, but do not lay it out
     2528 * ignored items do not get skipped in layout
     2529 * @param {Element} elem
     2530 */
     2531Outlayer.prototype.ignore = function( elem ) {
     2532  var item = this.getItem( elem );
     2533  if ( item ) {
     2534    item.isIgnored = true;
     2535  }
     2536};
     2537
     2538/**
     2539 * return item to layout collection
     2540 * @param {Element} elem
     2541 */
     2542Outlayer.prototype.unignore = function( elem ) {
     2543  var item = this.getItem( elem );
     2544  if ( item ) {
     2545    delete item.isIgnored;
     2546  }
     2547};
     2548
     2549/**
     2550 * adds elements to stamps
     2551 * @param {NodeList, Array, Element, or String} elems
     2552 */
     2553Outlayer.prototype.stamp = function( elems ) {
     2554  elems = this._find( elems );
     2555  if ( !elems ) {
     2556    return;
     2557  }
     2558
     2559  this.stamps = this.stamps.concat( elems );
     2560  // ignore
     2561  for ( var i=0, len = elems.length; i < len; i++ ) {
     2562    var elem = elems[i];
     2563    this.ignore( elem );
     2564  }
     2565};
     2566
     2567/**
     2568 * removes elements to stamps
     2569 * @param {NodeList, Array, or Element} elems
     2570 */
     2571Outlayer.prototype.unstamp = function( elems ) {
     2572  elems = this._find( elems );
     2573  if ( !elems ){
     2574    return;
     2575  }
     2576
     2577  for ( var i=0, len = elems.length; i < len; i++ ) {
     2578    var elem = elems[i];
     2579    // filter out removed stamp elements
     2580    utils.removeFrom( this.stamps, elem );
     2581    this.unignore( elem );
     2582  }
     2583
     2584};
     2585
     2586/**
     2587 * finds child elements
     2588 * @param {NodeList, Array, Element, or String} elems
     2589 * @returns {Array} elems
     2590 */
     2591Outlayer.prototype._find = function( elems ) {
     2592  if ( !elems ) {
     2593    return;
     2594  }
     2595  // if string, use argument as selector string
     2596  if ( typeof elems === 'string' ) {
     2597    elems = this.element.querySelectorAll( elems );
     2598  }
     2599  elems = utils.makeArray( elems );
     2600  return elems;
     2601};
     2602
     2603Outlayer.prototype._manageStamps = function() {
     2604  if ( !this.stamps || !this.stamps.length ) {
     2605    return;
     2606  }
     2607
     2608  this._getBoundingRect();
     2609
     2610  for ( var i=0, len = this.stamps.length; i < len; i++ ) {
     2611    var stamp = this.stamps[i];
     2612    this._manageStamp( stamp );
     2613  }
     2614};
     2615
     2616// update boundingLeft / Top
     2617Outlayer.prototype._getBoundingRect = function() {
     2618  // get bounding rect for container element
     2619  var boundingRect = this.element.getBoundingClientRect();
     2620  var size = this.size;
     2621  this._boundingRect = {
     2622    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
     2623    top: boundingRect.top + size.paddingTop + size.borderTopWidth,
     2624    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
     2625    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
     2626  };
     2627};
     2628
     2629/**
     2630 * @param {Element} stamp
     2631**/
     2632Outlayer.prototype._manageStamp = noop;
     2633
     2634/**
     2635 * get x/y position of element relative to container element
     2636 * @param {Element} elem
     2637 * @returns {Object} offset - has left, top, right, bottom
     2638 */
     2639Outlayer.prototype._getElementOffset = function( elem ) {
     2640  var boundingRect = elem.getBoundingClientRect();
     2641  var thisRect = this._boundingRect;
     2642  var size = getSize( elem );
     2643  var offset = {
     2644    left: boundingRect.left - thisRect.left - size.marginLeft,
     2645    top: boundingRect.top - thisRect.top - size.marginTop,
     2646    right: thisRect.right - boundingRect.right - size.marginRight,
     2647    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
     2648  };
     2649  return offset;
     2650};
     2651
     2652// -------------------------- resize -------------------------- //
     2653
     2654// enable event handlers for listeners
     2655// i.e. resize -> onresize
     2656Outlayer.prototype.handleEvent = function( event ) {
     2657  var method = 'on' + event.type;
     2658  if ( this[ method ] ) {
     2659    this[ method ]( event );
     2660  }
     2661};
     2662
     2663/**
     2664 * Bind layout to window resizing
     2665 */
     2666Outlayer.prototype.bindResize = function() {
     2667  // bind just one listener
     2668  if ( this.isResizeBound ) {
     2669    return;
     2670  }
     2671  eventie.bind( window, 'resize', this );
     2672  this.isResizeBound = true;
     2673};
     2674
     2675/**
     2676 * Unbind layout to window resizing
     2677 */
     2678Outlayer.prototype.unbindResize = function() {
     2679  if ( this.isResizeBound ) {
     2680    eventie.unbind( window, 'resize', this );
     2681  }
     2682  this.isResizeBound = false;
     2683};
     2684
     2685// original debounce by John Hann
     2686// http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
     2687
     2688// this fires every resize
     2689Outlayer.prototype.onresize = function() {
     2690  if ( this.resizeTimeout ) {
     2691    clearTimeout( this.resizeTimeout );
     2692  }
     2693
     2694  var _this = this;
     2695  function delayed() {
     2696    _this.resize();
     2697    delete _this.resizeTimeout;
     2698  }
     2699
     2700  this.resizeTimeout = setTimeout( delayed, 100 );
     2701};
     2702
     2703// debounced, layout on resize
     2704Outlayer.prototype.resize = function() {
     2705  // don't trigger if size did not change
     2706  // or if resize was unbound. See #9
     2707  if ( !this.isResizeBound || !this.needsResizeLayout() ) {
     2708    return;
     2709  }
     2710
     2711  this.layout();
     2712};
     2713
     2714/**
     2715 * check if layout is needed post layout
     2716 * @returns Boolean
     2717 */
     2718Outlayer.prototype.needsResizeLayout = function() {
     2719  var size = getSize( this.element );
     2720  // check that this.size and size are there
     2721  // IE8 triggers resize on body size change, so they might not be
     2722  var hasSizes = this.size && size;
     2723  return hasSizes && size.innerWidth !== this.size.innerWidth;
     2724};
     2725
     2726// -------------------------- methods -------------------------- //
     2727
     2728/**
     2729 * add items to Outlayer instance
     2730 * @param {Array or NodeList or Element} elems
     2731 * @returns {Array} items - Outlayer.Items
     2732**/
     2733Outlayer.prototype.addItems = function( elems ) {
     2734  var items = this._itemize( elems );
     2735  // add items to collection
     2736  if ( items.length ) {
     2737    this.items = this.items.concat( items );
     2738  }
     2739  return items;
     2740};
     2741
     2742/**
     2743 * Layout newly-appended item elements
     2744 * @param {Array or NodeList or Element} elems
     2745 */
     2746Outlayer.prototype.appended = function( elems ) {
     2747  var items = this.addItems( elems );
     2748  if ( !items.length ) {
     2749    return;
     2750  }
     2751  // layout and reveal just the new items
     2752  this.layoutItems( items, true );
     2753  this.reveal( items );
     2754};
     2755
     2756/**
     2757 * Layout prepended elements
     2758 * @param {Array or NodeList or Element} elems
     2759 */
     2760Outlayer.prototype.prepended = function( elems ) {
     2761  var items = this._itemize( elems );
     2762  if ( !items.length ) {
     2763    return;
     2764  }
     2765  // add items to beginning of collection
     2766  var previousItems = this.items.slice(0);
     2767  this.items = items.concat( previousItems );
     2768  // start new layout
     2769  this._resetLayout();
     2770  this._manageStamps();
     2771  // layout new stuff without transition
     2772  this.layoutItems( items, true );
     2773  this.reveal( items );
     2774  // layout previous items
     2775  this.layoutItems( previousItems );
     2776};
     2777
     2778/**
     2779 * reveal a collection of items
     2780 * @param {Array of Outlayer.Items} items
     2781 */
     2782Outlayer.prototype.reveal = function( items ) {
     2783  this._emitCompleteOnItems( 'reveal', items );
     2784
     2785  var len = items && items.length;
     2786  for ( var i=0; len && i < len; i++ ) {
     2787    var item = items[i];
     2788    item.reveal();
     2789  }
     2790};
     2791
     2792/**
     2793 * hide a collection of items
     2794 * @param {Array of Outlayer.Items} items
     2795 */
     2796Outlayer.prototype.hide = function( items ) {
     2797  this._emitCompleteOnItems( 'hide', items );
     2798
     2799  var len = items && items.length;
     2800  for ( var i=0; len && i < len; i++ ) {
     2801    var item = items[i];
     2802    item.hide();
     2803  }
     2804};
     2805
     2806/**
     2807 * reveal item elements
     2808 * @param {Array}, {Element}, {NodeList} items
     2809 */
     2810Outlayer.prototype.revealItemElements = function( elems ) {
     2811  var items = this.getItems( elems );
     2812  this.reveal( items );
     2813};
     2814
     2815/**
     2816 * hide item elements
     2817 * @param {Array}, {Element}, {NodeList} items
     2818 */
     2819Outlayer.prototype.hideItemElements = function( elems ) {
     2820  var items = this.getItems( elems );
     2821  this.hide( items );
     2822};
     2823
     2824/**
     2825 * get Outlayer.Item, given an Element
     2826 * @param {Element} elem
     2827 * @param {Function} callback
     2828 * @returns {Outlayer.Item} item
     2829 */
     2830Outlayer.prototype.getItem = function( elem ) {
     2831  // loop through items to get the one that matches
     2832  for ( var i=0, len = this.items.length; i < len; i++ ) {
     2833    var item = this.items[i];
     2834    if ( item.element === elem ) {
     2835      // return item
     2836      return item;
     2837    }
     2838  }
     2839};
     2840
     2841/**
     2842 * get collection of Outlayer.Items, given Elements
     2843 * @param {Array} elems
     2844 * @returns {Array} items - Outlayer.Items
     2845 */
     2846Outlayer.prototype.getItems = function( elems ) {
     2847  elems = utils.makeArray( elems );
     2848  var items = [];
     2849  for ( var i=0, len = elems.length; i < len; i++ ) {
     2850    var elem = elems[i];
     2851    var item = this.getItem( elem );
     2852    if ( item ) {
     2853      items.push( item );
     2854    }
     2855  }
     2856
     2857  return items;
     2858};
     2859
     2860/**
     2861 * remove element(s) from instance and DOM
     2862 * @param {Array or NodeList or Element} elems
     2863 */
     2864Outlayer.prototype.remove = function( elems ) {
     2865  var removeItems = this.getItems( elems );
     2866
     2867  this._emitCompleteOnItems( 'remove', removeItems );
     2868
     2869  // bail if no items to remove
     2870  if ( !removeItems || !removeItems.length ) {
     2871    return;
     2872  }
     2873
     2874  for ( var i=0, len = removeItems.length; i < len; i++ ) {
     2875    var item = removeItems[i];
     2876    item.remove();
     2877    // remove item from collection
     2878    utils.removeFrom( this.items, item );
     2879  }
     2880};
     2881
     2882// ----- destroy ----- //
     2883
     2884// remove and disable Outlayer instance
     2885Outlayer.prototype.destroy = function() {
     2886  // clean up dynamic styles
     2887  var style = this.element.style;
     2888  style.height = '';
     2889  style.position = '';
     2890  style.width = '';
     2891  // destroy items
     2892  for ( var i=0, len = this.items.length; i < len; i++ ) {
     2893    var item = this.items[i];
     2894    item.destroy();
     2895  }
     2896
     2897  this.unbindResize();
     2898
     2899  var id = this.element.outlayerGUID;
     2900  delete instances[ id ]; // remove reference to instance by id
     2901  delete this.element.outlayerGUID;
     2902  // remove data for jQuery
     2903  if ( jQuery ) {
     2904    jQuery.removeData( this.element, this.constructor.namespace );
     2905  }
     2906
     2907};
     2908
     2909// -------------------------- data -------------------------- //
     2910
     2911/**
     2912 * get Outlayer instance from element
     2913 * @param {Element} elem
     2914 * @returns {Outlayer}
     2915 */
     2916Outlayer.data = function( elem ) {
     2917  elem = utils.getQueryElement( elem );
     2918  var id = elem && elem.outlayerGUID;
     2919  return id && instances[ id ];
     2920};
     2921
     2922
     2923// -------------------------- create Outlayer class -------------------------- //
     2924
     2925/**
     2926 * create a layout class
     2927 * @param {String} namespace
     2928 */
     2929Outlayer.create = function( namespace, options ) {
     2930  // sub-class Outlayer
     2931  function Layout() {
     2932    Outlayer.apply( this, arguments );
     2933  }
     2934  // inherit Outlayer prototype, use Object.create if there
     2935  if ( Object.create ) {
     2936    Layout.prototype = Object.create( Outlayer.prototype );
     2937  } else {
     2938    utils.extend( Layout.prototype, Outlayer.prototype );
     2939  }
     2940  // set contructor, used for namespace and Item
     2941  Layout.prototype.constructor = Layout;
     2942
     2943  Layout.defaults = utils.extend( {}, Outlayer.defaults );
     2944  // apply new options
     2945  utils.extend( Layout.defaults, options );
     2946  // keep prototype.settings for backwards compatibility (Packery v1.2.0)
     2947  Layout.prototype.settings = {};
     2948
     2949  Layout.namespace = namespace;
     2950
     2951  Layout.data = Outlayer.data;
     2952
     2953  // sub-class Item
     2954  Layout.Item = function LayoutItem() {
     2955    Item.apply( this, arguments );
     2956  };
     2957
     2958  Layout.Item.prototype = new Item();
     2959
     2960  // -------------------------- declarative -------------------------- //
     2961
     2962  utils.htmlInit( Layout, namespace );
     2963
     2964  // -------------------------- jQuery bridge -------------------------- //
     2965
     2966  // make into jQuery plugin
     2967  if ( jQuery && jQuery.bridget ) {
     2968    jQuery.bridget( namespace, Layout );
     2969  }
     2970
     2971  return Layout;
     2972};
     2973
     2974// ----- fin ----- //
     2975
     2976// back in global
     2977Outlayer.Item = Item;
     2978
     2979return Outlayer;
     2980
     2981}));
     2982
     2983
     2984/*!
     2985 * Masonry v3.3.2
     2986 * Cascading grid layout library
     2987 * http://masonry.desandro.com
     2988 * MIT License
     2989 * by David DeSandro
     2990 */
     2991
     2992( function( window, factory ) {
     2993 
     2994  // universal module definition
     2995  if ( typeof define === 'function' && define.amd ) {
     2996    // AMD
     2997    define( [
     2998        'outlayer/outlayer',
     2999        'get-size/get-size',
     3000        'fizzy-ui-utils/utils'
     3001      ],
     3002      factory );
     3003  } else if ( typeof exports === 'object' ) {
     3004    // CommonJS
     3005    module.exports = factory(
     3006      require('outlayer'),
     3007      require('get-size'),
     3008      require('fizzy-ui-utils')
     3009    );
     3010  } else {
     3011    // browser global
     3012    window.Masonry = factory(
     3013      window.Outlayer,
     3014      window.getSize,
     3015      window.fizzyUIUtils
     3016    );
     3017  }
     3018
     3019}( window, function factory( Outlayer, getSize, utils ) {
     3020
     3021
     3022
     3023// -------------------------- masonryDefinition -------------------------- //
     3024
     3025  // create an Outlayer layout class
     3026  var Masonry = Outlayer.create('masonry');
     3027
     3028  Masonry.prototype._resetLayout = function() {
     3029    this.getSize();
     3030    this._getMeasurement( 'columnWidth', 'outerWidth' );
     3031    this._getMeasurement( 'gutter', 'outerWidth' );
     3032    this.measureColumns();
     3033
     3034    // reset column Y
     3035    var i = this.cols;
     3036    this.colYs = [];
     3037    while (i--) {
     3038      this.colYs.push( 0 );
     3039    }
     3040
     3041    this.maxY = 0;
     3042  };
     3043
     3044  Masonry.prototype.measureColumns = function() {
     3045    this.getContainerWidth();
     3046    // if columnWidth is 0, default to outerWidth of first item
     3047    if ( !this.columnWidth ) {
     3048      var firstItem = this.items[0];
     3049      var firstItemElem = firstItem && firstItem.element;
     3050      // columnWidth fall back to item of first element
     3051      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
     3052        // if first elem has no width, default to size of container
     3053        this.containerWidth;
     3054    }
     3055
     3056    var columnWidth = this.columnWidth += this.gutter;
     3057
     3058    // calculate columns
     3059    var containerWidth = this.containerWidth + this.gutter;
     3060    var cols = containerWidth / columnWidth;
     3061    // fix rounding errors, typically with gutters
     3062    var excess = columnWidth - containerWidth % columnWidth;
     3063    // if overshoot is less than a pixel, round up, otherwise floor it
     3064    var mathMethod = excess && excess < 1 ? 'round' : 'floor';
     3065    cols = Math[ mathMethod ]( cols );
     3066    this.cols = Math.max( cols, 1 );
     3067  };
     3068
     3069  Masonry.prototype.getContainerWidth = function() {
     3070    // container is parent if fit width
     3071    var container = this.options.isFitWidth ? this.element.parentNode : this.element;
     3072    // check that this.size and size are there
     3073    // IE8 triggers resize on body size change, so they might not be
     3074    var size = getSize( container );
     3075    this.containerWidth = size && size.innerWidth;
     3076  };
     3077
     3078  Masonry.prototype._getItemLayoutPosition = function( item ) {
     3079    item.getSize();
     3080    // how many columns does this brick span
     3081    var remainder = item.size.outerWidth % this.columnWidth;
     3082    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
     3083    // round if off by 1 pixel, otherwise use ceil
     3084    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
     3085    colSpan = Math.min( colSpan, this.cols );
     3086
     3087    var colGroup = this._getColGroup( colSpan );
     3088    // get the minimum Y value from the columns
     3089    var minimumY = Math.min.apply( Math, colGroup );
     3090    var shortColIndex = utils.indexOf( colGroup, minimumY );
     3091
     3092    // position the brick
     3093    var position = {
     3094      x: this.columnWidth * shortColIndex,
     3095      y: minimumY
     3096    };
     3097
     3098    // apply setHeight to necessary columns
     3099    var setHeight = minimumY + item.size.outerHeight;
     3100    var setSpan = this.cols + 1 - colGroup.length;
     3101    for ( var i = 0; i < setSpan; i++ ) {
     3102      this.colYs[ shortColIndex + i ] = setHeight;
     3103    }
     3104
     3105    return position;
     3106  };
     3107
     3108  /**
     3109   * @param {Number} colSpan - number of columns the element spans
     3110   * @returns {Array} colGroup
     3111   */
     3112  Masonry.prototype._getColGroup = function( colSpan ) {
     3113    if ( colSpan < 2 ) {
     3114      // if brick spans only one column, use all the column Ys
     3115      return this.colYs;
     3116    }
     3117
     3118    var colGroup = [];
     3119    // how many different places could this brick fit horizontally
     3120    var groupCount = this.cols + 1 - colSpan;
     3121    // for each group potential horizontal position
     3122    for ( var i = 0; i < groupCount; i++ ) {
     3123      // make an array of colY values for that one group
     3124      var groupColYs = this.colYs.slice( i, i + colSpan );
     3125      // and get the max value of the array
     3126      colGroup[i] = Math.max.apply( Math, groupColYs );
     3127    }
     3128    return colGroup;
     3129  };
     3130
     3131  Masonry.prototype._manageStamp = function( stamp ) {
     3132    var stampSize = getSize( stamp );
     3133    var offset = this._getElementOffset( stamp );
     3134    // get the columns that this stamp affects
     3135    var firstX = this.options.isOriginLeft ? offset.left : offset.right;
     3136    var lastX = firstX + stampSize.outerWidth;
     3137    var firstCol = Math.floor( firstX / this.columnWidth );
     3138    firstCol = Math.max( 0, firstCol );
     3139    var lastCol = Math.floor( lastX / this.columnWidth );
     3140    // lastCol should not go over if multiple of columnWidth #425
     3141    lastCol -= lastX % this.columnWidth ? 0 : 1;
     3142    lastCol = Math.min( this.cols - 1, lastCol );
     3143    // set colYs to bottom of the stamp
     3144    var stampMaxY = ( this.options.isOriginTop ? offset.top : offset.bottom ) +
     3145      stampSize.outerHeight;
     3146    for ( var i = firstCol; i <= lastCol; i++ ) {
     3147      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
     3148    }
     3149  };
     3150
     3151  Masonry.prototype._getContainerSize = function() {
     3152    this.maxY = Math.max.apply( Math, this.colYs );
     3153    var size = {
     3154      height: this.maxY
     3155    };
     3156
     3157    if ( this.options.isFitWidth ) {
     3158      size.width = this._getContainerFitWidth();
     3159    }
     3160
     3161    return size;
     3162  };
     3163
     3164  Masonry.prototype._getContainerFitWidth = function() {
     3165    var unusedCols = 0;
     3166    // count unused columns
     3167    var i = this.cols;
     3168    while ( --i ) {
     3169      if ( this.colYs[i] !== 0 ) {
     3170        break;
     3171      }
     3172      unusedCols++;
     3173    }
     3174    // fit container to columns that have been used
     3175    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
     3176  };
     3177
     3178  Masonry.prototype.needsResizeLayout = function() {
     3179    var previousWidth = this.containerWidth;
     3180    this.getContainerWidth();
     3181    return previousWidth !== this.containerWidth;
     3182  };
     3183
     3184  return Masonry;
     3185
     3186}));
     3187
  • wp-includes/js/masonry.min.js

     
    11/*!
    2  * Masonry PACKAGED v3.1.4
     2 * Masonry PACKAGED v3.3.2
    33 * Cascading grid layout library
    44 * http://masonry.desandro.com
    55 * MIT License
     
    66 * by David DeSandro
    77 */
    88
    9 (function(t){function e(){}function i(t){function i(e){e.prototype.option||(e.prototype.option=function(e){t.isPlainObject(e)&&(this.options=t.extend(!0,this.options,e))})}function o(e,i){t.fn[e]=function(o){if("string"==typeof o){for(var s=n.call(arguments,1),a=0,h=this.length;h>a;a++){var p=this[a],u=t.data(p,e);if(u)if(t.isFunction(u[o])&&"_"!==o.charAt(0)){var f=u[o].apply(u,s);if(void 0!==f)return f}else r("no such method '"+o+"' for "+e+" instance");else r("cannot call methods on "+e+" prior to initialization; "+"attempted to call '"+o+"'")}return this}return this.each(function(){var n=t.data(this,e);n?(n.option(o),n._init()):(n=new i(this,o),t.data(this,e,n))})}}if(t){var r="undefined"==typeof console?e:function(t){console.error(t)};return t.bridget=function(t,e){i(e),o(t,e)},t.bridget}}var n=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],i):i(t.jQuery)})(window),function(t){function e(e){var i=t.event;return i.target=i.target||i.srcElement||e,i}var i=document.documentElement,n=function(){};i.addEventListener?n=function(t,e,i){t.addEventListener(e,i,!1)}:i.attachEvent&&(n=function(t,i,n){t[i+n]=n.handleEvent?function(){var i=e(t);n.handleEvent.call(n,i)}:function(){var i=e(t);n.call(t,i)},t.attachEvent("on"+i,t[i+n])});var o=function(){};i.removeEventListener?o=function(t,e,i){t.removeEventListener(e,i,!1)}:i.detachEvent&&(o=function(t,e,i){t.detachEvent("on"+e,t[e+i]);try{delete t[e+i]}catch(n){t[e+i]=void 0}});var r={bind:n,unbind:o};"function"==typeof define&&define.amd?define("eventie/eventie",r):"object"==typeof exports?module.exports=r:t.eventie=r}(this),function(t){function e(t){"function"==typeof t&&(e.isReady?t():r.push(t))}function i(t){var i="readystatechange"===t.type&&"complete"!==o.readyState;if(!e.isReady&&!i){e.isReady=!0;for(var n=0,s=r.length;s>n;n++){var a=r[n];a()}}}function n(n){return n.bind(o,"DOMContentLoaded",i),n.bind(o,"readystatechange",i),n.bind(t,"load",i),e}var o=t.document,r=[];e.isReady=!1,"function"==typeof define&&define.amd?(e.isReady="function"==typeof requirejs,define("doc-ready/doc-ready",["eventie/eventie"],n)):t.docReady=n(t.eventie)}(this),function(){function t(){}function e(t,e){for(var i=t.length;i--;)if(t[i].listener===e)return i;return-1}function i(t){return function(){return this[t].apply(this,arguments)}}var n=t.prototype,o=this,r=o.EventEmitter;n.getListeners=function(t){var e,i,n=this._getEvents();if(t instanceof RegExp){e={};for(i in n)n.hasOwnProperty(i)&&t.test(i)&&(e[i]=n[i])}else e=n[t]||(n[t]=[]);return e},n.flattenListeners=function(t){var e,i=[];for(e=0;t.length>e;e+=1)i.push(t[e].listener);return i},n.getListenersAsObject=function(t){var e,i=this.getListeners(t);return i instanceof Array&&(e={},e[t]=i),e||i},n.addListener=function(t,i){var n,o=this.getListenersAsObject(t),r="object"==typeof i;for(n in o)o.hasOwnProperty(n)&&-1===e(o[n],i)&&o[n].push(r?i:{listener:i,once:!1});return this},n.on=i("addListener"),n.addOnceListener=function(t,e){return this.addListener(t,{listener:e,once:!0})},n.once=i("addOnceListener"),n.defineEvent=function(t){return this.getListeners(t),this},n.defineEvents=function(t){for(var e=0;t.length>e;e+=1)this.defineEvent(t[e]);return this},n.removeListener=function(t,i){var n,o,r=this.getListenersAsObject(t);for(o in r)r.hasOwnProperty(o)&&(n=e(r[o],i),-1!==n&&r[o].splice(n,1));return this},n.off=i("removeListener"),n.addListeners=function(t,e){return this.manipulateListeners(!1,t,e)},n.removeListeners=function(t,e){return this.manipulateListeners(!0,t,e)},n.manipulateListeners=function(t,e,i){var n,o,r=t?this.removeListener:this.addListener,s=t?this.removeListeners:this.addListeners;if("object"!=typeof e||e instanceof RegExp)for(n=i.length;n--;)r.call(this,e,i[n]);else for(n in e)e.hasOwnProperty(n)&&(o=e[n])&&("function"==typeof o?r.call(this,n,o):s.call(this,n,o));return this},n.removeEvent=function(t){var e,i=typeof t,n=this._getEvents();if("string"===i)delete n[t];else if(t instanceof RegExp)for(e in n)n.hasOwnProperty(e)&&t.test(e)&&delete n[e];else delete this._events;return this},n.removeAllListeners=i("removeEvent"),n.emitEvent=function(t,e){var i,n,o,r,s=this.getListenersAsObject(t);for(o in s)if(s.hasOwnProperty(o))for(n=s[o].length;n--;)i=s[o][n],i.once===!0&&this.removeListener(t,i.listener),r=i.listener.apply(this,e||[]),r===this._getOnceReturnValue()&&this.removeListener(t,i.listener);return this},n.trigger=i("emitEvent"),n.emit=function(t){var e=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,e)},n.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},n._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},n._getEvents=function(){return this._events||(this._events={})},t.noConflict=function(){return o.EventEmitter=r,t},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return t}):"object"==typeof module&&module.exports?module.exports=t:this.EventEmitter=t}.call(this),function(t){function e(t){if(t){if("string"==typeof n[t])return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e,o=0,r=i.length;r>o;o++)if(e=i[o]+t,"string"==typeof n[e])return e}}var i="Webkit Moz ms Ms O".split(" "),n=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return e}):"object"==typeof exports?module.exports=e:t.getStyleProperty=e}(window),function(t){function e(t){var e=parseFloat(t),i=-1===t.indexOf("%")&&!isNaN(e);return i&&e}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0,i=s.length;i>e;e++){var n=s[e];t[n]=0}return t}function n(t){function n(t){if("string"==typeof t&&(t=document.querySelector(t)),t&&"object"==typeof t&&t.nodeType){var n=r(t);if("none"===n.display)return i();var o={};o.width=t.offsetWidth,o.height=t.offsetHeight;for(var u=o.isBorderBox=!(!p||!n[p]||"border-box"!==n[p]),f=0,c=s.length;c>f;f++){var d=s[f],l=n[d];l=a(t,l);var m=parseFloat(l);o[d]=isNaN(m)?0:m}var y=o.paddingLeft+o.paddingRight,g=o.paddingTop+o.paddingBottom,v=o.marginLeft+o.marginRight,b=o.marginTop+o.marginBottom,_=o.borderLeftWidth+o.borderRightWidth,E=o.borderTopWidth+o.borderBottomWidth,L=u&&h,x=e(n.width);x!==!1&&(o.width=x+(L?0:y+_));var z=e(n.height);return z!==!1&&(o.height=z+(L?0:g+E)),o.innerWidth=o.width-(y+_),o.innerHeight=o.height-(g+E),o.outerWidth=o.width+v,o.outerHeight=o.height+b,o}}function a(t,e){if(o||-1===e.indexOf("%"))return e;var i=t.style,n=i.left,r=t.runtimeStyle,s=r&&r.left;return s&&(r.left=t.currentStyle.left),i.left=e,e=i.pixelLeft,i.left=n,s&&(r.left=s),e}var h,p=t("boxSizing");return function(){if(p){var t=document.createElement("div");t.style.width="200px",t.style.padding="1px 2px 3px 4px",t.style.borderStyle="solid",t.style.borderWidth="1px 2px 3px 4px",t.style[p]="border-box";var i=document.body||document.documentElement;i.appendChild(t);var n=r(t);h=200===e(n.width),i.removeChild(t)}}(),n}var o=t.getComputedStyle,r=o?function(t){return o(t,null)}:function(t){return t.currentStyle},s=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],n):"object"==typeof exports?module.exports=n(require("get-style-property")):t.getSize=n(t.getStyleProperty)}(window),function(t,e){function i(t,e){return t[a](e)}function n(t){if(!t.parentNode){var e=document.createDocumentFragment();e.appendChild(t)}}function o(t,e){n(t);for(var i=t.parentNode.querySelectorAll(e),o=0,r=i.length;r>o;o++)if(i[o]===t)return!0;return!1}function r(t,e){return n(t),i(t,e)}var s,a=function(){if(e.matchesSelector)return"matchesSelector";for(var t=["webkit","moz","ms","o"],i=0,n=t.length;n>i;i++){var o=t[i],r=o+"MatchesSelector";if(e[r])return r}}();if(a){var h=document.createElement("div"),p=i(h,"div");s=p?i:r}else s=o;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return s}):window.matchesSelector=s}(this,Element.prototype),function(t){function e(t,e){for(var i in e)t[i]=e[i];return t}function i(t){for(var e in t)return!1;return e=null,!0}function n(t){return t.replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()})}function o(t,o,r){function a(t,e){t&&(this.element=t,this.layout=e,this.position={x:0,y:0},this._create())}var h=r("transition"),p=r("transform"),u=h&&p,f=!!r("perspective"),c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[h],d=["transform","transition","transitionDuration","transitionProperty"],l=function(){for(var t={},e=0,i=d.length;i>e;e++){var n=d[e],o=r(n);o&&o!==n&&(t[n]=o)}return t}();e(a.prototype,t.prototype),a.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},a.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},a.prototype.getSize=function(){this.size=o(this.element)},a.prototype.css=function(t){var e=this.element.style;for(var i in t){var n=l[i]||i;e[n]=t[i]}},a.prototype.getPosition=function(){var t=s(this.element),e=this.layout.options,i=e.isOriginLeft,n=e.isOriginTop,o=parseInt(t[i?"left":"right"],10),r=parseInt(t[n?"top":"bottom"],10);o=isNaN(o)?0:o,r=isNaN(r)?0:r;var a=this.layout.size;o-=i?a.paddingLeft:a.paddingRight,r-=n?a.paddingTop:a.paddingBottom,this.position.x=o,this.position.y=r},a.prototype.layoutPosition=function(){var t=this.layout.size,e=this.layout.options,i={};e.isOriginLeft?(i.left=this.position.x+t.paddingLeft+"px",i.right=""):(i.right=this.position.x+t.paddingRight+"px",i.left=""),e.isOriginTop?(i.top=this.position.y+t.paddingTop+"px",i.bottom=""):(i.bottom=this.position.y+t.paddingBottom+"px",i.top=""),this.css(i),this.emitEvent("layout",[this])};var m=f?function(t,e){return"translate3d("+t+"px, "+e+"px, 0)"}:function(t,e){return"translate("+t+"px, "+e+"px)"};a.prototype._transitionTo=function(t,e){this.getPosition();var i=this.position.x,n=this.position.y,o=parseInt(t,10),r=parseInt(e,10),s=o===this.position.x&&r===this.position.y;if(this.setPosition(t,e),s&&!this.isTransitioning)return this.layoutPosition(),void 0;var a=t-i,h=e-n,p={},u=this.layout.options;a=u.isOriginLeft?a:-a,h=u.isOriginTop?h:-h,p.transform=m(a,h),this.transition({to:p,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},a.prototype.goTo=function(t,e){this.setPosition(t,e),this.layoutPosition()},a.prototype.moveTo=u?a.prototype._transitionTo:a.prototype.goTo,a.prototype.setPosition=function(t,e){this.position.x=parseInt(t,10),this.position.y=parseInt(e,10)},a.prototype._nonTransition=function(t){this.css(t.to),t.isCleaning&&this._removeStyles(t.to);for(var e in t.onTransitionEnd)t.onTransitionEnd[e].call(this)},a.prototype._transition=function(t){if(!parseFloat(this.layout.options.transitionDuration))return this._nonTransition(t),void 0;var e=this._transn;for(var i in t.onTransitionEnd)e.onEnd[i]=t.onTransitionEnd[i];for(i in t.to)e.ingProperties[i]=!0,t.isCleaning&&(e.clean[i]=!0);if(t.from){this.css(t.from);var n=this.element.offsetHeight;n=null}this.enableTransition(t.to),this.css(t.to),this.isTransitioning=!0};var y=p&&n(p)+",opacity";a.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:y,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(c,this,!1))},a.prototype.transition=a.prototype[h?"_transition":"_nonTransition"],a.prototype.onwebkitTransitionEnd=function(t){this.ontransitionend(t)},a.prototype.onotransitionend=function(t){this.ontransitionend(t)};var g={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};a.prototype.ontransitionend=function(t){if(t.target===this.element){var e=this._transn,n=g[t.propertyName]||t.propertyName;if(delete e.ingProperties[n],i(e.ingProperties)&&this.disableTransition(),n in e.clean&&(this.element.style[t.propertyName]="",delete e.clean[n]),n in e.onEnd){var o=e.onEnd[n];o.call(this),delete e.onEnd[n]}this.emitEvent("transitionEnd",[this])}},a.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(c,this,!1),this.isTransitioning=!1},a.prototype._removeStyles=function(t){var e={};for(var i in t)e[i]="";this.css(e)};var v={transitionProperty:"",transitionDuration:""};return a.prototype.removeTransitionStyles=function(){this.css(v)},a.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.emitEvent("remove",[this])},a.prototype.remove=function(){if(!h||!parseFloat(this.layout.options.transitionDuration))return this.removeElem(),void 0;var t=this;this.on("transitionEnd",function(){return t.removeElem(),!0}),this.hide()},a.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var t=this.layout.options;this.transition({from:t.hiddenStyle,to:t.visibleStyle,isCleaning:!0})},a.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var t=this.layout.options;this.transition({from:t.visibleStyle,to:t.hiddenStyle,isCleaning:!0,onTransitionEnd:{opacity:function(){this.isHidden&&this.css({display:"none"})}}})},a.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},a}var r=document.defaultView,s=r&&r.getComputedStyle?function(t){return r.getComputedStyle(t,null)}:function(t){return t.currentStyle};"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property"],o):(t.Outlayer={},t.Outlayer.Item=o(t.EventEmitter,t.getSize,t.getStyleProperty))}(window),function(t){function e(t,e){for(var i in e)t[i]=e[i];return t}function i(t){return"[object Array]"===f.call(t)}function n(t){var e=[];if(i(t))e=t;else if(t&&"number"==typeof t.length)for(var n=0,o=t.length;o>n;n++)e.push(t[n]);else e.push(t);return e}function o(t,e){var i=d(e,t);-1!==i&&e.splice(i,1)}function r(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()}function s(i,s,f,d,l,m){function y(t,i){if("string"==typeof t&&(t=a.querySelector(t)),!t||!c(t))return h&&h.error("Bad "+this.constructor.namespace+" element: "+t),void 0;this.element=t,this.options=e({},this.options),this.option(i);var n=++v;this.element.outlayerGUID=n,b[n]=this,this._create(),this.options.isInitLayout&&this.layout()}function g(t,i){t.prototype[i]=e({},y.prototype[i])}var v=0,b={};return y.namespace="outlayer",y.Item=m,y.prototype.options={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e(y.prototype,f.prototype),y.prototype.option=function(t){e(this.options,t)},y.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},y.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},y.prototype._itemize=function(t){for(var e=this._filterFindItemElements(t),i=this.constructor.Item,n=[],o=0,r=e.length;r>o;o++){var s=e[o],a=new i(s,this);n.push(a)}return n},y.prototype._filterFindItemElements=function(t){t=n(t);for(var e=this.options.itemSelector,i=[],o=0,r=t.length;r>o;o++){var s=t[o];if(c(s))if(e){l(s,e)&&i.push(s);for(var a=s.querySelectorAll(e),h=0,p=a.length;p>h;h++)i.push(a[h])}else i.push(s)}return i},y.prototype.getItemElements=function(){for(var t=[],e=0,i=this.items.length;i>e;e++)t.push(this.items[e].element);return t},y.prototype.layout=function(){this._resetLayout(),this._manageStamps();var t=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,t),this._isLayoutInited=!0},y.prototype._init=y.prototype.layout,y.prototype._resetLayout=function(){this.getSize()},y.prototype.getSize=function(){this.size=d(this.element)},y.prototype._getMeasurement=function(t,e){var i,n=this.options[t];n?("string"==typeof n?i=this.element.querySelector(n):c(n)&&(i=n),this[t]=i?d(i)[e]:n):this[t]=0},y.prototype.layoutItems=function(t,e){t=this._getItemsForLayout(t),this._layoutItems(t,e),this._postLayout()},y.prototype._getItemsForLayout=function(t){for(var e=[],i=0,n=t.length;n>i;i++){var o=t[i];o.isIgnored||e.push(o)}return e},y.prototype._layoutItems=function(t,e){function i(){n.emitEvent("layoutComplete",[n,t])}var n=this;if(!t||!t.length)return i(),void 0;this._itemsOn(t,"layout",i);for(var o=[],r=0,s=t.length;s>r;r++){var a=t[r],h=this._getItemLayoutPosition(a);h.item=a,h.isInstant=e||a.isLayoutInstant,o.push(h)}this._processLayoutQueue(o)},y.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},y.prototype._processLayoutQueue=function(t){for(var e=0,i=t.length;i>e;e++){var n=t[e];this._positionItem(n.item,n.x,n.y,n.isInstant)}},y.prototype._positionItem=function(t,e,i,n){n?t.goTo(e,i):t.moveTo(e,i)},y.prototype._postLayout=function(){var t=this._getContainerSize();t&&(this._setContainerMeasure(t.width,!0),this._setContainerMeasure(t.height,!1))},y.prototype._getContainerSize=u,y.prototype._setContainerMeasure=function(t,e){if(void 0!==t){var i=this.size;i.isBorderBox&&(t+=e?i.paddingLeft+i.paddingRight+i.borderLeftWidth+i.borderRightWidth:i.paddingBottom+i.paddingTop+i.borderTopWidth+i.borderBottomWidth),t=Math.max(t,0),this.element.style[e?"width":"height"]=t+"px"}},y.prototype._itemsOn=function(t,e,i){function n(){return o++,o===r&&i.call(s),!0}for(var o=0,r=t.length,s=this,a=0,h=t.length;h>a;a++){var p=t[a];p.on(e,n)}},y.prototype.ignore=function(t){var e=this.getItem(t);e&&(e.isIgnored=!0)},y.prototype.unignore=function(t){var e=this.getItem(t);e&&delete e.isIgnored},y.prototype.stamp=function(t){if(t=this._find(t)){this.stamps=this.stamps.concat(t);for(var e=0,i=t.length;i>e;e++){var n=t[e];this.ignore(n)}}},y.prototype.unstamp=function(t){if(t=this._find(t))for(var e=0,i=t.length;i>e;e++){var n=t[e];o(n,this.stamps),this.unignore(n)}},y.prototype._find=function(t){return t?("string"==typeof t&&(t=this.element.querySelectorAll(t)),t=n(t)):void 0},y.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var t=0,e=this.stamps.length;e>t;t++){var i=this.stamps[t];this._manageStamp(i)}}},y.prototype._getBoundingRect=function(){var t=this.element.getBoundingClientRect(),e=this.size;this._boundingRect={left:t.left+e.paddingLeft+e.borderLeftWidth,top:t.top+e.paddingTop+e.borderTopWidth,right:t.right-(e.paddingRight+e.borderRightWidth),bottom:t.bottom-(e.paddingBottom+e.borderBottomWidth)}},y.prototype._manageStamp=u,y.prototype._getElementOffset=function(t){var e=t.getBoundingClientRect(),i=this._boundingRect,n=d(t),o={left:e.left-i.left-n.marginLeft,top:e.top-i.top-n.marginTop,right:i.right-e.right-n.marginRight,bottom:i.bottom-e.bottom-n.marginBottom};return o},y.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},y.prototype.bindResize=function(){this.isResizeBound||(i.bind(t,"resize",this),this.isResizeBound=!0)},y.prototype.unbindResize=function(){i.unbind(t,"resize",this),this.isResizeBound=!1},y.prototype.onresize=function(){function t(){e.resize(),delete e.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var e=this;this.resizeTimeout=setTimeout(t,100)},y.prototype.resize=function(){var t=d(this.element),e=this.size&&t;e&&t.innerWidth===this.size.innerWidth||this.layout()},y.prototype.addItems=function(t){var e=this._itemize(t);return e.length&&(this.items=this.items.concat(e)),e},y.prototype.appended=function(t){var e=this.addItems(t);e.length&&(this.layoutItems(e,!0),this.reveal(e))},y.prototype.prepended=function(t){var e=this._itemize(t);if(e.length){var i=this.items.slice(0);this.items=e.concat(i),this._resetLayout(),this._manageStamps(),this.layoutItems(e,!0),this.reveal(e),this.layoutItems(i)}},y.prototype.reveal=function(t){var e=t&&t.length;if(e)for(var i=0;e>i;i++){var n=t[i];n.reveal()}},y.prototype.hide=function(t){var e=t&&t.length;if(e)for(var i=0;e>i;i++){var n=t[i];n.hide()}},y.prototype.getItem=function(t){for(var e=0,i=this.items.length;i>e;e++){var n=this.items[e];if(n.element===t)return n}},y.prototype.getItems=function(t){if(t&&t.length){for(var e=[],i=0,n=t.length;n>i;i++){var o=t[i],r=this.getItem(o);r&&e.push(r)}return e}},y.prototype.remove=function(t){t=n(t);var e=this.getItems(t);if(e&&e.length){this._itemsOn(e,"remove",function(){this.emitEvent("removeComplete",[this,e])});for(var i=0,r=e.length;r>i;i++){var s=e[i];s.remove(),o(s,this.items)}}},y.prototype.destroy=function(){var t=this.element.style;t.height="",t.position="",t.width="";for(var e=0,i=this.items.length;i>e;e++){var n=this.items[e];n.destroy()}this.unbindResize(),delete this.element.outlayerGUID,p&&p.removeData(this.element,this.constructor.namespace)},y.data=function(t){var e=t&&t.outlayerGUID;return e&&b[e]},y.create=function(t,i){function n(){y.apply(this,arguments)}return Object.create?n.prototype=Object.create(y.prototype):e(n.prototype,y.prototype),n.prototype.constructor=n,g(n,"options"),e(n.prototype.options,i),n.namespace=t,n.data=y.data,n.Item=function(){m.apply(this,arguments)},n.Item.prototype=new m,s(function(){for(var e=r(t),i=a.querySelectorAll(".js-"+e),o="data-"+e+"-options",s=0,u=i.length;u>s;s++){var f,c=i[s],d=c.getAttribute(o);try{f=d&&JSON.parse(d)}catch(l){h&&h.error("Error parsing "+o+" on "+c.nodeName.toLowerCase()+(c.id?"#"+c.id:"")+": "+l);continue}var m=new n(c,f);p&&p.data(c,t,m)}}),p&&p.bridget&&p.bridget(t,n),n},y.Item=m,y}var a=t.document,h=t.console,p=t.jQuery,u=function(){},f=Object.prototype.toString,c="object"==typeof HTMLElement?function(t){return t instanceof HTMLElement}:function(t){return t&&"object"==typeof t&&1===t.nodeType&&"string"==typeof t.nodeName},d=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i;return-1};"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","doc-ready/doc-ready","eventEmitter/EventEmitter","get-size/get-size","matches-selector/matches-selector","./item"],s):t.Outlayer=s(t.eventie,t.docReady,t.EventEmitter,t.getSize,t.matchesSelector,t.Outlayer.Item)}(window),function(t){function e(t,e){var n=t.create("masonry");return n.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var t=this.cols;for(this.colYs=[];t--;)this.colYs.push(0);this.maxY=0},n.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var t=this.items[0],i=t&&t.element;this.columnWidth=i&&e(i).outerWidth||this.containerWidth}this.columnWidth+=this.gutter,this.cols=Math.floor((this.containerWidth+this.gutter)/this.columnWidth),this.cols=Math.max(this.cols,1)},n.prototype.getContainerWidth=function(){var t=this.options.isFitWidth?this.element.parentNode:this.element,i=e(t);this.containerWidth=i&&i.innerWidth},n.prototype._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,n=e&&1>e?"round":"ceil",o=Math[n](t.size.outerWidth/this.columnWidth);o=Math.min(o,this.cols);for(var r=this._getColGroup(o),s=Math.min.apply(Math,r),a=i(r,s),h={x:this.columnWidth*a,y:s},p=s+t.size.outerHeight,u=this.cols+1-r.length,f=0;u>f;f++)this.colYs[a+f]=p;return h},n.prototype._getColGroup=function(t){if(2>t)return this.colYs;for(var e=[],i=this.cols+1-t,n=0;i>n;n++){var o=this.colYs.slice(n,n+t);e[n]=Math.max.apply(Math,o)}return e},n.prototype._manageStamp=function(t){var i=e(t),n=this._getElementOffset(t),o=this.options.isOriginLeft?n.left:n.right,r=o+i.outerWidth,s=Math.floor(o/this.columnWidth);s=Math.max(0,s);var a=Math.floor(r/this.columnWidth);a-=r%this.columnWidth?0:1,a=Math.min(this.cols-1,a);for(var h=(this.options.isOriginTop?n.top:n.bottom)+i.outerHeight,p=s;a>=p;p++)this.colYs[p]=Math.max(h,this.colYs[p])},n.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this.options.isFitWidth&&(t.width=this._getContainerFitWidth()),t},n.prototype._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},n.prototype.resize=function(){var t=this.containerWidth;this.getContainerWidth(),t!==this.containerWidth&&this.layout()},n}var i=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var i=0,n=t.length;n>i;i++){var o=t[i];if(o===e)return i}return-1};"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size"],e):t.Masonry=e(t.Outlayer,t.getSize)}(window);
    10 
    11 /*!
    12  * imagesLoaded PACKAGED v3.1.4
    13  * JavaScript is all like "You images are done yet or what?"
    14  * MIT License
    15  */
    16 
    17 (function(){function e(){}function t(e,t){for(var n=e.length;n--;)if(e[n].listener===t)return n;return-1}function n(e){return function(){return this[e].apply(this,arguments)}}var i=e.prototype,r=this,o=r.EventEmitter;i.getListeners=function(e){var t,n,i=this._getEvents();if("object"==typeof e){t={};for(n in i)i.hasOwnProperty(n)&&e.test(n)&&(t[n]=i[n])}else t=i[e]||(i[e]=[]);return t},i.flattenListeners=function(e){var t,n=[];for(t=0;e.length>t;t+=1)n.push(e[t].listener);return n},i.getListenersAsObject=function(e){var t,n=this.getListeners(e);return n instanceof Array&&(t={},t[e]=n),t||n},i.addListener=function(e,n){var i,r=this.getListenersAsObject(e),o="object"==typeof n;for(i in r)r.hasOwnProperty(i)&&-1===t(r[i],n)&&r[i].push(o?n:{listener:n,once:!1});return this},i.on=n("addListener"),i.addOnceListener=function(e,t){return this.addListener(e,{listener:t,once:!0})},i.once=n("addOnceListener"),i.defineEvent=function(e){return this.getListeners(e),this},i.defineEvents=function(e){for(var t=0;e.length>t;t+=1)this.defineEvent(e[t]);return this},i.removeListener=function(e,n){var i,r,o=this.getListenersAsObject(e);for(r in o)o.hasOwnProperty(r)&&(i=t(o[r],n),-1!==i&&o[r].splice(i,1));return this},i.off=n("removeListener"),i.addListeners=function(e,t){return this.manipulateListeners(!1,e,t)},i.removeListeners=function(e,t){return this.manipulateListeners(!0,e,t)},i.manipulateListeners=function(e,t,n){var i,r,o=e?this.removeListener:this.addListener,s=e?this.removeListeners:this.addListeners;if("object"!=typeof t||t instanceof RegExp)for(i=n.length;i--;)o.call(this,t,n[i]);else for(i in t)t.hasOwnProperty(i)&&(r=t[i])&&("function"==typeof r?o.call(this,i,r):s.call(this,i,r));return this},i.removeEvent=function(e){var t,n=typeof e,i=this._getEvents();if("string"===n)delete i[e];else if("object"===n)for(t in i)i.hasOwnProperty(t)&&e.test(t)&&delete i[t];else delete this._events;return this},i.removeAllListeners=n("removeEvent"),i.emitEvent=function(e,t){var n,i,r,o,s=this.getListenersAsObject(e);for(r in s)if(s.hasOwnProperty(r))for(i=s[r].length;i--;)n=s[r][i],n.once===!0&&this.removeListener(e,n.listener),o=n.listener.apply(this,t||[]),o===this._getOnceReturnValue()&&this.removeListener(e,n.listener);return this},i.trigger=n("emitEvent"),i.emit=function(e){var t=Array.prototype.slice.call(arguments,1);return this.emitEvent(e,t)},i.setOnceReturnValue=function(e){return this._onceReturnValue=e,this},i._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},i._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return r.EventEmitter=o,e},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return e}):"object"==typeof module&&module.exports?module.exports=e:this.EventEmitter=e}).call(this),function(e){function t(t){var n=e.event;return n.target=n.target||n.srcElement||t,n}var n=document.documentElement,i=function(){};n.addEventListener?i=function(e,t,n){e.addEventListener(t,n,!1)}:n.attachEvent&&(i=function(e,n,i){e[n+i]=i.handleEvent?function(){var n=t(e);i.handleEvent.call(i,n)}:function(){var n=t(e);i.call(e,n)},e.attachEvent("on"+n,e[n+i])});var r=function(){};n.removeEventListener?r=function(e,t,n){e.removeEventListener(t,n,!1)}:n.detachEvent&&(r=function(e,t,n){e.detachEvent("on"+t,e[t+n]);try{delete e[t+n]}catch(i){e[t+n]=void 0}});var o={bind:i,unbind:r};"function"==typeof define&&define.amd?define("eventie/eventie",o):e.eventie=o}(this),function(e,t){"function"==typeof define&&define.amd?define(["eventEmitter/EventEmitter","eventie/eventie"],function(n,i){return t(e,n,i)}):"object"==typeof exports?module.exports=t(e,require("eventEmitter"),require("eventie")):e.imagesLoaded=t(e,e.EventEmitter,e.eventie)}(this,function(e,t,n){function i(e,t){for(var n in t)e[n]=t[n];return e}function r(e){return"[object Array]"===d.call(e)}function o(e){var t=[];if(r(e))t=e;else if("number"==typeof e.length)for(var n=0,i=e.length;i>n;n++)t.push(e[n]);else t.push(e);return t}function s(e,t,n){if(!(this instanceof s))return new s(e,t);"string"==typeof e&&(e=document.querySelectorAll(e)),this.elements=o(e),this.options=i({},this.options),"function"==typeof t?n=t:i(this.options,t),n&&this.on("always",n),this.getImages(),a&&(this.jqDeferred=new a.Deferred);var r=this;setTimeout(function(){r.check()})}function c(e){this.img=e}function f(e){this.src=e,v[e]=this}var a=e.jQuery,u=e.console,h=u!==void 0,d=Object.prototype.toString;s.prototype=new t,s.prototype.options={},s.prototype.getImages=function(){this.images=[];for(var e=0,t=this.elements.length;t>e;e++){var n=this.elements[e];"IMG"===n.nodeName&&this.addImage(n);for(var i=n.querySelectorAll("img"),r=0,o=i.length;o>r;r++){var s=i[r];this.addImage(s)}}},s.prototype.addImage=function(e){var t=new c(e);this.images.push(t)},s.prototype.check=function(){function e(e,r){return t.options.debug&&h&&u.log("confirm",e,r),t.progress(e),n++,n===i&&t.complete(),!0}var t=this,n=0,i=this.images.length;if(this.hasAnyBroken=!1,!i)return this.complete(),void 0;for(var r=0;i>r;r++){var o=this.images[r];o.on("confirm",e),o.check()}},s.prototype.progress=function(e){this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded;var t=this;setTimeout(function(){t.emit("progress",t,e),t.jqDeferred&&t.jqDeferred.notify&&t.jqDeferred.notify(t,e)})},s.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";this.isComplete=!0;var t=this;setTimeout(function(){if(t.emit(e,t),t.emit("always",t),t.jqDeferred){var n=t.hasAnyBroken?"reject":"resolve";t.jqDeferred[n](t)}})},a&&(a.fn.imagesLoaded=function(e,t){var n=new s(this,e,t);return n.jqDeferred.promise(a(this))}),c.prototype=new t,c.prototype.check=function(){var e=v[this.img.src]||new f(this.img.src);if(e.isConfirmed)return this.confirm(e.isLoaded,"cached was confirmed"),void 0;if(this.img.complete&&void 0!==this.img.naturalWidth)return this.confirm(0!==this.img.naturalWidth,"naturalWidth"),void 0;var t=this;e.on("confirm",function(e,n){return t.confirm(e.isLoaded,n),!0}),e.check()},c.prototype.confirm=function(e,t){this.isLoaded=e,this.emit("confirm",this,t)};var v={};return f.prototype=new t,f.prototype.check=function(){if(!this.isChecked){var e=new Image;n.bind(e,"load",this),n.bind(e,"error",this),e.src=this.src,this.isChecked=!0}},f.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},f.prototype.onload=function(e){this.confirm(!0,"onload"),this.unbindProxyEvents(e)},f.prototype.onerror=function(e){this.confirm(!1,"onerror"),this.unbindProxyEvents(e)},f.prototype.confirm=function(e,t){this.isConfirmed=!0,this.isLoaded=e,this.emit("confirm",this,t)},f.prototype.unbindProxyEvents=function(e){n.unbind(e.target,"load",this),n.unbind(e.target,"error",this)},s});
    18  No newline at end of file
     9!function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}return this.each(function(){var d=a.data(this,b);d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d))})}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],c):c("object"==typeof exports?require("jquery"):a.jQuery)}(window),function(a){function b(b){var c=a.event;return c.target=c.target||c.srcElement||b,c}var c=document.documentElement,d=function(){};c.addEventListener?d=function(a,b,c){a.addEventListener(b,c,!1)}:c.attachEvent&&(d=function(a,c,d){a[c+d]=d.handleEvent?function(){var c=b(a);d.handleEvent.call(d,c)}:function(){var c=b(a);d.call(a,c)},a.attachEvent("on"+c,a[c+d])});var e=function(){};c.removeEventListener?e=function(a,b,c){a.removeEventListener(b,c,!1)}:c.detachEvent&&(e=function(a,b,c){a.detachEvent("on"+b,a[b+c]);try{delete a[b+c]}catch(d){a[b+c]=void 0}});var f={bind:d,unbind:e};"function"==typeof define&&define.amd?define("eventie/eventie",f):"object"==typeof exports?module.exports=f:a.eventie=f}(window),function(){function a(){}function b(a,b){for(var c=a.length;c--;)if(a[c].listener===b)return c;return-1}function c(a){return function(){return this[a].apply(this,arguments)}}var d=a.prototype,e=this,f=e.EventEmitter;d.getListeners=function(a){var b,c,d=this._getEvents();if(a instanceof RegExp){b={};for(c in d)d.hasOwnProperty(c)&&a.test(c)&&(b[c]=d[c])}else b=d[a]||(d[a]=[]);return b},d.flattenListeners=function(a){var b,c=[];for(b=0;b<a.length;b+=1)c.push(a[b].listener);return c},d.getListenersAsObject=function(a){var b,c=this.getListeners(a);return c instanceof Array&&(b={},b[a]=c),b||c},d.addListener=function(a,c){var d,e=this.getListenersAsObject(a),f="object"==typeof c;for(d in e)e.hasOwnProperty(d)&&-1===b(e[d],c)&&e[d].push(f?c:{listener:c,once:!1});return this},d.on=c("addListener"),d.addOnceListener=function(a,b){return this.addListener(a,{listener:b,once:!0})},d.once=c("addOnceListener"),d.defineEvent=function(a){return this.getListeners(a),this},d.defineEvents=function(a){for(var b=0;b<a.length;b+=1)this.defineEvent(a[b]);return this},d.removeListener=function(a,c){var d,e,f=this.getListenersAsObject(a);for(e in f)f.hasOwnProperty(e)&&(d=b(f[e],c),-1!==d&&f[e].splice(d,1));return this},d.off=c("removeListener"),d.addListeners=function(a,b){return this.manipulateListeners(!1,a,b)},d.removeListeners=function(a,b){return this.manipulateListeners(!0,a,b)},d.manipulateListeners=function(a,b,c){var d,e,f=a?this.removeListener:this.addListener,g=a?this.removeListeners:this.addListeners;if("object"!=typeof b||b instanceof RegExp)for(d=c.length;d--;)f.call(this,b,c[d]);else for(d in b)b.hasOwnProperty(d)&&(e=b[d])&&("function"==typeof e?f.call(this,d,e):g.call(this,d,e));return this},d.removeEvent=function(a){var b,c=typeof a,d=this._getEvents();if("string"===c)delete d[a];else if(a instanceof RegExp)for(b in d)d.hasOwnProperty(b)&&a.test(b)&&delete d[b];else delete this._events;return this},d.removeAllListeners=c("removeEvent"),d.emitEvent=function(a,b){var c,d,e,f,g=this.getListenersAsObject(a);for(e in g)if(g.hasOwnProperty(e))for(d=g[e].length;d--;)c=g[e][d],c.once===!0&&this.removeListener(a,c.listener),f=c.listener.apply(this,b||[]),f===this._getOnceReturnValue()&&this.removeListener(a,c.listener);return this},d.trigger=c("emitEvent"),d.emit=function(a){var b=Array.prototype.slice.call(arguments,1);return this.emitEvent(a,b)},d.setOnceReturnValue=function(a){return this._onceReturnValue=a,this},d._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},d._getEvents=function(){return this._events||(this._events={})},a.noConflict=function(){return e.EventEmitter=f,a},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return a}):"object"==typeof module&&module.exports?module.exports=a:e.EventEmitter=a}.call(this),function(a){function b(a){if(a){if("string"==typeof d[a])return a;a=a.charAt(0).toUpperCase()+a.slice(1);for(var b,e=0,f=c.length;f>e;e++)if(b=c[e]+a,"string"==typeof d[b])return b}}var c="Webkit Moz ms Ms O".split(" "),d=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return b}):"object"==typeof exports?module.exports=b:a.getStyleProperty=b}(window),function(a){function b(a){var b=parseFloat(a),c=-1===a.indexOf("%")&&!isNaN(b);return c&&b}function c(){}function d(){for(var a={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},b=0,c=g.length;c>b;b++){var d=g[b];a[d]=0}return a}function e(c){function e(){if(!m){m=!0;var d=a.getComputedStyle;if(j=function(){var a=d?function(a){return d(a,null)}:function(a){return a.currentStyle};return function(b){var c=a(b);return c||f("Style returned "+c+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),c}}(),k=c("boxSizing")){var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style[k]="border-box";var g=document.body||document.documentElement;g.appendChild(e);var h=j(e);l=200===b(h.width),g.removeChild(e)}}}function h(a){if(e(),"string"==typeof a&&(a=document.querySelector(a)),a&&"object"==typeof a&&a.nodeType){var c=j(a);if("none"===c.display)return d();var f={};f.width=a.offsetWidth,f.height=a.offsetHeight;for(var h=f.isBorderBox=!(!k||!c[k]||"border-box"!==c[k]),m=0,n=g.length;n>m;m++){var o=g[m],p=c[o];p=i(a,p);var q=parseFloat(p);f[o]=isNaN(q)?0:q}var r=f.paddingLeft+f.paddingRight,s=f.paddingTop+f.paddingBottom,t=f.marginLeft+f.marginRight,u=f.marginTop+f.marginBottom,v=f.borderLeftWidth+f.borderRightWidth,w=f.borderTopWidth+f.borderBottomWidth,x=h&&l,y=b(c.width);y!==!1&&(f.width=y+(x?0:r+v));var z=b(c.height);return z!==!1&&(f.height=z+(x?0:s+w)),f.innerWidth=f.width-(r+v),f.innerHeight=f.height-(s+w),f.outerWidth=f.width+t,f.outerHeight=f.height+u,f}}function i(b,c){if(a.getComputedStyle||-1===c.indexOf("%"))return c;var d=b.style,e=d.left,f=b.runtimeStyle,g=f&&f.left;return g&&(f.left=b.currentStyle.left),d.left=c,c=d.pixelLeft,d.left=e,g&&(f.left=g),c}var j,k,l,m=!1;return h}var f="undefined"==typeof console?c:function(a){console.error(a)},g=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],e):"object"==typeof exports?module.exports=e(require("desandro-get-style-property")):a.getSize=e(a.getStyleProperty)}(window),function(a){function b(a){"function"==typeof a&&(b.isReady?a():g.push(a))}function c(a){var c="readystatechange"===a.type&&"complete"!==f.readyState;b.isReady||c||d()}function d(){b.isReady=!0;for(var a=0,c=g.length;c>a;a++){var d=g[a];d()}}function e(e){return"complete"===f.readyState?d():(e.bind(f,"DOMContentLoaded",c),e.bind(f,"readystatechange",c),e.bind(a,"load",c)),b}var f=a.document,g=[];b.isReady=!1,"function"==typeof define&&define.amd?define("doc-ready/doc-ready",["eventie/eventie"],e):"object"==typeof exports?module.exports=e(require("eventie")):a.docReady=e(a.eventie)}(window),function(a){function b(a,b){return a[g](b)}function c(a){if(!a.parentNode){var b=document.createDocumentFragment();b.appendChild(a)}}function d(a,b){c(a);for(var d=a.parentNode.querySelectorAll(b),e=0,f=d.length;f>e;e++)if(d[e]===a)return!0;return!1}function e(a,d){return c(a),b(a,d)}var f,g=function(){if(a.matches)return"matches";if(a.matchesSelector)return"matchesSelector";for(var b=["webkit","moz","ms","o"],c=0,d=b.length;d>c;c++){var e=b[c],f=e+"MatchesSelector";if(a[f])return f}}();if(g){var h=document.createElement("div"),i=b(h,"div");f=i?b:e}else f=d;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return f}):"object"==typeof exports?module.exports=f:window.matchesSelector=f}(Element.prototype),function(a,b){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["doc-ready/doc-ready","matches-selector/matches-selector"],function(c,d){return b(a,c,d)}):"object"==typeof exports?module.exports=b(a,require("doc-ready"),require("desandro-matches-selector")):a.fizzyUIUtils=b(a,a.docReady,a.matchesSelector)}(window,function(a,b,c){var d={};d.extend=function(a,b){for(var c in b)a[c]=b[c];return a},d.modulo=function(a,b){return(a%b+b)%b};var e=Object.prototype.toString;d.isArray=function(a){return"[object Array]"==e.call(a)},d.makeArray=function(a){var b=[];if(d.isArray(a))b=a;else if(a&&"number"==typeof a.length)for(var c=0,e=a.length;e>c;c++)b.push(a[c]);else b.push(a);return b},d.indexOf=Array.prototype.indexOf?function(a,b){return a.indexOf(b)}:function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},d.removeFrom=function(a,b){var c=d.indexOf(a,b);-1!=c&&a.splice(c,1)},d.isElement="function"==typeof HTMLElement||"object"==typeof HTMLElement?function(a){return a instanceof HTMLElement}:function(a){return a&&"object"==typeof a&&1==a.nodeType&&"string"==typeof a.nodeName},d.setText=function(){function a(a,c){b=b||(void 0!==document.documentElement.textContent?"textContent":"innerText"),a[b]=c}var b;return a}(),d.getParent=function(a,b){for(;a!=document.body;)if(a=a.parentNode,c(a,b))return a},d.getQueryElement=function(a){return"string"==typeof a?document.querySelector(a):a},d.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},d.filterFindElements=function(a,b){a=d.makeArray(a);for(var e=[],f=0,g=a.length;g>f;f++){var h=a[f];if(d.isElement(h))if(b){c(h,b)&&e.push(h);for(var i=h.querySelectorAll(b),j=0,k=i.length;k>j;j++)e.push(i[j])}else e.push(h)}return e},d.debounceMethod=function(a,b,c){var d=a.prototype[b],e=b+"Timeout";a.prototype[b]=function(){var a=this[e];a&&clearTimeout(a);var b=arguments,f=this;this[e]=setTimeout(function(){d.apply(f,b),delete f[e]},c||100)}},d.toDashed=function(a){return a.replace(/(.)([A-Z])/g,function(a,b,c){return b+"-"+c}).toLowerCase()};var f=a.console;return d.htmlInit=function(c,e){b(function(){for(var b=d.toDashed(e),g=document.querySelectorAll(".js-"+b),h="data-"+b+"-options",i=0,j=g.length;j>i;i++){var k,l=g[i],m=l.getAttribute(h);try{k=m&&JSON.parse(m)}catch(n){f&&f.error("Error parsing "+h+" on "+l.nodeName.toLowerCase()+(l.id?"#"+l.id:"")+": "+n);continue}var o=new c(l,k),p=a.jQuery;p&&p.data(l,e,o)}})},d}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property","fizzy-ui-utils/utils"],function(c,d,e,f){return b(a,c,d,e,f)}):"object"==typeof exports?module.exports=b(a,require("wolfy87-eventemitter"),require("get-size"),require("desandro-get-style-property"),require("fizzy-ui-utils")):(a.Outlayer={},a.Outlayer.Item=b(a,a.EventEmitter,a.getSize,a.getStyleProperty,a.fizzyUIUtils))}(window,function(a,b,c,d,e){function f(a){for(var b in a)return!1;return b=null,!0}function g(a,b){a&&(this.element=a,this.layout=b,this.position={x:0,y:0},this._create())}function h(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}var i=a.getComputedStyle,j=i?function(a){return i(a,null)}:function(a){return a.currentStyle},k=d("transition"),l=d("transform"),m=k&&l,n=!!d("perspective"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[k],p=["transform","transition","transitionDuration","transitionProperty"],q=function(){for(var a={},b=0,c=p.length;c>b;b++){var e=p[b],f=d(e);f&&f!==e&&(a[e]=f)}return a}();e.extend(g.prototype,b.prototype),g.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.getSize=function(){this.size=c(this.element)},g.prototype.css=function(a){var b=this.element.style;for(var c in a){var d=q[c]||c;b[d]=a[c]}},g.prototype.getPosition=function(){var a=j(this.element),b=this.layout.options,c=b.isOriginLeft,d=b.isOriginTop,e=a[c?"left":"right"],f=a[d?"top":"bottom"],g=this.layout.size,h=-1!=e.indexOf("%")?parseFloat(e)/100*g.width:parseInt(e,10),i=-1!=f.indexOf("%")?parseFloat(f)/100*g.height:parseInt(f,10);h=isNaN(h)?0:h,i=isNaN(i)?0:i,h-=c?g.paddingLeft:g.paddingRight,i-=d?g.paddingTop:g.paddingBottom,this.position.x=h,this.position.y=i},g.prototype.layoutPosition=function(){var a=this.layout.size,b=this.layout.options,c={},d=b.isOriginLeft?"paddingLeft":"paddingRight",e=b.isOriginLeft?"left":"right",f=b.isOriginLeft?"right":"left",g=this.position.x+a[d];c[e]=this.getXValue(g),c[f]="";var h=b.isOriginTop?"paddingTop":"paddingBottom",i=b.isOriginTop?"top":"bottom",j=b.isOriginTop?"bottom":"top",k=this.position.y+a[h];c[i]=this.getYValue(k),c[j]="",this.css(c),this.emitEvent("layout",[this])},g.prototype.getXValue=function(a){var b=this.layout.options;return b.percentPosition&&!b.isHorizontal?a/this.layout.size.width*100+"%":a+"px"},g.prototype.getYValue=function(a){var b=this.layout.options;return b.percentPosition&&b.isHorizontal?a/this.layout.size.height*100+"%":a+"px"},g.prototype._transitionTo=function(a,b){this.getPosition();var c=this.position.x,d=this.position.y,e=parseInt(a,10),f=parseInt(b,10),g=e===this.position.x&&f===this.position.y;if(this.setPosition(a,b),g&&!this.isTransitioning)return void this.layoutPosition();var h=a-c,i=b-d,j={};j.transform=this.getTranslate(h,i),this.transition({to:j,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},g.prototype.getTranslate=function(a,b){var c=this.layout.options;return a=c.isOriginLeft?a:-a,b=c.isOriginTop?b:-b,n?"translate3d("+a+"px, "+b+"px, 0)":"translate("+a+"px, "+b+"px)"},g.prototype.goTo=function(a,b){this.setPosition(a,b),this.layoutPosition()},g.prototype.moveTo=m?g.prototype._transitionTo:g.prototype.goTo,g.prototype.setPosition=function(a,b){this.position.x=parseInt(a,10),this.position.y=parseInt(b,10)},g.prototype._nonTransition=function(a){this.css(a.to),a.isCleaning&&this._removeStyles(a.to);for(var b in a.onTransitionEnd)a.onTransitionEnd[b].call(this)},g.prototype._transition=function(a){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(a);var b=this._transn;for(var c in a.onTransitionEnd)b.onEnd[c]=a.onTransitionEnd[c];for(c in a.to)b.ingProperties[c]=!0,a.isCleaning&&(b.clean[c]=!0);if(a.from){this.css(a.from);var d=this.element.offsetHeight;d=null}this.enableTransition(a.to),this.css(a.to),this.isTransitioning=!0};var r="opacity,"+h(q.transform||"transform");g.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:r,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(o,this,!1))},g.prototype.transition=g.prototype[k?"_transition":"_nonTransition"],g.prototype.onwebkitTransitionEnd=function(a){this.ontransitionend(a)},g.prototype.onotransitionend=function(a){this.ontransitionend(a)};var s={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};g.prototype.ontransitionend=function(a){if(a.target===this.element){var b=this._transn,c=s[a.propertyName]||a.propertyName;if(delete b.ingProperties[c],f(b.ingProperties)&&this.disableTransition(),c in b.clean&&(this.element.style[a.propertyName]="",delete b.clean[c]),c in b.onEnd){var d=b.onEnd[c];d.call(this),delete b.onEnd[c]}this.emitEvent("transitionEnd",[this])}},g.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(o,this,!1),this.isTransitioning=!1},g.prototype._removeStyles=function(a){var b={};for(var c in a)b[c]="";this.css(b)};var t={transitionProperty:"",transitionDuration:""};return g.prototype.removeTransitionStyles=function(){this.css(t)},g.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},g.prototype.remove=function(){if(!k||!parseFloat(this.layout.options.transitionDuration))return void this.removeElem();var a=this;this.once("transitionEnd",function(){a.removeElem()}),this.hide()},g.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("visibleStyle");b[c]=this.onRevealTransitionEnd,this.transition({from:a.hiddenStyle,to:a.visibleStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},g.prototype.getHideRevealTransitionEndProperty=function(a){var b=this.layout.options[a];if(b.opacity)return"opacity";for(var c in b)return c},g.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("hiddenStyle");b[c]=this.onHideTransitionEnd,this.transition({from:a.visibleStyle,to:a.hiddenStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},g.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},g}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","eventEmitter/EventEmitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(c,d,e,f,g){return b(a,c,d,e,f,g)}):"object"==typeof exports?module.exports=b(a,require("eventie"),require("wolfy87-eventemitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):a.Outlayer=b(a,a.eventie,a.EventEmitter,a.getSize,a.fizzyUIUtils,a.Outlayer.Item)}(window,function(a,b,c,d,e,f){function g(a,b){var c=e.getQueryElement(a);if(!c)return void(h&&h.error("Bad element for "+this.constructor.namespace+": "+(c||a)));this.element=c,i&&(this.$element=i(this.element)),this.options=e.extend({},this.constructor.defaults),this.option(b);var d=++k;this.element.outlayerGUID=d,l[d]=this,this._create(),this.options.isInitLayout&&this.layout()}var h=a.console,i=a.jQuery,j=function(){},k=0,l={};return g.namespace="outlayer",g.Item=f,g.defaults={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,isResizingContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e.extend(g.prototype,c.prototype),g.prototype.option=function(a){e.extend(this.options,a)},g.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e.extend(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},g.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},g.prototype._itemize=function(a){for(var b=this._filterFindItemElements(a),c=this.constructor.Item,d=[],e=0,f=b.length;f>e;e++){var g=b[e],h=new c(g,this);d.push(h)}return d},g.prototype._filterFindItemElements=function(a){return e.filterFindElements(a,this.options.itemSelector)},g.prototype.getItemElements=function(){for(var a=[],b=0,c=this.items.length;c>b;b++)a.push(this.items[b].element);return a},g.prototype.layout=function(){this._resetLayout(),this._manageStamps();var a=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,a),this._isLayoutInited=!0},g.prototype._init=g.prototype.layout,g.prototype._resetLayout=function(){this.getSize()},g.prototype.getSize=function(){this.size=d(this.element)},g.prototype._getMeasurement=function(a,b){var c,f=this.options[a];f?("string"==typeof f?c=this.element.querySelector(f):e.isElement(f)&&(c=f),this[a]=c?d(c)[b]:f):this[a]=0},g.prototype.layoutItems=function(a,b){a=this._getItemsForLayout(a),this._layoutItems(a,b),this._postLayout()},g.prototype._getItemsForLayout=function(a){for(var b=[],c=0,d=a.length;d>c;c++){var e=a[c];e.isIgnored||b.push(e)}return b},g.prototype._layoutItems=function(a,b){if(this._emitCompleteOnItems("layout",a),a&&a.length){for(var c=[],d=0,e=a.length;e>d;d++){var f=a[d],g=this._getItemLayoutPosition(f);g.item=f,g.isInstant=b||f.isLayoutInstant,c.push(g)}this._processLayoutQueue(c)}},g.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},g.prototype._processLayoutQueue=function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];this._positionItem(d.item,d.x,d.y,d.isInstant)}},g.prototype._positionItem=function(a,b,c,d){d?a.goTo(b,c):a.moveTo(b,c)},g.prototype._postLayout=function(){this.resizeContainer()},g.prototype.resizeContainer=function(){if(this.options.isResizingContainer){var a=this._getContainerSize();a&&(this._setContainerMeasure(a.width,!0),this._setContainerMeasure(a.height,!1))}},g.prototype._getContainerSize=j,g.prototype._setContainerMeasure=function(a,b){if(void 0!==a){var c=this.size;c.isBorderBox&&(a+=b?c.paddingLeft+c.paddingRight+c.borderLeftWidth+c.borderRightWidth:c.paddingBottom+c.paddingTop+c.borderTopWidth+c.borderBottomWidth),a=Math.max(a,0),this.element.style[b?"width":"height"]=a+"px"}},g.prototype._emitCompleteOnItems=function(a,b){function c(){e.dispatchEvent(a+"Complete",null,[b])}function d(){g++,g===f&&c()}var e=this,f=b.length;if(!b||!f)return void c();for(var g=0,h=0,i=b.length;i>h;h++){var j=b[h];j.once(a,d)}},g.prototype.dispatchEvent=function(a,b,c){var d=b?[b].concat(c):c;if(this.emitEvent(a,d),i)if(this.$element=this.$element||i(this.element),b){var e=i.Event(b);e.type=a,this.$element.trigger(e,c)}else this.$element.trigger(a,c)},g.prototype.ignore=function(a){var b=this.getItem(a);b&&(b.isIgnored=!0)},g.prototype.unignore=function(a){var b=this.getItem(a);b&&delete b.isIgnored},g.prototype.stamp=function(a){if(a=this._find(a)){this.stamps=this.stamps.concat(a);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.ignore(d)}}},g.prototype.unstamp=function(a){if(a=this._find(a))for(var b=0,c=a.length;c>b;b++){var d=a[b];e.removeFrom(this.stamps,d),this.unignore(d)}},g.prototype._find=function(a){return a?("string"==typeof a&&(a=this.element.querySelectorAll(a)),a=e.makeArray(a)):void 0},g.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var a=0,b=this.stamps.length;b>a;a++){var c=this.stamps[a];this._manageStamp(c)}}},g.prototype._getBoundingRect=function(){var a=this.element.getBoundingClientRect(),b=this.size;this._boundingRect={left:a.left+b.paddingLeft+b.borderLeftWidth,top:a.top+b.paddingTop+b.borderTopWidth,right:a.right-(b.paddingRight+b.borderRightWidth),bottom:a.bottom-(b.paddingBottom+b.borderBottomWidth)}},g.prototype._manageStamp=j,g.prototype._getElementOffset=function(a){var b=a.getBoundingClientRect(),c=this._boundingRect,e=d(a),f={left:b.left-c.left-e.marginLeft,top:b.top-c.top-e.marginTop,right:c.right-b.right-e.marginRight,bottom:c.bottom-b.bottom-e.marginBottom};return f},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.bindResize=function(){this.isResizeBound||(b.bind(a,"resize",this),this.isResizeBound=!0)},g.prototype.unbindResize=function(){this.isResizeBound&&b.unbind(a,"resize",this),this.isResizeBound=!1},g.prototype.onresize=function(){function a(){b.resize(),delete b.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var b=this;this.resizeTimeout=setTimeout(a,100)},g.prototype.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},g.prototype.needsResizeLayout=function(){var a=d(this.element),b=this.size&&a;return b&&a.innerWidth!==this.size.innerWidth},g.prototype.addItems=function(a){var b=this._itemize(a);return b.length&&(this.items=this.items.concat(b)),b},g.prototype.appended=function(a){var b=this.addItems(a);b.length&&(this.layoutItems(b,!0),this.reveal(b))},g.prototype.prepended=function(a){var b=this._itemize(a);if(b.length){var c=this.items.slice(0);this.items=b.concat(c),this._resetLayout(),this._manageStamps(),this.layoutItems(b,!0),this.reveal(b),this.layoutItems(c)}},g.prototype.reveal=function(a){this._emitCompleteOnItems("reveal",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.reveal()}},g.prototype.hide=function(a){this._emitCompleteOnItems("hide",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.hide()}},g.prototype.revealItemElements=function(a){var b=this.getItems(a);this.reveal(b)},g.prototype.hideItemElements=function(a){var b=this.getItems(a);this.hide(b)},g.prototype.getItem=function(a){for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];if(d.element===a)return d}},g.prototype.getItems=function(a){a=e.makeArray(a);for(var b=[],c=0,d=a.length;d>c;c++){var f=a[c],g=this.getItem(f);g&&b.push(g)}return b},g.prototype.remove=function(a){var b=this.getItems(a);if(this._emitCompleteOnItems("remove",b),b&&b.length)for(var c=0,d=b.length;d>c;c++){var f=b[c];f.remove(),e.removeFrom(this.items,f)}},g.prototype.destroy=function(){var a=this.element.style;a.height="",a.position="",a.width="";for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];d.destroy()}this.unbindResize();var e=this.element.outlayerGUID;delete l[e],delete this.element.outlayerGUID,i&&i.removeData(this.element,this.constructor.namespace)},g.data=function(a){a=e.getQueryElement(a);var b=a&&a.outlayerGUID;return b&&l[b]},g.create=function(a,b){function c(){g.apply(this,arguments)}return Object.create?c.prototype=Object.create(g.prototype):e.extend(c.prototype,g.prototype),c.prototype.constructor=c,c.defaults=e.extend({},g.defaults),e.extend(c.defaults,b),c.prototype.settings={},c.namespace=a,c.data=g.data,c.Item=function(){f.apply(this,arguments)},c.Item.prototype=new f,e.htmlInit(c,a),i&&i.bridget&&i.bridget(a,c),c},g.Item=f,g}),function(a,b){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","fizzy-ui-utils/utils"],b):"object"==typeof exports?module.exports=b(require("outlayer"),require("get-size"),require("fizzy-ui-utils")):a.Masonry=b(a.Outlayer,a.getSize,a.fizzyUIUtils)}(window,function(a,b,c){var d=a.create("masonry");return d.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var a=this.cols;for(this.colYs=[];a--;)this.colYs.push(0);this.maxY=0},d.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var a=this.items[0],c=a&&a.element;this.columnWidth=c&&b(c).outerWidth||this.containerWidth}var d=this.columnWidth+=this.gutter,e=this.containerWidth+this.gutter,f=e/d,g=d-e%d,h=g&&1>g?"round":"floor";f=Math[h](f),this.cols=Math.max(f,1)},d.prototype.getContainerWidth=function(){var a=this.options.isFitWidth?this.element.parentNode:this.element,c=b(a);this.containerWidth=c&&c.innerWidth},d.prototype._getItemLayoutPosition=function(a){a.getSize();var b=a.size.outerWidth%this.columnWidth,d=b&&1>b?"round":"ceil",e=Math[d](a.size.outerWidth/this.columnWidth);e=Math.min(e,this.cols);for(var f=this._getColGroup(e),g=Math.min.apply(Math,f),h=c.indexOf(f,g),i={x:this.columnWidth*h,y:g},j=g+a.size.outerHeight,k=this.cols+1-f.length,l=0;k>l;l++)this.colYs[h+l]=j;return i},d.prototype._getColGroup=function(a){if(2>a)return this.colYs;for(var b=[],c=this.cols+1-a,d=0;c>d;d++){var e=this.colYs.slice(d,d+a);b[d]=Math.max.apply(Math,e)}return b},d.prototype._manageStamp=function(a){var c=b(a),d=this._getElementOffset(a),e=this.options.isOriginLeft?d.left:d.right,f=e+c.outerWidth,g=Math.floor(e/this.columnWidth);g=Math.max(0,g);var h=Math.floor(f/this.columnWidth);h-=f%this.columnWidth?0:1,h=Math.min(this.cols-1,h);for(var i=(this.options.isOriginTop?d.top:d.bottom)+c.outerHeight,j=g;h>=j;j++)this.colYs[j]=Math.max(i,this.colYs[j])},d.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var a={height:this.maxY};return this.options.isFitWidth&&(a.width=this._getContainerFitWidth()),a},d.prototype._getContainerFitWidth=function(){for(var a=0,b=this.cols;--b&&0===this.colYs[b];)a++;return(this.cols-a)*this.columnWidth-this.gutter},d.prototype.needsResizeLayout=function(){var a=this.containerWidth;return this.getContainerWidth(),a!==this.containerWidth},d});
     10 No newline at end of file
  • wp-includes/script-loader.php

     
    242242        $scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array('jquery', 'jquery-hotkeys'), false, 1 );
    243243        $scripts->add( 'jquery-touch-punch', "/wp-includes/js/jquery/jquery.ui.touch-punch.js", array('jquery-ui-widget', 'jquery-ui-mouse'), '0.2.2', 1 );
    244244
    245         // Masonry v2 depended on jQuery. v3 does not. The older jquery-masonry handle is a shiv.
    246         // It sets jQuery as a dependency, as the theme may have been implicitly loading it this way.
    247         $scripts->add( 'masonry', "/wp-includes/js/masonry.min.js", array(), '3.1.2', 1 );
    248         $scripts->add( 'jquery-masonry', "/wp-includes/js/jquery/jquery.masonry$dev_suffix.js", array( 'jquery', 'masonry' ), '3.1.2', 1 );
     245        $scripts->add( 'imagesLoaded', "/wp-includes/js/imagesloaded$suffix.js", array(), '3.1.8', 1 );
     246        $scripts->add( 'masonry', "/wp-includes/js/masonry$suffix.js", array(), '3.3.2', 1 );
    249247
    250248        $scripts->add( 'thickbox', "/wp-includes/js/thickbox/thickbox.js", array('jquery'), '3.1-20121105', 1 );
    251249        did_action( 'init' ) && $scripts->localize( 'thickbox', 'thickboxL10n', array(