﻿      dojo.require("dijit.dijit");
      dojo.require("dojo.parser");
      dojo.require("dijit._Widget");
      dojo.require("dijit._Templated");
      dojo.require("dijit._Container");
      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("dijit.Tooltip");
	  dojo.require("dijit.TitlePane");
	  dojo.require("dijit.form.TextBox");
	  dojo.require("dijit.form.Slider");
	  dojo.require("dojox.grid.DataGrid");
	  dojo.require("dojo.data.ItemFileWriteStore");

	  dojo.require("dijits.tools.MeasureToolbar");
	  //dojo.require("dijits.tools.SelectToolbar");
	  dojo.require("dijits.tools.Scalebar");
	  dojo.require("dijits.tools.MapCoords");


	  dojo.require("com.js.map.utils");

	  var map;
      var resizeTimer;
      var navToolbar;
      
	  var mapPanels = ["search", "measure", "layers", "info"];
	  var mapTools = ["MapZoomIn", "MapZoomOut", "MapPan", "MapIdentify"];
	  var searchPanels = ["about", "results",  "advanced_search", "adjoiners"];

	  var debug = true;		 
	  var useToolbar;
      var queryString;
      var idHandle, loading;
      var layersLoaded = 0;  //varible to keep track of when all layers have been loaded.
      var currentTool = "MapPan";
      var collapsed = false;
      var loading = null;

      var mapHelper;

      var fullExt = {
          xmin: 948343.670488052,
          ymin: 717877.19999997,
          xmax: 1086205.32951189,
          ymax: 873390.79999997,
          wkid: 2264
      }


      function application_startup() {

          try {

              loading = dojo.byId("loading");

              initialExtent = new esri.geometry.Extent(fullExt.xmin, fullExt.ymin, fullExt.xmax, fullExt.ymax, new esri.SpatialReference({ wkid: fullExt.wkid }));

              map = new esri.Map("mapDiv", { nav: false, slider: true });              
              mapHelper = new com.js.map.utils.Maphelper({ map: map, fullextent: initialExtent });
              dojo.connect(map, "onLoad", mapLoaded);
                                                                              
              
              var layer = com.js.map.utils.createMapLayer(mapLayers[0])
              if (layer != null) {

                  dojo.connect(layer, "onUpdate", hideLoading);
                  dojo.connect(layer, "onVisibilityChange", refreshTOC)
                  dojo.connect(layer, "onError", applicationError);
                  console.debug(layer);
                  map.addLayer(layer);
              } else {
                  console.debug("Layer is invalid");
                  console.debug(layer);
              }
           

              // initialize the geometry service              
              gsvc = new esri.tasks.GeometryService(geoServiceUrl);
              esriConfig.defaults.io.proxyUrl = "proxy.ashx";
              esriConfig.defaults.io.alwaysUseProxy = false;

              navToolbar = new esri.toolbars.Navigation(map);

              showPanel('search');

              dojo.connect(map, "onLoad", function() {
                  // handle initial extent...
                  handleQueryString();
              });

          } catch (Error) {
             applicationError(Error);
          }


      }

      function handleQueryString() {

          // on startup check for url query parameters and use extent and optionally featureID
          // executeQueryTask will be called if there is a featureID so the app behaves just like a mouse click
          var url = esri.urlToObject(window.location.toString());
          if (url.query && url.query != null) {
              if (url.query.pid && url.query.pid != null) {
                  var pid = url.query.pid;
                  sWhere = dojo.string.substitute("${0} = '${1}'", ["Parcel_ID", pid]);
                  ExecuteParcelSearch(sWhere);
                  return true;
              }
          }

          return false;
      }

      // ########################################################
      // Toolbar Functions
      // ########################################################
      function ToolbarStartUp() {

          try {
              // Connect all the mouse down events...
              dojo.connect(dojo.byId("MapZoomIn"), "onmousedown", function() { ToolbarMouseDown('MapZoomIn', 'Tool'); });
              dojo.connect(dojo.byId("MapZoomOut"), "onmousedown", function() { ToolbarMouseDown('MapZoomOut', 'Command'); });
              dojo.connect(dojo.byId("MapZoomNext"), "onmousedown", function() { ToolbarMouseDown('MapZoomNext', 'Command'); });
              dojo.connect(dojo.byId("MapZoomPrevious"), "onmousedown", function() { ToolbarMouseDown('MapZoomPrevious', 'Command'); });
              dojo.connect(dojo.byId("MapFullExtent"), "onmousedown", function() { ToolbarMouseDown('MapFullExtent', 'Command'); });
              dojo.connect(dojo.byId("MapPan"), "onmousedown", function() { ToolbarMouseDown('MapPan', 'Tool'); });
              dojo.connect(dojo.byId("MapIdentify"), "onmousedown", function() { ToolbarMouseDown('MapIdentify', 'Tool'); });
              dojo.connect(dojo.byId("MapMeasure"), "onmousedown", function() { ToolbarMouseDown('MapMeasure', 'Command'); });
              dojo.connect(dojo.byId("MapSelect"), "onmousedown", function() { ToolbarMouseDown('MapSelect', 'Tool'); });
              dojo.connect(dojo.byId("ClearSelection"), "onmousedown", function() { ToolbarMouseDown('ClearSelection', 'Command'); });
              dojo.connect(dojo.byId("MapPrint"), "onmousedown", function() { ToolbarMouseDown('MapPrint', 'Command'); });              

              // connect the mouse over events
              mapTools = dojo.query(".toolicon");
              dojo.forEach(mapTools, function(t) {
                  dojo.connect(t, "onmouseover", function() { ToolbarMouseOver(t.id); });
                  dojo.connect(t, "onmouseout", function() { ToolbarMouseOut(t.id); });
                  dojo.style(t, { borderStyle: "solid", borderWidth: "1px", borderColor: "White" });
              });


              dojo.style("MapPan", { borderStyle: "inset", borderWidth: "1px", borderColor: "red" });

          } catch (Error) {
              console.warn("An error occurred in ToolBarStartUp function", Error);
          }

      }

      function ToolbarMouseOut(tool) {

          if (tool != currentTool) {
              dojo.style(tool, { borderColor: "white" });
          } else {
            dojo.style(tool, { borderColor: "red", borderWidth: "1px" });
          }

      }

      function ToolbarMouseOver(tool) {
          dojo.style(tool, { 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();
              currentTool = tool;

              dojo.style(tool, { borderStyle: "inset", borderColor: "red", borderWidth: "1px" });
              
              changeMapCursors(tool);

              switch (tool) {
                  case "MapZoomIn":
                      navToolbar.activate(esri.toolbars.Navigation.ZOOM_IN);
                      break;
                  case "MapZoomOut":
                      navToolbar.activate(esri.toolbars.Navigation.ZOOM_OUT);
                      break;
                  case "MapPan":
                      navToolbar.activate(esri.toolbars.Navigation.PAN);
                      break;
                  case "MapIdentify":
                      navToolbar.activate(esri.toolbars.Navigation.PAN);
                      break;
                  case "MapSelect":
                      navToolbar.activate(esri.toolbars.Navigation.PAN);
                      break;
                  default:
                      navToolbar.activate(esri.toolbars.Navigation.PAN);
                      break;
              }

          } else {

              switch (tool) {
                  case "MapFullExtent":
                      mapHelper.zoomToFullExtent();
                      break;
                  case "MapZoomOut":
                      //Zoom map out
                      var levelID = map.getLevel();
                      if (levelID == -1)
                          map.centerAndZoom(map.extent.getCenter(), 2.5)
                      else {
                          if (levelID > 0)
                              map.setLevel(levelID - 1);
                      }
                      break;
                  case "MapZoomNext":
                      navToolbar.zoomToNextExtent();
                      break;
                  case "MapZoomPrevious":
                      navToolbar.zoomToPrevExtent();
                      break;
                  case "MapMeasure":
                      dijit.byId("measureTools").activate();
                      showPanel("measure");
                      break;                                    
                  case "ClearSelection":
                      clearAllGraphics();
                      break;
                  case "MapPrint":
                      printMap();
                      break;                        
                  default:
                      break;
              }
          }
      }

      function clearCurrentTool() {
          try {
              // clear selected tools
              currentTool = "";
              dijit.byId("measureTools").deactivate();
              dojo.forEach(mapTools, function(t) {
              dojo.style(t, { borderStyle: "solid", borderWidth: "1px", borderColor: "White" });
              });
          } catch (Error) {
            console.debug(Error.message);
          }
      }

      function deactivateMapClick() {
          // change the tool reference in app...
          clearCurrentTool();
          changeMapCursors("");
          map.infoWindow.hide();
          navToolbar.activate(esri.toolbars.Navigation.PAN);
      }

      function changeMapCursors(tool) {
          switch (tool) {
              case "MapZoomIn":
                  dojo.byId("mapDiv_layers").style.cursor = "crosshair";
                  break;
              case "MapSelect":
                  dojo.byId("mapDiv_layers").style.cursor = "pointer";
                  break;
              case "MapIdentify":
                  dojo.byId("mapDiv_layers").style.cursor = "pointer";
                  break;
              case "MapPan":
                  dojo.byId("mapDiv_layers").style.cursor = "crosshair";
                  break;
              default:
                  dojo.byId("mapDiv_layers").style.cursor = "default";
                  break;
          }

      }



      // ###############################################
      // Map Click Event
      // ###############################################

      function map_onclick(evt) {
          map.infoWindow.hide();
          
          switch (currentTool) {
              case "MapIdentify":
                  doIdentify(evt);
                  break;
              case "MapZoomOut":
                  map.centerAndZoom(evt.mapPoint, 2.5)
                  break;
              case "MapSelect":
                  selectParcel(evt);
                  break;
              default:
                  // do nothing at all
          }
      }

      // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      // Tool - menu functions
      // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      function showPanel(name) {
          hidePanels();

          dojo.style(name, { 'display': 'block' });

          // open the sibe bar if it is closed
          if (collapsed)
              resize();


          // do any additional stuff
          switch (name) {
              case "layers":
                  refreshTOC();
                  break;
              default:
                  break;
          }

      }

      function clearAllGraphics() {
          try {

              map.graphics.clear();
              clearSearchResultsPanel();              
              hidePanels();
              // hide the map info window.
              map.infoWindow.hide();

              // clear the adjoiner graphics             
              clearAdjoiners();

              dijit.byId("measureTools").clear();
                                          
              showPanel("search");
              showSearchPanel("about");

              dojo.byId("txtQuickFind").value = "";              
              dojo.byId("txtQuickFind2").value = "";
              
              return;
          } catch (Error) {
              console.warn("An Error Occurred in application: 'ClearAllGraphics'", Error);
          }
      }


      // ########################################################
      // Loading Functions
      // ########################################################
      function mapLoaded(thisMap) {

          try {


              // load the layers
              dojo.forEach(mapLayers, function(l, indx) {

                  if (indx > 0) {
                      var layer = com.js.map.utils.createMapLayer(l)
                      if (layer != null) {
                          dojo.connect(layer, "onUpdate", hideLoading);
                          dojo.connect(layer, "onVisibilityChange", refreshTOC)
                          dojo.connect(layer, "onError", applicationError);
                          map.addLayer(layer);
                      } else {
                          applicationError({ message: "Layer is invalid" });
                      }
                  }
              });
  
              ToolbarStartUp();

              dojo.connect(window, 'onresize', function() { resizeMap([map]); });
              //dojo.connect(window, 'onresize', function() { resizeHandler(); });
              dojo.connect(map, "onZoomStart", showLoading);
              dojo.connect(map, "onPanStart", showLoading);

              // disable the map navigation
              mapHelper.disableNavigation();

              idHandle = dojo.connect(map, "onClick", map_onclick);

              searchResultsStartup();

              // init the searches and queries dealing with parcels
              initSearch();
              initIdentifyFunctionality();              

              // measure toolbar
              var mtbParams = { map: map };
              var mtb = new dijits.tools.MeasureToolbar(mtbParams, "measureTools");
              mtb.startup();

              mapHelper.initMapPosition();
              mapHelper.initMapScale();
            
              // map view buttons
              showBackground("hybrid");
              
              esriConfig.defaults.io.proxyUrl = "proxy.ashx";
              esriConfig.defaults.io.alwaysUseProxy = false;

              console.debug("ending start up for the application");

          } catch (Error) {
              console.warn("An error occurred in the application", Error);
          }
      }


      // RESIZE THE MAP
      function resizeMap(maps){
        clearTimeout(resizeTimer);
        resizeTimer = setTimeout(function() {
            dojo.forEach(maps, function(aMap) {
                if (aMap != null) {
                    aMap.resize();
                    aMap.reposition();
                }
            });
        }, 500);
    }


      // TOGGLE VISIBLE BASE LAYER
      function showBackground(layerName, theMap) {
          if (theMap == null) { theMap = map }

           // find the map view
          dojo.forEach(mapViewButtons, function(mvb) {
              if (mvb.label === layerName) {
                  dojo.style(mvb.node, { 'color': 'yellow', 'borderStyle': 'inset' });
                  dojo.forEach(mvb.turnOff, function(to) {
                        mapHelper.turnOffMapService(to);
                  });
                  dojo.forEach(mvb.turnOn, function(to) {
                        mapHelper.turnOnMapService(to);
                  });
              } else {
                  dojo.style(mvb.node, { 'color': 'white', 'borderStyle': 'outset' });
              }
          });                         
      }

      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 hidePanels() {
        try {
            dojo.forEach(mapPanels, function(name) {
                dojo.style(name, { 'display': 'none' });
            });
        } catch (Error) {
            console.warn("An error occurred in 'hidePanel': ", Error);
        }
    }

    function applicationError(ex) {

        console.debug(ex);

        if (debug!= true) 
            document.location = "applicationError.aspx?error=" + ex.message;

    }



      

    dojo.addOnLoad(application_startup);



    function showTable() {

        dojo.byId("gridNode").style.display = "block";


    }
