3 <style type="text/css">
5 /* FIXME: how do we set the application font? */
16 white-space: pre-wrap;
29 <script type="text/javascript">
30 function filterNodes (node, tagName)
32 var out = new Array();
34 for (var i = 0; i < node.childNodes.length; i++)
36 var elem = node.childNodes[i];
38 if (elem.tagName == tagName)
45 function getNodes(node)
47 return filterNodes(node, 'DIV');
50 function getContent(node)
52 return filterNodes(node, 'P')[0];
55 function getToggle(node)
57 return filterNodes(node, 'SPAN')[0];
60 function toggleExpander(node, open)
62 var toggle = getToggle(node);
68 toggle.setAttribute('class', 'open');
73 toggle.setAttribute('class', 'closed');
77 nodes = getNodes(node);
79 for (var i = 0; i < nodes.length; i++)
80 nodes[i].style.display = display;
83 function insertRow (path, text)
85 var treeview = document.getElementById('treeview');
86 var parentnode = treeview;
90 for (i = 0; i < path.length - 1; i++)
91 parentnode = getNodes(parentnode)[path[i]];
94 var newnode = document.createElement('div');
95 newnode.setAttribute('class', 'row');
97 // insert the new node into the tree
98 var nodes = getNodes(parentnode);
100 // console.log("path = " + path);
101 // console.log("i = " + i + ", path[i] = " + path[i] + ", nodes.length = " +
104 if (path[i] >= nodes.length)
105 parentnode.appendChild(newnode);
107 parentnode.insertBefore(newnode, nodes[path[i]]);
110 var toggle = document.createElement('span');
111 newnode.appendChild(toggle);
112 toggle.setAttribute('class', 'closed');
113 toggle.style.display = 'none';
115 toggle.onclick = function (e)
117 if (toggle.getAttribute('class') == 'closed')
118 toggleExpander(newnode, true);
120 toggleExpander(newnode, false);
123 var contents = document.createElement('p');
124 newnode.appendChild(contents);
125 contents.innerHTML = text;
127 // if the node is not a top-level node, hide it
128 if (parentnode != treeview)
129 newnode.style.display = 'none';
132 function changeRow (path, text)
134 var treeview = document.getElementById('treeview');
137 // console.log("path = " + path + ", text = '" + text + "'");
140 for (var i = 0; i < path.length; i++)
141 node = getNodes(node)[path[i]];
144 var contents = getContent(node);
145 contents.innerHTML = text;
148 function deleteRow (path)
150 var treeview = document.getElementById('treeview');
154 for (var i = 0; i < path.length; i++)
155 node = getNodes(node)[path[i]];
157 node.parentNode.removeChild(node);
160 function reorderRows (path, new_order)
162 var treeview = document.getElementById('treeview');
166 for (var i = 0; i < path.length; i++)
167 node = getNodes(node)[path[i]];
169 var nodes = getNodes(node);
171 // remove all the nodes from the DOM
172 for (var i = 0; i < nodes.length; i++)
173 node.removeChild(nodes[i]);
175 // put them back in the new order
176 // For reference: new_order[new_pos] = old_pos
177 for (var i = 0; i < nodes.length; i++)
178 node.appendChild(nodes[new_order[i]]);
181 function hasChildRows (path, has_children)
183 var treeview = document.getElementById('treeview');
187 for (var i = 0; i < path.length; i++)
188 node = getNodes(node)[path[i]];
190 var toggle = getToggle(node);
193 toggle.style.display = 'inline';
195 toggle.style.display = 'none';