﻿// JScript File
// KCGIS Center 3/06/2009
      dojo.require("esri.map");
      dojo.require("esri.tasks.identify");
      dojo.require("dijit.form.Button");
      var timer;
      var camTimer;
      var map;
      var tiledGenericBase, tiledHybridBase, tiledHybridBaseOverlay, dynamicAlerts;
      var tiledGenericBaseURL, tiledHybridBaseURL, tiledHybridBaseOverlayURL, dynamicAlertsURL;
      var trafficCamerasURL, tiledtrafficCameras;
      var locator, locatorURL;
      var isCurrentAlertLayerOn = true;
      var isFutureAlertLayerOn = true;
      var isTrafficCamLayerOn = true;
      var isGenericBaseLayerOn = true;
      var isHybridBaseLayerOn = false;
      var isHybridBaseOverlayLayerOn = false;
      var maponload_handler, locatorComplete_handler, windowResize_handler, maponClick_handler, infoWindowHide_handler, addOnUnload_handler;
      
      tiledGenericBaseURL = "http://gismaps.kingcounty.gov/ArcGIS/rest/services/KCGIS/GenericBase/MapServer";
      tiledHybridBaseURL = "http://gismaps.kingcounty.gov/ArcGIS/rest/services/KCGIS/HybridBase/MapServer";
      tiledHybridBaseOverlayURL = "http://gismaps.kingcounty.gov/ArcGIS/rest/services/KCGIS/HybridBase_overlay/MapServer";
      dynamicAlertsURL = "http://gismaps.kingcounty.gov/ArcGIS/rest/services/RoadAlerts/Road_Alerts_Viewer/MapServer";
      trafficCamerasURL = "http://gismaps.kingcounty.gov/ArcGIS/rest/services/KCGIS/Traffic_cameras/MapServer";
      locatorURL = "http://gismaps.kingcounty.gov/ArcGIS/rest/services/ADDRESS/TNET_Streets/GeocodeServer";
       
function init() {

console.log("init()");
 // First we will verify the services are running.  If not, the serviceChecker will handle it.  Otherwise, we continue.
 
 //NOTE:  LEAVE THIS COMMENTED OUT FOR NOW!!  It is too sensitive.
 
 //     getServiceStatus(tiledGenericBaseURL);
 //     getServiceStatus(trafficCamerasURL);
 //     getServiceStatus(tiledHybridBaseURL);
 //     getServiceStatus(dynamicAlertsURL);
 //     getServiceStatus(locatorURL);                  
      esriConfig.defaults.map.slider = {left:"10px", top:"35px", width:null, height:"150px" };
      esriConfig.defaults.map.sliderLabel = {tick: 3, labels: null, style: "width:4em; font-family:Verdana; font-size:65%; color:#fff; padding-left:2px;"};
      esriConfig.defaults.io.proxyUrl = "proxy.ashx";
	  esriConfig.defaults.io.alwaysUseProxy = false;      
      // check for basemap passed through the URL
        var basemap = getURLParam('basemap');
      // check for extents passed through the URL
        var xmin = (parseFloat(getURLParam('xmin')));
        var ymin = (parseFloat(getURLParam('ymin')));
        var xmax = (parseFloat(getURLParam('xmax')));
        var ymax = (parseFloat(getURLParam('ymax')));
        
        if ((xmin > 1) && (xmin > 1) && (xmin > 1) && (xmin > 1)){
            var startExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, new esri.SpatialReference({wkid:2285}));
        }else{
            // if no extents were passed in the URL, then use the full county extent
            var startExtent = new esri.geometry.Extent(1160000, 25000, 1620000, 305000, new esri.SpatialReference({wkid:2285}));
        }
 
        map = new esri.Map("map", {extent:startExtent});
         // NOTE:  Seems that if you connect to the onLoad AFTER you add map layers, it won't fire the map.onLoad even
         // in IE after you leave and return via the back button.
        maponload_handler = dojo.connect(map, "onLoad", initFunctionality);
         
        //set up and add the map services. ID's match the button names for base maps
        tiledGenericBase = new esri.layers.ArcGISTiledMapServiceLayer(tiledGenericBaseURL, {id:"Map"} );
        map.addLayer(tiledGenericBase);
        
        tiledHybridBase = new esri.layers.ArcGISTiledMapServiceLayer(tiledHybridBaseURL, {id:"Aerial"});
        map.addLayer(tiledHybridBase);
        
        tiledHybridBaseOverlay = new esri.layers.ArcGISTiledMapServiceLayer(tiledHybridBaseOverlayURL, {id:"Hybrid"});
        tiledHybridBaseOverlay.hide();
        map.addLayer(tiledHybridBaseOverlay);        

        dynamicAlerts = new esri.layers.ArcGISDynamicMapServiceLayer(dynamicAlertsURL, {id:"Alerts"});
        map.addLayer(dynamicAlerts);
       // dynamicAlerts.setDisableClientCaching(true);
           
        tiledtrafficCameras = new esri.layers.ArcGISTiledMapServiceLayer(trafficCamerasURL, {id:"TrafficCameras"} );
        map.addLayer(tiledtrafficCameras);        
             
        dynamicAlerts.show();
        tiledtrafficCameras.show();
        //honor URL parameters if present, else go to default
        if (basemap !== "") {
            changeBaseMap(basemap);
        }else{    
            changeBaseMap(tiledGenericBase);
        }
        getWSDOTInfoAndMap();  // calls the functionality to retreive, transform, and map the WSDOT road alert data        
        locator = new esri.tasks.Locator(locatorURL);
        locatorComplete_handler = dojo.connect(locator, "onAddressToLocationsComplete", showResults);
        //connect to window's resize event
         windowResize_handler = dojo.connect(window, "onresize", function() {
            clearTimeout(timer);
            timer = setTimeout(function() { map.resize(); map.reposition(); }, 500);});        
        addOnUnload_handler = dojo.addOnUnload(removeListeners); 
}
      
function initFunctionality(map) {
    //console.log("initFunctionality begins");
    initIdentify();
    //getWSDOTInfoAndMap();  // calls the functionality to retreive, transform, and map the WSDOT road alert data
   
   // removed this event as it was doing duplicate identifies, which are now triggered only by graphic.onClick
   // maponClick_handler = dojo.connect(map, "onClick", doIdentify);
   // new map.onClick handler just hides the infoWindow
   maponClick_handler = dojo.connect(map, "onClick", function(){console.log("map onClick:");map.infoWindow.hide();}); 
    preLoadData();   
    var trafcamID = "";
    var closureID = "";
    closureID = getURLParam('clid');
    trafcamID = getURLParam('cameraid') ;  
    console.log("closureID=" + closureID);
    console.log("trafcamID="+ trafcamID);   
     if (closureID !== "") {
        zoomToClosure(closureID, 0);
        zoomToClosure(closureID, 1);
     }     
    else if (trafcamID !== "") {
        zoomToCamera(trafcamID, 2);
     }    
    infoWindowHide_handler = dojo.connect(map.infoWindow, "onHide", stopTrafficCam);  
}

function ClearMap() {
    map.graphics.clear();
    dojo.byId("btnClear").style.visibility="hidden";
}

function changeLayerVis(layerID, isVisible){
    map.infoWindow.hide();
    // This is clunky, but it should work for now.   
    var theVisArray;  
    // Two kinds of road closures to work with.  
    if (dojo.byId("chkClosures").checked===true){            
            if (dojo.byId("chkCurrent").checked===true) {
                theVisArray="0,1";
				dynamicAlerts.show();
                isCurrentAlertLayerOn = true;
                isFutureAlertLayerOn = true;                
                dojo.byId("chkCurrent").disabled=false;                
            }     
            if (wsdotLoaded){ 
              dojo.byId("chkWSDOT").disabled=false;
			  if (dojo.byId("chkWSDOT").checked===true){wsDOTgraphicLayer.show()};
            }

    }else{
        isCurrentAlertLayerOn = false;
        isFutureAlertLayerOn = false; 
		dynamicAlerts.hide();               
        dojo.byId("chkCurrent").disabled=true;
        if (wsdotLoaded){ 
          dojo.byId("chkWSDOT").disabled=true;
		  wsDOTgraphicLayer.hide();
        }
    }
    
    // Now deal with the traffic cams
    if (dojo.byId("chkTraffic").checked===true){
        isTrafficCamLayerOn = true;
        tiledtrafficCameras.show();
    }else{
        isTrafficCamLayerOn = false;    
        tiledtrafficCameras.hide();       
    }
    dynamicAlerts.setVisibleLayers([theVisArray]);
}



//function to get parameters passed in the URL
function getURLParam( name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

function closeLinkDiv() {
    dojo.byId("linkDiv").style.display = "none";
}

function removeListeners() {
        console.log("removing listeners");
    // if you add a listener elsewhere in the app, add a line to remove it here
    // this function will be called when the document unloads.  
    // Removing listeners prevents possible memory leaks
    dojo.disconnect(maponload_handler);
    dojo.disconnect(locatorComplete_handler);
    dojo.disconnect(windowResize_handler);
    dojo.disconnect(maponClick_handler);
    dojo.disconnect(infoWindowHide_handler);
    dojo.disconnect(addOnUnload_handler); 
    dojo.disconnect(graphicsonMouseOver_handler);
    dojo.disconnect(graphicsonMouseOut_handlerdojo);
    dojo.disconnect(graphicsonClick_handler);
}  
function createURLForCurrentExtent() {
    var baseURL= document.location.host + document.location.pathname;
    var params = "?xmin=" + map.extent.xmin + "&ymin=" + map.extent.ymin + "&xmax=" + map.extent.xmax + "&ymax=" + map.extent.ymax;
    if (tiledGenericBase.visible===true){
        params += "&basemap=Map"
    }else if (tiledHybridBaseOverlay.visible===true){ 
        params += "&basemap=Hybrid"
    }else if (tiledHybridBase.visible===true){ 
        params += "&basemap=Aerial"        
    }
    if (map.infoWindow.isShowing){
        params += "&" + selectedFeatureQuery;
        }
    //return extentURL;
    var extentURL = "http://" + baseURL + params;
    dojo.byId("txtLink").value = extentURL;
    dojo.byId("linkDiv").style.display = "block";
    return extentURL;    
}
function changeBaseMap(baselayer){
    switch(baselayer){
        case tiledGenericBase: case "Map": case "map": default:
            tiledHybridBase.hide();
            tiledHybridBaseOverlay.hide();
            tiledGenericBase.show();
            setActiveButton("btnGenericBase")
            break;
        case tiledHybridBase: case "Aerial": case "aerial":
            tiledHybridBase.show();
            tiledHybridBaseOverlay.hide();
            tiledGenericBase.hide();
            setActiveButton("btnHybridBase");
            break; 
        case tiledHybridBaseOverlay: case "Hybrid": case "hybrid":
            tiledHybridBase.show();
            if (isIE6) {
                tiledHybridBaseOverlay.hide();
                setActiveButton("btnHybridBase");
            }else{
                tiledHybridBaseOverlay.show();
                setActiveButton("btnHybridBaseOverlay");
            }
            tiledGenericBase.hide();
            break;              
    }    
}    

 function setActiveButton(buttonName){
    // set up an array of your base map button IDs.
    if (isIE6) {
        var btnArray = ["btnGenericBase","btnHybridBase"];
    }else{
        var btnArray = ["btnGenericBase","btnHybridBase","btnHybridBaseOverlay"];
    }        
    console.log(btnArray);
    dojo.forEach(btnArray, function(buttonName){dojo.removeClass(buttonName,"baseMapButtonActive"); console.log(buttonName)});
    dojo.addClass(buttonName,"baseMapButtonActive");
}
