define( [

"../core",
"../data/var/dataPriv",
"../css/var/isHiddenWithinTree"

], function( jQuery, dataPriv, isHiddenWithinTree ) {

“use strict”;

var defaultDisplayMap = {};

function getDefaultDisplay( elem ) {

var temp,
        doc = elem.ownerDocument,
        nodeName = elem.nodeName,
        display = defaultDisplayMap[ nodeName ];

if ( display ) {
        return display;
}

temp = doc.body.appendChild( doc.createElement( nodeName ) );
display = jQuery.css( temp, "display" );

temp.parentNode.removeChild( temp );

if ( display === "none" ) {
        display = "block";
}
defaultDisplayMap[ nodeName ] = display;

return display;

}

function showHide( elements, show ) {

var display, elem,
        values = [],
        index = 0,
        length = elements.length;

// Determine new display value for elements that need to change
for ( ; index < length; index++ ) {
        elem = elements[ index ];
        if ( !elem.style ) {
                continue;
        }

        display = elem.style.display;
        if ( show ) {

                // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
                // check is required in this first loop unless we have a nonempty display value (either
                // inline or about-to-be-restored)
                if ( display === "none" ) {
                        values[ index ] = dataPriv.get( elem, "display" ) || null;
                        if ( !values[ index ] ) {
                                elem.style.display = "";
                        }
                }
                if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
                        values[ index ] = getDefaultDisplay( elem );
                }
        } else {
                if ( display !== "none" ) {
                        values[ index ] = "none";

                        // Remember what we're overwriting
                        dataPriv.set( elem, "display", display );
                }
        }
}

// Set the display of the elements in a second loop to avoid constant reflow
for ( index = 0; index < length; index++ ) {
        if ( values[ index ] != null ) {
                elements[ index ].style.display = values[ index ];
        }
}

return elements;

}

jQuery.fn.extend( {

show: function() {
        return showHide( this, true );
},
hide: function() {
        return showHide( this );
},
toggle: function( state ) {
        if ( typeof state === "boolean" ) {
                return state ? this.show() : this.hide();
        }

        return this.each( function() {
                if ( isHiddenWithinTree( this ) ) {
                        jQuery( this ).show();
                } else {
                        jQuery( this ).hide();
                }
        } );
}

} );

return showHide; } );