
dojo.require("esri.map");
      dojo.require("esri.tasks.query");
	    dojo.require("esri.geometry");
		  dojo.require("dojo.parser");
			dojo.require("dijit.TitlePane");
			dojo.require("dijit.ProgressBar");
			dojo.require("dijit.Dialog");
      dojo.require("dijit.form.HorizontalSlider");
      dojo.require("dijit.layout.AccordionContainer");
      dojo.require('dijit.layout.ContentPane');
      dojo.require("dijit.form.Slider");
      dojo.require("dijit._Widget");


	    var map, startExtent, lyrStreet, lyrImg, lyrFP, lyrMI, lyrMHV, lyrPD, lyrMA, queryTask, query, legPane, lyrPane, accordion;
	    var currentMapLOD=null;
	    var currentDemographicLayer=null;
	  
      function init() {
        //-119.609 32.77 -116.015 34.861
		    var startExtent = new esri.geometry.Extent({ xmin: -119.609, ymin: 32.77, xmax: -116.015, ymax: 34.861, spatialReference: new esri.SpatialReference({wkid: 4326})});
		    
        /*******************************************
        * Patch for infowindow positioning problem
        * - call map.reposition() after map load
        * WARNING: this patch will NOT work beyond
        * version 1.4 of the ArcGIS JS API. 
        *******************************************/
        esri.Map.prototype.reposition = function() {
          var pos = dojo.coords(this.container, true),
              brdr = dojo._getBorderExtents(this.container);
          this.position.setX(pos.x + brdr.l);
          this.position.setY(pos.y + brdr.t);
          this.onReposition(this.position.x, this.position.y);
        };

        
        
        map = new esri.Map("map", { extent:startExtent });
		
		    // Code below works around an issue with resizing pages.  You have to call map.reposition when the browser is resized, or the map divs get all messed up.
		    dojo.connect(map, "onLoad", function(map) {
          map.reposition();
        });
		
      	//connect to window's resize event
        dojo.connect(window, "onresize", function() {
          //clear any existing resize timer
          clearTimeout(timer);
          //create new resize timer with delay of 500 milliseconds
          timer = setTimeout(function() { map.resize(); map.reposition(); }, 500);
        });

		

        //Base Layers
        lyrStreet = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/Esri_StreetMap_World_2D/MapServer", {id:"lyrStreet", visible:true});
        map.addLayer(lyrStreet);
		    lyrImg = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/Esri_Imagery_World_2D/MapServer", {id:"lyrImg", visible:false});
        map.addLayer(lyrImg);

        //Fire Perimeters
        lyrFP = new esri.layers.ArcGISDynamicMapServiceLayer("http://stormtracker.esri.com/ArcGIS/rest/services/Fires/Active_Fire_Perimeters/MapServer", {id:"lyrFP", visible:"true", opacity:0.5});
        map.addLayer(lyrFP);
        
        //MODIS
        lyrM = new esri.layers.ArcGISDynamicMapServiceLayer("http://stormtracker.esri.com/ArcGIS/rest/services/Fires/ModisHotSpots/MapServer", {id:"lyrM", visible:"true", opacity:0.5});
        map.addLayer(lyrM);
		
    		//Demographics
    		lyrMI = initDemLayers("http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer", "lyrMI");
        lyrMHV = initDemLayers("http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Home_Value/MapServer", "lyrMHV");
        lyrPD = initDemLayers("http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Population_Density/MapServer", "lyrPD");
        lyrMA = initDemLayers("http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Age/MapServer", "lyrMA");
        
        //Fire Perimeter Query
        queryTask = new esri.tasks.QueryTask("http://stormtracker.esri.com/ArcGIS/rest/services/Fires/Active_Fire_Perimeters/MapServer/0");
        query = new esri.tasks.Query();
        
        dojo.connect(map, 'onExtentChange', onMapExtentChange);	
        
        //document.attachEvent("onmousemove", checkWindowSize());
        document.body.onresize = function (){
           map.reposition();
        }
    		map.reorderLayer('lyrFP', 7)
    		map.reorderLayer('lyrM', 6)
    		getBookmarks();
    		
      }
      
      function getBookmarks() {
      
        query.returnGeometry = true;
        //USGS Fire perimeters are for the US only.  We are trusting that this will always be the case.
        query.where = "FIRE_NAME != ''";
        query.outfields = ["FIRE_NAME", "ACTIVE"];
        var s = "<fieldset><legend style='font-size:1em;'>Locate a Fire</legend><form NAME='fireForm'><select NAME='goFire' onChange='zoom_Fire()'><option VALUE=''></option>";
        queryTask.execute(query, function(fset) {
  			 if (fset.features.length !== 0) {
  				 for (var i=0; i < fset.features.length; i++) {
  				   if (fset.features[i].attributes.FIRE_NAME == "Tumblebug Complex"){
                //do nothing
             }
             else{
    			     var graphic = fset.features[i];
    			     s = s + "<option VALUE='" + graphic.attributes.FIRE_NAME + "'>" + graphic.attributes.FIRE_NAME + "</option>";
               map.graphics.add(graphic);
               //map.graphics.hide(graphic);
			   //graphic.hide ();
             }
  			   }
           s = s + "</select></form></fieldset>";
           dojo.byId("bookmarksDiv").innerHTML = s;
           dojo.byId("bookmarksDiv").style.visibility = 'visible';
         } 
         else{ 
  				 //alert ("No fires currently burning in the US. Fire perimeters will not show on the map.");
		     }
  		
		});
      
      }
      
      function zoom_Fire()
  	   {
  			 var w = document.fireForm.goFire.selectedIndex;
  			 var selected_text = document.fireForm.goFire.options[w].value;
  			   			 
  			 if (w > 0){
    			 //hide the control panel and show the progress bar.
    			 //dijit.byId('control_panel').toggle();
    			 //dojo.byId("progresstext").innerHTML = "Locating Neighborhood...";
           //toggleProgressBar()
    			 
    			 //zero out the query Geometry and Where
    			 query.geometry = null;
    			 query.where = null;
    			 query.where = "FIRE_NAME = '" + selected_text + "'";
    			 //Execute the queryTask and call showResults on completion
    			 queryTask.execute(query, function(fset) {
      			 if (fset.features.length === 1) {
      				 ZoomMap(fset.features[0],selected_text);
      				 
      			   } else{
      				 alert ("No features returned from server. There is a problem with the requested fire perimeter data.")}
    			 });
    			 
    			 
    			 
    			 
  			 }
  			 else{} //Do Nothing}
		   }

       function ZoomMap(feature, ddValue)
		   {
		     
			   var fExtent = feature.geometry.getExtent();
			   var expExt = fExtent.expand(2);
			   map.setExtent(expExt);
			 
		   }

      function centerMap(feature, ddValue)
		   {
		   
			   var fExtent = feature.geometry.getExtent();
			   var centerPt = new esri.geometry.Point;
			   centerPt = fExtent.getCenter();
			   map.centerAt(centerPt);
			 
		   }

      
      
      function onMapExtentChange(extent, delta, levelChange, lod){
    		var legendDIV = dojo.byId('legDiv');
    		if (legendDIV.style.visibility=="visible") 
    		{
    			showRightLegend(currentDemographicLayer.id,lod.scale)
    		}
    		currentMapLOD=lod.scale;
    	}	
    	
    	function showRightLegend(layerID, scale)
    	{
    		//state level
    		if (scale > 25000001)
    		{
    			if (layerID=='lyrMI')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHI_State.jpg";
    			}
    			else if (layerID=='lyrMHV')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHV_State.jpg";
    			}
    			else if (layerID=='lyrPD')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/PD_State.jpg";
    			}
    			else if (layerID=='lyrMA')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MA_State.jpg";
    			}
    			else {
    				//alert('nothing');
    			}
    		}
    		//counties level
    		else if (scale < 25000001 && scale > 750001)
    		{
    			if (layerID=='lyrMI')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHI_County.jpg";
    			}
    			else if (layerID=='lyrMHV')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHV_County.jpg";
    			}
    			else if (layerID=='lyrPD')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/PD_County.jpg";
    			}
    			else if (layerID=='lyrMA')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MA_County.jpg";
    			}
    			else {
    				alert('nothing');
    			}
    		}
    		//tracts level
    		else if (scale < 750000 && scale > 150001)
    		{
    			if (layerID=='lyrMI')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHI_Tract.jpg";
    			}
    			else if (layerID=='lyrMHV')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHV_Tract.jpg";
    			}
    			else if (layerID=='lyrPD')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/PD_Tract.jpg";
    			}
    			else if (layerID=='lyrMA')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MA_Tract.jpg";
    			}
    			else {
    				alert('nothing');
    			}
    		}
    		//block group level
    		else if (scale < 150000 || scale > 0)
    		{
    			if (layerID=='lyrMI')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHI_BG.jpg";
    			}
    				else if (layerID=='lyrMHV')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MHV_BG.jpg";
    			}
    			else if (layerID=='lyrPD')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/PD_BG.jpg";
    			}
    			else if (layerID=='lyrMA')
    			{
    				dojo.byId('legendIMG').src= "/services/disaster-response/graphics/map/MA_BG.jpg";
    			}
    			else {
    				alert('nothing');
    			}
    		}
    		else 
    		{
    			dojo.byId('legendIMG').src="";
    			alert("should not get here");
    		}
    	}
        
	    function changeMap(layerid) {
  		  var tmplayer = layerid;
    		var curLayer = map.getLayer(layerid);
    		//var tmp = layerid.toString();
    		toggleLayer(curLayer);
  	  }

	  
	    function toggleLayer(layer) {
		    
        //if the layer is visible, turn it off and update the control panel. If invisible, do the same. 
  			switch (layer.id)
  			{
  				case "lyrImg":
  				    if(dojo.byId("rdImg").Checked){
                       //do nothing
  				    }
  				    else{
                  if (layer.visible){
                     layer.hide();
  				           map.getLayer("lyrStreet").show();
  				           dojo.byId("rdStreet").Checked = true;
  				           dojo.byId("rdImg").Checked = false;
  				        }
   				        else{
                     layer.show();
   				           map.getLayer("lyrStreet").hide();
   				           dojo.byId("rdStreet").Checked = false;
   				           dojo.byId("rdImg").Checked = true;
                  }
              }  
             
              break;
  			    case "lyrStreet":
  				    if(dojo.byId("rdStreet").Checked){
                       //do nothing
  				    }
  				    else{
    				    if (layer.visible){
                    map.getLayer("lyrImg").show();
    				        layer.hide();
                    dojo.byId("rdStreet").Checked = false;
    				        dojo.byId("rdImg").Checked = true;
    				    }
    				    else{
                    map.getLayer("lyrImg").hide();
    				        layer.show();
                    dojo.byId("rdStreet").Checked = true;
    				        dojo.byId("rdImg").Checked = false;
                }
  				    }
                break;
  				  case "lyrFP":
  				     var tmpFP= dojo.byId("cbFP");
               if (layer.visible){
  				        tmpFP.Checked = false;
  				        layer.hide();
  				     }
  				     else{
  				         tmpFP.Checked = true;
  				         layer.show();
               }
  				     break;
  				  case "lyrM":
  				     var tmpM= dojo.byId("cbM");
               if (layer.visible){
  				        tmpM.Checked = false;
  				        layer.hide();
  				     }
  				     else{
  				         tmpM.Checked = true;
  				         layer.show();
               }
  				     break;
  			 }
		   }
		   
		   function initDemLayers(url, id) {
          var layer = new esri.layers.ArcGISDynamicMapServiceLayer(url, {id:id, visible:false, opacity:0.65});
          map.addLayer(layer);
          return layer;
       }
		   
       function changeDems(layerid) {
    	  	hideDemLayers(layerid);
        	dojo.byId('slider1').style.visibility = 'visible';
        	dojo.byId('sliderInputDiv').style.visibility = 'visible';
    		  dojo.byId('legDiv').style.visibility="visible";
    		  var curLayer = map.getLayer(layerid);
    	  	currentDemographicLayer=curLayer;
          curLayer.show();
    		  showRightLegend(curLayer.id, currentMapLOD);
    		  dijit.byId("control_acc").selectChild(dijit.byId("control_acc").getChildren()[1]);
        }

       function clearDems(layerid) {
          hideDemLayers(layerid);
          dojo.byId('slider1').style.visibility = 'hidden';
    		  dojo.byId('sliderInputDiv').style.visibility = 'hidden';
    		  dojo.byId('legDiv').style.visibility = 'hidden';
       }
      
       function sliderValueChanged(value) {
          dojo.byId('slider1input').value=dojo.number.format(arguments[0]/100,{places:1,pattern:'#%'});
          lyrMI.setOpacity(value / 100);
          lyrMHV.setOpacity(value / 100);
          lyrPD.setOpacity(value / 100);
          lyrMA.setOpacity(value / 100);
       }
	  
  	   function hideDemLayers(layers) {
          for (var j=0, jl=map.layerIds.length; j<jl; j++) {
            var layer = map.getLayer(map.layerIds[j]);
            if (dojo.indexOf(layers, layer) == -1) {
              if (layer.id == "lyrStreet" || layer.id == "lyrImg" || layer.id == "lyrFP" || layer.id == "lyrM"){
              //do nothing
              }
              else{
              layer.hide();
              dijit.byId("control_acc").selectChild(dijit.byId("control_acc").getChildren()[0]);
              }
            }
          }
        }

    	 
    	 function onWindowResize(evt){
          map.reposition();
       }

       dojo.addOnLoad(init);
