﻿AttachEvent(window, "onload", InitSeriesExplorer);

var lastSelectedNode;
var evalTimer;
var goals, targets, indicators, series;

/*
 * Initialisation - select the "All" node if it's available
 */
function InitSeriesExplorer() {
    
}

/*
 * Get the list of selected ids, then invoke the nominated callback with each selected it
 */
function GetSelectedIds(fnCallback) {
    var treeTab = document.getElementById("SeriesTab0");
    if (treeTab.className.match(/Show/i)) {
        GetSelectedIdsFromTree(fnCallback);
        
    } else {
        GetSelectedIdsFromList(fnCallback);
    }
}

/*
 * Retrieve the selected IDs from the tree view
 */
function GetSelectedIdsFromTree(fnCallback) {
    if (!lastSelectedNode || lastSelectedNode == null) { 
        fnCallback();
        return;
    }
    
    goals = targets = indicators = series = "";
    var tree = lastSelectedNode.ParentTreeView;
    if (tree.MultipleSelectedNodes && tree.MultipleSelectedNodes != null) {
        for (var i = 0; i < tree.MultipleSelectedNodes.length; i++) {
            EvaluateNode(tree.MultipleSelectedNodes[i]);
        }
    
    } else {
        EvaluateNode(lastSelectedNode);
    }
    
    if (VerifySelection(goals, targets, indicators, series)) {
        fnCallback(goals, targets, indicators, series);
    }    
}

/*
 * Retrieve the selected IDs from the flat list view
 */
function GetSelectedIdsFromList(fnCallback) {
    var seriesList = GetSelectedItems();
    if (VerifySelection(null, null, null, seriesList)) {
        fnCallback("", "", "", GetSelectedItems());
    }
}

/* 
 * Verify that the selected items are "legal" under the current multi-select rules
 */
function VerifySelection(goals, targets, indicators, series) {
    // If multi select is not allowed, check if there's multiple items selected
    var boxIsMultiSeries = document.getElementById("boxIsMultiSeries");
    if (boxIsMultiSeries.value.match(/false/i)) {
        if ((goals == null || goals == "") &&
            (targets == null || targets == "") &&
            (indicators == null || indicators == "") &&
            series.match(/\,/) == null) {

            return true;
                        
        } else {
            alert(label_MultiSeriesSelect);
            return false;
        }
    }
    
    return true;
}

/*
 * Invoked each time a node is selected in the tree. The node passed is the node
 * that has been selected
 */
function OnNodeSelected(node) {
    lastSelectedNode = node;

    // Add a tiny delay to allow the tree to render the expansion
    if (evalTimer) {
        clearTimeout(evalTimer);
    }
    
    evalTimer = setTimeout(EvaluateSelectedNodes, 250);
}

/* 
 * Send a request to find the number of series that match the currently selected nodes
 */  
function EvaluateSelectedNodes() {
    // Clear the timer so we don't continually re-evaluate
    clearTimeout(evalTimer);
    evalTimer = null;

    // Only count the number of series if that function is enabled
    var divSeriesCount = FindElement("div", "divSeriesCount");
    if (divSeriesCount) {
        ShowSeriesCount();
    }
    
    // Invoke other handlers
    var boxClientTreeSelected = FindElement("input", "boxClientTreeSelected");
    if (boxClientTreeSelected && boxClientTreeSelected.value) {
        GetSelectedIds(eval(boxClientTreeSelected.value));
    }
}

/*
 * Evaluates the nominated node and adds its ID to the relevant list of IDs
 */
function EvaluateNode(node) {
    var idArray = node.ID.split(/:/);

    switch (idArray[0]) {
        case "Goal": goals += goals && goals != "" ? "," + idArray[1] : idArray[1]; break;
        case "Target": targets += targets && targets != "" ? "," + idArray[1] : idArray[1]; break;
        case "Indicator": indicators += indicators && indicators != "" ? "," + idArray[1] : idArray[1]; break;
        case "Series": series += series && series != "" ? "," + idArray[1] : idArray[1]; break;
    }
}

/* 
 * Display the number of selected series nodes
 */
function ShowSeriesCount() {
    if (!lastSelectedNode || lastSelectedNode == null) { 
        return;
    }

//    var seriesCount = 0;
//        
//    var tree = lastSelectedNode.ParentTreeView;
//    if (tree.MultipleSelectedNodes && tree.MultipleSelectedNodes != null) {
//        for (var i = 0; i < tree.MultipleSelectedNodes.length; i++) {
//            seriesCount += GetSeriesNodeCount(tree.MultipleSelectedNodes[i]);
//        }
//    
//    } else {
//        seriesCount = GetSeriesNodeCount(lastSelectedNode);
//    }
//    
//    var divSeriesCount = FindElement("div", "divSeriesCount");
//    divSeriesCount.innerHTML = seriesCount + label_NumberOfSeriesSelected;
//    divSeriesCount.style["display"] = "block";    
}

/*
 * Find out how many series nodes (leaves) are implicitly selected
 */
function GetSeriesNodeCount(parentNode) {
    var seriesCount = 0;
    
    var childNodes = parentNode.Nodes();
    if (childNodes && childNodes.length > 0) {    
        for (var i = 0; i < childNodes.length; i++) {
            var childNode = childNodes[i];
            
            // Individually selected child nodes will be processed on their own accord
            if (!IsSelected(childNode)) {
                seriesCount += GetSeriesNodeCount(childNode);
            }
        }
        
    } else {
        // No children means this is a leaf (series) node
        seriesCount = 1;
    }
    
    return seriesCount;
}

/*
 * Determines if the nominated node is currently selected
 */
function IsSelected(node) {
    var tree = node.ParentTreeView;
    
    if (tree.MultipleSelectedNodes && tree.MultipleSelectedNodes != null) {
        for (var i = 0; i < tree.MultipleSelectedNodes.length; i++) {
            if (tree.MultipleSelectedNodes[i].ID == node.ID) {
                return true;
            }
        }
        
        return false;
    }
    
    return tree.SelectedNode && tree.SelectedNode.ID == node.ID;
}