define( [

"../core",
"../var/document",
"../manipulation" // appendTo

], function( jQuery, document ) {

var iframe,

elemdisplay = {

        // Support: Firefox
        // We have to pre-define these values for FF (#10227)
        HTML: "block",
        BODY: "block"
};

/**

* Retrieve the actual display of a element
* @param {String} name nodeName of the element
* @param {Object} doc Document object
*/

// Called only from within defaultDisplay function actualDisplay( name, doc ) {

var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),

        display = jQuery.css( elem[ 0 ], "display" );

// We don't have any data stored on the element,
// so use "detach" method as fast way to get rid of the element
elem.detach();

return display;

}

/**

* Try to determine the default display value of an element
* @param {String} nodeName
*/

function defaultDisplay( nodeName ) {

var doc = document,
        display = elemdisplay[ nodeName ];

if ( !display ) {
        display = actualDisplay( nodeName, doc );

        // If the simple way fails, read from inside an iframe
        if ( display === "none" || !display ) {

                // Use the already-created iframe if possible
                iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
                        .appendTo( doc.documentElement );

                // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
                doc = iframe[ 0 ].contentDocument;

                // Support: IE
                doc.write();
                doc.close();

                display = actualDisplay( nodeName, doc );
                iframe.detach();
        }

        // Store the correct default display
        elemdisplay[ nodeName ] = display;
}

return display;

}

return defaultDisplay; } );