function TreeModel(rootNode)
{
    extend(this, WebObject);
    
    this.rootNode                   = rootNode;
    this.onNodeAdded                = new EventDelegate();
    this.onNodeRemoved              = new EventDelegate();
    this.onNodeWillExpand           = new EventDelegate();
    this.onNodeExpansionChanged     = new EventDelegate();
}

TreeModel.prototype = new WebObject();

// public void insertNode(Node parent, Node child, int index);
TreeModel.prototype.insertNode = function(index, parent, child)
{
    parent.insertNode(index, child);
    this.onNodeAdded.fireEvent(this, index, parent, child);
}

// TreeModel.prototype.removeFromParent = function(node);
TreeModel.prototype.removeFromParent = function(node)
{
    var parent = node.parent;
    
    if(!parent)
    {
        throw new Error("TreeModel.removeFromParent() - cannot remove root node");
    } else
    {
        if(parent.removeNode(node))
        {
            this.onNodeRemove.fireEvent(this, parent, node);
        }
    }
}

// TreeModel.prototype.getRootNode();
TreeModel.prototype.getRootNode = function()
{
    return this.rootNode;
}

// public void expand(Node node);
TreeModel.prototype.setExpanded = function(node, expanded)
{
    if(expanded)
    {
        if(node.parent && !node.parent.expanded)
        {
            this.setExpanded(node.parent, expanded);
        }
        
        this.onNodeWillExpand.fireEvent(this, node);
    }
    
    node.expanded = expanded;
    this.onNodeExpansionChanged.fireEvent(this, node, expanded);
}
