MDL-32843 import YUI 3.5.1
[moodle.git] / lib / yui / 3.5.1 / build / selector-css3 / selector-css3.js
blob5f670b7e6c335e95fcb77b95d9ab62e9a7064647
1 /*
2 YUI 3.5.1 (build 22)
3 Copyright 2012 Yahoo! Inc. All rights reserved.
4 Licensed under the BSD License.
5 http://yuilibrary.com/license/
6 */
7 YUI.add('selector-css3', function(Y) {
9 /**
10  * The selector css3 module provides support for css3 selectors.
11  * @module dom
12  * @submodule selector-css3
13  * @for Selector
14  */
17     an+b = get every _a_th node starting at the _b_th
18     0n+b = no repeat ("0" and "n" may both be omitted (together) , e.g. "0n+1" or "1", not "0+1"), return only the _b_th element
19     1n+b =  get every element starting from b ("1" may may be omitted, e.g. "1n+0" or "n+0" or "n")
20     an+0 = get every _a_th element, "0" may be omitted 
23 Y.Selector._reNth = /^(?:([\-]?\d*)(n){1}|(odd|even)$)*([\-+]?\d*)$/;
25 Y.Selector._getNth = function(node, expr, tag, reverse) {
26     Y.Selector._reNth.test(expr);
27     var a = parseInt(RegExp.$1, 10), // include every _a_ elements (zero means no repeat, just first _a_)
28         n = RegExp.$2, // "n"
29         oddeven = RegExp.$3, // "odd" or "even"
30         b = parseInt(RegExp.$4, 10) || 0, // start scan from element _b_
31         result = [],
32         siblings = Y.DOM._children(node.parentNode, tag),
33         op;
35     if (oddeven) {
36         a = 2; // always every other
37         op = '+';
38         n = 'n';
39         b = (oddeven === 'odd') ? 1 : 0;
40     } else if ( isNaN(a) ) {
41         a = (n) ? 1 : 0; // start from the first or no repeat
42     }
44     if (a === 0) { // just the first
45         if (reverse) {
46             b = siblings.length - b + 1; 
47         }
49         if (siblings[b - 1] === node) {
50             return true;
51         } else {
52             return false;
53         }
55     } else if (a < 0) {
56         reverse = !!reverse;
57         a = Math.abs(a);
58     }
60     if (!reverse) {
61         for (var i = b - 1, len = siblings.length; i < len; i += a) {
62             if ( i >= 0 && siblings[i] === node ) {
63                 return true;
64             }
65         }
66     } else {
67         for (var i = siblings.length - b, len = siblings.length; i >= 0; i -= a) {
68             if ( i < len && siblings[i] === node ) {
69                 return true;
70             }
71         }
72     }
73     return false;
76 Y.mix(Y.Selector.pseudos, {
77     'root': function(node) {
78         return node === node.ownerDocument.documentElement;
79     },
81     'nth-child': function(node, expr) {
82         return Y.Selector._getNth(node, expr);
83     },
85     'nth-last-child': function(node, expr) {
86         return Y.Selector._getNth(node, expr, null, true);
87     },
89     'nth-of-type': function(node, expr) {
90         return Y.Selector._getNth(node, expr, node.tagName);
91     },
92      
93     'nth-last-of-type': function(node, expr) {
94         return Y.Selector._getNth(node, expr, node.tagName, true);
95     },
96      
97     'last-child': function(node) {
98         var children = Y.DOM._children(node.parentNode);
99         return children[children.length - 1] === node;
100     },
102     'first-of-type': function(node) {
103         return Y.DOM._children(node.parentNode, node.tagName)[0] === node;
104     },
105      
106     'last-of-type': function(node) {
107         var children = Y.DOM._children(node.parentNode, node.tagName);
108         return children[children.length - 1] === node;
109     },
110      
111     'only-child': function(node) {
112         var children = Y.DOM._children(node.parentNode);
113         return children.length === 1 && children[0] === node;
114     },
116     'only-of-type': function(node) {
117         var children = Y.DOM._children(node.parentNode, node.tagName);
118         return children.length === 1 && children[0] === node;
119     },
121     'empty': function(node) {
122         return node.childNodes.length === 0;
123     },
125     'not': function(node, expr) {
126         return !Y.Selector.test(node, expr);
127     },
129     'contains': function(node, expr) {
130         var text = node.innerText || node.textContent || '';
131         return text.indexOf(expr) > -1;
132     },
134     'checked': function(node) {
135         return (node.checked === true || node.selected === true);
136     },
138     enabled: function(node) {
139         return (node.disabled !== undefined && !node.disabled);
140     },
142     disabled: function(node) {
143         return (node.disabled);
144     }
147 Y.mix(Y.Selector.operators, {
148     '^=': '^{val}', // Match starts with value
149     '$=': '{val}$', // Match ends with value
150     '*=': '{val}' // Match contains value as substring 
153 Y.Selector.combinators['~'] = {
154     axis: 'previousSibling'
158 }, '3.5.1' ,{requires:['selector-native', 'selector-css2']});