|
1 /*! |
|
2 * Sizzle CSS Selector Engine |
|
3 * Copyright 2011, The Dojo Foundation |
|
4 * Released under the MIT, BSD, and GPL Licenses. |
|
5 * More information: http://sizzlejs.com/ |
|
6 */ |
|
7 (function(){ |
|
8 |
|
9 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, |
|
10 done = 0, |
|
11 toString = Object.prototype.toString, |
|
12 hasDuplicate = false, |
|
13 baseHasDuplicate = true; |
|
14 |
|
15 // Here we check if the JavaScript engine is using some sort of |
|
16 // optimization where it does not always call our comparision |
|
17 // function. If that is the case, discard the hasDuplicate value. |
|
18 // Thus far that includes Google Chrome. |
|
19 [0, 0].sort(function() { |
|
20 baseHasDuplicate = false; |
|
21 return 0; |
|
22 }); |
|
23 |
|
24 var Sizzle = function( selector, context, results, seed ) { |
|
25 results = results || []; |
|
26 context = context || document; |
|
27 |
|
28 var origContext = context; |
|
29 |
|
30 if ( context.nodeType !== 1 && context.nodeType !== 9 ) { |
|
31 return []; |
|
32 } |
|
33 |
|
34 if ( !selector || typeof selector !== "string" ) { |
|
35 return results; |
|
36 } |
|
37 |
|
38 var m, set, checkSet, extra, ret, cur, pop, i, |
|
39 prune = true, |
|
40 contextXML = Sizzle.isXML( context ), |
|
41 parts = [], |
|
42 soFar = selector; |
|
43 |
|
44 // Reset the position of the chunker regexp (start from head) |
|
45 do { |
|
46 chunker.exec( "" ); |
|
47 m = chunker.exec( soFar ); |
|
48 |
|
49 if ( m ) { |
|
50 soFar = m[3]; |
|
51 |
|
52 parts.push( m[1] ); |
|
53 |
|
54 if ( m[2] ) { |
|
55 extra = m[3]; |
|
56 break; |
|
57 } |
|
58 } |
|
59 } while ( m ); |
|
60 |
|
61 if ( parts.length > 1 && origPOS.exec( selector ) ) { |
|
62 |
|
63 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { |
|
64 set = posProcess( parts[0] + parts[1], context ); |
|
65 |
|
66 } else { |
|
67 set = Expr.relative[ parts[0] ] ? |
|
68 [ context ] : |
|
69 Sizzle( parts.shift(), context ); |
|
70 |
|
71 while ( parts.length ) { |
|
72 selector = parts.shift(); |
|
73 |
|
74 if ( Expr.relative[ selector ] ) { |
|
75 selector += parts.shift(); |
|
76 } |
|
77 |
|
78 set = posProcess( selector, set ); |
|
79 } |
|
80 } |
|
81 |
|
82 } else { |
|
83 // Take a shortcut and set the context if the root selector is an ID |
|
84 // (but not if it'll be faster if the inner selector is an ID) |
|
85 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && |
|
86 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { |
|
87 |
|
88 ret = Sizzle.find( parts.shift(), context, contextXML ); |
|
89 context = ret.expr ? |
|
90 Sizzle.filter( ret.expr, ret.set )[0] : |
|
91 ret.set[0]; |
|
92 } |
|
93 |
|
94 if ( context ) { |
|
95 ret = seed ? |
|
96 { expr: parts.pop(), set: makeArray(seed) } : |
|
97 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); |
|
98 |
|
99 set = ret.expr ? |
|
100 Sizzle.filter( ret.expr, ret.set ) : |
|
101 ret.set; |
|
102 |
|
103 if ( parts.length > 0 ) { |
|
104 checkSet = makeArray( set ); |
|
105 |
|
106 } else { |
|
107 prune = false; |
|
108 } |
|
109 |
|
110 while ( parts.length ) { |
|
111 cur = parts.pop(); |
|
112 pop = cur; |
|
113 |
|
114 if ( !Expr.relative[ cur ] ) { |
|
115 cur = ""; |
|
116 } else { |
|
117 pop = parts.pop(); |
|
118 } |
|
119 |
|
120 if ( pop == null ) { |
|
121 pop = context; |
|
122 } |
|
123 |
|
124 Expr.relative[ cur ]( checkSet, pop, contextXML ); |
|
125 } |
|
126 |
|
127 } else { |
|
128 checkSet = parts = []; |
|
129 } |
|
130 } |
|
131 |
|
132 if ( !checkSet ) { |
|
133 checkSet = set; |
|
134 } |
|
135 |
|
136 if ( !checkSet ) { |
|
137 Sizzle.error( cur || selector ); |
|
138 } |
|
139 |
|
140 if ( toString.call(checkSet) === "[object Array]" ) { |
|
141 if ( !prune ) { |
|
142 results.push.apply( results, checkSet ); |
|
143 |
|
144 } else if ( context && context.nodeType === 1 ) { |
|
145 for ( i = 0; checkSet[i] != null; i++ ) { |
|
146 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { |
|
147 results.push( set[i] ); |
|
148 } |
|
149 } |
|
150 |
|
151 } else { |
|
152 for ( i = 0; checkSet[i] != null; i++ ) { |
|
153 if ( checkSet[i] && checkSet[i].nodeType === 1 ) { |
|
154 results.push( set[i] ); |
|
155 } |
|
156 } |
|
157 } |
|
158 |
|
159 } else { |
|
160 makeArray( checkSet, results ); |
|
161 } |
|
162 |
|
163 if ( extra ) { |
|
164 Sizzle( extra, origContext, results, seed ); |
|
165 Sizzle.uniqueSort( results ); |
|
166 } |
|
167 |
|
168 return results; |
|
169 }; |
|
170 |
|
171 Sizzle.uniqueSort = function( results ) { |
|
172 if ( sortOrder ) { |
|
173 hasDuplicate = baseHasDuplicate; |
|
174 results.sort( sortOrder ); |
|
175 |
|
176 if ( hasDuplicate ) { |
|
177 for ( var i = 1; i < results.length; i++ ) { |
|
178 if ( results[i] === results[ i - 1 ] ) { |
|
179 results.splice( i--, 1 ); |
|
180 } |
|
181 } |
|
182 } |
|
183 } |
|
184 |
|
185 return results; |
|
186 }; |
|
187 |
|
188 Sizzle.matches = function( expr, set ) { |
|
189 return Sizzle( expr, null, null, set ); |
|
190 }; |
|
191 |
|
192 Sizzle.matchesSelector = function( node, expr ) { |
|
193 return Sizzle( expr, null, null, [node] ).length > 0; |
|
194 }; |
|
195 |
|
196 Sizzle.find = function( expr, context, isXML ) { |
|
197 var set; |
|
198 |
|
199 if ( !expr ) { |
|
200 return []; |
|
201 } |
|
202 |
|
203 for ( var i = 0, l = Expr.order.length; i < l; i++ ) { |
|
204 var match, |
|
205 type = Expr.order[i]; |
|
206 |
|
207 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { |
|
208 var left = match[1]; |
|
209 match.splice( 1, 1 ); |
|
210 |
|
211 if ( left.substr( left.length - 1 ) !== "\\" ) { |
|
212 match[1] = (match[1] || "").replace(/\\/g, ""); |
|
213 set = Expr.find[ type ]( match, context, isXML ); |
|
214 |
|
215 if ( set != null ) { |
|
216 expr = expr.replace( Expr.match[ type ], "" ); |
|
217 break; |
|
218 } |
|
219 } |
|
220 } |
|
221 } |
|
222 |
|
223 if ( !set ) { |
|
224 set = typeof context.getElementsByTagName !== "undefined" ? |
|
225 context.getElementsByTagName( "*" ) : |
|
226 []; |
|
227 } |
|
228 |
|
229 return { set: set, expr: expr }; |
|
230 }; |
|
231 |
|
232 Sizzle.filter = function( expr, set, inplace, not ) { |
|
233 var match, anyFound, |
|
234 old = expr, |
|
235 result = [], |
|
236 curLoop = set, |
|
237 isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); |
|
238 |
|
239 while ( expr && set.length ) { |
|
240 for ( var type in Expr.filter ) { |
|
241 if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { |
|
242 var found, item, |
|
243 filter = Expr.filter[ type ], |
|
244 left = match[1]; |
|
245 |
|
246 anyFound = false; |
|
247 |
|
248 match.splice(1,1); |
|
249 |
|
250 if ( left.substr( left.length - 1 ) === "\\" ) { |
|
251 continue; |
|
252 } |
|
253 |
|
254 if ( curLoop === result ) { |
|
255 result = []; |
|
256 } |
|
257 |
|
258 if ( Expr.preFilter[ type ] ) { |
|
259 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); |
|
260 |
|
261 if ( !match ) { |
|
262 anyFound = found = true; |
|
263 |
|
264 } else if ( match === true ) { |
|
265 continue; |
|
266 } |
|
267 } |
|
268 |
|
269 if ( match ) { |
|
270 for ( var i = 0; (item = curLoop[i]) != null; i++ ) { |
|
271 if ( item ) { |
|
272 found = filter( item, match, i, curLoop ); |
|
273 var pass = not ^ !!found; |
|
274 |
|
275 if ( inplace && found != null ) { |
|
276 if ( pass ) { |
|
277 anyFound = true; |
|
278 |
|
279 } else { |
|
280 curLoop[i] = false; |
|
281 } |
|
282 |
|
283 } else if ( pass ) { |
|
284 result.push( item ); |
|
285 anyFound = true; |
|
286 } |
|
287 } |
|
288 } |
|
289 } |
|
290 |
|
291 if ( found !== undefined ) { |
|
292 if ( !inplace ) { |
|
293 curLoop = result; |
|
294 } |
|
295 |
|
296 expr = expr.replace( Expr.match[ type ], "" ); |
|
297 |
|
298 if ( !anyFound ) { |
|
299 return []; |
|
300 } |
|
301 |
|
302 break; |
|
303 } |
|
304 } |
|
305 } |
|
306 |
|
307 // Improper expression |
|
308 if ( expr === old ) { |
|
309 if ( anyFound == null ) { |
|
310 Sizzle.error( expr ); |
|
311 |
|
312 } else { |
|
313 break; |
|
314 } |
|
315 } |
|
316 |
|
317 old = expr; |
|
318 } |
|
319 |
|
320 return curLoop; |
|
321 }; |
|
322 |
|
323 Sizzle.error = function( msg ) { |
|
324 throw "Syntax error, unrecognized expression: " + msg; |
|
325 }; |
|
326 |
|
327 var Expr = Sizzle.selectors = { |
|
328 order: [ "ID", "NAME", "TAG" ], |
|
329 |
|
330 match: { |
|
331 ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, |
|
332 CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, |
|
333 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, |
|
334 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, |
|
335 TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, |
|
336 CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, |
|
337 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, |
|
338 PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ |
|
339 }, |
|
340 |
|
341 leftMatch: {}, |
|
342 |
|
343 attrMap: { |
|
344 "class": "className", |
|
345 "for": "htmlFor" |
|
346 }, |
|
347 |
|
348 attrHandle: { |
|
349 href: function( elem ) { |
|
350 return elem.getAttribute( "href" ); |
|
351 } |
|
352 }, |
|
353 |
|
354 relative: { |
|
355 "+": function(checkSet, part){ |
|
356 var isPartStr = typeof part === "string", |
|
357 isTag = isPartStr && !/\W/.test( part ), |
|
358 isPartStrNotTag = isPartStr && !isTag; |
|
359 |
|
360 if ( isTag ) { |
|
361 part = part.toLowerCase(); |
|
362 } |
|
363 |
|
364 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { |
|
365 if ( (elem = checkSet[i]) ) { |
|
366 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} |
|
367 |
|
368 checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? |
|
369 elem || false : |
|
370 elem === part; |
|
371 } |
|
372 } |
|
373 |
|
374 if ( isPartStrNotTag ) { |
|
375 Sizzle.filter( part, checkSet, true ); |
|
376 } |
|
377 }, |
|
378 |
|
379 ">": function( checkSet, part ) { |
|
380 var elem, |
|
381 isPartStr = typeof part === "string", |
|
382 i = 0, |
|
383 l = checkSet.length; |
|
384 |
|
385 if ( isPartStr && !/\W/.test( part ) ) { |
|
386 part = part.toLowerCase(); |
|
387 |
|
388 for ( ; i < l; i++ ) { |
|
389 elem = checkSet[i]; |
|
390 |
|
391 if ( elem ) { |
|
392 var parent = elem.parentNode; |
|
393 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; |
|
394 } |
|
395 } |
|
396 |
|
397 } else { |
|
398 for ( ; i < l; i++ ) { |
|
399 elem = checkSet[i]; |
|
400 |
|
401 if ( elem ) { |
|
402 checkSet[i] = isPartStr ? |
|
403 elem.parentNode : |
|
404 elem.parentNode === part; |
|
405 } |
|
406 } |
|
407 |
|
408 if ( isPartStr ) { |
|
409 Sizzle.filter( part, checkSet, true ); |
|
410 } |
|
411 } |
|
412 }, |
|
413 |
|
414 "": function(checkSet, part, isXML){ |
|
415 var nodeCheck, |
|
416 doneName = done++, |
|
417 checkFn = dirCheck; |
|
418 |
|
419 if ( typeof part === "string" && !/\W/.test(part) ) { |
|
420 part = part.toLowerCase(); |
|
421 nodeCheck = part; |
|
422 checkFn = dirNodeCheck; |
|
423 } |
|
424 |
|
425 checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); |
|
426 }, |
|
427 |
|
428 "~": function( checkSet, part, isXML ) { |
|
429 var nodeCheck, |
|
430 doneName = done++, |
|
431 checkFn = dirCheck; |
|
432 |
|
433 if ( typeof part === "string" && !/\W/.test( part ) ) { |
|
434 part = part.toLowerCase(); |
|
435 nodeCheck = part; |
|
436 checkFn = dirNodeCheck; |
|
437 } |
|
438 |
|
439 checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); |
|
440 } |
|
441 }, |
|
442 |
|
443 find: { |
|
444 ID: function( match, context, isXML ) { |
|
445 if ( typeof context.getElementById !== "undefined" && !isXML ) { |
|
446 var m = context.getElementById(match[1]); |
|
447 // Check parentNode to catch when Blackberry 4.6 returns |
|
448 // nodes that are no longer in the document #6963 |
|
449 return m && m.parentNode ? [m] : []; |
|
450 } |
|
451 }, |
|
452 |
|
453 NAME: function( match, context ) { |
|
454 if ( typeof context.getElementsByName !== "undefined" ) { |
|
455 var ret = [], |
|
456 results = context.getElementsByName( match[1] ); |
|
457 |
|
458 for ( var i = 0, l = results.length; i < l; i++ ) { |
|
459 if ( results[i].getAttribute("name") === match[1] ) { |
|
460 ret.push( results[i] ); |
|
461 } |
|
462 } |
|
463 |
|
464 return ret.length === 0 ? null : ret; |
|
465 } |
|
466 }, |
|
467 |
|
468 TAG: function( match, context ) { |
|
469 if ( typeof context.getElementsByTagName !== "undefined" ) { |
|
470 return context.getElementsByTagName( match[1] ); |
|
471 } |
|
472 } |
|
473 }, |
|
474 preFilter: { |
|
475 CLASS: function( match, curLoop, inplace, result, not, isXML ) { |
|
476 match = " " + match[1].replace(/\\/g, "") + " "; |
|
477 |
|
478 if ( isXML ) { |
|
479 return match; |
|
480 } |
|
481 |
|
482 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { |
|
483 if ( elem ) { |
|
484 if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { |
|
485 if ( !inplace ) { |
|
486 result.push( elem ); |
|
487 } |
|
488 |
|
489 } else if ( inplace ) { |
|
490 curLoop[i] = false; |
|
491 } |
|
492 } |
|
493 } |
|
494 |
|
495 return false; |
|
496 }, |
|
497 |
|
498 ID: function( match ) { |
|
499 return match[1].replace(/\\/g, ""); |
|
500 }, |
|
501 |
|
502 TAG: function( match, curLoop ) { |
|
503 return match[1].toLowerCase(); |
|
504 }, |
|
505 |
|
506 CHILD: function( match ) { |
|
507 if ( match[1] === "nth" ) { |
|
508 if ( !match[2] ) { |
|
509 Sizzle.error( match[0] ); |
|
510 } |
|
511 |
|
512 match[2] = match[2].replace(/^\+|\s*/g, ''); |
|
513 |
|
514 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' |
|
515 var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( |
|
516 match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || |
|
517 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); |
|
518 |
|
519 // calculate the numbers (first)n+(last) including if they are negative |
|
520 match[2] = (test[1] + (test[2] || 1)) - 0; |
|
521 match[3] = test[3] - 0; |
|
522 } |
|
523 else if ( match[2] ) { |
|
524 Sizzle.error( match[0] ); |
|
525 } |
|
526 |
|
527 // TODO: Move to normal caching system |
|
528 match[0] = done++; |
|
529 |
|
530 return match; |
|
531 }, |
|
532 |
|
533 ATTR: function( match, curLoop, inplace, result, not, isXML ) { |
|
534 var name = match[1] = match[1].replace(/\\/g, ""); |
|
535 |
|
536 if ( !isXML && Expr.attrMap[name] ) { |
|
537 match[1] = Expr.attrMap[name]; |
|
538 } |
|
539 |
|
540 // Handle if an un-quoted value was used |
|
541 match[4] = ( match[4] || match[5] || "" ).replace(/\\/g, ""); |
|
542 |
|
543 if ( match[2] === "~=" ) { |
|
544 match[4] = " " + match[4] + " "; |
|
545 } |
|
546 |
|
547 return match; |
|
548 }, |
|
549 |
|
550 PSEUDO: function( match, curLoop, inplace, result, not ) { |
|
551 if ( match[1] === "not" ) { |
|
552 // If we're dealing with a complex expression, or a simple one |
|
553 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { |
|
554 match[3] = Sizzle(match[3], null, null, curLoop); |
|
555 |
|
556 } else { |
|
557 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); |
|
558 |
|
559 if ( !inplace ) { |
|
560 result.push.apply( result, ret ); |
|
561 } |
|
562 |
|
563 return false; |
|
564 } |
|
565 |
|
566 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { |
|
567 return true; |
|
568 } |
|
569 |
|
570 return match; |
|
571 }, |
|
572 |
|
573 POS: function( match ) { |
|
574 match.unshift( true ); |
|
575 |
|
576 return match; |
|
577 } |
|
578 }, |
|
579 |
|
580 filters: { |
|
581 enabled: function( elem ) { |
|
582 return elem.disabled === false && elem.type !== "hidden"; |
|
583 }, |
|
584 |
|
585 disabled: function( elem ) { |
|
586 return elem.disabled === true; |
|
587 }, |
|
588 |
|
589 checked: function( elem ) { |
|
590 return elem.checked === true; |
|
591 }, |
|
592 |
|
593 selected: function( elem ) { |
|
594 // Accessing this property makes selected-by-default |
|
595 // options in Safari work properly |
|
596 elem.parentNode.selectedIndex; |
|
597 |
|
598 return elem.selected === true; |
|
599 }, |
|
600 |
|
601 parent: function( elem ) { |
|
602 return !!elem.firstChild; |
|
603 }, |
|
604 |
|
605 empty: function( elem ) { |
|
606 return !elem.firstChild; |
|
607 }, |
|
608 |
|
609 has: function( elem, i, match ) { |
|
610 return !!Sizzle( match[3], elem ).length; |
|
611 }, |
|
612 |
|
613 header: function( elem ) { |
|
614 return (/h\d/i).test( elem.nodeName ); |
|
615 }, |
|
616 |
|
617 text: function( elem ) { |
|
618 return "text" === elem.type; |
|
619 }, |
|
620 radio: function( elem ) { |
|
621 return "radio" === elem.type; |
|
622 }, |
|
623 |
|
624 checkbox: function( elem ) { |
|
625 return "checkbox" === elem.type; |
|
626 }, |
|
627 |
|
628 file: function( elem ) { |
|
629 return "file" === elem.type; |
|
630 }, |
|
631 password: function( elem ) { |
|
632 return "password" === elem.type; |
|
633 }, |
|
634 |
|
635 submit: function( elem ) { |
|
636 return "submit" === elem.type; |
|
637 }, |
|
638 |
|
639 image: function( elem ) { |
|
640 return "image" === elem.type; |
|
641 }, |
|
642 |
|
643 reset: function( elem ) { |
|
644 return "reset" === elem.type; |
|
645 }, |
|
646 |
|
647 button: function( elem ) { |
|
648 return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; |
|
649 }, |
|
650 |
|
651 input: function( elem ) { |
|
652 return (/input|select|textarea|button/i).test( elem.nodeName ); |
|
653 } |
|
654 }, |
|
655 setFilters: { |
|
656 first: function( elem, i ) { |
|
657 return i === 0; |
|
658 }, |
|
659 |
|
660 last: function( elem, i, match, array ) { |
|
661 return i === array.length - 1; |
|
662 }, |
|
663 |
|
664 even: function( elem, i ) { |
|
665 return i % 2 === 0; |
|
666 }, |
|
667 |
|
668 odd: function( elem, i ) { |
|
669 return i % 2 === 1; |
|
670 }, |
|
671 |
|
672 lt: function( elem, i, match ) { |
|
673 return i < match[3] - 0; |
|
674 }, |
|
675 |
|
676 gt: function( elem, i, match ) { |
|
677 return i > match[3] - 0; |
|
678 }, |
|
679 |
|
680 nth: function( elem, i, match ) { |
|
681 return match[3] - 0 === i; |
|
682 }, |
|
683 |
|
684 eq: function( elem, i, match ) { |
|
685 return match[3] - 0 === i; |
|
686 } |
|
687 }, |
|
688 filter: { |
|
689 PSEUDO: function( elem, match, i, array ) { |
|
690 var name = match[1], |
|
691 filter = Expr.filters[ name ]; |
|
692 |
|
693 if ( filter ) { |
|
694 return filter( elem, i, match, array ); |
|
695 |
|
696 } else if ( name === "contains" ) { |
|
697 return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; |
|
698 |
|
699 } else if ( name === "not" ) { |
|
700 var not = match[3]; |
|
701 |
|
702 for ( var j = 0, l = not.length; j < l; j++ ) { |
|
703 if ( not[j] === elem ) { |
|
704 return false; |
|
705 } |
|
706 } |
|
707 |
|
708 return true; |
|
709 |
|
710 } else { |
|
711 Sizzle.error( name ); |
|
712 } |
|
713 }, |
|
714 |
|
715 CHILD: function( elem, match ) { |
|
716 var type = match[1], |
|
717 node = elem; |
|
718 |
|
719 switch ( type ) { |
|
720 case "only": |
|
721 case "first": |
|
722 while ( (node = node.previousSibling) ) { |
|
723 if ( node.nodeType === 1 ) { |
|
724 return false; |
|
725 } |
|
726 } |
|
727 |
|
728 if ( type === "first" ) { |
|
729 return true; |
|
730 } |
|
731 |
|
732 node = elem; |
|
733 |
|
734 case "last": |
|
735 while ( (node = node.nextSibling) ) { |
|
736 if ( node.nodeType === 1 ) { |
|
737 return false; |
|
738 } |
|
739 } |
|
740 |
|
741 return true; |
|
742 |
|
743 case "nth": |
|
744 var first = match[2], |
|
745 last = match[3]; |
|
746 |
|
747 if ( first === 1 && last === 0 ) { |
|
748 return true; |
|
749 } |
|
750 |
|
751 var doneName = match[0], |
|
752 parent = elem.parentNode; |
|
753 |
|
754 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { |
|
755 var count = 0; |
|
756 |
|
757 for ( node = parent.firstChild; node; node = node.nextSibling ) { |
|
758 if ( node.nodeType === 1 ) { |
|
759 node.nodeIndex = ++count; |
|
760 } |
|
761 } |
|
762 |
|
763 parent.sizcache = doneName; |
|
764 } |
|
765 |
|
766 var diff = elem.nodeIndex - last; |
|
767 |
|
768 if ( first === 0 ) { |
|
769 return diff === 0; |
|
770 |
|
771 } else { |
|
772 return ( diff % first === 0 && diff / first >= 0 ); |
|
773 } |
|
774 } |
|
775 }, |
|
776 |
|
777 ID: function( elem, match ) { |
|
778 return elem.nodeType === 1 && elem.getAttribute("id") === match; |
|
779 }, |
|
780 |
|
781 TAG: function( elem, match ) { |
|
782 return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; |
|
783 }, |
|
784 |
|
785 CLASS: function( elem, match ) { |
|
786 return (" " + (elem.className || elem.getAttribute("class")) + " ") |
|
787 .indexOf( match ) > -1; |
|
788 }, |
|
789 |
|
790 ATTR: function( elem, match ) { |
|
791 var name = match[1], |
|
792 result = Expr.attrHandle[ name ] ? |
|
793 Expr.attrHandle[ name ]( elem ) : |
|
794 elem[ name ] != null ? |
|
795 elem[ name ] : |
|
796 elem.getAttribute( name ), |
|
797 value = result + "", |
|
798 type = match[2], |
|
799 check = match[4]; |
|
800 |
|
801 return result == null ? |
|
802 type === "!=" : |
|
803 type === "=" ? |
|
804 value === check : |
|
805 type === "*=" ? |
|
806 value.indexOf(check) >= 0 : |
|
807 type === "~=" ? |
|
808 (" " + value + " ").indexOf(check) >= 0 : |
|
809 !check ? |
|
810 value && result !== false : |
|
811 type === "!=" ? |
|
812 value !== check : |
|
813 type === "^=" ? |
|
814 value.indexOf(check) === 0 : |
|
815 type === "$=" ? |
|
816 value.substr(value.length - check.length) === check : |
|
817 type === "|=" ? |
|
818 value === check || value.substr(0, check.length + 1) === check + "-" : |
|
819 false; |
|
820 }, |
|
821 |
|
822 POS: function( elem, match, i, array ) { |
|
823 var name = match[2], |
|
824 filter = Expr.setFilters[ name ]; |
|
825 |
|
826 if ( filter ) { |
|
827 return filter( elem, i, match, array ); |
|
828 } |
|
829 } |
|
830 } |
|
831 }; |
|
832 |
|
833 var origPOS = Expr.match.POS, |
|
834 fescape = function(all, num){ |
|
835 return "\\" + (num - 0 + 1); |
|
836 }; |
|
837 |
|
838 for ( var type in Expr.match ) { |
|
839 Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); |
|
840 Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); |
|
841 } |
|
842 |
|
843 var makeArray = function( array, results ) { |
|
844 array = Array.prototype.slice.call( array, 0 ); |
|
845 |
|
846 if ( results ) { |
|
847 results.push.apply( results, array ); |
|
848 return results; |
|
849 } |
|
850 |
|
851 return array; |
|
852 }; |
|
853 |
|
854 // Perform a simple check to determine if the browser is capable of |
|
855 // converting a NodeList to an array using builtin methods. |
|
856 // Also verifies that the returned array holds DOM nodes |
|
857 // (which is not the case in the Blackberry browser) |
|
858 try { |
|
859 Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; |
|
860 |
|
861 // Provide a fallback method if it does not work |
|
862 } catch( e ) { |
|
863 makeArray = function( array, results ) { |
|
864 var i = 0, |
|
865 ret = results || []; |
|
866 |
|
867 if ( toString.call(array) === "[object Array]" ) { |
|
868 Array.prototype.push.apply( ret, array ); |
|
869 |
|
870 } else { |
|
871 if ( typeof array.length === "number" ) { |
|
872 for ( var l = array.length; i < l; i++ ) { |
|
873 ret.push( array[i] ); |
|
874 } |
|
875 |
|
876 } else { |
|
877 for ( ; array[i]; i++ ) { |
|
878 ret.push( array[i] ); |
|
879 } |
|
880 } |
|
881 } |
|
882 |
|
883 return ret; |
|
884 }; |
|
885 } |
|
886 |
|
887 var sortOrder, siblingCheck; |
|
888 |
|
889 if ( document.documentElement.compareDocumentPosition ) { |
|
890 sortOrder = function( a, b ) { |
|
891 if ( a === b ) { |
|
892 hasDuplicate = true; |
|
893 return 0; |
|
894 } |
|
895 |
|
896 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { |
|
897 return a.compareDocumentPosition ? -1 : 1; |
|
898 } |
|
899 |
|
900 return a.compareDocumentPosition(b) & 4 ? -1 : 1; |
|
901 }; |
|
902 |
|
903 } else { |
|
904 sortOrder = function( a, b ) { |
|
905 var al, bl, |
|
906 ap = [], |
|
907 bp = [], |
|
908 aup = a.parentNode, |
|
909 bup = b.parentNode, |
|
910 cur = aup; |
|
911 |
|
912 // The nodes are identical, we can exit early |
|
913 if ( a === b ) { |
|
914 hasDuplicate = true; |
|
915 return 0; |
|
916 |
|
917 // If the nodes are siblings (or identical) we can do a quick check |
|
918 } else if ( aup === bup ) { |
|
919 return siblingCheck( a, b ); |
|
920 |
|
921 // If no parents were found then the nodes are disconnected |
|
922 } else if ( !aup ) { |
|
923 return -1; |
|
924 |
|
925 } else if ( !bup ) { |
|
926 return 1; |
|
927 } |
|
928 |
|
929 // Otherwise they're somewhere else in the tree so we need |
|
930 // to build up a full list of the parentNodes for comparison |
|
931 while ( cur ) { |
|
932 ap.unshift( cur ); |
|
933 cur = cur.parentNode; |
|
934 } |
|
935 |
|
936 cur = bup; |
|
937 |
|
938 while ( cur ) { |
|
939 bp.unshift( cur ); |
|
940 cur = cur.parentNode; |
|
941 } |
|
942 |
|
943 al = ap.length; |
|
944 bl = bp.length; |
|
945 |
|
946 // Start walking down the tree looking for a discrepancy |
|
947 for ( var i = 0; i < al && i < bl; i++ ) { |
|
948 if ( ap[i] !== bp[i] ) { |
|
949 return siblingCheck( ap[i], bp[i] ); |
|
950 } |
|
951 } |
|
952 |
|
953 // We ended someplace up the tree so do a sibling check |
|
954 return i === al ? |
|
955 siblingCheck( a, bp[i], -1 ) : |
|
956 siblingCheck( ap[i], b, 1 ); |
|
957 }; |
|
958 |
|
959 siblingCheck = function( a, b, ret ) { |
|
960 if ( a === b ) { |
|
961 return ret; |
|
962 } |
|
963 |
|
964 var cur = a.nextSibling; |
|
965 |
|
966 while ( cur ) { |
|
967 if ( cur === b ) { |
|
968 return -1; |
|
969 } |
|
970 |
|
971 cur = cur.nextSibling; |
|
972 } |
|
973 |
|
974 return 1; |
|
975 }; |
|
976 } |
|
977 |
|
978 // Utility function for retreiving the text value of an array of DOM nodes |
|
979 Sizzle.getText = function( elems ) { |
|
980 var ret = "", elem; |
|
981 |
|
982 for ( var i = 0; elems[i]; i++ ) { |
|
983 elem = elems[i]; |
|
984 |
|
985 // Get the text from text nodes and CDATA nodes |
|
986 if ( elem.nodeType === 3 || elem.nodeType === 4 ) { |
|
987 ret += elem.nodeValue; |
|
988 |
|
989 // Traverse everything else, except comment nodes |
|
990 } else if ( elem.nodeType !== 8 ) { |
|
991 ret += Sizzle.getText( elem.childNodes ); |
|
992 } |
|
993 } |
|
994 |
|
995 return ret; |
|
996 }; |
|
997 |
|
998 // Check to see if the browser returns elements by name when |
|
999 // querying by getElementById (and provide a workaround) |
|
1000 (function(){ |
|
1001 // We're going to inject a fake input element with a specified name |
|
1002 var form = document.createElement("div"), |
|
1003 id = "script" + (new Date()).getTime(), |
|
1004 root = document.documentElement; |
|
1005 |
|
1006 form.innerHTML = "<a name='" + id + "'/>"; |
|
1007 |
|
1008 // Inject it into the root element, check its status, and remove it quickly |
|
1009 root.insertBefore( form, root.firstChild ); |
|
1010 |
|
1011 // The workaround has to do additional checks after a getElementById |
|
1012 // Which slows things down for other browsers (hence the branching) |
|
1013 if ( document.getElementById( id ) ) { |
|
1014 Expr.find.ID = function( match, context, isXML ) { |
|
1015 if ( typeof context.getElementById !== "undefined" && !isXML ) { |
|
1016 var m = context.getElementById(match[1]); |
|
1017 |
|
1018 return m ? |
|
1019 m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? |
|
1020 [m] : |
|
1021 undefined : |
|
1022 []; |
|
1023 } |
|
1024 }; |
|
1025 |
|
1026 Expr.filter.ID = function( elem, match ) { |
|
1027 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); |
|
1028 |
|
1029 return elem.nodeType === 1 && node && node.nodeValue === match; |
|
1030 }; |
|
1031 } |
|
1032 |
|
1033 root.removeChild( form ); |
|
1034 |
|
1035 // release memory in IE |
|
1036 root = form = null; |
|
1037 })(); |
|
1038 |
|
1039 (function(){ |
|
1040 // Check to see if the browser returns only elements |
|
1041 // when doing getElementsByTagName("*") |
|
1042 |
|
1043 // Create a fake element |
|
1044 var div = document.createElement("div"); |
|
1045 div.appendChild( document.createComment("") ); |
|
1046 |
|
1047 // Make sure no comments are found |
|
1048 if ( div.getElementsByTagName("*").length > 0 ) { |
|
1049 Expr.find.TAG = function( match, context ) { |
|
1050 var results = context.getElementsByTagName( match[1] ); |
|
1051 |
|
1052 // Filter out possible comments |
|
1053 if ( match[1] === "*" ) { |
|
1054 var tmp = []; |
|
1055 |
|
1056 for ( var i = 0; results[i]; i++ ) { |
|
1057 if ( results[i].nodeType === 1 ) { |
|
1058 tmp.push( results[i] ); |
|
1059 } |
|
1060 } |
|
1061 |
|
1062 results = tmp; |
|
1063 } |
|
1064 |
|
1065 return results; |
|
1066 }; |
|
1067 } |
|
1068 |
|
1069 // Check to see if an attribute returns normalized href attributes |
|
1070 div.innerHTML = "<a href='#'></a>"; |
|
1071 |
|
1072 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && |
|
1073 div.firstChild.getAttribute("href") !== "#" ) { |
|
1074 |
|
1075 Expr.attrHandle.href = function( elem ) { |
|
1076 return elem.getAttribute( "href", 2 ); |
|
1077 }; |
|
1078 } |
|
1079 |
|
1080 // release memory in IE |
|
1081 div = null; |
|
1082 })(); |
|
1083 |
|
1084 if ( document.querySelectorAll ) { |
|
1085 (function(){ |
|
1086 var oldSizzle = Sizzle, |
|
1087 div = document.createElement("div"), |
|
1088 id = "__sizzle__"; |
|
1089 |
|
1090 div.innerHTML = "<p class='TEST'></p>"; |
|
1091 |
|
1092 // Safari can't handle uppercase or unicode characters when |
|
1093 // in quirks mode. |
|
1094 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { |
|
1095 return; |
|
1096 } |
|
1097 |
|
1098 Sizzle = function( query, context, extra, seed ) { |
|
1099 context = context || document; |
|
1100 |
|
1101 // Only use querySelectorAll on non-XML documents |
|
1102 // (ID selectors don't work in non-HTML documents) |
|
1103 if ( !seed && !Sizzle.isXML(context) ) { |
|
1104 // See if we find a selector to speed up |
|
1105 var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); |
|
1106 |
|
1107 if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { |
|
1108 // Speed-up: Sizzle("TAG") |
|
1109 if ( match[1] ) { |
|
1110 return makeArray( context.getElementsByTagName( query ), extra ); |
|
1111 |
|
1112 // Speed-up: Sizzle(".CLASS") |
|
1113 } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { |
|
1114 return makeArray( context.getElementsByClassName( match[2] ), extra ); |
|
1115 } |
|
1116 } |
|
1117 |
|
1118 if ( context.nodeType === 9 ) { |
|
1119 // Speed-up: Sizzle("body") |
|
1120 // The body element only exists once, optimize finding it |
|
1121 if ( query === "body" && context.body ) { |
|
1122 return makeArray( [ context.body ], extra ); |
|
1123 |
|
1124 // Speed-up: Sizzle("#ID") |
|
1125 } else if ( match && match[3] ) { |
|
1126 var elem = context.getElementById( match[3] ); |
|
1127 |
|
1128 // Check parentNode to catch when Blackberry 4.6 returns |
|
1129 // nodes that are no longer in the document #6963 |
|
1130 if ( elem && elem.parentNode ) { |
|
1131 // Handle the case where IE and Opera return items |
|
1132 // by name instead of ID |
|
1133 if ( elem.id === match[3] ) { |
|
1134 return makeArray( [ elem ], extra ); |
|
1135 } |
|
1136 |
|
1137 } else { |
|
1138 return makeArray( [], extra ); |
|
1139 } |
|
1140 } |
|
1141 |
|
1142 try { |
|
1143 return makeArray( context.querySelectorAll(query), extra ); |
|
1144 } catch(qsaError) {} |
|
1145 |
|
1146 // qSA works strangely on Element-rooted queries |
|
1147 // We can work around this by specifying an extra ID on the root |
|
1148 // and working up from there (Thanks to Andrew Dupont for the technique) |
|
1149 // IE 8 doesn't work on object elements |
|
1150 } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { |
|
1151 var old = context.getAttribute( "id" ), |
|
1152 nid = old || id, |
|
1153 hasParent = context.parentNode, |
|
1154 relativeHierarchySelector = /^\s*[+~]/.test( query ); |
|
1155 |
|
1156 if ( !old ) { |
|
1157 context.setAttribute( "id", nid ); |
|
1158 } else { |
|
1159 nid = nid.replace( /'/g, "\\$&" ); |
|
1160 } |
|
1161 if ( relativeHierarchySelector && hasParent ) { |
|
1162 context = context.parentNode; |
|
1163 } |
|
1164 |
|
1165 try { |
|
1166 if ( !relativeHierarchySelector || hasParent ) { |
|
1167 return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); |
|
1168 } |
|
1169 |
|
1170 } catch(pseudoError) { |
|
1171 } finally { |
|
1172 if ( !old ) { |
|
1173 context.removeAttribute( "id" ); |
|
1174 } |
|
1175 } |
|
1176 } |
|
1177 } |
|
1178 |
|
1179 return oldSizzle(query, context, extra, seed); |
|
1180 }; |
|
1181 |
|
1182 for ( var prop in oldSizzle ) { |
|
1183 Sizzle[ prop ] = oldSizzle[ prop ]; |
|
1184 } |
|
1185 |
|
1186 // release memory in IE |
|
1187 div = null; |
|
1188 })(); |
|
1189 } |
|
1190 |
|
1191 (function(){ |
|
1192 var html = document.documentElement, |
|
1193 matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, |
|
1194 pseudoWorks = false; |
|
1195 |
|
1196 try { |
|
1197 // This should fail with an exception |
|
1198 // Gecko does not error, returns false instead |
|
1199 matches.call( document.documentElement, "[test!='']:sizzle" ); |
|
1200 |
|
1201 } catch( pseudoError ) { |
|
1202 pseudoWorks = true; |
|
1203 } |
|
1204 |
|
1205 if ( matches ) { |
|
1206 Sizzle.matchesSelector = function( node, expr ) { |
|
1207 // Make sure that attribute selectors are quoted |
|
1208 expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); |
|
1209 |
|
1210 if ( !Sizzle.isXML( node ) ) { |
|
1211 try { |
|
1212 if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { |
|
1213 return matches.call( node, expr ); |
|
1214 } |
|
1215 } catch(e) {} |
|
1216 } |
|
1217 |
|
1218 return Sizzle(expr, null, null, [node]).length > 0; |
|
1219 }; |
|
1220 } |
|
1221 })(); |
|
1222 |
|
1223 (function(){ |
|
1224 var div = document.createElement("div"); |
|
1225 |
|
1226 div.innerHTML = "<div class='test e'></div><div class='test'></div>"; |
|
1227 |
|
1228 // Opera can't find a second classname (in 9.6) |
|
1229 // Also, make sure that getElementsByClassName actually exists |
|
1230 if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { |
|
1231 return; |
|
1232 } |
|
1233 |
|
1234 // Safari caches class attributes, doesn't catch changes (in 3.2) |
|
1235 div.lastChild.className = "e"; |
|
1236 |
|
1237 if ( div.getElementsByClassName("e").length === 1 ) { |
|
1238 return; |
|
1239 } |
|
1240 |
|
1241 Expr.order.splice(1, 0, "CLASS"); |
|
1242 Expr.find.CLASS = function( match, context, isXML ) { |
|
1243 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { |
|
1244 return context.getElementsByClassName(match[1]); |
|
1245 } |
|
1246 }; |
|
1247 |
|
1248 // release memory in IE |
|
1249 div = null; |
|
1250 })(); |
|
1251 |
|
1252 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { |
|
1253 for ( var i = 0, l = checkSet.length; i < l; i++ ) { |
|
1254 var elem = checkSet[i]; |
|
1255 |
|
1256 if ( elem ) { |
|
1257 var match = false; |
|
1258 |
|
1259 elem = elem[dir]; |
|
1260 |
|
1261 while ( elem ) { |
|
1262 if ( elem.sizcache === doneName ) { |
|
1263 match = checkSet[elem.sizset]; |
|
1264 break; |
|
1265 } |
|
1266 |
|
1267 if ( elem.nodeType === 1 && !isXML ){ |
|
1268 elem.sizcache = doneName; |
|
1269 elem.sizset = i; |
|
1270 } |
|
1271 |
|
1272 if ( elem.nodeName.toLowerCase() === cur ) { |
|
1273 match = elem; |
|
1274 break; |
|
1275 } |
|
1276 |
|
1277 elem = elem[dir]; |
|
1278 } |
|
1279 |
|
1280 checkSet[i] = match; |
|
1281 } |
|
1282 } |
|
1283 } |
|
1284 |
|
1285 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { |
|
1286 for ( var i = 0, l = checkSet.length; i < l; i++ ) { |
|
1287 var elem = checkSet[i]; |
|
1288 |
|
1289 if ( elem ) { |
|
1290 var match = false; |
|
1291 |
|
1292 elem = elem[dir]; |
|
1293 |
|
1294 while ( elem ) { |
|
1295 if ( elem.sizcache === doneName ) { |
|
1296 match = checkSet[elem.sizset]; |
|
1297 break; |
|
1298 } |
|
1299 |
|
1300 if ( elem.nodeType === 1 ) { |
|
1301 if ( !isXML ) { |
|
1302 elem.sizcache = doneName; |
|
1303 elem.sizset = i; |
|
1304 } |
|
1305 |
|
1306 if ( typeof cur !== "string" ) { |
|
1307 if ( elem === cur ) { |
|
1308 match = true; |
|
1309 break; |
|
1310 } |
|
1311 |
|
1312 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { |
|
1313 match = elem; |
|
1314 break; |
|
1315 } |
|
1316 } |
|
1317 |
|
1318 elem = elem[dir]; |
|
1319 } |
|
1320 |
|
1321 checkSet[i] = match; |
|
1322 } |
|
1323 } |
|
1324 } |
|
1325 |
|
1326 if ( document.documentElement.contains ) { |
|
1327 Sizzle.contains = function( a, b ) { |
|
1328 return a !== b && (a.contains ? a.contains(b) : true); |
|
1329 }; |
|
1330 |
|
1331 } else if ( document.documentElement.compareDocumentPosition ) { |
|
1332 Sizzle.contains = function( a, b ) { |
|
1333 return !!(a.compareDocumentPosition(b) & 16); |
|
1334 }; |
|
1335 |
|
1336 } else { |
|
1337 Sizzle.contains = function() { |
|
1338 return false; |
|
1339 }; |
|
1340 } |
|
1341 |
|
1342 Sizzle.isXML = function( elem ) { |
|
1343 // documentElement is verified for cases where it doesn't yet exist |
|
1344 // (such as loading iframes in IE - #4833) |
|
1345 var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; |
|
1346 |
|
1347 return documentElement ? documentElement.nodeName !== "HTML" : false; |
|
1348 }; |
|
1349 |
|
1350 var posProcess = function( selector, context ) { |
|
1351 var match, |
|
1352 tmpSet = [], |
|
1353 later = "", |
|
1354 root = context.nodeType ? [context] : context; |
|
1355 |
|
1356 // Position selectors must be done after the filter |
|
1357 // And so must :not(positional) so we move all PSEUDOs to the end |
|
1358 while ( (match = Expr.match.PSEUDO.exec( selector )) ) { |
|
1359 later += match[0]; |
|
1360 selector = selector.replace( Expr.match.PSEUDO, "" ); |
|
1361 } |
|
1362 |
|
1363 selector = Expr.relative[selector] ? selector + "*" : selector; |
|
1364 |
|
1365 for ( var i = 0, l = root.length; i < l; i++ ) { |
|
1366 Sizzle( selector, root[i], tmpSet ); |
|
1367 } |
|
1368 |
|
1369 return Sizzle.filter( later, tmpSet ); |
|
1370 }; |
|
1371 |
|
1372 // EXPOSE |
|
1373 |
|
1374 window.Sizzle = Sizzle; |
|
1375 |
|
1376 })(); |