]> git.wh0rd.org - tt-rss.git/blob - lib/dojo/dom-class.js.uncompressed.js
update dojo to 1.7.3
[tt-rss.git] / lib / dojo / dom-class.js.uncompressed.js
1 define("dojo/dom-class", ["./_base/lang", "./_base/array", "./dom"], function(lang, array, dom){
2 // module:
3 // dojo/dom-class
4 // summary:
5 // This module defines the core dojo DOM class API.
6
7 var className = "className";
8
9 /* Part I of classList-based implementation is preserved here for posterity
10 var classList = "classList";
11 has.add("dom-classList", function(){
12 return classList in document.createElement("p");
13 });
14 */
15
16 // =============================
17 // (CSS) Class Functions
18 // =============================
19
20 /*=====
21 dojo.hasClass = function(node, classStr){
22 // summary:
23 // Returns whether or not the specified classes are a portion of the
24 // class list currently applied to the node.
25 //
26 // node: String|DOMNode
27 // String ID or DomNode reference to check the class for.
28 //
29 // classStr: String
30 // A string class name to look for.
31 //
32 // returns: Boolean
33 //
34 // example:
35 // Do something if a node with id="someNode" has class="aSillyClassName" present
36 // | if(dojo.hasClass("someNode","aSillyClassName")){ ... }
37 };
38 =====*/
39
40 /*=====
41 dojo.addClass = function(node, classStr){
42 // summary:
43 // Adds the specified classes to the end of the class list on the
44 // passed node. Will not re-apply duplicate classes.
45 //
46 // node: String|DOMNode
47 // String ID or DomNode reference to add a class string too
48 //
49 // classStr: String|Array
50 // A String class name to add, or several space-separated class names,
51 // or an array of class names.
52 //
53 // example:
54 // Add a class to some node:
55 // | dojo.addClass("someNode", "anewClass");
56 //
57 // example:
58 // Add two classes at once:
59 // | dojo.addClass("someNode", "firstClass secondClass");
60 //
61 // example:
62 // Add two classes at once (using array):
63 // | dojo.addClass("someNode", ["firstClass", "secondClass"]);
64 //
65 // example:
66 // Available in `dojo.NodeList` for multiple additions
67 // | dojo.query("ul > li").addClass("firstLevel");
68 };
69 =====*/
70
71 /*=====
72 dojo.removeClass = function(node, classStr){
73 // summary:
74 // Removes the specified classes from node. No `dojo.hasClass`
75 // check is required.
76 //
77 // node: String|DOMNode
78 // String ID or DomNode reference to remove the class from.
79 //
80 // classStr: String|Array
81 // An optional String class name to remove, or several space-separated
82 // class names, or an array of class names. If omitted, all class names
83 // will be deleted.
84 //
85 // example:
86 // Remove a class from some node:
87 // | dojo.removeClass("someNode", "firstClass");
88 //
89 // example:
90 // Remove two classes from some node:
91 // | dojo.removeClass("someNode", "firstClass secondClass");
92 //
93 // example:
94 // Remove two classes from some node (using array):
95 // | dojo.removeClass("someNode", ["firstClass", "secondClass"]);
96 //
97 // example:
98 // Remove all classes from some node:
99 // | dojo.removeClass("someNode");
100 //
101 // example:
102 // Available in `dojo.NodeList()` for multiple removal
103 // | dojo.query(".foo").removeClass("foo");
104 };
105 =====*/
106
107 /*=====
108 dojo.replaceClass = function(node, addClassStr, removeClassStr){
109 // summary:
110 // Replaces one or more classes on a node if not present.
111 // Operates more quickly than calling dojo.removeClass and dojo.addClass
112 //
113 // node: String|DOMNode
114 // String ID or DomNode reference to remove the class from.
115 //
116 // addClassStr: String|Array
117 // A String class name to add, or several space-separated class names,
118 // or an array of class names.
119 //
120 // removeClassStr: String|Array?
121 // A String class name to remove, or several space-separated class names,
122 // or an array of class names.
123 //
124 // example:
125 // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2");
126 //
127 // example:
128 // Replace all classes with addMe
129 // | dojo.replaceClass("someNode", "addMe");
130 //
131 // example:
132 // Available in `dojo.NodeList()` for multiple toggles
133 // | dojo.query(".findMe").replaceClass("addMe", "removeMe");
134 };
135 =====*/
136
137 /*=====
138 dojo.toggleClass = function(node, classStr, condition){
139 // summary:
140 // Adds a class to node if not present, or removes if present.
141 // Pass a boolean condition if you want to explicitly add or remove.
142 // Returns the condition that was specified directly or indirectly.
143 //
144 // node: String|DOMNode
145 // String ID or DomNode reference to toggle a class string
146 //
147 // classStr: String|Array
148 // A String class name to toggle, or several space-separated class names,
149 // or an array of class names.
150 //
151 // condition:
152 // If passed, true means to add the class, false means to remove.
153 // Otherwise dojo.hasClass(node, classStr) is used to detect the class presence.
154 //
155 // example:
156 // | dojo.toggleClass("someNode", "hovered");
157 //
158 // example:
159 // Forcefully add a class
160 // | dojo.toggleClass("someNode", "hovered", true);
161 //
162 // example:
163 // Available in `dojo.NodeList()` for multiple toggles
164 // | dojo.query(".toggleMe").toggleClass("toggleMe");
165 };
166 =====*/
167
168 var cls, // exports object
169 spaces = /\s+/, a1 = [""];
170
171 function str2array(s){
172 if(typeof s == "string" || s instanceof String){
173 if(s && !spaces.test(s)){
174 a1[0] = s;
175 return a1;
176 }
177 var a = s.split(spaces);
178 if(a.length && !a[0]){
179 a.shift();
180 }
181 if(a.length && !a[a.length - 1]){
182 a.pop();
183 }
184 return a;
185 }
186 // assumed to be an array
187 if(!s){
188 return [];
189 }
190 return array.filter(s, function(x){ return x; });
191 }
192
193 /* Part II of classList-based implementation is preserved here for posterity
194 if(has("dom-classList")){
195 // new classList version
196 cls = {
197 contains: function containsClass(node, classStr){
198 var clslst = classStr && dom.byId(node)[classList];
199 return clslst && clslst.contains(classStr); // Boolean
200 },
201
202 add: function addClass(node, classStr){
203 node = dom.byId(node);
204 classStr = str2array(classStr);
205 for(var i = 0, len = classStr.length; i < len; ++i){
206 node[classList].add(classStr[i]);
207 }
208 },
209
210 remove: function removeClass(node, classStr){
211 node = dom.byId(node);
212 if(classStr === undefined){
213 node[className] = "";
214 }else{
215 classStr = str2array(classStr);
216 for(var i = 0, len = classStr.length; i < len; ++i){
217 node[classList].remove(classStr[i]);
218 }
219 }
220 },
221
222 replace: function replaceClass(node, addClassStr, removeClassStr){
223 node = dom.byId(node);
224 if(removeClassStr === undefined){
225 node[className] = "";
226 }else{
227 removeClassStr = str2array(removeClassStr);
228 for(var i = 0, len = removeClassStr.length; i < len; ++i){
229 node[classList].remove(removeClassStr[i]);
230 }
231 }
232 addClassStr = str2array(addClassStr);
233 for(i = 0, len = addClassStr.length; i < len; ++i){
234 node[classList].add(addClassStr[i]);
235 }
236 },
237
238 toggle: function toggleClass(node, classStr, condition){
239 node = dom.byId(node);
240 if(condition === undefined){
241 classStr = str2array(classStr);
242 for(var i = 0, len = classStr.length; i < len; ++i){
243 node[classList].toggle(classStr[i]);
244 }
245 }else{
246 cls[condition ? "add" : "remove"](node, classStr);
247 }
248 return condition; // Boolean
249 }
250 }
251 }
252 */
253
254 // regular DOM version
255 var fakeNode = {}; // for effective replacement
256 cls = {
257 contains: function containsClass(/*DomNode|String*/node, /*String*/classStr){
258 return ((" " + dom.byId(node)[className] + " ").indexOf(" " + classStr + " ") >= 0); // Boolean
259 },
260
261 add: function addClass(/*DomNode|String*/node, /*String|Array*/classStr){
262 node = dom.byId(node);
263 classStr = str2array(classStr);
264 var cls = node[className], oldLen;
265 cls = cls ? " " + cls + " " : " ";
266 oldLen = cls.length;
267 for(var i = 0, len = classStr.length, c; i < len; ++i){
268 c = classStr[i];
269 if(c && cls.indexOf(" " + c + " ") < 0){
270 cls += c + " ";
271 }
272 }
273 if(oldLen < cls.length){
274 node[className] = cls.substr(1, cls.length - 2);
275 }
276 },
277
278 remove: function removeClass(/*DomNode|String*/node, /*String|Array?*/classStr){
279 node = dom.byId(node);
280 var cls;
281 if(classStr !== undefined){
282 classStr = str2array(classStr);
283 cls = " " + node[className] + " ";
284 for(var i = 0, len = classStr.length; i < len; ++i){
285 cls = cls.replace(" " + classStr[i] + " ", " ");
286 }
287 cls = lang.trim(cls);
288 }else{
289 cls = "";
290 }
291 if(node[className] != cls){ node[className] = cls; }
292 },
293
294 replace: function replaceClass(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){
295 node = dom.byId(node);
296 fakeNode[className] = node[className];
297 cls.remove(fakeNode, removeClassStr);
298 cls.add(fakeNode, addClassStr);
299 if(node[className] !== fakeNode[className]){
300 node[className] = fakeNode[className];
301 }
302 },
303
304 toggle: function toggleClass(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){
305 node = dom.byId(node);
306 if(condition === undefined){
307 classStr = str2array(classStr);
308 for(var i = 0, len = classStr.length, c; i < len; ++i){
309 c = classStr[i];
310 cls[cls.contains(node, c) ? "remove" : "add"](node, c);
311 }
312 }else{
313 cls[condition ? "add" : "remove"](node, classStr);
314 }
315 return condition; // Boolean
316 }
317 };
318
319 return cls;
320 });