var IsDebugMode = "false";
var incMarkers = new Array();
var constMarkers = new Array();
var specevtMarkers = new Array();

var eventMarkers = new Array();
var existingArray = new Array();
var addFlag = true;
var checkExisting = false; //flag to check existing array - only changes if we've already gotten data

var incVisible = false;
var constVisible = false;
var specevtVisible = false;
var weatherVisible = false;

var lastIndex = 0;
var htmlDescs = new Array();
var idArray = new Array();


// marker variables
var displayMarker = true;
var pointType;
var eventType;
var lowerEventType;
var facility;
var eventDesc;
var lon;
var lat;
var lastUpdate;
var reportOrgName;
var eventID;
var URL;
var urlAlias;
var urlDisplayAs;
var hyperlinkColor;
var createTime;
var duration;
var textColor = "";
var incType = "";
var displayAnimatedIcon = false;
var lastLayerType = "";

var overLayedMarkerArray = new Array();
var parentMarkerId = "";
var overLayedMarkerId = "";
var removableMarkerIndex = -1;
var markerType = "";
var isPreviousChecked = false;

var infoWindowOpen = false;

var layerName = "";
var visibitilityVal = new Boolean;

//1/21/2009 for animated county wide events
var countyWideEventEndWith="county";

function getMarkerInfo(markerIndex,elem, xmlDoc)
{
    //since we have layer checkboxes, we wont want to display the marker if the
    //checkbox is unchecked, or layer is toggled off - we can store the marker 
    //for later use - just don't add the overlay
    
    displayMarker = true;
    pointType = xmlDoc.getElementsByTagName("Event_Class")[markerIndex].firstChild.nodeValue;
    eventType = xmlDoc.getElementsByTagName("Event_Type")[markerIndex].firstChild.nodeValue;
    lowerEventType = eventType.toLowerCase();
    facility = xmlDoc.getElementsByTagName("Facility_Name")[markerIndex].firstChild.nodeValue;
    eventDesc = xmlDoc.getElementsByTagName("Event_Description")[markerIndex].firstChild.nodeValue;
    lon = xmlDoc.getElementsByTagName("Lon")[markerIndex].firstChild.nodeValue;
    lat = xmlDoc.getElementsByTagName("Lat")[markerIndex].firstChild.nodeValue;
    lastUpdate = xmlDoc.getElementsByTagName("Last_Update")[markerIndex].firstChild.nodeValue;
    reportOrgName = xmlDoc.getElementsByTagName("Org_Name")[markerIndex].firstChild.nodeValue;
    eventID = xmlDoc.getElementsByTagName("Event_ID")[markerIndex].firstChild.nodeValue;
    URL = xmlDoc.getElementsByTagName("URL")[markerIndex].firstChild.nodeValue;
    urlAlias = xmlDoc.getElementsByTagName("urlAlias")[markerIndex].firstChild.nodeValue;
    urlDisplayAs = xmlDoc.getElementsByTagName("urlDisplayAs")[markerIndex].firstChild.nodeValue;
    hyperlinkColor = xmlDoc.getElementsByTagName("fontColor")[markerIndex].firstChild.nodeValue;
    createTime = xmlDoc.getElementsByTagName("CREATE_TIME")[markerIndex].firstChild.nodeValue;
    duration = xmlDoc.getElementsByTagName("EST_DURATION")[markerIndex].firstChild.nodeValue;
	
    textColor = "";
    incType = "";
    
    if (pointType == "5") {
        incType = "Planned Construction";
    }
			
    if (pointType == "7") {
        incType = "Planned Special Event";
    }
	
    if (pointType == "1") {
        incType = "Incident";
    }
    else if (pointType == "3") {
        incType = "Active Construction";
    }
    else if (pointType == "14") {
        incType = "Active Special Event";
    }
    
    //======add Animation Icons for county wide events============
    //add animated icons for county wide event
    //Date Added:1/21/2009
    //Added by: Haiyan Du Haiyan.Du@Telvent.com
    facility = Trim(facility);

    var facilityEndString = Right(facility,6);

    if(facilityEndString.toLowerCase() == countyWideEventEndWith)
    {
        displayAnimatedIcon=true;
    }
    else
    {
        displayAnimatedIcon=false;
    }
}

function ClusterMarker()
{
  if(parentMarkerId != "")
  {
     if ((pointType == "buses")) {
         textColor = "#000000";
         }
     else if ((pointType == "1") || (pointType == "2")) {
         textColor = "#990000";
         }
     else if ((pointType == "3") || (pointType == "4") || (pointType == "5") || (pointType == "6")) {
         textColor = "#009900";
         }
     else if ((pointType == "7") || (pointType == "14") || (pointType == "16") || (pointType == "17")) {
         textColor = "#000099";
         }
	  eventDesc = createURLString(eventDesc, eventID, URL, hyperlinkColor, textColor, urlAlias, urlDisplayAs, lastUpdate);
     
      //include existing
	  var infoHtmls = generateInfoWindowContent(eventID, eventDesc, reportOrgName, textColor, lastIndex);
      htmlDescs[lastIndex] = infoHtmls;
            
     //store ID regardless of whether marker was created or not
            
      var newTooltip = generateTooltipInfo(false);
      parentMarker = googleMap.getMarkerById(parentMarkerId);
      parentMarker.tooltip = parentMarker.tooltip + newTooltip;
    }
}


function getLayerType(incTyp)
{
    var marType = "";
    if ((incType == "Planned Construction") || (incType == "Active Construction")) 
    {
        marType = "constMarkers";
    }
    else if ((incType == "Planned Special Event") || (incType == "Active Special Event")) 
    {
        
    }
    else if (incType == "Incident") 
    {
       
    }

}

function OverLayMarker()
{
    //create new markers
    var point = new GLatLng(lat,lon);	
    if ((pointType == "1") || (pointType == "2")) {
	    if(displayAnimatedIcon)
	    {
	        icon = incIcon_Animated; 
	    }
	    else
	    {
	        icon=incIcon;
	    }
	    textColor = "#990000";
	    incVisible = true;
	    var incMarker = new PdMarker(point, icon);
	    tmpMarker = incMarker;
	    incMarkers.push(incMarker);
    }
    else if ((pointType == "3") || (pointType == "4") || (pointType == "5") || (pointType == "6")) {
		
	    if(displayAnimatedIcon)
	    {
	        icon = constIcon_Animated; 
	    }
	    else
	    {
	        icon=constIcon;
	    }
	    textColor = "#009900";
	    constVisible = true;
	    var constMarker = new PdMarker(point, icon);
	    tmpMarker = constMarker;
	    constMarkers.push(constMarker);
    }
	
    else if ((pointType == "7") || (pointType == "14") || (pointType == "16") || (pointType == "17")) {
	    //1/21/2009 Haiyan du Added for county wide event
	    if(displayAnimatedIcon)
	    {
	        icon = specEvtIcon_Animated; 
	    }
	    else
	    {
	        icon=specEvtIcon;
	    }
		
	    textColor = "#000099";
	    specevtVisible = true;	
  	
	    var specevtMarker = new PdMarker(point, icon);
	    tmpMarker = specevtMarker;
	    specevtMarkers.push(specevtMarker);
    }
	
    else if (pointType == "weather") {
		
	    //1/21/2009 Haiyan du Added for county wide event
	    if(displayAnimatedIcon)
	    {
	        icon = weatherIcon_Animated; 
	    }
	    else
	    {
	        icon=weatherIcon;
	    }
	    textColor = "#000099";
	    weatherVisible = true;	
  	
	    var weatherMarker = new PdMarker(point, icon);
	    tmpMarker = weatherMarker;
	    weatherMarkers.push(weatherMarker);
    }
  
    var length = eventMarkers.length;
    //check for an existing url string. we do this to make comparing easier later
    eventDesc = createURLString(eventDesc, eventID, URL, hyperlinkColor, textColor, urlAlias, urlDisplayAs, lastUpdate);
    
    //now store html and index of last marker created in case we have to append the desc 
    //in the next iteration  
    //Popup	    						
    var infoHtmls = generateInfoWindowContent(eventID, eventDesc, reportOrgName, textColor, -1);
    htmlDescs[length] = infoHtmls;
    
    // Tool Tip
    tmpMarker.tooltip = generateTooltipInfo(true);
    // Create the marker                 
    createMarker(point, tmpMarker, '', length);
    
    length = eventMarkers.length;
    eventMarkers[length] = tmpMarker;
    eventMarkers[length].setId(eventID); // over-ride internal id
    
    lastIndex = length;
   
    // Overlay Marker
    googleMap.addOverlay(eventMarkers[length]);
    AddToOverlayArray();
} 

function AddToOverlayArray()
{
  overLayedMarkerArray[overLayedMarkerArray.length] = eventID + "," + lat + "," +lon + "," + incType;
}

function RemoveUncheckedEvents(inccType)
{
  if(overLayedMarkerArray.length != 0)
  {
     for(var i=0; i<overLayedMarkerArray.length;i++)
     {
       var overLayedMarkerValues = new Array();
       overLayedMarkerValues = overLayedMarkerArray[i].split(',');
       var inType = overLayedMarkerValues[3];
       
       switch(inccType)
       {
       case "constMarkers":
            if( inType == "Active Construction" || inType == "Planned Construction") 
            {
                removeByElement(overLayedMarkerArray,overLayedMarkerArray[i]); 
                removeByElement(eventMarkers,eventMarkers[i]);
                removeByElement(htmlDescs,htmlDescs[i]);
                i--;
            }
            break;

       case "incMarkers":
            if( inType == "Incident") 
            {
                removeByElement(overLayedMarkerArray,overLayedMarkerArray[i]); 
                removeByElement(eventMarkers,eventMarkers[i]);
                removeByElement(htmlDescs,htmlDescs[i]);
                i--;
            }
            break;

       case "specevtMarkers":
            if( inType == "Active Special Event" || inType == "Planned Special Event") 
            {
                removeByElement(overLayedMarkerArray,overLayedMarkerArray[i]); 
                removeByElement(eventMarkers,eventMarkers[i]);
                removeByElement(htmlDescs,htmlDescs[i]);
                i--;
            }
            break;
       }
     }  
   }
}

function RemoveMarkers()
{
  if(overLayedMarkerArray.length != 0)
  {
     for(var i=0; i<overLayedMarkerArray.length;i++)
     {
       var overLayedMarkerValues = new Array();
       overLayedMarkerValues = overLayedMarkerArray[i].split(',');
       var overLayedMarkerId = overLayedMarkerValues[0];
       var overLayMarker = googleMap.getMarkerById(overLayedMarkerId);
       if(overLayMarker != null)
       {
            googleMap.removeOverlay(overLayMarker);
       }   
     }  
     overLayedMarkerArray = new Array();
     eventMarkers = new Array();
     htmlDescs = new Array();
   }
}

function GetMarkerValue()
{
    var markerVal = "";
    if ((pointType == "1") || (pointType == "2")) {
	    markerVal = "incMarkers"
    }
    else if ((pointType == "3") || (pointType == "4") || (pointType == "5") || (pointType == "6")) {
	    markerVal = "constMarkers"
    }
    else if ((pointType == "7") || (pointType == "14") || (pointType == "16") || (pointType == "17")) {    
	    markerVal = "SpecialEvents";
    }
    
    return markerVal; 
}

function isNewCheckedMarker()
{
  var flag = false;
  var markerValue = GetMarkerValue();
  if(markerValue == markerType)
  {
    flag = true;
  }
  
  return flag;
}

function RemoveMarker()
{
    var overLayMarker = googleMap.getMarkerById(overLayedMarkerId);
    if(isPreviousChecked)
    {
        var canRemove = isNewCheckedMarker(overLayedMarkerId); 
        if(canRemove)
        {
          
        if(overLayMarker != null)
        {
             googleMap.removeOverlay(overLayMarker);
        }   

           removeByElement(overLayedMarkerArray,overLayedMarkerArray[removableMarkerIndex]);
           removeByElement(eventMarkers,eventMarkers[removableMarkerIndex]);
           removeByElement(htmlDescs,htmlDescs[removableMarkerIndex]);
        }
    }
    else 
    {
            if(overLayMarker != null)
            {
                 googleMap.removeOverlay(overLayMarker);
            }   
           removeByElement(overLayedMarkerArray,overLayedMarkerArray[removableMarkerIndex]);
           removeByElement(eventMarkers,eventMarkers[removableMarkerIndex]);
           removeByElement(htmlDescs,htmlDescs[removableMarkerIndex]);
    }
}

function IsMarkerOverlayed()
{
   var flag = false;
   if(overLayedMarkerArray.length !=0)
   {
     for(var i=0; i<overLayedMarkerArray.length;i++)
     {
       var overLayedMarkerValues = new Array();
       overLayedMarkerValues = overLayedMarkerArray[i].split(',');
       if(overLayedMarkerValues[0] == eventID)
       {
        flag = true;
        overLayedMarkerId = eventID;
        removableMarkerIndex = i;
        break;
       } 
     }
   }
   return flag;
}


function IsMakerClustering()
{
   var round_x_sw = null;
   var round_y_sw = null;
   var round_x_ne = null;
   var round_y_ne = null;
   var flag = false;
   if(overLayedMarkerArray.length != 0)
   {
     for(var i=0; i<overLayedMarkerArray.length;i++)
     {
       var overLayedMarkerValues = new Array();
       overLayedMarkerValues = overLayedMarkerArray[i].split(',');
       var evntId = overLayedMarkerValues[0];
       var latit = overLayedMarkerValues[1];
       var longit = overLayedMarkerValues[2];
       if(incType == overLayedMarkerValues[3])
       { 
           ComputeBuffer(latit, longit);
           
           round_x_sw = longit - bufferValue;
           round_y_sw = latit - bufferValue;
           round_x_ne = parseFloat(longit)  + parseFloat(bufferValue);
           round_y_ne = parseFloat(latit) + parseFloat(bufferValue);        

            // If falling inside buffer of previous element
            if( (round_x_sw <= lon) && (round_x_ne >= lon ) && (round_y_sw <= lat) && (round_y_ne >= lat))
            {
               flag = true;
               parentMarkerId = evntId;
               lastIndex = i;
               break;
            }
        }
     }
   }
  return flag;
}


function createPopups(elem,xmlDoc)
{
    //create popups from XML data
	var constChecked = document.getElementById('ctl00_ContentPlaceHolder1_traffic_constCheck').checked;
	var specevtChecked = document.getElementById('ctl00_ContentPlaceHolder1_traffic_specevtCheck').checked;
	var weatherChecked = document.getElementById('ctl00_ContentPlaceHolder1_traffic_weatherCheck').checked;
	var incChecked = document.getElementById('ctl00_ContentPlaceHolder1_traffic_incCheck').checked;
	var flag = false;
	//keep track of new markers added
	var addCount = 0;// For increasing the vertical scroll bar
	if(!isPreviousChecked)
	{
	  RemoveMarkers(); 
	  flag = true;
	}
 
	for (var i = 0; i < elem.length; i++) 
	{
        //loop through and create markers	
        getMarkerInfo(i,elem, xmlDoc);
  
        if(!flag)
        {      
   	        if(checkExisting)
   	        {
   	          var isOverlayed = IsMarkerOverlayed();
   	          if(isOverlayed)
   	          {
   	             RemoveMarker();
   	          }
   	        }
   	    }
          
      var isOverlapping = IsMakerClustering();
      if(isOverlapping)
       {
         ClusterMarker();
       }
       else 
       {
          var isOverlay = IsMarkerOverlayed();
   	      if(isOverlay)
   	      {
   	         RemoveMarker();
   	      }
         OverLayMarker();
         addCount++;
       }		
     } 

    isPreviousChecked = false;
	       		        
	checkExisting = true;
	
	
	//append scrolling function to markers
	appendScrollbars(addCount);
	
	//hide please wait screen
	hidePleaseWaitScreen();
	
	lastIndex = null;
}

function ComputeBuffer(x, y)
{
    //Dynamically compute the buffer area to be taken around mouse position to detect closest links
    var pointInPixel = googleMap.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(y,x),googleMap.getZoom());
    
    // add 10 pixels to the current mouse position
    pointInPixel.x = pointInPixel.x + 10;
    
    // get the buffer area in geo coordinates.
    var pointInLatLng = googleMap.getCurrentMapType().getProjection().fromPixelToLatLng(pointInPixel,googleMap.getZoom(), true);
    bufferValue = Math.abs(x - pointInLatLng.x);
}


// This function is used to create info window content for new marker or append content to existing marker window
function generateInfoWindowContent(eventID, eventDesc, reportOrgName, textColor, appendIndex)
{
    var infoHtmls;
    
    if(appendIndex == -1)
    {
        infoHtmls = '<div align="left" class="markerinfo" style="font-size: small; width: 375px;">';
    }
    else
    {
        infoHtmls = htmlDescs[appendIndex];
        infoHtmls += '<hr>';
        infoHtmls += '<div align="left" class="markerinfo" style="font-size: small; width: 375px;">';
    }        
        
    infoHtmls += '<b><font style="color: #000066;">Reported By: ' + reportOrgName + '</font></b>';	
    infoHtmls += '<br /><br />';
    
     if(appendIndex == -1)
    {
        infoHtmls += '<div id="dv' + eventID + '" style="font-weight: bold; color: ' + textColor + '; width: 375px;">';
    }
    else
    {
        infoHtmls += '<div id="dv' + eventID + '" style="font-weight: bold; color: ' + textColor + ';">';        
    }      
    
    
    infoHtmls += eventDesc;
    infoHtmls += '</div>';
    infoHtmls += '<br /><br />';
    infoHtmls += '</div>';
    
    return infoHtmls;
}

function removeInfoFromWindow(divId, htmlContent)
{
    var docFrag  = toDOM(htmlContent);
    var updatedHtml = "";
    
    if(docFrag.hasChildNodes() == true)
    {
        for (var i = 0; i < docFrag.childNodes.length; i++)
        {
            if(docFrag.childNodes.item(i).id == divId)
            {
                docFrag.removeChild(docFrag.childNodes.item(i));
            }
            else
            {
                updatedHtml = updatedHtml + docFrag.childNodes.item(i).outerHTML; //outerHTML;
            }
        }
    }
    return updatedHtml;
}


// This function is used to create tooltip with or without header
function generateTooltipInfo(headerFlag)
{
    var tooltip = '<div id="tt' + eventID + '" class="markerTooltip" style="color:'+textColor+';">'
    
    if(headerFlag == true)
    {
        tooltip =  tooltip +'<div class="markerTooltipHeader" >';
        tooltip = tooltip + incType +'</div>';
        tooltip = tooltip +  eventType +'<br/>'+facility+'</div>';
    }
    else
    {
         tooltip = tooltip + eventType+'<br/>'+facility+'</div>';
    }
    
    return tooltip;
}    		    


//added to append div style to complete HTML text string that may have been appended to
//for scrolling purposes
function appendScrollbars(addCount) {
    var tmpLength = parseInt(htmlDescs.length);
    var tmpAddCount = parseInt(addCount);
    
    var divString = '<div align="left" style="width:400px; height: 120px; overflow: auto; max-height: 200px;">';
    for (var j = tmpLength-tmpAddCount; j < tmpLength; j++) {
		htmlDescs[j] = divString + htmlDescs[j] +  '</div>';
    } 
}

function initializeEventMarkers(markerValue) {
    //first thing we do is set all markers to display false
    //we pass the marker type so we can use this to display any type of marker
    //false like cctvs, construction, spec events, incidents, etc...
    //GLog.write("initializing event markers, markerValue: " + markerValue);
    if (markerValue.length > 0) {
        for (var i = markerValue.length-1; i >=0; i--) { 
		    //we can now set display false because of nice PdMarker extension
		    //sooo much faster!
		    markerValue[i].display(false); 
	    }
    }
    
}

function RemoveEventMarkers(markerValue) {
    //first thing we do is set all markers to display false
    //we pass the marker type so we can use this to display any type of marker
    //false like cctvs, construction, spec events, incidents, etc...
    //GLog.write("initializing event markers, markerValue: " + markerValue);
    
    if(markerValue != null )
    {
        if (markerValue.length > 0) {
            for (var i = markerValue.length-1; i >=0; i--) { 
                googleMap.removeOverlay(markerValue[i]);
	        }
        }
    }     
}
function toggleMarkers(markerValue, isChecked, modeType) {
        
    showPleaseWaitScreen("Updating map. Please wait.");
    if(isChecked)
    {
     markerType = markerValue;
     isPreviousChecked = true;
    }
	//either set display true or false depending on state of checkbox
	//if checkbox is checked, turn on, if unchecked, turn off.
	var skipMarkerToggle = false;
	var arrayToToggle = new Array();
	var dontToggle = false;
	var currentZoom = googleMap.getZoom();
	
	//is there another way to do this,rather than hardcode?
	if (markerValue == "incMarkers") {
	    arrayToToggle = incMarkers;
	    RemoveEventMarkers(arrayToToggle);
	    RemoveUncheckedEvents(markerValue);
	    arrayToToggle = [];
	    incMarkers = [];
	}
	else if (markerValue == "constMarkers") {
	    arrayToToggle = constMarkers;
	     //* SK 1/06/2009
	    RemoveEventMarkers(arrayToToggle);
        RemoveUncheckedEvents(markerValue);
	    arrayToToggle = [];
	    constMarkers = [];
	}
	else if (markerValue == "specevtMarkers") {
	    arrayToToggle = specevtMarkers;
	     //* SK 1/06/2009
	    RemoveEventMarkers(arrayToToggle);
        RemoveUncheckedEvents(markerValue);

	    arrayToToggle = [];
	    specevtMarkers = [];
	}
	else if (markerValue == "speedMarkers") 
	{
//RT$: Show speed color codes upon checking the box.

        if(document.getElementById('ctl00_ContentPlaceHolder1_traffic_speedCheck').checked && document.getElementById("WinterAdvVisibility").value=="true")
        {
            if((document.getElementById('ctl00_ContentPlaceHolder1_traffic_winterAdvisory').checked) ==true)
            {
                document.getElementById('ctl00_ContentPlaceHolder1_traffic_winterAdvisory').checked = false;
                toggleMarkers('winterAdvisory', this.checked, 'traffic');
            }              
        }
        
	    var divSpeed = document.getElementById("speedDiv");
	    
        if(document.getElementById("WinterAdvVisibility").value=="true")
	    {      
	        
        if(divSpeed.style.display == "inline" && document.getElementById('ctl00_ContentPlaceHolder1_traffic_speedCheck').checked == false)
            divSpeed.style.display = "none";
        else
            divSpeed.style.display = "inline";
         }
        else
         {
            divSpeed.style.display = "inline";
         }
	    
	    skipMarkerToggle = true;
	        if(!isChecked && speedGroundOverLay!=null)
	        {
	            googleMap.removeOverlay(speedGroundOverLay);
	        }
	        if (currentZoom < 10) {
	            arrayToToggle = clusteredSpeedMarkers;
	         }
	        else {
	            initializeEventMarkers(clusteredCCTVMarkers);
	            arrayToToggle = detectorMarkers;
	        }
    	
	 }
	else if (markerValue == "winterAdvisory")
	{
	//RT: Show winter advisory color codes upon checking the box
	
	    if(document.getElementById('ctl00_ContentPlaceHolder1_traffic_winterAdvisory').checked)
        {
            if((document.getElementById('ctl00_ContentPlaceHolder1_traffic_speedCheck').checked) ==true)
            {
                document.getElementById('ctl00_ContentPlaceHolder1_traffic_speedCheck').checked = false;
                toggleMarkers('speedMarkers', this.checked, 'traffic');
            }              
        }
            var divWinter = document.getElementById("winterAdvDiv");
            
            if(divWinter.style.display == "inline" && (document.getElementById('ctl00_ContentPlaceHolder1_traffic_winterAdvisory').checked) == false)
                divWinter.style.display = "none";
            else
                divWinter.style.display = "inline";
	        
	 	    skipMarkerToggle = true;
	        if(!isChecked && WinterAdvGroundOverLay!=null)
	        {
	            googleMap.removeOverlay(WinterAdvGroundOverLay);
        	}
        	if(currentZoom < 10)
        	{
        	    arrayToToggle = clusteredWinterMarkers;
        	}

	}
	else if (markerValue == "cctvMarkers") {
	    //for zoom levels less than 10, we need to show only the clustered icons.
	    
	    if (currentZoom < 10) {
	        arrayToToggle = clusteredCCTVMarkers;
	    }
	    else {
	        initializeEventMarkers(clusteredCCTVMarkers);
	        arrayToToggle = cctvMarkers;
	    }
	}
	else if (markerValue == "weatherMarkers") {
	    arrayToToggle = weatherMarkers;
	}
	
	if (isChecked) {
		if (skipMarkerToggle) {
		    //this code gets executed if link layer is checked
		    //turn links on
		    //show please wait screen while updating map
		    //get current zoom and reset if zoomed out too far
		    //var currentZoom = googleMap.getZoom();
		    if(markerValue != "winterAdvisory")
		    {
		        if (currentZoom < 10) {
		            //googleMap.setZoom(10);
		            createXML('clusteredSpeeds','clusteredSpeeds','');
		            //drawing links will be handled by updateMap() procedure
		            //in traffic main
		        }
		        else {
				    //wait for 1/10 of second before calling draw links s   o 
				    //we can properly display please wait box.
				    initializeEventMarkers(clusteredSpeedMarkers);
				    setTimeout("drawLinksAfterWait()",100);
    				
			    }
			}
			else
			{
			    if(markerValue == "winterAdvisory")
			    {
			        if (currentZoom < 10) {
		                //googleMap.setZoom(10);
		                createXML('clusteredWinters','clusteredWinters','');
		                //drawing links will be handled by updateMap() procedure
		                //in traffic main
		            }
		            else {
				        //wait for 1/10 of second before calling draw links s   o 
				        //we can properly display please wait box.
				        initializeEventMarkers(clusteredWinterMarkers);
				        setTimeout("addWinterAdvisoryLayer()",100);
        				
			        }
			     }
				
			}
		}
        else {
		    if (markerValue == "cctvMarkers") {
		            //grab data and display
		            dontToggle = true;
		            if (currentZoom >= 10) {
		              createXML('cctvs', 'cctvs', '');
		            }
		            else {
		              showClusteredCCTVMarkers();
		            }
			    }
		     else if (markerValue == "weatherMarkers") {
		      createXML('weather', 'weather', '');
		      dontToggle = true;
		    }
		    
		    if (!dontToggle) {
		        //not links, toggle markers on - gets executed if link checkbox is not checked
		        //get events
			    //for (var n = 0; n < arrayToToggle.length; n++) {
                    //arrayToToggle[n].display(true);
                //}
                //build event type string - only get if we have layers checked
                //var typeString = buildEventTypeString(modeType);
                
                //* SK 1/06/2009
                if (markerValue == "constMarkers")                {
                    
                    if (modeType == "traffic")
                        modeType = "trafficP";
                                           
                    var typeString = buildEventTypeStringForToggleFunctionForPlanned(modeType, markerValue);                        
                }
                else if  (markerValue == "specevtMarkers" )
                {                    
                    if (modeType == "traffic")
                        modeType = "trafficP";
                       
                    var typeString = buildEventTypeStringForToggleFunctionForPlanned(modeType, markerValue);                        
                }
                else                                                            
                
                var typeString = buildEventTypeStringForToggleFunction(modeType, markerValue);
                                         
        	    //checkboxes are checked - now go get events, otherwise, don't get any thing
			    //typeString = buildEventTypeString(modeType);
			    createXML('events', modeType+'marker', typeString);
			    typeString = "";
            }
        }
    } //end if (isChecked)
    else {
	    if (skipMarkerToggle) {
		    //turn links off
		    if (browser == "Netscape") {
		        //netscape does not use the custom overlay - remove polylines
		        if (ffPolylineArray.length > 0) {
				    for (j=ffPolylineArray.length-1; j>=0; j--) {
				        
					    googleMap.removeOverlay(ffPolylineArray[j]);
				    }
				}
			}
			else {
			    //hide custom overlay
			    myCanvas.style.display = "none";
			    
			    if (ffPolylineArray.length > 0)
                {
                   ffPolylineArray = [];
                }
                
                
			}
			
			RemoveMapMouseMoveListner();
			
			hidePleaseWaitScreen();
			
			initializeEventMarkers(arrayToToggle);
        }
        else {
	        //turn markers off
	        //function above
	    	        
	        //close the info window if it is open
	        if (markerValue == "weatherMarkers" && weatherAlertPopupDisplayed) {
	           googleMap.closeExtInfoWindow();
	        }
	        else if (markerValue == "cctvMarkers" && CCTVPopupDisplayed) {
	           closeCCTVPopupWindow();
	        }
	        else {
	           googleMap.closeInfoWindow();
	        }
	        hidePleaseWaitScreen();
	        
	        if (markerValue == "incMarkers" || markerValue == "constMarkers" || markerValue == "specevtMarkers")
	        {
	            RemoveEventMarkers(arrayToToggle);
	        }
	        else
	        {
                initializeEventMarkers(arrayToToggle);	        
	        }
	    }
	}//end else if !isChecked
	
}



//3-29-07 modified to allow passing of array index in to access the existing description if it needs
//to be appended to in the case of overlapping incidents
//function createMarker(point, marker, html) {
var infoWindowOpen = false;
var infoWindowClosed = false;
var isMovedOnMarkerClick = false;

function createMarker(point, marker, html, length) {
  	GEvent.addListener(marker, "click", function() {
  	
  	  // close the tooltip window first
  	  markerTooltipFlag=false;
	  markerTooltip.style.visibility="hidden"
	  
	  infoWindowOpen = true;
	  infoWindowClosed = false;
  	  //added to save the position of the map before the marker is opened.
      googleMap.savePosition();
      
  	  if (CCTVPopupDisplayed) {
          closeCCTVPopupWindow();
      }
      //3-29-07 - only use if html is empty and length is passed in - modified for appending desc
      if ((length != '') && (html == '') || (parseInt(length) == 0)){
          marker.openInfoWindowHtml(htmlDescs[length]);
      }
      else {
          //this is existing - put back if code breaks
           marker.openInfoWindowHtml(html);
      }
      //end 3-29-07
     
  	});
  	
    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();
        infoWindowClosed = true;
    });
 }
 
//end 3-29-07

function drawLinksAfterWait() {

  var currentZoom = googleMap.getZoom();
	if (currentZoom < 10) {
	
	    //do not show speeds at zooms less than 11
		createXML('clusteredSpeeds', 'clusteredSpeeds','');
	}
	else
	{
	
	addSpeedLayerDetail();
	}
	
}


//RT$: 8/18/09 ; Winter Travel Advisory
function addWinterAdvisoryLayer()
{
       var boundingBox=googleMap.getBounds();
       var maxP=boundingBox.getNorthEast();
       var minP=boundingBox.getSouthWest();
       var zoom =googleMap.getZoom();
                          
       var point=googleMap.fromLatLngToDivPixel(googleMap.getCenter());
       var size=googleMap.getSize();
       WinterAdvInfoArray=null;
       var url = getWinterAdvKmlURL(minP,maxP,zoom,point,size);   
                
    if(navigator.appName == "Microsoft Internet Explorer")
    {        
        request = new ActiveXObject("Msxml2.XMLHTTP");
    }
    else
    {
        
        request = new XMLHttpRequest();
    }
 
    request.open("GET", url, true);
    request.onreadystatechange = function() {  
    if (request.readyState == 4) {
        
        try
        {
            var xmlDoc = null;
            var elem = null;            
            xmlDoc = request.responseXML;			
            var imageURL = xmlDoc.getElementsByTagName("file")[0].firstChild.nodeValue;	        
	        var jsonSpeed = xmlDoc.getElementsByTagName("coordinates")[0].firstChild.nodeValue;
	        var jsonSpeedInfo=xmlDoc.getElementsByTagName("speedinfo")[0].firstChild.nodeValue;
	        var bboxString=xmlDoc.getElementsByTagName("enveloper")[0].firstChild.nodeValue;
	        IsDebugMode = xmlDoc.getElementsByTagName("debug")[0].firstChild.nodeValue;
	        
	        WinterAdvDataArray=new Array();
	        WinterAdvInfoArray=new Array()
	      
	        if(imageURL!="tempImage/NoSpeed.png")
	        {   
	            if(jsonSpeed.length>0) //reduancy check for no speed info
	            {
    	     
	            WinterAdvDataArray = JSON.parse(jsonSpeed, null);
	            WinterAdvInfoArray=JSON.parse(jsonSpeedInfo,null);
	            WinterAdvOverlayBBox=JSON.parse(bboxString,null);

	            }
	              showPleaseWaitScreen("Updating map. Please wait.");
	              refreshWinterAdvImage(imageURL,boundingBox); 
                  hidePleaseWaitScreen();
	         }
	       
	        }catch(e)
	        {
	       drawingLinks = false;
	        }
	         			        
        }    
    };
	request.send(null);                   
    drawingLinks = false;
    hidePleaseWaitScreen();
	linkDataExists = false;	
}
    

function addSpeedLayerDetail()
    {

 RemoveEventMarkers(clusteredSpeedMarkers)
            var boundingBox=googleMap.getBounds();
                    var maxP=boundingBox.getNorthEast();
                    var minP=boundingBox.getSouthWest();
                   var zoom =googleMap.getZoom();                   
                  
                   var point=googleMap.fromLatLngToDivPixel(googleMap.getCenter());
                   var size=googleMap.getSize();
                   speedInfoArray=null;
                  var url =getKmlURL(minP,maxP,zoom,point,size);   
                
    if(navigator.appName == "Microsoft Internet Explorer")
    {        
        request = new ActiveXObject("Msxml2.XMLHTTP");
    }
    else
    {
        
        request = new XMLHttpRequest();
    }
    
   

    request.open("GET", url, true);
    request.onreadystatechange = function() {  
    if (request.readyState == 4) {
        
        try
        {
            var xmlDoc = null;
            var elem = null;            
            xmlDoc = request.responseXML;			
             var imageURL = xmlDoc.getElementsByTagName("file")[0].firstChild.nodeValue;	        
	        var jsonSpeed = xmlDoc.getElementsByTagName("coordinates")[0].firstChild.nodeValue;
	        var jsonSpeedInfo=xmlDoc.getElementsByTagName("speedinfo")[0].firstChild.nodeValue;
	        var bboxString = xmlDoc.getElementsByTagName("enveloper")[0].firstChild.nodeValue;
	        IsDebugMode = xmlDoc.getElementsByTagName("debug")[0].firstChild.nodeValue;
	        
	           speedDataArray=new Array();
	           speedInfoArray=new Array()
	      
	        if(imageURL!="tempImage/NoSpeed.png")
	        {   
	              if(jsonSpeed.length>0) //reduancy check for no speed info
	            {
    	     
	            speedDataArray = JSON.parse(jsonSpeed, null);
	            speedInfoArray=JSON.parse(jsonSpeedInfo,null);
	            speedOverlayBBox=JSON.parse(bboxString,null);

//	            var polygon = new GPolygon([
//            new GLatLng(speedOverlayBBox[0],speedOverlayBBox[1]),
//            new GLatLng(speedOverlayBBox[0], speedOverlayBBox[3]),
//            new GLatLng(speedOverlayBBox[2], speedOverlayBBox[3]),
//            new GLatLng(speedOverlayBBox[2], speedOverlayBBox[1]),
//            new GLatLng(speedOverlayBBox[0], speedOverlayBBox[1])
//		  ], "#f33f00", 5, 1, "#ff0000", 0.2);
//		  googleMap.addOverlay(polygon);
	            }
	              showPleaseWaitScreen("Updating map. Please wait.");
	              refreshImage(imageURL,boundingBox); 
                  hidePleaseWaitScreen();
	         }
	       
	        }catch(e)
	        {
	       
	        }
	         			        
        }    
    };
	request.send(null);                   
    drawingLinks = false;
    hidePleaseWaitScreen();
	linkDataExists = false;	
    }
    
    
    function refreshImage(imagURL,boudingBox)
    {
    if(speedGroundOverLay!=null)
    { googleMap.removeOverlay(speedGroundOverLay);
    }
    speedGroundOverLay=new GGroundOverlay(imagURL,boudingBox);
   
   //  speedGroundOverLay=new GGroundOverlay(imagURL,boudingBox);
    googleMap.addOverlay(speedGroundOverLay);
   mapev=GEvent.addListener(googleMap, "mousemove", function(point) {
                var ginfo = document.getElementById("GMapInfoWindow");
                markerTooltip.style.visibility = "hidden";
                        //var mousePoint =googleMap.fromLatLngToContainerPixel(point);
                        selectLine(point, "speed");

                    });
   GEvent.addListener(googleMap, "mouseout", function(point) {
                        var ginfo = document.getElementById("GMapInfoWindow");
                        markerTooltip.style.visibility = "hidden";
                    
                    });   
   
}//end of function refresh


    function refreshWinterAdvImage(imagURL,boudingBox)
    {
    if(WinterAdvGroundOverLay!=null)
    { googleMap.removeOverlay(WinterAdvGroundOverLay);
    }
    WinterAdvGroundOverLay=new GGroundOverlay(imagURL,boudingBox);

    googleMap.addOverlay(WinterAdvGroundOverLay);
    mapev=GEvent.addListener(googleMap, "mousemove", function(point) {
    var ginfo = document.getElementById("GMapInfoWindow");
                markerTooltip.style.visibility = "hidden";
    selectWinterLine(point, "winter");
                     
                    }); 
    GEvent.addListener(googleMap, "mouseout", function(point) {
                        var ginfo = document.getElementById("GMapInfoWindow");
                        markerTooltip.style.visibility = "hidden";
                    
                    });                        
   
}//end of function refresh

function selectWinterLine(point, layerName)
{  
if(point.y<WinterAdvOverlayBBox[0] || point.x<WinterAdvOverlayBBox[1] ||point.y>WinterAdvOverlayBBox[2]||point.x>WinterAdvOverlayBBox[3])
return;

var p=googleMap.fromLatLngToContainerPixel(point);

var ginfo = document.getElementById("GMapInfoWindow");
markerTooltip.style.visibility="hidden";

 var shtml=p.toString()+" ";
 var foundLinkID=0;
              if(WinterAdvDataArray==null || WinterAdvInfoArray ==null)
              return; 
    outer :for(i=0;i<WinterAdvDataArray.length;i++)
    {
        
    
  if(document.getElementById("WinterAdvVisibility").value=="true")
	  {    
        var minLat=WinterAdvInfoArray[i][5]
        var minLon=WinterAdvInfoArray[i][6]
        var maxLat=WinterAdvInfoArray[i][7]
        var maxLon=WinterAdvInfoArray[i][8]
      }
      else
      {
        var minLat=WinterAdvInfoArray[i][4]
        var minLon=WinterAdvInfoArray[i][5]
        var maxLat=WinterAdvInfoArray[i][6]
        var maxLon=WinterAdvInfoArray[i][7]
      }
        if(point.y<=maxLat && point.y>=minLat && point.x<=maxLon && point.x>=minLon)
        { 
         var lineArray=WinterAdvDataArray[i];
        inner:for(j=0;j<lineArray.length-1;j++)
        {
            var p1=new GPoint(lineArray[j][0],lineArray[j][1]);            
            var p2=new GPoint(lineArray[j+1][0],lineArray[j+1][1]);
         
            if(p1.y>0 && p2.y>0)
            {
//            p1.y=size.height-p1.y;
//            p2.y=size.height-p2.y;
            var distance=PerpendicularDistance(p1,p2,p)
            if(distance<3)
            {
               
                foundLinkID=lineArray[j][2];
                break outer;
            }
           
            }
        }//end inner loop
        }
        else
        continue;
    }//end outer loop
    if(foundLinkID!=0) {
        
        ShowWinterLinkInfo(foundLinkID,point.x,point.y, "winter");
    }
}  

function selectLine(point, layerName)
{  
if(point.y<speedOverlayBBox[0] || point.x<speedOverlayBBox[1] ||point.y>speedOverlayBBox[2]||point.x>speedOverlayBBox[3])
return;

var p=googleMap.fromLatLngToContainerPixel(point);

var shtml=p.toString()+" ";
 var foundLinkID=0;
              if(speedDataArray==null || speedInfoArray ==null)
              return; 
    outer :for(i=0;i<speedDataArray.length;i++)
    {
	    
   if(document.getElementById("WinterAdvVisibility").value=="true")
	  {    
        var minLat=speedInfoArray[i][5]
        var minLon=speedInfoArray[i][6]
        var maxLat=speedInfoArray[i][7]
        var maxLon=speedInfoArray[i][8]
      }
      else
      {
        var minLat=speedInfoArray[i][4]
        var minLon=speedInfoArray[i][5]
        var maxLat=speedInfoArray[i][6]
        var maxLon=speedInfoArray[i][7]
      }
        if(point.y<=maxLat && point.y>=minLat && point.x<=maxLon && point.x>=minLon)
        { 
         var lineArray=speedDataArray[i];
        inner:for(j=0;j<lineArray.length-1;j++)
        {
            var p1=new GPoint(lineArray[j][0],lineArray[j][1]);            
            var p2=new GPoint(lineArray[j+1][0],lineArray[j+1][1]);
         
            if(p1.y>0 && p2.y>0)
            {
//            p1.y=size.height-p1.y;
//            p2.y=size.height-p2.y;
            var distance=PerpendicularDistance(p1,p2,p)
            if(distance<3)
            {
               
                foundLinkID=lineArray[j][2];
                break outer;
            }
           
            }
        }//end inner loop
        }
        else
        continue;
    }//end outer loop
    if(foundLinkID!=0)
    {
        ShowLinkInfo(foundLinkID,point.x,point.y, "speed");
    }
}  

function ShowWinterLinkInfo(foundLinkID,x,y, layerName)
{
    for(i=0;i<WinterAdvInfoArray.length-1;i++)
    {
	    
   if(document.getElementById("WinterAdvVisibility").value=="true")
	    {
            if(WinterAdvInfoArray[i][0]==foundLinkID)
            {
                var name = ""
                if (IsDebugMode.toLowerCase() == "true") {
                    name = foundLinkID.toString() + " " + WinterAdvInfoArray[i][1].toString();
                }
                else {
                    name = WinterAdvInfoArray[i][1].toString();
                }
//               var name=WinterAdvInfoArray[i][1].toString();
               var color="white";
               var roadCondition = WinterAdvInfoArray[i][2].toString()
               var speed=WinterAdvInfoArray[i][3].toString();
               var travelTime=WinterAdvInfoArray[i][4].toString();
               showLinkTooltip(name, color, roadCondition, speed, travelTime, x, y, "winter");
               break;
            }
        }
        else
        {
            if(speedInfoArray[i][0]==foundLinkID)
            {
               // var name = speedInfoArray[i][1].toString();
                var name = ""
                if (IsDebugMode.toLowerCase() == "true") {
                    name = foundLinkID.toString() + " " + speedInfoArray[i][1].toString();
                }
                else {
                    name = speedInfoArray[i][1].toString();
                }
               var color="white";
               var speed=speedInfoArray[i][2].toString();
               var travelTime=speedInfoArray[i][3].toString();
               showLinkTooltip(name, color,"", speed, travelTime, x, y, "speed");
               break;
            }
        
        }
    }
}   

function ShowLinkInfo(foundLinkID,x,y, layerName)
{
    for(i=0;i<speedInfoArray.length-1;i++)
    {
	    
   if(document.getElementById("WinterAdvVisibility").value=="true")
	    {
            if(speedInfoArray[i][0]==foundLinkID)
            {
               // var name = speedInfoArray[i][1].toString();
                var name = ""
                if (IsDebugMode.toLowerCase() == "true") {
                    name = foundLinkID.toString() + " " + speedInfoArray[i][1].toString();
                }
                else {
                    name = speedInfoArray[i][1].toString();
                }
               var color="white";
               var roadCondition = speedInfoArray[i][2].toString()
               var speed=speedInfoArray[i][3].toString();
               var travelTime=speedInfoArray[i][4].toString();
               showLinkTooltip(name, color, roadCondition, speed, travelTime, x, y, "speed");
               break;
            }
        }
        else
        {
        if(speedInfoArray[i][0]==foundLinkID)
            {
               // var name = speedInfoArray[i][1].toString();
                var name = ""
                if (IsDebugMode.toLowerCase() == "true") {
                    name = foundLinkID.toString() + " " + speedInfoArray[i][1].toString();
                }
                else {
                    name = speedInfoArray[i][1].toString();
                }
               var color="white";
               var speed=speedInfoArray[i][2].toString();
               var travelTime=speedInfoArray[i][3].toString();
               showLinkTooltip(name, color,"No adverse condition reported", speed, travelTime, x, y, "speed");
               break;
            }
        
        }
    }
}          
function PerpendicularDistance(Point1,Point2,Point)
{
var height=9999;
if(IsPointInBox(Point1,Point2,Point))
{
    var area = Math.abs(.5 * (Point1.x * Point2.y + Point2.x * Point.y + Point.x * Point1.y - Point2.x * Point1.y - Point.x * Point2.y - Point1.x * Point.y));
    var bottom = Math.sqrt(Math.pow(Point1.x - Point2.x, 2) + Math.pow(Point1.y - Point2.y, 2));
    var height = area / bottom * 2;
    }
   
    return height;

}   
function IsPointInBox(Point1,Point2, Point)
{
var minX,minY,maxX,maxY;
if(Point1.x>Point2.x)
{
minX=Point2.x;
maxX=Point1.x;
}
else
{
minX=Point1.x;
maxX=Point2.x;
}
if(Point1.y>Point2.y)
{
minY=Point2.y;
maxY=Point1.y;
}
else
{
minY=Point1.y;
maxY=Point2.y;
}
if(Point.x > maxX || Point.x < minX || Point.y>maxY || Point.y<minY)
{
return false;
}
else
{
return true;
}
}         
 function getKmlURL(minP,maxP,zoom,center,size)
{
   var url="Rss/Traffic2Image.ashx?layername=speed&outformat=kml&minLat="+minP.y+"&minLong="+minP.x+"&maxLat="+maxP.y+"&maxLong="+maxP.x+"&zoom="+zoom+"&width="+size.width+"&height="+size.height+"&centerX="+center.x+"&centerY="+center.y;
        
   return url;
}

function getWinterAdvKmlURL(minP,maxP,zoom,center,size)
{
   var url="Rss/Traffic2ImageForWinterAdvisory.ashx?layername=WinterAdv&outformat=kml&minLat="+minP.y+"&minLong="+minP.x+"&maxLat="+maxP.y+"&maxLong="+maxP.x+"&zoom="+zoom+"&width="+size.width+"&height="+size.height+"&centerX="+center.x+"&centerY="+center.y;
        
   return url;
}
function showTooltip(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 iconwidth=marker.getIcon().iconSize.width;
	var width=markerTooltip.clientWidth;
	var height=markerTooltip.clientHeight;
    
    // Check where the tooltip point is?
    	
	var center = googleMap.getCurrentMapType().getProjection().fromLatLngToPixel(googleMap.getBounds().getCenter(),googleMap.getZoom());
	var ne = googleMap.getCurrentMapType().getProjection().fromLatLngToPixel(googleMap.getBounds().getNorthEast(),googleMap.getZoom());
	var sw = googleMap.getCurrentMapType().getProjection().fromLatLngToPixel(googleMap.getBounds().getSouthWest(),googleMap.getZoom());
	var divHeight = sw.y - ne.y;
    if(offset.y < center.y){
    posY = offset.y - point.y; // top
        if((divHeight < height) || ((posY < 0) && (posY < (ne.y - point.y))))
        {
           posY = ne.y - point.y;
        }
        
        if((offset.y+height > sw.y) && (divHeight > height))
        {
           var offVal = offset.y - ((offset.y +height) - sw.y);
           posY = offVal - point.y;
        }
        
     }
    else {
    posY = offset.y - point.y - height; // bottom
        if((divHeight < height) || ((posY < 0) && (posY < (ne.y - point.y))))
        {
          posY = ne.y - point.y;
        }
        
        if((offset.y+height > sw.y) && (divHeight > height))
        {
           var offVal = offset.y - ((offset.y +height) - sw.y);
           posY = offVal - point.y;
        }
    }
    if(offset.x < center.x){
    posX = offset.x - point.x + anchor.x; // left
    }
    else{
    posX = offset.x - point.x - 150 - anchor.x; // right
    }
    

    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(posX,posY));                
    pos.apply(markerTooltip);
    
	markerTooltip.style.visibility="visible";
	markerTooltip.style.width="150px";
}


function buildEventTypeString(modeType) {
    //we need to build a string to pass to SQL to grab only the event data for 
    //the layers that are selected. If each box is checked, the appropriate event type is 
    //added to the string and then exectued in the stored procedure. Return the built string
    var typeString = "";
    if (modeType == "traffic") {
        //traffic
        if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_incCheck').checked) {
	    	typeString = "incTypes=\'1\'";
	    }
	    if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_constCheck').checked) {
	    	if (typeString.length == 0){
	    		typeString = "incTypes=\'3\'";
	    	}
	    	else {
	    		typeString += ", \'3\'";
	    	}
	    }
	    if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_specevtCheck').checked) {
	    	if (typeString.length == 0){
	    		typeString = "incTypes=\'14\'";
	    	}
	    	else {
	    		typeString += ", \'14\'";
	    	}
	    }
	}
	
	
    return typeString;
}

function buildEventTypeStringForPlanned(modeType) {
    //we need to build a string to pass to SQL to grab only the event data for 
    //the layers that are selected. If each box is checked, the appropriate event type is 
    //added to the string and then exectued in the stored procedure. Return the built string
    var typeString = "";
    
    if (modeType == "trafficP") {
        //traffic
	    if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_incCheck').checked) {
	    	    if (typeString.length == 0){
	    		    typeString = "incTypes=\'3\'";
	    	    }
	    	    else {
	    		    typeString += ", \'3\'";
	    	    }

	    }
	    
	    if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_specevtCheck').checked) {
	    
	        if (typeString.length == 0){
	    		    typeString = "incTypes=\'14\'";
	    	    }
	    	    else {
	    		    typeString += ", \'14\'";
	    	    }
	    	   	
	    	
	    }
	    
	    
	} 
	    
	    
	
    return typeString;
}

function buildEventTypeStringForToggleFunction(modeType, markerValue) {
    //we need to build a string to pass to SQL to grab only the event data for 
    //the layers that are selected. If each box is checked, the appropriate event type is 
    //added to the string and then exectued in the stored procedure. Return the built string
    //only occurs on toggling the checkbox on
    var typeString = "";
    
    if (modeType == "traffic") {
        //traffic
        if (markerValue == "incMarkers") {
	    	typeString = "incTypes=\'1\'";
	    }
	    if (markerValue == "constMarkers") {
	    	typeString = "incTypes=\'3\'";
	    }
	    if (markerValue == "specevtMarkers") {
	    	typeString = "incTypes=\'14\'";
	    }
	 
	}
		
    return typeString;
}

function buildEventTypeStringForToggleFunctionForPlanned(modeType, markerValue) {
    //we need to build a string to pass to SQL to grab only the event data for 
    //the layers that are selected. If each box is checked, the appropriate event type is 
    //added to the string and then exectued in the stored procedure. Return the built string
    //only occurs on toggling the checkbox on
    var typeString = "";
    
    if (modeType == "trafficP") {
        //traffic
        if (markerValue == "incMarkers") {
	    	typeString = "incTypes=\'1\'";
	    }
	    
	    if (markerValue == "constMarkers") {	        
	        if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_constCheck').checked) {	    
	            typeString = "incTypes=\'3\'";	    	      	    	   
	        }	        
	    }
	    
	    if (markerValue == "specevtMarkers") {	    
	        if (document.getElementById('ctl00_ContentPlaceHolder1_traffic_specevtCheck').checked) {	    
	            
	    		    typeString = "incTypes=\'14\'";	    	        
	    	}        		       	    	    

	    }	    	           	    

	}
	
	
    return typeString;
}

function createURLString(eventDesc, eventID, URL, hyperlinkColor, textColor, urlAlias, urlDisplayAs, lastUpdate){

    var urlStart = 0;
	var urlEnd = 0;
	var x = 0;
	var urlString = "";
    var leftPart = "";
	var rightPart = "";
	var urlInString = false;
	var numSlashes = 0;
	
    if (eventDesc.indexOf('http://') != -1) {
	    urlStart = eventDesc.indexOf('http://'); 
	    urlInString = true;
    }
	else if (eventDesc.indexOf('www') != -1) {
	    urlStart = eventDesc.indexOf('www');  
	    urlString = "http://";
	    urlInString = true;
	}
	        
	//loop over URL string and make an hyperlink
	if (urlInString) {
	    for (x = urlStart; x < eventDesc.length; x++){
		    if (((eventDesc.charAt(x) == ' ')||(eventDesc.charAt(x) == ',')) && (x != eventDesc.length)) {
			    //if we've reached the end of the url string, mark the character and exit
				urlEnd = x+1;
				break;
		     }
			else if (x == eventDesc.length) {
			    urlEnd = 0;
				break;
		    }
			urlString += eventDesc.charAt(x);     
			
			if (eventDesc.charAt(x) == "/") {
			    numSlashes++;
			}   
		}
		    	
	    leftPart = Left(eventDesc, 0, urlStart);
	    		
	    if (urlEnd != 0) {
	        rightPart = Right(eventDesc, eventDesc.length - urlEnd + 1);
		}
		
		if (numSlashes == 2) {
		    //look to see what kind of url was passed in. if it was .com or .gov, etc. append a / to the end
		    //this will help compare later on if we have to compare existing descs.
		    urlString += "/";
		}
		    		
	    eventDesc = leftPart + '<a style="COLOR: #000066" href="' + urlString + '" target=_blank>';
		eventDesc += 'More Info' + '</a>' + rightPart;
		    	
	}
	
	if (URL != "null") {
        numSlashes = 0;        
        //there is a url to display
        if (hyperlinkColor.indexOf('#') < 0) {
            //hyperlink color must contain a # sign in order to be a valid color
            hyperlinkColor = textColor;
        }
        
        for (x = 0; x < URL.length; x++){
		    if (URL.charAt(x) == "/") {
			    numSlashes++;
			}   
			if (numSlashes > 2) {
			    break;
			}
		}
		
		//look to see what kind of url was passed in. if it was .com or .gov, etc. append a / to the end
		//this will help compare later on if we have to compare existing descs.    
		if (numSlashes == 2) {
		    URL += "/";
		}
		
        urlAlias = '<a style="COLOR: #000066" href="' + URL + '" target=_blank>' + urlAlias + '</a>';
        urlDisplayAs = urlDisplayAs.replace("[link]", urlAlias);
        eventDesc += urlDisplayAs + '<br>';
    }
      
    eventDesc += '<br><br>Last update: ' + lastUpdate;
                      
	return eventDesc;
}
function AddHyperLink(eventDesc)
{
}
function Left(str, startIndex, n){
    //grab left portion of string from starting index to ending index
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(startIndex,n);
}

function Right(str, n){
    //grab right portion of string from end of string to index n
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}
function Trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}


function removeByElement(arrayName,arrayElement)
 {
    for(var i=0; i<arrayName.length;i++ )
     { 
        if(arrayName[i]==arrayElement)
            arrayName.splice(i,1); 
      } 
}
  
