source: frontend/node_modules/nwsapi/src/modules/nwsapi-traversal.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/*
2 * Element Traversal methods from Juriy Zaytsev (kangax)
3 * used to emulate Prototype up/down/previous/next methods
4 */
5
6(function(D){
7
8 // TODO: all of this needs tests
9 var match = D.match, select = D.select, root = document.documentElement,
10
11 // Use the Element Traversal API if available.
12 nextElement = 'nextElementSibling',
13 previousElement = 'previousElementSibling',
14 parentElement = 'parentElement';
15
16 // Fall back to the DOM Level 1 API.
17 if (!(nextElement in root)) nextElement = 'nextSibling';
18 if (!(previousElement in root)) previousElement = 'previousSibling';
19 if (!(parentElement in root)) parentElement = 'parentNode';
20
21 function walkElements(property, element, expr) {
22 var i = 0, isIndex = typeof expr == 'number';
23 if (typeof expr == 'undefined') {
24 isIndex = true;
25 expr = 0;
26 }
27 while ((element = element[property])) {
28 if (element.nodeType != 1) continue;
29 if (isIndex) {
30 ++i;
31 if (i == expr) return element;
32 } else if (match(element, expr)) {
33 return element;
34 }
35 }
36 return null;
37 }
38
39 /**
40 * @method up
41 * @param {HTMLElement} element element to walk from
42 * @param {String | Number} expr CSS expression or an index
43 * @return {HTMLElement | null}
44 */
45 function up(element, expr) {
46 return walkElements(parentElement, element, expr);
47 }
48 /**
49 * @method next
50 * @param {HTMLElement} element element to walk from
51 * @param {String | Number} expr CSS expression or an index
52 * @return {HTMLElement | null}
53 */
54 function next(element, expr) {
55 return walkElements(nextElement, element, expr);
56 }
57 /**
58 * @method previous
59 * @param {HTMLElement} element element to walk from
60 * @param {String | Number} expr CSS expression or an index
61 * @return {HTMLElement | null}
62 */
63 function previous(element, expr) {
64 return walkElements(previousElement, element, expr);
65 }
66 /**
67 * @method down
68 * @param {HTMLElement} element element to walk from
69 * @param {String | Number} expr CSS expression or an index
70 * @return {HTMLElement | null}
71 */
72 function down(element, expr) {
73 var isIndex = typeof expr == 'number', descendants, index, descendant;
74 if (expr === null) {
75 element = element.firstChild;
76 while (element && element.nodeType != 1) element = element[nextElement];
77 return element;
78 }
79 if (!isIndex && match(element, expr) || isIndex && expr === 0) return element;
80 descendants = select('*', element);
81 if (isIndex) return descendants[expr] || null;
82 index = 0;
83 while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; }
84 return descendant || null;
85 }
86 D.up = up;
87 D.down = down;
88 D.next = next;
89 D.previous = previous;
90})(NW.Dom);
Note: See TracBrowser for help on using the repository browser.