/*Google maps / traffic feed overlay
Local version

//requires markermanager.js
//now uses poi message layer for loading and errors

*/

var trafficmgr;
var trafficoverlay = [];

function displayTrafficOverlay(map,trafficCBID,poiMsgID)
{

var $poiMsgID=$("#" + poiMsgID);
var $trafficCB=$("#" + trafficCBID);
//traffic vars
var AATraffic="/aaservlet/traffic";

//arrays of images for markers

	   trafficoverlay["0"] = "ov-0.png";
	   trafficoverlay["5"] = "ov-5.png";
	   trafficoverlay["10"] = "ov-10.png";
	   trafficoverlay["15"] = "ov-15.png";
	   trafficoverlay["20"] = "ov-20.png";
	   trafficoverlay["25"] = "ov-25.png";

 
	//initialize
	if($trafficCB.is(':checked'))
	{
		//display loading
		displayPOIMsg("#" + $poiMsgID.attr('id'),'Loading...',false); 
		
		//clean up
		clearTrafficMarkers(trafficmgr);
		
		$trafficCB.attr('checked', true);
		//ticked, so display traffic
		getTrafficData(AATraffic,map,$poiMsgID);
	}
	else {
		 //remove traffic markers and text
		 $trafficCB.attr('checked', false);
		if ($poiMsgID.length > 0 ) {
				//function from POIOverlay
				hidePOIMsg("#" + $poiMsgID.attr('id'));
		}

		  clearTrafficMarkers(trafficmgr);
	}
}




function createTrafficMarker(point,baimg,ov,iconMinZoomLevel) {
	
	var imgPath="";
	if(iconMinZoomLevel=="14")
	{
		//large icons
		imgPath="trafficiconlarge";
		
		var mylabel = {"url":'/images/traffic/' + trafficoverlay[ov], "anchor":new GLatLng(22,22), "size":new GSize(16,16)};
		var Icon = new GIcon(G_DEFAULT_ICON, '/images/traffic/' +imgPath + '/' + baimg, mylabel);
		Icon.iconSize = new GSize(60, 60);
		Icon.iconAnchor = new GPoint(30, 30);
		//Icon.infoWindowAnchor = new GPoint(30, 30);
		Icon.shadow = "/images/traffic/" + imgPath + "/shadow.png";
		Icon.shadowSize = new GSize(60, 60);
		//Icon.shadow = ""; 
		Icon.transparent=""; //disables marker clicks and shadow in IE6
		var marker = new GMarker(point,{icon:Icon,zIndexProcess:importanceTrafficOrder,clickable:false});
		marker.importance=getTrafficZindex(ov);
	}
	else {
		imgPath="trafficicon";
		var mylabel = {"url":'/images/traffic/' + trafficoverlay[ov], "anchor":new GLatLng(12,12), "size":new GSize(16,16)};
		var Icon = new GIcon(G_DEFAULT_ICON, '/images/traffic/' +imgPath + '/' + baimg, mylabel);
		Icon.iconSize = new GSize(40, 40);
		Icon.iconAnchor = new GPoint(20, 20);
		//Icon.infoWindowAnchor = new GPoint(20, 20);
		Icon.shadow = "/images/traffic/" + imgPath + "/shadow.png";
		Icon.shadowSize = new GSize(40, 40);
		//Icon.shadow = ""; 
		Icon.transparent=""; //disables marker clicks and shadow in IE6
		var marker = new GMarker(point,{icon:Icon,zIndexProcess:importanceTrafficOrder,clickable:false});
		marker.importance=getTrafficZindex(ov);
	}
	

	return marker;
}

  //return z-index
function importanceTrafficOrder(marker,b) {
	return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
}

//function to return zindex from speed
function getTrafficZindex(ov) {
	 //values from 0 to 30
	 if (parseInt(ov)==0)
	 {
		return 2;  //higher zindex
	 }
	 else {
		return 0; 
	 }	 
}
	
//return array value and set angled image names
function getBGImg(angle)
{
			//images are BA0.png, BA90.png, BA270.png etc
			var bgAngle=parseInt(angle,10);
			if(isNaN(bgAngle) || bgAngle>360 || bgAngle<0)
			{
				return "bablank"; //default 
			}

			var roundedAngle=Math.round(bgAngle/10)*10;
			if (roundedAngle==360) roundedAngle=0;
			
			return "ba" + roundedAngle + ".png";
}	
	
	

function clearTrafficMarkers(trafficmgr) {
	try {
		//alert(trafficmgr.getMarkerCount(17));
  		trafficmgr.clearMarkers();
	}
	catch(e) {};
}



function getTrafficData(url,map,$poiMsgID)
{

	trafficmgr = new MarkerManager(mapGoogle); 

	GDownloadUrl(url, function(data,responseCode) {


	if(responseCode==200 || responseCode==304)
	{
	//test for data
	if(data.length==0)
	{
		if ($poiMsgID.length > 0 ) {
			displayPOIMsg($poiMsgID.attr('id'),"There was a problem displaying the traffic data. Please try again later.",true);
			//$trafficErrorID.html("There was a problem displaying the traffic data. Please try again later.");
			}
		return;
	}

  	var xml = GXml.parse(data);

	var markerArray=[];
	var markerLargeArray=[];
	
	var dateOutput="";
	try {
		var month_names = new Array ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" );

		var dateInp=xml.getElementsByTagName("LastUpdate");
		var dateInpValue=new String(dateInp[0].firstChild.nodeValue);

		var jsFeedDate=new Date(dateInpValue.substring(0,4) , parseInt(dateInpValue.substring(5,7),10)-1 , dateInpValue.substring(8,10) , dateInpValue.substring(11,13) , dateInpValue.substring(14,16) , dateInpValue.substring(17,19));

		//change to AM/PM
		var ap="AM";
		var hour=jsFeedDate.getHours();

		if(hour>11) ap="PM";
		if(hour>12) hour=hour-12;
		if(hour== 0) hour = 12 ;
		
		var minute=jsFeedDate.getMinutes();
		if (minute < 10) { minute = "0" + minute; }


		dateOutput="Traffic last updated at " + hour + ":" + minute + ap +" on " + jsFeedDate.getDate() + " " + month_names[jsFeedDate.getMonth()] + " " + jsFeedDate.getFullYear() + "";

    if ($poiMsgID.length > 0 ) {
		displayPOIMsg("#" + $poiMsgID.attr('id'),dateOutput,true);
	}


	}
	catch(e)
	{
		//no valid date

	}

	//parse date into human readable format
	var i, markerNumber;
				var markerX = xml.getElementsByTagName("X");
				var markerY = xml.getElementsByTagName("Y");
				var markerSpeed = xml.getElementsByTagName("speed");
				var markerAngle = xml.getElementsByTagName("angle");
				markerNumber = markerX.length;

				
				for (i = 0; i < markerNumber; i++) {
					var point = new GLatLng(parseFloat(markerY[i].firstChild.nodeValue),parseFloat(markerX[i].firstChild.nodeValue));
				
					// === read the icontype attribute ===
					var ov = markerSpeed[i].firstChild.nodeValue;
					// === create the marker, passing the icontype string ===
					var angle=markerAngle[i].firstChild.nodeValue;
					
					var marker = createTrafficMarker(point,getBGImg(angle),ov,0); //small icons up to this level
					var markerLarge=createTrafficMarker(point,getBGImg(angle),ov,14);
					markerArray.push(marker); 
					markerLargeArray.push(markerLarge);
				}
				 // Add the array to the MarkerManager 
				 // Display larger icons at higher zoom levels
			   trafficmgr.addMarkers(markerArray,0,13);  
			   trafficmgr.addMarkers(markerLargeArray,14,17); 
			   // Refresh the MarkerManager to make the markers appear on the map  
			  trafficmgr.refresh();	  
	} //end if 200 response
	else {
    if ($poiMsgID.length > 0 ) {
      		displayPOIMsg("#" + $poiMsgID.attr('id'),"There was a problem loading the traffic data. Please try again later.",true);
		}
	}

	});

}



