﻿dojo.require("esri.map");
dojo.require("esri.tasks.identify");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.form.Button");
dojo.require("esri.tasks.locator");
dojo.require("esri.tasks.query");


var map, fullExtent, spatialRef, locator, address, attributes, location, score, identifyTask, identifyParams, symbol, loading, layer, layers, layersLoaded, visible = [];
var layer0results, layer1results, nmtcServiceLayer, basemapServiceLayer, bsServiceLayer;

function init() {
    
    fullExtent = new esri.geometry.Extent(216319.4, 3448637.4, 819570.8, 4004263.0, new esri.SpatialReference({ "wkid": 26917 }));

    map = new esri.Map("map", { extent: fullExtent });

    dojo.connect(map, "onLoad", initFunctionality);
    
    var imageParameters = new esri.layers.ImageParameters();
    imageParameters.format = "png24";
    basemapServiceLayer = new esri.layers.ArcGISTiledMapServiceLayer("http://maps.sccommerce.com/ArcGIS/rest/services/DOC_Basemap/MapServer");
    map.addLayer(basemapServiceLayer);
    
    nmtcServiceLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://maps.sccommerce.com/ArcGIS/rest/services/NMTC_Basemap/MapServer", { "imageParameters": imageParameters });
    nmtcServiceLayer.setOpacity(.4);
    map.addLayer(nmtcServiceLayer);
    
    //    if (nmtcServiceLayer.loaded) {
    //        buildLayerList1(nmtcServiceLayer);
    //    }
    //    else {
    //        dojo.connect(nmtcServiceLayer, "onLoad", buildLayerList1);
    //    }

    imageParameters = new esri.layers.ImageParameters();
    imageParameters.format = "png24";
    bsServiceLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://maps.sccommerce.com/ArcGIS/rest/services/Building/MapServer", { "imageParameters": imageParameters });
    bsServiceLayer.setOpacity(.4);

    bsServiceLayer.setVisibleLayers([]);
    map.addLayer(bsServiceLayer);


    //    if (bsServiceLayer.loaded) {
    //        buildLayerList2(bsServiceLayer);
    //    }
    //    else {
    //        dojo.connect(bsServiceLayer, "onLoad", buildLayerList2);
    //    }

    dojo.connect(map.infoWindow, "onShow", function() {
    dijit.byId("tabs").resize();
    });

    locator = new esri.tasks.Locator("http://maps.sccommerce.com/ArcGIS/rest/services/SCDOC_Geocode_TeleAtlas/GeocodeServer");
    dojo.connect(locator, "onAddressToLocationsComplete", showResults);
    
    //dojo.connect(map, "onExtentChange", showExtent);
    
}
   
function initFunctionality(map) {

    dojo.connect(map, "onClick", doIdentify);

    identifyTask = new esri.tasks.IdentifyTask("http://maps.sccommerce.com/ArcGIS/rest/services/NMTC_Basemap/MapServer");

    identifyParams = new esri.tasks.IdentifyParameters();
    identifyParams.tolerance = 3;
    identifyParams.returnGeometry = true;
    identifyParams.layerIds = [0, 1]; //nmtc and county
    identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;

    map.infoWindow.resize(545, 230);
    map.infoWindow.setContent(dijit.byId("tabs").domNode);
    map.infoWindow.setTitle("Identify Results");

    symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.5]));
}

function showExtent(extent) {
    var s = "";
    s = "XMin: " + extent.xmin + "&nbsp;"
           + "YMin: " + extent.ymin + "&nbsp;"
           + "XMax: " + extent.xmax + "&nbsp;"
           + "YMax: " + extent.ymax;
    dojo.byId("info").innerHTML = s;
}

function doIdentify(evt) {
    map.graphics.clear();
    identifyParams.geometry = evt.mapPoint;
    identifyParams.mapExtent = map.extent;
    identifyTask.execute(identifyParams, function(idResults) { addToMap(idResults, evt); });
}

function addToMap(idResults, evt) {
    layer0results = { displayFieldName: null, features: [] };
    layer1results = { displayFieldName: null, features: [] };

    for (var i = 0, il = idResults.length; i < il; i++) {
        var idResult = idResults[i];
        if (idResult.layerId === 0) {
            if (!layer0results.displayFieldName) { layer0results.displayFieldName = idResult.displayFieldName };
            layer0results.features.push(idResult.feature);
        } else if (idResult.layerId === 1) {
            if (!layer1results.displayFieldName) { layer1results.displayFieldName = idResult.displayFieldName };
            layer1results.features.push(idResult.feature);
        }
    }
    dijit.byId("layer0Tab").setContent(layerTabContent(layer0results, "layer0results"));
    dijit.byId("layer1Tab").setContent(layerTabContent(layer1results, "layer1results"));
    
    map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
}

function layerTabContent(layerResults, layerName) {
    var content = "";
    switch (layerName) {
        case "layer0results":
            content = "<i>Total features returned: " + layerResults.features.length + "</i>";
            content += "<table border='1'><tr><th>Census Tract</th><th>Qualifying Level</th><th>Poverty Rate</th><th>Median Family Inc.</th><th>Unemployment Rate</th><th>Population</th></tr>";
            for (var i = 0, il = layerResults.features.length; i < il; i++) {

                content += "<tr><td>" + layerResults.features[i].attributes['FIPS_NUM'] + " <a href='#' onclick='showFeature(" + layerName + ".features[" + i + "]); return false;'>(show)</a></td>";

                if (layerResults.features[i].attributes['QUAL_CT'] == 0) {
                    content += "<td>Does Not Qualify</td>";
                } else if (layerResults.features[i].attributes['QUAL_CT'] == 1) {
                    content += "<td>Moderate</td>";
                } else if (layerResults.features[i].attributes['QUAL_CT'] == 2) {
                    content += "<td>Distressed</td>";
                }

                content += "<td>" + layerResults.features[i].attributes['POV_00'] + "</td>";
                content += "<td>" + layerResults.features[i].attributes['MFInc_00'] + "</td>";
                content += "<td>" + layerResults.features[i].attributes['UERte_00'] + "</td>";
                content += "<td>" + layerResults.features[i].attributes['POP2000'] + "</td>";
                
            }
            content += "</tr></table>";
            break;
        case "layer1results":
            content = "<i>Total features returned: " + layerResults.features.length + "</i>";
            content += "<table border='1'><tr><th>County Name</th><th>Development Status</th><th>Avg. Per Capita Income</th><th>Avg. Hourly Wage</th></tr>";
            for (var i = 0, il = layerResults.features.length; i < il; i++) {
                content += "<tr><td>" + layerResults.features[i].attributes['CNTYNAME'] + " <a href='#' onclick='showFeature(" + layerName + ".features[" + i + "]); return false;'>(show)</a></td>";
                content += "<td>" + layerResults.features[i].attributes['DEVELOPED'] + "</td>";
                content += "<td>" + layerResults.features[i].attributes['AvgPerCap'] + "</td>";
                content += "<td>" + layerResults.features[i].attributes['AvgHrWage'] + "</td>";
            }
            content += "</tr></table>";
            break;
       }
        return content;
}

function showFeature(feature) {
    map.graphics.clear();
    feature.setSymbol(symbol);
    map.graphics.add(feature);
}

function clearGraphics() {
    map.graphics.clear();
    map.setExtent(fullExtent);
    document.getElementById('addressfail').innerHTML = ''; 
} 
   
function locate() {
    map.graphics.clear();
    document.getElementById('addressfail').innerHTML = '';
    var add = dojo.byId("address").value;
    var city = dojo.byId("city").value;
    var state = dojo.byId("state").value;
    var zip = dojo.byId("zip").value
    
    address = {
        Street: add,
        City: city,
        State: state,
        Zip: zip
    };
    locator.addressToLocations(address);
}

function showResults(candidates) {
    var candidate;
    var symbol = new esri.symbol.SimpleMarkerSymbol();
    var infoTemplate = new esri.InfoTemplate("Location", "Address: ${address}<br />Score: ${score}<br />Source locator: ${locatorName}");

    symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND);
    symbol.setColor(new dojo.Color([255, 0, 0, 0.75]));

    var points = new esri.geometry.Multipoint(map.spatialReference);

    if (candidates.length > 0) {

        candidate = candidates[0];
        
        var attributes = { address: candidate.address, score: candidate.score, locatorName: candidate.attributes.Loc_name };
        var graphic = new esri.Graphic(candidate.location, symbol, attributes, infoTemplate);
        map.graphics.add(graphic);
        map.graphics.add(new esri.Graphic(candidate.location, new esri.symbol.TextSymbol(attributes.address).setOffset(0, 8)));
        points.addPoint(candidate.location);

    } else {
    
    document.getElementById('addressfail').innerHTML = 'No address candidates were found.  Please try another address or an adjoining street.'; 
    
    }
    map.setExtent(points.getExtent().expand(3));
    
}


function getMapLayers() {
    for (var j = 0, jl = map.layerIds.length; j < jl; j++) {
        var currentLayer = map.getLayer(map.layerIds[j]);
        alert("id: " + currentLayer.id + ", visible: " + currentLayer.visible + ", opacity: " + currentLayer.opacity);
    }
}

function showLoading() {
   esri.show(loading);
   map.disableMapNavigation();
   map.hideZoomSlider();
}

function hideLoading() {
   layersLoaded++;
   if (layersLoaded === map.layerIds.length) {
       esri.hide(loading);
       map.enableMapNavigation();
       map.showZoomSlider();
       layersLoaded = 0;
   }
}

function buildLayerList1(layer) {
    var infos = layer.layerInfos, info;
    var items = [];
    for (var i = 0, il = infos.length; i < il; i++) {
        info = infos[i];
        if (info.defaultVisibility) {
            visible.push(info.id);
        }
    }
    nmtcServiceLayer.setVisibleLayers(visible);
    map.addLayer(nmtcServiceLayer);
}

function buildLayerList2(layer) {
    var infos = layer.layerInfos, info;
    var items = [];
    for (var i = 0, il = infos.length; i < il; i++) {
        info = infos[i];
        if (info.defaultVisibility) {
            visible.push(info.id);
        }
    }
    bsServiceLayer.setVisibleLayers(visible);
    map.addLayer(bsServiceLayer);
}

function updateLayerVisibility1() {
    var inputs = dojo.query(".list_item1"), input;
    visible = [];
    for (var i = 0, il = inputs.length; i < il; i++) {
        if (inputs[i].checked) {
            visible.push(inputs[i].id);
        }
    }
    nmtcServiceLayer.setVisibleLayers(visible);
}

function updateLayerVisibility2() {
    var inputs = dojo.query(".list_item2"), input;
    visible = [];
    for (var i = 0, il = inputs.length; i < il; i++) {
        if (inputs[i].checked) {
            visible.push(inputs[i].id);
        }
    }
    bsServiceLayer.setVisibleLayers(visible);
}



