selector-debug.js revision 744aec5933ba55f438dc42a241edb3c95df5abff
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebYUI.add('selector', function(Y) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb/**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Provides helper methods for collecting and filtering DOM elements.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @module dom
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @submodule selector
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb/**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Provides helper methods for collecting and filtering DOM elements.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @class Selector
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @static
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebvar TAG = 'tag',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb PARENT_NODE = 'parentNode',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb PREVIOUS_SIBLING = 'previousSibling',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb LENGTH = 'length',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb NODE_TYPE = 'nodeType',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb TAG_NAME = 'tagName',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb ATTRIBUTES = 'attributes',
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China PSEUDOS = 'pseudos',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb COMBINATOR = 'combinator';
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amorevar reNth = /^(?:([\-]?\d*)(n){1}|(odd|even)$)*([\-+]?\d*)$/;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebvar patterns = {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb tag: /^((?:-?[_a-z]+[\w\-]*)|\*)/i,
945c212afec9d02b63fcd6b175ab711ffb55bf3bseb attributes: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i,
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb pseudos: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb combinator: /^\s*([>+~]|\s)\s*/
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb};
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebvar Selector = {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Default document for use queries
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @property document
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @type object
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @default window.document
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb document: Y.config.doc,
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb /**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Mapping of attributes to aliases, normally to work around HTMLAttributes
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * that conflict with JS reserved words.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @property attrAliases
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @type object
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
107875b08504ad7f74a2abc64d3862ee8845d5efsangeeta attrAliases: {},
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
107875b08504ad7f74a2abc64d3862ee8845d5efsangeeta /**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Mapping of shorthand tokens to corresponding attribute selector
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @property shorthand
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @type object
107875b08504ad7f74a2abc64d3862ee8845d5efsangeeta */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb shorthand: {
107875b08504ad7f74a2abc64d3862ee8845d5efsangeeta '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '\\.(-?[_a-z]+[-\\w]*)': '[class~=$1]'
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb /**
9b14cf1dc76dad8f2d9a74310e0a0200af96d217gd * List of operators and corresponding boolean functions.
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd * These functions are passed the attribute and the current node's value of the attribute.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @property operators
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * @type object
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb operators: {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '=': function(attr, val) { return attr === val; }, // Equality
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore '!=': function(attr, val) { return attr !== val; }, // Inequality
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore '~=': function(attr, val) { // Match one of space seperated words
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore var s = ' ';
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore return (s + attr + s).indexOf((s + val + s)) > -1;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '|=': function(attr, val) { return Y.DOM._getRegExp('^' + val + '[-]?').test(attr); }, // Match start with value followed by optional hyphen
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '^=': function(attr, val) { return attr.indexOf(val) === 0; }, // Match starts with value
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd '$=': function(attr, val) { return attr.lastIndexOf(val) === attr[LENGTH] - val[LENGTH]; }, // Match ends with value
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '*=': function(attr, val) { return attr.indexOf(val) > -1; }, // Match contains value as substring
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '': function(attr, val) { return attr; } // Just test for existence of attribute
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb /**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * List of pseudo-classes and corresponding boolean functions.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * These functions are called with the current node, and any value that was parsed with the pseudo regex.
9b14cf1dc76dad8f2d9a74310e0a0200af96d217gd * @property pseudos
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @type object
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore */
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore pseudos: {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore 'root': function(node) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China return node === node.ownerDocument.documentElement;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd 'nth-child': function(node, val) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return Selector.getNth(node, val);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'nth-last-child': function(node, val) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return Selector.getNth(node, val, null, true);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'nth-of-type': function(node, val) {
9b14cf1dc76dad8f2d9a74310e0a0200af96d217gd return Selector.getNth(node, val, node[TAG_NAME]);
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore 'nth-last-of-type': function(node, val) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore return Selector.getNth(node, val, node[TAG_NAME], true);
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'first-child': function(node) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd return Y.DOM.firstChild(node[PARENT_NODE]) === node;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'last-child': function(node) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return Y.DOM.lastChild(node[PARENT_NODE]) === node;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'first-of-type': function(node, val) {
9b14cf1dc76dad8f2d9a74310e0a0200af96d217gd return Y.DOM.firstChildByTag(node[PARENT_NODE], node[TAG_NAME]) === node;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'last-of-type': function(node, val) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return Y.DOM.lastChildByTag(node[PARENT_NODE], node[TAG_NAME]) === node;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'only-child': function(node) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb var children = Y.DOM.children(node[PARENT_NODE]);
39b361b2ebefcef5612a54ae5cbd2179e19be296Richard Bean return children[LENGTH] === 1 && children[0] === node;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'only-of-type': function(node) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return Y.DOM.childrenByTag(node[PARENT_NODE], node[TAG_NAME])[LENGTH] === 1;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 'empty': function(node) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return node.childNodes[LENGTH] === 0;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini 'not': function(node, simple) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China return !Selector.test(node, simple);
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore 'contains': function(node, str) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore var text = node.innerText || node.textContent || '';
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore return text.indexOf(str) > -1;
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore 'checked': function(node) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore return node.checked === true;
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore }
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore /**
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * Test if the supplied node matches the supplied selector.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @method test
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China *
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China * @param {HTMLElement | String} node An id or node reference to the HTMLElement being tested.
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * @param {string} selector The CSS Selector to test the node against.
3fd94f8c011031b38162a1db3b554de4371c167fam * @return{boolean} Whether or not the node matches the selector.
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * @static
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
3fd94f8c011031b38162a1db3b554de4371c167fam */
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini test: function(node, selector) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (!node) {
3fd94f8c011031b38162a1db3b554de4371c167fam return false;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
3fd94f8c011031b38162a1db3b554de4371c167fam var groups = selector ? selector.split(',') : [];
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (groups[LENGTH]) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini for (var i = 0, len = groups[LENGTH]; i < len; ++i) {
3fd94f8c011031b38162a1db3b554de4371c167fam if ( Selector._testNode(node, groups[i]) ) { // passes if ANY group matches
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return true;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
3fd94f8c011031b38162a1db3b554de4371c167fam }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return false;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
3fd94f8c011031b38162a1db3b554de4371c167fam return Selector._testNode(node, selector);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini },
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini /**
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * Filters a set of nodes based on a given CSS selector.
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * @method filter
3fd94f8c011031b38162a1db3b554de4371c167fam *
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * @param {array} nodes A set of nodes/ids to filter.
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * @param {string} selector The selector used to test each node.
3fd94f8c011031b38162a1db3b554de4371c167fam * @return{array} An array of nodes from the supplied array that match the given selector.
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * @static
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini */
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini filter: function(nodes, selector) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini nodes = nodes || [];
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var result = Selector._filter(nodes, Selector._tokenize(selector)[0]);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini Y.log('filter: returning:' + result[LENGTH], 'info', 'Selector');
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return result;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini },
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini /**
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * Retrieves a set of nodes based on a given CSS selector.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @method query
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore *
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @param {string} selector The CSS Selector to test the node against.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @param {HTMLElement | String} root optional An id or HTMLElement to start the query from. Defaults to Selector.document.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @param {Boolean} firstOnly optional Whether or not to return only the first match.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @return {Array} An array of nodes that match the given selector.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * @static
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore */
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore query: function(selector, root, firstOnly) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore var result = Selector._query(selector, root, firstOnly);
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore //Y.log('query: ' + selector + ' returning ' + result, 'info', 'Selector');
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China return result;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini _query: function(selector, root, firstOnly, deDupe) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var result = (firstOnly) ? null : [];
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (!selector) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return result;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini root = root || Selector.document;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var groups = selector.split(','); // TODO: handle comma in attribute/pseudo
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (groups[LENGTH] > 1) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var found;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini for (var i = 0, len = groups[LENGTH]; i < len; ++i) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini found = arguments.callee(groups[i], root, firstOnly, true);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini result = firstOnly ? found : result.concat(found);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini Selector._clearFoundCache();
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return result;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var tokens = Selector._tokenize(selector);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var idToken = tokens[Selector._getIdTokenIndex(tokens)],
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini nodes = [],
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini node,
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini id,
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini token = tokens.pop() || {};
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (idToken) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini id = Selector._getId(idToken[ATTRIBUTES]);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore // use id shortcut when possible
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore if (id) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore node = Selector.document.getElementById(id);
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore if (node && (root[NODE_TYPE] === 9 || Y.DOM.contains(root, node))) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore if ( Selector._testNode(node, null, idToken) ) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore if (idToken === token) {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore nodes = [node]; // simple selector
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore } else {
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore root = node; // start from here
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore }
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore }
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China } else {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China return result;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (root && !nodes[LENGTH]) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini nodes = root.getElementsByTagName(token[TAG]);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (nodes[LENGTH]) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini result = Selector._filter(nodes, token, firstOnly, deDupe);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return result;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini },
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini _filter: function(nodes, token, firstOnly, deDupe) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini var result = firstOnly ? null : [];
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini result = Y.DOM.filterElementsBy(nodes, function(node) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (! Selector._testNode(node, '', token, deDupe)) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return false;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (deDupe) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini if (node._found) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return false;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini node._found = true;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini Selector._foundCache[Selector._foundCache[LENGTH]] = node;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }, firstOnly);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return result;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb _testNode: function(node, selector, token, deDupe) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb token = token || Selector._tokenize(selector).pop() || {};
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb var ops = Selector.operators,
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb pseudos = Selector.pseudos,
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb prev = token.previous,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc i, len;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (!node[TAG_NAME] ||
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb (token[TAG] !== '*' && node[TAG_NAME].toUpperCase() !== token[TAG]) ||
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb (deDupe && node._found) ) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini return false;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (token[ATTRIBUTES][LENGTH]) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb var attribute;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb for (i = 0, len = token[ATTRIBUTES][LENGTH]; i < len; ++i) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb attribute = node.getAttribute(token[ATTRIBUTES][i][0], 2);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (attribute === undefined) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if ( ops[token[ATTRIBUTES][i][1]] &&
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb !ops[token[ATTRIBUTES][i][1]](attribute, token[ATTRIBUTES][i][2])) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (token[PSEUDOS][LENGTH]) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb for (i = 0, len = token[PSEUDOS][LENGTH]; i < len; ++i) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (pseudos[token[PSEUDOS][i][0]] &&
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb !pseudos[token[PSEUDOS][i][0]](node, token[PSEUDOS][i][1])) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return (prev && prev[COMBINATOR] !== ',') ?
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Selector.combinators[prev[COMBINATOR]](node, token) :
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb _foundCache: [],
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb _regexCache: {},
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb _clearFoundCache: function() {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Y.log('getBySelector: clearing found cache of ' + Selector._foundCache[LENGTH] + ' elements');
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb for (var i = 0, len = Selector._foundCache[LENGTH]; i < len; ++i) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb try { // IE no like delete
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb delete Selector._foundCache[i]._found;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb } catch(e) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Selector._foundCache[i].removeAttribute('_found');
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Selector._foundCache = [];
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Y.log('getBySelector: done clearing Selector._foundCache');
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb combinators: {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb ' ': function(node, token) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb while ((node = node[PARENT_NODE])) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (Selector._testNode(node, '', token.previous)) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '>': function(node, token) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return Selector._testNode(node[PARENT_NODE], null, token.previous);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '+': function(node, token) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb var sib = node[PREVIOUS_SIBLING];
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb while (sib && sib[NODE_TYPE] !== 1) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb sib = sib[PREVIOUS_SIBLING];
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (sib && Selector._testNode(sib, null, token.previous)) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb '~': function(node, token) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb var sib = node[PREVIOUS_SIBLING];
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb while (sib) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (sib[NODE_TYPE] === 1 && Selector._testNode(sib, null, token.previous)) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb sib = sib[PREVIOUS_SIBLING];
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb /*
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb an+b = get every _a_th node starting at the _b_th
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 0n+b = no repeat ("0" and "n" may both be omitted (together) , e.g. "0n+1" or "1", not "0+1"), return only the _b_th element
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb 1n+b = get every element starting from b ("1" may may be omitted, e.g. "1n+0" or "n+0" or "n")
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb an+0 = get every _a_th element, "0" may be omitted
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb getNth: function(node, expr, tag, reverse) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb reNth.test(expr);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb var a = parseInt(RegExp.$1, 10), // include every _a_ elements (zero means no repeat, just first _a_)
22eb7cb54d8a6bcf6fe2674cb4b1f0cf2d85cfb6gd n = RegExp.$2, // "n"
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb oddeven = RegExp.$3, // "odd" or "even"
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb b = parseInt(RegExp.$4, 10) || 0, // start scan from element _b_
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb op, i, len, siblings;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (tag) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb siblings = Y.DOM.childrenByTag(node[PARENT_NODE], tag);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb } else {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb siblings = Y.DOM.children(node[PARENT_NODE]);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (oddeven) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb a = 2; // always every other
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb op = '+';
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb n = 'n';
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb b = (oddeven === 'odd') ? 1 : 0;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb } else if ( isNaN(a) ) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb a = (n) ? 1 : 0; // start from the first or no repeat
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (a === 0) { // just the first
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (reverse) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb b = siblings[LENGTH] - b + 1;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (siblings[b - 1] === node) {
22eb7cb54d8a6bcf6fe2674cb4b1f0cf2d85cfb6gd return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb } else {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return false;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb } else if (a < 0) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb reverse = !!reverse;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb a = Math.abs(a);
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if (!reverse) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb for (i = b - 1, len = siblings[LENGTH]; i < len; i += a) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if ( i >= 0 && siblings[i] === node ) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb } else {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb for (i = siblings[LENGTH] - b, len = siblings[LENGTH]; i >= 0; i -= a) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb if ( i < len && siblings[i] === node ) {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb return true;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb }
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd }
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd return false;
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd },
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd _getId: function(attr) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd for (var i = 0, len = attr[LENGTH]; i < len; ++i) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd if (attr[i][0] == 'id' && attr[i][1] === '=') {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd return attr[i][2];
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd }
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd }
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd },
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd _getIdTokenIndex: function(tokens) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd for (var i = 0, len = tokens[LENGTH]; i < len; ++i) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd if (Selector._getId(tokens[i][ATTRIBUTES])) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd return i;
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd }
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd }
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd return -1;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb },
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb /**
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Break selector into token units per simple selector.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb Combinator is attached to left-hand selector.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd _tokenize: function(selector) {
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd var token = {}, // one token per simple selector (left selector holds combinator)
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd tokens = [], // array of tokens
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd found = false, // whether or not any matches were found this pass
0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459gd match; // the regex match
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
selector = Selector._replaceShorthand(selector); // convert ID and CLASS shortcuts to attributes
/*
Search for selector patterns, store, and strip them from the selector string
until no patterns match (invalid selector) or we run out of chars.
Multiple attributes and pseudos are allowed, in any order.
for example:
'form:first-child[type=button]:not(button)[lang|=en]'
*/
do {
found = false; // reset after full pass
for (var re in patterns) {
if (patterns.hasOwnProperty(re)) {
if (re != TAG && re != COMBINATOR) { // only one allowed
token[re] = token[re] || [];
}
if ((match = patterns[re].exec(selector))) { // note assignment
found = true;
if (re != TAG && re != COMBINATOR) { // only one allowed
//token[re] = token[re] || [];
// capture ID for fast path to element
if (re === ATTRIBUTES && match[1] === 'id') {
token.id = match[3];
}
token[re].push(match.slice(1));
} else { // single selector (tag, combinator)
token[re] = match[1];
}
selector = selector.replace(match[0], ''); // strip current match from selector
if (re === COMBINATOR || !selector[LENGTH]) { // next token or done
token[ATTRIBUTES] = Selector._fixAttributes(token[ATTRIBUTES]);
token[PSEUDOS] = token[PSEUDOS] || [];
token[TAG] = token[TAG] ? token[TAG].toUpperCase() : '*';
tokens.push(token);
token = { // prep next token
previous: token
};
}
}
}
}
} while (found);
return tokens;
},
_fixAttributes: function(attr) {
var aliases = Selector.attrAliases;
attr = attr || [];
for (var i = 0, len = attr[LENGTH]; i < len; ++i) {
if (aliases[attr[i][0]]) { // convert reserved words, etc
attr[i][0] = aliases[attr[i][0]];
}
if (!attr[i][1]) { // use exists operator
attr[i][1] = '';
}
}
return attr;
},
_replaceShorthand: function(selector) {
var shorthand = Selector.shorthand;
var attrs = selector.match(patterns[ATTRIBUTES]); // pull attributes to avoid false pos on "." and "#"
if (attrs) {
selector = selector.replace(patterns[ATTRIBUTES], 'REPLACED_ATTRIBUTE');
}
for (var re in shorthand) {
if (shorthand.hasOwnProperty(re)) {
selector = selector.replace(Y.DOM._getRegExp(re, 'gi'), shorthand[re]);
}
}
if (attrs) {
for (var i = 0, len = attrs[LENGTH]; i < len; ++i) {
selector = selector.replace('REPLACED_ATTRIBUTE', attrs[i]);
}
}
return selector;
}
};
if (Y.UA.ie && Y.UA.ie < 8) { // rewrite class for IE (others use getAttribute('class')
Selector.attrAliases['class'] = 'className';
Selector.attrAliases['for'] = 'htmlFor';
}
Y.Selector = Selector;
Y.Selector.patterns = patterns;
}, '@VERSION@' ,{requires:['dom-base'], skinnable:false});