/*!

* jQuery UI Effects Explode 1.11.4
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/explode-effect/
*/

(function( factory ) {

if ( typeof define === "function" && define.amd ) {

        // AMD. Register as an anonymous module.
        define([
                "jquery",
                "./effect"
        ], factory );
} else {

        // Browser globals
        factory( jQuery );
}

}(function( $ ) {

return $.effects.effect.explode = function( o, done ) {

var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
        cells = rows,
        el = $( this ),
        mode = $.effects.setMode( el, o.mode || "hide" ),
        show = mode === "show",

        // show and then visibility:hidden the element before calculating offset
        offset = el.show().css( "visibility", "hidden" ).offset(),

        // width and height of a piece
        width = Math.ceil( el.outerWidth() / cells ),
        height = Math.ceil( el.outerHeight() / rows ),
        pieces = [],

        // loop
        i, j, left, top, mx, my;

// children animate complete:
function childComplete() {
        pieces.push( this );
        if ( pieces.length === rows * cells ) {
                animComplete();
        }
}

// clone the element for each row and cell.
for ( i = 0; i < rows ; i++ ) { // ===>
        top = offset.top + i * height;
        my = i - ( rows - 1 ) / 2 ;

        for ( j = 0; j < cells ; j++ ) { // |||
                left = offset.left + j * width;
                mx = j - ( cells - 1 ) / 2 ;

                // Create a clone of the now hidden main element that will be absolute positioned
                // within a wrapper div off the -left and -top equal to size of our pieces
                el
                        .clone()
                        .appendTo( "body" )
                        .wrap( "<div></div>" )
                        .css({
                                position: "absolute",
                                visibility: "visible",
                                left: -j * width,
                                top: -i * height
                        })

                // select the wrapper - make it overflow: hidden and absolute positioned based on
                // where the original was located +left and +top equal to the size of pieces
                        .parent()
                        .addClass( "ui-effects-explode" )
                        .css({
                                position: "absolute",
                                overflow: "hidden",
                                width: width,
                                height: height,
                                left: left + ( show ? mx * width : 0 ),
                                top: top + ( show ? my * height : 0 ),
                                opacity: show ? 0 : 1
                        }).animate({
                                left: left + ( show ? 0 : mx * width ),
                                top: top + ( show ? 0 : my * height ),
                                opacity: show ? 1 : 0
                        }, o.duration || 500, o.easing, childComplete );
        }
}

function animComplete() {
        el.css({
                visibility: "visible"
        });
        $( pieces ).remove();
        if ( !show ) {
                el.hide();
        }
        done();
}

};

}));