PowerPack Addons for Elementor (Instagram Feed, Pricing Table, Forms Stylers, Display Conditions, Free Elementor Widgets and Elementor Templates) - Version 2.2.2

Version Description

  • December 10, 2020 =
  • Fixed: Instagram Feed - Masonry layout
Download this release

Release Info

Developer ideaboxcreations
Plugin Icon 128x128 PowerPack Addons for Elementor (Instagram Feed, Pricing Table, Forms Stylers, Display Conditions, Free Elementor Widgets and Elementor Templates)
Version 2.2.2
Comparing to
See all releases

Code changes from version 2.2.1 to 2.2.2

assets/lib/isotope/isotope.pkgd.js ADDED
@@ -0,0 +1,3563 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Isotope PACKAGED v3.0.6
3
+ *
4
+ * Licensed GPLv3 for open source use
5
+ * or Isotope Commercial License for commercial use
6
+ *
7
+ * https://isotope.metafizzy.co
8
+ * Copyright 2010-2018 Metafizzy
9
+ */
10
+
11
+ /**
12
+ * Bridget makes jQuery widgets
13
+ * v2.0.1
14
+ * MIT license
15
+ */
16
+
17
+ /* jshint browser: true, strict: true, undef: true, unused: true */
18
+
19
+ ( function( window, factory ) {
20
+ // universal module definition
21
+ /*jshint strict: false */ /* globals define, module, require */
22
+ if ( typeof define == 'function' && define.amd ) {
23
+ // AMD
24
+ define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {
25
+ return factory( window, jQuery );
26
+ });
27
+ } else if ( typeof module == 'object' && module.exports ) {
28
+ // CommonJS
29
+ module.exports = factory(
30
+ window,
31
+ require('jquery')
32
+ );
33
+ } else {
34
+ // browser global
35
+ window.jQueryBridget = factory(
36
+ window,
37
+ window.jQuery
38
+ );
39
+ }
40
+
41
+ }( window, function factory( window, jQuery ) {
42
+ 'use strict';
43
+
44
+ // ----- utils ----- //
45
+
46
+ var arraySlice = Array.prototype.slice;
47
+
48
+ // helper function for logging errors
49
+ // $.error breaks jQuery chaining
50
+ var console = window.console;
51
+ var logError = typeof console == 'undefined' ? function() {} :
52
+ function( message ) {
53
+ console.error( message );
54
+ };
55
+
56
+ // ----- jQueryBridget ----- //
57
+
58
+ function jQueryBridget( namespace, PluginClass, $ ) {
59
+ $ = $ || jQuery || window.jQuery;
60
+ if ( !$ ) {
61
+ return;
62
+ }
63
+
64
+ // add option method -> $().plugin('option', {...})
65
+ if ( !PluginClass.prototype.option ) {
66
+ // option setter
67
+ PluginClass.prototype.option = function( opts ) {
68
+ // bail out if not an object
69
+ if ( !$.isPlainObject( opts ) ){
70
+ return;
71
+ }
72
+ this.options = $.extend( true, this.options, opts );
73
+ };
74
+ }
75
+
76
+ // make jQuery plugin
77
+ $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {
78
+ if ( typeof arg0 == 'string' ) {
79
+ // method call $().plugin( 'methodName', { options } )
80
+ // shift arguments by 1
81
+ var args = arraySlice.call( arguments, 1 );
82
+ return methodCall( this, arg0, args );
83
+ }
84
+ // just $().plugin({ options })
85
+ plainCall( this, arg0 );
86
+ return this;
87
+ };
88
+
89
+ // $().plugin('methodName')
90
+ function methodCall( $elems, methodName, args ) {
91
+ var returnValue;
92
+ var pluginMethodStr = '$().' + namespace + '("' + methodName + '")';
93
+
94
+ $elems.each( function( i, elem ) {
95
+ // get instance
96
+ var instance = $.data( elem, namespace );
97
+ if ( !instance ) {
98
+ logError( namespace + ' not initialized. Cannot call methods, i.e. ' +
99
+ pluginMethodStr );
100
+ return;
101
+ }
102
+
103
+ var method = instance[ methodName ];
104
+ if ( !method || methodName.charAt(0) == '_' ) {
105
+ logError( pluginMethodStr + ' is not a valid method' );
106
+ return;
107
+ }
108
+
109
+ // apply method, get return value
110
+ var value = method.apply( instance, args );
111
+ // set return value if value is returned, use only first value
112
+ returnValue = returnValue === undefined ? value : returnValue;
113
+ });
114
+
115
+ return returnValue !== undefined ? returnValue : $elems;
116
+ }
117
+
118
+ function plainCall( $elems, options ) {
119
+ $elems.each( function( i, elem ) {
120
+ var instance = $.data( elem, namespace );
121
+ if ( instance ) {
122
+ // set options & init
123
+ instance.option( options );
124
+ instance._init();
125
+ } else {
126
+ // initialize new instance
127
+ instance = new PluginClass( elem, options );
128
+ $.data( elem, namespace, instance );
129
+ }
130
+ });
131
+ }
132
+
133
+ updateJQuery( $ );
134
+
135
+ }
136
+
137
+ // ----- updateJQuery ----- //
138
+
139
+ // set $.bridget for v1 backwards compatibility
140
+ function updateJQuery( $ ) {
141
+ if ( !$ || ( $ && $.bridget ) ) {
142
+ return;
143
+ }
144
+ $.bridget = jQueryBridget;
145
+ }
146
+
147
+ updateJQuery( jQuery || window.jQuery );
148
+
149
+ // ----- ----- //
150
+
151
+ return jQueryBridget;
152
+
153
+ }));
154
+
155
+ /**
156
+ * EvEmitter v1.1.0
157
+ * Lil' event emitter
158
+ * MIT License
159
+ */
160
+
161
+ /* jshint unused: true, undef: true, strict: true */
162
+
163
+ ( function( global, factory ) {
164
+ // universal module definition
165
+ /* jshint strict: false */ /* globals define, module, window */
166
+ if ( typeof define == 'function' && define.amd ) {
167
+ // AMD - RequireJS
168
+ define( 'ev-emitter/ev-emitter',factory );
169
+ } else if ( typeof module == 'object' && module.exports ) {
170
+ // CommonJS - Browserify, Webpack
171
+ module.exports = factory();
172
+ } else {
173
+ // Browser globals
174
+ global.EvEmitter = factory();
175
+ }
176
+
177
+ }( typeof window != 'undefined' ? window : this, function() {
178
+
179
+
180
+
181
+ function EvEmitter() {}
182
+
183
+ var proto = EvEmitter.prototype;
184
+
185
+ proto.on = function( eventName, listener ) {
186
+ if ( !eventName || !listener ) {
187
+ return;
188
+ }
189
+ // set events hash
190
+ var events = this._events = this._events || {};
191
+ // set listeners array
192
+ var listeners = events[ eventName ] = events[ eventName ] || [];
193
+ // only add once
194
+ if ( listeners.indexOf( listener ) == -1 ) {
195
+ listeners.push( listener );
196
+ }
197
+
198
+ return this;
199
+ };
200
+
201
+ proto.once = function( eventName, listener ) {
202
+ if ( !eventName || !listener ) {
203
+ return;
204
+ }
205
+ // add event
206
+ this.on( eventName, listener );
207
+ // set once flag
208
+ // set onceEvents hash
209
+ var onceEvents = this._onceEvents = this._onceEvents || {};
210
+ // set onceListeners object
211
+ var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
212
+ // set flag
213
+ onceListeners[ listener ] = true;
214
+
215
+ return this;
216
+ };
217
+
218
+ proto.off = function( eventName, listener ) {
219
+ var listeners = this._events && this._events[ eventName ];
220
+ if ( !listeners || !listeners.length ) {
221
+ return;
222
+ }
223
+ var index = listeners.indexOf( listener );
224
+ if ( index != -1 ) {
225
+ listeners.splice( index, 1 );
226
+ }
227
+
228
+ return this;
229
+ };
230
+
231
+ proto.emitEvent = function( eventName, args ) {
232
+ var listeners = this._events && this._events[ eventName ];
233
+ if ( !listeners || !listeners.length ) {
234
+ return;
235
+ }
236
+ // copy over to avoid interference if .off() in listener
237
+ listeners = listeners.slice(0);
238
+ args = args || [];
239
+ // once stuff
240
+ var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
241
+
242
+ for ( var i=0; i < listeners.length; i++ ) {
243
+ var listener = listeners[i]
244
+ var isOnce = onceListeners && onceListeners[ listener ];
245
+ if ( isOnce ) {
246
+ // remove listener
247
+ // remove before trigger to prevent recursion
248
+ this.off( eventName, listener );
249
+ // unset once flag
250
+ delete onceListeners[ listener ];
251
+ }
252
+ // trigger listener
253
+ listener.apply( this, args );
254
+ }
255
+
256
+ return this;
257
+ };
258
+
259
+ proto.allOff = function() {
260
+ delete this._events;
261
+ delete this._onceEvents;
262
+ };
263
+
264
+ return EvEmitter;
265
+
266
+ }));
267
+
268
+ /*!
269
+ * getSize v2.0.3
270
+ * measure size of elements
271
+ * MIT license
272
+ */
273
+
274
+ /* jshint browser: true, strict: true, undef: true, unused: true */
275
+ /* globals console: false */
276
+
277
+ ( function( window, factory ) {
278
+ /* jshint strict: false */ /* globals define, module */
279
+ if ( typeof define == 'function' && define.amd ) {
280
+ // AMD
281
+ define( 'get-size/get-size',factory );
282
+ } else if ( typeof module == 'object' && module.exports ) {
283
+ // CommonJS
284
+ module.exports = factory();
285
+ } else {
286
+ // browser global
287
+ window.getSize = factory();
288
+ }
289
+
290
+ })( window, function factory() {
291
+ 'use strict';
292
+
293
+ // -------------------------- helpers -------------------------- //
294
+
295
+ // get a number from a string, not a percentage
296
+ function getStyleSize( value ) {
297
+ var num = parseFloat( value );
298
+ // not a percent like '100%', and a number
299
+ var isValid = value.indexOf('%') == -1 && !isNaN( num );
300
+ return isValid && num;
301
+ }
302
+
303
+ function noop() {}
304
+
305
+ var logError = typeof console == 'undefined' ? noop :
306
+ function( message ) {
307
+ console.error( message );
308
+ };
309
+
310
+ // -------------------------- measurements -------------------------- //
311
+
312
+ var measurements = [
313
+ 'paddingLeft',
314
+ 'paddingRight',
315
+ 'paddingTop',
316
+ 'paddingBottom',
317
+ 'marginLeft',
318
+ 'marginRight',
319
+ 'marginTop',
320
+ 'marginBottom',
321
+ 'borderLeftWidth',
322
+ 'borderRightWidth',
323
+ 'borderTopWidth',
324
+ 'borderBottomWidth'
325
+ ];
326
+
327
+ var measurementsLength = measurements.length;
328
+
329
+ function getZeroSize() {
330
+ var size = {
331
+ width: 0,
332
+ height: 0,
333
+ innerWidth: 0,
334
+ innerHeight: 0,
335
+ outerWidth: 0,
336
+ outerHeight: 0
337
+ };
338
+ for ( var i=0; i < measurementsLength; i++ ) {
339
+ var measurement = measurements[i];
340
+ size[ measurement ] = 0;
341
+ }
342
+ return size;
343
+ }
344
+
345
+ // -------------------------- getStyle -------------------------- //
346
+
347
+ /**
348
+ * getStyle, get style of element, check for Firefox bug
349
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
350
+ */
351
+ function getStyle( elem ) {
352
+ var style = getComputedStyle( elem );
353
+ if ( !style ) {
354
+ logError( 'Style returned ' + style +
355
+ '. Are you running this code in a hidden iframe on Firefox? ' +
356
+ 'See https://bit.ly/getsizebug1' );
357
+ }
358
+ return style;
359
+ }
360
+
361
+ // -------------------------- setup -------------------------- //
362
+
363
+ var isSetup = false;
364
+
365
+ var isBoxSizeOuter;
366
+
367
+ /**
368
+ * setup
369
+ * check isBoxSizerOuter
370
+ * do on first getSize() rather than on page load for Firefox bug
371
+ */
372
+ function setup() {
373
+ // setup once
374
+ if ( isSetup ) {
375
+ return;
376
+ }
377
+ isSetup = true;
378
+
379
+ // -------------------------- box sizing -------------------------- //
380
+
381
+ /**
382
+ * Chrome & Safari measure the outer-width on style.width on border-box elems
383
+ * IE11 & Firefox<29 measures the inner-width
384
+ */
385
+ var div = document.createElement('div');
386
+ div.style.width = '200px';
387
+ div.style.padding = '1px 2px 3px 4px';
388
+ div.style.borderStyle = 'solid';
389
+ div.style.borderWidth = '1px 2px 3px 4px';
390
+ div.style.boxSizing = 'border-box';
391
+
392
+ var body = document.body || document.documentElement;
393
+ body.appendChild( div );
394
+ var style = getStyle( div );
395
+ // round value for browser zoom. desandro/masonry#928
396
+ isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
397
+ getSize.isBoxSizeOuter = isBoxSizeOuter;
398
+
399
+ body.removeChild( div );
400
+ }
401
+
402
+ // -------------------------- getSize -------------------------- //
403
+
404
+ function getSize( elem ) {
405
+ setup();
406
+
407
+ // use querySeletor if elem is string
408
+ if ( typeof elem == 'string' ) {
409
+ elem = document.querySelector( elem );
410
+ }
411
+
412
+ // do not proceed on non-objects
413
+ if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
414
+ return;
415
+ }
416
+
417
+ var style = getStyle( elem );
418
+
419
+ // if hidden, everything is 0
420
+ if ( style.display == 'none' ) {
421
+ return getZeroSize();
422
+ }
423
+
424
+ var size = {};
425
+ size.width = elem.offsetWidth;
426
+ size.height = elem.offsetHeight;
427
+
428
+ var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
429
+
430
+ // get all measurements
431
+ for ( var i=0; i < measurementsLength; i++ ) {
432
+ var measurement = measurements[i];
433
+ var value = style[ measurement ];
434
+ var num = parseFloat( value );
435
+ // any 'auto', 'medium' value will be 0
436
+ size[ measurement ] = !isNaN( num ) ? num : 0;
437
+ }
438
+
439
+ var paddingWidth = size.paddingLeft + size.paddingRight;
440
+ var paddingHeight = size.paddingTop + size.paddingBottom;
441
+ var marginWidth = size.marginLeft + size.marginRight;
442
+ var marginHeight = size.marginTop + size.marginBottom;
443
+ var borderWidth = size.borderLeftWidth + size.borderRightWidth;
444
+ var borderHeight = size.borderTopWidth + size.borderBottomWidth;
445
+
446
+ var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
447
+
448
+ // overwrite width and height if we can get it from style
449
+ var styleWidth = getStyleSize( style.width );
450
+ if ( styleWidth !== false ) {
451
+ size.width = styleWidth +
452
+ // add padding and border unless it's already including it
453
+ ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
454
+ }
455
+
456
+ var styleHeight = getStyleSize( style.height );
457
+ if ( styleHeight !== false ) {
458
+ size.height = styleHeight +
459
+ // add padding and border unless it's already including it
460
+ ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
461
+ }
462
+
463
+ size.innerWidth = size.width - ( paddingWidth + borderWidth );
464
+ size.innerHeight = size.height - ( paddingHeight + borderHeight );
465
+
466
+ size.outerWidth = size.width + marginWidth;
467
+ size.outerHeight = size.height + marginHeight;
468
+
469
+ return size;
470
+ }
471
+
472
+ return getSize;
473
+
474
+ });
475
+
476
+ /**
477
+ * matchesSelector v2.0.2
478
+ * matchesSelector( element, '.selector' )
479
+ * MIT license
480
+ */
481
+
482
+ /*jshint browser: true, strict: true, undef: true, unused: true */
483
+
484
+ ( function( window, factory ) {
485
+ /*global define: false, module: false */
486
+ 'use strict';
487
+ // universal module definition
488
+ if ( typeof define == 'function' && define.amd ) {
489
+ // AMD
490
+ define( 'desandro-matches-selector/matches-selector',factory );
491
+ } else if ( typeof module == 'object' && module.exports ) {
492
+ // CommonJS
493
+ module.exports = factory();
494
+ } else {
495
+ // browser global
496
+ window.matchesSelector = factory();
497
+ }
498
+
499
+ }( window, function factory() {
500
+ 'use strict';
501
+
502
+ var matchesMethod = ( function() {
503
+ var ElemProto = window.Element.prototype;
504
+ // check for the standard method name first
505
+ if ( ElemProto.matches ) {
506
+ return 'matches';
507
+ }
508
+ // check un-prefixed
509
+ if ( ElemProto.matchesSelector ) {
510
+ return 'matchesSelector';
511
+ }
512
+ // check vendor prefixes
513
+ var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
514
+
515
+ for ( var i=0; i < prefixes.length; i++ ) {
516
+ var prefix = prefixes[i];
517
+ var method = prefix + 'MatchesSelector';
518
+ if ( ElemProto[ method ] ) {
519
+ return method;
520
+ }
521
+ }
522
+ })();
523
+
524
+ return function matchesSelector( elem, selector ) {
525
+ return elem[ matchesMethod ]( selector );
526
+ };
527
+
528
+ }));
529
+
530
+ /**
531
+ * Fizzy UI utils v2.0.7
532
+ * MIT license
533
+ */
534
+
535
+ /*jshint browser: true, undef: true, unused: true, strict: true */
536
+
537
+ ( function( window, factory ) {
538
+ // universal module definition
539
+ /*jshint strict: false */ /*globals define, module, require */
540
+
541
+ if ( typeof define == 'function' && define.amd ) {
542
+ // AMD
543
+ define( 'fizzy-ui-utils/utils',[
544
+ 'desandro-matches-selector/matches-selector'
545
+ ], function( matchesSelector ) {
546
+ return factory( window, matchesSelector );
547
+ });
548
+ } else if ( typeof module == 'object' && module.exports ) {
549
+ // CommonJS
550
+ module.exports = factory(
551
+ window,
552
+ require('desandro-matches-selector')
553
+ );
554
+ } else {
555
+ // browser global
556
+ window.fizzyUIUtils = factory(
557
+ window,
558
+ window.matchesSelector
559
+ );
560
+ }
561
+
562
+ }( window, function factory( window, matchesSelector ) {
563
+
564
+
565
+
566
+ var utils = {};
567
+
568
+ // ----- extend ----- //
569
+
570
+ // extends objects
571
+ utils.extend = function( a, b ) {
572
+ for ( var prop in b ) {
573
+ a[ prop ] = b[ prop ];
574
+ }
575
+ return a;
576
+ };
577
+
578
+ // ----- modulo ----- //
579
+
580
+ utils.modulo = function( num, div ) {
581
+ return ( ( num % div ) + div ) % div;
582
+ };
583
+
584
+ // ----- makeArray ----- //
585
+
586
+ var arraySlice = Array.prototype.slice;
587
+
588
+ // turn element or nodeList into an array
589
+ utils.makeArray = function( obj ) {
590
+ if ( Array.isArray( obj ) ) {
591
+ // use object if already an array
592
+ return obj;
593
+ }
594
+ // return empty array if undefined or null. #6
595
+ if ( obj === null || obj === undefined ) {
596
+ return [];
597
+ }
598
+
599
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
600
+ if ( isArrayLike ) {
601
+ // convert nodeList to array
602
+ return arraySlice.call( obj );
603
+ }
604
+
605
+ // array of single index
606
+ return [ obj ];
607
+ };
608
+
609
+ // ----- removeFrom ----- //
610
+
611
+ utils.removeFrom = function( ary, obj ) {
612
+ var index = ary.indexOf( obj );
613
+ if ( index != -1 ) {
614
+ ary.splice( index, 1 );
615
+ }
616
+ };
617
+
618
+ // ----- getParent ----- //
619
+
620
+ utils.getParent = function( elem, selector ) {
621
+ while ( elem.parentNode && elem != document.body ) {
622
+ elem = elem.parentNode;
623
+ if ( matchesSelector( elem, selector ) ) {
624
+ return elem;
625
+ }
626
+ }
627
+ };
628
+
629
+ // ----- getQueryElement ----- //
630
+
631
+ // use element as selector string
632
+ utils.getQueryElement = function( elem ) {
633
+ if ( typeof elem == 'string' ) {
634
+ return document.querySelector( elem );
635
+ }
636
+ return elem;
637
+ };
638
+
639
+ // ----- handleEvent ----- //
640
+
641
+ // enable .ontype to trigger from .addEventListener( elem, 'type' )
642
+ utils.handleEvent = function( event ) {
643
+ var method = 'on' + event.type;
644
+ if ( this[ method ] ) {
645
+ this[ method ]( event );
646
+ }
647
+ };
648
+
649
+ // ----- filterFindElements ----- //
650
+
651
+ utils.filterFindElements = function( elems, selector ) {
652
+ // make array of elems
653
+ elems = utils.makeArray( elems );
654
+ var ffElems = [];
655
+
656
+ elems.forEach( function( elem ) {
657
+ // check that elem is an actual element
658
+ if ( !( elem instanceof HTMLElement ) ) {
659
+ return;
660
+ }
661
+ // add elem if no selector
662
+ if ( !selector ) {
663
+ ffElems.push( elem );
664
+ return;
665
+ }
666
+ // filter & find items if we have a selector
667
+ // filter
668
+ if ( matchesSelector( elem, selector ) ) {
669
+ ffElems.push( elem );
670
+ }
671
+ // find children
672
+ var childElems = elem.querySelectorAll( selector );
673
+ // concat childElems to filterFound array
674
+ for ( var i=0; i < childElems.length; i++ ) {
675
+ ffElems.push( childElems[i] );
676
+ }
677
+ });
678
+
679
+ return ffElems;
680
+ };
681
+
682
+ // ----- debounceMethod ----- //
683
+
684
+ utils.debounceMethod = function( _class, methodName, threshold ) {
685
+ threshold = threshold || 100;
686
+ // original method
687
+ var method = _class.prototype[ methodName ];
688
+ var timeoutName = methodName + 'Timeout';
689
+
690
+ _class.prototype[ methodName ] = function() {
691
+ var timeout = this[ timeoutName ];
692
+ clearTimeout( timeout );
693
+
694
+ var args = arguments;
695
+ var _this = this;
696
+ this[ timeoutName ] = setTimeout( function() {
697
+ method.apply( _this, args );
698
+ delete _this[ timeoutName ];
699
+ }, threshold );
700
+ };
701
+ };
702
+
703
+ // ----- docReady ----- //
704
+
705
+ utils.docReady = function( callback ) {
706
+ var readyState = document.readyState;
707
+ if ( readyState == 'complete' || readyState == 'interactive' ) {
708
+ // do async to allow for other scripts to run. metafizzy/flickity#441
709
+ setTimeout( callback );
710
+ } else {
711
+ document.addEventListener( 'DOMContentLoaded', callback );
712
+ }
713
+ };
714
+
715
+ // ----- htmlInit ----- //
716
+
717
+ // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
718
+ utils.toDashed = function( str ) {
719
+ return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
720
+ return $1 + '-' + $2;
721
+ }).toLowerCase();
722
+ };
723
+
724
+ var console = window.console;
725
+ /**
726
+ * allow user to initialize classes via [data-namespace] or .js-namespace class
727
+ * htmlInit( Widget, 'widgetName' )
728
+ * options are parsed from data-namespace-options
729
+ */
730
+ utils.htmlInit = function( WidgetClass, namespace ) {
731
+ utils.docReady( function() {
732
+ var dashedNamespace = utils.toDashed( namespace );
733
+ var dataAttr = 'data-' + dashedNamespace;
734
+ var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
735
+ var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
736
+ var elems = utils.makeArray( dataAttrElems )
737
+ .concat( utils.makeArray( jsDashElems ) );
738
+ var dataOptionsAttr = dataAttr + '-options';
739
+ var jQuery = window.jQuery;
740
+
741
+ elems.forEach( function( elem ) {
742
+ var attr = elem.getAttribute( dataAttr ) ||
743
+ elem.getAttribute( dataOptionsAttr );
744
+ var options;
745
+ try {
746
+ options = attr && JSON.parse( attr );
747
+ } catch ( error ) {
748
+ // log error, do not initialize
749
+ if ( console ) {
750
+ console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
751
+ ': ' + error );
752
+ }
753
+ return;
754
+ }
755
+ // initialize
756
+ var instance = new WidgetClass( elem, options );
757
+ // make available via $().data('namespace')
758
+ if ( jQuery ) {
759
+ jQuery.data( elem, namespace, instance );
760
+ }
761
+ });
762
+
763
+ });
764
+ };
765
+
766
+ // ----- ----- //
767
+
768
+ return utils;
769
+
770
+ }));
771
+
772
+ /**
773
+ * Outlayer Item
774
+ */
775
+
776
+ ( function( window, factory ) {
777
+ // universal module definition
778
+ /* jshint strict: false */ /* globals define, module, require */
779
+ if ( typeof define == 'function' && define.amd ) {
780
+ // AMD - RequireJS
781
+ define( 'outlayer/item',[
782
+ 'ev-emitter/ev-emitter',
783
+ 'get-size/get-size'
784
+ ],
785
+ factory
786
+ );
787
+ } else if ( typeof module == 'object' && module.exports ) {
788
+ // CommonJS - Browserify, Webpack
789
+ module.exports = factory(
790
+ require('ev-emitter'),
791
+ require('get-size')
792
+ );
793
+ } else {
794
+ // browser global
795
+ window.Outlayer = {};
796
+ window.Outlayer.Item = factory(
797
+ window.EvEmitter,
798
+ window.getSize
799
+ );
800
+ }
801
+
802
+ }( window, function factory( EvEmitter, getSize ) {
803
+ 'use strict';
804
+
805
+ // ----- helpers ----- //
806
+
807
+ function isEmptyObj( obj ) {
808
+ for ( var prop in obj ) {
809
+ return false;
810
+ }
811
+ prop = null;
812
+ return true;
813
+ }
814
+
815
+ // -------------------------- CSS3 support -------------------------- //
816
+
817
+
818
+ var docElemStyle = document.documentElement.style;
819
+
820
+ var transitionProperty = typeof docElemStyle.transition == 'string' ?
821
+ 'transition' : 'WebkitTransition';
822
+ var transformProperty = typeof docElemStyle.transform == 'string' ?
823
+ 'transform' : 'WebkitTransform';
824
+
825
+ var transitionEndEvent = {
826
+ WebkitTransition: 'webkitTransitionEnd',
827
+ transition: 'transitionend'
828
+ }[ transitionProperty ];
829
+
830
+ // cache all vendor properties that could have vendor prefix
831
+ var vendorProperties = {
832
+ transform: transformProperty,
833
+ transition: transitionProperty,
834
+ transitionDuration: transitionProperty + 'Duration',
835
+ transitionProperty: transitionProperty + 'Property',
836
+ transitionDelay: transitionProperty + 'Delay'
837
+ };
838
+
839
+ // -------------------------- Item -------------------------- //
840
+
841
+ function Item( element, layout ) {
842
+ if ( !element ) {
843
+ return;
844
+ }
845
+
846
+ this.element = element;
847
+ // parent layout class, i.e. Masonry, Isotope, or Packery
848
+ this.layout = layout;
849
+ this.position = {
850
+ x: 0,
851
+ y: 0
852
+ };
853
+
854
+ this._create();
855
+ }
856
+
857
+ // inherit EvEmitter
858
+ var proto = Item.prototype = Object.create( EvEmitter.prototype );
859
+ proto.constructor = Item;
860
+
861
+ proto._create = function() {
862
+ // transition objects
863
+ this._transn = {
864
+ ingProperties: {},
865
+ clean: {},
866
+ onEnd: {}
867
+ };
868
+
869
+ this.css({
870
+ position: 'absolute'
871
+ });
872
+ };
873
+
874
+ // trigger specified handler for event type
875
+ proto.handleEvent = function( event ) {
876
+ var method = 'on' + event.type;
877
+ if ( this[ method ] ) {
878
+ this[ method ]( event );
879
+ }
880
+ };
881
+
882
+ proto.getSize = function() {
883
+ this.size = getSize( this.element );
884
+ };
885
+
886
+ /**
887
+ * apply CSS styles to element
888
+ * @param {Object} style
889
+ */
890
+ proto.css = function( style ) {
891
+ var elemStyle = this.element.style;
892
+
893
+ for ( var prop in style ) {
894
+ // use vendor property if available
895
+ var supportedProp = vendorProperties[ prop ] || prop;
896
+ elemStyle[ supportedProp ] = style[ prop ];
897
+ }
898
+ };
899
+
900
+ // measure position, and sets it
901
+ proto.getPosition = function() {
902
+ var style = getComputedStyle( this.element );
903
+ var isOriginLeft = this.layout._getOption('originLeft');
904
+ var isOriginTop = this.layout._getOption('originTop');
905
+ var xValue = style[ isOriginLeft ? 'left' : 'right' ];
906
+ var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
907
+ var x = parseFloat( xValue );
908
+ var y = parseFloat( yValue );
909
+ // convert percent to pixels
910
+ var layoutSize = this.layout.size;
911
+ if ( xValue.indexOf('%') != -1 ) {
912
+ x = ( x / 100 ) * layoutSize.width;
913
+ }
914
+ if ( yValue.indexOf('%') != -1 ) {
915
+ y = ( y / 100 ) * layoutSize.height;
916
+ }
917
+ // clean up 'auto' or other non-integer values
918
+ x = isNaN( x ) ? 0 : x;
919
+ y = isNaN( y ) ? 0 : y;
920
+ // remove padding from measurement
921
+ x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
922
+ y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
923
+
924
+ this.position.x = x;
925
+ this.position.y = y;
926
+ };
927
+
928
+ // set settled position, apply padding
929
+ proto.layoutPosition = function() {
930
+ var layoutSize = this.layout.size;
931
+ var style = {};
932
+ var isOriginLeft = this.layout._getOption('originLeft');
933
+ var isOriginTop = this.layout._getOption('originTop');
934
+
935
+ // x
936
+ var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
937
+ var xProperty = isOriginLeft ? 'left' : 'right';
938
+ var xResetProperty = isOriginLeft ? 'right' : 'left';
939
+
940
+ var x = this.position.x + layoutSize[ xPadding ];
941
+ // set in percentage or pixels
942
+ style[ xProperty ] = this.getXValue( x );
943
+ // reset other property
944
+ style[ xResetProperty ] = '';
945
+
946
+ // y
947
+ var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
948
+ var yProperty = isOriginTop ? 'top' : 'bottom';
949
+ var yResetProperty = isOriginTop ? 'bottom' : 'top';
950
+
951
+ var y = this.position.y + layoutSize[ yPadding ];
952
+ // set in percentage or pixels
953
+ style[ yProperty ] = this.getYValue( y );
954
+ // reset other property
955
+ style[ yResetProperty ] = '';
956
+
957
+ this.css( style );
958
+ this.emitEvent( 'layout', [ this ] );
959
+ };
960
+
961
+ proto.getXValue = function( x ) {
962
+ var isHorizontal = this.layout._getOption('horizontal');
963
+ return this.layout.options.percentPosition && !isHorizontal ?
964
+ ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
965
+ };
966
+
967
+ proto.getYValue = function( y ) {
968
+ var isHorizontal = this.layout._getOption('horizontal');
969
+ return this.layout.options.percentPosition && isHorizontal ?
970
+ ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
971
+ };
972
+
973
+ proto._transitionTo = function( x, y ) {
974
+ this.getPosition();
975
+ // get current x & y from top/left
976
+ var curX = this.position.x;
977
+ var curY = this.position.y;
978
+
979
+ var didNotMove = x == this.position.x && y == this.position.y;
980
+
981
+ // save end position
982
+ this.setPosition( x, y );
983
+
984
+ // if did not move and not transitioning, just go to layout
985
+ if ( didNotMove && !this.isTransitioning ) {
986
+ this.layoutPosition();
987
+ return;
988
+ }
989
+
990
+ var transX = x - curX;
991
+ var transY = y - curY;
992
+ var transitionStyle = {};
993
+ transitionStyle.transform = this.getTranslate( transX, transY );
994
+
995
+ this.transition({
996
+ to: transitionStyle,
997
+ onTransitionEnd: {
998
+ transform: this.layoutPosition
999
+ },
1000
+ isCleaning: true
1001
+ });
1002
+ };
1003
+
1004
+ proto.getTranslate = function( x, y ) {
1005
+ // flip cooridinates if origin on right or bottom
1006
+ var isOriginLeft = this.layout._getOption('originLeft');
1007
+ var isOriginTop = this.layout._getOption('originTop');
1008
+ x = isOriginLeft ? x : -x;
1009
+ y = isOriginTop ? y : -y;
1010
+ return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
1011
+ };
1012
+
1013
+ // non transition + transform support
1014
+ proto.goTo = function( x, y ) {
1015
+ this.setPosition( x, y );
1016
+ this.layoutPosition();
1017
+ };
1018
+
1019
+ proto.moveTo = proto._transitionTo;
1020
+
1021
+ proto.setPosition = function( x, y ) {
1022
+ this.position.x = parseFloat( x );
1023
+ this.position.y = parseFloat( y );
1024
+ };
1025
+
1026
+ // ----- transition ----- //
1027
+
1028
+ /**
1029
+ * @param {Object} style - CSS
1030
+ * @param {Function} onTransitionEnd
1031
+ */
1032
+
1033
+ // non transition, just trigger callback
1034
+ proto._nonTransition = function( args ) {
1035
+ this.css( args.to );
1036
+ if ( args.isCleaning ) {
1037
+ this._removeStyles( args.to );
1038
+ }
1039
+ for ( var prop in args.onTransitionEnd ) {
1040
+ args.onTransitionEnd[ prop ].call( this );
1041
+ }
1042
+ };
1043
+
1044
+ /**
1045
+ * proper transition
1046
+ * @param {Object} args - arguments
1047
+ * @param {Object} to - style to transition to
1048
+ * @param {Object} from - style to start transition from
1049
+ * @param {Boolean} isCleaning - removes transition styles after transition
1050
+ * @param {Function} onTransitionEnd - callback
1051
+ */
1052
+ proto.transition = function( args ) {
1053
+ // redirect to nonTransition if no transition duration
1054
+ if ( !parseFloat( this.layout.options.transitionDuration ) ) {
1055
+ this._nonTransition( args );
1056
+ return;
1057
+ }
1058
+
1059
+ var _transition = this._transn;
1060
+ // keep track of onTransitionEnd callback by css property
1061
+ for ( var prop in args.onTransitionEnd ) {
1062
+ _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
1063
+ }
1064
+ // keep track of properties that are transitioning
1065
+ for ( prop in args.to ) {
1066
+ _transition.ingProperties[ prop ] = true;
1067
+ // keep track of properties to clean up when transition is done
1068
+ if ( args.isCleaning ) {
1069
+ _transition.clean[ prop ] = true;
1070
+ }
1071
+ }
1072
+
1073
+ // set from styles
1074
+ if ( args.from ) {
1075
+ this.css( args.from );
1076
+ // force redraw. http://blog.alexmaccaw.com/css-transitions
1077
+ var h = this.element.offsetHeight;
1078
+ // hack for JSHint to hush about unused var
1079
+ h = null;
1080
+ }
1081
+ // enable transition
1082
+ this.enableTransition( args.to );
1083
+ // set styles that are transitioning
1084
+ this.css( args.to );
1085
+
1086
+ this.isTransitioning = true;
1087
+
1088
+ };
1089
+
1090
+ // dash before all cap letters, including first for
1091
+ // WebkitTransform => -webkit-transform
1092
+ function toDashedAll( str ) {
1093
+ return str.replace( /([A-Z])/g, function( $1 ) {
1094
+ return '-' + $1.toLowerCase();
1095
+ });
1096
+ }
1097
+
1098
+ var transitionProps = 'opacity,' + toDashedAll( transformProperty );
1099
+
1100
+ proto.enableTransition = function(/* style */) {
1101
+ // HACK changing transitionProperty during a transition
1102
+ // will cause transition to jump
1103
+ if ( this.isTransitioning ) {
1104
+ return;
1105
+ }
1106
+
1107
+ // make `transition: foo, bar, baz` from style object
1108
+ // HACK un-comment this when enableTransition can work
1109
+ // while a transition is happening
1110
+ // var transitionValues = [];
1111
+ // for ( var prop in style ) {
1112
+ // // dash-ify camelCased properties like WebkitTransition
1113
+ // prop = vendorProperties[ prop ] || prop;
1114
+ // transitionValues.push( toDashedAll( prop ) );
1115
+ // }
1116
+ // munge number to millisecond, to match stagger
1117
+ var duration = this.layout.options.transitionDuration;
1118
+ duration = typeof duration == 'number' ? duration + 'ms' : duration;
1119
+ // enable transition styles
1120
+ this.css({
1121
+ transitionProperty: transitionProps,
1122
+ transitionDuration: duration,
1123
+ transitionDelay: this.staggerDelay || 0
1124
+ });
1125
+ // listen for transition end event
1126
+ this.element.addEventListener( transitionEndEvent, this, false );
1127
+ };
1128
+
1129
+ // ----- events ----- //
1130
+
1131
+ proto.onwebkitTransitionEnd = function( event ) {
1132
+ this.ontransitionend( event );
1133
+ };
1134
+
1135
+ proto.onotransitionend = function( event ) {
1136
+ this.ontransitionend( event );
1137
+ };
1138
+
1139
+ // properties that I munge to make my life easier
1140
+ var dashedVendorProperties = {
1141
+ '-webkit-transform': 'transform'
1142
+ };
1143
+
1144
+ proto.ontransitionend = function( event ) {
1145
+ // disregard bubbled events from children
1146
+ if ( event.target !== this.element ) {
1147
+ return;
1148
+ }
1149
+ var _transition = this._transn;
1150
+ // get property name of transitioned property, convert to prefix-free
1151
+ var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;
1152
+
1153
+ // remove property that has completed transitioning
1154
+ delete _transition.ingProperties[ propertyName ];
1155
+ // check if any properties are still transitioning
1156
+ if ( isEmptyObj( _transition.ingProperties ) ) {
1157
+ // all properties have completed transitioning
1158
+ this.disableTransition();
1159
+ }
1160
+ // clean style
1161
+ if ( propertyName in _transition.clean ) {
1162
+ // clean up style
1163
+ this.element.style[ event.propertyName ] = '';
1164
+ delete _transition.clean[ propertyName ];
1165
+ }
1166
+ // trigger onTransitionEnd callback
1167
+ if ( propertyName in _transition.onEnd ) {
1168
+ var onTransitionEnd = _transition.onEnd[ propertyName ];
1169
+ onTransitionEnd.call( this );
1170
+ delete _transition.onEnd[ propertyName ];
1171
+ }
1172
+
1173
+ this.emitEvent( 'transitionEnd', [ this ] );
1174
+ };
1175
+
1176
+ proto.disableTransition = function() {
1177
+ this.removeTransitionStyles();
1178
+ this.element.removeEventListener( transitionEndEvent, this, false );
1179
+ this.isTransitioning = false;
1180
+ };
1181
+
1182
+ /**
1183
+ * removes style property from element
1184
+ * @param {Object} style
1185
+ **/
1186
+ proto._removeStyles = function( style ) {
1187
+ // clean up transition styles
1188
+ var cleanStyle = {};
1189
+ for ( var prop in style ) {
1190
+ cleanStyle[ prop ] = '';
1191
+ }
1192
+ this.css( cleanStyle );
1193
+ };
1194
+
1195
+ var cleanTransitionStyle = {
1196
+ transitionProperty: '',
1197
+ transitionDuration: '',
1198
+ transitionDelay: ''
1199
+ };
1200
+
1201
+ proto.removeTransitionStyles = function() {
1202
+ // remove transition
1203
+ this.css( cleanTransitionStyle );
1204
+ };
1205
+
1206
+ // ----- stagger ----- //
1207
+
1208
+ proto.stagger = function( delay ) {
1209
+ delay = isNaN( delay ) ? 0 : delay;
1210
+ this.staggerDelay = delay + 'ms';
1211
+ };
1212
+
1213
+ // ----- show/hide/remove ----- //
1214
+
1215
+ // remove element from DOM
1216
+ proto.removeElem = function() {
1217
+ this.element.parentNode.removeChild( this.element );
1218
+ // remove display: none
1219
+ this.css({ display: '' });
1220
+ this.emitEvent( 'remove', [ this ] );
1221
+ };
1222
+
1223
+ proto.remove = function() {
1224
+ // just remove element if no transition support or no transition
1225
+ if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
1226
+ this.removeElem();
1227
+ return;
1228
+ }
1229
+
1230
+ // start transition
1231
+ this.once( 'transitionEnd', function() {
1232
+ this.removeElem();
1233
+ });
1234
+ this.hide();
1235
+ };
1236
+
1237
+ proto.reveal = function() {
1238
+ delete this.isHidden;
1239
+ // remove display: none
1240
+ this.css({ display: '' });
1241
+
1242
+ var options = this.layout.options;
1243
+
1244
+ var onTransitionEnd = {};
1245
+ var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
1246
+ onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;
1247
+
1248
+ this.transition({
1249
+ from: options.hiddenStyle,
1250
+ to: options.visibleStyle,
1251
+ isCleaning: true,
1252
+ onTransitionEnd: onTransitionEnd
1253
+ });
1254
+ };
1255
+
1256
+ proto.onRevealTransitionEnd = function() {
1257
+ // check if still visible
1258
+ // during transition, item may have been hidden
1259
+ if ( !this.isHidden ) {
1260
+ this.emitEvent('reveal');
1261
+ }
1262
+ };
1263
+
1264
+ /**
1265
+ * get style property use for hide/reveal transition end
1266
+ * @param {String} styleProperty - hiddenStyle/visibleStyle
1267
+ * @returns {String}
1268
+ */
1269
+ proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
1270
+ var optionStyle = this.layout.options[ styleProperty ];
1271
+ // use opacity
1272
+ if ( optionStyle.opacity ) {
1273
+ return 'opacity';
1274
+ }
1275
+ // get first property
1276
+ for ( var prop in optionStyle ) {
1277
+ return prop;
1278
+ }
1279
+ };
1280
+
1281
+ proto.hide = function() {
1282
+ // set flag
1283
+ this.isHidden = true;
1284
+ // remove display: none
1285
+ this.css({ display: '' });
1286
+
1287
+ var options = this.layout.options;
1288
+
1289
+ var onTransitionEnd = {};
1290
+ var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
1291
+ onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;
1292
+
1293
+ this.transition({
1294
+ from: options.visibleStyle,
1295
+ to: options.hiddenStyle,
1296
+ // keep hidden stuff hidden
1297
+ isCleaning: true,
1298
+ onTransitionEnd: onTransitionEnd
1299
+ });
1300
+ };
1301
+
1302
+ proto.onHideTransitionEnd = function() {
1303
+ // check if still hidden
1304
+ // during transition, item may have been un-hidden
1305
+ if ( this.isHidden ) {
1306
+ this.css({ display: 'none' });
1307
+ this.emitEvent('hide');
1308
+ }
1309
+ };
1310
+
1311
+ proto.destroy = function() {
1312
+ this.css({
1313
+ position: '',
1314
+ left: '',
1315
+ right: '',
1316
+ top: '',
1317
+ bottom: '',
1318
+ transition: '',
1319
+ transform: ''
1320
+ });
1321
+ };
1322
+
1323
+ return Item;
1324
+
1325
+ }));
1326
+
1327
+ /*!
1328
+ * Outlayer v2.1.1
1329
+ * the brains and guts of a layout library
1330
+ * MIT license
1331
+ */
1332
+
1333
+ ( function( window, factory ) {
1334
+ 'use strict';
1335
+ // universal module definition
1336
+ /* jshint strict: false */ /* globals define, module, require */
1337
+ if ( typeof define == 'function' && define.amd ) {
1338
+ // AMD - RequireJS
1339
+ define( 'outlayer/outlayer',[
1340
+ 'ev-emitter/ev-emitter',
1341
+ 'get-size/get-size',
1342
+ 'fizzy-ui-utils/utils',
1343
+ './item'
1344
+ ],
1345
+ function( EvEmitter, getSize, utils, Item ) {
1346
+ return factory( window, EvEmitter, getSize, utils, Item);
1347
+ }
1348
+ );
1349
+ } else if ( typeof module == 'object' && module.exports ) {
1350
+ // CommonJS - Browserify, Webpack
1351
+ module.exports = factory(
1352
+ window,
1353
+ require('ev-emitter'),
1354
+ require('get-size'),
1355
+ require('fizzy-ui-utils'),
1356
+ require('./item')
1357
+ );
1358
+ } else {
1359
+ // browser global
1360
+ window.Outlayer = factory(
1361
+ window,
1362
+ window.EvEmitter,
1363
+ window.getSize,
1364
+ window.fizzyUIUtils,
1365
+ window.Outlayer.Item
1366
+ );
1367
+ }
1368
+
1369
+ }( window, function factory( window, EvEmitter, getSize, utils, Item ) {
1370
+ 'use strict';
1371
+
1372
+ // ----- vars ----- //
1373
+
1374
+ var console = window.console;
1375
+ var jQuery = window.jQuery;
1376
+ var noop = function() {};
1377
+
1378
+ // -------------------------- Outlayer -------------------------- //
1379
+
1380
+ // globally unique identifiers
1381
+ var GUID = 0;
1382
+ // internal store of all Outlayer intances
1383
+ var instances = {};
1384
+
1385
+
1386
+ /**
1387
+ * @param {Element, String} element
1388
+ * @param {Object} options
1389
+ * @constructor
1390
+ */
1391
+ function Outlayer( element, options ) {
1392
+ var queryElement = utils.getQueryElement( element );
1393
+ if ( !queryElement ) {
1394
+ if ( console ) {
1395
+ console.error( 'Bad element for ' + this.constructor.namespace +
1396
+ ': ' + ( queryElement || element ) );
1397
+ }
1398
+ return;
1399
+ }
1400
+ this.element = queryElement;
1401
+ // add jQuery
1402
+ if ( jQuery ) {
1403
+ this.$element = jQuery( this.element );
1404
+ }
1405
+
1406
+ // options
1407
+ this.options = utils.extend( {}, this.constructor.defaults );
1408
+ this.option( options );
1409
+
1410
+ // add id for Outlayer.getFromElement
1411
+ var id = ++GUID;
1412
+ this.element.outlayerGUID = id; // expando
1413
+ instances[ id ] = this; // associate via id
1414
+
1415
+ // kick it off
1416
+ this._create();
1417
+
1418
+ var isInitLayout = this._getOption('initLayout');
1419
+ if ( isInitLayout ) {
1420
+ this.layout();
1421
+ }
1422
+ }
1423
+
1424
+ // settings are for internal use only
1425
+ Outlayer.namespace = 'outlayer';
1426
+ Outlayer.Item = Item;
1427
+
1428
+ // default options
1429
+ Outlayer.defaults = {
1430
+ containerStyle: {
1431
+ position: 'relative'
1432
+ },
1433
+ initLayout: true,
1434
+ originLeft: true,
1435
+ originTop: true,
1436
+ resize: true,
1437
+ resizeContainer: true,
1438
+ // item options
1439
+ transitionDuration: '0.4s',
1440
+ hiddenStyle: {
1441
+ opacity: 0,
1442
+ transform: 'scale(0.001)'
1443
+ },
1444
+ visibleStyle: {
1445
+ opacity: 1,
1446
+ transform: 'scale(1)'
1447
+ }
1448
+ };
1449
+
1450
+ var proto = Outlayer.prototype;
1451
+ // inherit EvEmitter
1452
+ utils.extend( proto, EvEmitter.prototype );
1453
+
1454
+ /**
1455
+ * set options
1456
+ * @param {Object} opts
1457
+ */
1458
+ proto.option = function( opts ) {
1459
+ utils.extend( this.options, opts );
1460
+ };
1461
+
1462
+ /**
1463
+ * get backwards compatible option value, check old name
1464
+ */
1465
+ proto._getOption = function( option ) {
1466
+ var oldOption = this.constructor.compatOptions[ option ];
1467
+ return oldOption && this.options[ oldOption ] !== undefined ?
1468
+ this.options[ oldOption ] : this.options[ option ];
1469
+ };
1470
+
1471
+ Outlayer.compatOptions = {
1472
+ // currentName: oldName
1473
+ initLayout: 'isInitLayout',
1474
+ horizontal: 'isHorizontal',
1475
+ layoutInstant: 'isLayoutInstant',
1476
+ originLeft: 'isOriginLeft',
1477
+ originTop: 'isOriginTop',
1478
+ resize: 'isResizeBound',
1479
+ resizeContainer: 'isResizingContainer'
1480
+ };
1481
+
1482
+ proto._create = function() {
1483
+ // get items from children
1484
+ this.reloadItems();
1485
+ // elements that affect layout, but are not laid out
1486
+ this.stamps = [];
1487
+ this.stamp( this.options.stamp );
1488
+ // set container style
1489
+ utils.extend( this.element.style, this.options.containerStyle );
1490
+
1491
+ // bind resize method
1492
+ var canBindResize = this._getOption('resize');
1493
+ if ( canBindResize ) {
1494
+ this.bindResize();
1495
+ }
1496
+ };
1497
+
1498
+ // goes through all children again and gets bricks in proper order
1499
+ proto.reloadItems = function() {
1500
+ // collection of item elements
1501
+ this.items = this._itemize( this.element.children );
1502
+ };
1503
+
1504
+
1505
+ /**
1506
+ * turn elements into Outlayer.Items to be used in layout
1507
+ * @param {Array or NodeList or HTMLElement} elems
1508
+ * @returns {Array} items - collection of new Outlayer Items
1509
+ */
1510
+ proto._itemize = function( elems ) {
1511
+
1512
+ var itemElems = this._filterFindItemElements( elems );
1513
+ var Item = this.constructor.Item;
1514
+
1515
+ // create new Outlayer Items for collection
1516
+ var items = [];
1517
+ for ( var i=0; i < itemElems.length; i++ ) {
1518
+ var elem = itemElems[i];
1519
+ var item = new Item( elem, this );
1520
+ items.push( item );
1521
+ }
1522
+
1523
+ return items;
1524
+ };
1525
+
1526
+ /**
1527
+ * get item elements to be used in layout
1528
+ * @param {Array or NodeList or HTMLElement} elems
1529
+ * @returns {Array} items - item elements
1530
+ */
1531
+ proto._filterFindItemElements = function( elems ) {
1532
+ return utils.filterFindElements( elems, this.options.itemSelector );
1533
+ };
1534
+
1535
+ /**
1536
+ * getter method for getting item elements
1537
+ * @returns {Array} elems - collection of item elements
1538
+ */
1539
+ proto.getItemElements = function() {
1540
+ return this.items.map( function( item ) {
1541
+ return item.element;
1542
+ });
1543
+ };
1544
+
1545
+ // ----- init & layout ----- //
1546
+
1547
+ /**
1548
+ * lays out all items
1549
+ */
1550
+ proto.layout = function() {
1551
+ this._resetLayout();
1552
+ this._manageStamps();
1553
+
1554
+ // don't animate first layout
1555
+ var layoutInstant = this._getOption('layoutInstant');
1556
+ var isInstant = layoutInstant !== undefined ?
1557
+ layoutInstant : !this._isLayoutInited;
1558
+ this.layoutItems( this.items, isInstant );
1559
+
1560
+ // flag for initalized
1561
+ this._isLayoutInited = true;
1562
+ };
1563
+
1564
+ // _init is alias for layout
1565
+ proto._init = proto.layout;
1566
+
1567
+ /**
1568
+ * logic before any new layout
1569
+ */
1570
+ proto._resetLayout = function() {
1571
+ this.getSize();
1572
+ };
1573
+
1574
+
1575
+ proto.getSize = function() {
1576
+ this.size = getSize( this.element );
1577
+ };
1578
+
1579
+ /**
1580
+ * get measurement from option, for columnWidth, rowHeight, gutter
1581
+ * if option is String -> get element from selector string, & get size of element
1582
+ * if option is Element -> get size of element
1583
+ * else use option as a number
1584
+ *
1585
+ * @param {String} measurement
1586
+ * @param {String} size - width or height
1587
+ * @private
1588
+ */
1589
+ proto._getMeasurement = function( measurement, size ) {
1590
+ var option = this.options[ measurement ];
1591
+ var elem;
1592
+ if ( !option ) {
1593
+ // default to 0
1594
+ this[ measurement ] = 0;
1595
+ } else {
1596
+ // use option as an element
1597
+ if ( typeof option == 'string' ) {
1598
+ elem = this.element.querySelector( option );
1599
+ } else if ( option instanceof HTMLElement ) {
1600
+ elem = option;
1601
+ }
1602
+ // use size of element, if element
1603
+ this[ measurement ] = elem ? getSize( elem )[ size ] : option;
1604
+ }
1605
+ };
1606
+
1607
+ /**
1608
+ * layout a collection of item elements
1609
+ * @api public
1610
+ */
1611
+ proto.layoutItems = function( items, isInstant ) {
1612
+ items = this._getItemsForLayout( items );
1613
+
1614
+ this._layoutItems( items, isInstant );
1615
+
1616
+ this._postLayout();
1617
+ };
1618
+
1619
+ /**
1620
+ * get the items to be laid out
1621
+ * you may want to skip over some items
1622
+ * @param {Array} items
1623
+ * @returns {Array} items
1624
+ */
1625
+ proto._getItemsForLayout = function( items ) {
1626
+ return items.filter( function( item ) {
1627
+ return !item.isIgnored;
1628
+ });
1629
+ };
1630
+
1631
+ /**
1632
+ * layout items
1633
+ * @param {Array} items
1634
+ * @param {Boolean} isInstant
1635
+ */
1636
+ proto._layoutItems = function( items, isInstant ) {
1637
+ this._emitCompleteOnItems( 'layout', items );
1638
+
1639
+ if ( !items || !items.length ) {
1640
+ // no items, emit event with empty array
1641
+ return;
1642
+ }
1643
+
1644
+ var queue = [];
1645
+
1646
+ items.forEach( function( item ) {
1647
+ // get x/y object from method
1648
+ var position = this._getItemLayoutPosition( item );
1649
+ // enqueue
1650
+ position.item = item;
1651
+ position.isInstant = isInstant || item.isLayoutInstant;
1652
+ queue.push( position );
1653
+ }, this );
1654
+
1655
+ this._processLayoutQueue( queue );
1656
+ };
1657
+
1658
+ /**
1659
+ * get item layout position
1660
+ * @param {Outlayer.Item} item
1661
+ * @returns {Object} x and y position
1662
+ */
1663
+ proto._getItemLayoutPosition = function( /* item */ ) {
1664
+ return {
1665
+ x: 0,
1666
+ y: 0
1667
+ };
1668
+ };
1669
+
1670
+ /**
1671
+ * iterate over array and position each item
1672
+ * Reason being - separating this logic prevents 'layout invalidation'
1673
+ * thx @paul_irish
1674
+ * @param {Array} queue
1675
+ */
1676
+ proto._processLayoutQueue = function( queue ) {
1677
+ this.updateStagger();
1678
+ queue.forEach( function( obj, i ) {
1679
+ this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
1680
+ }, this );
1681
+ };
1682
+
1683
+ // set stagger from option in milliseconds number
1684
+ proto.updateStagger = function() {
1685
+ var stagger = this.options.stagger;
1686
+ if ( stagger === null || stagger === undefined ) {
1687
+ this.stagger = 0;
1688
+ return;
1689
+ }
1690
+ this.stagger = getMilliseconds( stagger );
1691
+ return this.stagger;
1692
+ };
1693
+
1694
+ /**
1695
+ * Sets position of item in DOM
1696
+ * @param {Outlayer.Item} item
1697
+ * @param {Number} x - horizontal position
1698
+ * @param {Number} y - vertical position
1699
+ * @param {Boolean} isInstant - disables transitions
1700
+ */
1701
+ proto._positionItem = function( item, x, y, isInstant, i ) {
1702
+ if ( isInstant ) {
1703
+ // if not transition, just set CSS
1704
+ item.goTo( x, y );
1705
+ } else {
1706
+ item.stagger( i * this.stagger );
1707
+ item.moveTo( x, y );
1708
+ }
1709
+ };
1710
+
1711
+ /**
1712
+ * Any logic you want to do after each layout,
1713
+ * i.e. size the container
1714
+ */
1715
+ proto._postLayout = function() {
1716
+ this.resizeContainer();
1717
+ };
1718
+
1719
+ proto.resizeContainer = function() {
1720
+ var isResizingContainer = this._getOption('resizeContainer');
1721
+ if ( !isResizingContainer ) {
1722
+ return;
1723
+ }
1724
+ var size = this._getContainerSize();
1725
+ if ( size ) {
1726
+ this._setContainerMeasure( size.width, true );
1727
+ this._setContainerMeasure( size.height, false );
1728
+ }
1729
+ };
1730
+
1731
+ /**
1732
+ * Sets width or height of container if returned
1733
+ * @returns {Object} size
1734
+ * @param {Number} width
1735
+ * @param {Number} height
1736
+ */
1737
+ proto._getContainerSize = noop;
1738
+
1739
+ /**
1740
+ * @param {Number} measure - size of width or height
1741
+ * @param {Boolean} isWidth
1742
+ */
1743
+ proto._setContainerMeasure = function( measure, isWidth ) {
1744
+ if ( measure === undefined ) {
1745
+ return;
1746
+ }
1747
+
1748
+ var elemSize = this.size;
1749
+ // add padding and border width if border box
1750
+ if ( elemSize.isBorderBox ) {
1751
+ measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
1752
+ elemSize.borderLeftWidth + elemSize.borderRightWidth :
1753
+ elemSize.paddingBottom + elemSize.paddingTop +
1754
+ elemSize.borderTopWidth + elemSize.borderBottomWidth;
1755
+ }
1756
+
1757
+ measure = Math.max( measure, 0 );
1758
+ this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
1759
+ };
1760
+
1761
+ /**
1762
+ * emit eventComplete on a collection of items events
1763
+ * @param {String} eventName
1764
+ * @param {Array} items - Outlayer.Items
1765
+ */
1766
+ proto._emitCompleteOnItems = function( eventName, items ) {
1767
+ var _this = this;
1768
+ function onComplete() {
1769
+ _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
1770
+ }
1771
+
1772
+ var count = items.length;
1773
+ if ( !items || !count ) {
1774
+ onComplete();
1775
+ return;
1776
+ }
1777
+
1778
+ var doneCount = 0;
1779
+ function tick() {
1780
+ doneCount++;
1781
+ if ( doneCount == count ) {
1782
+ onComplete();
1783
+ }
1784
+ }
1785
+
1786
+ // bind callback
1787
+ items.forEach( function( item ) {
1788
+ item.once( eventName, tick );
1789
+ });
1790
+ };
1791
+
1792
+ /**
1793
+ * emits events via EvEmitter and jQuery events
1794
+ * @param {String} type - name of event
1795
+ * @param {Event} event - original event
1796
+ * @param {Array} args - extra arguments
1797
+ */
1798
+ proto.dispatchEvent = function( type, event, args ) {
1799
+ // add original event to arguments
1800
+ var emitArgs = event ? [ event ].concat( args ) : args;
1801
+ this.emitEvent( type, emitArgs );
1802
+
1803
+ if ( jQuery ) {
1804
+ // set this.$element
1805
+ this.$element = this.$element || jQuery( this.element );
1806
+ if ( event ) {
1807
+ // create jQuery event
1808
+ var $event = jQuery.Event( event );
1809
+ $event.type = type;
1810
+ this.$element.trigger( $event, args );
1811
+ } else {
1812
+ // just trigger with type if no event available
1813
+ this.$element.trigger( type, args );
1814
+ }
1815
+ }
1816
+ };
1817
+
1818
+ // -------------------------- ignore & stamps -------------------------- //
1819
+
1820
+
1821
+ /**
1822
+ * keep item in collection, but do not lay it out
1823
+ * ignored items do not get skipped in layout
1824
+ * @param {Element} elem
1825
+ */
1826
+ proto.ignore = function( elem ) {
1827
+ var item = this.getItem( elem );
1828
+ if ( item ) {
1829
+ item.isIgnored = true;
1830
+ }
1831
+ };
1832
+
1833
+ /**
1834
+ * return item to layout collection
1835
+ * @param {Element} elem
1836
+ */
1837
+ proto.unignore = function( elem ) {
1838
+ var item = this.getItem( elem );
1839
+ if ( item ) {
1840
+ delete item.isIgnored;
1841
+ }
1842
+ };
1843
+
1844
+ /**
1845
+ * adds elements to stamps
1846
+ * @param {NodeList, Array, Element, or String} elems
1847
+ */
1848
+ proto.stamp = function( elems ) {
1849
+ elems = this._find( elems );
1850
+ if ( !elems ) {
1851
+ return;
1852
+ }
1853
+
1854
+ this.stamps = this.stamps.concat( elems );
1855
+ // ignore
1856
+ elems.forEach( this.ignore, this );
1857
+ };
1858
+
1859
+ /**
1860
+ * removes elements to stamps
1861
+ * @param {NodeList, Array, or Element} elems
1862
+ */
1863
+ proto.unstamp = function( elems ) {
1864
+ elems = this._find( elems );
1865
+ if ( !elems ){
1866
+ return;
1867
+ }
1868
+
1869
+ elems.forEach( function( elem ) {
1870
+ // filter out removed stamp elements
1871
+ utils.removeFrom( this.stamps, elem );
1872
+ this.unignore( elem );
1873
+ }, this );
1874
+ };
1875
+
1876
+ /**
1877
+ * finds child elements
1878
+ * @param {NodeList, Array, Element, or String} elems
1879
+ * @returns {Array} elems
1880
+ */
1881
+ proto._find = function( elems ) {
1882
+ if ( !elems ) {
1883
+ return;
1884
+ }
1885
+ // if string, use argument as selector string
1886
+ if ( typeof elems == 'string' ) {
1887
+ elems = this.element.querySelectorAll( elems );
1888
+ }
1889
+ elems = utils.makeArray( elems );
1890
+ return elems;
1891
+ };
1892
+
1893
+ proto._manageStamps = function() {
1894
+ if ( !this.stamps || !this.stamps.length ) {
1895
+ return;
1896
+ }
1897
+
1898
+ this._getBoundingRect();
1899
+
1900
+ this.stamps.forEach( this._manageStamp, this );
1901
+ };
1902
+
1903
+ // update boundingLeft / Top
1904
+ proto._getBoundingRect = function() {
1905
+ // get bounding rect for container element
1906
+ var boundingRect = this.element.getBoundingClientRect();
1907
+ var size = this.size;
1908
+ this._boundingRect = {
1909
+ left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
1910
+ top: boundingRect.top + size.paddingTop + size.borderTopWidth,
1911
+ right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
1912
+ bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
1913
+ };
1914
+ };
1915
+
1916
+ /**
1917
+ * @param {Element} stamp
1918
+ **/
1919
+ proto._manageStamp = noop;
1920
+
1921
+ /**
1922
+ * get x/y position of element relative to container element
1923
+ * @param {Element} elem
1924
+ * @returns {Object} offset - has left, top, right, bottom
1925
+ */
1926
+ proto._getElementOffset = function( elem ) {
1927
+ var boundingRect = elem.getBoundingClientRect();
1928
+ var thisRect = this._boundingRect;
1929
+ var size = getSize( elem );
1930
+ var offset = {
1931
+ left: boundingRect.left - thisRect.left - size.marginLeft,
1932
+ top: boundingRect.top - thisRect.top - size.marginTop,
1933
+ right: thisRect.right - boundingRect.right - size.marginRight,
1934
+ bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
1935
+ };
1936
+ return offset;
1937
+ };
1938
+
1939
+ // -------------------------- resize -------------------------- //
1940
+
1941
+ // enable event handlers for listeners
1942
+ // i.e. resize -> onresize
1943
+ proto.handleEvent = utils.handleEvent;
1944
+
1945
+ /**
1946
+ * Bind layout to window resizing
1947
+ */
1948
+ proto.bindResize = function() {
1949
+ window.addEventListener( 'resize', this );
1950
+ this.isResizeBound = true;
1951
+ };
1952
+
1953
+ /**
1954
+ * Unbind layout to window resizing
1955
+ */
1956
+ proto.unbindResize = function() {
1957
+ window.removeEventListener( 'resize', this );
1958
+ this.isResizeBound = false;
1959
+ };
1960
+
1961
+ proto.onresize = function() {
1962
+ this.resize();
1963
+ };
1964
+
1965
+ utils.debounceMethod( Outlayer, 'onresize', 100 );
1966
+
1967
+ proto.resize = function() {
1968
+ // don't trigger if size did not change
1969
+ // or if resize was unbound. See #9
1970
+ if ( !this.isResizeBound || !this.needsResizeLayout() ) {
1971
+ return;
1972
+ }
1973
+
1974
+ this.layout();
1975
+ };
1976
+
1977
+ /**
1978
+ * check if layout is needed post layout
1979
+ * @returns Boolean
1980
+ */
1981
+ proto.needsResizeLayout = function() {
1982
+ var size = getSize( this.element );
1983
+ // check that this.size and size are there
1984
+ // IE8 triggers resize on body size change, so they might not be
1985
+ var hasSizes = this.size && size;
1986
+ return hasSizes && size.innerWidth !== this.size.innerWidth;
1987
+ };
1988
+
1989
+ // -------------------------- methods -------------------------- //
1990
+
1991
+ /**
1992
+ * add items to Outlayer instance
1993
+ * @param {Array or NodeList or Element} elems
1994
+ * @returns {Array} items - Outlayer.Items
1995
+ **/
1996
+ proto.addItems = function( elems ) {
1997
+ var items = this._itemize( elems );
1998
+ // add items to collection
1999
+ if ( items.length ) {
2000
+ this.items = this.items.concat( items );
2001
+ }
2002
+ return items;
2003
+ };
2004
+
2005
+ /**
2006
+ * Layout newly-appended item elements
2007
+ * @param {Array or NodeList or Element} elems
2008
+ */
2009
+ proto.appended = function( elems ) {
2010
+ var items = this.addItems( elems );
2011
+ if ( !items.length ) {
2012
+ return;
2013
+ }
2014
+ // layout and reveal just the new items
2015
+ this.layoutItems( items, true );
2016
+ this.reveal( items );
2017
+ };
2018
+
2019
+ /**
2020
+ * Layout prepended elements
2021
+ * @param {Array or NodeList or Element} elems
2022
+ */
2023
+ proto.prepended = function( elems ) {
2024
+ var items = this._itemize( elems );
2025
+ if ( !items.length ) {
2026
+ return;
2027
+ }
2028
+ // add items to beginning of collection
2029
+ var previousItems = this.items.slice(0);
2030
+ this.items = items.concat( previousItems );
2031
+ // start new layout
2032
+ this._resetLayout();
2033
+ this._manageStamps();
2034
+ // layout new stuff without transition
2035
+ this.layoutItems( items, true );
2036
+ this.reveal( items );
2037
+ // layout previous items
2038
+ this.layoutItems( previousItems );
2039
+ };
2040
+
2041
+ /**
2042
+ * reveal a collection of items
2043
+ * @param {Array of Outlayer.Items} items
2044
+ */
2045
+ proto.reveal = function( items ) {
2046
+ this._emitCompleteOnItems( 'reveal', items );
2047
+ if ( !items || !items.length ) {
2048
+ return;
2049
+ }
2050
+ var stagger = this.updateStagger();
2051
+ items.forEach( function( item, i ) {
2052
+ item.stagger( i * stagger );
2053
+ item.reveal();
2054
+ });
2055
+ };
2056
+
2057
+ /**
2058
+ * hide a collection of items
2059
+ * @param {Array of Outlayer.Items} items
2060
+ */
2061
+ proto.hide = function( items ) {
2062
+ this._emitCompleteOnItems( 'hide', items );
2063
+ if ( !items || !items.length ) {
2064
+ return;
2065
+ }
2066
+ var stagger = this.updateStagger();
2067
+ items.forEach( function( item, i ) {
2068
+ item.stagger( i * stagger );
2069
+ item.hide();
2070
+ });
2071
+ };
2072
+
2073
+ /**
2074
+ * reveal item elements
2075
+ * @param {Array}, {Element}, {NodeList} items
2076
+ */
2077
+ proto.revealItemElements = function( elems ) {
2078
+ var items = this.getItems( elems );
2079
+ this.reveal( items );
2080
+ };
2081
+
2082
+ /**
2083
+ * hide item elements
2084
+ * @param {Array}, {Element}, {NodeList} items
2085
+ */
2086
+ proto.hideItemElements = function( elems ) {
2087
+ var items = this.getItems( elems );
2088
+ this.hide( items );
2089
+ };
2090
+
2091
+ /**
2092
+ * get Outlayer.Item, given an Element
2093
+ * @param {Element} elem
2094
+ * @param {Function} callback
2095
+ * @returns {Outlayer.Item} item
2096
+ */
2097
+ proto.getItem = function( elem ) {
2098
+ // loop through items to get the one that matches
2099
+ for ( var i=0; i < this.items.length; i++ ) {
2100
+ var item = this.items[i];
2101
+ if ( item.element == elem ) {
2102
+ // return item
2103
+ return item;
2104
+ }
2105
+ }
2106
+ };
2107
+
2108
+ /**
2109
+ * get collection of Outlayer.Items, given Elements
2110
+ * @param {Array} elems
2111
+ * @returns {Array} items - Outlayer.Items
2112
+ */
2113
+ proto.getItems = function( elems ) {
2114
+ elems = utils.makeArray( elems );
2115
+ var items = [];
2116
+ elems.forEach( function( elem ) {
2117
+ var item = this.getItem( elem );
2118
+ if ( item ) {
2119
+ items.push( item );
2120
+ }
2121
+ }, this );
2122
+
2123
+ return items;
2124
+ };
2125
+
2126
+ /**
2127
+ * remove element(s) from instance and DOM
2128
+ * @param {Array or NodeList or Element} elems
2129
+ */
2130
+ proto.remove = function( elems ) {
2131
+ var removeItems = this.getItems( elems );
2132
+
2133
+ this._emitCompleteOnItems( 'remove', removeItems );
2134
+
2135
+ // bail if no items to remove
2136
+ if ( !removeItems || !removeItems.length ) {
2137
+ return;
2138
+ }
2139
+
2140
+ removeItems.forEach( function( item ) {
2141
+ item.remove();
2142
+ // remove item from collection
2143
+ utils.removeFrom( this.items, item );
2144
+ }, this );
2145
+ };
2146
+
2147
+ // ----- destroy ----- //
2148
+
2149
+ // remove and disable Outlayer instance
2150
+ proto.destroy = function() {
2151
+ // clean up dynamic styles
2152
+ var style = this.element.style;
2153
+ style.height = '';
2154
+ style.position = '';
2155
+ style.width = '';
2156
+ // destroy items
2157
+ this.items.forEach( function( item ) {
2158
+ item.destroy();
2159
+ });
2160
+
2161
+ this.unbindResize();
2162
+
2163
+ var id = this.element.outlayerGUID;
2164
+ delete instances[ id ]; // remove reference to instance by id
2165
+ delete this.element.outlayerGUID;
2166
+ // remove data for jQuery
2167
+ if ( jQuery ) {
2168
+ jQuery.removeData( this.element, this.constructor.namespace );
2169
+ }
2170
+
2171
+ };
2172
+
2173
+ // -------------------------- data -------------------------- //
2174
+
2175
+ /**
2176
+ * get Outlayer instance from element
2177
+ * @param {Element} elem
2178
+ * @returns {Outlayer}
2179
+ */
2180
+ Outlayer.data = function( elem ) {
2181
+ elem = utils.getQueryElement( elem );
2182
+ var id = elem && elem.outlayerGUID;
2183
+ return id && instances[ id ];
2184
+ };
2185
+
2186
+
2187
+ // -------------------------- create Outlayer class -------------------------- //
2188
+
2189
+ /**
2190
+ * create a layout class
2191
+ * @param {String} namespace
2192
+ */
2193
+ Outlayer.create = function( namespace, options ) {
2194
+ // sub-class Outlayer
2195
+ var Layout = subclass( Outlayer );
2196
+ // apply new options and compatOptions
2197
+ Layout.defaults = utils.extend( {}, Outlayer.defaults );
2198
+ utils.extend( Layout.defaults, options );
2199
+ Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );
2200
+
2201
+ Layout.namespace = namespace;
2202
+
2203
+ Layout.data = Outlayer.data;
2204
+
2205
+ // sub-class Item
2206
+ Layout.Item = subclass( Item );
2207
+
2208
+ // -------------------------- declarative -------------------------- //
2209
+
2210
+ utils.htmlInit( Layout, namespace );
2211
+
2212
+ // -------------------------- jQuery bridge -------------------------- //
2213
+
2214
+ // make into jQuery plugin
2215
+ if ( jQuery && jQuery.bridget ) {
2216
+ jQuery.bridget( namespace, Layout );
2217
+ }
2218
+
2219
+ return Layout;
2220
+ };
2221
+
2222
+ function subclass( Parent ) {
2223
+ function SubClass() {
2224
+ Parent.apply( this, arguments );
2225
+ }
2226
+
2227
+ SubClass.prototype = Object.create( Parent.prototype );
2228
+ SubClass.prototype.constructor = SubClass;
2229
+
2230
+ return SubClass;
2231
+ }
2232
+
2233
+ // ----- helpers ----- //
2234
+
2235
+ // how many milliseconds are in each unit
2236
+ var msUnits = {
2237
+ ms: 1,
2238
+ s: 1000
2239
+ };
2240
+
2241
+ // munge time-like parameter into millisecond number
2242
+ // '0.4s' -> 40
2243
+ function getMilliseconds( time ) {
2244
+ if ( typeof time == 'number' ) {
2245
+ return time;
2246
+ }
2247
+ var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
2248
+ var num = matches && matches[1];
2249
+ var unit = matches && matches[2];
2250
+ if ( !num.length ) {
2251
+ return 0;
2252
+ }
2253
+ num = parseFloat( num );
2254
+ var mult = msUnits[ unit ] || 1;
2255
+ return num * mult;
2256
+ }
2257
+
2258
+ // ----- fin ----- //
2259
+
2260
+ // back in global
2261
+ Outlayer.Item = Item;
2262
+
2263
+ return Outlayer;
2264
+
2265
+ }));
2266
+
2267
+ /**
2268
+ * Isotope Item
2269
+ **/
2270
+
2271
+ ( function( window, factory ) {
2272
+ // universal module definition
2273
+ /* jshint strict: false */ /*globals define, module, require */
2274
+ if ( typeof define == 'function' && define.amd ) {
2275
+ // AMD
2276
+ define( 'isotope-layout/js/item',[
2277
+ 'outlayer/outlayer'
2278
+ ],
2279
+ factory );
2280
+ } else if ( typeof module == 'object' && module.exports ) {
2281
+ // CommonJS
2282
+ module.exports = factory(
2283
+ require('outlayer')
2284
+ );
2285
+ } else {
2286
+ // browser global
2287
+ window.Isotope = window.Isotope || {};
2288
+ window.Isotope.Item = factory(
2289
+ window.Outlayer
2290
+ );
2291
+ }
2292
+
2293
+ }( window, function factory( Outlayer ) {
2294
+ 'use strict';
2295
+
2296
+ // -------------------------- Item -------------------------- //
2297
+
2298
+ // sub-class Outlayer Item
2299
+ function Item() {
2300
+ Outlayer.Item.apply( this, arguments );
2301
+ }
2302
+
2303
+ var proto = Item.prototype = Object.create( Outlayer.Item.prototype );
2304
+
2305
+ var _create = proto._create;
2306
+ proto._create = function() {
2307
+ // assign id, used for original-order sorting
2308
+ this.id = this.layout.itemGUID++;
2309
+ _create.call( this );
2310
+ this.sortData = {};
2311
+ };
2312
+
2313
+ proto.updateSortData = function() {
2314
+ if ( this.isIgnored ) {
2315
+ return;
2316
+ }
2317
+ // default sorters
2318
+ this.sortData.id = this.id;
2319
+ // for backward compatibility
2320
+ this.sortData['original-order'] = this.id;
2321
+ this.sortData.random = Math.random();
2322
+ // go thru getSortData obj and apply the sorters
2323
+ var getSortData = this.layout.options.getSortData;
2324
+ var sorters = this.layout._sorters;
2325
+ for ( var key in getSortData ) {
2326
+ var sorter = sorters[ key ];
2327
+ this.sortData[ key ] = sorter( this.element, this );
2328
+ }
2329
+ };
2330
+
2331
+ var _destroy = proto.destroy;
2332
+ proto.destroy = function() {
2333
+ // call super
2334
+ _destroy.apply( this, arguments );
2335
+ // reset display, #741
2336
+ this.css({
2337
+ display: ''
2338
+ });
2339
+ };
2340
+
2341
+ return Item;
2342
+
2343
+ }));
2344
+
2345
+ /**
2346
+ * Isotope LayoutMode
2347
+ */
2348
+
2349
+ ( function( window, factory ) {
2350
+ // universal module definition
2351
+ /* jshint strict: false */ /*globals define, module, require */
2352
+ if ( typeof define == 'function' && define.amd ) {
2353
+ // AMD
2354
+ define( 'isotope-layout/js/layout-mode',[
2355
+ 'get-size/get-size',
2356
+ 'outlayer/outlayer'
2357
+ ],
2358
+ factory );
2359
+ } else if ( typeof module == 'object' && module.exports ) {
2360
+ // CommonJS
2361
+ module.exports = factory(
2362
+ require('get-size'),
2363
+ require('outlayer')
2364
+ );
2365
+ } else {
2366
+ // browser global
2367
+ window.Isotope = window.Isotope || {};
2368
+ window.Isotope.LayoutMode = factory(
2369
+ window.getSize,
2370
+ window.Outlayer
2371
+ );
2372
+ }
2373
+
2374
+ }( window, function factory( getSize, Outlayer ) {
2375
+ 'use strict';
2376
+
2377
+ // layout mode class
2378
+ function LayoutMode( isotope ) {
2379
+ this.isotope = isotope;
2380
+ // link properties
2381
+ if ( isotope ) {
2382
+ this.options = isotope.options[ this.namespace ];
2383
+ this.element = isotope.element;
2384
+ this.items = isotope.filteredItems;
2385
+ this.size = isotope.size;
2386
+ }
2387
+ }
2388
+
2389
+ var proto = LayoutMode.prototype;
2390
+
2391
+ /**
2392
+ * some methods should just defer to default Outlayer method
2393
+ * and reference the Isotope instance as `this`
2394
+ **/
2395
+ var facadeMethods = [
2396
+ '_resetLayout',
2397
+ '_getItemLayoutPosition',
2398
+ '_manageStamp',
2399
+ '_getContainerSize',
2400
+ '_getElementOffset',
2401
+ 'needsResizeLayout',
2402
+ '_getOption'
2403
+ ];
2404
+
2405
+ facadeMethods.forEach( function( methodName ) {
2406
+ proto[ methodName ] = function() {
2407
+ return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
2408
+ };
2409
+ });
2410
+
2411
+ // ----- ----- //
2412
+
2413
+ // for horizontal layout modes, check vertical size
2414
+ proto.needsVerticalResizeLayout = function() {
2415
+ // don't trigger if size did not change
2416
+ var size = getSize( this.isotope.element );
2417
+ // check that this.size and size are there
2418
+ // IE8 triggers resize on body size change, so they might not be
2419
+ var hasSizes = this.isotope.size && size;
2420
+ return hasSizes && size.innerHeight != this.isotope.size.innerHeight;
2421
+ };
2422
+
2423
+ // ----- measurements ----- //
2424
+
2425
+ proto._getMeasurement = function() {
2426
+ this.isotope._getMeasurement.apply( this, arguments );
2427
+ };
2428
+
2429
+ proto.getColumnWidth = function() {
2430
+ this.getSegmentSize( 'column', 'Width' );
2431
+ };
2432
+
2433
+ proto.getRowHeight = function() {
2434
+ this.getSegmentSize( 'row', 'Height' );
2435
+ };
2436
+
2437
+ /**
2438
+ * get columnWidth or rowHeight
2439
+ * segment: 'column' or 'row'
2440
+ * size 'Width' or 'Height'
2441
+ **/
2442
+ proto.getSegmentSize = function( segment, size ) {
2443
+ var segmentName = segment + size;
2444
+ var outerSize = 'outer' + size;
2445
+ // columnWidth / outerWidth // rowHeight / outerHeight
2446
+ this._getMeasurement( segmentName, outerSize );
2447
+ // got rowHeight or columnWidth, we can chill
2448
+ if ( this[ segmentName ] ) {
2449
+ return;
2450
+ }
2451
+ // fall back to item of first element
2452
+ var firstItemSize = this.getFirstItemSize();
2453
+ this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||
2454
+ // or size of container
2455
+ this.isotope.size[ 'inner' + size ];
2456
+ };
2457
+
2458
+ proto.getFirstItemSize = function() {
2459
+ var firstItem = this.isotope.filteredItems[0];
2460
+ return firstItem && firstItem.element && getSize( firstItem.element );
2461
+ };
2462
+
2463
+ // ----- methods that should reference isotope ----- //
2464
+
2465
+ proto.layout = function() {
2466
+ this.isotope.layout.apply( this.isotope, arguments );
2467
+ };
2468
+
2469
+ proto.getSize = function() {
2470
+ this.isotope.getSize();
2471
+ this.size = this.isotope.size;
2472
+ };
2473
+
2474
+ // -------------------------- create -------------------------- //
2475
+
2476
+ LayoutMode.modes = {};
2477
+
2478
+ LayoutMode.create = function( namespace, options ) {
2479
+
2480
+ function Mode() {
2481
+ LayoutMode.apply( this, arguments );
2482
+ }
2483
+
2484
+ Mode.prototype = Object.create( proto );
2485
+ Mode.prototype.constructor = Mode;
2486
+
2487
+ // default options
2488
+ if ( options ) {
2489
+ Mode.options = options;
2490
+ }
2491
+
2492
+ Mode.prototype.namespace = namespace;
2493
+ // register in Isotope
2494
+ LayoutMode.modes[ namespace ] = Mode;
2495
+
2496
+ return Mode;
2497
+ };
2498
+
2499
+ return LayoutMode;
2500
+
2501
+ }));
2502
+
2503
+ /*!
2504
+ * Masonry v4.2.1
2505
+ * Cascading grid layout library
2506
+ * https://masonry.desandro.com
2507
+ * MIT License
2508
+ * by David DeSandro
2509
+ */
2510
+
2511
+ ( function( window, factory ) {
2512
+ // universal module definition
2513
+ /* jshint strict: false */ /*globals define, module, require */
2514
+ if ( typeof define == 'function' && define.amd ) {
2515
+ // AMD
2516
+ define( 'masonry-layout/masonry',[
2517
+ 'outlayer/outlayer',
2518
+ 'get-size/get-size'
2519
+ ],
2520
+ factory );
2521
+ } else if ( typeof module == 'object' && module.exports ) {
2522
+ // CommonJS
2523
+ module.exports = factory(
2524
+ require('outlayer'),
2525
+ require('get-size')
2526
+ );
2527
+ } else {
2528
+ // browser global
2529
+ window.Masonry = factory(
2530
+ window.Outlayer,
2531
+ window.getSize
2532
+ );
2533
+ }
2534
+
2535
+ }( window, function factory( Outlayer, getSize ) {
2536
+
2537
+
2538
+
2539
+ // -------------------------- masonryDefinition -------------------------- //
2540
+
2541
+ // create an Outlayer layout class
2542
+ var Masonry = Outlayer.create('masonry');
2543
+ // isFitWidth -> fitWidth
2544
+ Masonry.compatOptions.fitWidth = 'isFitWidth';
2545
+
2546
+ var proto = Masonry.prototype;
2547
+
2548
+ proto._resetLayout = function() {
2549
+ this.getSize();
2550
+ this._getMeasurement( 'columnWidth', 'outerWidth' );
2551
+ this._getMeasurement( 'gutter', 'outerWidth' );
2552
+ this.measureColumns();
2553
+
2554
+ // reset column Y
2555
+ this.colYs = [];
2556
+ for ( var i=0; i < this.cols; i++ ) {
2557
+ this.colYs.push( 0 );
2558
+ }
2559
+
2560
+ this.maxY = 0;
2561
+ this.horizontalColIndex = 0;
2562
+ };
2563
+
2564
+ proto.measureColumns = function() {
2565
+ this.getContainerWidth();
2566
+ // if columnWidth is 0, default to outerWidth of first item
2567
+ if ( !this.columnWidth ) {
2568
+ var firstItem = this.items[0];
2569
+ var firstItemElem = firstItem && firstItem.element;
2570
+ // columnWidth fall back to item of first element
2571
+ this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
2572
+ // if first elem has no width, default to size of container
2573
+ this.containerWidth;
2574
+ }
2575
+
2576
+ var columnWidth = this.columnWidth += this.gutter;
2577
+
2578
+ // calculate columns
2579
+ var containerWidth = this.containerWidth + this.gutter;
2580
+ var cols = containerWidth / columnWidth;
2581
+ // fix rounding errors, typically with gutters
2582
+ var excess = columnWidth - containerWidth % columnWidth;
2583
+ // if overshoot is less than a pixel, round up, otherwise floor it
2584
+ var mathMethod = excess && excess < 1 ? 'round' : 'floor';
2585
+ cols = Math[ mathMethod ]( cols );
2586
+ this.cols = Math.max( cols, 1 );
2587
+ };
2588
+
2589
+ proto.getContainerWidth = function() {
2590
+ // container is parent if fit width
2591
+ var isFitWidth = this._getOption('fitWidth');
2592
+ var container = isFitWidth ? this.element.parentNode : this.element;
2593
+ // check that this.size and size are there
2594
+ // IE8 triggers resize on body size change, so they might not be
2595
+ var size = getSize( container );
2596
+ this.containerWidth = size && size.innerWidth;
2597
+ };
2598
+
2599
+ proto._getItemLayoutPosition = function( item ) {
2600
+ item.getSize();
2601
+ // how many columns does this brick span
2602
+ var remainder = item.size.outerWidth % this.columnWidth;
2603
+ var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
2604
+ // round if off by 1 pixel, otherwise use ceil
2605
+ var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
2606
+ colSpan = Math.min( colSpan, this.cols );
2607
+ // use horizontal or top column position
2608
+ var colPosMethod = this.options.horizontalOrder ?
2609
+ '_getHorizontalColPosition' : '_getTopColPosition';
2610
+ var colPosition = this[ colPosMethod ]( colSpan, item );
2611
+ // position the brick
2612
+ var position = {
2613
+ x: this.columnWidth * colPosition.col,
2614
+ y: colPosition.y
2615
+ };
2616
+ // apply setHeight to necessary columns
2617
+ var setHeight = colPosition.y + item.size.outerHeight;
2618
+ var setMax = colSpan + colPosition.col;
2619
+ for ( var i = colPosition.col; i < setMax; i++ ) {
2620
+ this.colYs[i] = setHeight;
2621
+ }
2622
+
2623
+ return position;
2624
+ };
2625
+
2626
+ proto._getTopColPosition = function( colSpan ) {
2627
+ var colGroup = this._getTopColGroup( colSpan );
2628
+ // get the minimum Y value from the columns
2629
+ var minimumY = Math.min.apply( Math, colGroup );
2630
+
2631
+ return {
2632
+ col: colGroup.indexOf( minimumY ),
2633
+ y: minimumY,
2634
+ };
2635
+ };
2636
+
2637
+ /**
2638
+ * @param {Number} colSpan - number of columns the element spans
2639
+ * @returns {Array} colGroup
2640
+ */
2641
+ proto._getTopColGroup = function( colSpan ) {
2642
+ if ( colSpan < 2 ) {
2643
+ // if brick spans only one column, use all the column Ys
2644
+ return this.colYs;
2645
+ }
2646
+
2647
+ var colGroup = [];
2648
+ // how many different places could this brick fit horizontally
2649
+ var groupCount = this.cols + 1 - colSpan;
2650
+ // for each group potential horizontal position
2651
+ for ( var i = 0; i < groupCount; i++ ) {
2652
+ colGroup[i] = this._getColGroupY( i, colSpan );
2653
+ }
2654
+ return colGroup;
2655
+ };
2656
+
2657
+ proto._getColGroupY = function( col, colSpan ) {
2658
+ if ( colSpan < 2 ) {
2659
+ return this.colYs[ col ];
2660
+ }
2661
+ // make an array of colY values for that one group
2662
+ var groupColYs = this.colYs.slice( col, col + colSpan );
2663
+ // and get the max value of the array
2664
+ return Math.max.apply( Math, groupColYs );
2665
+ };
2666
+
2667
+ // get column position based on horizontal index. #873
2668
+ proto._getHorizontalColPosition = function( colSpan, item ) {
2669
+ var col = this.horizontalColIndex % this.cols;
2670
+ var isOver = colSpan > 1 && col + colSpan > this.cols;
2671
+ // shift to next row if item can't fit on current row
2672
+ col = isOver ? 0 : col;
2673
+ // don't let zero-size items take up space
2674
+ var hasSize = item.size.outerWidth && item.size.outerHeight;
2675
+ this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;
2676
+
2677
+ return {
2678
+ col: col,
2679
+ y: this._getColGroupY( col, colSpan ),
2680
+ };
2681
+ };
2682
+
2683
+ proto._manageStamp = function( stamp ) {
2684
+ var stampSize = getSize( stamp );
2685
+ var offset = this._getElementOffset( stamp );
2686
+ // get the columns that this stamp affects
2687
+ var isOriginLeft = this._getOption('originLeft');
2688
+ var firstX = isOriginLeft ? offset.left : offset.right;
2689
+ var lastX = firstX + stampSize.outerWidth;
2690
+ var firstCol = Math.floor( firstX / this.columnWidth );
2691
+ firstCol = Math.max( 0, firstCol );
2692
+ var lastCol = Math.floor( lastX / this.columnWidth );
2693
+ // lastCol should not go over if multiple of columnWidth #425
2694
+ lastCol -= lastX % this.columnWidth ? 0 : 1;
2695
+ lastCol = Math.min( this.cols - 1, lastCol );
2696
+ // set colYs to bottom of the stamp
2697
+
2698
+ var isOriginTop = this._getOption('originTop');
2699
+ var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
2700
+ stampSize.outerHeight;
2701
+ for ( var i = firstCol; i <= lastCol; i++ ) {
2702
+ this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
2703
+ }
2704
+ };
2705
+
2706
+ proto._getContainerSize = function() {
2707
+ this.maxY = Math.max.apply( Math, this.colYs );
2708
+ var size = {
2709
+ height: this.maxY
2710
+ };
2711
+
2712
+ if ( this._getOption('fitWidth') ) {
2713
+ size.width = this._getContainerFitWidth();
2714
+ }
2715
+
2716
+ return size;
2717
+ };
2718
+
2719
+ proto._getContainerFitWidth = function() {
2720
+ var unusedCols = 0;
2721
+ // count unused columns
2722
+ var i = this.cols;
2723
+ while ( --i ) {
2724
+ if ( this.colYs[i] !== 0 ) {
2725
+ break;
2726
+ }
2727
+ unusedCols++;
2728
+ }
2729
+ // fit container to columns that have been used
2730
+ return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
2731
+ };
2732
+
2733
+ proto.needsResizeLayout = function() {
2734
+ var previousWidth = this.containerWidth;
2735
+ this.getContainerWidth();
2736
+ return previousWidth != this.containerWidth;
2737
+ };
2738
+
2739
+ return Masonry;
2740
+
2741
+ }));
2742
+
2743
+ /*!
2744
+ * Masonry layout mode
2745
+ * sub-classes Masonry
2746
+ * https://masonry.desandro.com
2747
+ */
2748
+
2749
+ ( function( window, factory ) {
2750
+ // universal module definition
2751
+ /* jshint strict: false */ /*globals define, module, require */
2752
+ if ( typeof define == 'function' && define.amd ) {
2753
+ // AMD
2754
+ define( 'isotope-layout/js/layout-modes/masonry',[
2755
+ '../layout-mode',
2756
+ 'masonry-layout/masonry'
2757
+ ],
2758
+ factory );
2759
+ } else if ( typeof module == 'object' && module.exports ) {
2760
+ // CommonJS
2761
+ module.exports = factory(
2762
+ require('../layout-mode'),
2763
+ require('masonry-layout')
2764
+ );
2765
+ } else {
2766
+ // browser global
2767
+ factory(
2768
+ window.Isotope.LayoutMode,
2769
+ window.Masonry
2770
+ );
2771
+ }
2772
+
2773
+ }( window, function factory( LayoutMode, Masonry ) {
2774
+ 'use strict';
2775
+
2776
+ // -------------------------- masonryDefinition -------------------------- //
2777
+
2778
+ // create an Outlayer layout class
2779
+ var MasonryMode = LayoutMode.create('masonry');
2780
+
2781
+ var proto = MasonryMode.prototype;
2782
+
2783
+ var keepModeMethods = {
2784
+ _getElementOffset: true,
2785
+ layout: true,
2786
+ _getMeasurement: true
2787
+ };
2788
+
2789
+ // inherit Masonry prototype
2790
+ for ( var method in Masonry.prototype ) {
2791
+ // do not inherit mode methods
2792
+ if ( !keepModeMethods[ method ] ) {
2793
+ proto[ method ] = Masonry.prototype[ method ];
2794
+ }
2795
+ }
2796
+
2797
+ var measureColumns = proto.measureColumns;
2798
+ proto.measureColumns = function() {
2799
+ // set items, used if measuring first item
2800
+ this.items = this.isotope.filteredItems;
2801
+ measureColumns.call( this );
2802
+ };
2803
+
2804
+ // point to mode options for fitWidth
2805
+ var _getOption = proto._getOption;
2806
+ proto._getOption = function( option ) {
2807
+ if ( option == 'fitWidth' ) {
2808
+ return this.options.isFitWidth !== undefined ?
2809
+ this.options.isFitWidth : this.options.fitWidth;
2810
+ }
2811
+ return _getOption.apply( this.isotope, arguments );
2812
+ };
2813
+
2814
+ return MasonryMode;
2815
+
2816
+ }));
2817
+
2818
+ /**
2819
+ * fitRows layout mode
2820
+ */
2821
+
2822
+ ( function( window, factory ) {
2823
+ // universal module definition
2824
+ /* jshint strict: false */ /*globals define, module, require */
2825
+ if ( typeof define == 'function' && define.amd ) {
2826
+ // AMD
2827
+ define( 'isotope-layout/js/layout-modes/fit-rows',[
2828
+ '../layout-mode'
2829
+ ],
2830
+ factory );
2831
+ } else if ( typeof exports == 'object' ) {
2832
+ // CommonJS
2833
+ module.exports = factory(
2834
+ require('../layout-mode')
2835
+ );
2836
+ } else {
2837
+ // browser global
2838
+ factory(
2839
+ window.Isotope.LayoutMode
2840
+ );
2841
+ }
2842
+
2843
+ }( window, function factory( LayoutMode ) {
2844
+ 'use strict';
2845
+
2846
+ var FitRows = LayoutMode.create('fitRows');
2847
+
2848
+ var proto = FitRows.prototype;
2849
+
2850
+ proto._resetLayout = function() {
2851
+ this.x = 0;
2852
+ this.y = 0;
2853
+ this.maxY = 0;
2854
+ this._getMeasurement( 'gutter', 'outerWidth' );
2855
+ };
2856
+
2857
+ proto._getItemLayoutPosition = function( item ) {
2858
+ item.getSize();
2859
+
2860
+ var itemWidth = item.size.outerWidth + this.gutter;
2861
+ // if this element cannot fit in the current row
2862
+ var containerWidth = this.isotope.size.innerWidth + this.gutter;
2863
+ if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {
2864
+ this.x = 0;
2865
+ this.y = this.maxY;
2866
+ }
2867
+
2868
+ var position = {
2869
+ x: this.x,
2870
+ y: this.y
2871
+ };
2872
+
2873
+ this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );
2874
+ this.x += itemWidth;
2875
+
2876
+ return position;
2877
+ };
2878
+
2879
+ proto._getContainerSize = function() {
2880
+ return { height: this.maxY };
2881
+ };
2882
+
2883
+ return FitRows;
2884
+
2885
+ }));
2886
+
2887
+ /**
2888
+ * vertical layout mode
2889
+ */
2890
+
2891
+ ( function( window, factory ) {
2892
+ // universal module definition
2893
+ /* jshint strict: false */ /*globals define, module, require */
2894
+ if ( typeof define == 'function' && define.amd ) {
2895
+ // AMD
2896
+ define( 'isotope-layout/js/layout-modes/vertical',[
2897
+ '../layout-mode'
2898
+ ],
2899
+ factory );
2900
+ } else if ( typeof module == 'object' && module.exports ) {
2901
+ // CommonJS
2902
+ module.exports = factory(
2903
+ require('../layout-mode')
2904
+ );
2905
+ } else {
2906
+ // browser global
2907
+ factory(
2908
+ window.Isotope.LayoutMode
2909
+ );
2910
+ }
2911
+
2912
+ }( window, function factory( LayoutMode ) {
2913
+ 'use strict';
2914
+
2915
+ var Vertical = LayoutMode.create( 'vertical', {
2916
+ horizontalAlignment: 0
2917
+ });
2918
+
2919
+ var proto = Vertical.prototype;
2920
+
2921
+ proto._resetLayout = function() {
2922
+ this.y = 0;
2923
+ };
2924
+
2925
+ proto._getItemLayoutPosition = function( item ) {
2926
+ item.getSize();
2927
+ var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *
2928
+ this.options.horizontalAlignment;
2929
+ var y = this.y;
2930
+ this.y += item.size.outerHeight;
2931
+ return { x: x, y: y };
2932
+ };
2933
+
2934
+ proto._getContainerSize = function() {
2935
+ return { height: this.y };
2936
+ };
2937
+
2938
+ return Vertical;
2939
+
2940
+ }));
2941
+
2942
+ /*!
2943
+ * Isotope v3.0.6
2944
+ *
2945
+ * Licensed GPLv3 for open source use
2946
+ * or Isotope Commercial License for commercial use
2947
+ *
2948
+ * https://isotope.metafizzy.co
2949
+ * Copyright 2010-2018 Metafizzy
2950
+ */
2951
+
2952
+ ( function( window, factory ) {
2953
+ // universal module definition
2954
+ /* jshint strict: false */ /*globals define, module, require */
2955
+ if ( typeof define == 'function' && define.amd ) {
2956
+ // AMD
2957
+ define( [
2958
+ 'outlayer/outlayer',
2959
+ 'get-size/get-size',
2960
+ 'desandro-matches-selector/matches-selector',
2961
+ 'fizzy-ui-utils/utils',
2962
+ 'isotope-layout/js/item',
2963
+ 'isotope-layout/js/layout-mode',
2964
+ // include default layout modes
2965
+ 'isotope-layout/js/layout-modes/masonry',
2966
+ 'isotope-layout/js/layout-modes/fit-rows',
2967
+ 'isotope-layout/js/layout-modes/vertical'
2968
+ ],
2969
+ function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {
2970
+ return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );
2971
+ });
2972
+ } else if ( typeof module == 'object' && module.exports ) {
2973
+ // CommonJS
2974
+ module.exports = factory(
2975
+ window,
2976
+ require('outlayer'),
2977
+ require('get-size'),
2978
+ require('desandro-matches-selector'),
2979
+ require('fizzy-ui-utils'),
2980
+ require('isotope-layout/js/item'),
2981
+ require('isotope-layout/js/layout-mode'),
2982
+ // include default layout modes
2983
+ require('isotope-layout/js/layout-modes/masonry'),
2984
+ require('isotope-layout/js/layout-modes/fit-rows'),
2985
+ require('isotope-layout/js/layout-modes/vertical')
2986
+ );
2987
+ } else {
2988
+ // browser global
2989
+ window.Isotope = factory(
2990
+ window,
2991
+ window.Outlayer,
2992
+ window.getSize,
2993
+ window.matchesSelector,
2994
+ window.fizzyUIUtils,
2995
+ window.Isotope.Item,
2996
+ window.Isotope.LayoutMode
2997
+ );
2998
+ }
2999
+
3000
+ }( window, function factory( window, Outlayer, getSize, matchesSelector, utils,
3001
+ Item, LayoutMode ) {
3002
+
3003
+
3004
+
3005
+ // -------------------------- vars -------------------------- //
3006
+
3007
+ var jQuery = window.jQuery;
3008
+
3009
+ // -------------------------- helpers -------------------------- //
3010
+
3011
+ var trim = String.prototype.trim ?
3012
+ function( str ) {
3013
+ return str.trim();
3014
+ } :
3015
+ function( str ) {
3016
+ return str.replace( /^\s+|\s+$/g, '' );
3017
+ };
3018
+
3019
+ // -------------------------- isotopeDefinition -------------------------- //
3020
+
3021
+ // create an Outlayer layout class
3022
+ var Isotope = Outlayer.create( 'isotope', {
3023
+ layoutMode: 'masonry',
3024
+ isJQueryFiltering: true,
3025
+ sortAscending: true
3026
+ });
3027
+
3028
+ Isotope.Item = Item;
3029
+ Isotope.LayoutMode = LayoutMode;
3030
+
3031
+ var proto = Isotope.prototype;
3032
+
3033
+ proto._create = function() {
3034
+ this.itemGUID = 0;
3035
+ // functions that sort items
3036
+ this._sorters = {};
3037
+ this._getSorters();
3038
+ // call super
3039
+ Outlayer.prototype._create.call( this );
3040
+
3041
+ // create layout modes
3042
+ this.modes = {};
3043
+ // start filteredItems with all items
3044
+ this.filteredItems = this.items;
3045
+ // keep of track of sortBys
3046
+ this.sortHistory = [ 'original-order' ];
3047
+ // create from registered layout modes
3048
+ for ( var name in LayoutMode.modes ) {
3049
+ this._initLayoutMode( name );
3050
+ }
3051
+ };
3052
+
3053
+ proto.reloadItems = function() {
3054
+ // reset item ID counter
3055
+ this.itemGUID = 0;
3056
+ // call super
3057
+ Outlayer.prototype.reloadItems.call( this );
3058
+ };
3059
+
3060
+ proto._itemize = function() {
3061
+ var items = Outlayer.prototype._itemize.apply( this, arguments );
3062
+ // assign ID for original-order
3063
+ for ( var i=0; i < items.length; i++ ) {
3064
+ var item = items[i];
3065
+ item.id = this.itemGUID++;
3066
+ }
3067
+ this._updateItemsSortData( items );
3068
+ return items;
3069
+ };
3070
+
3071
+
3072
+ // -------------------------- layout -------------------------- //
3073
+
3074
+ proto._initLayoutMode = function( name ) {
3075
+ var Mode = LayoutMode.modes[ name ];
3076
+ // set mode options
3077
+ // HACK extend initial options, back-fill in default options
3078
+ var initialOpts = this.options[ name ] || {};
3079
+ this.options[ name ] = Mode.options ?
3080
+ utils.extend( Mode.options, initialOpts ) : initialOpts;
3081
+ // init layout mode instance
3082
+ this.modes[ name ] = new Mode( this );
3083
+ };
3084
+
3085
+
3086
+ proto.layout = function() {
3087
+ // if first time doing layout, do all magic
3088
+ if ( !this._isLayoutInited && this._getOption('initLayout') ) {
3089
+ this.arrange();
3090
+ return;
3091
+ }
3092
+ this._layout();
3093
+ };
3094
+
3095
+ // private method to be used in layout() & magic()
3096
+ proto._layout = function() {
3097
+ // don't animate first layout
3098
+ var isInstant = this._getIsInstant();
3099
+ // layout flow
3100
+ this._resetLayout();
3101
+ this._manageStamps();
3102
+ this.layoutItems( this.filteredItems, isInstant );
3103
+
3104
+ // flag for initalized
3105
+ this._isLayoutInited = true;
3106
+ };
3107
+
3108
+ // filter + sort + layout
3109
+ proto.arrange = function( opts ) {
3110
+ // set any options pass
3111
+ this.option( opts );
3112
+ this._getIsInstant();
3113
+ // filter, sort, and layout
3114
+
3115
+ // filter
3116
+ var filtered = this._filter( this.items );
3117
+ this.filteredItems = filtered.matches;
3118
+
3119
+ this._bindArrangeComplete();
3120
+
3121
+ if ( this._isInstant ) {
3122
+ this._noTransition( this._hideReveal, [ filtered ] );
3123
+ } else {
3124
+ this._hideReveal( filtered );
3125
+ }
3126
+
3127
+ this._sort();
3128
+ this._layout();
3129
+ };
3130
+ // alias to _init for main plugin method
3131
+ proto._init = proto.arrange;
3132
+
3133
+ proto._hideReveal = function( filtered ) {
3134
+ this.reveal( filtered.needReveal );
3135
+ this.hide( filtered.needHide );
3136
+ };
3137
+
3138
+ // HACK
3139
+ // Don't animate/transition first layout
3140
+ // Or don't animate/transition other layouts
3141
+ proto._getIsInstant = function() {
3142
+ var isLayoutInstant = this._getOption('layoutInstant');
3143
+ var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :
3144
+ !this._isLayoutInited;
3145
+ this._isInstant = isInstant;
3146
+ return isInstant;
3147
+ };
3148
+
3149
+ // listen for layoutComplete, hideComplete and revealComplete
3150
+ // to trigger arrangeComplete
3151
+ proto._bindArrangeComplete = function() {
3152
+ // listen for 3 events to trigger arrangeComplete
3153
+ var isLayoutComplete, isHideComplete, isRevealComplete;
3154
+ var _this = this;
3155
+ function arrangeParallelCallback() {
3156
+ if ( isLayoutComplete && isHideComplete && isRevealComplete ) {
3157
+ _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );
3158
+ }
3159
+ }
3160
+ this.once( 'layoutComplete', function() {
3161
+ isLayoutComplete = true;
3162
+ arrangeParallelCallback();
3163
+ });
3164
+ this.once( 'hideComplete', function() {
3165
+ isHideComplete = true;
3166
+ arrangeParallelCallback();
3167
+ });
3168
+ this.once( 'revealComplete', function() {
3169
+ isRevealComplete = true;
3170
+ arrangeParallelCallback();
3171
+ });
3172
+ };
3173
+
3174
+ // -------------------------- filter -------------------------- //
3175
+
3176
+ proto._filter = function( items ) {
3177
+ var filter = this.options.filter;
3178
+ filter = filter || '*';
3179
+ var matches = [];
3180
+ var hiddenMatched = [];
3181
+ var visibleUnmatched = [];
3182
+
3183
+ var test = this._getFilterTest( filter );
3184
+
3185
+ // test each item
3186
+ for ( var i=0; i < items.length; i++ ) {
3187
+ var item = items[i];
3188
+ if ( item.isIgnored ) {
3189
+ continue;
3190
+ }
3191
+ // add item to either matched or unmatched group
3192
+ var isMatched = test( item );
3193
+ // item.isFilterMatched = isMatched;
3194
+ // add to matches if its a match
3195
+ if ( isMatched ) {
3196
+ matches.push( item );
3197
+ }
3198
+ // add to additional group if item needs to be hidden or revealed
3199
+ if ( isMatched && item.isHidden ) {
3200
+ hiddenMatched.push( item );
3201
+ } else if ( !isMatched && !item.isHidden ) {
3202
+ visibleUnmatched.push( item );
3203
+ }
3204
+ }
3205
+
3206
+ // return collections of items to be manipulated
3207
+ return {
3208
+ matches: matches,
3209
+ needReveal: hiddenMatched,
3210
+ needHide: visibleUnmatched
3211
+ };
3212
+ };
3213
+
3214
+ // get a jQuery, function, or a matchesSelector test given the filter
3215
+ proto._getFilterTest = function( filter ) {
3216
+ if ( jQuery && this.options.isJQueryFiltering ) {
3217
+ // use jQuery
3218
+ return function( item ) {
3219
+ return jQuery( item.element ).is( filter );
3220
+ };
3221
+ }
3222
+ if ( typeof filter == 'function' ) {
3223
+ // use filter as function
3224
+ return function( item ) {
3225
+ return filter( item.element );
3226
+ };
3227
+ }
3228
+ // default, use filter as selector string
3229
+ return function( item ) {
3230
+ return matchesSelector( item.element, filter );
3231
+ };
3232
+ };
3233
+
3234
+ // -------------------------- sorting -------------------------- //
3235
+
3236
+ /**
3237
+ * @params {Array} elems
3238
+ * @public
3239
+ */
3240
+ proto.updateSortData = function( elems ) {
3241
+ // get items
3242
+ var items;
3243
+ if ( elems ) {
3244
+ elems = utils.makeArray( elems );
3245
+ items = this.getItems( elems );
3246
+ } else {
3247
+ // update all items if no elems provided
3248
+ items = this.items;
3249
+ }
3250
+
3251
+ this._getSorters();
3252
+ this._updateItemsSortData( items );
3253
+ };
3254
+
3255
+ proto._getSorters = function() {
3256
+ var getSortData = this.options.getSortData;
3257
+ for ( var key in getSortData ) {
3258
+ var sorter = getSortData[ key ];
3259
+ this._sorters[ key ] = mungeSorter( sorter );
3260
+ }
3261
+ };
3262
+
3263
+ /**
3264
+ * @params {Array} items - of Isotope.Items
3265
+ * @private
3266
+ */
3267
+ proto._updateItemsSortData = function( items ) {
3268
+ // do not update if no items
3269
+ var len = items && items.length;
3270
+
3271
+ for ( var i=0; len && i < len; i++ ) {
3272
+ var item = items[i];
3273
+ item.updateSortData();
3274
+ }
3275
+ };
3276
+
3277
+ // ----- munge sorter ----- //
3278
+
3279
+ // encapsulate this, as we just need mungeSorter
3280
+ // other functions in here are just for munging
3281
+ var mungeSorter = ( function() {
3282
+ // add a magic layer to sorters for convienent shorthands
3283
+ // `.foo-bar` will use the text of .foo-bar querySelector
3284
+ // `[foo-bar]` will use attribute
3285
+ // you can also add parser
3286
+ // `.foo-bar parseInt` will parse that as a number
3287
+ function mungeSorter( sorter ) {
3288
+ // if not a string, return function or whatever it is
3289
+ if ( typeof sorter != 'string' ) {
3290
+ return sorter;
3291
+ }
3292
+ // parse the sorter string
3293
+ var args = trim( sorter ).split(' ');
3294
+ var query = args[0];
3295
+ // check if query looks like [an-attribute]
3296
+ var attrMatch = query.match( /^\[(.+)\]$/ );
3297
+ var attr = attrMatch && attrMatch[1];
3298
+ var getValue = getValueGetter( attr, query );
3299
+ // use second argument as a parser
3300
+ var parser = Isotope.sortDataParsers[ args[1] ];
3301
+ // parse the value, if there was a parser
3302
+ sorter = parser ? function( elem ) {
3303
+ return elem && parser( getValue( elem ) );
3304
+ } :
3305
+ // otherwise just return value
3306
+ function( elem ) {
3307
+ return elem && getValue( elem );
3308
+ };
3309
+
3310
+ return sorter;
3311
+ }
3312
+
3313
+ // get an attribute getter, or get text of the querySelector
3314
+ function getValueGetter( attr, query ) {
3315
+ // if query looks like [foo-bar], get attribute
3316
+ if ( attr ) {
3317
+ return function getAttribute( elem ) {
3318
+ return elem.getAttribute( attr );
3319
+ };
3320
+ }
3321
+
3322
+ // otherwise, assume its a querySelector, and get its text
3323
+ return function getChildText( elem ) {
3324
+ var child = elem.querySelector( query );
3325
+ return child && child.textContent;
3326
+ };
3327
+ }
3328
+
3329
+ return mungeSorter;
3330
+ })();
3331
+
3332
+ // parsers used in getSortData shortcut strings
3333
+ Isotope.sortDataParsers = {
3334
+ 'parseInt': function( val ) {
3335
+ return parseInt( val, 10 );
3336
+ },
3337
+ 'parseFloat': function( val ) {
3338
+ return parseFloat( val );
3339
+ }
3340
+ };
3341
+
3342
+ // ----- sort method ----- //
3343
+
3344
+ // sort filteredItem order
3345
+ proto._sort = function() {
3346
+ if ( !this.options.sortBy ) {
3347
+ return;
3348
+ }
3349
+ // keep track of sortBy History
3350
+ var sortBys = utils.makeArray( this.options.sortBy );
3351
+ if ( !this._getIsSameSortBy( sortBys ) ) {
3352
+ // concat all sortBy and sortHistory, add to front, oldest goes in last
3353
+ this.sortHistory = sortBys.concat( this.sortHistory );
3354
+ }
3355
+ // sort magic
3356
+ var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );
3357
+ this.filteredItems.sort( itemSorter );
3358
+ };
3359
+
3360
+ // check if sortBys is same as start of sortHistory
3361
+ proto._getIsSameSortBy = function( sortBys ) {
3362
+ for ( var i=0; i < sortBys.length; i++ ) {
3363
+ if ( sortBys[i] != this.sortHistory[i] ) {
3364
+ return false;
3365
+ }
3366
+ }
3367
+ return true;
3368
+ };
3369
+
3370
+ // returns a function used for sorting
3371
+ function getItemSorter( sortBys, sortAsc ) {
3372
+ return function sorter( itemA, itemB ) {
3373
+ // cycle through all sortKeys
3374
+ for ( var i = 0; i < sortBys.length; i++ ) {
3375
+ var sortBy = sortBys[i];
3376
+ var a = itemA.sortData[ sortBy ];
3377
+ var b = itemB.sortData[ sortBy ];
3378
+ if ( a > b || a < b ) {
3379
+ // if sortAsc is an object, use the value given the sortBy key
3380
+ var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;
3381
+ var direction = isAscending ? 1 : -1;
3382
+ return ( a > b ? 1 : -1 ) * direction;
3383
+ }
3384
+ }
3385
+ return 0;
3386
+ };
3387
+ }
3388
+
3389
+ // -------------------------- methods -------------------------- //
3390
+
3391
+ // get layout mode
3392
+ proto._mode = function() {
3393
+ var layoutMode = this.options.layoutMode;
3394
+ var mode = this.modes[ layoutMode ];
3395
+ if ( !mode ) {
3396
+ // TODO console.error
3397
+ throw new Error( 'No layout mode: ' + layoutMode );
3398
+ }
3399
+ // HACK sync mode's options
3400
+ // any options set after init for layout mode need to be synced
3401
+ mode.options = this.options[ layoutMode ];
3402
+ return mode;
3403
+ };
3404
+
3405
+ proto._resetLayout = function() {
3406
+ // trigger original reset layout
3407
+ Outlayer.prototype._resetLayout.call( this );
3408
+ this._mode()._resetLayout();
3409
+ };
3410
+
3411
+ proto._getItemLayoutPosition = function( item ) {
3412
+ return this._mode()._getItemLayoutPosition( item );
3413
+ };
3414
+
3415
+ proto._manageStamp = function( stamp ) {
3416
+ this._mode()._manageStamp( stamp );
3417
+ };
3418
+
3419
+ proto._getContainerSize = function() {
3420
+ return this._mode()._getContainerSize();
3421
+ };
3422
+
3423
+ proto.needsResizeLayout = function() {
3424
+ return this._mode().needsResizeLayout();
3425
+ };
3426
+
3427
+ // -------------------------- adding & removing -------------------------- //
3428
+
3429
+ // HEADS UP overwrites default Outlayer appended
3430
+ proto.appended = function( elems ) {
3431
+ var items = this.addItems( elems );
3432
+ if ( !items.length ) {
3433
+ return;
3434
+ }
3435
+ // filter, layout, reveal new items
3436
+ var filteredItems = this._filterRevealAdded( items );
3437
+ // add to filteredItems
3438
+ this.filteredItems = this.filteredItems.concat( filteredItems );
3439
+ };
3440
+
3441
+ // HEADS UP overwrites default Outlayer prepended
3442
+ proto.prepended = function( elems ) {
3443
+ var items = this._itemize( elems );
3444
+ if ( !items.length ) {
3445
+ return;
3446
+ }
3447
+ // start new layout
3448
+ this._resetLayout();
3449
+ this._manageStamps();
3450
+ // filter, layout, reveal new items
3451
+ var filteredItems = this._filterRevealAdded( items );
3452
+ // layout previous items
3453
+ this.layoutItems( this.filteredItems );
3454
+ // add to items and filteredItems
3455
+ this.filteredItems = filteredItems.concat( this.filteredItems );
3456
+ this.items = items.concat( this.items );
3457
+ };
3458
+
3459
+ proto._filterRevealAdded = function( items ) {
3460
+ var filtered = this._filter( items );
3461
+ this.hide( filtered.needHide );
3462
+ // reveal all new items
3463
+ this.reveal( filtered.matches );
3464
+ // layout new items, no transition
3465
+ this.layoutItems( filtered.matches, true );
3466
+ return filtered.matches;
3467
+ };
3468
+
3469
+ /**
3470
+ * Filter, sort, and layout newly-appended item elements
3471
+ * @param {Array or NodeList or Element} elems
3472
+ */
3473
+ proto.insert = function( elems ) {
3474
+ var items = this.addItems( elems );
3475
+ if ( !items.length ) {
3476
+ return;
3477
+ }
3478
+ // append item elements
3479
+ var i, item;
3480
+ var len = items.length;
3481
+ for ( i=0; i < len; i++ ) {
3482
+ item = items[i];
3483
+ this.element.appendChild( item.element );
3484
+ }
3485
+ // filter new stuff
3486
+ var filteredInsertItems = this._filter( items ).matches;
3487
+ // set flag
3488
+ for ( i=0; i < len; i++ ) {
3489
+ items[i].isLayoutInstant = true;
3490
+ }
3491
+ this.arrange();
3492
+ // reset flag
3493
+ for ( i=0; i < len; i++ ) {
3494
+ delete items[i].isLayoutInstant;
3495
+ }
3496
+ this.reveal( filteredInsertItems );
3497
+ };
3498
+
3499
+ var _remove = proto.remove;
3500
+ proto.remove = function( elems ) {
3501
+ elems = utils.makeArray( elems );
3502
+ var removeItems = this.getItems( elems );
3503
+ // do regular thing
3504
+ _remove.call( this, elems );
3505
+ // bail if no items to remove
3506
+ var len = removeItems && removeItems.length;
3507
+ // remove elems from filteredItems
3508
+ for ( var i=0; len && i < len; i++ ) {
3509
+ var item = removeItems[i];
3510
+ // remove item from collection
3511
+ utils.removeFrom( this.filteredItems, item );
3512
+ }
3513
+ };
3514
+
3515
+ proto.shuffle = function() {
3516
+ // update random sortData
3517
+ for ( var i=0; i < this.items.length; i++ ) {
3518
+ var item = this.items[i];
3519
+ item.sortData.random = Math.random();
3520
+ }
3521
+ this.options.sortBy = 'random';
3522
+ this._sort();
3523
+ this._layout();
3524
+ };
3525
+
3526
+ /**
3527
+ * trigger fn without transition
3528
+ * kind of hacky to have this in the first place
3529
+ * @param {Function} fn
3530
+ * @param {Array} args
3531
+ * @returns ret
3532
+ * @private
3533
+ */
3534
+ proto._noTransition = function( fn, args ) {
3535
+ // save transitionDuration before disabling
3536
+ var transitionDuration = this.options.transitionDuration;
3537
+ // disable transition
3538
+ this.options.transitionDuration = 0;
3539
+ // do it
3540
+ var returnValue = fn.apply( this, args );
3541
+ // re-enable transition for reveal
3542
+ this.options.transitionDuration = transitionDuration;
3543
+ return returnValue;
3544
+ };
3545
+
3546
+ // ----- helper methods ----- //
3547
+
3548
+ /**
3549
+ * getter method for getting filtered item elements
3550
+ * @returns {Array} elems - collection of item elements
3551
+ */
3552
+ proto.getFilteredItemElements = function() {
3553
+ return this.filteredItems.map( function( item ) {
3554
+ return item.element;
3555
+ });
3556
+ };
3557
+
3558
+ // ----- ----- //
3559
+
3560
+ return Isotope;
3561
+
3562
+ }));
3563
+
assets/lib/isotope/isotope.pkgd.min.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Isotope PACKAGED v3.0.6
3
+ *
4
+ * Licensed GPLv3 for open source use
5
+ * or Isotope Commercial License for commercial use
6
+ *
7
+ * https://isotope.metafizzy.co
8
+ * Copyright 2010-2018 Metafizzy
9
+ */
10
+
11
+ !function(t,e){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){"use strict";function i(i,s,a){function u(t,e,o){var n,s="$()."+i+'("'+e+'")';return t.each(function(t,u){var h=a.data(u,i);if(!h)return void r(i+" not initialized. Cannot call methods, i.e. "+s);var d=h[e];if(!d||"_"==e.charAt(0))return void r(s+" is not a valid method");var l=d.apply(h,o);n=void 0===n?l:n}),void 0!==n?n:t}function h(t,e){t.each(function(t,o){var n=a.data(o,i);n?(n.option(e),n._init()):(n=new s(o,e),a.data(o,i,n))})}a=a||e||t.jQuery,a&&(s.prototype.option||(s.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){var e=n.call(arguments,1);return u(this,t,e)}return h(this,t),this},o(a))}function o(t){!t||t&&t.bridget||(t.bridget=i)}var n=Array.prototype.slice,s=t.console,r="undefined"==typeof s?function(){}:function(t){s.error(t)};return o(e||t.jQuery),i}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},o=i[t]=i[t]||[];return o.indexOf(e)==-1&&o.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},o=i[t]=i[t]||{};return o[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var o=i.indexOf(e);return o!=-1&&i.splice(o,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){i=i.slice(0),e=e||[];for(var o=this._onceEvents&&this._onceEvents[t],n=0;n<i.length;n++){var s=i[n],r=o&&o[s];r&&(this.off(t,s),delete o[s]),s.apply(this,e)}return this}},e.allOff=function(){delete this._events,delete this._onceEvents},t}),function(t,e){"function"==typeof define&&define.amd?define("get-size/get-size",e):"object"==typeof module&&module.exports?module.exports=e():t.getSize=e()}(window,function(){"use strict";function t(t){var e=parseFloat(t),i=t.indexOf("%")==-1&&!isNaN(e);return i&&e}function e(){}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0;e<h;e++){var i=u[e];t[i]=0}return t}function o(t){var e=getComputedStyle(t);return e||a("Style returned "+e+". Are you running this code in a hidden iframe on Firefox? See https://bit.ly/getsizebug1"),e}function n(){if(!d){d=!0;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.boxSizing="border-box";var i=document.body||document.documentElement;i.appendChild(e);var n=o(e);r=200==Math.round(t(n.width)),s.isBoxSizeOuter=r,i.removeChild(e)}}function s(e){if(n(),"string"==typeof e&&(e=document.querySelector(e)),e&&"object"==typeof e&&e.nodeType){var s=o(e);if("none"==s.display)return i();var a={};a.width=e.offsetWidth,a.height=e.offsetHeight;for(var d=a.isBorderBox="border-box"==s.boxSizing,l=0;l<h;l++){var f=u[l],c=s[f],m=parseFloat(c);a[f]=isNaN(m)?0:m}var p=a.paddingLeft+a.paddingRight,y=a.paddingTop+a.paddingBottom,g=a.marginLeft+a.marginRight,v=a.marginTop+a.marginBottom,_=a.borderLeftWidth+a.borderRightWidth,z=a.borderTopWidth+a.borderBottomWidth,I=d&&r,x=t(s.width);x!==!1&&(a.width=x+(I?0:p+_));var S=t(s.height);return S!==!1&&(a.height=S+(I?0:y+z)),a.innerWidth=a.width-(p+_),a.innerHeight=a.height-(y+z),a.outerWidth=a.width+g,a.outerHeight=a.height+v,a}}var r,a="undefined"==typeof console?e:function(t){console.error(t)},u=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],h=u.length,d=!1;return s}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("desandro-matches-selector/matches-selector",e):"object"==typeof module&&module.exports?module.exports=e():t.matchesSelector=e()}(window,function(){"use strict";var t=function(){var t=window.Element.prototype;if(t.matches)return"matches";if(t.matchesSelector)return"matchesSelector";for(var e=["webkit","moz","ms","o"],i=0;i<e.length;i++){var o=e[i],n=o+"MatchesSelector";if(t[n])return n}}();return function(e,i){return e[t](i)}}),function(t,e){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["desandro-matches-selector/matches-selector"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("desandro-matches-selector")):t.fizzyUIUtils=e(t,t.matchesSelector)}(window,function(t,e){var i={};i.extend=function(t,e){for(var i in e)t[i]=e[i];return t},i.modulo=function(t,e){return(t%e+e)%e};var o=Array.prototype.slice;i.makeArray=function(t){if(Array.isArray(t))return t;if(null===t||void 0===t)return[];var e="object"==typeof t&&"number"==typeof t.length;return e?o.call(t):[t]},i.removeFrom=function(t,e){var i=t.indexOf(e);i!=-1&&t.splice(i,1)},i.getParent=function(t,i){for(;t.parentNode&&t!=document.body;)if(t=t.parentNode,e(t,i))return t},i.getQueryElement=function(t){return"string"==typeof t?document.querySelector(t):t},i.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},i.filterFindElements=function(t,o){t=i.makeArray(t);var n=[];return t.forEach(function(t){if(t instanceof HTMLElement){if(!o)return void n.push(t);e(t,o)&&n.push(t);for(var i=t.querySelectorAll(o),s=0;s<i.length;s++)n.push(i[s])}}),n},i.debounceMethod=function(t,e,i){i=i||100;var o=t.prototype[e],n=e+"Timeout";t.prototype[e]=function(){var t=this[n];clearTimeout(t);var e=arguments,s=this;this[n]=setTimeout(function(){o.apply(s,e),delete s[n]},i)}},i.docReady=function(t){var e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},i.toDashed=function(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()};var n=t.console;return i.htmlInit=function(e,o){i.docReady(function(){var s=i.toDashed(o),r="data-"+s,a=document.querySelectorAll("["+r+"]"),u=document.querySelectorAll(".js-"+s),h=i.makeArray(a).concat(i.makeArray(u)),d=r+"-options",l=t.jQuery;h.forEach(function(t){var i,s=t.getAttribute(r)||t.getAttribute(d);try{i=s&&JSON.parse(s)}catch(a){return void(n&&n.error("Error parsing "+r+" on "+t.className+": "+a))}var u=new e(t,i);l&&l.data(t,o,u)})})},i}),function(t,e){"function"==typeof define&&define.amd?define("outlayer/item",["ev-emitter/ev-emitter","get-size/get-size"],e):"object"==typeof module&&module.exports?module.exports=e(require("ev-emitter"),require("get-size")):(t.Outlayer={},t.Outlayer.Item=e(t.EvEmitter,t.getSize))}(window,function(t,e){"use strict";function i(t){for(var e in t)return!1;return e=null,!0}function o(t,e){t&&(this.element=t,this.layout=e,this.position={x:0,y:0},this._create())}function n(t){return t.replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()})}var s=document.documentElement.style,r="string"==typeof s.transition?"transition":"WebkitTransition",a="string"==typeof s.transform?"transform":"WebkitTransform",u={WebkitTransition:"webkitTransitionEnd",transition:"transitionend"}[r],h={transform:a,transition:r,transitionDuration:r+"Duration",transitionProperty:r+"Property",transitionDelay:r+"Delay"},d=o.prototype=Object.create(t.prototype);d.constructor=o,d._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},d.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},d.getSize=function(){this.size=e(this.element)},d.css=function(t){var e=this.element.style;for(var i in t){var o=h[i]||i;e[o]=t[i]}},d.getPosition=function(){var t=getComputedStyle(this.element),e=this.layout._getOption("originLeft"),i=this.layout._getOption("originTop"),o=t[e?"left":"right"],n=t[i?"top":"bottom"],s=parseFloat(o),r=parseFloat(n),a=this.layout.size;o.indexOf("%")!=-1&&(s=s/100*a.width),n.indexOf("%")!=-1&&(r=r/100*a.height),s=isNaN(s)?0:s,r=isNaN(r)?0:r,s-=e?a.paddingLeft:a.paddingRight,r-=i?a.paddingTop:a.paddingBottom,this.position.x=s,this.position.y=r},d.layoutPosition=function(){var t=this.layout.size,e={},i=this.layout._getOption("originLeft"),o=this.layout._getOption("originTop"),n=i?"paddingLeft":"paddingRight",s=i?"left":"right",r=i?"right":"left",a=this.position.x+t[n];e[s]=this.getXValue(a),e[r]="";var u=o?"paddingTop":"paddingBottom",h=o?"top":"bottom",d=o?"bottom":"top",l=this.position.y+t[u];e[h]=this.getYValue(l),e[d]="",this.css(e),this.emitEvent("layout",[this])},d.getXValue=function(t){var e=this.layout._getOption("horizontal");return this.layout.options.percentPosition&&!e?t/this.layout.size.width*100+"%":t+"px"},d.getYValue=function(t){var e=this.layout._getOption("horizontal");return this.layout.options.percentPosition&&e?t/this.layout.size.height*100+"%":t+"px"},d._transitionTo=function(t,e){this.getPosition();var i=this.position.x,o=this.position.y,n=t==this.position.x&&e==this.position.y;if(this.setPosition(t,e),n&&!this.isTransitioning)return void this.layoutPosition();var s=t-i,r=e-o,a={};a.transform=this.getTranslate(s,r),this.transition({to:a,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},d.getTranslate=function(t,e){var i=this.layout._getOption("originLeft"),o=this.layout._getOption("originTop");return t=i?t:-t,e=o?e:-e,"translate3d("+t+"px, "+e+"px, 0)"},d.goTo=function(t,e){this.setPosition(t,e),this.layoutPosition()},d.moveTo=d._transitionTo,d.setPosition=function(t,e){this.position.x=parseFloat(t),this.position.y=parseFloat(e)},d._nonTransition=function(t){this.css(t.to),t.isCleaning&&this._removeStyles(t.to);for(var e in t.onTransitionEnd)t.onTransitionEnd[e].call(this)},d.transition=function(t){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(t);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 o=this.element.offsetHeight;o=null}this.enableTransition(t.to),this.css(t.to),this.isTransitioning=!0};var l="opacity,"+n(a);d.enableTransition=function(){if(!this.isTransitioning){var t=this.layout.options.transitionDuration;t="number"==typeof t?t+"ms":t,this.css({transitionProperty:l,transitionDuration:t,transitionDelay:this.staggerDelay||0}),this.element.addEventListener(u,this,!1)}},d.onwebkitTransitionEnd=function(t){this.ontransitionend(t)},d.onotransitionend=function(t){this.ontransitionend(t)};var f={"-webkit-transform":"transform"};d.ontransitionend=function(t){if(t.target===this.element){var e=this._transn,o=f[t.propertyName]||t.propertyName;if(delete e.ingProperties[o],i(e.ingProperties)&&this.disableTransition(),o in e.clean&&(this.element.style[t.propertyName]="",delete e.clean[o]),o in e.onEnd){var n=e.onEnd[o];n.call(this),delete e.onEnd[o]}this.emitEvent("transitionEnd",[this])}},d.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(u,this,!1),this.isTransitioning=!1},d._removeStyles=function(t){var e={};for(var i in t)e[i]="";this.css(e)};var c={transitionProperty:"",transitionDuration:"",transitionDelay:""};return d.removeTransitionStyles=function(){this.css(c)},d.stagger=function(t){t=isNaN(t)?0:t,this.staggerDelay=t+"ms"},d.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},d.remove=function(){return r&&parseFloat(this.layout.options.transitionDuration)?(this.once("transitionEnd",function(){this.removeElem()}),void this.hide()):void this.removeElem()},d.reveal=function(){delete this.isHidden,this.css({display:""});var t=this.layout.options,e={},i=this.getHideRevealTransitionEndProperty("visibleStyle");e[i]=this.onRevealTransitionEnd,this.transition({from:t.hiddenStyle,to:t.visibleStyle,isCleaning:!0,onTransitionEnd:e})},d.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},d.getHideRevealTransitionEndProperty=function(t){var e=this.layout.options[t];if(e.opacity)return"opacity";for(var i in e)return i},d.hide=function(){this.isHidden=!0,this.css({display:""});var t=this.layout.options,e={},i=this.getHideRevealTransitionEndProperty("hiddenStyle");e[i]=this.onHideTransitionEnd,this.transition({from:t.visibleStyle,to:t.hiddenStyle,isCleaning:!0,onTransitionEnd:e})},d.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},d.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},o}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("outlayer/outlayer",["ev-emitter/ev-emitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(i,o,n,s){return e(t,i,o,n,s)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):t.Outlayer=e(t,t.EvEmitter,t.getSize,t.fizzyUIUtils,t.Outlayer.Item)}(window,function(t,e,i,o,n){"use strict";function s(t,e){var i=o.getQueryElement(t);if(!i)return void(u&&u.error("Bad element for "+this.constructor.namespace+": "+(i||t)));this.element=i,h&&(this.$element=h(this.element)),this.options=o.extend({},this.constructor.defaults),this.option(e);var n=++l;this.element.outlayerGUID=n,f[n]=this,this._create();var s=this._getOption("initLayout");s&&this.layout()}function r(t){function e(){t.apply(this,arguments)}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}function a(t){if("number"==typeof t)return t;var e=t.match(/(^\d*\.?\d*)(\w*)/),i=e&&e[1],o=e&&e[2];if(!i.length)return 0;i=parseFloat(i);var n=m[o]||1;return i*n}var u=t.console,h=t.jQuery,d=function(){},l=0,f={};s.namespace="outlayer",s.Item=n,s.defaults={containerStyle:{position:"relative"},initLayout:!0,originLeft:!0,originTop:!0,resize:!0,resizeContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}};var c=s.prototype;o.extend(c,e.prototype),c.option=function(t){o.extend(this.options,t)},c._getOption=function(t){var e=this.constructor.compatOptions[t];return e&&void 0!==this.options[e]?this.options[e]:this.options[t]},s.compatOptions={initLayout:"isInitLayout",horizontal:"isHorizontal",layoutInstant:"isLayoutInstant",originLeft:"isOriginLeft",originTop:"isOriginTop",resize:"isResizeBound",resizeContainer:"isResizingContainer"},c._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),o.extend(this.element.style,this.options.containerStyle);var t=this._getOption("resize");t&&this.bindResize()},c.reloadItems=function(){this.items=this._itemize(this.element.children)},c._itemize=function(t){for(var e=this._filterFindItemElements(t),i=this.constructor.Item,o=[],n=0;n<e.length;n++){var s=e[n],r=new i(s,this);o.push(r)}return o},c._filterFindItemElements=function(t){return o.filterFindElements(t,this.options.itemSelector)},c.getItemElements=function(){return this.items.map(function(t){return t.element})},c.layout=function(){this._resetLayout(),this._manageStamps();var t=this._getOption("layoutInstant"),e=void 0!==t?t:!this._isLayoutInited;this.layoutItems(this.items,e),this._isLayoutInited=!0},c._init=c.layout,c._resetLayout=function(){this.getSize()},c.getSize=function(){this.size=i(this.element)},c._getMeasurement=function(t,e){var o,n=this.options[t];n?("string"==typeof n?o=this.element.querySelector(n):n instanceof HTMLElement&&(o=n),this[t]=o?i(o)[e]:n):this[t]=0},c.layoutItems=function(t,e){t=this._getItemsForLayout(t),this._layoutItems(t,e),this._postLayout()},c._getItemsForLayout=function(t){return t.filter(function(t){return!t.isIgnored})},c._layoutItems=function(t,e){if(this._emitCompleteOnItems("layout",t),t&&t.length){var i=[];t.forEach(function(t){var o=this._getItemLayoutPosition(t);o.item=t,o.isInstant=e||t.isLayoutInstant,i.push(o)},this),this._processLayoutQueue(i)}},c._getItemLayoutPosition=function(){return{x:0,y:0}},c._processLayoutQueue=function(t){this.updateStagger(),t.forEach(function(t,e){this._positionItem(t.item,t.x,t.y,t.isInstant,e)},this)},c.updateStagger=function(){var t=this.options.stagger;return null===t||void 0===t?void(this.stagger=0):(this.stagger=a(t),this.stagger)},c._positionItem=function(t,e,i,o,n){o?t.goTo(e,i):(t.stagger(n*this.stagger),t.moveTo(e,i))},c._postLayout=function(){this.resizeContainer()},c.resizeContainer=function(){var t=this._getOption("resizeContainer");if(t){var e=this._getContainerSize();e&&(this._setContainerMeasure(e.width,!0),this._setContainerMeasure(e.height,!1))}},c._getContainerSize=d,c._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"}},c._emitCompleteOnItems=function(t,e){function i(){n.dispatchEvent(t+"Complete",null,[e])}function o(){r++,r==s&&i()}var n=this,s=e.length;if(!e||!s)return void i();var r=0;e.forEach(function(e){e.once(t,o)})},c.dispatchEvent=function(t,e,i){var o=e?[e].concat(i):i;if(this.emitEvent(t,o),h)if(this.$element=this.$element||h(this.element),e){var n=h.Event(e);n.type=t,this.$element.trigger(n,i)}else this.$element.trigger(t,i)},c.ignore=function(t){var e=this.getItem(t);e&&(e.isIgnored=!0)},c.unignore=function(t){var e=this.getItem(t);e&&delete e.isIgnored},c.stamp=function(t){t=this._find(t),t&&(this.stamps=this.stamps.concat(t),t.forEach(this.ignore,this))},c.unstamp=function(t){t=this._find(t),t&&t.forEach(function(t){o.removeFrom(this.stamps,t),this.unignore(t)},this)},c._find=function(t){if(t)return"string"==typeof t&&(t=this.element.querySelectorAll(t)),t=o.makeArray(t)},c._manageStamps=function(){this.stamps&&this.stamps.length&&(this._getBoundingRect(),this.stamps.forEach(this._manageStamp,this))},c._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)}},c._manageStamp=d,c._getElementOffset=function(t){var e=t.getBoundingClientRect(),o=this._boundingRect,n=i(t),s={left:e.left-o.left-n.marginLeft,top:e.top-o.top-n.marginTop,right:o.right-e.right-n.marginRight,bottom:o.bottom-e.bottom-n.marginBottom};return s},c.handleEvent=o.handleEvent,c.bindResize=function(){t.addEventListener("resize",this),this.isResizeBound=!0},c.unbindResize=function(){t.removeEventListener("resize",this),this.isResizeBound=!1},c.onresize=function(){this.resize()},o.debounceMethod(s,"onresize",100),c.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},c.needsResizeLayout=function(){var t=i(this.element),e=this.size&&t;return e&&t.innerWidth!==this.size.innerWidth},c.addItems=function(t){var e=this._itemize(t);return e.length&&(this.items=this.items.concat(e)),e},c.appended=function(t){var e=this.addItems(t);e.length&&(this.layoutItems(e,!0),this.reveal(e))},c.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)}},c.reveal=function(t){if(this._emitCompleteOnItems("reveal",t),t&&t.length){var e=this.updateStagger();t.forEach(function(t,i){t.stagger(i*e),t.reveal()})}},c.hide=function(t){if(this._emitCompleteOnItems("hide",t),t&&t.length){var e=this.updateStagger();t.forEach(function(t,i){t.stagger(i*e),t.hide()})}},c.revealItemElements=function(t){var e=this.getItems(t);this.reveal(e)},c.hideItemElements=function(t){var e=this.getItems(t);this.hide(e)},c.getItem=function(t){for(var e=0;e<this.items.length;e++){var i=this.items[e];if(i.element==t)return i}},c.getItems=function(t){t=o.makeArray(t);var e=[];return t.forEach(function(t){var i=this.getItem(t);i&&e.push(i)},this),e},c.remove=function(t){var e=this.getItems(t);this._emitCompleteOnItems("remove",e),e&&e.length&&e.forEach(function(t){t.remove(),o.removeFrom(this.items,t)},this)},c.destroy=function(){var t=this.element.style;t.height="",t.position="",t.width="",this.items.forEach(function(t){t.destroy()}),this.unbindResize();var e=this.element.outlayerGUID;delete f[e],delete this.element.outlayerGUID,h&&h.removeData(this.element,this.constructor.namespace)},s.data=function(t){t=o.getQueryElement(t);var e=t&&t.outlayerGUID;return e&&f[e]},s.create=function(t,e){var i=r(s);return i.defaults=o.extend({},s.defaults),o.extend(i.defaults,e),i.compatOptions=o.extend({},s.compatOptions),i.namespace=t,i.data=s.data,i.Item=r(n),o.htmlInit(i,t),h&&h.bridget&&h.bridget(t,i),i};var m={ms:1,s:1e3};return s.Item=n,s}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/item",["outlayer/outlayer"],e):"object"==typeof module&&module.exports?module.exports=e(require("outlayer")):(t.Isotope=t.Isotope||{},t.Isotope.Item=e(t.Outlayer))}(window,function(t){"use strict";function e(){t.Item.apply(this,arguments)}var i=e.prototype=Object.create(t.Item.prototype),o=i._create;i._create=function(){this.id=this.layout.itemGUID++,o.call(this),this.sortData={}},i.updateSortData=function(){if(!this.isIgnored){this.sortData.id=this.id,this.sortData["original-order"]=this.id,this.sortData.random=Math.random();var t=this.layout.options.getSortData,e=this.layout._sorters;for(var i in t){var o=e[i];this.sortData[i]=o(this.element,this)}}};var n=i.destroy;return i.destroy=function(){n.apply(this,arguments),this.css({display:""})},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-mode",["get-size/get-size","outlayer/outlayer"],e):"object"==typeof module&&module.exports?module.exports=e(require("get-size"),require("outlayer")):(t.Isotope=t.Isotope||{},t.Isotope.LayoutMode=e(t.getSize,t.Outlayer))}(window,function(t,e){"use strict";function i(t){this.isotope=t,t&&(this.options=t.options[this.namespace],this.element=t.element,this.items=t.filteredItems,this.size=t.size)}var o=i.prototype,n=["_resetLayout","_getItemLayoutPosition","_manageStamp","_getContainerSize","_getElementOffset","needsResizeLayout","_getOption"];return n.forEach(function(t){o[t]=function(){return e.prototype[t].apply(this.isotope,arguments)}}),o.needsVerticalResizeLayout=function(){var e=t(this.isotope.element),i=this.isotope.size&&e;return i&&e.innerHeight!=this.isotope.size.innerHeight},o._getMeasurement=function(){this.isotope._getMeasurement.apply(this,arguments)},o.getColumnWidth=function(){this.getSegmentSize("column","Width")},o.getRowHeight=function(){this.getSegmentSize("row","Height")},o.getSegmentSize=function(t,e){var i=t+e,o="outer"+e;if(this._getMeasurement(i,o),!this[i]){var n=this.getFirstItemSize();this[i]=n&&n[o]||this.isotope.size["inner"+e]}},o.getFirstItemSize=function(){var e=this.isotope.filteredItems[0];return e&&e.element&&t(e.element)},o.layout=function(){this.isotope.layout.apply(this.isotope,arguments)},o.getSize=function(){this.isotope.getSize(),this.size=this.isotope.size},i.modes={},i.create=function(t,e){function n(){i.apply(this,arguments)}return n.prototype=Object.create(o),n.prototype.constructor=n,e&&(n.options=e),n.prototype.namespace=t,i.modes[t]=n,n},i}),function(t,e){"function"==typeof define&&define.amd?define("masonry-layout/masonry",["outlayer/outlayer","get-size/get-size"],e):"object"==typeof module&&module.exports?module.exports=e(require("outlayer"),require("get-size")):t.Masonry=e(t.Outlayer,t.getSize)}(window,function(t,e){var i=t.create("masonry");i.compatOptions.fitWidth="isFitWidth";var o=i.prototype;return o._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns(),this.colYs=[];for(var t=0;t<this.cols;t++)this.colYs.push(0);this.maxY=0,this.horizontalColIndex=0},o.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var t=this.items[0],i=t&&t.element;this.columnWidth=i&&e(i).outerWidth||this.containerWidth}var o=this.columnWidth+=this.gutter,n=this.containerWidth+this.gutter,s=n/o,r=o-n%o,a=r&&r<1?"round":"floor";s=Math[a](s),this.cols=Math.max(s,1)},o.getContainerWidth=function(){var t=this._getOption("fitWidth"),i=t?this.element.parentNode:this.element,o=e(i);this.containerWidth=o&&o.innerWidth},o._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,i=e&&e<1?"round":"ceil",o=Math[i](t.size.outerWidth/this.columnWidth);o=Math.min(o,this.cols);for(var n=this.options.horizontalOrder?"_getHorizontalColPosition":"_getTopColPosition",s=this[n](o,t),r={x:this.columnWidth*s.col,y:s.y},a=s.y+t.size.outerHeight,u=o+s.col,h=s.col;h<u;h++)this.colYs[h]=a;return r},o._getTopColPosition=function(t){var e=this._getTopColGroup(t),i=Math.min.apply(Math,e);return{col:e.indexOf(i),y:i}},o._getTopColGroup=function(t){if(t<2)return this.colYs;for(var e=[],i=this.cols+1-t,o=0;o<i;o++)e[o]=this._getColGroupY(o,t);return e},o._getColGroupY=function(t,e){if(e<2)return this.colYs[t];var i=this.colYs.slice(t,t+e);return Math.max.apply(Math,i)},o._getHorizontalColPosition=function(t,e){var i=this.horizontalColIndex%this.cols,o=t>1&&i+t>this.cols;i=o?0:i;var n=e.size.outerWidth&&e.size.outerHeight;return this.horizontalColIndex=n?i+t:this.horizontalColIndex,{col:i,y:this._getColGroupY(i,t)}},o._manageStamp=function(t){var i=e(t),o=this._getElementOffset(t),n=this._getOption("originLeft"),s=n?o.left:o.right,r=s+i.outerWidth,a=Math.floor(s/this.columnWidth);a=Math.max(0,a);var u=Math.floor(r/this.columnWidth);u-=r%this.columnWidth?0:1,u=Math.min(this.cols-1,u);for(var h=this._getOption("originTop"),d=(h?o.top:o.bottom)+i.outerHeight,l=a;l<=u;l++)this.colYs[l]=Math.max(d,this.colYs[l])},o._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this._getOption("fitWidth")&&(t.width=this._getContainerFitWidth()),t},o._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},o.needsResizeLayout=function(){var t=this.containerWidth;return this.getContainerWidth(),t!=this.containerWidth},i}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-modes/masonry",["../layout-mode","masonry-layout/masonry"],e):"object"==typeof module&&module.exports?module.exports=e(require("../layout-mode"),require("masonry-layout")):e(t.Isotope.LayoutMode,t.Masonry)}(window,function(t,e){"use strict";var i=t.create("masonry"),o=i.prototype,n={_getElementOffset:!0,layout:!0,_getMeasurement:!0};for(var s in e.prototype)n[s]||(o[s]=e.prototype[s]);var r=o.measureColumns;o.measureColumns=function(){this.items=this.isotope.filteredItems,r.call(this)};var a=o._getOption;return o._getOption=function(t){return"fitWidth"==t?void 0!==this.options.isFitWidth?this.options.isFitWidth:this.options.fitWidth:a.apply(this.isotope,arguments)},i}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-modes/fit-rows",["../layout-mode"],e):"object"==typeof exports?module.exports=e(require("../layout-mode")):e(t.Isotope.LayoutMode)}(window,function(t){"use strict";var e=t.create("fitRows"),i=e.prototype;return i._resetLayout=function(){this.x=0,this.y=0,this.maxY=0,this._getMeasurement("gutter","outerWidth")},i._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth+this.gutter,i=this.isotope.size.innerWidth+this.gutter;0!==this.x&&e+this.x>i&&(this.x=0,this.y=this.maxY);var o={x:this.x,y:this.y};return this.maxY=Math.max(this.maxY,this.y+t.size.outerHeight),this.x+=e,o},i._getContainerSize=function(){return{height:this.maxY}},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-modes/vertical",["../layout-mode"],e):"object"==typeof module&&module.exports?module.exports=e(require("../layout-mode")):e(t.Isotope.LayoutMode)}(window,function(t){"use strict";var e=t.create("vertical",{horizontalAlignment:0}),i=e.prototype;return i._resetLayout=function(){this.y=0},i._getItemLayoutPosition=function(t){t.getSize();var e=(this.isotope.size.innerWidth-t.size.outerWidth)*this.options.horizontalAlignment,i=this.y;return this.y+=t.size.outerHeight,{x:e,y:i}},i._getContainerSize=function(){return{height:this.y}},e}),function(t,e){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","desandro-matches-selector/matches-selector","fizzy-ui-utils/utils","isotope-layout/js/item","isotope-layout/js/layout-mode","isotope-layout/js/layout-modes/masonry","isotope-layout/js/layout-modes/fit-rows","isotope-layout/js/layout-modes/vertical"],function(i,o,n,s,r,a){return e(t,i,o,n,s,r,a)}):"object"==typeof module&&module.exports?module.exports=e(t,require("outlayer"),require("get-size"),require("desandro-matches-selector"),require("fizzy-ui-utils"),require("isotope-layout/js/item"),require("isotope-layout/js/layout-mode"),require("isotope-layout/js/layout-modes/masonry"),require("isotope-layout/js/layout-modes/fit-rows"),require("isotope-layout/js/layout-modes/vertical")):t.Isotope=e(t,t.Outlayer,t.getSize,t.matchesSelector,t.fizzyUIUtils,t.Isotope.Item,t.Isotope.LayoutMode)}(window,function(t,e,i,o,n,s,r){function a(t,e){return function(i,o){for(var n=0;n<t.length;n++){var s=t[n],r=i.sortData[s],a=o.sortData[s];if(r>a||r<a){var u=void 0!==e[s]?e[s]:e,h=u?1:-1;return(r>a?1:-1)*h}}return 0}}var u=t.jQuery,h=String.prototype.trim?function(t){return t.trim()}:function(t){return t.replace(/^\s+|\s+$/g,"")},d=e.create("isotope",{layoutMode:"masonry",isJQueryFiltering:!0,sortAscending:!0});d.Item=s,d.LayoutMode=r;var l=d.prototype;l._create=function(){this.itemGUID=0,this._sorters={},this._getSorters(),e.prototype._create.call(this),this.modes={},this.filteredItems=this.items,this.sortHistory=["original-order"];for(var t in r.modes)this._initLayoutMode(t)},l.reloadItems=function(){this.itemGUID=0,e.prototype.reloadItems.call(this)},l._itemize=function(){for(var t=e.prototype._itemize.apply(this,arguments),i=0;i<t.length;i++){var o=t[i];o.id=this.itemGUID++}return this._updateItemsSortData(t),t},l._initLayoutMode=function(t){var e=r.modes[t],i=this.options[t]||{};this.options[t]=e.options?n.extend(e.options,i):i,this.modes[t]=new e(this)},l.layout=function(){return!this._isLayoutInited&&this._getOption("initLayout")?void this.arrange():void this._layout()},l._layout=function(){var t=this._getIsInstant();this._resetLayout(),this._manageStamps(),this.layoutItems(this.filteredItems,t),this._isLayoutInited=!0},l.arrange=function(t){this.option(t),this._getIsInstant();var e=this._filter(this.items);this.filteredItems=e.matches,this._bindArrangeComplete(),this._isInstant?this._noTransition(this._hideReveal,[e]):this._hideReveal(e),this._sort(),this._layout()},l._init=l.arrange,l._hideReveal=function(t){this.reveal(t.needReveal),this.hide(t.needHide)},l._getIsInstant=function(){var t=this._getOption("layoutInstant"),e=void 0!==t?t:!this._isLayoutInited;return this._isInstant=e,e},l._bindArrangeComplete=function(){function t(){e&&i&&o&&n.dispatchEvent("arrangeComplete",null,[n.filteredItems])}var e,i,o,n=this;this.once("layoutComplete",function(){e=!0,t()}),this.once("hideComplete",function(){i=!0,t()}),this.once("revealComplete",function(){o=!0,t()})},l._filter=function(t){var e=this.options.filter;e=e||"*";for(var i=[],o=[],n=[],s=this._getFilterTest(e),r=0;r<t.length;r++){var a=t[r];if(!a.isIgnored){var u=s(a);u&&i.push(a),u&&a.isHidden?o.push(a):u||a.isHidden||n.push(a)}}return{matches:i,needReveal:o,needHide:n}},l._getFilterTest=function(t){return u&&this.options.isJQueryFiltering?function(e){return u(e.element).is(t);
12
+ }:"function"==typeof t?function(e){return t(e.element)}:function(e){return o(e.element,t)}},l.updateSortData=function(t){var e;t?(t=n.makeArray(t),e=this.getItems(t)):e=this.items,this._getSorters(),this._updateItemsSortData(e)},l._getSorters=function(){var t=this.options.getSortData;for(var e in t){var i=t[e];this._sorters[e]=f(i)}},l._updateItemsSortData=function(t){for(var e=t&&t.length,i=0;e&&i<e;i++){var o=t[i];o.updateSortData()}};var f=function(){function t(t){if("string"!=typeof t)return t;var i=h(t).split(" "),o=i[0],n=o.match(/^\[(.+)\]$/),s=n&&n[1],r=e(s,o),a=d.sortDataParsers[i[1]];return t=a?function(t){return t&&a(r(t))}:function(t){return t&&r(t)}}function e(t,e){return t?function(e){return e.getAttribute(t)}:function(t){var i=t.querySelector(e);return i&&i.textContent}}return t}();d.sortDataParsers={parseInt:function(t){return parseInt(t,10)},parseFloat:function(t){return parseFloat(t)}},l._sort=function(){if(this.options.sortBy){var t=n.makeArray(this.options.sortBy);this._getIsSameSortBy(t)||(this.sortHistory=t.concat(this.sortHistory));var e=a(this.sortHistory,this.options.sortAscending);this.filteredItems.sort(e)}},l._getIsSameSortBy=function(t){for(var e=0;e<t.length;e++)if(t[e]!=this.sortHistory[e])return!1;return!0},l._mode=function(){var t=this.options.layoutMode,e=this.modes[t];if(!e)throw new Error("No layout mode: "+t);return e.options=this.options[t],e},l._resetLayout=function(){e.prototype._resetLayout.call(this),this._mode()._resetLayout()},l._getItemLayoutPosition=function(t){return this._mode()._getItemLayoutPosition(t)},l._manageStamp=function(t){this._mode()._manageStamp(t)},l._getContainerSize=function(){return this._mode()._getContainerSize()},l.needsResizeLayout=function(){return this._mode().needsResizeLayout()},l.appended=function(t){var e=this.addItems(t);if(e.length){var i=this._filterRevealAdded(e);this.filteredItems=this.filteredItems.concat(i)}},l.prepended=function(t){var e=this._itemize(t);if(e.length){this._resetLayout(),this._manageStamps();var i=this._filterRevealAdded(e);this.layoutItems(this.filteredItems),this.filteredItems=i.concat(this.filteredItems),this.items=e.concat(this.items)}},l._filterRevealAdded=function(t){var e=this._filter(t);return this.hide(e.needHide),this.reveal(e.matches),this.layoutItems(e.matches,!0),e.matches},l.insert=function(t){var e=this.addItems(t);if(e.length){var i,o,n=e.length;for(i=0;i<n;i++)o=e[i],this.element.appendChild(o.element);var s=this._filter(e).matches;for(i=0;i<n;i++)e[i].isLayoutInstant=!0;for(this.arrange(),i=0;i<n;i++)delete e[i].isLayoutInstant;this.reveal(s)}};var c=l.remove;return l.remove=function(t){t=n.makeArray(t);var e=this.getItems(t);c.call(this,t);for(var i=e&&e.length,o=0;i&&o<i;o++){var s=e[o];n.removeFrom(this.filteredItems,s)}},l.shuffle=function(){for(var t=0;t<this.items.length;t++){var e=this.items[t];e.sortData.random=Math.random()}this.options.sortBy="random",this._sort(),this._layout()},l._noTransition=function(t,e){var i=this.options.transitionDuration;this.options.transitionDuration=0;var o=t.apply(this,e);return this.options.transitionDuration=i,o},l.getFilteredItemElements=function(){return this.filteredItems.map(function(t){return t.element})},d});
changelog.txt CHANGED
@@ -1,3 +1,7 @@
 
 
 
 
1
  == 2.2.1 ==
2
  Release date: November 2, 2020
3
  * Fixed: Instagram Feed - Feed was not working
1
+ == 2.2.2 ==
2
+ Release date: December 10, 2020
3
+ * Fixed: Instagram Feed - Masonry layout
4
+
5
  == 2.2.1 ==
6
  Release date: November 2, 2020
7
  * Fixed: Instagram Feed - Feed was not working
package.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "powerpack-lite-for-elementor",
3
- "version": "2.2.1",
4
  "description": "Extend Elementor Page Builder with 50+ Creative Widgets.",
5
  "keywords": [],
6
  "author": "IdeaBox Creations",
1
  {
2
  "name": "powerpack-lite-for-elementor",
3
+ "version": "2.2.2",
4
  "description": "Extend Elementor Page Builder with 50+ Creative Widgets.",
5
  "keywords": [],
6
  "author": "IdeaBox Creations",
plugin.php CHANGED
@@ -204,6 +204,16 @@ class PowerpackLitePlugin {
204
  )
205
  );
206
 
 
 
 
 
 
 
 
 
 
 
207
  wp_register_script(
208
  'twentytwenty',
209
  POWERPACK_ELEMENTS_LITE_URL . 'assets/lib/twentytwenty/jquery.twentytwenty.js',
204
  )
205
  );
206
 
207
+ wp_register_script(
208
+ 'isotope',
209
+ POWERPACK_ELEMENTS_LITE_URL . 'assets/lib/isotope/isotope.pkgd' . $suffix . '.js',
210
+ array(
211
+ 'jquery',
212
+ ),
213
+ '0.5.3',
214
+ true
215
+ );
216
+
217
  wp_register_script(
218
  'twentytwenty',
219
  POWERPACK_ELEMENTS_LITE_URL . 'assets/lib/twentytwenty/jquery.twentytwenty.js',
powerpack-lite-elementor.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: PowerPack Lite for Elementor
4
  * Plugin URI: https://powerpackelements.com
5
  * Description: Custom addons for Elementor page builder.
6
- * Version: 2.2.1
7
  * Author: IdeaBox Creations
8
  * Author URI: http://ideabox.io/
9
  * License: GNU General Public License v2.0
@@ -14,7 +14,7 @@
14
 
15
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
16
 
17
- define( 'POWERPACK_ELEMENTS_LITE_VER', '2.2.1' );
18
  define( 'POWERPACK_ELEMENTS_LITE_PATH', plugin_dir_path( __FILE__ ) );
19
  define( 'POWERPACK_ELEMENTS_LITE_BASE', plugin_basename( __FILE__ ) );
20
  define( 'POWERPACK_ELEMENTS_LITE_URL', plugins_url( '/', __FILE__ ) );
3
  * Plugin Name: PowerPack Lite for Elementor
4
  * Plugin URI: https://powerpackelements.com
5
  * Description: Custom addons for Elementor page builder.
6
+ * Version: 2.2.2
7
  * Author: IdeaBox Creations
8
  * Author URI: http://ideabox.io/
9
  * License: GNU General Public License v2.0
14
 
15
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
16
 
17
+ define( 'POWERPACK_ELEMENTS_LITE_VER', '2.2.2' );
18
  define( 'POWERPACK_ELEMENTS_LITE_PATH', plugin_dir_path( __FILE__ ) );
19
  define( 'POWERPACK_ELEMENTS_LITE_BASE', plugin_basename( __FILE__ ) );
20
  define( 'POWERPACK_ELEMENTS_LITE_URL', plugins_url( '/', __FILE__ ) );
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Contributors: ideaboxcreations, simrandeep, puneetsahalot, ibachal, jainnidhi, prash17, nirbhay18
3
  Tags: elementor, addons, elementor addon, elementor widgets, elements, powerpack elementor addon, essential addons
4
  Requires at least: 5.0
5
- Tested up to: 5.5.1
6
  Stable tag: trunk
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -206,6 +206,9 @@ Not at all! All the widgets and settings are easy to use with drag & drop interf
206
 
207
  == Changelog ==
208
 
 
 
 
209
  = 2.2.1 - November 2, 2020 =
210
  * Fixed: Instagram Feed - Feed was not working
211
 
2
  Contributors: ideaboxcreations, simrandeep, puneetsahalot, ibachal, jainnidhi, prash17, nirbhay18
3
  Tags: elementor, addons, elementor addon, elementor widgets, elements, powerpack elementor addon, essential addons
4
  Requires at least: 5.0
5
+ Tested up to: 5.6
6
  Stable tag: trunk
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
206
 
207
  == Changelog ==
208
 
209
+ = 2.2.2 - December 10, 2020 =
210
+ * Fixed: Instagram Feed - Masonry layout
211
+
212
  = 2.2.1 - November 2, 2020 =
213
  * Fixed: Instagram Feed - Feed was not working
214