var detectorMarkers = new Array();
var detectorsExist = false;
var detectorsLoaded = false;
var detectorPopupDisplayed = false;
var checkExistingDetector = false;
var addDetectorFlag = true;
var existingDetectorArray = new Array();
var drawingDetectors = false;
var clusteredSpeedMarkers = new Array();

  
function createDetectorPopups(elem, xmlDoc) {
    var tmpTooltip = "";
    var previousLat = 0;
    var previousLon = 0;
    var trafficDesc = "";
    
    initializeEventMarkers(detectorMarkers);
    
    for (var i = 0; i < elem.length; i++) {
    // obtain the attribues of each marker

      var lat = xmlDoc.getElementsByTagName("Lat")[i].firstChild.nodeValue;
      var lon = xmlDoc.getElementsByTagName("Lon")[i].firstChild.nodeValue;
      var detectorID = xmlDoc.getElementsByTagName("DetectorID")[i].firstChild.nodeValue;
      var routeName = xmlDoc.getElementsByTagName("RouteName")[i].firstChild.nodeValue;
      var description = xmlDoc.getElementsByTagName("Description")[i].firstChild.nodeValue;
      var direction = xmlDoc.getElementsByTagName("Direction")[i].firstChild.nodeValue;
      var speed = parseInt(xmlDoc.getElementsByTagName("Speed")[i].firstChild.nodeValue);
      var maxSpeedLimit = parseInt(xmlDoc.getElementsByTagName("MaxSpeedLimit")[i].firstChild.nodeValue);	
	  var lastUpdate = xmlDoc.getElementsByTagName("UpdateTime")[i].firstChild.nodeValue;	
	  
      routeName = routeName.replace("'","\'");
      description = description.replace("'","\'");
						
	  var textColor = "#005600";		 
      var icon;
       			
	  if (checkExistingDetector) {
	    var tmpID = "";
	    //we already have data in the array, now check to see if we need to remove markers
        for (var n = 0; n < detectorMarkers.length; n++) {
          tmpID = "speed_" + detectorID + "_" + direction;
          var markerID = detectorMarkers[n].getId();
                
          if (tmpID == markerID){
            //event already on map - do not display twice
            existingDetectorArray[existingDetectorArray.length] = markerID;
            addDetectorFlag = false;
            break;
          }
          else {
            //marker does not exist - set add flag to true to notify that
            //we have to add it to the map
            addDetectorFlag = true;  
          }
        }        
      }
    	
      if (addDetectorFlag) {
	  //create new markers		
	  
	    var point = new GLatLng((lat),(lon));
		
		    
		if (speed < 30) {
		  icon = heavyTrafficRndIcon;
		  trafficDesc = "Heavy traffic";
		}
		else if ((speed < 50) && (speed >= 30)){
		  icon = mediumTrafficRndIcon;
		  trafficDesc = "Moderate traffic";
	    }
		else if (speed >= 50){
		  icon = noTrafficRndIcon;
		  trafficDesc = "Traffic flowing freely";
	    }
		else {
		  speed = "NA";
		  icon = noDataRndIcon;
		  trafficDesc = "Traffic data currently not available.";
		}
		 
	    if (lastUpdate.toUpperCase() == "NULL"){
	      lastUpdate = "NA";
	    }	 
	    if (speed != "NA") {
	      speed = speed + " mph";
	    }
		    
        var detectorMarker = new PdMarker(point, icon);
        detectorMarker.setId("speed_" + detectorID + "_" + direction);			
		detectorMarker.tooltip = '<div class="markerTooltip" style="color:'+textColor+';';
		detectorMarker.tooltip += 'text-align: center; width: 230px; line-height: 18px;">'
		detectorMarker.tooltip += routeName + " " + description +'<br />';
		detectorMarker.tooltip += trafficDesc + '<br />';
		detectorMarker.tooltip += 'Average Speed: ' + speed + '<br />';
		detectorMarker.tooltip += 'Last update: ' + lastUpdate + '</div>';
		
        createDetectorMarker(point, detectorMarker, routeName, direction, description, maxSpeedLimit);	
	   
		googleMap.addOverlay(detectorMarker);
            
        detectorMarkers[detectorMarkers.length] = detectorMarker;
            
        previousLat = lat;
        previousLon = lon;    
      }//end if addDetectorFlag flag
      
      else {
        //detector already exists - update the tooltip and the color of the icon
          
		if (speed < 30) {
		  icon = heavyTrafficRndIcon;
		  trafficDesc = "Heavy traffic";
		}
		else if ((speed < 50) && (speed >= 30)){
		  icon = mediumTrafficRndIcon;
		  trafficDesc = "Moderate traffic";
	    }
		else if (speed >= 50){
		  icon = noTrafficRndIcon;
		  trafficDesc = "Traffic flowing freely";
	    }
		else {
		  speed = "NA";
		  icon = noDataRndIcon;
		  trafficDesc = "Traffic data currently not available.";
		}
		 
	    if (lastUpdate.toUpperCase() == "NULL"){
	      lastUpdate = "NA";
	    }	 
	    if (speed != "NA") {
	      speed = speed + " mph";
	    }
		
        var detectorMarker = googleMap.getMarkerById("speed_" + detectorID + "_" + direction);
        
        //* SK 11/21/2008
        detectorMarker.display(true);
        
        detectorMarker.tooltip = '<div class="markerTooltip" style="color:'+textColor+';';
		detectorMarker.tooltip += 'text-align: center; width: 230px; line-height: 18px;">'
		detectorMarker.tooltip += routeName + " " + description +'<br />';
		detectorMarker.tooltip += trafficDesc + '<br />';
		detectorMarker.tooltip += 'Average Speed: ' + speed + '<br />';
		detectorMarker.tooltip += 'Last update: ' + lastUpdate + '</div>';
		detectorMarker.setImage(icon.image); // change graphic
				
      }
    }//end for loop

    //function to display markers true, make sure something is in the array first
	if (checkExistingDetector) {
	    
	  for (var n = 0; n < existingDetectorArray.length; n++) {
	    var markerToDisplay = googleMap.getMarkerById(existingDetectorArray[n]);
        ///markerToDisplay.display(true); //commented out SK 11/21/2008
            
        //if we've reached the last element, hide please wait
        if (n == existingDetectorArray.length-1) {
	      drawingDetectors = false;
	      hidePleaseWaitScreen();
        }
      }
      if (checkExistingDetector.length == 0) {
        drawingDetectors = false;
        hidePleaseWaitScreen();
      }
	}
	else{
	  drawingDetectors = false;
	  hidePleaseWaitScreen();
	}
    
    //now that we've gotten data, we need to set a flag to let us know to 
    //check existing next time the user updates the map
    checkExistingDetector = true;
    existingDetectorArray = [];
    
    
      
}

function createClusteredSpeedMarkers(elem, xmlDoc) {
     if(clusteredSpeedMarkers != null)
     clusteredSpeedMarkers = [];
    //this function sets up the regional detector markers (clustering)
    for (i = 0; i < elem.length; i++) {
        var name = xmlDoc.getElementsByTagName("DisplayName")[i].firstChild.nodeValue;
        var lon = xmlDoc.getElementsByTagName("Longitude")[i].firstChild.nodeValue;
        var lat = xmlDoc.getElementsByTagName("Latitude")[i].firstChild.nodeValue;
        var zoomTo = xmlDoc.getElementsByTagName("ZoomTo")[i].firstChild.nodeValue;
        var speedID = xmlDoc.getElementsByTagName("ID")[i].firstChild.nodeValue;
        
        name = name.replace("'","\'");
				
		if (lat > 90 || lat < -90)
		{
			lat = lat*.000001;
		}
		if (lon > 180 || lon < -180)
		{
			lon = lon*.000001;
		}
        
        var point = new GLatLng((lat),(lon));
		
		var icon = speedIcon;
        var speedMarker = new PdMarker(point, icon);
        speedMarker.setId("speed_Cluster_" + speedID);			
		speedMarker.tooltip = '<div class="markerTooltip" style="color:#990000;'; 
		speedMarker.tooltip += 'text-align: center;">'
		speedMarker.tooltip += name +'<br />';
		speedMarker.tooltip += 'Click to show speeds' +'</div>';
		    
		googleMap.addOverlay(speedMarker);
        speedMarker.display(false);
        
        createClusteredSpeedMarker(point, speedMarker, name, zoomTo);
        clusteredSpeedMarkers[clusteredSpeedMarkers.length] = speedMarker;        
        	
    }
        //function is placed outside the 'for' loop to avoid multiple looping 
    	//displays markers by looping through clusteredSpeedMarkers array once
        showClusteredSpeedMarkers();
        drawingLinks = false;
}

function showClusteredSpeedMarkers(){
    initializeEventMarkers(detectorMarkers);
    if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_speedCheck').checked) {
        for (var n = 0; n < clusteredSpeedMarkers.length; n++) {
            clusteredSpeedMarkers[n].display(true);
            
            // hides the pleasewait screen
            if(n == clusteredSpeedMarkers.length-1) {
              hidePleaseWaitScreen();
            }
        }
    }
}

function createClusteredSpeedMarker(point, marker, name, zoomTo) {
    GEvent.addListener(marker, "click", function() {
  	  //added to save the position of the map before the marker is opened.
      googleMap.savePosition();
       RemoveEventMarkers(clusteredSpeedMarkers);
      googleMap.setCenter(new GLatLng(point.lat(), point.lng()), parseInt(zoomTo));
    });
    GEvent.addListener(marker,"mouseover", function() {
        markerTooltipFlag=true;
        clearPopupTimer();
        showTooltip(marker);
    });        
    GEvent.addListener(marker,"mouseout", function() {
        markerTooltipFlag=false;
        markerTooltip.style.visibility="hidden";
    });
    GEvent.addListener(marker, "infowindowclose", function() {
        //return the map to its original position.
        googleMap.returnToSavedPosition();    
    });
}

function createDetectorMarker(point, marker, routeName, direction, description, maxSpeedLimit) {
    GEvent.addListener(marker, "click", function() {
    
      //4-08-08 - minimize the overview map when the cctv popup is opened. JZ
      overview.hide(true);
        
         
      //added to save the position of the map before the marker is opened.
      googleMap.savePosition();
    
      var id = marker.getId();
      var cont = document.createElement('div');
      cont.setAttribute('id','detectorDiv');
            
      //var cont = document.getElementById('weatherAlertDiv');
      var detectorDiv = getTransformedDoc(xml, xsl);
              
      //globaly replace less than greater than with symbols
      detectorDiv = alertDiv.replace(/&lt;/g,'<');
      detectorDiv = alertDiv.replace(/&gt;/g,'>');
            
      cont.innerHTML = detectorDiv;
      if(cont.innerHTML == "") {
        alert("An error occured while retreiving speed detecotor data.\nPlease try again later.");
        return;
      } 
              
      //special extended marker  
      marker.openExtInfoWindow(
        googleMap,
        "weatherForecastPopup",
        cont.innerHTML,
        {beakOffset: 2}
      ); 
    });
    
    GEvent.addListener(marker,"mouseover", function() {
        markerTooltipFlag=true;
        clearPopupTimer();
        showDetectorTooltip(marker);
    });        
    GEvent.addListener(marker,"mouseout", function() {
        markerTooltipFlag=false;
        markerTooltip.style.visibility="hidden";
    }); 
}	

function showDetectorTooltip(marker) {
    markerTooltip.innerHTML = marker.tooltip;
    var point=googleMap.getCurrentMapType().getProjection().fromLatLngToPixel(googleMap.fromDivPixelToLatLng(new GPoint(0,0),true),googleMap.getZoom());	
    var offset=googleMap.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),googleMap.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;
	var height=markerTooltip.clientHeight;
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height)); 
	pos.apply(markerTooltip);
	markerTooltip.style.visibility="visible";
	markerTooltip.style.width="230px";
	markerTooltip.style.border="1px solid #005500";
}