<?xml version="1.0">
<html
xmlns="http://www.w3.org/TR/html4/"
xmlns:empathy="http://live.gnome.org/Empathy">
<head>
<style type="text/css">
html, body, div, p {
padding: 0;
margin: 1px;
}
body {
margin-left: -1em;
}
div.row {
margin-left: 1em;
clear: both;
}
div.row p {
display: inline;
white-space: pre-wrap;
}
span.open:after {
content: "\25BE";
margin-right: 2px;
}
span.closed:after {
content: "\25B8";
margin-right: 2px;
}
span.date {
float: right;
color: gray;
}
img.icon {
vertical-align: middle;
padding-right: 1px;
}
</style>
<script type="text/javascript">
var EMPATHY_NS='http://live.gnome.org/Empathy';
function filterNodes (node, tagName)
{
var out = new Array();
for (var i = 0; i < node.childNodes.length; i++)
{
var elem = node.childNodes[i];
if (elem.tagName == tagName)
out.push(elem);
}
return out;
}
function getNodes(node)
{
return filterNodes(node, 'DIV');
}
function getContent(node)
{
return filterNodes(node, 'P')[0];
}
function getToggle(node)
{
return filterNodes(node, 'SPAN')[0];
}
function setExpander(node, open)
{
var toggle = getToggle(node);
var display;
var nodes;
if (open)
{
toggle.setAttribute('class', 'open');
display = 'block';
}
else
{
toggle.setAttribute('class', 'closed');
display = 'none';
}
nodes = getNodes(node);
for (var i = 0; i < nodes.length; i++)
nodes[i].style.display = display;
}
function expandAll()
{
function expandAllRecurse(node)
{
var nodes = getNodes(node);
for (var i = 0; i < nodes.length; i++)
{
setExpander(nodes[i], true);
expandAllRecurse(nodes[i]);
}
}
var treeview = document.getElementById('treeview');
expandAllRecurse(treeview);
}
function setContent (contents, text, icon, date_)
{
contents.innerHTML = "";
if (icon != "")
{
contents.innerHTML += '<img class="icon" src="' + icon + '"/>';
}
contents.innerHTML += text;
contents.innerHTML += '<span class="date">' + date_ + '</span>';
}
function insertRow (path, text, icon, date_)
{
var treeview = document.getElementById('treeview');
var parentnode = treeview;
var i;
// walk the tree
for (i = 0; i < path.length - 1; i++)
parentnode = getNodes(parentnode)[path[i]];
// create a new node
var newnode = document.createElement('div');
newnode.setAttribute('class', 'row');
// insert the new node into the tree
var nodes = getNodes(parentnode);
if (path[i] >= nodes.length)
parentnode.appendChild(newnode);
else
parentnode.insertBefore(newnode, nodes[path[i]]);
// set the path
newnode.setAttributeNS(EMPATHY_NS, 'path', path.join(':'));
// add an expander
var toggle = document.createElement('span');
newnode.appendChild(toggle);
toggle.setAttribute('class', 'closed');
toggle.style.display = 'none';
var contents = document.createElement('p');
newnode.appendChild(contents);
setContent(contents, text, icon, date_);
function toggleExpander (e)
{
if (toggle.getAttribute('class') == 'closed')
setExpander(newnode, true);
else
setExpander(newnode, false);
};
toggle.onclick = toggleExpander;
contents.ondblclick = toggleExpander;
// if the node is not a top-level node, hide it
if (parentnode != treeview)
newnode.style.display = 'none';
}
function changeRow (path, text, icon, date_)
{
var treeview = document.getElementById('treeview');
var node = treeview;
// walk the tree
for (var i = 0; i < path.length; i++)
node = getNodes(node)[path[i]];
// set the contents
var contents = getContent(node);
setContent(contents, text, icon, date_);
}
function deleteRow (path)
{
var treeview = document.getElementById('treeview');
var node = treeview;
// walk the tree
for (var i = 0; i < path.length; i++)
node = getNodes(node)[path[i]];
node.parentNode.removeChild(node);
}
function reorderRows (path, new_order)
{
var treeview = document.getElementById('treeview');
var node = treeview;
// walk the tree
for (var i = 0; i < path.length; i++)
node = getNodes(node)[path[i]];
var nodes = getNodes(node);
// remove all the nodes from the DOM
for (var i = 0; i < nodes.length; i++)
node.removeChild(nodes[i]);
// put them back in the new order
// For reference: new_order[new_pos] = old_pos
for (var i = 0; i < nodes.length; i++)
node.appendChild(nodes[new_order[i]]);
// recursively update the path
function updatePaths(path, node)
{
var nodes = getNodes(node);
for (var i = 0; i < nodes.length; i++)
{
var newpath = path.concat([i]);
nodes[i].setAttributeNS(EMPATHY_NS, 'path', newpath.join(':'));
updatePaths(newpath, nodes[i]);
}
}
updatePaths(path, node);
}
function hasChildRows (path, has_children)
{
var treeview = document.getElementById('treeview');
var node = treeview;
// walk the tree
for (var i = 0; i < path.length; i++)
node = getNodes(node)[path[i]];
var toggle = getToggle(node);
if (has_children)
toggle.style.display = 'inline';
else
toggle.style.display = 'none';
}
function getOffset (node)
{
var y = 0;
while (node != null && !isNaN(node.offsetTop))
{
y += node.offsetTop - node.scrollTop;
node = node.offsetParent;
}
return y;
}
function scrollToRow (path)
{
var treeview = document.getElementById('treeview');
var node = treeview;
// walk the tree
for (var i = 0; i < path.length; i++)
node = getNodes(node)[path[i]];
window.scrollTo(0, getOffset(node));
}
</script>
</head>
<body>
<div id="treeview">
</div>
</body>
</html>