--- /dev/null
+var $, ElementsRenderer, NodeElement, html_escape, node_element, util;
+
+node_element = require('./node_element');
+
+NodeElement = node_element.NodeElement;
+
+util = require('./util');
+
+html_escape = util.html_escape;
+
+$ = jQuery;
+
+ElementsRenderer = (function() {
+ function ElementsRenderer(tree_widget) {
+ this.tree_widget = tree_widget;
+ this.opened_icon_element = this.createButtonElement(tree_widget.options.openedIcon);
+ this.closed_icon_element = this.createButtonElement(tree_widget.options.closedIcon);
+ }
+
+ ElementsRenderer.prototype.render = function(from_node) {
+ if (from_node && from_node.parent) {
+ return this.renderFromNode(from_node);
+ } else {
+ return this.renderFromRoot();
+ }
+ };
+
+ ElementsRenderer.prototype.renderFromRoot = function() {
+ var $element;
+ $element = this.tree_widget.element;
+ $element.empty();
+ return this.createDomElements($element[0], this.tree_widget.tree.children, true, true, 1);
+ };
+
+ ElementsRenderer.prototype.renderFromNode = function(node) {
+ var $previous_li, li;
+ $previous_li = $(node.element);
+ li = this.createLi(node, node.getLevel());
+ this.attachNodeData(node, li);
+ $previous_li.after(li);
+ $previous_li.remove();
+ if (node.children) {
+ return this.createDomElements(li, node.children, false, false, node.getLevel() + 1);
+ }
+ };
+
+ ElementsRenderer.prototype.createDomElements = function(element, children, is_root_node, is_open, level) {
+ var child, i, len, li, ul;
+ ul = this.createUl(is_root_node);
+ element.appendChild(ul);
+ for (i = 0, len = children.length; i < len; i++) {
+ child = children[i];
+ li = this.createLi(child, level);
+ ul.appendChild(li);
+ this.attachNodeData(child, li);
+ if (child.hasChildren()) {
+ this.createDomElements(li, child.children, false, child.is_open, level + 1);
+ }
+ }
+ return null;
+ };
+
+ ElementsRenderer.prototype.attachNodeData = function(node, li) {
+ node.element = li;
+ return $(li).data('node', node);
+ };
+
+ ElementsRenderer.prototype.createUl = function(is_root_node) {
+ var class_string, role, ul;
+ if (!is_root_node) {
+ class_string = '';
+ role = 'group';
+ } else {
+ class_string = 'jqtree-tree';
+ role = 'tree';
+ if (this.tree_widget.options.rtl) {
+ class_string += ' jqtree-rtl';
+ }
+ }
+ ul = document.createElement('ul');
+ ul.className = "jqtree_common " + class_string;
+ ul.setAttribute('role', role);
+ return ul;
+ };
+
+ ElementsRenderer.prototype.createLi = function(node, level) {
+ var is_selected, li;
+ is_selected = this.tree_widget.select_node_handler && this.tree_widget.select_node_handler.isNodeSelected(node);
+ if (node.isFolder()) {
+ li = this.createFolderLi(node, level, is_selected);
+ } else {
+ li = this.createNodeLi(node, level, is_selected);
+ }
+ if (this.tree_widget.options.onCreateLi) {
+ this.tree_widget.options.onCreateLi(node, $(li));
+ }
+ return li;
+ };
+
+ ElementsRenderer.prototype.createFolderLi = function(node, level, is_selected) {
+ var button_classes, button_link, div, folder_classes, icon_element, is_folder, li;
+ button_classes = this.getButtonClasses(node);
+ folder_classes = this.getFolderClasses(node, is_selected);
+ if (node.is_open) {
+ icon_element = this.opened_icon_element;
+ } else {
+ icon_element = this.closed_icon_element;
+ }
+ li = document.createElement('li');
+ li.className = "jqtree_common " + folder_classes;
+ li.setAttribute('role', 'presentation');
+ div = document.createElement('div');
+ div.className = "jqtree-element jqtree_common";
+ div.setAttribute('role', 'presentation');
+ li.appendChild(div);
+ button_link = document.createElement('a');
+ button_link.className = button_classes;
+ button_link.appendChild(icon_element.cloneNode(false));
+ button_link.setAttribute('role', 'presentation');
+ button_link.setAttribute('aria-hidden', 'true');
+ if (this.tree_widget.options.buttonLeft) {
+ div.appendChild(button_link);
+ }
+ div.appendChild(this.createTitleSpan(node.name, level, is_selected, node.is_open, is_folder = true));
+ if (!this.tree_widget.options.buttonLeft) {
+ div.appendChild(button_link);
+ }
+ return li;
+ };
+
+ ElementsRenderer.prototype.createNodeLi = function(node, level, is_selected) {
+ var class_string, div, is_folder, li, li_classes;
+ li_classes = ['jqtree_common'];
+ if (is_selected) {
+ li_classes.push('jqtree-selected');
+ }
+ class_string = li_classes.join(' ');
+ li = document.createElement('li');
+ li.className = class_string;
+ li.setAttribute('role', 'presentation');
+ div = document.createElement('div');
+ div.className = "jqtree-element jqtree_common";
+ div.setAttribute('role', 'presentation');
+ li.appendChild(div);
+ div.appendChild(this.createTitleSpan(node.name, level, is_selected, node.is_open, is_folder = false));
+ return li;
+ };
+
+ ElementsRenderer.prototype.createTitleSpan = function(node_name, level, is_selected, is_open, is_folder) {
+ var classes, title_span;
+ title_span = document.createElement('span');
+ classes = "jqtree-title jqtree_common";
+ if (is_folder) {
+ classes += " jqtree-title-folder";
+ }
+ title_span.className = classes;
+ title_span.setAttribute('role', 'treeitem');
+ title_span.setAttribute('aria-level', level);
+ title_span.setAttribute('aria-selected', util.getBoolString(is_selected));
+ title_span.setAttribute('aria-expanded', util.getBoolString(is_open));
+ if (is_selected) {
+ title_span.setAttribute('tabindex', 0);
+ }
+ title_span.innerHTML = this.escapeIfNecessary(node_name);
+ return title_span;
+ };
+
+ ElementsRenderer.prototype.getButtonClasses = function(node) {
+ var classes;
+ classes = ['jqtree-toggler', 'jqtree_common'];
+ if (!node.is_open) {
+ classes.push('jqtree-closed');
+ }
+ if (this.tree_widget.options.buttonLeft) {
+ classes.push('jqtree-toggler-left');
+ } else {
+ classes.push('jqtree-toggler-right');
+ }
+ return classes.join(' ');
+ };
+
+ ElementsRenderer.prototype.getFolderClasses = function(node, is_selected) {
+ var classes;
+ classes = ['jqtree-folder'];
+ if (!node.is_open) {
+ classes.push('jqtree-closed');
+ }
+ if (is_selected) {
+ classes.push('jqtree-selected');
+ }
+ if (node.is_loading) {
+ classes.push('jqtree-loading');
+ }
+ return classes.join(' ');
+ };
+
+ ElementsRenderer.prototype.escapeIfNecessary = function(value) {
+ if (this.tree_widget.options.autoEscape) {
+ return html_escape(value);
+ } else {
+ return value;
+ }
+ };
+
+ ElementsRenderer.prototype.createButtonElement = function(value) {
+ var div;
+ if (typeof value === 'string') {
+ div = document.createElement('div');
+ div.innerHTML = value;
+ return document.createTextNode(div.innerHTML);
+ } else {
+ return $(value)[0];
+ }
+ };
+
+ return ElementsRenderer;
+
+})();
+
+module.exports = ElementsRenderer;