﻿// What tab functions

function WHAT(){}

WHAT.Init = function(args)
{
    WHAT.IsLoaded = false;
    WHAT.IsValid = false;
	WHAT.SummaryDisplay = "";
};

WHAT.Load = function(args) {
    WHAT.IsLoaded = true;

    //alert("WHAT.Init");
    WHAT.WhatTreeSelectObj = new TreeSelect(document.getElementById("whattreeroot"), WHAT.ValidateCheckbox_1);
    WHAT.RootNodes = WHAT.WhatTreeSelectObj._getRootNodes();
    WHAT.RootDisplays = new Array(WHAT.RootNodes.length);
    WHAT.RootSelections = new Array(WHAT.RootNodes.length);
    WHAT.RootIsSelected = new Array(WHAT.RootNodes.length);
    WHAT.RootSelectedCount = new Array(WHAT.RootNodes.length);
    WHAT.GroupDisplays = new Array();
    WHAT.GroupSelections = new Array();
    WHAT.SelectedIdx = 0;

    WHAT.SelectedItems = 0;
    WHAT.SelectionCount = 0;
    WHAT.RootDisplay = "";
    WHAT.RootSelection = "";
    for (var k = 0; k < WHAT.RootDisplays.length; k++) {
        WHAT.RootDisplays[k] = "";
        WHAT.RootSelections[k] = "";
        WHAT.RootIsSelected[k] = "";
        WHAT.RootSelectedCount[k] = 0;
    }

    if (UIHelper.WhatTabFoldersOpen) WHAT.WhatTreeSelectObj._openNodes();

    if (UIHelper.WhatTabDefintions) $(".what-col-2").show();

    WHAT.ShowContent();
    
    UIHelper.HideStatusMessage(true);
};

WHAT.ShowContent = function() {
    //$("#what-content").css({ marginBottom: "20px" });
    $("#what-content").slideDown();
};

WHAT.CloseNodes = function()
{
	WHAT.WhatTreeSelectObj._closeNodes();
};

WHAT.OpenNodes = function()
{
    WHAT.WhatTreeSelectObj._openNodes();
    //alert("Items = " + WHAT.SelectedItems);
};

WHAT.ClearCheckboxes = function()
{
    WHAT.WhatTreeSelectObj._clearCheckboxes();
    for (var k = 0; k < WHAT.RootNodes.length; k++) {
        WHAT.RootDisplays[k] = "";
        WHAT.RootSelections[k] = "";
    }
    WHAT.IsValid = false;
    WHAT.SelectedItems = 0;
    WHAT.SummaryDisplay = "";
    CVS.BuildSummaryDisplay();
    UIHelper.DisableUpdateMapButton(true);
};

WHAT.ValidateCheckbox_1 = function(node)
{
    if (!node._isParent) {
        if (node._isChecked) {
            WHAT.SelectedItems++;
        } else {
            WHAT.SelectedItems--;
        }
    } else {
        // For efficiency, node being a parent will only happen for the root node. This is controlled in TreeSelect.js
        //alert("WHAT Parent = " + node._checkElem.id + ", Selected = " + WHAT.SelectedItems);
        if (WHAT.SelectedItems > 0) {
            WHAT.IsValid = true;
            UIHelper.DisableUpdateMapButton(false);
            UIHelper.IndicatePendingChanges(true);
        } else {
            WHAT.IsValid = false;
            UIHelper.DisableUpdateMapButton(true);
            UIHelper.IndicatePendingChanges(false);
        }
        WHAT.ValidateCheckbox(node);
        //UIHelper.HideStatusMessage(true);
    }
};

WHAT.ValidateCheckbox = function(node)
{
    var k;
    var root = node;
    var rootID, rootName;

    rootID = root._checkElem.id.substr(4);  // id = "root" + guid, only need guid
    rootName = root._spanElem.firstChild.nodeValue;
    //alert("Checked = " + node._isChecked + ", Root = " + rootName);

    WHAT.RootDisplay = "";
    WHAT.SelectionCount = 0;
    WHAT.GroupDisplays.length = 0;
    WHAT.GroupSelections.length = 0;

    WHAT.BuildSummary(root, "");
    WHAT.SetGroupSelections();

    WHAT.RootSelection = "";
    if (WHAT.RootDisplay != "") {
        WHAT.RootDisplay = "<span class='sumcat'>" + rootName + "</span>";
        for (k = 0; k < WHAT.GroupSelections.length; k++) {
            if (k > 0) WHAT.RootDisplay += "<br/><span class='sumand'>-- AND --</span>";
            WHAT.RootDisplay += WHAT.GroupDisplays[k];
            WHAT.RootSelection += "|$GRP|" + WHAT.GroupSelections[k];
        }
        WHAT.RootDisplay += "<br/>";
    }

    WHAT.SummaryDisplay = "";
    for (k = 0; k < WHAT.RootNodes.length; k++) {
        //alert("Root "+k+"="+WHAT.RootNodes[k]._spanElem.firstChild.nodeValue);
        // Update the display and query (Selection) for the current root
        if (WHAT.RootNodes[k]._spanElem.firstChild.nodeValue == rootName) {
            WHAT.RootDisplays[k] = WHAT.RootDisplay;
            if (WHAT.RootSelection == "") {
                WHAT.RootSelections[k] = "";
                WHAT.RootIsSelected[k] = "";
            } else {
                WHAT.RootSelections[k] = rootID + WHAT.RootSelection;
                WHAT.RootIsSelected[k] = rootID + "|" + rootName;
            }
        }
        if (WHAT.RootSelections[k] != "") WHAT.IsValid = true;
        // Update the summary display
        if (WHAT.RootDisplays[k] != "") {
            if (WHAT.SummaryDisplay != "") WHAT.SummaryDisplay += "<br/>"
            WHAT.SummaryDisplay += WHAT.RootDisplays[k];
        }
    }

    CVS.BuildSummaryDisplay();
};

WHAT.BuildSummary = function(node, pre)
{
    var i, name;
    var sum = "", sel = "";
    var childElem;
    var myListElems;

    name = node._spanElem.firstChild.nodeValue;
    // Setup the prefix name for the folder (i.e. UCR CODE.PART I.ROBBERY)
    if (node._parent == null) {
        pre = "";
    } else {
        if (pre != "") pre += ".";
        pre += name;
    }

    // Check if new query group
    if (node._checkElem.id.substr(0, 5) == "group") {
        WHAT.SetGroupSelections();
        WHAT.GroupDisplays.push("");
        WHAT.GroupSelections.push(node._checkElem.id.substr(5));
        WHAT.SelectedIdx = WHAT.GroupSelections.length - 1;
    }

    if (node._isChecked) {
        if (node._isParent) {
            //alert("Checked folder = " + pre + "--" + node._checkElem.id + ", query = " + node._isQuery);
            if (node._isQuery) {
                WHAT.RootDisplay = "x"; // Just need to know that something was selected
                WHAT.SelectionCount++;
                WHAT.GroupDisplays[WHAT.SelectedIdx] += "<br/><span class='sumfolder'>" + pre + "</span>";
                WHAT.GroupSelections[WHAT.SelectedIdx] += "|" + node._checkElem.id.substr(5); // ID is after word query
                return;
            }
            if (node._checkElem.id.substr(0, 4) == "root") {
                WHAT.SetGroupSelections();
                WHAT.RootDisplay = "x"; // Just need to know that something was selected
                WHAT.SelectionCount++;
                WHAT.GroupDisplays.push("<br/><span class='sumfolder'>ALL " + name + "</span>");
                WHAT.GroupSelections.push("ALL");
                WHAT.SelectedIdx = WHAT.GroupSelections.length - 1;
                return;
            }
        }
    }

    //alert("WHAT.BuildSummary node="+name+", pre="+pre);
    childElem = GetChildElementsByTagName("ul", node)[0];
    myListElems = GetChildElementsByTagName("li", childElem);

    for (i = 0; i < myListElems.length; i++) {
        if (myListElems[i]._isParent) {
            WHAT.BuildSummary(myListElems[i], pre);
        } else {
            if (myListElems[i]._inputElem.checked) {
                sum += "<br/><span class='sumval'>-&nbsp;" + myListElems[i]._spanElem.firstChild.nodeValue + "</span>";
                //sum += "<br/><span class='sumval'>" + myListElems[i]._spanElem.firstChild.nodeValue + "</span>";

                WHAT.SelectionCount++;
                //WHAT.GroupSelections[WHAT.SelectedIdx] += "|" + myListElems[i]._checkElem.id;
                sel += "|" + myListElems[i]._checkElem.id;
            }
        }
    }

    if (sum != "") {
        WHAT.RootDisplay = "x"; // Just need to know that something was selected
        WHAT.GroupDisplays[WHAT.SelectedIdx] += "<br/><span class='sumfolder'>" + pre + "</span>" + sum;
        WHAT.GroupSelections[WHAT.SelectedIdx] += sel;
    }
};

WHAT.SetGroupSelections = function()
{
    if (WHAT.SelectionCount == 0)
    {
        if (WHAT.GroupSelections.length > 0) {
            // If there were no queries for this group, eliminate it
            WHAT.GroupDisplays.length = WHAT.GroupDisplays.length - 1;
            WHAT.GroupSelections.length = WHAT.GroupSelections.length - 1;
        }
    }
    WHAT.SelectionCount = 0;
};

WHAT.GetQuery = function()
{
    var queries="", lyrCount=0;
	for(var k = 0; k < WHAT.RootSelections.length; k++)
	{
	    if (WHAT.RootSelections[k] != "")
	    {
	        lyrCount++;
    	    queries += "|$LYR|" + WHAT.RootSelections[k];
	    }
	}
	if (lyrCount == 0)
        return "";
	else
        return lyrCount + queries;
};

WHAT.GetLayersInUse = function()
{
    var lyrs="", lyrCount=0;
	for(var k = 0; k < WHAT.RootIsSelected.length; k++)
	{
	    if (WHAT.RootIsSelected[k] != "")
	    {
	        lyrCount++;
    	    lyrs += "|" + WHAT.RootIsSelected[k];
	    }
	}
	if (lyrCount == 0)
        return "";
	else
        return lyrCount + lyrs;
};

WHAT.GetLayerQuery = function(lyrID) {
    var idx = -1;
    for (var k = 0; k < WHAT.RootNodes.length; k++) {
        if (WHAT.RootNodes[k]._checkElem.id.substr(4) == lyrID) {
            idx = k;
            break;
        }
    }
    if (idx < 0)
        return "";
    else
        return "1|$LYR|" + WHAT.RootSelections[idx];
};

WHAT.GetChartQuery = function(name, lyrID) {
    // 1|$LYR|{a730dfea-c27b-48ce-8d65-cd05861fd518}|$GRP|{c6d0d1bb-9756-4eab-bc77-b89f7c57126f}|3
    // Layer ID = WHAT.RootNodes[0]._checkElem.id.substr(4) (each root is a layer)

    WHAT.TempGroup = "";
    WHAT.ChartGroup = "";
    WHAT.ChartElement = "";
    WHAT.ChartNode = null;
    WHAT.ChartValue = name.toUpperCase();

    var idx = -1;
    for (var k = 0; k < WHAT.RootNodes.length; k++) {
        if (WHAT.RootNodes[k]._checkElem.id.substr(4) == lyrID) {
            idx = k;
            break;
        }
    }
    if (idx < 0) return "";

    WHAT.GetQueryFromDesc(WHAT.RootNodes[idx]);

//    alert("WHAT.ChartQuery for " + WHAT.ChartValue
//        + "\nRoot node " + idx + " = " + WHAT.RootNodes[idx]._checkElem.id.substr(4)
//        + "\nGroup = " + WHAT.ChartGroup + ", Element = " + WHAT.ChartElement + ", IsNode = " + (WHAT.ChartNode)
//        + "\nExisting What = " + WHAT.GetQuery());

    // Could not find the selection. Legend values probably do not match the query values (a legend alias?)
    if (WHAT.ChartGroup == "" || WHAT.ChartElement == "") return "";

    if (WHAT.ChartNode) {
        // Chart is renderend on a folder (node) not an element
        //alert("Node checked = " + WHAT.ChartNode._isChecked + ", Is query = " + WHAT.ChartNode._isQuery);
        // If not all elements were checked, get the individual elements that were checked
        if (!WHAT.ChartNode._isChecked || !WHAT.ChartNode._isQuery) {
            var tmpElement = WHAT.ChartElement;
            WHAT.ChartElement = "";
            WHAT.GetSelectionForNode(WHAT.ChartNode);
            if (WHAT.ChartElement == "") WHAT.ChartElement = tmpElement;
        }
    }

//    newWhat = WHAT.ReplaceGroupSelection(WHAT.RootSelections[idx]);
//    alert("New what = " + newWhat);
//    return "1|$LYR|" + newWhat;

    return "1|$LYR|" + WHAT.ReplaceGroupSelection(WHAT.RootSelections[idx]);
};
WHAT.ReplaceGroupSelection = function(selection) {
    var items = selection.split("|");
    var newSelection = items[0];
    var found = false;
    var idx = 1;

    while (idx < items.length) {
        if (items[idx] == "$GRP") {
            newSelection += "|" + items[idx]; // Add group key
            idx++;
            if (items[idx] == "ALL") {
                newSelection += "|" + WHAT.ChartGroup; // Replace ALL with the group id
                newSelection += "|" + WHAT.ChartElement; // Add the drilldown selection
                idx = items.length; // We're done
                found = true;
            } else {
                newSelection += "|" + items[idx]; // Add group id
                if (items[idx] == WHAT.ChartGroup) {
                    found = true;
                    // Loop thru and leave out existing query selections for this group
                    idx++;
                    while (idx < items.length) {
                        if (items[idx] == "$GRP") {
                            idx--; // This will get bumped back up to $GRP idx at the end of main loop
                            break;
                        } else {
                            idx++;
                        }
                    }
                    newSelection += "|" + WHAT.ChartElement; // Add the drilldown selection
                }
            }
        } else {
            newSelection += "|" + items[idx]; // Add the next item
        }
        idx++;
    }
    if (!found) {
        newSelection += "|$GRP"; // Add group key
        newSelection += "|" + WHAT.ChartGroup; // Add group id
        newSelection += "|" + WHAT.ChartElement; // Add the drilldown selection
    }
    //alert("New What = " + newSelection);

    return newSelection;
};

WHAT.GetQueryFromDesc = function(node) {
    var i;
    var childElem;
    var myListElems;

    // Once the drilldown type has been found, stop checking.
    // Because this is recursive, we could be a couple of levels down, so keep bubbling up.
    if (WHAT.ChartElement != "") return;

    //alert("node._spanElem.firstChild.nodeValue = " + node._spanElem.firstChild.nodeValue);
    if (node._checkElem.id.substr(0, 5) == "group") {
        WHAT.TempGroup = node._checkElem.id.substr(5);
    }

    childElem = GetChildElementsByTagName("ul", node)[0];
    myListElems = GetChildElementsByTagName("li", childElem);

    for (i = 0; i < myListElems.length; i++) {
        if (myListElems[i]._isParent) {
            //alert("PARENT--myListElems[i]._spanElem.firstChild.nodeValue = " + myListElems[i]._spanElem.firstChild.nodeValue + " == " + WHAT.ChartValue);
            if (myListElems[i]._spanElem.firstChild.nodeValue.toUpperCase() == WHAT.ChartValue) {
                WHAT.ChartElement = myListElems[i]._checkElem.id.substr(5);
                WHAT.ChartGroup = WHAT.TempGroup;
                WHAT.ChartNode = myListElems[i];
                return;
            } else {
                WHAT.GetQueryFromDesc(myListElems[i]);
            }
        } else {
            // Can't just check the checked elements.
            // None of the rendering elements might have been checked, so the real drilldown value will never be found.
            // So, check em all...
            //if (myListElems[i]._inputElem.checked) {
            //alert("myListElems[i]._spanElem.firstChild.nodeValue = " + myListElems[i]._spanElem.firstChild.nodeValue + " == " + WHAT.ChartValue);
            if (myListElems[i]._spanElem.firstChild.nodeValue.toUpperCase() == WHAT.ChartValue) {
                WHAT.ChartElement = myListElems[i]._checkElem.id;
                WHAT.ChartGroup = WHAT.TempGroup;
                return;
            }
            //}
        }
    }
};

WHAT.GetSelectionForNode = function(node) {
    var i;
    var childElem;
    var myListElems;

    //alert("node._spanElem.firstChild.nodeValue = " + node._spanElem.firstChild.nodeValue + ", Element = " + WHAT.ChartElement);

    childElem = GetChildElementsByTagName("ul", node)[0];
    myListElems = GetChildElementsByTagName("li", childElem);

    for (i = 0; i < myListElems.length; i++) {
        if (myListElems[i]._isParent) {
            WHAT.GetSelectionForNode(myListElems[i]);
        } else {
            if (myListElems[i]._inputElem.checked) {
                //alert("myListElems[i]._spanElem.firstChild.nodeValue = " + myListElems[i]._spanElem.firstChild.nodeValue + " == " + myListElems[i]._checkElem.id + ", Element = " + WHAT.ChartElement);
                if (WHAT.ChartElement != "") WHAT.ChartElement += "|";
                WHAT.ChartElement += myListElems[i]._checkElem.id;
            }
        }
    }
};

