/*Google maps / traffic feed overlay
Local version

//requires markermanager.js
//now uses poi message layer for loading and errors

*/

var trafficmgr;
var trafficoverlay = [];

var trafficAlertMgr;

function displayTrafficOverlay(map,blnShowMarkers,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'))
	if(blnShowMarkers)
	{
		//display loading
		displayPOIMsg("#" + $poiMsgID.attr('id'),'Loading traffic speed data...',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)
{

	var mapCurrentZoom=map.getZoom();
		
	if(trafficmgr==null)
	{
		trafficmgr = new MarkerManager(map); 
	}

	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 speed data last updated: " + jsFeedDate.getDate() + " " + month_names[jsFeedDate.getMonth()] + " " + jsFeedDate.getFullYear() + ", " + hour + ":" + minute + ap;

	if(mapCurrentZoom<6 && $poiMsgID.length>0)
	{
		displayPOIMsg("#" + $poiMsgID.attr('id'),"Please <a href='#' onclick='setTrafficZoom(6);return false;'>zoom in</a> to view traffic speed data.",true);
	}
    else 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
				 // Don't show at UK level
			   trafficmgr.addMarkers(markerArray,6,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);
			}
	}

	});

}


function displayTrafficAlertOverlay(map,blnShowMarkers,poiMsgID)
{

	var $poiMsgID=$("#" + poiMsgID);
	var mapCurrentZoom=map.getZoom();
	//var $trafficAlertCB=$("#" + trafficAlertCBID);
	//traffic vars
	//var AATrafficAlert="/aaservlet/hatraffic";
	
	//initialize
	if(blnShowMarkers)
	{
		//display loading
		displayPOIMsg("#" + $poiMsgID.attr('id'),'Loading traffic alerts...',false); 
		
		//clean up
		clearTrafficAlertMarkers();
		
		//$trafficAlertCB.attr('checked', true);
		//ticked, so display traffic
		getTrafficAlertData(mapGoogle,'overlayMapMessage');
		getSummaryAlertData(mapGoogle,'overlayMapMessage');
	}
	else {
		 //remove traffic markers and text
		 //$trafficAlertCB.attr('checked', false);
		if ($poiMsgID.length > 0 ) {
				//function from POIOverlay
				hidePOIMsg("#" + $poiMsgID.attr('id'));
		}

		  clearTrafficAlertMarkers();
	}
}

function createTrafficAlertMarker(point,title,html,size) {
	
	var imgTrafficAlert="trafficalerticon.png";
	var imgTrafficAlertShadow="trafficalerticon.png";
	var imgTrafficAlertTransparent="trafficalerticon-trans.png";
	var taMarker='';
	if(size=="regular")
	{	
		var Icon = new GIcon();
		Icon.image = '/images/traffic/' + imgTrafficAlert;
		Icon.iconSize = new GSize(26, 22);
		Icon.iconAnchor = new GPoint(13, 11);
		Icon.infoWindowAnchor = new GPoint(14,2);
		Icon.shadow = ""
		//Icon.shadowSize = new GSize(26, 22);
		//Icon.shadow = ""; 
		Icon.transparent="/images/traffic/" + imgTrafficAlertTransparent;
		Icon.imageMap = [0,22,13,0,26,22];
		taMarker = new GMarker(point,{title:title,icon:Icon});
		
		
	}
	else {
		imgTrafficAlert="trafficalerticon-small.gif";
		imgTrafficAlertShadow="trafficalerticon-small-shad.gif";
		imgTrafficAlertTransparent="trafficalerticon-sm-trans.png";
		var Icon = new GIcon();
		Icon.image = '/images/traffic/' + imgTrafficAlert;
		Icon.iconSize = new GSize(11, 9);
		Icon.iconAnchor = new GPoint(6, 5);
		Icon.infoWindowAnchor = new GPoint(1, 6);
		Icon.shadow = "";
		//Icon.shadowSize = new GSize(11, 9);
		//Icon.shadow = ""; 
		Icon.imageMap=[5,0,9,8,0,8]
		Icon.transparent="/images/traffic/" + imgTrafficAlertTransparent;
		taMarker = new GMarker(point,{title:title,icon:Icon});
	}
	GEvent.addListener(taMarker, "click", function() {
          taMarker.openInfoWindowHtml(html);
        });



	return taMarker;
}



function clearTrafficAlertMarkers() {
	try {
		summaryTrafficMgr.clearMarkers();
  		trafficAlertMgr.clearMarkers();
	}
	catch(e) {};
}

function getSummaryAlertData(map,poiMsgID)
{
		/*live server requests*/
		
		$.ajax({
		  type: "GET",
		  url: "/aaservlet/hatraffic",
		  dataType: "json",
			error: function(xhr, desc, exceptionobj) { 
				//error getting summary traffic
				displayPOIMsg("#overlayMapMessage","There was a problem displaying summary traffic data. Please try again later.",true);
			},
			success:function(json)
			{
				addSummaryTrafficMarkers(json,map,0,6,'regular',poiMsgID);
			} //end success
		});
}

function getTrafficAlertData(map,poiMsgID)
{	
		$.ajax({
		  type: "GET",
		  url: "/aaservlet/hatraffic",
		  data: "ha_traffic_source=ALL%20REGIONS", 
		  dataType: "json",
			error: function(xhr, desc, exceptionobj) { 
				//error getting summary traffic
				displayPOIMsg("#overlayMapMessage","There was a problem displaying detailed traffic data. Please try again later.",true);
			},
			success:function(json)
			{
				addTrafficAlertMarkers(json,map,0,6,'regular',poiMsgID);
			} //end success
		});
}

var summaryTrafficMgr;

function addSummaryTrafficMarkers(json,map,minzoom,maxzoom,iconSize,poiMsgID)
{


	if(summaryTrafficMgr==null)
	{
		summaryTrafficMgr=new MarkerManager(mapGoogle)
	}
	var taSummaryMarkerArray=new Array();
	
		var taLat;
		var taLng;
		var taTitle;
		var taStatus;
		var taDesc;
		var taDate;
		var taHtml;
		var taIncident;
		var taSummaryMarker;
		var time;
		var batchDate='';
		var hasIncidents=false;
	
		$.each(json.incidentData, function(i,item){
						if(item.incident===null||item.incident===undefined)
						{
							return true;
						}
						hasIncidents=true;
						taIncident = item.incident; 						
						taHtml='';
						taLat=item.latitude;
						taLng=item.longitude;
						point = new GLatLng(taLat,taLng);

						taLocation= item.location; 
						taDesc= item.description;
						taDirection=item.direction;
						taDate=item.incidentDate.toUpperCase();
						time=getFriendlyTime(taDate);
						taTitle=taIncident + " - " + taLocation;
						batchDate=item.batchDate;

						if(taStatus=='Clear') taHtml="<div class='iw-traffic-status'>** CLEARED **</div>";
						taHtml+="<div class='iw-traffic'><div class='iw-traffic-date'>" + time + "</div><div class='iw-traffic-direction'>" + taLocation + ": "  + taDirection + "</div><div class='iw-traffic-desc'>" + taDesc + "</div><div class='iw-traffic-logo'><img src='/images/traffic/highways-agency.gif' alt='Highways Agency' width='103' height='17'/></div></div>";
						taSummaryMarker = createTrafficAlertMarker(point,taTitle,taHtml,'regular');
						taSummaryMarkerArray.push(taSummaryMarker); 
		});
		
		summaryTrafficMgr.addMarkers(taSummaryMarkerArray,minzoom,maxzoom);   
		// Refresh the MarkerManager to make the markers appear on the map  
		summaryTrafficMgr.refresh();	  
		
		//only show this if at summary level
		if(map.getZoom()<=maxzoom)
		{
			if(hasIncidents)
			{
			batchDate=getFriendlyTime(batchDate.toUpperCase());
			displayPOIMsg("#" + poiMsgID,'Traffic alerts last updated: ' + batchDate,true);
			}
			else {
				displayPOIMsg("#" + poiMsgID,'No traffic alerts reported currently.',true);
			}
		}

}


function addTrafficAlertMarkers(json,map,minzoom,maxzoom,iconSize,poiMsgID)
{

	if(trafficAlertMgr==null)
	{
		trafficAlertMgr = new MarkerManager(mapGoogle); 
	}

	var taTitle;
	var taDesc;
	var taDate;
	var taStatus;
	var taHtml;
	var taMarker;
	var taMarkerLarge;
	var taIncident;
	var time;
	
	var taMarkerArray=new Array(); 
	var taMarkerLargeArray=new Array();
	
	var batchDate;
	var hasIncidents=false;
	
	$.each(json.incidentData, function(i,item){
						if(item.incident===null||item.incident===undefined)
						{
							return true;
						}
						hasIncidents=true;
						
						taIncident = item.incident; 
							if (taIncident.indexOf("Roadworks")!=-1 || taIncident.indexOf("Resurfacing")!=-1 || taIncident.indexOf("Barrier repairs")!=-1 || taIncident.indexOf("Bridge repairs")!=-1)
							{
								//remove roadwork markers
								return true;
							}
						taHtml='';
						point = new GLatLng(item.latitude,item.longitude);

						taLocation= item.location; 
						taDesc= item.description; 
						taDirection=item.direction;
						taDate= item.incidentDate.toUpperCase();
						time=getFriendlyTime(taDate);
						taStatus=item.status;
						taTitle=taIncident +" - " + taLocation;
						batchDate=item.batchDate;

					if(taStatus=='Clear') taHtml="<div class='iw-traffic-status'>** CLEARED **</div>";
					taHtml+="<div class='iw-traffic'><div class='iw-traffic-date'>" + time + "</div>"
					+ "<div class='iw-traffic-direction'>" + taLocation + ": "  + taDirection + "</div>";

					taHtml+="<div class='iw-traffic-desc'>"+ taDesc + "</div><div class='iw-traffic-logo'><img src='/images/traffic/highways-agency.gif' alt='Highways Agency' width='103' height='17'/></div></div>";
					taMarker = createTrafficAlertMarker(point,taTitle,taHtml,'small'); //small icons up to this level
					taMarkerLarge=createTrafficAlertMarker(point,taTitle,taHtml,'regular');
					taMarkerArray.push(taMarker); 
					taMarkerLargeArray.push(taMarkerLarge);
	});
			

	// Add the array to the MarkerManager 
	// Display larger icons at higher zoom levels
	trafficAlertMgr.addMarkers(taMarkerArray,7,9);  
	trafficAlertMgr.addMarkers(taMarkerLargeArray,10,17); 
	// Refresh the MarkerManager to make the markers appear on the map  
	trafficAlertMgr.refresh();	 
	
	if(map.getZoom()>=7)
	{
		if(hasIncidents)
		{
			batchDate=getFriendlyTime(batchDate.toUpperCase());
			displayPOIMsg("#" + poiMsgID,'Traffic alerts last updated: ' + batchDate,true);
		}
		else {
			displayPOIMsg("#" + poiMsgID,'No traffic alerts reported currently.',true);
		}
	}

}

function getFriendlyTime(taDate)
{
	var taDatePartDD=taDate.split(" ");
	taDatePartDD[0]=taDatePartDD[0].replace(/-/g," ");
	taDatePartDD[1]=taDatePartDD[1].substring(0,taDatePartDD[1].lastIndexOf(":")); //remove seconds
							
	var hours=parseInt(taDatePartDD[1].substring(0,taDatePartDD[1].indexOf(":")),10);
	var app=hours>=12 ? "PM":"AM";
	if(hours>12) 
	{
		hours=hours-12;
	}
	else if (hours==0)
	{
		hours=12;
	}
	var time=taDatePartDD[0] + ", " + hours + taDatePartDD[1].substring(2,taDatePartDD[1].length) + app;
	
	return time;
}

function setTrafficZoom(zoomlevel)
{
	mapGoogle.setZoom(zoomlevel);
	hidePOIMsg('#overlayMapMessage');
}

function displayPOIMsg(id,msg,bolIsError)
{
	if(bolIsError)
	{
		msg='<div class="msgRow">' 
		+ '<a href="#" onclick="'
		+ 'hidePOIMsgRow(this,' 
		+ "'" + id + "'); return false;" 
		+ '" class="msgClose"><img width="10" height="10" src="/images/traffic/btn-10-close.gif" alt="Close message"></a>'
		+ '<p>' + msg + '</p>'
		+  "</div>";
		
		$(id).append(msg).show();
		//$(id).html(msg).append(" <a href='#' onclick=" + '"hidePOIMsg(' + "'#overlayMapMessage'); return false;" + '">Close message</a>').show();
		
		//hide one 'loading' row
		$(".msgReplaceRow:first",$(id)).remove();
	}
	else {
		msg='<div class="msgReplaceRow">' + msg + '</div>';
		$(id).append(msg).show();
		//$(id).html(msg).show();	
	}

}




function hidePOIMsg(id)
{
	var $msgHolderID=$(id);
	//$msgHolderID.find(".msgRow").remove();
	//$(".msgReplaceRow",$msgHolderID).remove();
	$("div",$msgHolderID).remove();
	$msgHolderID.hide();
}

function hidePOIMsgRow(obj,id)
{
	//remove row
	$(obj).parent().remove();
	
	//if last message then hide whole box
	if ($(".msgRow",id).length==0)
	{
		$(id).html("").hide();
	}
}

/*function stripInp(str) {
 var strOut=str.replace(/([^a-z0-9 ,'|])|(script)/gi, "");
 return strOut;
} */
