/*! * Sizzle CSS Selector Engine - v0.9 * Copyright 2009, John Resig * Redistributed with the Dojo Toolkit under the terms of the New BSD license. * More information: http://sizzlejs.com/ * * This version from github, dated 1/23/2009, commit: e374a73bbffc12ec3b5f252e7f76e593c508dfa5 * Modified for dojo loader, and to fit into dojo namespace. This was done by passing * dojo object to anonymous function, then assigning Sizzle to dojo.Sizzle instead of window.Sizzle. * Then an alias for dojo.query and dojo._filterQueryResult(). dojo.psuedos is not mapped. * Finally, dojo.provide/require added. */
if ( m[2] ) { extra = RegExp.rightContext; break; } }
if ( parts.length > 1 && Expr.match.POS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { var later = "", match;
// Position selectors must be done after the filter while ( (match = Expr.match.POS.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.POS, "" ); }
Sizzle.find = function(expr, context){ var set, match;
if ( !expr ) { return []; }
for ( var i = 0, l = Expr.order.length; i < l; i++ ) { var type = Expr.order[i], match;
if ( (match = Expr.match[ type ].exec( expr )) ) { var left = RegExp.leftContext;
if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace(/\\/g, ""); set = Expr.find[ type ]( match, context ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } }
if ( !set ) { set = context.getElementsByTagName("*"); }
return {set: set, expr: expr}; };
Sizzle.filter = function(expr, set, inplace, not){ var old = expr, result = [], curLoop = set, match, anyFound;
while ( expr && set.length ) { for ( var type in Expr.filter ) { if ( (match = Expr.match[ type ].exec( expr )) != null ) { var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item; anyFound = false;
if ( curLoop == result ) { result = []; }
if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
if ( !match ) { anyFound = found = true; } else if ( match[0] === true ) { goodArray = []; var last = null, elem; for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) { if ( elem && last !== elem ) { goodArray.push( elem ); last = elem; } } } }
if ( match ) { for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) { if ( item ) { if ( goodArray && item != goodArray[goodPos] ) { goodPos++; }
found = filter( item, match, goodPos, goodArray ); var pass = not ^ !!found;
var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/, CLASS: /\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/, ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/, TAG: /^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/, PSEUDO: /:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ }, attrMap: { "class": "className", "for": "htmlFor" }, relative: { "+": function(checkSet, part){ for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var cur = elem.previousSibling; while ( cur && cur.nodeType !== 1 ) { cur = cur.previousSibling; } checkSet[i] = typeof part === "string" ? cur || false : cur === part; } }
if ( typeof part === "string" ) { Sizzle.filter( part, checkSet, true ); } }, ">": function(checkSet, part){ if ( typeof part === "string" && !/\W/.test(part) ) { part = part.toUpperCase();
for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName === part ? parent : false; } } } else { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { checkSet[i] = typeof part === "string" ? elem.parentNode : elem.parentNode === part; } }
if ( typeof part === "string" ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part){ var doneName = "done" + (done++), checkFn = dirCheck;
if ( !part.match(/\W/) ) { var nodeCheck = part = part.toUpperCase(); checkFn = dirNodeCheck; }
// Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. try { Array.prototype.slice.call( document.documentElement.childNodes );
// Provide a fallback method if it does not work } catch(e){ makeArray = function(array, results) { var ret = results || [];
if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var i = 0, l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( var i = 0; array[i]; i++ ) { ret.push( array[i] ); } } }
return ret; }; }
// Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("form"), id = "script" + (new Date).getTime(); form.innerHTML = "";
// Inject it into the root element, check its status, and remove it quickly var root = document.documentElement; root.insertBefore( form, root.firstChild );
// The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( !!document.getElementById( id ) ) { Expr.find.ID = function(match, context){ if ( context.getElementById ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || m.getAttributeNode && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } };
// Check to see if the browser returns only elements // when doing getElementsByTagName("*") (function(){ // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") );
// Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function(match, context){ var results = context.getElementsByTagName(match[1]);
// Filter out possible comments if ( match[1] === "*" ) { var tmp = [];
for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } }
results = tmp; }
return results; }; } })();
if ( document.querySelectorAll ) (function(){ var oldSizzle = Sizzle;
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { elem = elem[dir]; var match = false;
while ( elem && elem.nodeType ) { var done = elem[doneName]; if ( done ) { match = checkSet[ done ]; break; }
if ( elem.nodeType === 1 ) elem[doneName] = i;
if ( elem.nodeName === cur ) { match = elem; break; }
elem = elem[dir]; }
checkSet[i] = match; } } }
function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { elem = elem[dir]; var match = false;
while ( elem && elem.nodeType ) { if ( elem[doneName] ) { match = checkSet[ elem[doneName] ]; break; }
if ( elem.nodeType === 1 ) { elem[doneName] = i;
if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; }
} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } }
elem = elem[dir]; }
checkSet[i] = match; } } }
var contains = document.compareDocumentPosition ? function(a, b){ return a.compareDocumentPosition(b) & 16; } : function(a, b){ return a !== b && (a.contains ? a.contains(b) : true); };