Merge "add web portal framework for TestAPI"
[releng.git] / utils / test / testapi / 3rd_party / static / testapi-ui / assets / lib / jquery / src / traversing / findFilter.js
1 define( [
2         "../core",
3         "../var/indexOf",
4         "./var/rneedsContext",
5         "../selector"
6 ], function( jQuery, indexOf, rneedsContext ) {
7
8 "use strict";
9
10 var risSimple = /^.[^:#\[\.,]*$/;
11
12 // Implement the identical functionality for filter and not
13 function winnow( elements, qualifier, not ) {
14         if ( jQuery.isFunction( qualifier ) ) {
15                 return jQuery.grep( elements, function( elem, i ) {
16                         return !!qualifier.call( elem, i, elem ) !== not;
17                 } );
18         }
19
20         // Single element
21         if ( qualifier.nodeType ) {
22                 return jQuery.grep( elements, function( elem ) {
23                         return ( elem === qualifier ) !== not;
24                 } );
25         }
26
27         // Arraylike of elements (jQuery, arguments, Array)
28         if ( typeof qualifier !== "string" ) {
29                 return jQuery.grep( elements, function( elem ) {
30                         return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
31                 } );
32         }
33
34         // Simple selector that can be filtered directly, removing non-Elements
35         if ( risSimple.test( qualifier ) ) {
36                 return jQuery.filter( qualifier, elements, not );
37         }
38
39         // Complex selector, compare the two sets, removing non-Elements
40         qualifier = jQuery.filter( qualifier, elements );
41         return jQuery.grep( elements, function( elem ) {
42                 return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
43         } );
44 }
45
46 jQuery.filter = function( expr, elems, not ) {
47         var elem = elems[ 0 ];
48
49         if ( not ) {
50                 expr = ":not(" + expr + ")";
51         }
52
53         if ( elems.length === 1 && elem.nodeType === 1 ) {
54                 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
55         }
56
57         return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
58                 return elem.nodeType === 1;
59         } ) );
60 };
61
62 jQuery.fn.extend( {
63         find: function( selector ) {
64                 var i, ret,
65                         len = this.length,
66                         self = this;
67
68                 if ( typeof selector !== "string" ) {
69                         return this.pushStack( jQuery( selector ).filter( function() {
70                                 for ( i = 0; i < len; i++ ) {
71                                         if ( jQuery.contains( self[ i ], this ) ) {
72                                                 return true;
73                                         }
74                                 }
75                         } ) );
76                 }
77
78                 ret = this.pushStack( [] );
79
80                 for ( i = 0; i < len; i++ ) {
81                         jQuery.find( selector, self[ i ], ret );
82                 }
83
84                 return len > 1 ? jQuery.uniqueSort( ret ) : ret;
85         },
86         filter: function( selector ) {
87                 return this.pushStack( winnow( this, selector || [], false ) );
88         },
89         not: function( selector ) {
90                 return this.pushStack( winnow( this, selector || [], true ) );
91         },
92         is: function( selector ) {
93                 return !!winnow(
94                         this,
95
96                         // If this is a positional/relative selector, check membership in the returned set
97                         // so $("p:first").is("p:last") won't return true for a doc with two "p".
98                         typeof selector === "string" && rneedsContext.test( selector ) ?
99                                 jQuery( selector ) :
100                                 selector || [],
101                         false
102                 ).length;
103         }
104 } );
105
106 } );