// ###################################################################################
//  purpose:  This module contains all the entry point code for the application
//
//
//  functions:
//      <-- Functions dealing with initializing the map and the layers -->
//      application_onStartup: called on page load -- initilizes the map 
//      onBaseMapLayerLoaded: called after the base layer is loaded, gets the parcel layer id from the base layer and initialized all the searches that require the parcels to be in the map
//      mapLoaded: connects all the other stuff on the map, ie pans, zooms, extent history.  requires the map be loaded first
//      
//      <-- event handler functions -->    
//      onMapMouseMove: triggered on mouse moving over the map - starts the event for getting map coordinates
//      onMapMouseOut: triggered when mouse leaves the map area - reset the coords to nothing
//      onMapExtentChange: tiggered when the extent of the map changes - recalculates the scale
//      calcScale: recacluates the scale of the map
//      resizeMap: resizes the map when the browser resizes
//      map_onclick: Event triggered when a user clicks the map canvas
//          identify--> triggers the 'doIdentify' function
//          select -->  triggers the printing of the tax card 'doSelect' function in taxcard.js
//          zoomout --> map to zoom out
//
//      <-- user functions -->
//      printLegend_onClick: user clicks the legend button on toolbar,app goes to server for the legend
//      printLegend_onComplete: retrieves the response for the legend and renders it in the side panel.
//
//      <-- Toolbar Functions -->
//      setToolImage: changes the tool image in the toolbar   
//
//      <-- Map Functions -->
//      zoomToInitialExtent: zooms to the initial extent of the map
//      zoomMap: zooms maps to a feature geometry
//      centerMap: centers map on feature's extent
//      zoomOut: zooms the map out by x percent
//      zoomIn: zooms the map in by x percent
//      zoomToAllGraphics: zooms to all the graphics in the map
//      clearAllGraphics: clear the graphics and graphic containers in the map
//
//      <-- General functions -->
//      showConfigurationError: show the error panel
//      showError: shows an error panel
//      showLoading: starts the time on the a layer load or visibility change
//      hideLoading: end the timer on layer load or visibility change
//
//      <-- Functions dealing with hiding & showing Side panels
//      showPanel: show & initializes the targeted side panel
//      hidePanels: hides all the side panels
// ####################################################################################


dojo.require("dojo.parser");
dojo.require("esri.map");
dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.form.Button");
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.Toolbar");
dojo.require("esri.tasks.geometry");
dojo.require("esri.tasks.query");
dojo.require("esri.tasks.find");
dojo.require("dijit.Dialog");
dojo.require("esri.toolbars.draw");
dojo.require("dojo.currency");
dojo.require("dijit.form.FilteringSelect");
dojo.require("dijits.tools.LoadingDialog");

// deletable -- ,initialExtent,;
var gsvc, map;
var resizeTimer;
var navToolbar;
var idHandle;
var advancedSearch;
var loading, layersLoaded;
var currentTool = "MapIdentify";
var currentPanel = "";
var currentResultsPanel = "NORESULTS";
var mapPanels = ["SEARCH", "ADVANCEDSEARCH", "TAXCARD", "RESULTS", "LAYERS", "MEASURE", "BUFFER", "ZOOM", "LEGEND", "INFO", "PRINT", "NORESULTS"];
var parcelQuery;
var queryTask, query, featureSet, fset, locator, baseMapLayer, maxPage;
var quickFind, quickFindParams;

var lastUpdateDate;

var modalDialog = null;

function application_onStartup() {

    try {

        // show the loading layer...
        layersLoaded = 0;
        loading = dojo.byId("loading");
        hideLoading();

        modalDialog = new dijits.tools.LoadingDialog();
        modalDialog.startup();
        modalDialog.setMessage("Starting application...");

        // update the copyright info from global.js
        dojo.byId("copyright").innerHTML = copyrighttext;

        // MAIN MAP
        map = new esri.Map("mapDiv", { nav: true, slider: false });
        dojo.connect(map, "onLoad", mapLoaded);

        //baseMapLayer = new esri.layers.ArcGISTiledMapServiceLayer(baseMapLayerUrl);
        modalDialog.setMessage("Loading Layers...");
        baseMapLayer = new esri.layers.ArcGISDynamicMapServiceLayer(baseMapLayerUrl, { "id": "map", "visible": true });
        dojo.connect(baseMapLayer, "onUpdate", hideLoading);
        dojo.connect(baseMapLayer, "onLoad", onBaseMapLayerLoaded);
        map.addLayer(baseMapLayer);
        
        var initLoadConnect = dojo.connect(baseMapLayer, "onUpdate", function() {
            modalDialog.hide();
            dojo.disconnect(initLoadConnect);
        });
        

        // Set the Geometry Sarvice and Proxy data handler
        gsvc = new esri.tasks.GeometryService(geoServiceUrl);
        esriConfig.defaults.io.proxyUrl = "proxy.ashx";
        esriConfig.defaults.io.alwaysUseProxy = false;

        showPanel('SEARCH');

        // Connect the Navigation Tools to the main Map
        navToolbar = new esri.toolbars.Navigation(map);
        measureToolbar = new esri.toolbars.Draw(map);
        //dojo.connect(navToolbar, "onExtentHistoryChange", extentHistoryChangeHandler);

        // post the message text
        dojo.byId("messagebox").innerHTML = msgText;
        
        GetLastUpdate();

        // Set up the building map
        if (bldgDummyLayerURL != "") {
            var bExtent = new esri.geometry.Extent(2501200, 527600, 2501300, 527700, new esri.SpatialReference({ "wkid": 54052 }));
            bMap = new esri.Map("buildingMap", { nav: false, slider: false, initialExtent: bExtent });
            dummyMapLayer = new esri.layers.ArcGISDynamicMapServiceLayer(baseMapLayerUrl, { "id": "dummy", "visible": false });
            bMap.addLayer(dummyMapLayer);
            
            // disable navigation on the building map.
            dojo.connect(bMap, "onLoad", function() {

                bMap.disableShiftDoubleClickZoom();
                bMap.disableRubberBandZoom();
                bMap.disablePan();
                bMap.disableClickRecenter();
                bMap.disableKeyboardNavigation();
                bMap.disableMapNavigation();
                bMap.disableDoubleClickZoom();
                bMap.disableScrollWheelZoom();
            });
            
        }
        
        
    } catch (err) {
        console.debug(err);
        modalDialog.setMessage("There was an unknown error when loading the map");
    }
}

// ########################################################
// Loading Functions
// ########################################################
function onBaseMapLayerLoaded() {

    try {
        // If the parcel layer is set to -1 then we will find it in the baseMapLayer
        // else we assume that you want to hard code it in the searchURL map service...
        if (parcels_layerID == -1)
            parcels_layerID = findLayerByName(parcelsLayerName, "map");
            
            
        if (parcels_layerID > -1) {
            // create the parcel search url string...
            parcelSearchLayerURL = searchURL + "/" + parcels_layerID;

            modalDialog.setMessage("initializing search layers...");

            // init the searches and queries dealing with parcels
            defaultLayersToIdentify = [parcels_layerID];
            layersToIdentify = defaultLayersToIdentify;
            initIdentifyFunctionality();
            initSelectParcel();
            initSearch();
            idHandle = dojo.connect(map, "onClick", map_onclick);
            
            parcelQuery = new parcelQuery();
            
            modalDialog.setMessage("initialization complete...");
        } else {
            showConfigurationError("Could not find Target Layer " + parcelsLayerName);
        }
    } catch (err) {
        showConfigurationError("Problem in initilizing Target Layer: " + err.message);
    }
}



// ON MAP LOAD EVENT
function mapLoaded(thisMap) {
    // MAP EVENTS
    try {
      dojo.connect(map, "onMouseMove", onMapMouseMove);
      dojo.connect(map, "onMouseOut", onMapMouseOut);
      dojo.connect(map, "onExtentChange", onMapExtentChange);
      //dojo.connect(map, "onPan",onMapPan);
      dojo.connect(map, "onZoomStart", showLoading);
      dojo.connect(map, "onPanStart", showLoading);
      dojo.connect(window, 'onresize', function() { resizeMap([map]); });
      calcScale(map.extent)
      map.enableScrollWheelZoom();
      // disable the map navigation
      map.disableShiftDoubleClickZoom();
      map.disableRubberBandZoom();
      map.disablePan();
      map.disableClickRecenter();
      map.disableKeyboardNavigation();
      map.disableMapNavigation();
      map.disableDoubleClickZoom();
      
      try {
        loadAdditionalLayers();
      } catch(ex) {
        console.warn("error adding additional layers...", ex);
      }

      modalDialog.setMessage("Initializing Application components...");

      //loadTocItems();

      ToolbarStartUp();
      measureToolbar_startup();

      // create the graphic Layers used in the app...
      allSelectionGraphics = new esri.layers.GraphicsLayer({ id: "allselection", displayOnPan: dojo.isIE ? false : true })
      map.addLayer(allSelectionGraphics);
      
      selectionGraphics = new esri.layers.GraphicsLayer({ id: "selection", displayOnPan: dojo.isIE ? false : true })
      map.addLayer(selectionGraphics);

      bufferGraphics = new esri.layers.GraphicsLayer({ id: "buffer", displayOnPan: dojo.isIE ? false : true })
      map.addLayer(bufferGraphics);

      detailGraphics = new esri.layers.GraphicsLayer({ id: "details", displayOnPan: dojo.isIE ? false : true })
      map.addLayer(detailGraphics);
      
      modalDialog.setMessage("Start up complete");
      //modalDialog.hide();
          
    } catch (error) {
      console.debug("An error occurred in the 'mapLoaded' routine");
      console.debug(error);
    }
}


// ########################################################
// Toolbar Functions
// ########################################################
function ToolbarStartUp() {

    try {
        // Connect all the mouse down events...
        dojo.connect(dojo.byId("B_ZOOMIN"), "onmousedown", function() { ToolbarMouseDown('MapZoomIn', 'Tool'); });
        dojo.connect(dojo.byId("B_ZOOMOUT"), "onmousedown", function() { ToolbarMouseDown('MapZoomOut', 'Command'); });
        dojo.connect(dojo.byId("zoomprev"), "onmousedown", function() { ToolbarMouseDown('MapZoomPrevious', 'Command'); });
        dojo.connect(dojo.byId("zoomnext"), "onmousedown", function() { ToolbarMouseDown('MapZoomNext', 'Command'); });
        dojo.connect(dojo.byId("B_ZOOMFULL"), "onmousedown", function() { ToolbarMouseDown('MapFullExtent', 'Command'); });
        dojo.connect(dojo.byId("B_PAN"), "onmousedown", function() { ToolbarMouseDown('MapPan', 'Tool'); });
        dojo.connect(dojo.byId("B_ZOOMSCALE"), "onmousedown", function() { ToolbarMouseDown('ShowZoom', 'Command'); });
        dojo.connect(dojo.byId("B_SEARCH"), "onmousedown", function() { ToolbarMouseDown('ShowSearch', 'Command'); });
        dojo.connect(dojo.byId("B_ADVANCEDSEARCH"), "onmousedown", function() { ToolbarMouseDown('ShowAdvancedSearch', 'Command'); });
        dojo.connect(dojo.byId("B_BUFFER"), "onmousedown", function() { ToolbarMouseDown('ShowBufferSearch', 'Command'); });
        dojo.connect(dojo.byId("B_LAYERS"), "onmousedown", function() { ToolbarMouseDown('MapLayers', 'Command'); });
        dojo.connect(dojo.byId("B_LEGEND"), "onmousedown", function() { ToolbarMouseDown('MapLegend', 'Command'); });
        dojo.connect(dojo.byId("B_PRINT"), "onmousedown", function() { ToolbarMouseDown('MapPrint', 'Command'); });
        dojo.connect(dojo.byId("B_IDENTIFY"), "onmousedown", function() { ToolbarMouseDown('MapIdentify', 'Tool'); });
        dojo.connect(dojo.byId("B_SELECT"), "onmousedown", function() { ToolbarMouseDown('ParcelSelect', 'Tool'); });
        dojo.connect(dojo.byId("B_MEASURE"), "onmousedown", function() { ToolbarMouseDown('MapMeasure', 'Command'); });
        dojo.connect(dojo.byId("B_CLEAR"), "onmousedown", function() { ToolbarMouseDown('ClearSelection', 'Command'); });
        dojo.connect(dojo.byId("B_RESULTS"), "onmousedown", function() { ToolbarMouseDown('ParcelResults', 'Command'); });



    } catch (Error) {
        console.warn("An error occurred in ToolBarStartUp function", Error);
    }

}

function ToolbarMouseOut(tool) {
    if (tool != currentTool) {
        dojo.style(tool, { borderStyle: "none" });
    }
}

function ToolbarMouseOver(tool) {
    dojo.style(tool, { borderStyle: "Solid", borderColor: "red", borderWidth: "1px" });
}

function ToolbarMouseDown(tool, tooltype) {

    map.infoWindow.hide();

    // example: 'ClearSelection', 'Command'
    // Tools are: MapZoomIn, MapZoomOut, MapPan, MapMeasure, MapIdentify, MapSelect
    if (tooltype === "Tool") {
        clearCurrentTool();

        //dojo.style(tool, { backgroundColor: "white", borderStyle: "inset", borderColor: "white", borderWidth: "1px" });
        currentTool = tool;
        changeMapCursors(tool);

        deactivateMeasureToolbar();
        switch (tool) {
            case "MapZoomIn":
                navToolbar.activate(esri.toolbars.Navigation.ZOOM_IN);
                setToolImage('ZOOMIN');
                break;           
            case "MapPan":
                navToolbar.activate(esri.toolbars.Navigation.PAN);
                setToolImage("PAN");
                break;
            case "MapIdentify":
                
                setToolImage("IDENTIFY");
                measureToolbar_clear();
                navToolbar.activate(esri.toolbars.Navigation.PAN);
                break;
            case "ParcelSelect":
                
                setToolImage("SELECT");
                measureToolbar_clear();
                navToolbar.activate(esri.toolbars.Navigation.PAN);
                break;

        }


    } else {
        switch (tool) {
            case "MapFullExtent":
                zoomToInitialExtent();
                break;
            case "MapZoomOut":
                map.centerAndZoom(map.extent.getCenter(), 2.5)
                //map.setLevel(map.getLevel() - 1);
                break;
            case "MapZoomNext":
                navToolbar.zoomToNextExtent();
                break;
            case "MapZoomPrevious":
                navToolbar.zoomToPrevExtent();
                break;
            case "MapMeasure":
                activateMeasureToolbar();
                setToolImage('MEASURE'); showPanel('MEASURE');
                break;
            case "ShowZoom":
                initStreetsFilteringSelect();
                showPanel("ZOOM");
                break;
            case "ShowSearch":
                searchPanel_onClick(); 
                break;
            case "ShowAdvancedSearch":
                advancedSearchPanel_onClick();
                dojo.style("BUFFER", { 'display': 'none' });
                break;
            case "ShowBufferSearch":
                bufferSearchPanel_onClick();
                dojo.style("ADVANCEDSEARCH", { "display": "block" });
                break;
            case "MapPrint":
                showPanel("PRINT");
                showPrintingPanel();
                break;
            case "MapLegend":
                showPanel("LEGEND");
                printLegend_onClick();
                break;
            case "MapLayers":
                showPanel("LAYERS");
                refreshtoc();
                break;
            case "ParcelResults":
                showPanel(currentResultsPanel);
                break;
            case "ClearSelection":
                clearSearchResults();
                clearAllGraphics();
                clearSearchPanel();
                clearAdvancedSearch();
                
                if ((currentPanel == "TAXCARD") || (currentPanel == "RESULTS"))
                    showPanel(returnToPanel);
                break;
            default:
                break;
        }
    }
}

function changeMapCursors(tool) {


    try {

        switch (tool) {
            case "MapZoomIn":
                dojo.style("mapDiv_layers", { cursor: "crosshair" });
                break;
            case "MapIdentify":
                dojo.style("mapDiv_layers", { cursor: "pointer" });
                break;
            case "MapSelect":
                dojo.style("mapDiv_layers", { cursor: "pointer" });
                break;
            case "MapPan":
                dojo.style("mapDiv_layers", { cursor: "default" });
                  break;
            case "MapMeasure":
                dojo.style("mapDiv_layers", { cursor: "crosshair" });
                break;
            default:
                dojo.style("mapDiv_layers", { cursor: "default" });
                break;
        }
    } catch (Error) {
        console.warn("An error occurred while setting the cursor for the tool", Error);

    }
}

function showPanel(name) {
    hidePanels();
    dojo.style(name, { 'display': 'block' });

    switch(name) {
        case "BUFFER":
            dojo.style("ADVANCEDSEARCH", { "display": "block" });
            break;
    }
    currentPanel = name;
    
}

function hidePanels() {
    try {
        dojo.forEach(mapPanels, function(name) {
            try { dojo.style(name, { 'display': 'none' }); } catch (Error) { console.warn("panel not found", Error); }
        });
    } catch (Error) {
        console.warn("An error occurred in 'hidePanel': ", Error);
    }
}

function clearCurrentTool() {
    try {
        // clear selected tools
        currentTool = "";
        dojo.forEach(mapTools, function(t) {
            //console.debug(t);
            //dojo.style(t, { backgroundColor: "transparent", borderStyle: "none" });
        });
    } catch (Error) {


    }

}



function setToolImage(tool) {

    try {
        dojo.byId("B_ZOOMIN").src = 'images/' + 'b_zoomin_off.gif';
        dojo.byId("B_ZOOMOUT").src = 'images/' + 'b_zoomout_off.gif';
        dojo.byId("B_PAN").src = 'images/' + 'b_pan_off.gif';
        dojo.byId("B_SELECT").src = 'images/' + 'b_select_off.gif';
        dojo.byId("B_IDENTIFY").src = 'images/' + 'b_identify_off.gif';
        dojo.byId("B_MEASURE").src = 'images/' + 'b_measure_off.gif';

        //Then brighten the passed tool.
        switch (tool) {
            case "ZOOMIN":
                dojo.byId("B_ZOOMIN").src = 'images/' + 'b_zoomin_on.gif';
                break;
            case "ZOOMOUT":
                dojo.byId("B_ZOOMOUT").src = 'images/' + 'b_zoomout_on.gif';
                break;
            case "PAN":
                dojo.byId("B_PAN").src = 'images/' + 'b_pan_on.gif';
                break;
            case "SELECT":
                dojo.byId("B_SELECT").src = 'images/' + 'b_select_on.gif';
                break;
            case "IDENTIFY":
                dojo.byId("B_IDENTIFY").src = 'images/' + 'b_identify_on.gif';
                break;
            case "MEASURE":
                dojo.byId("B_MEASURE").src = 'images/' + 'b_measure_on.gif';
                break;
        }
    } catch (Error) { console.warn("An error occurred while setting the tool image on the toolbar...", Error); }

}

//function setClick(name) {
//    identifyMode = name;

//    switch (name) {
//        case "identify":
//            measureToolbar.deactivate();
//            clearMeasureTools();
//            break;
//        case "select":
//            measureToolbar.deactivate();
//            clearMeasureTools();
//            break;
//        case "zoomout":
//            measureToolbar.deactivate();
//            clearMeasureTools();
//            break;
//        default:
//            // do nothing at all
//    }
//}

function map_onclick(evt) {

    map.infoWindow.hide();
    console.debug("on click event triggered");
    
    switch (currentTool) {
        case "MapIdentify":
            doIdentify(evt);
            break;
        case "ParcelSelect":
            doSelect(evt);
            break;
        case "MapZoomOut":
            map.centerAndZoom(evt.mapPoint, 2.5)
            break;
        default:
            // do nothing at all
    }  
}



function clearAllGraphics() {
    currentResultsPanel ="NORESULTS";
    map.graphics.clear();
    detailGraphics.clear();
    bufferGraphics.clear();
    selectionGraphics.clear();
    allSelectionGraphics.clear();
    _measureGraphics.clear();
    // hide the map info window.
    map.infoWindow.hide();
    return;
}

// show the info window
try {

    
        dojo.addOnLoad(application_onStartup);
 
}
catch (Err) {
    alert("Could not reach the web resource, web traffic download expected");
    console.debug(Err);
}











// ###############################################
// Print Legend
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%
var legendIsInitialized = false;
function printLegend_onClick() {
    try {
        dojo.byId("legend").innerHTML = "";
        legends[0].mapLayer = map.getLayer(legends[0].mapname);
        var leg = new LegendNode(legends[0], dojo.byId("legend"));
        leg.startup();
    } catch(ex) {
        dojo.byId("legend").innerHTML = "Error occurred while processing...";
    }
}

// #################################################################
// General functions

function zoomOut() {
    map.setExtent(map.extent.expand(1.5));
}
function zoomIn() {
    map.setExtent(map.extent.expand(0.5));
}









// ##################### TIMER CODE ##################################
var startTime, endTime;
function showLoading() {
    //dojo.byId('messages').innerHTML = "Loading Tiles and Exported Map...";
    startTime = new Date().getTime();

    var h = (map.height / 2) + 85;
    var w = (map.width / 2) - 100;
    dojo.style(loading, { "top": h + "px", "left": w + "px" });

    esri.show(loading);
}

function hideLoading() {
    esri.hide(loading);

//    layersLoaded++;
//    if (layersLoaded === map.layerIds.length) {
//        endTime = new Date().getTime();
//        var timeElapsed = endTime - startTime;
//        //dojo.byId('messages').innerHTML = timeElapsed + "ms elapsed during tile loading";
//        layersLoaded = 0;
//        esri.hide(loading);
//    }
}


// #################################################################
// ############  Errors and information ############################
function showConfigurationError(msg, error) {
    var s = [];
    s.push("<p>Configuration Error: </p><p>" + msg + "</p>");
    if (error != null) {
        console.debug(error);
    }
    modalDialog.setMessage(s.join(""));
    
}

function showError(msg, error) {
    var s = [];
    s.push("<p>An error has occurred in the application: </p><p>" + msg + "</p>");
    if (error != null) {
        console.debug(error);
    }
    s.push("<p>the error message is: " + error.message + "</p>");
    dojo.byId("INFO").innerHTML = s.join("");
    showPanel("INFO");

}

//################## Map Events 
// ON MAP MOUSE MOVE
function onMapMouseMove(event) {

    try {
        var x = Math.round(event.mapPoint.x, 3);
        var y = Math.round(event.mapPoint.y, 3);
        dojo.byId('mapPosition').innerHTML = dojo.string.substitute('${0}, ${1}', [x, y]);
    } catch (Err) {
        console.debug(Err)
    }
}

// ON MAP MOUSE OUT
function onMapMouseOut(event) {
    dojo.byId('mapPosition').innerHTML = '';
}

// ON MAP EXTENT CHANGE
function onMapExtentChange(extent, delta, levelChange, lod) {
    calcScale(extent)
}

// ON MAP PAN
function onMapPan(extent, delta) {
    //updateOVPoly(extent);
}

function calcScale(extent) {

    try {

        var level = map.getLevel();
        if (level > -1) {

            var scale = mapScales[level];
            dojo.byId('mapScale').innerHTML = '1 : ' + addCommas(scale.toFixed(0));
        }
        else {

            var xmin = extent.xmin;
            var ymin = extent.ymin;
            var xmax = extent.xmax;
            var ymax = extent.ymax;

            var dpi = 96;
            if (baseMapLayer.isLoaded)
                dpi = baseMapLayer.dpi;

            var w = map.width / dpi;
            var h = map.height / dpi;

            var mapH = map.extent.getHeight();
            var mapW = map.extent.getWidth();

            var distanceOnMap = Math.sqrt((w * w) + (h * h));
            var distanceOnGround = Math.sqrt((mapH * mapH) + (mapW * mapW));
            var scale = distanceOnGround / distanceOnMap;

            dojo.byId("mapScale").innerHTML = "1 inch = " + addCommas(scale.toFixed(0) + " feet");

        }
    } catch (Err) {
        console.debug(Err)
    }

}

function zoomToInitialExtent() {

    map.setExtent(baseMapLayer.fullExtent);

}

function zoomtoExtent(x1, y1, x2, y2, expand) {
    try {
        var ext = new esri.geometry.Extent(x1, y1, x2, y2, map.spatialReference);
        map.setExtent(ext.expand(expand));
    } catch (Error) {
        console.debug(Error)
    }
}

function centerMap(feature) {

    var fExtent = feature.geometry.getExtent();
    var centerPt = new esri.geometry.Point;
    centerPt = fExtent.getCenter();
    map.centerAt(centerPt);

}

function zoomMap(geometry) {

    var fExtent = geometry.getExtent();
    if (fExtent.getHeight() < 1000) {
        var dx, dy;
        var centerPt = new esri.geometry.Point;
        centerPt = fExtent.getCenter();

        var xmin, ymin, xmax, ymax;
        xmin = centerPt.x - (1000 / 2);
        ymin = centerPt.y - (1000 / 2);
        xmax = centerPt.x + (1000 / 2);
        ymax = centerPt.y + (1000 / 2);

        var nExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, geometry.spatialReference);
        map.setExtent(nExtent);
    }
    else {

        map.setExtent(fExtent.expand(1.3));
    }
}

function zoomToAllGraphics() {
    var fullExt = esri.graphicsExtent(map.graphics.graphics);
    if (fullExt != null)
        map.setExtent(fullExt.expand(1.1));
}

// RESIZE THE MAP
function resizeMap(maps) {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(function() {
        dojo.forEach(maps, function(aMap) {
            if (aMap != null) {
                aMap.resize();
                aMap.reposition();
            }
        });
    }, 500);

    showLoading();
}


function GetLastUpdate() {

    //GetLastDataUpdate
    dojo.xhrGet({
            url: cravenWebServiceURL + "/GetLastDataUpdate",
            handleAs: "json",
            contentType: "application/json; charset=utf-8",
            load: function(data) {
                lastUpdateDate = data.d;
                dojo.byId("lastUpdate").innerHTML = "Website data was last updated: " + data.d;
            },
            error: function() { dojo.byId("lastUpdate").innerHTML = "Website data was last updated: Unknown" }
        });
}



    function loadAdditionalLayers() {
        console.debug("loading layers");
        dojo.forEach(mapLayers, function(l, indx) {
                loadLayer(l);
        });
    }

    function loadLayer(mapServiceInfo) {
        try {
            console.debug(mapServiceInfo);
            var layer = null;
            if (mapServiceInfo.type === "tiled") {
                layer = new esri.layers.ArcGISTiledMapServiceLayer(mapServiceInfo.url, {
                    id: mapServiceInfo.label,
                    opacity: parseFloat(mapServiceInfo.alpha),
                    visible: mapServiceInfo.visible
                });
            }
            else
                if (mapServiceInfo.type === "dynamic") {
                layer = new esri.layers.ArcGISDynamicMapServiceLayer(mapServiceInfo.url, {
                    id: mapServiceInfo.label,
                    opacity: parseFloat(mapServiceInfo.alpha),
                    visible: mapServiceInfo.visible
                });

               

                if ((mapServiceInfo.layerIDs !== undefined))  {
                    layer.setVisibleLayers(mapServiceInfo.layerIDs);
                }
                
            }

            if (layer != null) {
                map.addLayer(layer);
                //dojo.connect(layer, "onLoad", function(l) { alert("layer loaded " + l.id); });
                //dojo.connect(layer, "onUpdate", hideLoading);
                //dojo.connect(layer, "onVisibilityChange", refreshTOC)
                console.debug("Layer is valid");
            } else {
                console.debug("Layer is invalid");
            }
        }
        catch (err) {
            console.error("Loading map service at url: " + mapServiceInfo.url);
            alert(err.message);
        }
    }
    
 