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
    }    /*  Reduced scale section - Commented out because it caused problems with Google basemaps
     { "level": 0, "resolution": 152.874056570411, "scale": 577790.554289 },
     { "level": 1, "resolution": 76.4370282850732, "scale": 288895.277144 },
     { "level": 2, "resolution": 38.2185141425366, "scale": 144447.638572 },
     { "level": 3, "resolution": 19.1092570712683, "scale": 72223.819286 },
     { "level": 4, "resolution": 9.55462853563415, "scale": 36111.909643 },
     { "level": 5, "resolution": 4.77731426794937, "scale": 18055.954822 },
     { "level": 6, "resolution": 2.38865713397468, "scale": 9027.977411 },
     { "level": 7, "resolution": 1.19432856685505, "scale": 4513.988705 },
     { "level": 8, "resolution": 0.597164283559817, "scale": 2256.994353 },
     { "level": 9, "resolution": 0.298582141647617, "scale": 1128.497176 },
     { "level": 10, "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();
    
    /*
     *
     * Formerly used to have google hybrid enabled when the site loaded...delete before next deploy .......TIM
     //Turn on default layers
     //changeMap([propertyLayer, addressLayer, baseMap, layersLayer]);
     //gMap.setMapTypeId('hybrid');
     //changeMap([propertyLayer, addressLayer, gMap, layersLayer]);
     */
    //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();
}


//RW - Used to set inital values.  Not being used right now, but wanted to preserve the values.
//function SetDefaultText() {
//    dojo.byId("searchBox").value = "123 Main St";
//    dojo.byId("parcelID").value = "001    01504 00016001";
//    dojo.byId("ownerSearch").value = "NASH LOLA";
//    dojo.byId("mapMGP").value = "126C";
//    dojo.byId("groupMGP").value = "P";
//    dojo.byId("parcelMGP").value = "018.00";
//}

function CreateOtherServices(){
    geometryService = new esri.tasks.GeometryService(_geometryService);
    
    //Locator No Longer Used
    //locator = new esri.tasks.Locator(_locatorService);

    //var spatialReference = new esri.SpatialReference({ "wkid": 102100 });
    //locator.outSpatialReference = spatialReference;

    //dojo.connect(locator, "onAddressToLocationsComplete", showAddressLocation);
    //dojo.connect(locator, "onError", showAddressError);
}

//Set up Map Layers
var _basemaps = []; //keep hold of the basemaps layer so we can toggle them
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 services that have roads layer (so we know when to turn on extra roads layer).
    /*
     * Remove Open Street Map...for now
     *
     //Open Street Map
     _osmLayer = new esri.layers.OpenStreetMapLayer();
     _osmLayer.visible = false;
     map.addLayer(_osmLayer);
     _basemaps.push(_osmLayer);
     _roadMaps.push(_osmLayer);
     */
    //_esriCanvas
    _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);
    
    /*
     //add our basemap
     baseMap = new esri.layers.ArcGISTiledMapServiceLayer(_basemapLayer, {
     visible: false,
     id: "baseMap"
     });
     map.addLayer(baseMap);
     _basemaps.push(baseMap);
     */
    //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   
    basemapLayers = new esri.layers.ArcGISDynamicMapServiceLayer(_baseMapLayers, {
        id: "Base Layers",
        opacity: 0.6
    });
    map.addLayer(basemapLayers);
    _basemaps.push(basemapLayers);
    
    
    //City boundary layer (being pulled as a subset from the <CoName>.DynBase map service)
    citiesLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_dynBaseLayer, {
        id: "SumnerCities",
        opacity: 0.6
    });
    //Array City Limit layer so it can be set as the only visible layer within this object
    var cityLayer = [6];
    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: "SumnerProperty"
    });
    map.addLayer(propertyLayer);
    
    
    //Address Layer (being pulled as a subset from the <CoName>.DynBase map service)
    addressLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_dynBaseLayer, {
        id: "SumnerAddress"
    });
    //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);
    
    
    //County Layers service
    layersLayer = new esri.layers.ArcGISDynamicMapServiceLayer(_LayersLayer, {
        id: "Layers",
        opacity: 0.6
    });
    map.addLayer(layersLayer);
    addToTOC(layersLayer, true, [1, 2, 3, 4, 29, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25]);
    //Add the layers layer to the Legend
    _legendLayers.push({
        layer: layersLayer,
        title: 'Sumner County Layers'
    });
    dojo.connect(layersLayer, "onLoad", StartLegend);
    
    
    //GPDATA Feature Layer
    gpdataFeatureLayer = new esri.layers.FeatureLayer(_parcelFeatureLayer + "/49", {
        mode: esri.layers.FeatureLayer.MODE_SNAPSHOT,
        outFields: ["*"]
    });
    
}

/*
 Basemap-hiding function...
 */
function turnOffBaseLayers(){
    basemapLayers.hide()
};

var _turnedOffBaseLayer;
function checkZoomLayers(extent, zoomFactor, anchor, level){
    //See what basemap is active.  If gmaps, hide after level 18
    //    if (level >= 18) {
    //        if (gMap.visible) {
    //            gMap.hide();
    //            _turnedOffBaseLayer = gMap;
    //        }
    //    }
    //    else {
    //        if (_turnedOffBaseLayer && _turnedOffBaseLayer.visible == false) {
    //            _turnedOffBaseLayer.show();
    //            _turnedOffBaseLayer = null;
    //        }
    //    }
}

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 = true;
    identifyParams.layerIds = [5, 11, 16, 19, 23, 24, 25]; //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"));
    });
}

function findMinZoomLevelFromScale(scale){
    var level;
    dojo.some(_lods, function(item){
        if (item.scale == scale) {
            level = item.level;
            return true;
        }
    });
    return level;
}


dojo.addOnLoad(Init);

