1 var $, ElementsRenderer, NodeElement, html_escape, node_element, util;
3 node_element = require('./node_element');
5 NodeElement = node_element.NodeElement;
7 util = require('./util');
9 html_escape = util.html_escape;
13 ElementsRenderer = (function() {
14 function ElementsRenderer(tree_widget) {
15 this.tree_widget = tree_widget;
16 this.opened_icon_element = this.createButtonElement(tree_widget.options.openedIcon);
17 this.closed_icon_element = this.createButtonElement(tree_widget.options.closedIcon);
20 ElementsRenderer.prototype.render = function(from_node) {
21 if (from_node && from_node.parent) {
22 return this.renderFromNode(from_node);
24 return this.renderFromRoot();
28 ElementsRenderer.prototype.renderFromRoot = function() {
30 $element = this.tree_widget.element;
32 return this.createDomElements($element[0], this.tree_widget.tree.children, true, true, 1);
35 ElementsRenderer.prototype.renderFromNode = function(node) {
37 $previous_li = $(node.element);
38 li = this.createLi(node, node.getLevel());
39 this.attachNodeData(node, li);
40 $previous_li.after(li);
41 $previous_li.remove();
43 return this.createDomElements(li, node.children, false, false, node.getLevel() + 1);
47 ElementsRenderer.prototype.createDomElements = function(element, children, is_root_node, is_open, level) {
48 var child, i, len, li, ul;
49 ul = this.createUl(is_root_node);
50 element.appendChild(ul);
51 for (i = 0, len = children.length; i < len; i++) {
53 li = this.createLi(child, level);
55 this.attachNodeData(child, li);
56 if (child.hasChildren()) {
57 this.createDomElements(li, child.children, false, child.is_open, level + 1);
63 ElementsRenderer.prototype.attachNodeData = function(node, li) {
65 return $(li).data('node', node);
68 ElementsRenderer.prototype.createUl = function(is_root_node) {
69 var class_string, role, ul;
74 class_string = 'jqtree-tree';
76 if (this.tree_widget.options.rtl) {
77 class_string += ' jqtree-rtl';
80 ul = document.createElement('ul');
81 ul.className = "jqtree_common " + class_string;
82 ul.setAttribute('role', role);
86 ElementsRenderer.prototype.createLi = function(node, level) {
88 is_selected = this.tree_widget.select_node_handler && this.tree_widget.select_node_handler.isNodeSelected(node);
89 if (node.isFolder()) {
90 li = this.createFolderLi(node, level, is_selected);
92 li = this.createNodeLi(node, level, is_selected);
94 if (this.tree_widget.options.onCreateLi) {
95 this.tree_widget.options.onCreateLi(node, $(li));
100 ElementsRenderer.prototype.createFolderLi = function(node, level, is_selected) {
101 var button_classes, button_link, div, folder_classes, icon_element, is_folder, li;
102 button_classes = this.getButtonClasses(node);
103 folder_classes = this.getFolderClasses(node, is_selected);
105 icon_element = this.opened_icon_element;
107 icon_element = this.closed_icon_element;
109 li = document.createElement('li');
110 li.className = "jqtree_common " + folder_classes;
111 li.setAttribute('role', 'presentation');
112 div = document.createElement('div');
113 div.className = "jqtree-element jqtree_common";
114 div.setAttribute('role', 'presentation');
116 button_link = document.createElement('a');
117 button_link.className = button_classes;
118 button_link.appendChild(icon_element.cloneNode(false));
119 button_link.setAttribute('role', 'presentation');
120 button_link.setAttribute('aria-hidden', 'true');
121 if (this.tree_widget.options.buttonLeft) {
122 div.appendChild(button_link);
124 div.appendChild(this.createTitleSpan(node.name, level, is_selected, node.is_open, is_folder = true));
125 if (!this.tree_widget.options.buttonLeft) {
126 div.appendChild(button_link);
131 ElementsRenderer.prototype.createNodeLi = function(node, level, is_selected) {
132 var class_string, div, is_folder, li, li_classes;
133 li_classes = ['jqtree_common'];
135 li_classes.push('jqtree-selected');
137 class_string = li_classes.join(' ');
138 li = document.createElement('li');
139 li.className = class_string;
140 li.setAttribute('role', 'presentation');
141 div = document.createElement('div');
142 div.className = "jqtree-element jqtree_common";
143 div.setAttribute('role', 'presentation');
145 div.appendChild(this.createTitleSpan(node.name, level, is_selected, node.is_open, is_folder = false));
149 ElementsRenderer.prototype.createTitleSpan = function(node_name, level, is_selected, is_open, is_folder) {
150 var classes, title_span;
151 title_span = document.createElement('span');
152 classes = "jqtree-title jqtree_common";
154 classes += " jqtree-title-folder";
156 title_span.className = classes;
157 title_span.setAttribute('role', 'treeitem');
158 title_span.setAttribute('aria-level', level);
159 title_span.setAttribute('aria-selected', util.getBoolString(is_selected));
160 title_span.setAttribute('aria-expanded', util.getBoolString(is_open));
162 title_span.setAttribute('tabindex', 0);
164 title_span.innerHTML = this.escapeIfNecessary(node_name);
168 ElementsRenderer.prototype.getButtonClasses = function(node) {
170 classes = ['jqtree-toggler', 'jqtree_common'];
172 classes.push('jqtree-closed');
174 if (this.tree_widget.options.buttonLeft) {
175 classes.push('jqtree-toggler-left');
177 classes.push('jqtree-toggler-right');
179 return classes.join(' ');
182 ElementsRenderer.prototype.getFolderClasses = function(node, is_selected) {
184 classes = ['jqtree-folder'];
186 classes.push('jqtree-closed');
189 classes.push('jqtree-selected');
191 if (node.is_loading) {
192 classes.push('jqtree-loading');
194 return classes.join(' ');
197 ElementsRenderer.prototype.escapeIfNecessary = function(value) {
198 if (this.tree_widget.options.autoEscape) {
199 return html_escape(value);
205 ElementsRenderer.prototype.createButtonElement = function(value) {
207 if (typeof value === 'string') {
208 div = document.createElement('div');
209 div.innerHTML = value;
210 return document.createTextNode(div.innerHTML);
216 return ElementsRenderer;
220 module.exports = ElementsRenderer;