Merge "re-enable testapi auto update"
[releng.git] / utils / test / testapi / 3rd_party / static / testapi-ui / assets / lib / jquery / src / traversing.js
1 define( [
2         "./core",
3         "./var/indexOf",
4         "./traversing/var/dir",
5         "./traversing/var/siblings",
6         "./traversing/var/rneedsContext",
7         "./core/nodeName",
8
9         "./core/init",
10         "./traversing/findFilter",
11         "./selector"
12 ], function( jQuery, indexOf, dir, siblings, rneedsContext, nodeName ) {
13
14 "use strict";
15
16 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
17
18         // Methods guaranteed to produce a unique set when starting from a unique set
19         guaranteedUnique = {
20                 children: true,
21                 contents: true,
22                 next: true,
23                 prev: true
24         };
25
26 jQuery.fn.extend( {
27         has: function( target ) {
28                 var targets = jQuery( target, this ),
29                         l = targets.length;
30
31                 return this.filter( function() {
32                         var i = 0;
33                         for ( ; i < l; i++ ) {
34                                 if ( jQuery.contains( this, targets[ i ] ) ) {
35                                         return true;
36                                 }
37                         }
38                 } );
39         },
40
41         closest: function( selectors, context ) {
42                 var cur,
43                         i = 0,
44                         l = this.length,
45                         matched = [],
46                         targets = typeof selectors !== "string" && jQuery( selectors );
47
48                 // Positional selectors never match, since there's no _selection_ context
49                 if ( !rneedsContext.test( selectors ) ) {
50                         for ( ; i < l; i++ ) {
51                                 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
52
53                                         // Always skip document fragments
54                                         if ( cur.nodeType < 11 && ( targets ?
55                                                 targets.index( cur ) > -1 :
56
57                                                 // Don't pass non-elements to Sizzle
58                                                 cur.nodeType === 1 &&
59                                                         jQuery.find.matchesSelector( cur, selectors ) ) ) {
60
61                                                 matched.push( cur );
62                                                 break;
63                                         }
64                                 }
65                         }
66                 }
67
68                 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
69         },
70
71         // Determine the position of an element within the set
72         index: function( elem ) {
73
74                 // No argument, return index in parent
75                 if ( !elem ) {
76                         return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
77                 }
78
79                 // Index in selector
80                 if ( typeof elem === "string" ) {
81                         return indexOf.call( jQuery( elem ), this[ 0 ] );
82                 }
83
84                 // Locate the position of the desired element
85                 return indexOf.call( this,
86
87                         // If it receives a jQuery object, the first element is used
88                         elem.jquery ? elem[ 0 ] : elem
89                 );
90         },
91
92         add: function( selector, context ) {
93                 return this.pushStack(
94                         jQuery.uniqueSort(
95                                 jQuery.merge( this.get(), jQuery( selector, context ) )
96                         )
97                 );
98         },
99
100         addBack: function( selector ) {
101                 return this.add( selector == null ?
102                         this.prevObject : this.prevObject.filter( selector )
103                 );
104         }
105 } );
106
107 function sibling( cur, dir ) {
108         while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
109         return cur;
110 }
111
112 jQuery.each( {
113         parent: function( elem ) {
114                 var parent = elem.parentNode;
115                 return parent && parent.nodeType !== 11 ? parent : null;
116         },
117         parents: function( elem ) {
118                 return dir( elem, "parentNode" );
119         },
120         parentsUntil: function( elem, i, until ) {
121                 return dir( elem, "parentNode", until );
122         },
123         next: function( elem ) {
124                 return sibling( elem, "nextSibling" );
125         },
126         prev: function( elem ) {
127                 return sibling( elem, "previousSibling" );
128         },
129         nextAll: function( elem ) {
130                 return dir( elem, "nextSibling" );
131         },
132         prevAll: function( elem ) {
133                 return dir( elem, "previousSibling" );
134         },
135         nextUntil: function( elem, i, until ) {
136                 return dir( elem, "nextSibling", until );
137         },
138         prevUntil: function( elem, i, until ) {
139                 return dir( elem, "previousSibling", until );
140         },
141         siblings: function( elem ) {
142                 return siblings( ( elem.parentNode || {} ).firstChild, elem );
143         },
144         children: function( elem ) {
145                 return siblings( elem.firstChild );
146         },
147         contents: function( elem ) {
148         if ( nodeName( elem, "iframe" ) ) {
149             return elem.contentDocument;
150         }
151
152         // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
153         // Treat the template element as a regular one in browsers that
154         // don't support it.
155         if ( nodeName( elem, "template" ) ) {
156             elem = elem.content || elem;
157         }
158
159         return jQuery.merge( [], elem.childNodes );
160         }
161 }, function( name, fn ) {
162         jQuery.fn[ name ] = function( until, selector ) {
163                 var matched = jQuery.map( this, fn, until );
164
165                 if ( name.slice( -5 ) !== "Until" ) {
166                         selector = until;
167                 }
168
169                 if ( selector && typeof selector === "string" ) {
170                         matched = jQuery.filter( selector, matched );
171                 }
172
173                 if ( this.length > 1 ) {
174
175                         // Remove duplicates
176                         if ( !guaranteedUnique[ name ] ) {
177                                 jQuery.uniqueSort( matched );
178                         }
179
180                         // Reverse order for parents* and prev-derivatives
181                         if ( rparentsprev.test( name ) ) {
182                                 matched.reverse();
183                         }
184                 }
185
186                 return this.pushStack( matched );
187         };
188 } );
189
190 return jQuery;
191 } );