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