3 <style type="text/css">
20 white-space: pre-wrap;
39 vertical-align: middle;
43 <script type="text/javascript">
44 function filterNodes (node, tagName)
46 var out = new Array();
48 for (var i = 0; i < node.childNodes.length; i++)
50 var elem = node.childNodes[i];
52 if (elem.tagName == tagName)
59 function getNodes(node)
61 return filterNodes(node, 'DIV');
64 function getContent(node)
66 return filterNodes(node, 'P')[0];
69 function getToggle(node)
71 return filterNodes(node, 'SPAN')[0];
74 function setExpander(node, open)
76 var toggle = getToggle(node);
82 toggle.setAttribute('class', 'open');
87 toggle.setAttribute('class', 'closed');
91 nodes = getNodes(node);
93 for (var i = 0; i < nodes.length; i++)
94 nodes[i].style.display = display;
99 function expandAllRecurse(node)
101 var nodes = getNodes(node);
103 for (var i = 0; i < nodes.length; i++)
105 setExpander(nodes[i], true);
107 expandAllRecurse(nodes[i]);
111 var treeview = document.getElementById('treeview');
113 expandAllRecurse(treeview);
116 function setContent (contents, text, icon, date_)
118 contents.innerHTML = "";
122 contents.innerHTML += '<img class="icon" src="' + icon + '"/>';
125 contents.innerHTML += text;
126 contents.innerHTML += '<span class="date">' + date_ + '</span>';
129 function insertRow (path, text, icon, date_)
131 var treeview = document.getElementById('treeview');
132 var parentnode = treeview;
136 for (i = 0; i < path.length - 1; i++)
137 parentnode = getNodes(parentnode)[path[i]];
140 var newnode = document.createElement('div');
141 newnode.setAttribute('class', 'row');
143 // insert the new node into the tree
144 var nodes = getNodes(parentnode);
146 if (path[i] >= nodes.length)
147 parentnode.appendChild(newnode);
149 parentnode.insertBefore(newnode, nodes[path[i]]);
152 var toggle = document.createElement('span');
153 newnode.appendChild(toggle);
154 toggle.setAttribute('class', 'closed');
155 toggle.style.display = 'none';
157 var contents = document.createElement('p');
158 newnode.appendChild(contents);
159 setContent(contents, text, icon, date_);
161 function toggleExpander (e)
163 if (toggle.getAttribute('class') == 'closed')
164 setExpander(newnode, true);
166 setExpander(newnode, false);
169 toggle.onclick = toggleExpander;
170 contents.ondblclick = toggleExpander;
172 // if the node is not a top-level node, hide it
173 if (parentnode != treeview)
174 newnode.style.display = 'none';
177 function changeRow (path, text, icon, date_)
179 var treeview = document.getElementById('treeview');
183 for (var i = 0; i < path.length; i++)
184 node = getNodes(node)[path[i]];
187 var contents = getContent(node);
188 setContent(contents, text, icon, date_);
191 function deleteRow (path)
193 var treeview = document.getElementById('treeview');
197 for (var i = 0; i < path.length; i++)
198 node = getNodes(node)[path[i]];
200 node.parentNode.removeChild(node);
203 function reorderRows (path, new_order)
205 var treeview = document.getElementById('treeview');
209 for (var i = 0; i < path.length; i++)
210 node = getNodes(node)[path[i]];
212 var nodes = getNodes(node);
214 // remove all the nodes from the DOM
215 for (var i = 0; i < nodes.length; i++)
216 node.removeChild(nodes[i]);
218 // put them back in the new order
219 // For reference: new_order[new_pos] = old_pos
220 for (var i = 0; i < nodes.length; i++)
221 node.appendChild(nodes[new_order[i]]);
224 function hasChildRows (path, has_children)
226 var treeview = document.getElementById('treeview');
230 for (var i = 0; i < path.length; i++)
231 node = getNodes(node)[path[i]];
233 var toggle = getToggle(node);
236 toggle.style.display = 'inline';
238 toggle.style.display = 'none';