diff --git a/modules/backend/assets/css/dashboard/dashboard.css b/modules/backend/assets/css/dashboard/dashboard.css
index c09524d57..2fb878cea 100644
--- a/modules/backend/assets/css/dashboard/dashboard.css
+++ b/modules/backend/assets/css/dashboard/dashboard.css
@@ -1,13 +1,7 @@
-.dashboard-container > .report-container {
- -webkit-transition: background 1s ease;
- transition: background 1s ease;
- border-radius: 5px;
-}
.dashboard-container > .report-container.loading {
position: absolute;
width: 100%;
height: 100%;
- background: #fff;
}
.dashboard-container > .report-container.loading .loading-indicator-container {
position: absolute;
@@ -16,54 +10,3 @@
width: 100%;
height: 100%;
}
-.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator {
- background: transparent;
- padding: 0;
- height: 150px;
- top: 50%;
- margin-top: -90px;
-}
-.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator:after {
- content: '';
- background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat;
- background-size: 100px 100px;
- width: 100px;
- height: 100px;
- left: 50%;
- top: 50%;
- margin-top: -50px;
- margin-left: -50px;
- position: absolute;
- -webkit-animation: spin 1s linear infinite;
- animation: spin 1s linear infinite;
-}
-.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator:before {
- content: '';
- background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat;
- background-size: 150px 150px;
- width: 150px;
- height: 150px;
- left: 50%;
- top: 50%;
- margin-top: -75px;
- margin-left: -75px;
- position: absolute;
- /*.animation(rspin 1.5s linear infinite);*/
- -webkit-animation: spin 1.5s linear infinite;
- animation: spin 1.5s linear infinite;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator > span {
- left: 50%;
- width: 200px;
- height: 200px;
- margin-left: -100px;
- margin-top: -100px;
- background-size: 200px 200px;
- background-image: url('../../images/dashboard-loading-indicator.svg');
- -webkit-animation: spin 2s linear infinite;
- animation: spin 2s linear infinite;
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
diff --git a/modules/backend/assets/css/october.css b/modules/backend/assets/css/october.css
index 5cddda36c..478fc8fb2 100644
--- a/modules/backend/assets/css/october.css
+++ b/modules/backend/assets/css/october.css
@@ -585,7 +585,7 @@ body.dragging,body.dragging *{cursor:move !important}
body.loading,body.loading *{cursor:wait !important}
body.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default !important}
html,body{height:100%; }
-body{webkit-font-smoothing:antialiased;font-family:sans-serif;background:#f9f9f9}
+body{font-family:sans-serif;background:#f9f9f9;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
#layout-canvas{min-height:100%;height:100%}
.control-tabs.primary-tabs > ul.nav-tabs,.control-tabs.primary-tabs > div > ul.nav-tabs,.control-tabs.primary-tabs > div > div > ul.nav-tabs{margin-left:-20px;margin-right:-20px}
.control-tabs.primary-tabs.tabs-no-inset > ul.nav-tabs,.control-tabs.primary-tabs.tabs-no-inset > div > ul.nav-tabs,.control-tabs.primary-tabs.tabs-no-inset > div > div > ul.nav-tabs{margin-left:0;margin-right:0}
diff --git a/modules/backend/assets/images/dashboard-loading-indicator.svg b/modules/backend/assets/images/dashboard-loading-indicator.svg
deleted file mode 100644
index 0a1715647..000000000
--- a/modules/backend/assets/images/dashboard-loading-indicator.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
\ No newline at end of file
diff --git a/modules/backend/assets/less/dashboard/dashboard.less b/modules/backend/assets/less/dashboard/dashboard.less
index 4df8dd1c5..8b3088596 100644
--- a/modules/backend/assets/less/dashboard/dashboard.less
+++ b/modules/backend/assets/less/dashboard/dashboard.less
@@ -1,14 +1,10 @@
@import "../../../../backend/assets/less/core/boot.less";
.dashboard-container > .report-container {
- .transition(background 1s ease);
- .border-radius(5px);
-
&.loading {
position: absolute;
width: 100%;
height: 100%;
- background: #fff;
.loading-indicator-container {
position: absolute;
@@ -16,55 +12,6 @@
top: 0;
width: 100%;
height: 100%;
-
- .loading-indicator {
- background: transparent;
- padding: 0;
- height: 150px;
- top: 50%;
- margin-top: -90px;
-
- &:after {
- content: '';
- background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat;
- background-size: 100px 100px;
- width: 100px;
- height: 100px;
- left: 50%;
- top: 50%;
- margin-top: -50px;
- margin-left: -50px;
- position: absolute;
- .animation(spin 1s linear infinite);
- }
-
- &:before {
- content: '';
- background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat;
- background-size: 150px 150px;
- width: 150px;
- height: 150px;
- left: 50%;
- top: 50%;
- margin-top: -75px;
- margin-left: -75px;
- position: absolute;
- .animation(spin 1.5s linear infinite);
- .opacity(.9);
- }
-
- > span {
- left: 50%;
- width: 200px;
- height: 200px;
- margin-left: -100px;
- margin-top: -100px;
- background-size: 200px 200px;
- background-image: url('../../images/dashboard-loading-indicator.svg');
- .animation(spin 2s linear infinite);
- .opacity(.8);
- }
- }
}
}
}
diff --git a/modules/backend/assets/less/layout/layout.less b/modules/backend/assets/less/layout/layout.less
index b35a3aba1..a386db67e 100644
--- a/modules/backend/assets/less/layout/layout.less
+++ b/modules/backend/assets/less/layout/layout.less
@@ -33,9 +33,10 @@ body {
}
body {
- webkit-font-smoothing: antialiased;
font-family: @font-family-base;
background: @body-bg;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
}
#layout-canvas {
@@ -53,8 +54,6 @@ body {
//
// body {
// font-family: 'Noto Sans', sans-serif;
-// -webkit-font-smoothing: antialiased;
-// -moz-osx-font-smoothing: grayscale;
// }
//
diff --git a/modules/backend/controllers/index/index.htm b/modules/backend/controllers/index/index.htm
index 41d1b0433..68c213b47 100644
--- a/modules/backend/controllers/index/index.htm
+++ b/modules/backend/controllers/index/index.htm
@@ -5,8 +5,9 @@
-
diff --git a/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js b/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js
index 63f144ec5..9f32e7616 100644
--- a/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js
+++ b/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js
@@ -78,16 +78,18 @@
})
this.$el.on('click', '.content > button.close', function() {
- if (!confirm('Remove the widget?'))
- return false
+ var $btn = $(this)
+ $.oc.confirm('Remove this widget?', function() {
+ self.$form.request(self.alias + '::onRemoveWidget', {
+ data: {
+ 'alias': $('[data-widget-alias]', $btn.closest('div.content')).val()
+ }
+ })
- self.$form.request(self.alias + '::onRemoveWidget', {data: {
- 'alias': $('[data-widget-alias]', $(this).closest('div.content')).val()
- }})
-
- $(this).closest('li').remove()
- self.redraw()
- self.setSortOrders()
+ $btn.closest('li').remove()
+ self.redraw()
+ self.setSortOrders()
+ })
})
$(window).on('oc.report-widget-added', function(){
diff --git a/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js
new file mode 100644
index 000000000..902973b5a
--- /dev/null
+++ b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js
@@ -0,0 +1,1408 @@
+/**
+ * Isotope v1.5.26
+ * An exquisite jQuery plugin for magical layouts
+ * http://isotope.metafizzy.co
+ *
+ * Commercial use requires one-time purchase of a commercial license
+ * http://isotope.metafizzy.co/docs/license.html
+ *
+ * Non-commercial use is licensed under the MIT License
+ *
+ * Copyright 2014 Metafizzy
+ */
+
+/*jshint asi: true, browser: true, curly: true, eqeqeq: true, forin: false, immed: false, newcap: true, noempty: true, strict: true, undef: true */
+/*global jQuery: false */
+
+(function( window, $, undefined ){
+
+ 'use strict';
+
+ // get global vars
+ var document = window.document;
+ var docElem = document.documentElement;
+ var Modernizr = window.Modernizr;
+
+ // helper function
+ var capitalize = function( str ) {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+ };
+
+ // ========================= getStyleProperty by kangax ===============================
+ // http://perfectionkills.com/feature-testing-css-properties/
+
+ var prefixes = 'Moz Webkit O Ms'.split(' ');
+
+ var getStyleProperty = function( propName ) {
+ var style = docElem.style,
+ prefixed;
+
+ // test standard property first
+ if ( typeof style[propName] === 'string' ) {
+ return propName;
+ }
+
+ // capitalize
+ propName = capitalize( propName );
+
+ // test vendor specific properties
+ for ( var i=0, len = prefixes.length; i < len; i++ ) {
+ prefixed = prefixes[i] + propName;
+ if ( typeof style[ prefixed ] === 'string' ) {
+ return prefixed;
+ }
+ }
+ };
+
+ var transformProp = getStyleProperty('transform'),
+ transitionProp = getStyleProperty('transitionProperty');
+
+
+ // ========================= miniModernizr ===============================
+ // <3<3<3 and thanks to Faruk and Paul for doing the heavy lifting
+
+ /*!
+ * Modernizr v1.6ish: miniModernizr for Isotope
+ * http://www.modernizr.com
+ *
+ * Developed by:
+ * - Faruk Ates http://farukat.es/
+ * - Paul Irish http://paulirish.com/
+ *
+ * Copyright (c) 2009-2010
+ * Dual-licensed under the BSD or MIT licenses.
+ * http://www.modernizr.com/license/
+ */
+
+ /*
+ * This version whittles down the script just to check support for
+ * CSS transitions, transforms, and 3D transforms.
+ */
+
+ var tests = {
+ csstransforms: function() {
+ return !!transformProp;
+ },
+
+ csstransforms3d: function() {
+ var test = !!getStyleProperty('perspective');
+ // double check for Chrome's false positive
+ if ( test && 'webkitPerspective' in docElem.style ) {
+ var $style = $('').appendTo('head'),
+ $div = $('
').appendTo('html');
+
+ test = $div.height() === 3;
+
+ $div.remove();
+ $style.remove();
+ }
+ return test;
+ },
+
+ csstransitions: function() {
+ return !!transitionProp;
+ }
+ };
+
+ var testName;
+
+ if ( Modernizr ) {
+ // if there's a previous Modernzir, check if there are necessary tests
+ for ( testName in tests) {
+ if ( !Modernizr.hasOwnProperty( testName ) ) {
+ // if test hasn't been run, use addTest to run it
+ Modernizr.addTest( testName, tests[ testName ] );
+ }
+ }
+ } else {
+ // or create new mini Modernizr that just has the 3 tests
+ Modernizr = window.Modernizr = {
+ _version : '1.6ish: miniModernizr for Isotope'
+ };
+
+ var classes = ' ';
+ var result;
+
+ // Run through tests
+ for ( testName in tests) {
+ result = tests[ testName ]();
+ Modernizr[ testName ] = result;
+ classes += ' ' + ( result ? '' : 'no-' ) + testName;
+ }
+
+ // Add the new classes to the element.
+ $('html').addClass( classes );
+ }
+
+
+ // ========================= isoTransform ===============================
+
+ /**
+ * provides hooks for .css({ scale: value, translate: [x, y] })
+ * Progressively enhanced CSS transforms
+ * Uses hardware accelerated 3D transforms for Safari
+ * or falls back to 2D transforms.
+ */
+
+ if ( Modernizr.csstransforms ) {
+
+ // i.e. transformFnNotations.scale(0.5) >> 'scale3d( 0.5, 0.5, 1)'
+ var transformFnNotations = Modernizr.csstransforms3d ?
+ { // 3D transform functions
+ translate : function ( position ) {
+ return 'translate3d(' + position[0] + 'px, ' + position[1] + 'px, 0) ';
+ },
+ scale : function ( scale ) {
+ return 'scale3d(' + scale + ', ' + scale + ', 1) ';
+ }
+ } :
+ { // 2D transform functions
+ translate : function ( position ) {
+ return 'translate(' + position[0] + 'px, ' + position[1] + 'px) ';
+ },
+ scale : function ( scale ) {
+ return 'scale(' + scale + ') ';
+ }
+ }
+ ;
+
+ var setIsoTransform = function ( elem, name, value ) {
+ // unpack current transform data
+ var data = $.data( elem, 'isoTransform' ) || {},
+ newData = {},
+ fnName,
+ transformObj = {},
+ transformValue;
+
+ // i.e. newData.scale = 0.5
+ newData[ name ] = value;
+ // extend new value over current data
+ $.extend( data, newData );
+
+ for ( fnName in data ) {
+ transformValue = data[ fnName ];
+ transformObj[ fnName ] = transformFnNotations[ fnName ]( transformValue );
+ }
+
+ // get proper order
+ // ideally, we could loop through this give an array, but since we only have
+ // a couple transforms we're keeping track of, we'll do it like so
+ var translateFn = transformObj.translate || '',
+ scaleFn = transformObj.scale || '',
+ // sorting so translate always comes first
+ valueFns = translateFn + scaleFn;
+
+ // set data back in elem
+ $.data( elem, 'isoTransform', data );
+
+ // set name to vendor specific property
+ elem.style[ transformProp ] = valueFns;
+ };
+
+ // ==================== scale ===================
+
+ $.cssNumber.scale = true;
+
+ $.cssHooks.scale = {
+ set: function( elem, value ) {
+ // uncomment this bit if you want to properly parse strings
+ // if ( typeof value === 'string' ) {
+ // value = parseFloat( value );
+ // }
+ setIsoTransform( elem, 'scale', value );
+ },
+ get: function( elem, computed ) {
+ var transform = $.data( elem, 'isoTransform' );
+ return transform && transform.scale ? transform.scale : 1;
+ }
+ };
+
+ $.fx.step.scale = function( fx ) {
+ $.cssHooks.scale.set( fx.elem, fx.now+fx.unit );
+ };
+
+
+ // ==================== translate ===================
+
+ $.cssNumber.translate = true;
+
+ $.cssHooks.translate = {
+ set: function( elem, value ) {
+
+ // uncomment this bit if you want to properly parse strings
+ // if ( typeof value === 'string' ) {
+ // value = value.split(' ');
+ // }
+ //
+ // var i, val;
+ // for ( i = 0; i < 2; i++ ) {
+ // val = value[i];
+ // if ( typeof val === 'string' ) {
+ // val = parseInt( val );
+ // }
+ // }
+
+ setIsoTransform( elem, 'translate', value );
+ },
+
+ get: function( elem, computed ) {
+ var transform = $.data( elem, 'isoTransform' );
+ return transform && transform.translate ? transform.translate : [ 0, 0 ];
+ }
+ };
+
+ }
+
+ // ========================= get transition-end event ===============================
+ var transitionEndEvent, transitionDurProp;
+
+ if ( Modernizr.csstransitions ) {
+ transitionEndEvent = {
+ WebkitTransitionProperty: 'webkitTransitionEnd', // webkit
+ MozTransitionProperty: 'transitionend',
+ OTransitionProperty: 'oTransitionEnd otransitionend',
+ transitionProperty: 'transitionend'
+ }[ transitionProp ];
+
+ transitionDurProp = getStyleProperty('transitionDuration');
+ }
+
+ // ========================= smartresize ===============================
+
+ /*
+ * smartresize: debounced resize event for jQuery
+ *
+ * latest version and complete README available on Github:
+ * https://github.com/louisremi/jquery.smartresize.js
+ *
+ * Copyright 2011 @louis_remi
+ * Licensed under the MIT license.
+ */
+
+ var $event = $.event,
+ dispatchMethod = $.event.handle ? 'handle' : 'dispatch',
+ resizeTimeout;
+
+ $event.special.smartresize = {
+ setup: function() {
+ $(this).bind( "resize", $event.special.smartresize.handler );
+ },
+ teardown: function() {
+ $(this).unbind( "resize", $event.special.smartresize.handler );
+ },
+ handler: function( event, execAsap ) {
+ // Save the context
+ var context = this,
+ args = arguments;
+
+ // set correct event type
+ event.type = "smartresize";
+
+ if ( resizeTimeout ) { clearTimeout( resizeTimeout ); }
+ resizeTimeout = setTimeout(function() {
+ $event[ dispatchMethod ].apply( context, args );
+ }, execAsap === "execAsap"? 0 : 100 );
+ }
+ };
+
+ $.fn.smartresize = function( fn ) {
+ return fn ? this.bind( "smartresize", fn ) : this.trigger( "smartresize", ["execAsap"] );
+ };
+
+
+
+// ========================= Isotope ===============================
+
+
+ // our "Widget" object constructor
+ $.Isotope = function( options, element, callback ){
+ this.element = $( element );
+
+ this._create( options );
+ this._init( callback );
+ };
+
+ // styles of container element we want to keep track of
+ var isoContainerStyles = [ 'width', 'height' ];
+
+ var $window = $(window);
+
+ $.Isotope.settings = {
+ resizable: true,
+ layoutMode : 'masonry',
+ containerClass : 'isotope',
+ itemClass : 'isotope-item',
+ hiddenClass : 'isotope-hidden',
+ hiddenStyle: { opacity: 0, scale: 0.001 },
+ visibleStyle: { opacity: 1, scale: 1 },
+ containerStyle: {
+ position: 'relative',
+ overflow: 'hidden'
+ },
+ animationEngine: 'best-available',
+ animationOptions: {
+ queue: false,
+ duration: 800
+ },
+ sortBy : 'original-order',
+ sortAscending : true,
+ resizesContainer : true,
+ transformsEnabled: true,
+ itemPositionDataEnabled: false
+ };
+
+ $.Isotope.prototype = {
+
+ // sets up widget
+ _create : function( options ) {
+
+ this.options = $.extend( {}, $.Isotope.settings, options );
+
+ this.styleQueue = [];
+ this.elemCount = 0;
+
+ // get original styles in case we re-apply them in .destroy()
+ var elemStyle = this.element[0].style;
+ this.originalStyle = {};
+ // keep track of container styles
+ var containerStyles = isoContainerStyles.slice(0);
+ for ( var prop in this.options.containerStyle ) {
+ containerStyles.push( prop );
+ }
+ for ( var i=0, len = containerStyles.length; i < len; i++ ) {
+ prop = containerStyles[i];
+ this.originalStyle[ prop ] = elemStyle[ prop ] || '';
+ }
+ // apply container style from options
+ this.element.css( this.options.containerStyle );
+
+ this._updateAnimationEngine();
+ this._updateUsingTransforms();
+
+ // sorting
+ var originalOrderSorter = {
+ 'original-order' : function( $elem, instance ) {
+ instance.elemCount ++;
+ return instance.elemCount;
+ },
+ random : function() {
+ return Math.random();
+ }
+ };
+
+ this.options.getSortData = $.extend( this.options.getSortData, originalOrderSorter );
+
+ // need to get atoms
+ this.reloadItems();
+
+ // get top left position of where the bricks should be
+ this.offset = {
+ left: parseInt( ( this.element.css('padding-left') || 0 ), 10 ),
+ top: parseInt( ( this.element.css('padding-top') || 0 ), 10 )
+ };
+
+ // add isotope class first time around
+ var instance = this;
+ setTimeout( function() {
+ instance.element.addClass( instance.options.containerClass );
+ }, 0 );
+
+ // bind resize method
+ if ( this.options.resizable ) {
+ $window.bind( 'smartresize.isotope', function() {
+ instance.resize();
+ });
+ }
+
+ // dismiss all click events from hidden events
+ this.element.delegate( '.' + this.options.hiddenClass, 'click', function(){
+ return false;
+ });
+
+ },
+
+ _getAtoms : function( $elems ) {
+ var selector = this.options.itemSelector,
+ // filter & find
+ $atoms = selector ? $elems.filter( selector ).add( $elems.find( selector ) ) : $elems,
+ // base style for atoms
+ atomStyle = { position: 'absolute' };
+
+ // filter out text nodes
+ $atoms = $atoms.filter( function( i, atom ) {
+ return atom.nodeType === 1;
+ });
+
+ if ( this.usingTransforms ) {
+ atomStyle.left = 0;
+ atomStyle.top = 0;
+ }
+
+ $atoms.css( atomStyle ).addClass( this.options.itemClass );
+
+ this.updateSortData( $atoms, true );
+
+ return $atoms;
+ },
+
+ // _init fires when your instance is first created
+ // (from the constructor above), and when you
+ // attempt to initialize the widget again (by the bridge)
+ // after it has already been initialized.
+ _init : function( callback ) {
+
+ this.$filteredAtoms = this._filter( this.$allAtoms );
+ this._sort();
+ this.reLayout( callback );
+
+ },
+
+ option : function( opts ){
+ // change options AFTER initialization:
+ // signature: $('#foo').bar({ cool:false });
+ if ( $.isPlainObject( opts ) ){
+ this.options = $.extend( true, this.options, opts );
+
+ // trigger _updateOptionName if it exists
+ var updateOptionFn;
+ for ( var optionName in opts ) {
+ updateOptionFn = '_update' + capitalize( optionName );
+ if ( this[ updateOptionFn ] ) {
+ this[ updateOptionFn ]();
+ }
+ }
+ }
+ },
+
+ // ====================== updaters ====================== //
+ // kind of like setters
+
+ _updateAnimationEngine : function() {
+ var animationEngine = this.options.animationEngine.toLowerCase().replace( /[ _\-]/g, '');
+ var isUsingJQueryAnimation;
+ // set applyStyleFnName
+ switch ( animationEngine ) {
+ case 'css' :
+ case 'none' :
+ isUsingJQueryAnimation = false;
+ break;
+ case 'jquery' :
+ isUsingJQueryAnimation = true;
+ break;
+ default : // best available
+ isUsingJQueryAnimation = !Modernizr.csstransitions;
+ }
+ this.isUsingJQueryAnimation = isUsingJQueryAnimation;
+ this._updateUsingTransforms();
+ },
+
+ _updateTransformsEnabled : function() {
+ this._updateUsingTransforms();
+ },
+
+ _updateUsingTransforms : function() {
+ var usingTransforms = this.usingTransforms = this.options.transformsEnabled &&
+ Modernizr.csstransforms && Modernizr.csstransitions && !this.isUsingJQueryAnimation;
+
+ // prevent scales when transforms are disabled
+ if ( !usingTransforms ) {
+ delete this.options.hiddenStyle.scale;
+ delete this.options.visibleStyle.scale;
+ }
+
+ this.getPositionStyles = usingTransforms ? this._translate : this._positionAbs;
+ },
+
+
+ // ====================== Filtering ======================
+
+ _filter : function( $atoms ) {
+ var filter = this.options.filter === '' ? '*' : this.options.filter;
+
+ if ( !filter ) {
+ return $atoms;
+ }
+
+ var hiddenClass = this.options.hiddenClass,
+ hiddenSelector = '.' + hiddenClass,
+ $hiddenAtoms = $atoms.filter( hiddenSelector ),
+ $atomsToShow = $hiddenAtoms;
+
+ if ( filter !== '*' ) {
+ $atomsToShow = $hiddenAtoms.filter( filter );
+ var $atomsToHide = $atoms.not( hiddenSelector ).not( filter ).addClass( hiddenClass );
+ this.styleQueue.push({ $el: $atomsToHide, style: this.options.hiddenStyle });
+ }
+
+ this.styleQueue.push({ $el: $atomsToShow, style: this.options.visibleStyle });
+ $atomsToShow.removeClass( hiddenClass );
+
+ return $atoms.filter( filter );
+ },
+
+ // ====================== Sorting ======================
+
+ updateSortData : function( $atoms, isIncrementingElemCount ) {
+ var instance = this,
+ getSortData = this.options.getSortData,
+ $this, sortData;
+ $atoms.each(function(){
+ $this = $(this);
+ sortData = {};
+ // get value for sort data based on fn( $elem ) passed in
+ for ( var key in getSortData ) {
+ if ( !isIncrementingElemCount && key === 'original-order' ) {
+ // keep original order original
+ sortData[ key ] = $.data( this, 'isotope-sort-data' )[ key ];
+ } else {
+ sortData[ key ] = getSortData[ key ]( $this, instance );
+ }
+ }
+ // apply sort data to element
+ $.data( this, 'isotope-sort-data', sortData );
+ });
+ },
+
+ // used on all the filtered atoms
+ _sort : function() {
+
+ var sortBy = this.options.sortBy,
+ getSorter = this._getSorter,
+ sortDir = this.options.sortAscending ? 1 : -1,
+ sortFn = function( alpha, beta ) {
+ var a = getSorter( alpha, sortBy ),
+ b = getSorter( beta, sortBy );
+ // fall back to original order if data matches
+ if ( a === b && sortBy !== 'original-order') {
+ a = getSorter( alpha, 'original-order' );
+ b = getSorter( beta, 'original-order' );
+ }
+ return ( ( a > b ) ? 1 : ( a < b ) ? -1 : 0 ) * sortDir;
+ };
+
+ this.$filteredAtoms.sort( sortFn );
+ },
+
+ _getSorter : function( elem, sortBy ) {
+ return $.data( elem, 'isotope-sort-data' )[ sortBy ];
+ },
+
+ // ====================== Layout Helpers ======================
+
+ _translate : function( x, y ) {
+ return { translate : [ x, y ] };
+ },
+
+ _positionAbs : function( x, y ) {
+ return { left: x, top: y };
+ },
+
+ _pushPosition : function( $elem, x, y ) {
+ x = Math.round( x + this.offset.left );
+ y = Math.round( y + this.offset.top );
+ var position = this.getPositionStyles( x, y );
+ this.styleQueue.push({ $el: $elem, style: position });
+ if ( this.options.itemPositionDataEnabled ) {
+ $elem.data('isotope-item-position', {x: x, y: y} );
+ }
+ },
+
+
+ // ====================== General Layout ======================
+
+ // used on collection of atoms (should be filtered, and sorted before )
+ // accepts atoms-to-be-laid-out to start with
+ layout : function( $elems, callback ) {
+
+ var layoutMode = this.options.layoutMode;
+
+ // layout logic
+ this[ '_' + layoutMode + 'Layout' ]( $elems );
+
+ // set the size of the container
+ if ( this.options.resizesContainer ) {
+ var containerStyle = this[ '_' + layoutMode + 'GetContainerSize' ]();
+ this.styleQueue.push({ $el: this.element, style: containerStyle });
+ }
+
+ this._processStyleQueue( $elems, callback );
+
+ this.isLaidOut = true;
+ },
+
+ _processStyleQueue : function( $elems, callback ) {
+ // are we animating the layout arrangement?
+ // use plugin-ish syntax for css or animate
+ var styleFn = !this.isLaidOut ? 'css' : (
+ this.isUsingJQueryAnimation ? 'animate' : 'css'
+ ),
+ animOpts = this.options.animationOptions,
+ onLayout = this.options.onLayout,
+ objStyleFn, processor,
+ triggerCallbackNow, callbackFn;
+
+ // default styleQueue processor, may be overwritten down below
+ processor = function( i, obj ) {
+ obj.$el[ styleFn ]( obj.style, animOpts );
+ };
+
+ if ( this._isInserting && this.isUsingJQueryAnimation ) {
+ // if using styleQueue to insert items
+ processor = function( i, obj ) {
+ // only animate if it not being inserted
+ objStyleFn = obj.$el.hasClass('no-transition') ? 'css' : styleFn;
+ obj.$el[ objStyleFn ]( obj.style, animOpts );
+ };
+
+ } else if ( callback || onLayout || animOpts.complete ) {
+ // has callback
+ var isCallbackTriggered = false,
+ // array of possible callbacks to trigger
+ callbacks = [ callback, onLayout, animOpts.complete ],
+ instance = this;
+ triggerCallbackNow = true;
+ // trigger callback only once
+ callbackFn = function() {
+ if ( isCallbackTriggered ) {
+ return;
+ }
+ var hollaback;
+ for (var i=0, len = callbacks.length; i < len; i++) {
+ hollaback = callbacks[i];
+ if ( typeof hollaback === 'function' ) {
+ hollaback.call( instance.element, $elems, instance );
+ }
+ }
+ isCallbackTriggered = true;
+ };
+
+ if ( this.isUsingJQueryAnimation && styleFn === 'animate' ) {
+ // add callback to animation options
+ animOpts.complete = callbackFn;
+ triggerCallbackNow = false;
+
+ } else if ( Modernizr.csstransitions ) {
+ // detect if first item has transition
+ var i = 0,
+ firstItem = this.styleQueue[0],
+ testElem = firstItem && firstItem.$el,
+ styleObj;
+ // get first non-empty jQ object
+ while ( !testElem || !testElem.length ) {
+ styleObj = this.styleQueue[ i++ ];
+ // HACK: sometimes styleQueue[i] is undefined
+ if ( !styleObj ) {
+ return;
+ }
+ testElem = styleObj.$el;
+ }
+ // get transition duration of the first element in that object
+ // yeah, this is inexact
+ var duration = parseFloat( getComputedStyle( testElem[0] )[ transitionDurProp ] );
+ if ( duration > 0 ) {
+ processor = function( i, obj ) {
+ obj.$el[ styleFn ]( obj.style, animOpts )
+ // trigger callback at transition end
+ .one( transitionEndEvent, callbackFn );
+ };
+ triggerCallbackNow = false;
+ }
+ }
+ }
+
+ // process styleQueue
+ $.each( this.styleQueue, processor );
+
+ if ( triggerCallbackNow ) {
+ callbackFn();
+ }
+
+ // clear out queue for next time
+ this.styleQueue = [];
+ },
+
+
+ resize : function() {
+ if ( this[ '_' + this.options.layoutMode + 'ResizeChanged' ]() ) {
+ this.reLayout();
+ }
+ },
+
+
+ reLayout : function( callback ) {
+
+ this[ '_' + this.options.layoutMode + 'Reset' ]();
+ this.layout( this.$filteredAtoms, callback );
+
+ },
+
+ // ====================== Convenience methods ======================
+
+ // ====================== Adding items ======================
+
+ // adds a jQuery object of items to a isotope container
+ addItems : function( $content, callback ) {
+ var $newAtoms = this._getAtoms( $content );
+ // add new atoms to atoms pools
+ this.$allAtoms = this.$allAtoms.add( $newAtoms );
+
+ if ( callback ) {
+ callback( $newAtoms );
+ }
+ },
+
+ // convienence method for adding elements properly to any layout
+ // positions items, hides them, then animates them back in <--- very sezzy
+ insert : function( $content, callback ) {
+ // position items
+ this.element.append( $content );
+
+ var instance = this;
+ this.addItems( $content, function( $newAtoms ) {
+ var $newFilteredAtoms = instance._filter( $newAtoms );
+ instance._addHideAppended( $newFilteredAtoms );
+ instance._sort();
+ instance.reLayout();
+ instance._revealAppended( $newFilteredAtoms, callback );
+ });
+
+ },
+
+ // convienence method for working with Infinite Scroll
+ appended : function( $content, callback ) {
+ var instance = this;
+ this.addItems( $content, function( $newAtoms ) {
+ instance._addHideAppended( $newAtoms );
+ instance.layout( $newAtoms );
+ instance._revealAppended( $newAtoms, callback );
+ });
+ },
+
+ // adds new atoms, then hides them before positioning
+ _addHideAppended : function( $newAtoms ) {
+ this.$filteredAtoms = this.$filteredAtoms.add( $newAtoms );
+ $newAtoms.addClass('no-transition');
+
+ this._isInserting = true;
+
+ // apply hidden styles
+ this.styleQueue.push({ $el: $newAtoms, style: this.options.hiddenStyle });
+ },
+
+ // sets visible style on new atoms
+ _revealAppended : function( $newAtoms, callback ) {
+ var instance = this;
+ // apply visible style after a sec
+ setTimeout( function() {
+ // enable animation
+ $newAtoms.removeClass('no-transition');
+ // reveal newly inserted filtered elements
+ instance.styleQueue.push({ $el: $newAtoms, style: instance.options.visibleStyle });
+ instance._isInserting = false;
+ instance._processStyleQueue( $newAtoms, callback );
+ }, 10 );
+ },
+
+ // gathers all atoms
+ reloadItems : function() {
+ this.$allAtoms = this._getAtoms( this.element.children() );
+ },
+
+ // removes elements from Isotope widget
+ remove: function( $content, callback ) {
+ // remove elements immediately from Isotope instance
+ this.$allAtoms = this.$allAtoms.not( $content );
+ this.$filteredAtoms = this.$filteredAtoms.not( $content );
+ // remove() as a callback, for after transition / animation
+ var instance = this;
+ var removeContent = function() {
+ $content.remove();
+ if ( callback ) {
+ callback.call( instance.element );
+ }
+ };
+
+ if ( $content.filter( ':not(.' + this.options.hiddenClass + ')' ).length ) {
+ // if any non-hidden content needs to be removed
+ this.styleQueue.push({ $el: $content, style: this.options.hiddenStyle });
+ this._sort();
+ this.reLayout( removeContent );
+ } else {
+ // remove it now
+ removeContent();
+ }
+
+ },
+
+ shuffle : function( callback ) {
+ this.updateSortData( this.$allAtoms );
+ this.options.sortBy = 'random';
+ this._sort();
+ this.reLayout( callback );
+ },
+
+ // destroys widget, returns elements and container back (close) to original style
+ destroy : function() {
+
+ var usingTransforms = this.usingTransforms;
+ var options = this.options;
+
+ this.$allAtoms
+ .removeClass( options.hiddenClass + ' ' + options.itemClass )
+ .each(function(){
+ var style = this.style;
+ style.position = '';
+ style.top = '';
+ style.left = '';
+ style.opacity = '';
+ if ( usingTransforms ) {
+ style[ transformProp ] = '';
+ }
+ });
+
+ // re-apply saved container styles
+ var elemStyle = this.element[0].style;
+ for ( var prop in this.originalStyle ) {
+ elemStyle[ prop ] = this.originalStyle[ prop ];
+ }
+
+ this.element
+ .unbind('.isotope')
+ .undelegate( '.' + options.hiddenClass, 'click' )
+ .removeClass( options.containerClass )
+ .removeData('isotope');
+
+ $window.unbind('.isotope');
+
+ },
+
+
+ // ====================== LAYOUTS ======================
+
+ // calculates number of rows or columns
+ // requires columnWidth or rowHeight to be set on namespaced object
+ // i.e. this.masonry.columnWidth = 200
+ _getSegments : function( isRows ) {
+ var namespace = this.options.layoutMode,
+ measure = isRows ? 'rowHeight' : 'columnWidth',
+ size = isRows ? 'height' : 'width',
+ segmentsName = isRows ? 'rows' : 'cols',
+ containerSize = this.element[ size ](),
+ segments,
+ // i.e. options.masonry && options.masonry.columnWidth
+ segmentSize = this.options[ namespace ] && this.options[ namespace ][ measure ] ||
+ // or use the size of the first item, i.e. outerWidth
+ this.$filteredAtoms[ 'outer' + capitalize(size) ](true) ||
+ // if there's no items, use size of container
+ containerSize;
+
+ segments = Math.floor( containerSize / segmentSize );
+ segments = Math.max( segments, 1 );
+
+ // i.e. this.masonry.cols = ....
+ this[ namespace ][ segmentsName ] = segments;
+ // i.e. this.masonry.columnWidth = ...
+ this[ namespace ][ measure ] = segmentSize;
+
+ },
+
+ _checkIfSegmentsChanged : function( isRows ) {
+ var namespace = this.options.layoutMode,
+ segmentsName = isRows ? 'rows' : 'cols',
+ prevSegments = this[ namespace ][ segmentsName ];
+ // update cols/rows
+ this._getSegments( isRows );
+ // return if updated cols/rows is not equal to previous
+ return ( this[ namespace ][ segmentsName ] !== prevSegments );
+ },
+
+ // ====================== Masonry ======================
+
+ _masonryReset : function() {
+ // layout-specific props
+ this.masonry = {};
+ // FIXME shouldn't have to call this again
+ this._getSegments();
+ var i = this.masonry.cols;
+ this.masonry.colYs = [];
+ while (i--) {
+ this.masonry.colYs.push( 0 );
+ }
+ },
+
+ _masonryLayout : function( $elems ) {
+ var instance = this,
+ props = instance.masonry;
+ $elems.each(function(){
+ var $this = $(this),
+ //how many columns does this brick span
+ colSpan = Math.ceil( $this.outerWidth(true) / props.columnWidth );
+ colSpan = Math.min( colSpan, props.cols );
+
+ if ( colSpan === 1 ) {
+ // if brick spans only one column, just like singleMode
+ instance._masonryPlaceBrick( $this, props.colYs );
+ } else {
+ // brick spans more than one column
+ // how many different places could this brick fit horizontally
+ var groupCount = props.cols + 1 - colSpan,
+ groupY = [],
+ groupColY,
+ i;
+
+ // for each group potential horizontal position
+ for ( i=0; i < groupCount; i++ ) {
+ // make an array of colY values for that one group
+ groupColY = props.colYs.slice( i, i+colSpan );
+ // and get the max value of the array
+ groupY[i] = Math.max.apply( Math, groupColY );
+ }
+
+ instance._masonryPlaceBrick( $this, groupY );
+ }
+ });
+ },
+
+ // worker method that places brick in the columnSet
+ // with the the minY
+ _masonryPlaceBrick : function( $brick, setY ) {
+ // get the minimum Y value from the columns
+ var minimumY = Math.min.apply( Math, setY ),
+ shortCol = 0;
+
+ // Find index of short column, the first from the left
+ for (var i=0, len = setY.length; i < len; i++) {
+ if ( setY[i] === minimumY ) {
+ shortCol = i;
+ break;
+ }
+ }
+
+ // position the brick
+ var x = this.masonry.columnWidth * shortCol,
+ y = minimumY;
+ this._pushPosition( $brick, x, y );
+
+ // apply setHeight to necessary columns
+ var setHeight = minimumY + $brick.outerHeight(true),
+ setSpan = this.masonry.cols + 1 - len;
+ for ( i=0; i < setSpan; i++ ) {
+ this.masonry.colYs[ shortCol + i ] = setHeight;
+ }
+
+ },
+
+ _masonryGetContainerSize : function() {
+ var containerHeight = Math.max.apply( Math, this.masonry.colYs );
+ return { height: containerHeight };
+ },
+
+ _masonryResizeChanged : function() {
+ return this._checkIfSegmentsChanged();
+ },
+
+ // ====================== fitRows ======================
+
+ _fitRowsReset : function() {
+ this.fitRows = {
+ x : 0,
+ y : 0,
+ height : 0
+ };
+ },
+
+ _fitRowsLayout : function( $elems ) {
+ var instance = this,
+ containerWidth = this.element.width(),
+ props = this.fitRows;
+
+ $elems.each( function() {
+ var $this = $(this),
+ atomW = $this.outerWidth(true),
+ atomH = $this.outerHeight(true);
+
+ if ( props.x !== 0 && atomW + props.x > containerWidth ) {
+ // if this element cannot fit in the current row
+ props.x = 0;
+ props.y = props.height;
+ }
+
+ // position the atom
+ instance._pushPosition( $this, props.x, props.y );
+
+ props.height = Math.max( props.y + atomH, props.height );
+ props.x += atomW;
+
+ });
+ },
+
+ _fitRowsGetContainerSize : function () {
+ return { height : this.fitRows.height };
+ },
+
+ _fitRowsResizeChanged : function() {
+ return true;
+ },
+
+
+ // ====================== cellsByRow ======================
+
+ _cellsByRowReset : function() {
+ this.cellsByRow = {
+ index : 0
+ };
+ // get this.cellsByRow.columnWidth
+ this._getSegments();
+ // get this.cellsByRow.rowHeight
+ this._getSegments(true);
+ },
+
+ _cellsByRowLayout : function( $elems ) {
+ var instance = this,
+ props = this.cellsByRow;
+ $elems.each( function(){
+ var $this = $(this),
+ col = props.index % props.cols,
+ row = Math.floor( props.index / props.cols ),
+ x = ( col + 0.5 ) * props.columnWidth - $this.outerWidth(true) / 2,
+ y = ( row + 0.5 ) * props.rowHeight - $this.outerHeight(true) / 2;
+ instance._pushPosition( $this, x, y );
+ props.index ++;
+ });
+ },
+
+ _cellsByRowGetContainerSize : function() {
+ return { height : Math.ceil( this.$filteredAtoms.length / this.cellsByRow.cols ) * this.cellsByRow.rowHeight + this.offset.top };
+ },
+
+ _cellsByRowResizeChanged : function() {
+ return this._checkIfSegmentsChanged();
+ },
+
+
+ // ====================== straightDown ======================
+
+ _straightDownReset : function() {
+ this.straightDown = {
+ y : 0
+ };
+ },
+
+ _straightDownLayout : function( $elems ) {
+ var instance = this;
+ $elems.each( function( i ){
+ var $this = $(this);
+ instance._pushPosition( $this, 0, instance.straightDown.y );
+ instance.straightDown.y += $this.outerHeight(true);
+ });
+ },
+
+ _straightDownGetContainerSize : function() {
+ return { height : this.straightDown.y };
+ },
+
+ _straightDownResizeChanged : function() {
+ return true;
+ },
+
+
+ // ====================== masonryHorizontal ======================
+
+ _masonryHorizontalReset : function() {
+ // layout-specific props
+ this.masonryHorizontal = {};
+ // FIXME shouldn't have to call this again
+ this._getSegments( true );
+ var i = this.masonryHorizontal.rows;
+ this.masonryHorizontal.rowXs = [];
+ while (i--) {
+ this.masonryHorizontal.rowXs.push( 0 );
+ }
+ },
+
+ _masonryHorizontalLayout : function( $elems ) {
+ var instance = this,
+ props = instance.masonryHorizontal;
+ $elems.each(function(){
+ var $this = $(this),
+ //how many rows does this brick span
+ rowSpan = Math.ceil( $this.outerHeight(true) / props.rowHeight );
+ rowSpan = Math.min( rowSpan, props.rows );
+
+ if ( rowSpan === 1 ) {
+ // if brick spans only one column, just like singleMode
+ instance._masonryHorizontalPlaceBrick( $this, props.rowXs );
+ } else {
+ // brick spans more than one row
+ // how many different places could this brick fit horizontally
+ var groupCount = props.rows + 1 - rowSpan,
+ groupX = [],
+ groupRowX, i;
+
+ // for each group potential horizontal position
+ for ( i=0; i < groupCount; i++ ) {
+ // make an array of colY values for that one group
+ groupRowX = props.rowXs.slice( i, i+rowSpan );
+ // and get the max value of the array
+ groupX[i] = Math.max.apply( Math, groupRowX );
+ }
+
+ instance._masonryHorizontalPlaceBrick( $this, groupX );
+ }
+ });
+ },
+
+ _masonryHorizontalPlaceBrick : function( $brick, setX ) {
+ // get the minimum Y value from the columns
+ var minimumX = Math.min.apply( Math, setX ),
+ smallRow = 0;
+ // Find index of smallest row, the first from the top
+ for (var i=0, len = setX.length; i < len; i++) {
+ if ( setX[i] === minimumX ) {
+ smallRow = i;
+ break;
+ }
+ }
+
+ // position the brick
+ var x = minimumX,
+ y = this.masonryHorizontal.rowHeight * smallRow;
+ this._pushPosition( $brick, x, y );
+
+ // apply setHeight to necessary columns
+ var setWidth = minimumX + $brick.outerWidth(true),
+ setSpan = this.masonryHorizontal.rows + 1 - len;
+ for ( i=0; i < setSpan; i++ ) {
+ this.masonryHorizontal.rowXs[ smallRow + i ] = setWidth;
+ }
+ },
+
+ _masonryHorizontalGetContainerSize : function() {
+ var containerWidth = Math.max.apply( Math, this.masonryHorizontal.rowXs );
+ return { width: containerWidth };
+ },
+
+ _masonryHorizontalResizeChanged : function() {
+ return this._checkIfSegmentsChanged(true);
+ },
+
+
+ // ====================== fitColumns ======================
+
+ _fitColumnsReset : function() {
+ this.fitColumns = {
+ x : 0,
+ y : 0,
+ width : 0
+ };
+ },
+
+ _fitColumnsLayout : function( $elems ) {
+ var instance = this,
+ containerHeight = this.element.height(),
+ props = this.fitColumns;
+ $elems.each( function() {
+ var $this = $(this),
+ atomW = $this.outerWidth(true),
+ atomH = $this.outerHeight(true);
+
+ if ( props.y !== 0 && atomH + props.y > containerHeight ) {
+ // if this element cannot fit in the current column
+ props.x = props.width;
+ props.y = 0;
+ }
+
+ // position the atom
+ instance._pushPosition( $this, props.x, props.y );
+
+ props.width = Math.max( props.x + atomW, props.width );
+ props.y += atomH;
+
+ });
+ },
+
+ _fitColumnsGetContainerSize : function () {
+ return { width : this.fitColumns.width };
+ },
+
+ _fitColumnsResizeChanged : function() {
+ return true;
+ },
+
+
+
+ // ====================== cellsByColumn ======================
+
+ _cellsByColumnReset : function() {
+ this.cellsByColumn = {
+ index : 0
+ };
+ // get this.cellsByColumn.columnWidth
+ this._getSegments();
+ // get this.cellsByColumn.rowHeight
+ this._getSegments(true);
+ },
+
+ _cellsByColumnLayout : function( $elems ) {
+ var instance = this,
+ props = this.cellsByColumn;
+ $elems.each( function(){
+ var $this = $(this),
+ col = Math.floor( props.index / props.rows ),
+ row = props.index % props.rows,
+ x = ( col + 0.5 ) * props.columnWidth - $this.outerWidth(true) / 2,
+ y = ( row + 0.5 ) * props.rowHeight - $this.outerHeight(true) / 2;
+ instance._pushPosition( $this, x, y );
+ props.index ++;
+ });
+ },
+
+ _cellsByColumnGetContainerSize : function() {
+ return { width : Math.ceil( this.$filteredAtoms.length / this.cellsByColumn.rows ) * this.cellsByColumn.columnWidth };
+ },
+
+ _cellsByColumnResizeChanged : function() {
+ return this._checkIfSegmentsChanged(true);
+ },
+
+ // ====================== straightAcross ======================
+
+ _straightAcrossReset : function() {
+ this.straightAcross = {
+ x : 0
+ };
+ },
+
+ _straightAcrossLayout : function( $elems ) {
+ var instance = this;
+ $elems.each( function( i ){
+ var $this = $(this);
+ instance._pushPosition( $this, instance.straightAcross.x, 0 );
+ instance.straightAcross.x += $this.outerWidth(true);
+ });
+ },
+
+ _straightAcrossGetContainerSize : function() {
+ return { width : this.straightAcross.x };
+ },
+
+ _straightAcrossResizeChanged : function() {
+ return true;
+ }
+
+ };
+
+
+ // ======================= imagesLoaded Plugin ===============================
+ /*!
+ * jQuery imagesLoaded plugin v1.1.0
+ * http://github.com/desandro/imagesloaded
+ *
+ * MIT License. by Paul Irish et al.
+ */
+
+
+ // $('#my-container').imagesLoaded(myFunction)
+ // or
+ // $('img').imagesLoaded(myFunction)
+
+ // execute a callback when all images have loaded.
+ // needed because .load() doesn't work on cached images
+
+ // callback function gets image collection as argument
+ // `this` is the container
+
+ $.fn.imagesLoaded = function( callback ) {
+ var $this = this,
+ $images = $this.find('img').add( $this.filter('img') ),
+ len = $images.length,
+ blank = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==',
+ loaded = [];
+
+ function triggerCallback() {
+ callback.call( $this, $images );
+ }
+
+ function imgLoaded( event ) {
+ var img = event.target;
+ if ( img.src !== blank && $.inArray( img, loaded ) === -1 ){
+ loaded.push( img );
+ if ( --len <= 0 ){
+ setTimeout( triggerCallback );
+ $images.unbind( '.imagesLoaded', imgLoaded );
+ }
+ }
+ }
+
+ // if no images, trigger immediately
+ if ( !len ) {
+ triggerCallback();
+ }
+
+ $images.bind( 'load.imagesLoaded error.imagesLoaded', imgLoaded ).each( function() {
+ // cached images don't fire load sometimes, so we reset src.
+ var src = this.src;
+ // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
+ // data uri bypasses webkit log warning (thx doug jones)
+ this.src = blank;
+ this.src = src;
+ });
+
+ return $this;
+ };
+
+
+ // helper function for logging errors
+ // $.error breaks jQuery chaining
+ var logError = function( message ) {
+ if ( window.console ) {
+ window.console.error( message );
+ }
+ };
+
+ // ======================= Plugin bridge ===============================
+ // leverages data method to either create or return $.Isotope constructor
+ // A bit from jQuery UI
+ // https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js
+ // A bit from jcarousel
+ // https://github.com/jsor/jcarousel/blob/master/lib/jquery.jcarousel.js
+
+ $.fn.isotope = function( options, callback ) {
+ if ( typeof options === 'string' ) {
+ // call method
+ var args = Array.prototype.slice.call( arguments, 1 );
+
+ this.each(function(){
+ var instance = $.data( this, 'isotope' );
+ if ( !instance ) {
+ logError( "cannot call methods on isotope prior to initialization; " +
+ "attempted to call method '" + options + "'" );
+ return;
+ }
+ if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
+ logError( "no such method '" + options + "' for isotope instance" );
+ return;
+ }
+ // apply method
+ instance[ options ].apply( instance, args );
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, 'isotope' );
+ if ( instance ) {
+ // apply options & init
+ instance.option( options );
+ instance._init( callback );
+ } else {
+ // initialize new instance
+ $.data( this, 'isotope', new $.Isotope( options, this, callback ) );
+ }
+ });
+ }
+ // return jQuery object
+ // so plugin methods do not have to
+ return this;
+ };
+
+})( window, jQuery );
\ No newline at end of file
diff --git a/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js
index ea4afadaf..5b02fa490 100644
--- a/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js
+++ b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js
@@ -1,5 +1,5 @@
/**
- * Isotope v1.5.25
+ * Isotope v1.5.26
* An exquisite jQuery plugin for magical layouts
* http://isotope.metafizzy.co
*
@@ -8,6 +8,6 @@
*
* Non-commercial use is licensed under the MIT License
*
- * Copyright 2013 Metafizzy
+ * Copyright 2014 Metafizzy
*/
-(function(a,b,c){"use strict";var d=a.document,e=a.Modernizr,f=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},g="Moz Webkit O Ms".split(" "),h=function(a){var b=d.documentElement.style,c;if(typeof b[a]=="string")return a;a=f(a);for(var e=0,h=g.length;e
"+d+"{#modernizr{height:3px}}"+"").appendTo("head"),f=b('').appendTo("html");a=f.height()===3,f.remove(),e.remove()}return a},csstransitions:function(){return!!j}},l;if(e)for(l in k)e.hasOwnProperty(l)||e.addTest(l,k[l]);else{e=a.Modernizr={_version:"1.6ish: miniModernizr for Isotope"};var m=" ",n;for(l in k)n=k[l](),e[l]=n,m+=" "+(n?"":"no-")+l;b("html").addClass(m)}if(e.csstransforms){var o=e.csstransforms3d?{translate:function(a){return"translate3d("+a[0]+"px, "+a[1]+"px, 0) "},scale:function(a){return"scale3d("+a+", "+a+", 1) "}}:{translate:function(a){return"translate("+a[0]+"px, "+a[1]+"px) "},scale:function(a){return"scale("+a+") "}},p=function(a,c,d){var e=b.data(a,"isoTransform")||{},f={},g,h={},j;f[c]=d,b.extend(e,f);for(g in e)j=e[g],h[g]=o[g](j);var k=h.translate||"",l=h.scale||"",m=k+l;b.data(a,"isoTransform",e),a.style[i]=m};b.cssNumber.scale=!0,b.cssHooks.scale={set:function(a,b){p(a,"scale",b)},get:function(a,c){var d=b.data(a,"isoTransform");return d&&d.scale?d.scale:1}},b.fx.step.scale=function(a){b.cssHooks.scale.set(a.elem,a.now+a.unit)},b.cssNumber.translate=!0,b.cssHooks.translate={set:function(a,b){p(a,"translate",b)},get:function(a,c){var d=b.data(a,"isoTransform");return d&&d.translate?d.translate:[0,0]}}}var q,r;e.csstransitions&&(q={WebkitTransitionProperty:"webkitTransitionEnd",MozTransitionProperty:"transitionend",OTransitionProperty:"oTransitionEnd otransitionend",transitionProperty:"transitionend"}[j],r=h("transitionDuration"));var s=b.event,t=b.event.handle?"handle":"dispatch",u;s.special.smartresize={setup:function(){b(this).bind("resize",s.special.smartresize.handler)},teardown:function(){b(this).unbind("resize",s.special.smartresize.handler)},handler:function(a,b){var c=this,d=arguments;a.type="smartresize",u&&clearTimeout(u),u=setTimeout(function(){s[t].apply(c,d)},b==="execAsap"?0:100)}},b.fn.smartresize=function(a){return a?this.bind("smartresize",a):this.trigger("smartresize",["execAsap"])},b.Isotope=function(a,c,d){this.element=b(c),this._create(a),this._init(d)};var v=["width","height"],w=b(a);b.Isotope.settings={resizable:!0,layoutMode:"masonry",containerClass:"isotope",itemClass:"isotope-item",hiddenClass:"isotope-hidden",hiddenStyle:{opacity:0,scale:.001},visibleStyle:{opacity:1,scale:1},containerStyle:{position:"relative",overflow:"hidden"},animationEngine:"best-available",animationOptions:{queue:!1,duration:800},sortBy:"original-order",sortAscending:!0,resizesContainer:!0,transformsEnabled:!0,itemPositionDataEnabled:!1},b.Isotope.prototype={_create:function(a){this.options=b.extend({},b.Isotope.settings,a),this.styleQueue=[],this.elemCount=0;var c=this.element[0].style;this.originalStyle={};var d=v.slice(0);for(var e in this.options.containerStyle)d.push(e);for(var f=0,g=d.length;fg?1:f0&&(i=function(a,b){b.$el[d](b.style,f).one(q,k)},j=!1)}}b.each(this.styleQueue,i),j&&k(),this.styleQueue=[]},resize:function(){this["_"+this.options.layoutMode+"ResizeChanged"]()&&this.reLayout()},reLayout:function(a){this["_"+this.options.layoutMode+"Reset"](),this.layout(this.$filteredAtoms,a)},addItems:function(a,b){var c=this._getAtoms(a);this.$allAtoms=this.$allAtoms.add(c),b&&b(c)},insert:function(a,b){this.element.append(a);var c=this;this.addItems(a,function(a){var d=c._filter(a);c._addHideAppended(d),c._sort(),c.reLayout(),c._revealAppended(d,b)})},appended:function(a,b){var c=this;this.addItems(a,function(a){c._addHideAppended(a),c.layout(a),c._revealAppended(a,b)})},_addHideAppended:function(a){this.$filteredAtoms=this.$filteredAtoms.add(a),a.addClass("no-transition"),this._isInserting=!0,this.styleQueue.push({$el:a,style:this.options.hiddenStyle})},_revealAppended:function(a,b){var c=this;setTimeout(function(){a.removeClass("no-transition"),c.styleQueue.push({$el:a,style:c.options.visibleStyle}),c._isInserting=!1,c._processStyleQueue(a,b)},10)},reloadItems:function(){this.$allAtoms=this._getAtoms(this.element.children())},remove:function(a,b){this.$allAtoms=this.$allAtoms.not(a),this.$filteredAtoms=this.$filteredAtoms.not(a);var c=this,d=function(){a.remove(),b&&b.call(c.element)};a.filter(":not(."+this.options.hiddenClass+")").length?(this.styleQueue.push({$el:a,style:this.options.hiddenStyle}),this._sort(),this.reLayout(d)):d()},shuffle:function(a){this.updateSortData(this.$allAtoms),this.options.sortBy="random",this._sort(),this.reLayout(a)},destroy:function(){var a=this.usingTransforms,b=this.options;this.$allAtoms.removeClass(b.hiddenClass+" "+b.itemClass).each(function(){var b=this.style;b.position="",b.top="",b.left="",b.opacity="",a&&(b[i]="")});var c=this.element[0].style;for(var d in this.originalStyle)c[d]=this.originalStyle[d];this.element.unbind(".isotope").undelegate("."+b.hiddenClass,"click").removeClass(b.containerClass).removeData("isotope"),w.unbind(".isotope")},_getSegments:function(a){var b=this.options.layoutMode,c=a?"rowHeight":"columnWidth",d=a?"height":"width",e=a?"rows":"cols",g=this.element[d](),h,i=this.options[b]&&this.options[b][c]||this.$filteredAtoms["outer"+f(d)](!0)||g;h=Math.floor(g/i),h=Math.max(h,1),this[b][e]=h,this[b][c]=i},_checkIfSegmentsChanged:function(a){var b=this.options.layoutMode,c=a?"rows":"cols",d=this[b][c];return this._getSegments(a),this[b][c]!==d},_masonryReset:function(){this.masonry={},this._getSegments();var a=this.masonry.cols;this.masonry.colYs=[];while(a--)this.masonry.colYs.push(0)},_masonryLayout:function(a){var c=this,d=c.masonry;a.each(function(){var a=b(this),e=Math.ceil(a.outerWidth(!0)/d.columnWidth);e=Math.min(e,d.cols);if(e===1)c._masonryPlaceBrick(a,d.colYs);else{var f=d.cols+1-e,g=[],h,i;for(i=0;id&&(e.x=0,e.y=e.height),c._pushPosition(a,e.x,e.y),e.height=Math.max(e.y+g,e.height),e.x+=f})},_fitRowsGetContainerSize:function(){return{height:this.fitRows.height}},_fitRowsResizeChanged:function(){return!0},_cellsByRowReset:function(){this.cellsByRow={index:0},this._getSegments(),this._getSegments(!0)},_cellsByRowLayout:function(a){var c=this,d=this.cellsByRow;a.each(function(){var a=b(this),e=d.index%d.cols,f=Math.floor(d.index/d.cols),g=(e+.5)*d.columnWidth-a.outerWidth(!0)/2,h=(f+.5)*d.rowHeight-a.outerHeight(!0)/2;c._pushPosition(a,g,h),d.index++})},_cellsByRowGetContainerSize:function(){return{height:Math.ceil(this.$filteredAtoms.length/this.cellsByRow.cols)*this.cellsByRow.rowHeight+this.offset.top}},_cellsByRowResizeChanged:function(){return this._checkIfSegmentsChanged()},_straightDownReset:function(){this.straightDown={y:0}},_straightDownLayout:function(a){var c=this;a.each(function(a){var d=b(this);c._pushPosition(d,0,c.straightDown.y),c.straightDown.y+=d.outerHeight(!0)})},_straightDownGetContainerSize:function(){return{height:this.straightDown.y}},_straightDownResizeChanged:function(){return!0},_masonryHorizontalReset:function(){this.masonryHorizontal={},this._getSegments(!0);var a=this.masonryHorizontal.rows;this.masonryHorizontal.rowXs=[];while(a--)this.masonryHorizontal.rowXs.push(0)},_masonryHorizontalLayout:function(a){var c=this,d=c.masonryHorizontal;a.each(function(){var a=b(this),e=Math.ceil(a.outerHeight(!0)/d.rowHeight);e=Math.min(e,d.rows);if(e===1)c._masonryHorizontalPlaceBrick(a,d.rowXs);else{var f=d.rows+1-e,g=[],h,i;for(i=0;id&&(e.x=e.width,e.y=0),c._pushPosition(a,e.x,e.y),e.width=Math.max(e.x+f,e.width),e.y+=g})},_fitColumnsGetContainerSize:function(){return{width:this.fitColumns.width}},_fitColumnsResizeChanged:function(){return!0},_cellsByColumnReset:function(){this.cellsByColumn={index:0},this._getSegments(),this._getSegments(!0)},_cellsByColumnLayout:function(a){var c=this,d=this.cellsByColumn;a.each(function(){var a=b(this),e=Math.floor(d.index/d.rows),f=d.index%d.rows,g=(e+.5)*d.columnWidth-a.outerWidth(!0)/2,h=(f+.5)*d.rowHeight-a.outerHeight(!0)/2;c._pushPosition(a,g,h),d.index++})},_cellsByColumnGetContainerSize:function(){return{width:Math.ceil(this.$filteredAtoms.length/this.cellsByColumn.rows)*this.cellsByColumn.columnWidth}},_cellsByColumnResizeChanged:function(){return this._checkIfSegmentsChanged(!0)},_straightAcrossReset:function(){this.straightAcross={x:0}},_straightAcrossLayout:function(a){var c=this;a.each(function(a){var d=b(this);c._pushPosition(d,c.straightAcross.x,0),c.straightAcross.x+=d.outerWidth(!0)})},_straightAcrossGetContainerSize:function(){return{width:this.straightAcross.x}},_straightAcrossResizeChanged:function(){return!0}},b.fn.imagesLoaded=function(a){function h(){a.call(c,d)}function i(a){var c=a.target;c.src!==f&&b.inArray(c,g)===-1&&(g.push(c),--e<=0&&(setTimeout(h),d.unbind(".imagesLoaded",i)))}var c=this,d=c.find("img").add(c.filter("img")),e=d.length,f="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",g=[];return e||h(),d.bind("load.imagesLoaded error.imagesLoaded",i).each(function(){var a=this.src;this.src=f,this.src=a}),c};var x=function(b){a.console&&a.console.error(b)};b.fn.isotope=function(a,c){if(typeof a=="string"){var d=Array.prototype.slice.call(arguments,1);this.each(function(){var c=b.data(this,"isotope");if(!c){x("cannot call methods on isotope prior to initialization; attempted to call method '"+a+"'");return}if(!b.isFunction(c[a])||a.charAt(0)==="_"){x("no such method '"+a+"' for isotope instance");return}c[a].apply(c,d)})}else this.each(function(){var d=b.data(this,"isotope");d?(d.option(a),d._init(c)):b.data(this,"isotope",new b.Isotope(a,this,c))});return this}})(window,jQuery);
\ No newline at end of file
+!function(t,i){"use strict";var s,e=t.document,n=e.documentElement,o=t.Modernizr,r=function(t){return t.charAt(0).toUpperCase()+t.slice(1)},a="Moz Webkit O Ms".split(" "),h=function(t){var i,s=n.style;if("string"==typeof s[t])return t;t=r(t);for(var e=0,o=a.length;o>e;e++)if(i=a[e]+t,"string"==typeof s[i])return i},l=h("transform"),u=h("transitionProperty"),c={csstransforms:function(){return!!l},csstransforms3d:function(){var t=!!h("perspective");if(t&&"webkitPerspective"in n.style){var s=i("").appendTo("head"),e=i('').appendTo("html");t=3===e.height(),e.remove(),s.remove()}return t},csstransitions:function(){return!!u}};if(o)for(s in c)o.hasOwnProperty(s)||o.addTest(s,c[s]);else{o=t.Modernizr={_version:"1.6ish: miniModernizr for Isotope"};var d,f=" ";for(s in c)d=c[s](),o[s]=d,f+=" "+(d?"":"no-")+s;i("html").addClass(f)}if(o.csstransforms){var m=o.csstransforms3d?{translate:function(t){return"translate3d("+t[0]+"px, "+t[1]+"px, 0) "},scale:function(t){return"scale3d("+t+", "+t+", 1) "}}:{translate:function(t){return"translate("+t[0]+"px, "+t[1]+"px) "},scale:function(t){return"scale("+t+") "}},p=function(t,s,e){var n,o,r=i.data(t,"isoTransform")||{},a={},h={};a[s]=e,i.extend(r,a);for(n in r)o=r[n],h[n]=m[n](o);var u=h.translate||"",c=h.scale||"",d=u+c;i.data(t,"isoTransform",r),t.style[l]=d};i.cssNumber.scale=!0,i.cssHooks.scale={set:function(t,i){p(t,"scale",i)},get:function(t){var s=i.data(t,"isoTransform");return s&&s.scale?s.scale:1}},i.fx.step.scale=function(t){i.cssHooks.scale.set(t.elem,t.now+t.unit)},i.cssNumber.translate=!0,i.cssHooks.translate={set:function(t,i){p(t,"translate",i)},get:function(t){var s=i.data(t,"isoTransform");return s&&s.translate?s.translate:[0,0]}}}var y,g;o.csstransitions&&(y={WebkitTransitionProperty:"webkitTransitionEnd",MozTransitionProperty:"transitionend",OTransitionProperty:"oTransitionEnd otransitionend",transitionProperty:"transitionend"}[u],g=h("transitionDuration"));var v,_=i.event,A=i.event.handle?"handle":"dispatch";_.special.smartresize={setup:function(){i(this).bind("resize",_.special.smartresize.handler)},teardown:function(){i(this).unbind("resize",_.special.smartresize.handler)},handler:function(t,i){var s=this,e=arguments;t.type="smartresize",v&&clearTimeout(v),v=setTimeout(function(){_[A].apply(s,e)},"execAsap"===i?0:100)}},i.fn.smartresize=function(t){return t?this.bind("smartresize",t):this.trigger("smartresize",["execAsap"])},i.Isotope=function(t,s,e){this.element=i(s),this._create(t),this._init(e)};var w=["width","height"],C=i(t);i.Isotope.settings={resizable:!0,layoutMode:"masonry",containerClass:"isotope",itemClass:"isotope-item",hiddenClass:"isotope-hidden",hiddenStyle:{opacity:0,scale:.001},visibleStyle:{opacity:1,scale:1},containerStyle:{position:"relative",overflow:"hidden"},animationEngine:"best-available",animationOptions:{queue:!1,duration:800},sortBy:"original-order",sortAscending:!0,resizesContainer:!0,transformsEnabled:!0,itemPositionDataEnabled:!1},i.Isotope.prototype={_create:function(t){this.options=i.extend({},i.Isotope.settings,t),this.styleQueue=[],this.elemCount=0;var s=this.element[0].style;this.originalStyle={};var e=w.slice(0);for(var n in this.options.containerStyle)e.push(n);for(var o=0,r=e.length;r>o;o++)n=e[o],this.originalStyle[n]=s[n]||"";this.element.css(this.options.containerStyle),this._updateAnimationEngine(),this._updateUsingTransforms();var a={"original-order":function(t,i){return i.elemCount++,i.elemCount},random:function(){return Math.random()}};this.options.getSortData=i.extend(this.options.getSortData,a),this.reloadItems(),this.offset={left:parseInt(this.element.css("padding-left")||0,10),top:parseInt(this.element.css("padding-top")||0,10)};var h=this;setTimeout(function(){h.element.addClass(h.options.containerClass)},0),this.options.resizable&&C.bind("smartresize.isotope",function(){h.resize()}),this.element.delegate("."+this.options.hiddenClass,"click",function(){return!1})},_getAtoms:function(t){var i=this.options.itemSelector,s=i?t.filter(i).add(t.find(i)):t,e={position:"absolute"};return s=s.filter(function(t,i){return 1===i.nodeType}),this.usingTransforms&&(e.left=0,e.top=0),s.css(e).addClass(this.options.itemClass),this.updateSortData(s,!0),s},_init:function(t){this.$filteredAtoms=this._filter(this.$allAtoms),this._sort(),this.reLayout(t)},option:function(t){if(i.isPlainObject(t)){this.options=i.extend(!0,this.options,t);var s;for(var e in t)s="_update"+r(e),this[s]&&this[s]()}},_updateAnimationEngine:function(){var t,i=this.options.animationEngine.toLowerCase().replace(/[ _\-]/g,"");switch(i){case"css":case"none":t=!1;break;case"jquery":t=!0;break;default:t=!o.csstransitions}this.isUsingJQueryAnimation=t,this._updateUsingTransforms()},_updateTransformsEnabled:function(){this._updateUsingTransforms()},_updateUsingTransforms:function(){var t=this.usingTransforms=this.options.transformsEnabled&&o.csstransforms&&o.csstransitions&&!this.isUsingJQueryAnimation;t||(delete this.options.hiddenStyle.scale,delete this.options.visibleStyle.scale),this.getPositionStyles=t?this._translate:this._positionAbs},_filter:function(t){var i=""===this.options.filter?"*":this.options.filter;if(!i)return t;var s=this.options.hiddenClass,e="."+s,n=t.filter(e),o=n;if("*"!==i){o=n.filter(i);var r=t.not(e).not(i).addClass(s);this.styleQueue.push({$el:r,style:this.options.hiddenStyle})}return this.styleQueue.push({$el:o,style:this.options.visibleStyle}),o.removeClass(s),t.filter(i)},updateSortData:function(t,s){var e,n,o=this,r=this.options.getSortData;t.each(function(){e=i(this),n={};for(var t in r)n[t]=s||"original-order"!==t?r[t](e,o):i.data(this,"isotope-sort-data")[t];i.data(this,"isotope-sort-data",n)})},_sort:function(){var t=this.options.sortBy,i=this._getSorter,s=this.options.sortAscending?1:-1,e=function(e,n){var o=i(e,t),r=i(n,t);return o===r&&"original-order"!==t&&(o=i(e,"original-order"),r=i(n,"original-order")),(o>r?1:r>o?-1:0)*s};this.$filteredAtoms.sort(e)},_getSorter:function(t,s){return i.data(t,"isotope-sort-data")[s]},_translate:function(t,i){return{translate:[t,i]}},_positionAbs:function(t,i){return{left:t,top:i}},_pushPosition:function(t,i,s){i=Math.round(i+this.offset.left),s=Math.round(s+this.offset.top);var e=this.getPositionStyles(i,s);this.styleQueue.push({$el:t,style:e}),this.options.itemPositionDataEnabled&&t.data("isotope-item-position",{x:i,y:s})},layout:function(t,i){var s=this.options.layoutMode;if(this["_"+s+"Layout"](t),this.options.resizesContainer){var e=this["_"+s+"GetContainerSize"]();this.styleQueue.push({$el:this.element,style:e})}this._processStyleQueue(t,i),this.isLaidOut=!0},_processStyleQueue:function(t,s){var e,n,r,a,h=this.isLaidOut?this.isUsingJQueryAnimation?"animate":"css":"css",l=this.options.animationOptions,u=this.options.onLayout;if(n=function(t,i){i.$el[h](i.style,l)},this._isInserting&&this.isUsingJQueryAnimation)n=function(t,i){e=i.$el.hasClass("no-transition")?"css":h,i.$el[e](i.style,l)};else if(s||u||l.complete){var c=!1,d=[s,u,l.complete],f=this;if(r=!0,a=function(){if(!c){for(var i,s=0,e=d.length;e>s;s++)i=d[s],"function"==typeof i&&i.call(f.element,t,f);c=!0}},this.isUsingJQueryAnimation&&"animate"===h)l.complete=a,r=!1;else if(o.csstransitions){for(var m,p=0,v=this.styleQueue[0],_=v&&v.$el;!_||!_.length;){if(m=this.styleQueue[p++],!m)return;_=m.$el}var A=parseFloat(getComputedStyle(_[0])[g]);A>0&&(n=function(t,i){i.$el[h](i.style,l).one(y,a)},r=!1)}}i.each(this.styleQueue,n),r&&a(),this.styleQueue=[]},resize:function(){this["_"+this.options.layoutMode+"ResizeChanged"]()&&this.reLayout()},reLayout:function(t){this["_"+this.options.layoutMode+"Reset"](),this.layout(this.$filteredAtoms,t)},addItems:function(t,i){var s=this._getAtoms(t);this.$allAtoms=this.$allAtoms.add(s),i&&i(s)},insert:function(t,i){this.element.append(t);var s=this;this.addItems(t,function(t){var e=s._filter(t);s._addHideAppended(e),s._sort(),s.reLayout(),s._revealAppended(e,i)})},appended:function(t,i){var s=this;this.addItems(t,function(t){s._addHideAppended(t),s.layout(t),s._revealAppended(t,i)})},_addHideAppended:function(t){this.$filteredAtoms=this.$filteredAtoms.add(t),t.addClass("no-transition"),this._isInserting=!0,this.styleQueue.push({$el:t,style:this.options.hiddenStyle})},_revealAppended:function(t,i){var s=this;setTimeout(function(){t.removeClass("no-transition"),s.styleQueue.push({$el:t,style:s.options.visibleStyle}),s._isInserting=!1,s._processStyleQueue(t,i)},10)},reloadItems:function(){this.$allAtoms=this._getAtoms(this.element.children())},remove:function(t,i){this.$allAtoms=this.$allAtoms.not(t),this.$filteredAtoms=this.$filteredAtoms.not(t);var s=this,e=function(){t.remove(),i&&i.call(s.element)};t.filter(":not(."+this.options.hiddenClass+")").length?(this.styleQueue.push({$el:t,style:this.options.hiddenStyle}),this._sort(),this.reLayout(e)):e()},shuffle:function(t){this.updateSortData(this.$allAtoms),this.options.sortBy="random",this._sort(),this.reLayout(t)},destroy:function(){var t=this.usingTransforms,i=this.options;this.$allAtoms.removeClass(i.hiddenClass+" "+i.itemClass).each(function(){var i=this.style;i.position="",i.top="",i.left="",i.opacity="",t&&(i[l]="")});var s=this.element[0].style;for(var e in this.originalStyle)s[e]=this.originalStyle[e];this.element.unbind(".isotope").undelegate("."+i.hiddenClass,"click").removeClass(i.containerClass).removeData("isotope"),C.unbind(".isotope")},_getSegments:function(t){var i,s=this.options.layoutMode,e=t?"rowHeight":"columnWidth",n=t?"height":"width",o=t?"rows":"cols",a=this.element[n](),h=this.options[s]&&this.options[s][e]||this.$filteredAtoms["outer"+r(n)](!0)||a;i=Math.floor(a/h),i=Math.max(i,1),this[s][o]=i,this[s][e]=h},_checkIfSegmentsChanged:function(t){var i=this.options.layoutMode,s=t?"rows":"cols",e=this[i][s];return this._getSegments(t),this[i][s]!==e},_masonryReset:function(){this.masonry={},this._getSegments();var t=this.masonry.cols;for(this.masonry.colYs=[];t--;)this.masonry.colYs.push(0)},_masonryLayout:function(t){var s=this,e=s.masonry;t.each(function(){var t=i(this),n=Math.ceil(t.outerWidth(!0)/e.columnWidth);if(n=Math.min(n,e.cols),1===n)s._masonryPlaceBrick(t,e.colYs);else{var o,r,a=e.cols+1-n,h=[];for(r=0;a>r;r++)o=e.colYs.slice(r,r+n),h[r]=Math.max.apply(Math,o);s._masonryPlaceBrick(t,h)}})},_masonryPlaceBrick:function(t,i){for(var s=Math.min.apply(Math,i),e=0,n=0,o=i.length;o>n;n++)if(i[n]===s){e=n;break}var r=this.masonry.columnWidth*e,a=s;this._pushPosition(t,r,a);var h=s+t.outerHeight(!0),l=this.masonry.cols+1-o;for(n=0;l>n;n++)this.masonry.colYs[e+n]=h},_masonryGetContainerSize:function(){var t=Math.max.apply(Math,this.masonry.colYs);return{height:t}},_masonryResizeChanged:function(){return this._checkIfSegmentsChanged()},_fitRowsReset:function(){this.fitRows={x:0,y:0,height:0}},_fitRowsLayout:function(t){var s=this,e=this.element.width(),n=this.fitRows;t.each(function(){var t=i(this),o=t.outerWidth(!0),r=t.outerHeight(!0);0!==n.x&&o+n.x>e&&(n.x=0,n.y=n.height),s._pushPosition(t,n.x,n.y),n.height=Math.max(n.y+r,n.height),n.x+=o})},_fitRowsGetContainerSize:function(){return{height:this.fitRows.height}},_fitRowsResizeChanged:function(){return!0},_cellsByRowReset:function(){this.cellsByRow={index:0},this._getSegments(),this._getSegments(!0)},_cellsByRowLayout:function(t){var s=this,e=this.cellsByRow;t.each(function(){var t=i(this),n=e.index%e.cols,o=Math.floor(e.index/e.cols),r=(n+.5)*e.columnWidth-t.outerWidth(!0)/2,a=(o+.5)*e.rowHeight-t.outerHeight(!0)/2;s._pushPosition(t,r,a),e.index++})},_cellsByRowGetContainerSize:function(){return{height:Math.ceil(this.$filteredAtoms.length/this.cellsByRow.cols)*this.cellsByRow.rowHeight+this.offset.top}},_cellsByRowResizeChanged:function(){return this._checkIfSegmentsChanged()},_straightDownReset:function(){this.straightDown={y:0}},_straightDownLayout:function(t){var s=this;t.each(function(){var t=i(this);s._pushPosition(t,0,s.straightDown.y),s.straightDown.y+=t.outerHeight(!0)})},_straightDownGetContainerSize:function(){return{height:this.straightDown.y}},_straightDownResizeChanged:function(){return!0},_masonryHorizontalReset:function(){this.masonryHorizontal={},this._getSegments(!0);var t=this.masonryHorizontal.rows;for(this.masonryHorizontal.rowXs=[];t--;)this.masonryHorizontal.rowXs.push(0)},_masonryHorizontalLayout:function(t){var s=this,e=s.masonryHorizontal;t.each(function(){var t=i(this),n=Math.ceil(t.outerHeight(!0)/e.rowHeight);if(n=Math.min(n,e.rows),1===n)s._masonryHorizontalPlaceBrick(t,e.rowXs);else{var o,r,a=e.rows+1-n,h=[];for(r=0;a>r;r++)o=e.rowXs.slice(r,r+n),h[r]=Math.max.apply(Math,o);s._masonryHorizontalPlaceBrick(t,h)}})},_masonryHorizontalPlaceBrick:function(t,i){for(var s=Math.min.apply(Math,i),e=0,n=0,o=i.length;o>n;n++)if(i[n]===s){e=n;break}var r=s,a=this.masonryHorizontal.rowHeight*e;this._pushPosition(t,r,a);var h=s+t.outerWidth(!0),l=this.masonryHorizontal.rows+1-o;for(n=0;l>n;n++)this.masonryHorizontal.rowXs[e+n]=h},_masonryHorizontalGetContainerSize:function(){var t=Math.max.apply(Math,this.masonryHorizontal.rowXs);return{width:t}},_masonryHorizontalResizeChanged:function(){return this._checkIfSegmentsChanged(!0)},_fitColumnsReset:function(){this.fitColumns={x:0,y:0,width:0}},_fitColumnsLayout:function(t){var s=this,e=this.element.height(),n=this.fitColumns;t.each(function(){var t=i(this),o=t.outerWidth(!0),r=t.outerHeight(!0);0!==n.y&&r+n.y>e&&(n.x=n.width,n.y=0),s._pushPosition(t,n.x,n.y),n.width=Math.max(n.x+o,n.width),n.y+=r})},_fitColumnsGetContainerSize:function(){return{width:this.fitColumns.width}},_fitColumnsResizeChanged:function(){return!0},_cellsByColumnReset:function(){this.cellsByColumn={index:0},this._getSegments(),this._getSegments(!0)},_cellsByColumnLayout:function(t){var s=this,e=this.cellsByColumn;t.each(function(){var t=i(this),n=Math.floor(e.index/e.rows),o=e.index%e.rows,r=(n+.5)*e.columnWidth-t.outerWidth(!0)/2,a=(o+.5)*e.rowHeight-t.outerHeight(!0)/2;s._pushPosition(t,r,a),e.index++})},_cellsByColumnGetContainerSize:function(){return{width:Math.ceil(this.$filteredAtoms.length/this.cellsByColumn.rows)*this.cellsByColumn.columnWidth}},_cellsByColumnResizeChanged:function(){return this._checkIfSegmentsChanged(!0)},_straightAcrossReset:function(){this.straightAcross={x:0}},_straightAcrossLayout:function(t){var s=this;t.each(function(){var t=i(this);s._pushPosition(t,s.straightAcross.x,0),s.straightAcross.x+=t.outerWidth(!0)})},_straightAcrossGetContainerSize:function(){return{width:this.straightAcross.x}},_straightAcrossResizeChanged:function(){return!0}},i.fn.imagesLoaded=function(t){function s(){t.call(n,o)}function e(t){var n=t.target;n.src!==a&&-1===i.inArray(n,h)&&(h.push(n),--r<=0&&(setTimeout(s),o.unbind(".imagesLoaded",e)))}var n=this,o=n.find("img").add(n.filter("img")),r=o.length,a="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",h=[];return r||s(),o.bind("load.imagesLoaded error.imagesLoaded",e).each(function(){var t=this.src;this.src=a,this.src=t}),n};var z=function(i){t.console&&t.console.error(i)};i.fn.isotope=function(t,s){if("string"==typeof t){var e=Array.prototype.slice.call(arguments,1);this.each(function(){var s=i.data(this,"isotope");return s?i.isFunction(s[t])&&"_"!==t.charAt(0)?void s[t].apply(s,e):void z("no such method '"+t+"' for isotope instance"):void z("cannot call methods on isotope prior to initialization; attempted to call method '"+t+"'")})}else this.each(function(){var e=i.data(this,"isotope");e?(e.option(t),e._init(s)):i.data(this,"isotope",new i.Isotope(t,this,s))});return this}}(window,jQuery);
\ No newline at end of file
diff --git a/modules/system/assets/ui/docs/loader.md b/modules/system/assets/ui/docs/loader.md
index c46f21a35..138ea90f1 100644
--- a/modules/system/assets/ui/docs/loader.md
+++ b/modules/system/assets/ui/docs/loader.md
@@ -8,9 +8,9 @@ A loading indicator used in a container.
-
This is some content inside the container
-
The loading indicator must be prepended to it
+
This is some content inside the container
+
The loading indicator must be prepended to it
#### Text Loading Indicator
@@ -44,6 +44,15 @@ A loading indicator can be aligned to the center by adding `indicator-center` to
+You may add some optional text:
+
+
diff --git a/modules/system/assets/ui/less/checkbox.less b/modules/system/assets/ui/less/checkbox.less
index cc2ef6fd0..b96013a4d 100644
--- a/modules/system/assets/ui/less/checkbox.less
+++ b/modules/system/assets/ui/less/checkbox.less
@@ -98,7 +98,7 @@
display: inline-block;
position: absolute;
left: 0;
- top: 3px;
+ top: 2px;
.border-radius(17px);
}
}
diff --git a/modules/system/assets/ui/less/loader.less b/modules/system/assets/ui/less/loader.less
index c91747e07..4613a5d07 100644
--- a/modules/system/assets/ui/less/loader.less
+++ b/modules/system/assets/ui/less/loader.less
@@ -108,9 +108,9 @@ html.cssanimations {
}
> div {
- top: auto;
text-align: center;
position: relative;
+ margin-top: 30px;
}
}
diff --git a/modules/system/assets/ui/storm.css b/modules/system/assets/ui/storm.css
index f52bec004..e41adcf76 100644
--- a/modules/system/assets/ui/storm.css
+++ b/modules/system/assets/ui/storm.css
@@ -2078,7 +2078,7 @@ html.cssanimations .loading-indicator.is-opaque > span,html.cssanimations .loadi
html.cssanimations .loading-indicator.size-small > span,html.cssanimations .loading-indicator-container.size-small .loading-indicator > span{background-size:20px 20px}
.loading-indicator.indicator-center,.loading-indicator-container.indicator-center .loading-indicator{padding:20px}
.loading-indicator.indicator-center > span,.loading-indicator-container.indicator-center .loading-indicator > span{left:50%;margin-left:-20px;margin-top:-20px}
-.loading-indicator.indicator-center > div,.loading-indicator-container.indicator-center .loading-indicator > div{top:auto;text-align:center;position:relative}
+.loading-indicator.indicator-center > div,.loading-indicator-container.indicator-center .loading-indicator > div{text-align:center;position:relative;margin-top:30px}
.loading-indicator.indicator-inset,.loading-indicator-container.indicator-inset .loading-indicator{padding-left:80px}
.loading-indicator.indicator-inset > span,.loading-indicator-container.indicator-inset .loading-indicator > span{left:20px}
.loading-indicator-container.size-form-field,.loading-indicator-container.size-input-text{min-height:0}
@@ -2321,7 +2321,7 @@ html.cssanimations .cursor-loading-indicator.hide{display:none}
.custom-checkbox label:hover:before,.custom-radio label:hover:before{border-color:#b5bdc2}
.custom-checkbox label:active:before,.custom-radio label:active:before{border-color:#99a4ab;border-width:2px}
.custom-checkbox input[type=radio]:checked + label:before,.custom-radio input[type=radio]:checked + label:before{border-color:#1f99dc;line-height:17px;border-width:2px}
-.custom-checkbox input[type=radio]:checked + label:after,.custom-radio input[type=radio]:checked + label:after{content:'';width:12px;height:12px;background-color:#1f99dc;display:inline-block;position:absolute;left:0;top:3px;-webkit-border-radius:17px;-moz-border-radius:17px;border-radius:17px}
+.custom-checkbox input[type=radio]:checked + label:after,.custom-radio input[type=radio]:checked + label:after{content:'';width:12px;height:12px;background-color:#1f99dc;display:inline-block;position:absolute;left:0;top:2px;-webkit-border-radius:17px;-moz-border-radius:17px;border-radius:17px}
.custom-checkbox input[type=radio][data-radio-color=green]:checked + label:before,.custom-radio input[type=radio][data-radio-color=green]:checked + label:before{border-color:#76a544}
.custom-checkbox input[type=radio][data-radio-color=green]:checked + label:after,.custom-radio input[type=radio][data-radio-color=green]:checked + label:after{background-color:#76a544}
.custom-checkbox input[type=radio][data-radio-color=red]:checked + label:before,.custom-radio input[type=radio][data-radio-color=red]:checked + label:before{border-color:#bb2424}