src/cm/media/js/lib/yui/yui3.0.0/build/dom/selector-debug.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
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
        Y.log('query: ' + selector + ' returning: ' + ret.length, 'info', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
        return (firstOnly) ? (ret[0] || null) : ret;
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
    // allows element scoped queries to begin with combinator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
    // e.g. query('> p', document.body) === query('body > p')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
    _splitQueries: function(selector, node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
        var groups = selector.split(','),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
            queries = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
            prefix = '',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
        if (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
            // enforce for element scoping
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
            if (node.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
                node.id = node.id || Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
                prefix = '#' + node.id + ' ';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
            for (i = 0, len = groups.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
                selector =  prefix + groups[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
                queries.push([selector, node]);
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
        return queries;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
    _nativeQuery: function(selector, root, one) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
        try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
            //Y.log('trying native query with: ' + selector, 'info', 'selector-native');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
            return root['querySelector' + (one ? '' : 'All')](selector);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
        } catch(e) { // fallback to brute if available
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
            //Y.log('native query error; reverting to brute query with: ' + selector, 'info', 'selector-native');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
            return Y.Selector.query(selector, root, one, true); // redo with skipNative true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
    filter: function(nodes, selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
        var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
            i, node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
        if (nodes && selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
            for (i = 0; (node = nodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
                if (Y.Selector.test(node, selector)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
                    ret[ret.length] = node;
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
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
            Y.log('invalid filter input (nodes: ' + nodes +
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
                    ', selector: ' + selector + ')', 'warn', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
    test: function(node, selector, root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
        var ret = false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
            groups = selector.split(','),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
            item,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
            i, group;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
        if (node && node.tagName) { // only test HTMLElements
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
            root = root || node.ownerDocument;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
            if (!node.id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
                node.id = TMP_PREFIX + g_counter++;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
            for (i = 0; (group = groups[i++]);) { // TODO: off-dom test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
                group += '#' + node.id; // add ID for uniqueness
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
                item = Y.Selector.query(group, root, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
                ret = (item === node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
                if (ret) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
                    break;
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
    }
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
Y.mix(Y.Selector, Selector, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
}, '3.0.0' ,{requires:['dom-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
YUI.add('selector-css2', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
 * 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
   237
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
 * @submodule selector-css2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
 * Provides helper methods for collecting and filtering DOM elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
var PARENT_NODE = 'parentNode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
    TAG_NAME = 'tagName',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
    ATTRIBUTES = 'attributes',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
    COMBINATOR = 'combinator',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
    PSEUDOS = 'pseudos',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
    Selector = Y.Selector,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
    SelectorCSS2 = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
        SORT_RESULTS: true,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
        _children: function(node, tag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
            var ret = node.children,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
                i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
                children = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
                childNodes,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
                child;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
            if (node.children && tag && node.children.tags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
                children = node.children.tags(tag);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
            } else if ((!ret && node[TAG_NAME]) || (ret && tag)) { // only HTMLElements have children
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
                childNodes = ret || node.childNodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
                ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
                for (i = 0; (child = childNodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
                    if (child.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
                        if (!tag || tag === child.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
                            ret.push(child);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
                        }
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
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
            return ret || [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
        _regexCache: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
        _re: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
            attr: /(\[.*\])/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
            pseudos: /:([\-\w]+(?:\(?:['"]?(.+)['"]?\)))*/i
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
         * Mapping of shorthand tokens to corresponding attribute selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
         * @property shorthand
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
         * @type object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
        shorthand: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
            '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
            '\\.(-?[_a-z]+[-\\w]*)': '[className~=$1]'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
         * List of operators and corresponding boolean functions. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
         * 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
   300
         * @property operators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
         * @type object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
        operators: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
            '': 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
   305
            //'': '.+',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
            //'=': '^{val}$', // equality
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
            '~=': '(?:^|\\s+){val}(?:\\s+|$)', // space-delimited
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
            '|=': '^{val}-?' // optional hyphen-delimited
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
        pseudos: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
           'first-child': function(node) { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
                return Y.Selector._children(node[PARENT_NODE])[0] === node; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
            } 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
        _bruteQuery: function(selector, root, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
            var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
                nodes = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
                tokens = Selector._tokenize(selector),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
                token = tokens[tokens.length - 1],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
                rootDoc = Y.DOM._getDoc(root),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
                id,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
                className,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
                tagName;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
            // if we have an initial ID, set to root when in document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
            if (tokens[0] && rootDoc === root &&  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
                    (id = tokens[0].id) &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
                    rootDoc.getElementById(id)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
                root = rootDoc.getElementById(id);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
            if (token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
                // prefilter nodes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
                id = token.id;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
                className = token.className;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
                tagName = token.tagName || '*';
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 ID first
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
                if (id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
                    if (rootDoc.getElementById(id)) { // if in document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
                    nodes = [rootDoc.getElementById(id)]; // TODO: DOM.byId?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
                // try className if supported
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
                } else if (className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
                    nodes = root.getElementsByClassName(className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
                } else if (tagName) { // default to tagName
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
                    nodes = root.getElementsByTagName(tagName || '*');
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
                if (nodes.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
                    ret = Selector._filterNodes(nodes, tokens, firstOnly);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
            return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
        _filterNodes: function(nodes, tokens, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
            var i = 0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
                j,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
                len = tokens.length,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
                n = len - 1,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
                result = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
                node = nodes[0],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
                tmpNode = node,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
                getters = Y.Selector.getters,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
                operator,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
                combinator,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
                token,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
                path,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
                pass,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
                //FUNCTION = 'function',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
                value,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
                tests,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
                test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
            //do {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
            for (i = 0; (tmpNode = node = nodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
                n = len - 1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
                path = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
                testLoop:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
                while (tmpNode && tmpNode.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
                    token = tokens[n];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
                    tests = token.tests;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
                    j = tests.length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
                    if (j && !pass) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
                        while ((test = tests[--j])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
                            operator = test[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
                            if (getters[test[0]]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
                                value = getters[test[0]](tmpNode, test[0]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
                            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
                                value = tmpNode[test[0]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
                                // use getAttribute for non-standard attributes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
                                if (value === undefined && tmpNode.getAttribute) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
                                    value = tmpNode.getAttribute(test[0]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
                            if ((operator === '=' && value !== test[2]) ||  // fast path for equality
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
                                (operator.test && !operator.test(value)) ||  // regex test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
                                (operator.call && !operator(tmpNode, test[0]))) { // function test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
                                // skip non element nodes or non-matching tags
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
                                if ((tmpNode = tmpNode[path])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
                                    while (tmpNode &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
                                        (!tmpNode.tagName ||
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
                                            (token.tagName && token.tagName !== tmpNode.tagName))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
                                    ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
                                        tmpNode = tmpNode[path]; 
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
                                continue testLoop;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
                    n--; // move to next token
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
                    // now that we've passed the test, move up the tree by combinator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
                    if (!pass && (combinator = token.combinator)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
                        path = combinator.axis;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
                        tmpNode = tmpNode[path];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
                        // skip non element nodes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
                        while (tmpNode && !tmpNode.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
                            tmpNode = tmpNode[path]; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
                        if (combinator.direct) { // one pass only
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
                            path = null; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
                    } else { // success if we made it this far
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
                        result.push(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
                        if (firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
                            return result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
                        break;
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
            }// while (tmpNode = node = nodes[++i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
            node = tmpNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
            return result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
        _getRegExp: function(str, flags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
            var regexCache = Selector._regexCache;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
            flags = flags || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
            if (!regexCache[str + flags]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
                regexCache[str + flags] = new RegExp(str, flags);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
            return regexCache[str + flags];
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
        combinators: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
            ' ': {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
                axis: 'parentNode'
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
                axis: 'parentNode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
                direct: true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
            },
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
                axis: 'previousSibling',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
                direct: true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
        _parsers: [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
                name: ATTRIBUTES,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
                re: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
                    var operator = match[2] || '',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
                        operators = Y.Selector.operators,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
                        test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
                    // add prefiltering for ID and CLASS
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
                    if ((match[1] === 'id' && operator === '=') ||
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
                            (match[1] === 'className' &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
                            document.getElementsByClassName &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
                            (operator === '~=' || operator === '='))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
                        token.prefilter = match[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
                        token[match[1]] = match[3];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
                    // add tests
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
                    if (operator in operators) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
                        test = operators[operator];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
                        if (typeof test === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
                            test = Y.Selector._getRegExp(test.replace('{val}', match[3]));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
                        match[2] = test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
                    if (!token.last || token.prefilter !== match[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
                        return match.slice(1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
                name: TAG_NAME,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
                re: /^((?:-?[_a-z]+[\w-]*)|\*)/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
                    var tag = match[1].toUpperCase();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
                    token.tagName = tag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
                    if (tag !== '*' && (!token.last || token.prefilter)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
                        return [TAG_NAME, '=', tag];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
                    if (!token.prefilter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
                        token.prefilter = 'tagName';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
                }
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
                name: COMBINATOR,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
                re: /^\s*([>+~]|\s)\s*/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
                name: PSEUDOS,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
                re: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
                fn: function(match, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
                    var test = Selector[PSEUDOS][match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
                    if (test) { // reorder match array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
                        return [match[2], test];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
                    } else { // selector token not supported (possibly missing CSS3 module)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
                        return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
            ],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
        _getToken: function(token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
            return {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
                tagName: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
                id: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
                className: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
                attributes: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
                combinator: null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
                tests: []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
            Break selector into token units per simple selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
            Combinator is attached to the previous token.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
        _tokenize: function(selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
            selector = selector || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
            selector = Selector._replaceShorthand(Y.Lang.trim(selector)); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
            var token = Selector._getToken(),     // one token per simple selector (left selector holds combinator)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
                query = selector, // original query for debug report
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
                tokens = [],    // array of tokens
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
                found = false,  // whether or not any matches were found this pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
                match,         // the regex match
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
                test,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
                i, parser;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
            /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
                Search for selector patterns, store, and strip them from the selector string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
                until no patterns match (invalid selector) or we run out of chars.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
                Multiple attributes and pseudos are allowed, in any order.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
                for example:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
                    'form:first-child[type=button]:not(button)[lang|=en]'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
            */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
            outer:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
            do {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
                found = false; // reset after full pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
                for (i = 0; (parser = Selector._parsers[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
                    if ( (match = parser.re.exec(selector)) ) { // note assignment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
                        if (parser !== COMBINATOR ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
                            token.selector = selector;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
                        selector = selector.replace(match[0], ''); // strip current match from selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
                        if (!selector.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
                            token.last = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
                        if (Selector._attrFilters[match[1]]) { // convert class to className, etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
                            match[1] = Selector._attrFilters[match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                        test = parser.fn(match, token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
                        if (test === false) { // selector not supported
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
                            found = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
                            break outer;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
                        } else if (test) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
                            token.tests.push(test);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
                        if (!selector.length || parser.name === COMBINATOR) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
                            tokens.push(token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
                            token = Selector._getToken(token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
                            if (parser.name === COMBINATOR) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
                                token.combinator = Y.Selector.combinators[match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
                        found = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
            } while (found && selector.length);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
            if (!found || selector.length) { // not fully parsed
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
                Y.log('query: ' + query + ' contains unsupported token in: ' + selector, 'warn', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
                tokens = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
            return tokens;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
        _replaceShorthand: function(selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
            var shorthand = Selector.shorthand,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
                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
   623
                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
   624
                re, i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
            if (pseudos) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
                selector = selector.replace(Selector._re.pseudos, '!!REPLACED_PSEUDO!!');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
            if (attrs) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
                selector = selector.replace(Selector._re.attr, '!!REPLACED_ATTRIBUTE!!');
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
            for (re in shorthand) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
                if (shorthand.hasOwnProperty(re)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
                    selector = selector.replace(Selector._getRegExp(re, 'gi'), shorthand[re]);
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
            if (attrs) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
                for (i = 0, len = attrs.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
                    selector = selector.replace('!!REPLACED_ATTRIBUTE!!', attrs[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
            if (pseudos) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
                for (i = 0, len = pseudos.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
                    selector = selector.replace('!!REPLACED_PSEUDO!!', pseudos[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
            return selector;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
        _attrFilters: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
            'class': 'className',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
            'for': 'htmlFor'
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
        getters: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
            href: function(node, attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
                return Y.DOM.getAttribute(node, attr);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
Y.mix(Y.Selector, SelectorCSS2, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
Y.Selector.getters.src = Y.Selector.getters.rel = Y.Selector.getters.href;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
// IE wants class with native queries
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
if (Y.Selector.useNative && document.querySelector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
    Y.Selector.shorthand['\\.(-?[_a-z]+[-\\w]*)'] = '[class~=$1]';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
}, '3.0.0' ,{requires:['selector-native']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
YUI.add('selector', function(Y){}, '3.0.0' ,{use:['selector-native', 'selector-css2']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679