define( [

	"./core",

	"./var/isFunction",

	"./core/init",

	"./manipulation", // clone

	"./traversing" // parent, contents

], function( jQuery, isFunction ) {



"use strict";



jQuery.fn.extend( {

	wrapAll: function( html ) {

		var wrap;



		if ( this[ 0 ] ) {

			if ( isFunction( html ) ) {

				html = html.call( this[ 0 ] );

			}



			// The elements to wrap the target around

			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );



			if ( this[ 0 ].parentNode ) {

				wrap.insertBefore( this[ 0 ] );

			}



			wrap.map( function() {

				var elem = this;



				while ( elem.firstElementChild ) {

					elem = elem.firstElementChild;

				}



				return elem;

			} ).append( this );

		}



		return this;

	},



	wrapInner: function( html ) {

		if ( isFunction( html ) ) {

			return this.each( function( i ) {

				jQuery( this ).wrapInner( html.call( this, i ) );

			} );

		}



		return this.each( function() {

			var self = jQuery( this ),

				contents = self.contents();



			if ( contents.length ) {

				contents.wrapAll( html );



			} else {

				self.append( html );

			}

		} );

	},



	wrap: function( html ) {

		var htmlIsFunction = isFunction( html );



		return this.each( function( i ) {

			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );

		} );

	},



	unwrap: function( selector ) {

		this.parent( selector ).not( "body" ).each( function() {

			jQuery( this ).replaceWith( this.childNodes );

		} );

		return this;

	}

} );



return jQuery;

} );

