

    var gmap = null;
    var mapExtension,overlays;
    var dynamicMap;
    var visibleList = [];
    var markerList = [];
    var idlayerList = ["VPROVIDERGRIDS"]
    var geocodeAccuracy = [2,4,6,10,12,13,14,14,14,14];
    var strdefaultInput
    var initialBBLyr
    var currentBBMap

    dojo.require("dojo.parser");
    dojo.require("dijit.form.Button");
    dojo.require("dijit.Menu");
    dojo.require("dijit.Tooltip");
    dojo.require("dijit.Dialog");
    
    dojo.addOnLoad(function(){

       loadMapTypesList()     
       strDefaultInput = dojo.byId("address").value
      
       dojo.fadeOut({
                      node:"preloader",
                      onEnd: function(){
                      dojo.style("preloader", "display", "none"); }
                    }).play();

       initialize()  

    });
    
    
    function initialize() {

      if (!GBrowserIsCompatible()) {
        alert("Your browser does not seem to be compatible with the mapping tools used by this site."); 
        document.location="http://errorpagenotcompatible.htm"; }
      
      var uri = window.location;
      var queryParams = dojo.queryToObject(window.location.search.slice(1));

      if (window.location.search) {
         initialCenter = new GLatLng(queryParams["lat"],queryParams["lng"]);
         initialZoom = parseInt(queryParams["zm"])
         initialBBLyr = queryParams["ly"] }
       else {
         initialCenter = new GLatLng(32.787, -86.407);
         initialZoom = 7
         initialBBLyr = "MaxDLSpeed"
      }

      currentBBMap = initialBBLyr
      gmap = new GMap2(document.getElementById("gmap"));
      gmap.addControl(new GLargeMapControl());
      gmap.addControl(new GOverviewMapControl(new GSize(200,200)));
      gmap.disableContinuousZoom();
      gmap.setCenter(initialCenter, initialZoom);
      
      var mt = gmap.getMapTypes();
      for (var i=0; i<mt.length; i++) {
        mt[i].getMinimumResolution = function() {return 6;}
        mt[i].getMaximumResolution = function() {return 18;}
      }

      mapExtension = new esri.arcgis.gmaps.MapExtension(gmap);

      dynamicMap = new esri.arcgis.gmaps.DynamicMapServiceLayer(mapService,null, 0.60, dynmapcallback);
      
      queryTask = new esri.arcgis.gmaps.QueryTask(mapService + "/12");
      queryCnty = new esri.arcgis.gmaps.QueryTask(mapService + "/6");
      
      GEvent.addListener(gmap, "click", function(overlay,point){
          if (point) {
          queryLocation(point,"none") }
        });
      
      //GEvent.addListener(gmap, "zoomend", function(oldzoom, newzoom) { onZoomEnd(newzoom)});
 
      geocoder = new google.maps.ClientGeocoder();

      loadCountiesList()
      setBroadbandLegend(initialBBLyr);

    }


    function dynmapcallback(mapservicelayer) {

      gmap.addOverlay(mapservicelayer);
  
      visibleList = [0,6,8,9,11]     
      //setLayerVisibility([initialBBLyr], true)     
      
    }



 function unload() {
 
   GUnload(); 

 }



function onZoomEnd(newzoom) {

if (newzoom < 12 && currentBBMap == 'RoadsBuffer100' ) {
  setBroadbandMap("MaxDLSpeed") }

if (newzoom >= 12 && currentBBMap == 'MaxDLSpeed') {  
  setBroadbandMap("RoadsBuffer100") }

}



function fullExtent() {

  var fullCenter = new GLatLng(32.787, -86.407);
  gmap.setCenter(fullCenter, 7)

}



function clearMarkers() {

  dojo.forEach(markerList, function(item) {
     gmap.removeOverlay(item)
   });

}



function showHelp() {

  window.open("mapHelp.htm","helpwindow")

}



 function printMap() {

   strURL = returnMapURL('Print')
   window.open(strURL,'printwindow')

 }



function returnMapURL(option) {

  var cen = gmap.getCenter()
  var zoom = gmap.getZoom()

  strURL = "http://al.linkamericadata.org/map" + option + ".htm"
  strURL += "?lat=" + cen.lat() + "&lng=" + cen.lng() + "&zm=" + zoom + "&ly=" + currentBBMap

  return strURL

}



function clearDefaultInput() {

  var objInput = dojo.byId("address")

  if (objInput.value == strDefaultInput) {
    objInput.value = ""
    dojo.addClass(objInput, "active")
  }

}



function setMapType(opt) {
   
   if (opt == 'none') {
      gmap.removeMapType(G_DEFAULT_MAP_TYPES) }
    else {
      eval("gmap.setMapType(" + opt + ")");  }

   dojo.byId("lstMapTypes").blur();
}



function setBroadbandMap(option) {

  visibleLayer = []

  setLayerVisibility(["RdsSpeed","MaxDLSpeed", "RoadsBuffer","RoadsBuffer100"], false)

  if (option != 'none') {
     visibleLayer.push(option)
     setLayerVisibility(visibleLayer, true)  }

  setBroadbandLegend(option)
  currentBBMap = option

}



function setBroadbandLegend(option) {

    var mapDesc = jsonBroadbandMaps[option][0]
    
    dojo.byId("lblMapName").innerHTML = mapDesc.name
    dojo.byId("lblMapDesc").innerHTML = mapDesc.desc 
    dojo.byId("lblMapLgnd").className = "sp" + option + "Lgnd"; 
}



function loadCountiesList() {

    var objCounties = dojo.byId("lstCounties")
    objCounties.options.add(new Option("Select a County", "none", false, false))
    dojo.forEach(jsonCounties,function(item) {objCounties.options.add(new Option(item.name + " County", item.name, false, false));});

}



function loadMapTypesList() {

  var menu = dijit.byId("mnuMapTypes")

  dojo.forEach(jsonMapTypes, function(item) {
     var mItem = new dijit.MenuItem({label:item.name});
     dojo.connect(mItem, "onClick", function(){setMapType(item.type)});
     menu.addChild(mItem);
  });
}



function loadBroadbandMapList() {

  var menu = dijit.byId("mnuBroadbandMaps")

  dojo.forEach(jsonBroadbandMaps, function(item) {
     var mItem = new dijit.MenuItem({label:item.name});
     dojo.connect(mItem, "onClick", function(){setBroadbandMap(item.type)});
     menu.addChild(mItem);
  });
}



function loadCountyList() {

  var menu = dijit.byId("mnuCounties")

  dojo.forEach(jsonCounties, function(item) {
     var mItem = new dijit.MenuItem({label:item.name});
     dojo.connect(mItem, "onClick", function(){findCounty(item.type)});
     menu.addChild(mItem);
  });
}



function openDialog(strTitle, strContent) {

  var objDialog = dijit.byId('dialog1')
  strContent += "<div><button dojoType='dijit.form.Button'  id='dialog1btn' class='myButton' onclick=\"dijit.byId('dialog1').hide()\">Close</button></div>"
  
  objDialog.title = strTitle
  objDialog.attr('title', strTitle);
  objDialog.attr('content', strContent); 
  objDialog.show()
  
  dojo.byId("dialog1").blur()

}


function openCountyDialog() {

  var objDialog = dijit.byId('dialogCounties')
  objDialog.show()

}



  function togglePOI() {

        var layerid = getLayerIDbyName("POI")
        setLayerVisibility(['POI'], ! checkArray(layerid,visibleList)) 
        dojo.byId("lstMapTools").blur()
        
        var objMenuItem = dijit.byId("mnuPOI")

        if (objMenuItem.label == 'Hide Critical Facilities') {
            objMenuItem.attr("label",'View Critical Facilities')}
          else {
            objMenuItem.attr("label",'Hide Critical Facilities')}

    }



 function processAddress() {

        var address = document.getElementById("address").value
        address += " alabama"
        
        geocoder.getLocations(address, function (result) {

            if (result.Status.code == G_GEO_SUCCESS) {

              if (result.Placemark.length > 1) { 
                var strContent = "<h1 class='Dialog'>Search Results</h1>";
                var strContent = "<p class=info>Your search returned more than one result.  Choose from the list to map the result until you have found the best match or you can try your search again. Click Close to close the box.</p>"
                
                for (var i=0; i<result.Placemark.length; i++) {
                  var p = result.Placemark[i].Point.coordinates;
                  var strAddress = result.Placemark[i].address
                  var accuracy = result.Placemark[0].AddressDetails.Accuracy
                  strContent += "<br>"+(i+1)+": <a class='sm' href=\"javascript:place(" +p[1]+","+p[0]+",'" + strAddress + "'," + accuracy + ")\">"+ strAddress +"<\/a>";
                  openDialog("Search Results", strContent)
                }
              }
              else {
                var p = result.Placemark[0].Point.coordinates;
                var strAddress = result.Placemark[0].address
                var accuracy = result.Placemark[0].AddressDetails.Accuracy
                place(p[1],p[0],strAddress, accuracy);
              }
            }
            else {
              var errorCode = result.Status.code
              var strErrorMessage = "Error Code: " + errorCode;
              if (geocodeErrors[errorCode]) {
                  strError = geocodeErrors[errorCode]
                  strErrorMessage = "<h1 class='Dialog'>" + strError.substring(0,strError.indexOf(':')) + "</h1>"
                  strErrorMessage += "<h2>" + strError.substring(strError.indexOf(':') + 1) + "</h2>"
               } 
              openDialog("Find Address or Location Error", strErrorMessage)  }
          });
      }
    


 function place(lat, lng, strAddress, accuracy) {

        //clearMarkers()
        var point = new GLatLng(lat,lng);
        //var marker = new GMarker(point);
        //markerList.push(marker);
        //gmap.addOverlay(marker);
        
        queryLocation(point, strAddress)
        gmap.setCenter(point,geocodeAccuracy[accuracy]);
                
              
      }




function queryLocation(point,strAddress) {

  query = new esri.arcgis.gmaps.Query();
  query.returnGeometry = false;
  query.outFields = ["MaxDLSpeed","DisplayName","CompWeb","GRIDID"]
  query.queryGeometry = point;
  query.where = "OnlineMaps = 'y'"
  
  queryTask.execute(query, null, function(fset) { addResults(fset, point, strAddress); });

}


function addResults(response, point, strAddress){

  
  var providers = [];
  var str = "<div class='spCAInfo'></div><div class=dialogBox>"
 
          if (response.features.length > 0 && ! isNaN(parseInt(response.features[0].attributes.MaxDLSpeed))) {
          
             var attr = response.features[0].attributes;
             var strGridID = attr.GRIDID
             var strCountyName = strGridID.substring(0,strGridID.length - 6)
             
             if (point) {
             var coord = "The coordinates are <span class='txBold'>Lat: " + Math.round(point.lat()*1000000)/1000000 + ", Long: " + Math.round(point.lng()*1000000)/1000000 + "</span>"}
             
             if (strAddress !== 'none') {
             str += "<h1 class='Dialog'>" + strAddress + "</h1>" }
             
             str += "<p class=hglt>" + formatSpeed(attr.MaxDLSpeed) + " is the maximum download speed available here.</p>"
             str += "<p>This location is in <span class='txBold'>" + strCountyName + " County, Alabama.</span></p>"
             str += "<p>" + coord + "</p>"  
             str +="<p><span class='txBold'>Providers offering service in this area:</p>"
            
             dojo.forEach(response.features,function(result){
                 var attrProviders = result.attributes;
                 var strProvider =  attrProviders.DisplayName;
                 
                 if (! checkArray(strProvider,providers)) {
                   providers.push(strProvider)
                   var strURL = attrProviders.CompWeb;
                   str += "<li class=info>" + strProvider
                   if (strURL != 'Null') {
                      str += " (<a class=sm target=_blank href='" + strURL + "'>Web Site</a>)" }
                   str += "</li>" 
                 }
             });
              
             if (strAddress !== 'none') {
               str += "<p class=footer>Note: The coverage information shown applies to this general area and not to a specific address</p>" }
            
 } 
          else {
             str += "<p>There is currently no broadband coverage reported at this location.  However, providers may have upgraded service capacity since our last survey. As the ConnectingALABAMA project moves forward, we anticipate updates to service speeds and coverage information approximately every six months.</p> " } 
          
          
          str += "</div>"   
          gmap.openInfoWindowHtml(point, str);


}



function findCounty() {

    objCountyName = dojo.byId("lstCounties")
    strCountyName = objCountyName.options[objCountyName.selectedIndex].value

    if (strCountyName != 'none') {
    query = new esri.arcgis.gmaps.Query();
    query.returnGeometry = true;
    query.outFields = [];
    query.where = "NAME = '" + strCountyName + "'"

    queryCnty.execute(query, null, function(fset) { zoomtoFeatures(fset); });
          google.maps.Event.addListener(queryTask,"error",function(){
          alert("There was a problem. Please try resubmitting again in a few minutes. ");
        });
    }

    objCountyName.blur();
}










function zoomtoFeatures(fset) {

var bounds = fset.features[0].geometry[0].getBounds()
var center = bounds.getCenter();		
var zoomLevel = gmap.getBoundsZoomLevel(bounds);

gmap.setCenter(center);
gmap.setZoom(zoomLevel);

}




function formatSpeed(speed) {

  speed = parseInt(speed)
 
  if (speed < 1000) {
     return speed + " kbps" }
   else {
     return (speed / 1000) + " mpbs" }
     
}     


      function showFeature(layerId, index) {
        mapExtension.removeFromMap(overlays);
        var idResult = layers[layerId][index];
        overlays = mapExtension.addToMap(idResult, {polygonOptions: { clickable: false}});
      }



function clearResults() {
        mapExtension.removeFromMap(overlays);
        gmap.closeInfoWindow();
      }
      

function hasErrorOccurred(error) {
        if (error) {
          alert("Error " + error.code + ": " + (error.message || (error.details && error.details.join(" ")) || "Unknown error" ));
          return true;
        }
        return false;
      }


function toggleLayerVis(strLayerName) {

        var layerid = getLayerIDbyName(strLayerName)
        setLayerVisibility([strLayerName], ! checkArray(layerid,visibleList)) 

    }



    function checkArray(val,arr) {

        for (var i=0, il=arr.length; i<il; i++) {
            if (arr[i] == val) {return true;}
        }

        return false;
    }


function findArrayPosition(val,arr) {

        for (var i=0, il=arr.length; i<il; i++) {
            if (arr[i] == val) {return i;}
        }

        return -1;
    }




function getLayerIDbyName(strLayerName) {

        var infos = dynamicMap.layerInfos, info;

        for (var i=0, il=infos.length; i<il; i++) {
            if (infos[i].name == strLayerName) {
                layerid = infos[i].id  }    
        } 

        return layerid;

    }



function setLayerVisibility(arrLayerNames, visible) {

       
        dojo.forEach(arrLayerNames,function(lyrname){
           var layerid = getLayerIDbyName(lyrname);
           updateVisibleList(layerid,visible)     
         });

        dynamicMap.setVisibleLayers(visibleList)
    }



function updateVisibleList(layerid,visible) {
 
   var listPos = findArrayPosition(layerid,visibleList)

   if (visible && listPos == -1) { visibleList.push(layerid) }
   if (! visible && listPos > -1) { visibleList.splice(listPos, 1); }
}


