﻿




var tocIsInitialized;
var tocLayers = [];

var allLayersThatID = [];
var activeLayerNames = [];
var activeLayerElement = "activelayers";
var categories = [];

// ################################################
// structure a table of contents entry
function tocLayer(text, category, mapservice, layers, canID, metadataURL, downloadURL, isService) {
    this.text = text;
    this.category = category;
    this.layers = layers;
    this.mapservice = mapservice;
    this.canidentify = canID;
    this.metadataurl = metadataURL;
    this.downloadurl = downloadURL;
    this.isService = isService;
    this.layerIDs = [];
    this.isValid = false;
}

function idGroup(text, layerids) {
    this.text = text;
    this.layers = layerids;
}

// ################################################
// Call refreshtoc from the map.js showPanel routine... only called when user click on the toc button.
function refreshTOC() {

    categories[0] = "Labels";
    categories[1] = "Streets";
    categories[2] = "Base Layers";


    if (!tocIsInitialized) {

        tocStore = new dojo.data.ItemFileReadStore({ url: "Data/toc.txt" });
        tocLayers = [];
        tocStore.fetch({
            onItem: function(item) {

                if (!tocStore.hasAttribute(item, "endOfFile")) {

                    var text = tocStore.getValue(item, "text");
                    var category = tocStore.getValue(item, "category");
                    var layernames = tocStore.getValue(item, "layernames");
                    var mapservicename = tocStore.getValue(item, "mapservice");
                    var canID = tocStore.getValue(item, "canidentify");
                    var downloadURL = tocStore.getValue(item, "downloadurl");
                    var metadataURL = tocStore.getValue(item, "metadataurl");
                    var isService = false;

                    if (layernames === "") isService = true;

                    var t = new tocLayer(text, category, mapservicename.toLowerCase(), layernames, canID, metadataURL, downloadURL, isService);
                    //console.debug(t);
                    tocLayers.push(t);

                }
            },

            onError: function(errData, request) {
                console.debug("Error");
                console.debug(errData);

            },

            onComplete: function() {
                //console.debug("Completed");
                populateToc();
            }
        });

    }

}


function populateToc() {

    var s = [];

    //write the Header
    s.push("<table width='100%' border='0' cellspacing='3' cellpadding='0'>");
    s.push("<tr><td colspan='2' class='Bar'><b>MAP LAYERS:</b></td></tr>");
    //s.push("<tr><td colspan='2'><input id='chkSample' type='checkbox' checked disabled> Visible<img src=\"images/id_on.png\"/> Identify<img src='images/i_download.gif' border='0'> Download<img src='images/i_meta.gif' border='0'> Info</td></tr>");
    s.push("</table>");

    dojo.forEach(categories, function(searchCategory) {

        var catIndex = dojo.indexOf(categories, searchCategory);
        var togglecmd = "toggleTOCLayer(\"" + catIndex + "\");"
        var imgName = "tocimg_" + catIndex;

        s.push("<div id=\"toc_labels\" class=\"detail-section\">");
        s.push("<div class=\"captionbr\" onmousedown='" + togglecmd + "'><img  id='" + imgName + "' src='images/i_plus.gif'/>" + searchCategory + "</div>");
        s.push("<div style=\"margin: 7px 7px 7px 25px;display:none\" id=\"toclist_" + catIndex + "\"   >");
        s.push("<table><tbody>");
        var indx = 0;
        dojo.forEach(tocLayers, function(tocLayer, indx) {
            //console.debug(tocLayer);
            if (tocLayer.category == searchCategory) {

                // check initial visibility...
                var checked = "";
                var isChecked = checkInitialVisibility(tocLayer);
                if (isChecked) {
                    checked = "checked=\"" + checked + "\"";
                    //console.debug(tocLayer.text + " is checked");
                }

                var name = "toc" + indx;
                var cmd = "updateLayerVisibility('" + name + "'," + indx + ");";

                var canSelectHTML = "<img src=\"images/blank.gif\" alt=\"#\"/>";
                

                // visibility button...
                var visBtn = "<input id=\"chk" + name + "\"" + checked + " type=\"checkbox\" onclick=\"" + cmd + "\" />";
                if ((tocLayer.layerIDs.length > 0) && (tocLayer.layerIDs[0] == -1))
                    visBtn = "<img src=\"images/blank.gif\" alt=\"#\"/>";



                var downloadtext = "&nbsp;";
                var metadatatext = "&nbsp;";
                if (tocLayer.metadataurl != "") {
                    metadatatext = "<a href=\"" + tocLayer.metadataurl + "\" target=\"_blank\"><img src='images/i_meta.gif' border='0'></a>";
                }

                if (tocLayer.downloadurl != "") {
                    downloadtext = "<a href=\"" + tocLayer.downloadurl + "\" target=\"_blank\"><img src='images/i_download.gif' border='0'></a>";
                }

                if (!tocLayer.isValid)
                    canSelectHTML = "<img src=\"images/missing.gif\" alt=\"#\" title=\"this layer is missing from map\"  />";



                //s.push("<tr><td>" + visBtn + "</td><td>" + canSelectHTML + "</td><td>" + tocLayer.text + "</td><td>" + downloadtext + "</td><td>" + metadatatext + "</td></tr>");
                s.push("<tr><td>" + visBtn + "</td><td>" + tocLayer.text + "</td></tr>");
                console.debug(name);
            }

        });
        s.push("</tbody></table>");
        s.push("</div></div>");

    });


    // populate the toc node       
    dojo.byId("toc").innerHTML = s.join("");
    //updateActiveLayerElement();

    tocIsInitialized = true;

}

function toggleTOCLayer(name) {

    var listdivname = "toclist_" + name;
    var imgName = "tocimg_" + name;

    var o = dojo.byId(listdivname);
    if (o != null) {
        if (o.style.display == "none") {
            dojo.style(listdivname, { "display": "block" });
            dojo.byId(imgName).src = "images/i_minus.gif";
        } else {
            dojo.style(listdivname, { "display": "none" });
            dojo.byId(imgName).src = "images/i_plus.gif";
        }
    }
}

function checkInitialVisibility(tocLayer) {
    var isVisible = false;
    //console.debug(tocLayer);

    var gLayer = map.getLayer(tocLayer.mapservice);
    if (gLayer != null) {
        isVisible = gLayer.visible;
        if (tocLayer.isService==true)
            return isVisible;
        else {
            if ((tocLayer.layers.length > 0)) {
                var layers = tocLayer.layers.split(",");
                dojo.forEach(layers, function(layerName) {
                    //console.debug("checking initial visibility on " + layerName);
                    var layerID = com.js.map.utils.findLayerByName(layerName, tocLayer.mapservice);
                    tocLayer.layerIDs.push(layerID);
                    //console.debug("layername: " + layerName + " id is " + layerID);
                    if (layerID > -1) {
                        tocLayer.isValid = true;
                        var li = gLayer.layerInfos[layerID];
                        //console.debug(tocLayer);
                        if (li != null)
                            isVisible = li.defaultVisibility;
                    } else {
                        isVisible = false;
                    }
                });
            } else {
                tocLayer.layerIDs.push(-1);
                return false;
            }
        }
    }
    return isVisible

}

function updateLayerVisibility(chkbox, indx) {

    var obj = dojo.byId("chk" + chkbox);
    //console.debug(obj)

    var removeIt = !obj.checked;

    var t = tocLayers[indx];
    //console.debug(t);
    var layer = map.getLayer(t.mapservice);

    if (layer != null) {
        if (t.layerIDs.length > 0) {
            console.debug("inside the correct if stmt");
            var visible = layer.visibleLayers;
            if (removeIt == true) {
                dojo.forEach(t.layerIDs, function(layerID) {
                    if (dojo.indexOf(visible, layerID) >= 0)
                        visible.splice(dojo.indexOf(visible, layerID), 1);
                });
            }
            else {
                dojo.forEach(t.layerIDs, function(layerID) {
                    var li = layer.layerInfos[layerID]
                    if (li != undefined) {
                        visible.push(li.id);
                    }
                });
            }

            visible.sort(function(a, b) { return a - b; });


            //dojo.byId("toc-visiblelayers").innerHTML = visible.join(",");

            layer.setVisibleLayers(visible);
        } else {
            tocLayer.isValid = true;
            if (removeIt) {
                // hide the map service layer.
                layer.hide();
            } else {
                // show the map service layer
                layer.show();
            }
        }
    }

}

