-jQuery.winnow = function( elements, qualifier, keep ) {
+var winnow = function( elements, qualifier, keep ) {
if(jQuery.isFunction( qualifier )) {
return jQuery.grep(elements, function(elem, i) {
return !!qualifier.call( elem, i ) === keep;
},
not: function( selector ) {
- return this.pushStack( jQuery.winnow(this, selector, false), "not", selector);
+ return this.pushStack( winnow(this, selector, false), "not", selector);
},
filter: function( selector ) {
- return this.pushStack( jQuery.winnow(this, selector, true), "filter", selector );
+ return this.pushStack( winnow(this, selector, true), "filter", selector );
},
- closest: function( selector ) {
+ closest: function( selector, context ) {
var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
closer = 0;
return this.map(function(){
var cur = this;
- while ( cur && cur.ownerDocument ) {
+ while ( cur && cur.ownerDocument && cur !== context ) {
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
jQuery.data(cur, "closest", closer);
return cur;
},
add: function( selector ) {
- return this.pushStack( jQuery.unique( jQuery.merge(
- this.get(),
- typeof selector === "string" ?
+ var set = typeof selector === "string" ?
jQuery( selector ) :
- jQuery.makeArray( selector )
- )));
+ jQuery.makeArray( selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( set[0] && (set[0].setInterval || set[0].nodeType === 9 || (set[0].parentNode && set[0].parentNode.nodeType !== 11)) ?
+ jQuery.unique( all ) :
+ all );
},
eq: function( i ) {
- return this.slice( i, +i + 1 );
+ return i === -1 ?
+ this.slice( i ) :
+ this.slice( i, +i + 1 );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
},
slice: function() {
jQuery.fn[ name ] = function( selector ) {
var ret = jQuery.map( this, fn );
- if ( selector && typeof selector == "string" )
+ if ( selector && typeof selector === "string" ) {
ret = jQuery.multiFilter( selector, ret );
+ }
+
+ ret = this.length > 1 ? jQuery.unique( ret ) : ret;
+
+ if ( name === "parents" && this.length > 1 ) {
+ ret = ret.reverse();
+ }
- return this.pushStack( jQuery.unique( ret ), name, selector );
+ return this.pushStack( ret, name, selector );
};
});