function tree_expand(id)
{
    tree_collapse_all(id);
    hide('col_' + id);
    show('exp_' + id);
    hide('line_col_' + id);
    show('line_exp_' + id);
}

function tree_collapse(id)
{
    tree_revert(id);
    show('col_' + id);
    hide('exp_' + id);
    show('line_col_' + id);
    hide('line_exp_' + id);
}

function tree_collapse_all(id)
{
    var tree = document.getElementById('catalog_tree');
    var subtree;

    for(var i=0; i<tree.childNodes.length; i++) {
        if (tree.childNodes[i].id && tree.childNodes[i].id.substr(0,4)=='exp_') {
            subtree = tree.childNodes[i];
        }
    }

    var divs = subtree.getElementsByTagName('div');

    // Slow.... create faster solution
    for(var i=0; i<divs.length; i++) {
        var id = divs[i].id;
        if (id && id.substr(0,4)=='col_'){
            var part_id = id.substr(4,id.length-4);
            tree_collapse(part_id);
        }
    }
}

function tree_highlight(id)
{
    el = document.getElementById('col_'+id);
    var nodes = el.childNodes;
    for(var i=0; i<nodes.length; i++) {
        var clsnm = nodes[i].className;
        if (clsnm && clsnm.substr(0,4)=='name') { // && clsnm.substr(clsnm.length-10,10)!=' highlight'
            nodes[i].className += ' highlight';
        }
    }

    el = document.getElementById('exp_'+id);
    var nodes = el.childNodes;
    for(var i=0; i<nodes.length; i++) {
        var clsnm = nodes[i].className;
        if (clsnm && clsnm.substr(0,4)=='name') {
            nodes[i].className += ' highlight';
        }
    }
}

function tree_revert(id)
{
    el = document.getElementById('col_'+id);

    var nodes = el.childNodes;
    for(var i=0; i<nodes.length; i++) {
        var clsnm = nodes[i].className;
        if (clsnm && clsnm.substr(clsnm.length-10,10)==' highlight') {
            nodes[i].className = clsnm.substr(0, clsnm.length-10);
        }
    }

    el = document.getElementById('exp_'+id);

    var nodes = el.childNodes;
    for(var i=0; i<nodes.length; i++) {
        var clsnm = nodes[i].className;
        if (clsnm && clsnm.substr(clsnm.length-10,10)==' highlight') {
            nodes[i].className = clsnm.substr(0, clsnm.length-10);
        }
    }
}

function make_tree(id, settings)/*callback_activate, callback_deactivate)*/
{
    var tree = new Object();
    var topelement = document.getElementById(id);
    if (!topelement) return false;

    listtype = 'ul'; // or 'ol'
    callback_activate = null;
    callback_deactivate = null;
    image = { expanded: '/img/tree-expanded.gif',
              collapsed: '/img/tree-collapsed.gif',
              item: '/img/tree-item.gif'
            };
    if (settings) {
        if (settings.listtype) listtype = settings.listtype;
        if (settings.callback_activate) callback_activate = settings.callback_activate;
        if (settings.callback_deactivate) callback_deactivate = settings.callback_deactivate;
        if (settings.image) {
            if (settings.image.expanded) image.expanded = settings.image.expanded;
            if (settings.image.collapsed) image.collapsed = settings.image.collapsed;
            if (settings.image.item) image.item = settings.image.item;
            }
        }

    // find list-items on different levels
    li = topelement.getElementsByTagName('li');
    tree.root = new Object();
    tree.active = false;
    tree.activate_click = false;
    tree.callback_activate = callback_activate;
    tree.callback_deactivate = callback_deactivate;
    for(i=0; i<li.length; ++i) {

        li[i].tree = tree;
        li[i].img = null;
        li[i].div = null;
        li[i].a = null;
        li[i].ul = null;
        li[i].state = li[i].getAttribute('state');

        children = li[i].childNodes;
        for(j=0; j<children.length; ++j) if (children[j].tagName) {
            tagname = children[j].tagName.toLowerCase();
            if (tagname=='img') {
                li[i].img = children[j];
                li[i].img.li = li[i];
                }
            if (tagname=='div') {
                li[i].div = children[j];
                li[i].div.li = li[i];
                a = li[i].div.getElementsByTagName('a');
                if (a.length) {
                    li[i].a = a[0];
                    li[i].a.li = li[i];
                    }
                }
            if (tagname==listtype) {
                li[i].ul = children[j];
                li[i].ul.li = li[i];
                }
            }

        switch (li[i].state) {
            case 'collapsed':
                if (li[i].img.src!=image.collapsed) li[i].img.src = image.collapsed;
                if (li[i].ul) li[i].ul.style.display = 'none';
                break;
            case 'expanded':
                if (li[i].img.src!=image.expanded) li[i].img.src = image.expanded;
                if (li[i].ul) li[i].ul.style.display = 'block';
                break;
            default:
                if (li[i].img.src!=image.item) li[i].img.src = image.item;
            }

        // on each link, set the onmouseover or onclick events
        li[i].div.onmouseover = function() {
            if (callback_activate) callback_activate(this);
            }
        li[i].div.onmouseout = function() {
            if (callback_deactivate) callback_deactivate(this);
            }
        if (li[i].ul) { // has items
            li[i].a.onclick = function() {
                return false;
                }
            li[i].img.onclick = function() {
                if (this.li.state=='collapsed') {
                    close_all(id);
                    this.li.state = 'expanded';
                    this.li.img.src = image.expanded;
                    this.li.ul.style.display = 'block';
                    }
                else {
                    this.li.state = 'collapsed';
                    this.li.img.src = image.collapsed;
                    this.li.ul.style.display = 'none';
                    }
                }
            li[i].div.style.cursor = 'pointer';
            li[i].div.onclick = li[i].img.onclick;
            }
        }
    return tree;
}

function close_all()
{
    var topelement = document.getElementById('catalog_index');
    li = topelement.getElementsByTagName('li');
    for(i=0; i<li.length; ++i) {
        switch (li[i].state) {
            case 'expanded':
                if (li[i]!==this.li)
                {
                    this.li[i].img.src = image.collapsed;
                    this.li[i].ul.style.display = 'none';
                }
                break;
            default:
            }
    }
}

