
// Tree Node functions

function activateTreeNode( layerName ) {
    activateLayer( layerName );
    tocLayerClick.ignoreNextClick = true;
}

function tocLayerClick( node, browserEvents ) {
    // Other functions can set tockLayerClick.ignoreNextClick to prevent meataData popping
    if (node.Category == "Layer" && !tocLayerClick.ignoreNextClick) {
        url = node.Attributes["metaDataUrl"];
        if (url.startsWith( "http"))
            popExternalWindow( url );
    }
    tocLayerClick.ignoreNextClick = false;
    tocLayerClick.lastNodeClicked = node;
}

function tocCheckFilter( node, browserEvents ) {
    if (node.Category == "Group" && !node.Checked) {
        if (node.Expanded)
            node.Collapse();
        else
            node.Expand();
        return false;
    }
    return true;
}

function cascadeTreeCheck( node ) {
    updateVisibleLayer( node );
    updateTreeParent(   node );
    updateTreeChildren( node );

    if (autoUpdateCheckbox.checked)
        displayMapChanges();

    if (node.Checked)
        node.Expand();
    else
        node.Collapse();
}

function updateTreeParent( node ) {
    // Parent checked if any children are checked
    if (node.Parent != null) {
        if (anyChildrenChecked( node.Parent ))
            node.Parent.Check();
        else
            node.Parent.UnCheck();
        updateVisibleLayer( node.Parent );
        updateTreeParent(   node.Parent );
    }
}

function updateTreeChildren( node ) {
    // update child checkboxes to match node.checked
    for (var i=0; i<node.Nodes.length; i++) {
        child = node.Nodes[i];

        if (node.Checked != child.Checked) {
            if (child.Category == "Layer") {
                if (node.Checked)
                    child.Check();
                else
                    child.UnCheck();
                updateVisibleLayer( child );
            }
            else {
                if (!node.Checked)
                    child.UnCheck();
            }
            updateTreeChildren( child );
        }

    }
}

function anyChildrenChecked( node ) {
    for (var i=0; i<node.Nodes.length; i++) {
        if (node.Nodes[i].Checked)
            return true;
    }
    return false;
}


// Tree Visible Layer functions

var visiblesChanged = false;

function updateVisibleLayer( node ) {
    if (node.Category == "Layer" || node.Category == "DynamicLayer" || node.Category == "ExternalImage") {
        layerViz[node.Value] = node;
        visiblesChanged      = true;
    }
}

function displayMapChanges() {
    if (visiblesChanged == true) {
        requestMap();
        visiblesChanged = false;
    }
}

