dojo.require("esri.map");
dojo.require("esri.tasks.query");
dojo.require("esri.tasks.find");
dojo.require("esri.tasks.identify");
dojo.require("esri.tasks.geometry");
dojo.require("esri.toolbars.navigation");
dojo.require("esri.layers.FeatureLayer");
dojo.require("esri.toolbars.draw");
dojo.require("dojox.grid.DataGrid");
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.Toolbar");
dojo.require("esri.dijit.Measurement");
dojo.require("esri.SnappingManager");
dojo.require("esri.dijit.Scalebar");
dojo.require("esri.dijit.Legend");
dojo.require("esri.layers.osm");

//define variables
var gMap;
var graphic;
var locator;
var findTask;
var findParams, identifyTask;
var grid;
var store;
var esriTopo;
var navToolbar;
var identifyParams;
var symbol;
var featureSet;
var infoTemplate;
var mapServiceStr;
var spRef;
var sessionParams = {};
var map = null;
var resizeTimer;
var startExtent;
var fields = {};
var keyField, addressField;
var _osmLayer, _TNImageryMap;
var streetMap;
var layersLayer;

// run the config.js function to set the machine-specific services and related properties
setConfigProperties();

var searchResults;
var featureID = "";
var mapName;
var propertyLayer;
var addressLayer;
var SumnerBase;
var countiesLayer;
var mapCenter = "";
var loading;
var gpdataFeatureLayer;
var objId;
var relationFlds;
var _googleEarthInitilized = false;
var _VEInitialized = false;
var _legendLayers = [];
var _lods;

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start){
        for (var i = (start || 0), j = this.length; i < j; i++) {
            if (this[i] === obj) {
                return i;
            }
        }
        return -1;
    };
}

function Init(){
    //Hide initial loader
    dojo.style(dojo.byId("loadingOverlay"), "display", "none");
    dojo.style(dojo.byId("panelContainer"), "display", "block");
    
    //checks for cookie to display disclaimer dialog
    var disclaim = dijit.byId("disclaimer");
    disclaim.show();
    
    //Set up map and services and layers.
    loading = dojo.byId("loadingImg");
    
    esriConfig.defaults.io.proxyUrl = "Proxy.ashx";//GEOJOBE Proxy
    esriConfig.defaults.io.alwaysUseProxy = false;
    
    //Set up Levels of Detail
    _lods = [{
        "level": 0,
        "resolution": 156543.033928,
        "scale": 591657527.591555
    }, {
        "level": 1,
        "resolution": 78271.5169639999,
        "scale": 295828763.795777
    }, {
        "level": 2,
        "resolution": 39135.7584820001,
        "scale": 147914381.897889
    }, {
        "level": 3,
        "resolution": 19567.8792409999,
        "scale": 73957190.948944
    }, {
        "level": 4,
        "resolution": 9783.93962049996,
        "scale": 36978595.474472
    }, {
        "level": 5,
        "resolution": 4891.96981024998,
        "scale": 18489297.737236
    }, {
        "level": 6,
        "resolution": 2445.98490512499,
        "scale": 9244648.868618
    }, {
        "level": 7,
        "resolution": 1222.99245256249,
        "scale": 4622324.434309
    }, {
        "level": 8,
        "resolution": 611.49622628138,
        "scale": 2311162.217155
    }, {
        "level": 9,
        "resolution": 305.748113140558,
        "scale": 1155581.108577
    }, {
        "level": 10,
        "resolution": 152.874056570411,
        "scale": 577790.554289
    }, {
        "level": 11,
        "resolution": 76.4370282850732,
        "scale": 288895.277144
    }, {
        "level": 12,
        "resolution": 38.2185141425366,
        "scale": 144447.638572
    }, {
        "level": 13,
        "resolution": 19.1092570712683,
        "scale": 72223.819286
    }, {
        "level": 14,
        "resolution": 9.55462853563415,
        "scale": 36111.909643
    }, {
        "level": 15,
        "resolution": 4.77731426794937,
        "scale": 18055.954822
    }, {
        "level": 16,
        "resolution": 2.38865713397468,
        "scale": 9027.977411
    }, {
        "level": 17,
        "resolution": 1.19432856685505,
        "scale": 4513.988705
    }, {
        "level": 18,
        "resolution": 0.597164283559817,
        "scale": 2256.994353
    }, {
        "level": 19,
        "resolution": 0.298582141647617,
        "scale": 1128.497176
    }, {
        "level": 20,
        "resolution": 0.132291931250529,
        "scale": 500
    }];
    
    //init map
    map = new esri.Map("mapDiv", {
        extent: startExtent,
        logo: false,
        lods: _lods
    });
    
    //Show loading dialog while we wait
    showLoading();
    
    //Get and hold on to map center
    mapCenter = map.extent.getCenter();
    
    //set up navToolbar
    navToolbar = new esri.toolbars.Navigation(map);
    
    //Connect all map events
    ConnectMapEvents();
    
    //Set Up Map Layers
    InitializeMapLayers();
    
    //Turn on default layers
    //changeMap([propertyLayer, addressLayer, layersLayer]);
    //changeMap([propertyLayer, addressLayer, baseMap, layersLayer]);  //switch this back when basemap is created
    
    //RW - Just left this here.
    if (featureID !== "" && featureID !== undefined) {
        executeQueryTask();
    }
    
    //Create Geom Service
    CreateOtherServices();
    
    //Hide Loading
    hideLoading();
    
    //Set up query task
    setupQueryTask();
    
    //Start Measurement Dijit
    initializeMeasurement();
    
    //Set up listener for when users change accordions
    setupAccordionListener();
    
    //Set up nav bar tooltips
    setUpTooltips();
    
    //Add extra links to property details window
    addMoreLinks();
    
}

var _measurement;
function initializeMeasurement(){
    _measurement = new esri.dijit.Measurement({
        map: map
    }, dojo.byId('measurementDiv'));
    
    _measurement.deactivate = function(){
        _measurement.setTool("location", false);
        _measurement.setTool("distance", false);
        _measurement.setTool("area", false);
        _measurement.clearResult();
    };
    
    _measurement.startup();
}

function showLoading(){
    esri.show(loading);
    map.disableMapNavigation();
    map.hideZoomSlider();
}

function hideLoading(error){
    esri.hide(loading);
    map.enableMapNavigation();
    map.showZoomSlider();
}

var _identifyConnector;
function ConnectMapEvents(){
    dojo.connect(map, "onExtentChange", extentChange);
    
    _identifyConnector = dojo.connect(map, "onClick", searchByMapClick);
    
    dojo.connect(dijit.byId('mapDiv'), 'resize', function(){
        resizeMap();
    });
    
    dojo.connect(map, "onZoomEnd", checkZoomLayers);
}

var legend;
function StartLegend(){
    legend = new esri.dijit.Legend({
        map: map,
        layerInfos: _legendLayers
    }, "legendDiv");
    legend.startup();
}

function CreateOtherServices(){
    geometryService = new esri.tasks.GeometryService(_geometryService);
}

//Set up Map Layers
var _basemaps = [];
var _roadMaps = [];
function InitializeMapLayers(){

    //ESRI street map
    streetMap = new esri.layers.ArcGISTiledMapServiceLayer(_streetmapLayer, {
        id: "streetMap",
        visible: false
    });
    map.addLayer(streetMap); //Add to map
    _basemaps.push(streetMap); //Add to list of basemaps
    _roadMaps.push(streetMap); //Add to list of streetmaps
    
    
    //Esri Grey Canvas
    _esriCanvasMap = new esri.layers.ArcGISTiledMapServiceLayer(_esriCanvasUrl, {
        id: "esriCanvas",
        visible: false
    });
    map.addLayer(_esriCanvasMap);
    _basemaps.push(_esriCanvasMap);
    _roadMaps.push(_esriCanvasMap);
    
    
    //Add TN Imagery Layer
    _TNImageryMap = new esri.layers.ArcGISTiledMapServiceLayer(_TNImageryLayer, {
        id: "TNImageryMap",
        visible: false
    });
    map.addLayer(_TNImageryMap);
    _basemaps.push(_TNImageryMap);
    
    
    //_esriTopo
    _esriTopoMap = new esri.layers.ArcGISTiledMapServiceLayer(_esriTopoURL, {
        id: "esriTopo",
        visible: false
    });
    map.addLayer(_esriTopoMap);
    _basemaps.push(_esriTopoMap);
    _roadMaps.push(_esriTopoMap);
    
    
    //Google Maps
    gMap = new gmaps.GoogleMapsLayer({
        visible: false,
        id: 'googlemaps'
    });
    map.addLayer(gMap);
    _basemaps.push(gMap);
    _roadMaps.push(gMap);
    
    
    //ESRI Imagery
    esriTopo = initLayer(_topoLayer, "esriAerial");
    _basemaps.push(esriTopo);
    
    
    //ESRI shaded relief
    shadedReliefMap = new esri.layers.ArcGISTiledMapServiceLayer(_esriShadedReliefURL, {
        id: "shadedReliefMap",
        visible: false  
    });
    map.addLayer(shadedReliefMap); //Add to map
     _basemaps.push(shadedReliefMap); //Add to list of basemaps
     
     
    //GEOPowered Basemap
    basemapLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_baseMapLayers, {
        id: "Base Layers",
        opacity: 0.6
    });
    map.addLayer(basemapLayer);
    _basemaps.push(basemapLayer); //Add to list of basemaps
    
    
    //City boundary layer (being pulled as a subset from the <CoName>.DynBase map service)
    citiesLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_dynBaseLayer, {
        id: "WilsonCities",
        opacity: 0.6
    });
    //Array City Limit layer so it can be set as the only visible layer within this object
    var cityLayer = [7, 8, 9];
    citiesLayer.setVisibleLayers(cityLayer);
    //Add to the map and add to the basemaps array so the city boundaries turn off when the county basemap isn't active
    map.addLayer(citiesLayer);
    _basemaps.push(citiesLayer);
    
    
    //Parcel Layer
    propertyLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_parcelLayer, {
        id: "WilsonProperty"
    });
    map.addLayer(propertyLayer);
    
    
    //Address Layer (being pulled as a subset from the <CoName>.DynBase map service)
    addressLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_dynBaseLayer, {
        id: "WilsonAddress"
    });
    //Array address layers so they can be set as the only visible layers within this object
    var addressLayers = [0, 1, 2, 3, 4, 5];
    addressLayer.setVisibleLayers(addressLayers);
    map.addLayer(addressLayer);
    
    
    //TN Layers service
    layersLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_LayersLayer, {
        id: "Layers",
        opacity: 0.6
    });
    map.addLayer(layersLayer);
    addToTOC(layersLayer, true, [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,29,30,31,37,38,39]);
    //Add the layers layer to the Legend
    _legendLayers.push({
        layer: layersLayer,
        title: 'Mt. Juliet Layers'
    });
    
    dojo.connect(layersLayer, "onLoad", StartLegend);
    
    
    //GPDATA Feature Layer
    gpdataFeatureLayer = new esri.layers.FeatureLayer(_parcelFeatureLayer + "/47", { //GPDATA
        mode: esri.layers.FeatureLayer.MODE_SNAPSHOT,
        outFields: ["*"]
    });
}

function turnOffBaseLayers(){
    basemapLayer.hide();
}

var _turnedOffBaseLayer;
function checkZoomLayers(extent, zoomFactor, anchor, level){
}

function setupAccordionListener(){
    //Subscribe to MiniMaps Accordions so we know when to init
    
    dojo.connect(dijit.byId("accordionQ"), 'selectChild', function(node){
        //Set the active tool based on the selected accordiond
        switch (node.title) {
            case 'Street View':
                initQueryLocations();
                break;
                
            case 'Google Earth':
                if (_googleEarthInitilized === false) {
                    initializeGoogleEarth();
                    _googleEarthInitilized = true;
                }
                break;
                
            case "Bird's Eye":
                if (_VEInitialized === false) {
                    var w = dojo.style(dojo.byId("birdseyeDiv"), "width");
                    var h = dojo.style(dojo.byId("birdseyeDiv"), "height");
                    VEMapStartup();
                    _VEInitialized = true;
                }
                break;
        }
    });
}

function setupQueryTask(){
    //setup the identify parameters and task
    identifyTask = new esri.tasks.IdentifyTask(_LayersLayer); //See config for URL settings
    identifyParams = new esri.tasks.IdentifyParameters();
    identifyParams.tolerance = 3;
    identifyParams.returnGeometry = false;
    identifyParams.layerIds = [6,7,8,9,15,17,20,27,29,30,31]; //Only search these layers
    identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
}

function initLayer(url, id){
    var layer = new esri.layers.ArcGISTiledMapServiceLayer(url, {
        id: id,
        visible: false
    });
    map.addLayer(layer);
    return layer;
}

var _measureToolActive = false;
function toggleMeasureDialog(){
    if (dojo.style('uxMeasurementWrapper', "display") == "none") {
        dojo.byId('uxMeasurementWrapper').style.display = "block";
        changeButton('Measure');
        _measureToolActive = true;
        //disconnect click events
        dojo.disconnect(_identifyConnector);
    }
    else {
        clearButtons();
        _measurement.deactivate();
        dojo.byId('uxMeasurementWrapper').style.display = "none";
        _measureToolActive = false;
        //reconnect click events
        _identifyConnector = dojo.connect(map, "onClick", searchByMapClick);
    }
}

function clearAll(){
    map.graphics.clear();
    map.infoWindow.hide();
    navToolbar.deactivate();
}

function doSlider(){
    switchTab(0);
    dijit.byId("accordionQ").selectChild(dijit.byId("titleGroupSearchResults"));
}

/////////////////////////////
function initializeGSV(evt){
    mapCenter1 = esri.geometry.webMercatorToGeographic(evt);
    lat = mapCenter1.y;
    lng = mapCenter1.x;
    document.getElementsByTagName("iframe")[0].src = "http://maps.google.com/maps?layer=c&cbll=" + lat + "," + lng +
    "&cbp=12,0,,0,5&output=svembed&ll=" +
    lat +
    "," +
    lng;
}

/////////////////////////////
function hideDivs(){
    dojo.byId("parcelsearchdiv").style.display = "none";
    //    dojo.byId("parcelsearchdiv2").style.display = "none";
    dojo.byId("uxAddressResultsList").style.display = "none";
}

function toolbars(){
    navToolbar.deactivate();
}

function switchTab(id){
    //Clear tabs of active state
    dojo.query(".eTab").removeClass("active");
    
    //Set active tab
    dojo.addClass(dojo.byId("uxTab" + id), "active");
    
    //Clear tab panels of active state
    dojo.query(".tabPanel").removeClass("active");
    
    //Set active panel
    dojo.addClass(dojo.byId("tab" + id), "active");
    
}

//Toolbar Functions
//Tool activation
function ActivateZoomInTool(){
    navToolbar.activate(esri.toolbars.Navigation.ZOOM_IN);
    changeButton('ZoomIn');
    map.setMapCursor('url(images/zoomInCursor.png),auto');
    dojo.disconnect(_identifyConnector);
}

function ActivateZoomOutTool(){
    navToolbar.activate(esri.toolbars.Navigation.ZOOM_OUT);
    changeButton('ZoomOut');
    map.setMapCursor('url(images/zoomOutCursor.png),auto');
    dojo.disconnect(_identifyConnector);
}

function ActivateIdentifyTool(){
    navToolbar.activate(esri.toolbars.Navigation.PAN);
    changeButton('Identify');
    map.setMapCursor('default');
    _identifyConnector = dojo.connect(map, "onClick", searchByMapClick);
}

function ActivatePanTool(){
    navToolbar.activate(esri.toolbars.Navigation.PAN);
    changeButton('Pan');
    map.setMapCursor('default');
    dojo.disconnect(_identifyConnector);
}

function setUpTooltips(){
    new dijit.Tooltip({
        connectId: ["zoomin"],
        label: "Zoom In",
        position: ["below"]
    });
    
    new dijit.Tooltip({
        connectId: ["zoomout"],
        label: "Zoom Out",
        position: ["below"]
    });
    
    new dijit.Tooltip({
        connectId: ["pan"],
        label: "Pan",
        position: ["below"]
    });
    
    new dijit.Tooltip({
        connectId: ["identifyTool"],
        label: "Identify",
        position: ["below"]
    });
    
    new dijit.Tooltip({
        connectId: ["zoomfullext"],
        label: "Zoom To Full Extent",
        position: ["below"]
    });
    
    new dijit.Tooltip({
        connectId: ["clearAll"],
        label: "Clear Map",
        position: ["below"]
    });
    
    new dijit.Tooltip({
        connectId: ["measure"],
        label: "Measure Tool",
        position: ["below"]
    });
    
     new dijit.Tooltip({
        connectId: ["print"],
        label: "Print Map",
        position: ["below"]
    });
}

function addMoreLinks(){
    dojo.forEach(_propDetailsLinks, function(item){
        dojo.place('<div class="tableValue"><a target="_blank" href="' + item.link + '">' + item.name + '</a></div>', dojo.byId("moreLinks"));
    });
}

dojo.addOnLoad(Init);

function findMinZoomLevelFromScale(scale){
    var level;
    dojo.some(_lods, function(item){
        if (item.scale == scale) {
            level = item.level;
            return true;
        }
    });
    return level;
}

