src/cm/media/js/lib/yui/yui3.0.0/build/dom/selector.js
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1549
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('selector-native', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * The selector-native module provides support for native querySelector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * @submodule selector-native
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
 * Provides support for using CSS selectors to query the DOM 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
 * @class Selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
Y.namespace('Selector'); // allow native module to standalone
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
var COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    OWNER_DOCUMENT = 'ownerDocument',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
    TMP_PREFIX = 'yui-tmp-',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
    g_counter = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
var Selector = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    _foundCache: [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    useNative: true,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    _compare: ('sourceIndex' in document.documentElement) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
        function(nodeA, nodeB) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
            var a = nodeA.sourceIndex,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
                b = nodeB.sourceIndex;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
            if (a === b) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
                return 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
            } else if (a > b) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
                return 1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
            return -1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
        } : (document.documentElement[COMPARE_DOCUMENT_POSITION] ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        function(nodeA, nodeB) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
            if (nodeA[COMPARE_DOCUMENT_POSITION](nodeB) & 4) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
                return -1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
                return 1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
        } :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        function(nodeA, nodeB) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
            var rangeA, rangeB, compare;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
            if (nodeA && nodeB) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
                rangeA = nodeA[OWNER_DOCUMENT].createRange();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
                rangeA.setStart(nodeA, 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
                rangeB = nodeB[OWNER_DOCUMENT].createRange();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
                rangeB.setStart(nodeB, 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
                compare = rangeA.compareBoundaryPoints(1, rangeB); // 1 === Range.START_TO_END
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
            return compare;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
    }),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
    _sort: function(nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
        if (nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
            nodes = Y.Array(nodes, 0, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
            if (nodes.sort) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
                nodes.sort(Selector._compare);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
        return nodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
    _deDupe: function(nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
        var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
            i, node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
        for (i = 0; (node = nodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
            if (!node._found) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
                ret[ret.length] = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
                node._found = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
        for (i = 0; (node = ret[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
            node._found = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
            node.removeAttribute('_found');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
     * Retrieves a set of nodes based on a given CSS selector. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
     * @method query
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
     * @param {string} selector The CSS Selector to test the node against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
     * @param {HTMLElement} root optional An HTMLElement to start the query from. Defaults to Y.config.doc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
     * @param {Boolean} firstOnly optional Whether or not to return only the first match.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
     * @return {Array} An array of nodes that match the given selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
     * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    query: function(selector, root, firstOnly, skipNative) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
        root = root || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
        var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
            useNative = (Y.Selector.useNative && document.querySelector && !skipNative),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
            queries = [[selector, root]],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
            query,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
            result,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
            i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
            fn = (useNative) ? Y.Selector._nativeQuery : Y.Selector._bruteQuery;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
        if (selector && fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
            // split group into seperate queries
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
            if (!skipNative && // already done if skipping
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
                    (!useNative || root.tagName)) { // split native when element scoping is needed
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
                queries = Selector._splitQueries(selector, root);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
            for (i = 0; (query = queries[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
                result = fn(query[0], query[1], firstOnly);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
                if (!firstOnly) { // coerce DOM Collection to Array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
                    result = Y.Array(result, 0, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
                if (result) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
                    ret = ret.concat(result);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
            if (queries.length > 1) { // remove dupes and sort by doc order 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
                ret = Selector._sort(Selector._deDupe(ret));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
        return (firstOnly) ? (ret[0] || null) : ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
    // allows element scoped queries to begin with combinator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
    // e.g. query('> p', document.body) === query('body > p')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
    _splitQueries: function(selector, node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
        var groups = selector.split(','),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
            queries = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
            prefix = '',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
        if (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
            // enforce for element scoping
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
            if (node.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
                node.id = node.id || Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
                prefix = '#' + node.id + ' ';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
            for (i = 0, len = groups.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
                selector =  prefix + groups[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
                queries.push([selector, node]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
        return queries;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
    _nativeQuery: function(selector, root, one) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
        try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
            return root['querySelector' + (one ? '' : 'All')](selector);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
        } catch(e) { // fallback to brute if available
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
            return Y.Selector.query(selector, root, one, true); // redo with skipNative true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
    filter: function(nodes, selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
        var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
            i, node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
        if (nodes && selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
            for (i = 0; (node = nodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
                if (Y.Selector.test(node, selector)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
                    ret[ret.length] = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
    test: function(node, selector, root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
        var ret = false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
            groups = selector.split(','),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
            item,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
            i, group;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
        if (node && node.tagName) { // only test HTMLElements
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
            root = root || node.ownerDocument;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
            if (!node.id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
                node.id = TMP_PREFIX + g_counter++;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
            for (i = 0; (group = groups[i++]);) { // TODO: off-dom test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
                group += '#' + node.id; // add ID for uniqueness
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
                item = Y.Selector.query(group, root, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
                ret = (item === node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
                if (ret) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
Y.mix(Y.Selector, Selector, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
}, '3.0.0' ,{requires:['dom-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
YUI.add('selector-css2', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
 * The selector module provides helper methods allowing CSS2 Selectors to be used with DOM elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
 * @submodule selector-css2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
 * Provides helper methods for collecting and filtering DOM elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
var PARENT_NODE = 'parentNode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
    TAG_NAME = 'tagName',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
    ATTRIBUTES = 'attributes',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
    COMBINATOR = 'combinator',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
    PSEUDOS = 'pseudos',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
    Selector = Y.Selector,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
    SelectorCSS2 = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
        SORT_RESULTS: true,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
        _children: function(node, tag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
            var ret = node.children,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
                i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
                children = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
                childNodes,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
                child;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
            if (node.children && tag && node.children.tags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
                children = node.children.tags(tag);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
            } else if ((!ret && node[TAG_NAME]) || (ret && tag)) { // only HTMLElements have children
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
                childNodes = ret || node.childNodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
                ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
                for (i = 0; (child = childNodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
                    if (child.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
                        if (!tag || tag === child.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
                            ret.push(child);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
            return ret || [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
        _regexCache: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
        _re: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
            attr: /(\[.*\])/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
            pseudos: /:([\-\w]+(?:\(?:['"]?(.+)['"]?\)))*/i
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
         * Mapping of shorthand tokens to corresponding attribute selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
         * @property shorthand
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
         * @type object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
        shorthand: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
            '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
            '\\.(-?[_a-z]+[-\\w]*)': '[className~=$1]'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
         * List of operators and corresponding boolean functions. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
         * These functions are passed the attribute and the current node's value of the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
         * @property operators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
         * @type object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
        operators: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
            '': function(node, attr) { return Y.DOM.getAttribute(node, attr) !== ''; }, // Just test for existence of attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
            //'': '.+',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
            //'=': '^{val}$', // equality
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
            '~=': '(?:^|\\s+){val}(?:\\s+|$)', // space-delimited
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
            '|=': '^{val}-?' // optional hyphen-delimited
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
        pseudos: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
           'first-child': function(node) { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
                return Y.Selector._children(node[PARENT_NODE])[0] === node; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
            } 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
        _bruteQuery: function(selector, root, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
            var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
                nodes = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
                tokens = Selector._tokenize(selector),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
                token = tokens[tokens.length - 1],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
                rootDoc = Y.DOM._getDoc(root),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
                id,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
                className,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
                tagName;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
            // if we have an initial ID, set to root when in document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
            if (tokens[0] && rootDoc === root &&  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
                    (id = tokens[0].id) &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
                    rootDoc.getElementById(id)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
                root = rootDoc.getElementById(id);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
            if (token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
                // prefilter nodes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
                id = token.id;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
                className = token.className;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
                tagName = token.tagName || '*';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
                // try ID first
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
                if (id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
                    if (rootDoc.getElementById(id)) { // if in document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
                    nodes = [rootDoc.getElementById(id)]; // TODO: DOM.byId?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
                // try className if supported
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
                } else if (className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
                    nodes = root.getElementsByClassName(className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
                } else if (tagName) { // default to tagName
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
                    nodes = root.getElementsByTagName(tagName || '*');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
                if (nodes.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
                    ret = Selector._filterNodes(nodes, tokens, firstOnly);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
            return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
        _filterNodes: function(nodes, tokens, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
            var i = 0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
                j,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
                len = tokens.length,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
                n = len - 1,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
                result = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
                node = nodes[0],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
                tmpNode = node,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
                getters = Y.Selector.getters,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
                operator,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
                combinator,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
                token,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
                path,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
                pass,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
                //FUNCTION = 'function',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
                value,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
                tests,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
                test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
            //do {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
            for (i = 0; (tmpNode = node = nodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
                n = len - 1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
                path = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
                testLoop:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
                while (tmpNode && tmpNode.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
                    token = tokens[n];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
                    tests = token.tests;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
                    j = tests.length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
                    if (j && !pass) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
                        while ((test = tests[--j])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
                            operator = test[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
                            if (getters[test[0]]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
                                value = getters[test[0]](tmpNode, test[0]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
                            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
                                value = tmpNode[test[0]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
                                // use getAttribute for non-standard attributes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
                                if (value === undefined && tmpNode.getAttribute) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
                                    value = tmpNode.getAttribute(test[0]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
                            if ((operator === '=' && value !== test[2]) ||  // fast path for equality
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
                                (operator.test && !operator.test(value)) ||  // regex test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
                                (operator.call && !operator(tmpNode, test[0]))) { // function test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
                                // skip non element nodes or non-matching tags
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
                                if ((tmpNode = tmpNode[path])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
                                    while (tmpNode &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
                                        (!tmpNode.tagName ||
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
                                            (token.tagName && token.tagName !== tmpNode.tagName))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
                                    ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
                                        tmpNode = tmpNode[path]; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
                                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
                                continue testLoop;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
                    n--; // move to next token
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
                    // now that we've passed the test, move up the tree by combinator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
                    if (!pass && (combinator = token.combinator)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
                        path = combinator.axis;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
                        tmpNode = tmpNode[path];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
                        // skip non element nodes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
                        while (tmpNode && !tmpNode.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
                            tmpNode = tmpNode[path]; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
                        if (combinator.direct) { // one pass only
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
                            path = null; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
                    } else { // success if we made it this far
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
                        result.push(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
                        if (firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
                            return result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
            }// while (tmpNode = node = nodes[++i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
            node = tmpNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
            return result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
        _getRegExp: function(str, flags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
            var regexCache = Selector._regexCache;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
            flags = flags || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
            if (!regexCache[str + flags]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
                regexCache[str + flags] = new RegExp(str, flags);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
            return regexCache[str + flags];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
        combinators: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
            ' ': {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
                axis: 'parentNode'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
            '>': {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
                axis: 'parentNode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
                direct: true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
            '+': {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
                axis: 'previousSibling',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
                direct: true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
        _parsers: [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
                name: ATTRIBUTES,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
                re: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
                    var operator = match[2] || '',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
                        operators = Y.Selector.operators,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
                        test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
                    // add prefiltering for ID and CLASS
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
                    if ((match[1] === 'id' && operator === '=') ||
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
                            (match[1] === 'className' &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
                            document.getElementsByClassName &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
                            (operator === '~=' || operator === '='))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
                        token.prefilter = match[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
                        token[match[1]] = match[3];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
                    // add tests
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
                    if (operator in operators) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
                        test = operators[operator];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
                        if (typeof test === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
                            test = Y.Selector._getRegExp(test.replace('{val}', match[3]));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
                        match[2] = test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
                    if (!token.last || token.prefilter !== match[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
                        return match.slice(1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
                name: TAG_NAME,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
                re: /^((?:-?[_a-z]+[\w-]*)|\*)/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
                    var tag = match[1].toUpperCase();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
                    token.tagName = tag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
                    if (tag !== '*' && (!token.last || token.prefilter)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
                        return [TAG_NAME, '=', tag];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
                    if (!token.prefilter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
                        token.prefilter = 'tagName';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
                name: COMBINATOR,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
                re: /^\s*([>+~]|\s)\s*/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
                name: PSEUDOS,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
                re: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
                    var test = Selector[PSEUDOS][match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
                    if (test) { // reorder match array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
                        return [match[2], test];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
                    } else { // selector token not supported (possibly missing CSS3 module)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
                        return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
            ],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
        _getToken: function(token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
            return {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
                tagName: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
                id: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
                className: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
                attributes: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
                combinator: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
                tests: []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
            Break selector into token units per simple selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
            Combinator is attached to the previous token.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
        _tokenize: function(selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
            selector = selector || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
            selector = Selector._replaceShorthand(Y.Lang.trim(selector)); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
            var token = Selector._getToken(),     // one token per simple selector (left selector holds combinator)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
                query = selector, // original query for debug report
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
                tokens = [],    // array of tokens
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
                found = false,  // whether or not any matches were found this pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
                match,         // the regex match
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
                test,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
                i, parser;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
            /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
                Search for selector patterns, store, and strip them from the selector string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
                until no patterns match (invalid selector) or we run out of chars.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
                Multiple attributes and pseudos are allowed, in any order.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
                for example:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
                    'form:first-child[type=button]:not(button)[lang|=en]'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
            */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
            outer:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
            do {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
                found = false; // reset after full pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
                for (i = 0; (parser = Selector._parsers[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
                    if ( (match = parser.re.exec(selector)) ) { // note assignment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
                        if (parser !== COMBINATOR ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
                            token.selector = selector;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
                        selector = selector.replace(match[0], ''); // strip current match from selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
                        if (!selector.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
                            token.last = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
                        if (Selector._attrFilters[match[1]]) { // convert class to className, etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
                            match[1] = Selector._attrFilters[match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
                        test = parser.fn(match, token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
                        if (test === false) { // selector not supported
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
                            found = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                            break outer;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
                        } else if (test) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                            token.tests.push(test);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
                        if (!selector.length || parser.name === COMBINATOR) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
                            tokens.push(token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
                            token = Selector._getToken(token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
                            if (parser.name === COMBINATOR) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
                                token.combinator = Y.Selector.combinators[match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
                        found = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
            } while (found && selector.length);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
            if (!found || selector.length) { // not fully parsed
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
                tokens = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
            return tokens;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
        _replaceShorthand: function(selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
            var shorthand = Selector.shorthand,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
                attrs = selector.match(Selector._re.attr), // pull attributes to avoid false pos on "." and "#"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
                pseudos = selector.match(Selector._re.pseudos), // pull attributes to avoid false pos on "." and "#"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
                re, i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
            if (pseudos) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
                selector = selector.replace(Selector._re.pseudos, '!!REPLACED_PSEUDO!!');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
            if (attrs) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
                selector = selector.replace(Selector._re.attr, '!!REPLACED_ATTRIBUTE!!');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
            for (re in shorthand) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
                if (shorthand.hasOwnProperty(re)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
                    selector = selector.replace(Selector._getRegExp(re, 'gi'), shorthand[re]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
            if (attrs) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
                for (i = 0, len = attrs.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
                    selector = selector.replace('!!REPLACED_ATTRIBUTE!!', attrs[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
            if (pseudos) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
                for (i = 0, len = pseudos.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
                    selector = selector.replace('!!REPLACED_PSEUDO!!', pseudos[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
            return selector;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
        _attrFilters: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
            'class': 'className',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
            'for': 'htmlFor'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
        getters: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
            href: function(node, attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
                return Y.DOM.getAttribute(node, attr);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
Y.mix(Y.Selector, SelectorCSS2, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
Y.Selector.getters.src = Y.Selector.getters.rel = Y.Selector.getters.href;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
// IE wants class with native queries
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
if (Y.Selector.useNative && document.querySelector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
    Y.Selector.shorthand['\\.(-?[_a-z]+[-\\w]*)'] = '[class~=$1]';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
}, '3.0.0' ,{requires:['selector-native']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
YUI.add('selector', function(Y){}, '3.0.0' ,{use:['selector-native', 'selector-css2']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673