dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.layout.TabContainer");
dojo.require("esri.map");
dojo.require("esri.layers.FeatureLayer");
dojo.require("esri.tasks.identify");
dojo.require("esri.tasks.geometry");

var map;
var locator;
var gsvc = null;
var phaseDef = []
phaseDef[0] = "PUBLIC_MAP = 'Yes'";
var serviceUrl = "http://www.dcgis.org/ArcGIS/rest/services/CSO/CSO_Public/MapServer";
var symbol = null;
var identifyTask, identifyParams;

function init() {
  var initExtent = new esri.geometry.Extent({"xmin":2685918.849820322,"ymin":516654.93106665317,"xmax":2774918.849820322,"ymax":582821.59773332,"spatialReference":{"wkid":26852}});
  map = new esri.Map("map",{extent:initExtent});
  dojo.connect(map, "onLoad", initCSOLayer);
  dojo.connect(map, "onLoad", initIdentify);
  
  var basemap = new esri.layers.ArcGISTiledMapServiceLayer("http://www.dcgis.org/ArcGIS/rest/services/BaseMaps/SimpleStreetMapCache/MapServer");
  basemap.setOpacity(0.7);
  map.addLayer(basemap);
  
  //locator = new esri.tasks.Locator("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_USA/GeocodeServer");
  locator = new esri.tasks.Locator("http://www.dcgis.org/ArcGIS/rest/services/Streets/GeocodeServer");
  dojo.connect(locator, "onAddressToLocationsComplete", showResults);
  dojo.connect(map.infoWindow, "onShow", function() {
    dijit.byId("tabs").resize();
  });
  
  gsvc = new esri.tasks.GeometryService("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
  
  symbol = new esri.symbol.SimpleMarkerSymbol();
  
}

function initIdentify(map) {
  dojo.connect(map, "onClick", doIdentify);
  
  identifyTask = new esri.tasks.IdentifyTask(serviceUrl);

  identifyParams = new esri.tasks.IdentifyParameters();
  identifyParams.tolerance = 3;
  identifyParams.returnGeometry = false;
  identifyParams.layerIds = [0];
  identifyParams.layerDefinitions = phaseDef;
  identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
  identifyParams.width  = map.width;
  identifyParams.height = map.height;
  
  map.infoWindow.resize(375, 200);
  map.infoWindow.setTitle("Project Information");
}

function doIdentify(evt) {
  identifyParams.geometry = evt.mapPoint;
  identifyParams.mapExtent = map.extent;
  identifyTask.execute(identifyParams, function(idResults) { addToMap(idResults, evt); });
}

function addToMap(idResults, evt) {
  activeResults = {features:[]};
  completeResults = {features:[]};
  futureResults = {features:[]};
  
  if (idResults.length > 0){
    for (var i=0, il=idResults.length; i<il; i++) {
      var idResult = idResults[i];
      if (idResult.layerId === 0) {
        if (idResult.feature.attributes['Project_Status'] === 'CURRENT') {
          activeResults.features.push(idResult.feature);
        }
        else if (idResult.feature.attributes['Project_Status'] === 'COMPLETE') {
          completeResults.features.push(idResult.feature);
        }
        else if (idResult.feature.attributes['Project_Status'] === 'FUTURE') {
          futureResults.features.push(idResult.feature);
        }
      }
    }
    var infoContent = '';
    infoContent += layerTabContent(activeResults, "activeResults");
    infoContent += layerTabContent(futureResults, "futureResults");
    infoContent += layerTabContent(completeResults, "completeResults");
    map.infoWindow.setContent(infoContent);
    
    map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
  }
  else {
    alert ("No projects found");
  }
 
  
}

function layerTabContent(layerResults, layerName) {
  var content = "";
  switch (layerName) {
    case "activeResults":
      for (var i=0, il=layerResults.features.length; i<il; i++) {
        content += "<a href='" + layerResults.features[i].attributes['PROJ_LINK'] + "'>" + layerResults.features[i].attributes['PUBLICPROJ_NAME'] + "</a><br /><br />";
      }
      content += "<br />"
      break;
    case "completeResults":
      for (var i=0, il=layerResults.features.length; i<il; i++) {
        content += "<a href='" + layerResults.features[i].attributes['PROJ_LINK'] + "'>" + layerResults.features[i].attributes['PUBLICPROJ_NAME'] + "</a><br /><br />";
      }
      content += "<p>For more information, please contact&nbsp;<a href='mailto:omahacso@lovgren.com'>Linda Lovgren</a></p>";
      break;
    case "futureResults":
      for (var i=0, il=layerResults.features.length; i<il; i++) {
        content += "<strong>" + layerResults.features[i].attributes['PUBLICPROJ_NAME'] + "</strong><br />";
        content += "Begin Construction&nbsp;" + layerResults.features[i].attributes['StartYear'] + "<br />";
        content += layerResults.features[i].attributes['Project_Description'] + "<br /><br />";
      }
      //content += "<p>For more information, please contact&nbsp;<a href='mailto:linda.lovgren@hdrinc.com'>Linda Lovgren</a></p>";
      break;
  }
  return content;
}

function initCSOLayer(map) {   
  
  //Service Area
  var csoArea = new esri.layers.ArcGISDynamicMapServiceLayer(serviceUrl);
  csoArea.setVisibleLayers([1]);
  csoArea.setOpacity(0.6);
  map.addLayer(csoArea);
  
  //Projects
  var csoProject = new esri.layers.ArcGISDynamicMapServiceLayer(serviceUrl);
  csoProject.setVisibleLayers([0]);
//  phaseDef[0] = "PUBLIC_MAP = 'Yes'";
  csoProject.setLayerDefinitions(phaseDef);
  csoProject.setOpacity(0.8);
  map.addLayer(csoProject);
  
}

function locate() {
  document.getElementById('imgLoader').style.visibility = 'visible';
  map.graphics.clear();
  var add = dojo.byId("txbSearch").value.split(",");
  if (add.length <= 1) {
    var address = {
      Street: add[0],
      City: '',
      State: '',
      Zip: ''
    }; 
  }
  else if (add.length == 2) {
    var address = {
      Street: add[0],
      City: add[1],
      State: 'NE',
      Zip: ''
    }; 
  }
  else {
    var address = {
      Street: add[0],
      City: add[1],
      State: add[2],
      Zip: add[3]
    };
  }
  locator.addressToLocations(address,["Loc_name"]);
}

function showResults(candidates) {
  var candidate;
  var flag = false;
  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);

  for (var i=0, il=candidates.length; i<il; i++) {
    candidate = candidates[i];
    if (candidate.score > 80) {  // && candidate.address != 'OMAHA, NE') {
      flag = true;
      var attributes = { address: candidate.address, score:candidate.score, locatorName:candidate.attributes.Loc_name };
      //var geom = esri.geometry.geographicToWebMercator(candidate.location);
      //geom = projectToNEStatePlane(geom);
      var graphic = new esri.Graphic(candidate.location, symbol, null, null);
      map.graphics.add(graphic);
      var pointExtent = new esri.geometry.Extent({"xmin":candidate.location.x - 500,"ymin":candidate.location.y - 500,"xmax":candidate.location.x + 500,"ymax":candidate.location.y + 500,"spatialReference":{"wkid":26852}});   
      map.setExtent(pointExtent);
      document.getElementById('txbSearch').value = '';
    }
  }
  if (!flag){
    alert("No results found.");
    document.getElementById('txbSearch').value = '';
  }
  document.getElementById('imgLoader').style.visibility = 'hidden';
}

function projectToNEStatePlane(point) {
  var outSR = new esri.SpatialReference({ wkid: 26852});
  gsvc.project([ point ], outSR, function(projectedPoints) {
    var pt = projectedPoints[0];
    var graphic = new esri.Graphic(pt, symbol, null, null);
    map.graphics.add(graphic);
    var pointExtent = new esri.geometry.Extent({"xmin":pt.x - 500,"ymin":pt.y - 500,"xmax":pt.x + 500,"ymax":pt.y + 500,"spatialReference":{"wkid":26852}});   
    map.setExtent(pointExtent);
    document.getElementById('txbSearch').value = '';
  });
}
  
dojo.addOnLoad(init);
