Added support for .wrapInner() and .wrapAll() - and re-wrote .wrap() to use .wrapAll...
[jquery.git] / src / jquery / jquery.js
index 4c5941b..8f8a176 100644 (file)
@@ -163,7 +163,7 @@ jQuery.fn = jQuery.prototype = {
                        if ( m && (m[1] || !c) ) {
                                // HANDLE: $(html) -> $(array)
                                if ( m[1] )
-                                       a = jQuery.clean( [ m[1] ] );
+                                       a = jQuery.clean( [ m[1] ], c );
 
                                // HANDLE: $("#id")
                                else {
@@ -646,27 +646,32 @@ jQuery.fn = jQuery.prototype = {
         * @param Element elem A DOM element that will be wrapped around the target.
         * @cat DOM/Manipulation
         */
-       wrap: function() {
-               // The elements to wrap the target around
-               var a, args = arguments;
+       wrapAll: function(html) {
+               if ( this[0] )
+                       // The elements to wrap the target around
+                       jQuery(html, this[0].ownerDocument)
+                               .clone()
+                               .insertBefore(this[0])
+                               .map(function(){
+                                       var elem = this;
+                                       while ( elem.firstChild )
+                                               elem = elem.firstChild;
+                                       return elem;
+                               })
+                               .append(this);
 
-               // Wrap each of the matched elements individually
-               return this.each(function(){
-                       if ( !a )
-                               a = jQuery.clean(args, this.ownerDocument);
-
-                       // Clone the structure that we're using to wrap
-                       var b = a[0].cloneNode(true);
-
-                       // Insert it before the element to be wrapped
-                       this.parentNode.insertBefore( b, this );
+               return this;
+       },
 
-                       // Find the deepest point in the wrap structure
-                       while ( b.firstChild )
-                               b = b.firstChild;
+       wrapInner: function(html) {
+               return this.each(function(){
+                       jQuery(this).contents().wrapAll(html);
+               });
+       },
 
-                       // Move the matched element to within the wrap structure
-                       b.appendChild( this );
+       wrap: function(html) {
+               return this.each(function(){
+                       jQuery(this).wrapAll(html);
                });
        },
 
@@ -1182,9 +1187,19 @@ jQuery.fn = jQuery.prototype = {
                        this.empty().append( val );
        },
 
+       replaceWith: function( val ) {
+               return this.after( val ).remove();
+       },
+
        slice: function() {
                return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
        },
+
+       map: function(fn){
+               return this.pushStack(jQuery.map( this, function(elem,i){
+                       return fn.call( elem, i, elem );
+               }));
+       },
        
        /**
         * @private
@@ -2141,7 +2156,8 @@ jQuery.each({
        next: "jQuery.nth(a,2,'nextSibling')",
        prev: "jQuery.nth(a,2,'previousSibling')",
        siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
-       children: "jQuery.sibling(a.firstChild)"
+       children: "jQuery.sibling(a.firstChild)",
+       contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
 }, function(i,n){
        jQuery.fn[ i ] = function(a) {
                var ret = jQuery.map(this,n);
@@ -2227,7 +2243,8 @@ jQuery.each({
        appendTo: "append",
        prependTo: "prepend",
        insertBefore: "before",
-       insertAfter: "after"
+       insertAfter: "after",
+       replaceAll: "replaceWith"
 }, function(i,n){
        jQuery.fn[ i ] = function(){
                var a = arguments;