//provide namespace
dojo.provide("NGCJS.Legend");

//declare new dijit class
dojo.declare("NGCJS.Legend", null, {

    constructor: function(/*HTMLElement*/node, /*{url:<restlegends endpoint>}?*/options) {
        //if no options provided, use dummy options
        options = options || {};
        this.restLegendsEndpoint = options.url || "http://orthogonal.esri.com/restlegends/";

        //apply CSS class to legend
        dojo.addClass(node, "legend");
        this.domNode = node;

        //node for each layer's legend
        this._legendNodes = [];
        //regex to convert layer's REST url to corresponding SOAP url
        this._restToSoapRegex = /(\/arcgis)\/rest(\/services\/?)/i;

        this._addLegend = dojo.hitch(this, this._addLegend);
        this._onLayerReorderHandler = dojo.hitch(this, this._onLayerReorderHandler);
    },

    setMap: function(map) {
        this._map = map;

        //register to map's events for updating legend
        dojo.connect(map, "onLayerAdd", this, "_onLayerAddHandler");
        dojo.connect(map, "onLayerRemove", this, "_onLayerRemoveHandler");
        dojo.connect(map, "onLayerReorder", this, "_onLayerReorderHandler");
    },

    _onLayerAddHandler: function(layer) {
        try {
            console.log("LayerAdd event handler called: " + this.restLegendsEndpoint);
            if (this.restLegendsEndpoint == "global") {
                for (i in view.services) {
                    if (view.services[i].id == layer.id) {
                        this._addLegend(layer, view.services[i], i);
                    }
                }
            }
            else {
                //convert layer's REST url to a SOAP url
                var url = layer.url.replace(this._restToSoapRegex, "$1$2");

                //request for layer's legend
                esri.request({
                    url: this.restLegendsEndpoint,
                    content: {
                        f: "json",
                        soapUrl: url,
                        servicename: layer.id
                    },
                    callbackParamName: "callback",
                    load: dojo.partial(this._addLegend, layer),
                    error: function(err) {
                        console.error("Unable to get legend for " + layer.id);
                    }
                });
            }
        }
        catch (e) {
            console.error(e);
        }
    },

    _onLayerRemoveHandler: function(layer) {
        try {
            //once layer is removed, destroy the node and remove from array
            dojo._destroyElement(this._legendNodes[layer.id]);
            delete this._legendNodes[layer.id];
        }
        catch (e) {
            console.error(e);
        }
    },

    _onLayerReorderHandler: function(layer, index) {
        console.log("reorder handler for layer: " + layer.id);
        try {
            console.log("index start: " + index);
            //handle condition where layers are reordered in map
            var domNode = this.domNode, children = domNode.childNodes, //reverse indices, since we want to show '0' layer at bottom
                index = (children.length - 1) - index, node = this._legendNodes[layer.id];

            if (node) {
                if (index == 0) {
                    //if reversed index is zero, implying top most layer, insert before 1st child
                    domNode.insertBefore(node, domNode.firstChild);
                }
                else
                    console.log("index: " + index + "children.length: " + children.length);
                if (index == (children.length - 1)) {
                    //if reversed index is last, move to bottom and append
                    domNode.appendChild(node);
                }
                else {
                    //move the node before node at next reversed index
                    domNode.insertBefore(node, children[index + 1]);
                }
            }
        }
        catch (e) {
            console.error(e);
        }
    },

    _addLegend: function(mapLayer, response, serviceCt) {
        try {
            console.log("_addLegend called: " + response);
            // JavaScript code to match HTML markup
            // <div>
            //   <fieldset class="fieldset">
            //     <legend>${mapLayer.id}</legend>
            //     <div>
            //       <fieldset class="fieldset items">
            //         <legend>${layer.layerName}</legend>
            //         <div class="item"><img src="${legend.url}" class="swatch">${legend.label}</div>
            //       </fieldset>
            //     </div>
            //   </fieldset>
            // </div>

            var div = document.createElement("div");
            var fieldset = div;
            dojo.addClass(div, "legendgroup");
            //dojo.addClass(fieldset, "fieldset");

            var legend = fieldset.appendChild(document.createElement("legend"));
            var layerHead = fieldset.appendChild(document.createElement("h3"));
            //var layerSelect = fieldset.appendChild(document.createElement("h3"));
            //var checkbox = document.createElement("input");
            //checkbox.type = "checkbox";
            //dojo.attr(checkbox, "type", "checkbox");
            //checkbox.id = mapLayer.id;
            //dojo.addClass(checkbox, "TOC_Root");
            //legend.appendChild(checkbox);
            //checkbox.checked = "checked";
            //var checkbox = "<input type='checkbox' class='TOC_Root' CHECKED id='" + mapLayer.id + "' onclick=\"legend.toggleService('" + mapLayer.id + "');\" />";
            //legend.innerHTML = checkbox;
            // onclick=\"resultPanel.toggleLayers(dojo.query('.layerTable',this.parentNode), this);\"
            // For some reason we have to go up 2 levels in IE
            if (dojo.isIE) {
                dojo.attr(layerHead, "onclick", "legend.toggleLayers(dojo.query('.fieldset',this.parentNode.parentNode), this);");
            } else {
                dojo.attr(layerHead, "onclick", "legend.toggleLayers(dojo.query('.fieldset',this.parentNode), this);");
            }

            if (dojo.byId("viewmenu").value == "All Layers") {
                dojo.addClass(layerHead, "hidden");
                //fieldset.style("display", "none");
            }

            //pElement.style("display", "none");
            //

            layerHead.appendChild(document.createTextNode(mapLayer.id));
            legend.appendChild(layerHead);
            //if( dojo.byId("viewmenu").value == "0" && mapLayer.id != "Default"){
            //if (mapLayer.id != "Default") {
            if ((dojo.byId("viewmenu").value == "All Layers" && mapLayer.id != "Default") ||
                        (view.owner != 0) ||
                        ((dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Default") &&
                        (dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Property") &&
                        (dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Transportation") &&
                        (dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Development_Activities") &&
                        (dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Zoning"))) {
                showHideTxt = "Show All";
            } else {
                showHideTxt = "Hide All";
            }

            // Override for a custom view
            if (view.owner != null && view.owner != 0) {
                showHideTxt = "Hide All";
            }

            fieldset.innerHTML += "<div class=\"iconbtn selectall\" onclick=\"legend.showhide(dojo.query('.fieldset input',this.parentNode), this, '" + mapLayer.id + "');\">" + showHideTxt + "</div>";
            if (mapLayer.id == "Development_Activities") {
                fieldset.innerHTML += "<div class=\"iconbtn selectall statusfilter\" onclick=\"dijit.byId('damscaseoptions').show();\">Status Filter</div>";
            }
            fieldset.innerHTML += "<div style=\"clear:both;\"></div>";

            //alert("url: " + mapLayer.visibleLayers);

            //alert("view2: "+dojo.byId("viewmenu").value+" service: "+mapLayer.id);
            var layerct = 0;
            dojo.forEach(response.layers, function(layer) {
                var di = document.createElement("div");
                var f = di.appendChild(document.createElement("div"));
                f.id = serviceCt + "_" + layerct;
                dojo.addClass(f, "fieldset items");
                if (dojo.byId("viewmenu").value == "All Layers") {
                    //dojo.addClass(layerHead, "hidden");
                    dojo.style(f, "display", "none");
                }
                if (layer.ignore) {
                    dojo.removeClass(f, "fieldset");
                    dojo.addClass(f, "fieldsethide");
                }

                var l = f.appendChild(document.createElement("legend"));
                //var ck = document.createElement("input");
                //ck.type = "checkbox";
                //ck.id = layer.layerId;
                //dojo.addClass(ck, mapLayer.id+"TOC");
                //l.appendChild(ck);
                //ck.checked = "checked";
                //ck.onClick = function(){
                //	this.updateLayerVisibility('" + mapLayer.id + "');
                //};
                //ck.setAttribute("onClick", "updateLayerVisibility('" + mapLayer.id + "');"); 
                //dojo.attr(dojo.byId(ck.id), "onClick", "updateLayerVisibility('" + mapLayer.id + "');");

                //if (dojo.byId("viewmenu").value == "0" && mapLayer.id != "Default"){
                //if (mapLayer.id != "Default") {
                if ((dojo.byId("viewmenu").value == "All Layers" && mapLayer.id != "Default") ||
                        ((dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Default") &&
                        (dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Property") &&
                        (dojo.byId("viewmenu").value != "All Layers" && (mapLayer.id != "Transportation" || layer.layerName != "Primary Road")) &&
                        (dojo.byId("viewmenu").value != "All Layers" && mapLayer.id != "Development_Activities") &&
                        (dojo.byId("viewmenu").value != "All Layers" && (mapLayer.id != "Zoning" || layer.layerName == "Zoning (Black & White)")))) {
                    checkVal = "";
                } else {
                    checkVal = "CHECKED";
                }

                // Override for a custom view
                //alert("viewowner" + view.owner);
                if ((view.owner != null && view.owner != 0) || (dojo.byId("viewmenu").value == "All Layers" && layer.layerName == "Primary Road")) {
                    checkVal = "CHECKED";
                }

                // Writing out the tag manually because onclick event can't be set in IE

                var ck = "<input type='checkbox' class='" + mapLayer.id + "TOC' " + checkVal + " id='" + layer.layerId + "' value='" + layer.layerDbId + "' onclick=\"statusBox._addStatus('visibility', 'Updating Map Layers'); legend.updateLayerVisibility('" + mapLayer.id + "','" + layer.layerId + "');\" />";
                l.innerHTML = ck;
                var titlediv = l.appendChild(document.createElement("div"));
                dojo.addClass(titlediv, "layertitle");
                //l.appendChild(document.createTextNode(layer.layerName));
                titlediv.innerHTML = layer.layerName;

                //var localScale = document.getElementById("dispscale").value;

                if (mapLayer.id != "Imagery") {
                    dojo.forEach(layer.legend, function(legend) {
                        var d = f.appendChild(document.createElement("div"));
                        dojo.addClass(d, "item");
                        var img = d.appendChild(document.createElement("img"));
                        img.src = "http://" + serverAddress + sitePath + "/sharedfiles/images/legend/" + legend.url;
                        dojo.addClass(img, "swatch");

                        d.appendChild(document.createTextNode(legend.label));
                    });
                }

                fieldset.appendChild(di);
                layerct++;
            });

            //add div to nodes array
            this._legendNodes[mapLayer.id] = div;

            //to ensure correct order, iterate through map.layerIds and call _onLayerReorderHandler
            var map = this._map, layerIds = map.layerIds, reorderHandler = this._onLayerReorderHandler;
            dojo.forEach(layerIds, function(layerId, index) {
                reorderHandler(map.getLayer(layerId), index);
            });

            this.updateLayerVisibility(mapLayer.id);
        }
        catch (e) {
            console.error(e);
        }
    },

    toggleService: function(layerID) {
        var layer = map.getLayer(layerID);
        if (layer.visible) {
            layer.hide();
        }
        else {
            layer.show();
        }
    },

    toggleLayers: function(pElement, pTarget) {
        //for( idx in pElement.style ){
        //alert(pElement.length);
        //}
        //alert("name:"+pElement.tagName);

        if (!dojo.hasClass(pTarget, "hidden")) {
            pElement.style("display", "none");
            dojo.addClass(pTarget, "hidden");
        } else {
            pElement.style("display", "block");
            dojo.removeClass(pTarget, "hidden");
        }
    },

    updateLayerVisibility: function(serviceID) {
        //statusBox._addStatus("visibility", "Updating Map Layers");
        //alert("serviceId: " + serviceID);
        var inputs = dojo.query("." + serviceID + "TOC"), input;
        visible = [];
        for (var i = 0, il = inputs.length; i < il; i++) {
            if (!(serviceID == "Default" && i == 2)) {
                if (inputs[i].checked) {
                    visible.push(inputs[i].id);
                }
            }
        }
        console.log("visible (dijit): " + visible);
        var layer = map.getLayer(serviceID);
        layer.setVisibleLayers(visible);
        console.log("Setting layer to visible (dijit): " + layer.id);
        layer.show();
        //statusBox._removeStatus("visibility");
    },

    _handleViewSave: function(response) {
        //alert("view saved: "+response.viewid);
        if (response.viewid == "e") {
            alert("Could not save view.");
        } else {
            jsel.loadData(document.getElementById('viewmenu'), response.viewid);
        }
    },

    checkLayerView: function() {
        var viewName = dojo.byId("viewname").value;
        esri.request({
            url: viewServiceUrl,
            content: {
                f: "json",
                name: viewName,
                view: "b"
            },
            callbackParamName: "callback",
            load: dojo.partial(function(result) {
                //alert(dojo.toJson(result));
                if (result.viewcount == 0) {
                    legend.saveLayerView();
                } else {
                    dijit.byId('saveCkDialog').show();
                }
            }),
            error: function(err) {
                console.error("Unable to get view information" + err);
            }
        });
        //dijit.byId('saveCkDialog').show();
    },

    saveLayerView: function() {
        var inputs = dojo.query("#toc .items legend input"), input;
        var result = "";
        for (var i = 0, il = inputs.length; i < il; i++) {
            if (inputs[i].checked) {
                //visible.push(inputs[i].id);
                if (result != "") {
                    result += ",";
                }
                result += inputs[i].value;
            }
        }
        //alert("result: "+result);
        var viewName = dojo.byId("viewname").value;
        //alert("view name: "+dojo.byId("viewname").value);
        if (viewName != null && viewName != "") {
            try {
                //var searchTerm = dojo.byId("owner").value;
                //console.log( "performing search for "+searchTerm+"..." );
                esri.request({
                    url: viewServiceUrl,
                    content: {
                        f: "json",
                        name: viewName,
                        layers: result,
			lu: currentUserLogin
                    },
                    callbackParamName: "callback",
                    load: dojo.partial(this._handleViewSave),
                    error: function(err) {
                        console.error("Unable to get view information" + err);
                    }
                });
            }
            catch (e) {
                console.error(e);
            }
        } else {
            alert("You must enter a name for your view.");
        }
    },

    _handleViewDelete: function(response) {
        //alert("view saved: "+response.viewid);
        jsel.loadData(document.getElementById('viewmenu'), defaultView);
    },

    deleteLayerView: function() {

        var viewSelection = jsel.getSelVal(document.getElementById('viewmenu'));
        //var viewName = confirm("Are you sure you want to delete view: "+viewSelection.text);
        //viewSelection.value
        if (confirm("Are you sure you want to delete view: " + viewSelection.text)) {
            try {
                esri.request({
                    url: viewServiceUrl,
                    content: {
                        f: "json",
                        view: "d",
                        id: viewSelection.value,
			lu: currentUserLogin
                    },
                    callbackParamName: "callback",
                    load: dojo.partial(this._handleViewDelete),
                    error: function(err) {
                        console.error("Unable to get view information" + err);
                    }
                });
            }
            catch (e) {
                console.error(e);
            }
        }
    },

    showhide: function(pLegend, pButton, pLayerId) {

        statusBox._addStatus("service", "Updating Map Service");
        viewServiceCt++;

        //alert("pLegend 2: "+pLegend.length);

        if (pButton.innerHTML == "Show All") {
            //show all layers
            for (var i = 0; i < pLegend.length; i++) {
                pLegend[i].checked = true;
            }
            pButton.innerHTML = "Hide All";
        } else {
            //hide all layers
            for (var i = 0; i < pLegend.length; i++) {
                //alert("pLegend: "+pLegend[i].value);
                pLegend[i].checked = false;
            }
            pButton.innerHTML = "Show All";
        }

        legend.updateLayerVisibility(pLayerId, "0");

        //var boxes = dojo.query("input", pLegend);

        //alert( "len: "+boxes.length);

        //	    var inputs = dojo.query("." + serviceID + "TOC"), input;
        //	    visible = [];
        //	    for (var i = 0, il = inputs.length; i < il; i++) {
        //	        if (inputs[i].checked) {
        //	            visible.push(inputs[i].id);
        //	        }
        //	    }

    }

});
