/*traffic feed overlay

//requires markermanager.js
//now uses poi message layer for loading and errors

*/

var trafficmgr;
var trafficoverlay = [];
var trafficAlertMgr;
var trafficRoadworksMgr;

var trafficAlertListeners=new Array();
var trafficRoadworksListeners=new Array();
var trafficXHR;

function clearMgrMarkers(mgr) {
	try {
  		mgr.clearMarkers();
	}
	catch(e) {
	};
	

	if(mgr==trafficAlertMgr)
	{
		for (var j=trafficAlertListeners.length-1; j>=0; j--) 
		{ 
			GEvent.removeListener(trafficAlertListeners[j]); 
		}
	}

	if(mgr==trafficRoadworksMgr)
	{
		for (var j=trafficRoadworksListeners.length-1; j>=0; j--) 
		{ 
			GEvent.removeListener(trafficRoadworksListeners[j]); 
		}
	}

}


function displayTrafficAlertOverlay(map,blnShowMarkers,poiMsgID,alertType)
{
	var $poiMsgID=$("#" + poiMsgID);
	var mapCurrentZoom=map.getZoom();
	
	//initialize
	if(blnShowMarkers)
	{
		//display loading
		displayPOIMsg("#" + $poiMsgID.attr('id'),'Loading traffic alerts...',false,true); 
		
		//clean up
		if(alertType=='roadworks')
		{
			clearMgrMarkers(trafficRoadworksMgr);
		}
		else if (alertType=='delays')
		{
			clearMgrMarkers(trafficAlertMgr);
		}
		else {
			//clear both
			clearMgrMarkers(trafficRoadworksMgr);
			clearMgrMarkers(trafficAlertMgr);
		}
		getTrafficAlertData(mapGoogle,'overlayMapMessage',alertType);
	}
	else {
		 //remove traffic markers and text
		if ($poiMsgID.length > 0 ) {
				//function from POIOverlay
				hidePOIMsg("#" + $poiMsgID.attr('id'));
		}

		//clean up
		if(alertType=='roadworks')
		{
			clearMgrMarkers(trafficRoadworksMgr);
		}
		else if (alertType=='delays')
		{
			clearMgrMarkers(trafficAlertMgr);
		}
	}
}

function createTrafficAlertMarker(point,title,html,size,code,delayValue) {
	
	var imgTrafficAlert="trafficalerticon.png";
	var imgTrafficAlertShadow="trafficalerticon.png";
	var imgTrafficAlertTransparent="trafficalerticon-trans.png";
	
	var imgTrafficRoadworks="road-works.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.imageMap = [0,22,13,0,26,22];
		Icon.transparent="/images/traffic/" + imgTrafficAlertTransparent;
		
		if(code=="701")	{
			Icon.image='/images/traffic/road-works.png';
		}
		else if (code=="401" || code=="402"){
			Icon.image='/images/traffic/road-closed.png';
			Icon.transparent="/images/traffic/road-closed-trans.png";
			Icon.imageMap = [0,0,26,0,26,22,0,22];
		}
		else if (code=="500"){
			Icon.image='/images/traffic/lane-closed-med.png';
			Icon.iconSize = new GSize(17, 17);
			Icon.imageMap = [0,0,17,0,17,17,0,17];
			Icon.iconAnchor = new GPoint(9, 9);
			Icon.transparent="/images/traffic/lane-closed-med-trans.png";
		}
		
		Icon.shadow = "";
		
		if(code=="401" || code=="402")
		{
			taMarker = new GMarker(point,{title:title,icon:Icon,zIndexProcess:setTrafficZIndex});
		}
		else {
			taMarker = new GMarker(point,{title:title,icon:Icon});
		}
	}
	else {
		imgTrafficAlert="traffic-alert-light-sm.png";
		imgTrafficAlertShadow="";
		imgTrafficAlertTransparent="traffic-alert-light-sm-trans.png";
		var Icon = new GIcon();
		Icon.image = '/images/traffic/' + imgTrafficAlert;
		Icon.iconSize = new GSize(17, 15);
		Icon.iconAnchor = new GPoint(8, 7);
		Icon.infoWindowAnchor = new GPoint(8, 1);
		Icon.shadow = "";
		//Icon.shadowSize = new GSize(11, 9);
		//Icon.shadow = ""; 
		Icon.imageMap=[8,0,17,15,0,15]
		Icon.transparent="/images/traffic/" + imgTrafficAlertTransparent;
		taMarker = new GMarker(point,{title:title,icon:Icon});
	}
	
	if(code=="701")	{
		trafficRoadworksListeners.push(
			GEvent.addListener(taMarker, "click", function() {
			  taMarker.openInfoWindowHtml(html);
			})
		);
	}
	else {
		trafficAlertListeners.push(GEvent.addListener(taMarker, "click", function() {
			  taMarker.openInfoWindowHtml(html);
			})
		);
	}

	return taMarker;
}

function setTrafficZIndex(marker,b) {
        return 10000;
}

function clearTrafficAlertMarkers(alertType) {
	if(alertType=='delays') {
		try {
			//summaryTrafficMgr.clearMarkers();
			trafficAlertMgr.clearMarkers();
		}
		catch(e) {};
	}
	else if (alertType=='roadworks'){
		try {
			//summaryTrafficMgr.clearMarkers();
			trafficRoadworkMgr.clearMarkers();
		}
		catch(e) {};
	}
}


function getTrafficAlertData(map,poiMsgID,alertType)
{	

	var curZoom=map.getZoom();
	
	var params='';
	
	if(curZoom<delayZoomThreshold){
		params+='&minDelay=' + (delayValueThreshold*60);
	}
	else if (curZoom>=delayZoomThreshold && curZoom<delayZoomThresholdMin){
		params+='&minDelay=' + (delayValueThresholdMin*60);
	}
	else if (curZoom>=delayZoomThresholdMin){
		params+='&minDelay=' + (delayValueAbsoluteMin*60);
	}

	if (curZoom>=delayZoomThreshold && latlngScrollRequests) {
		//pass in viewport
		var curBounds=map.getBounds();
		var sw=curBounds.getSouthWest();
		var ne=curBounds.getNorthEast();
		
		//truncate
		params+='&sw=' + truncateLatLng(sw.lat(),4) + "," + truncateLatLng(sw.lng(),4) + "&ne=" + truncateLatLng(ne.lat(),4) + "," + truncateLatLng(ne.lng(),4);
	}
	
	if(alertType=='roadworks'){
		params+='&type=MaintenanceWorks';
	}
	else if (alertType=='delays'){
		params+='&type=others';
	}

	trafficUrl="/aaservlet/tomtomtraffic";
	
	trafficXHR=$.ajax({
		  type: "GET",
		  url: trafficUrl,
		  data: params, 
		  dataType: "json",
			error: function(xhr, desc, exceptionobj) { 
				//error getting summary traffic
				if (xhr.status === 0 || xhr.readyState === 0) {
					//ignore for aborts
					return;
				}
				displayPOIMsg("#" + poiMsgID,"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
		});
}


function addTrafficAlertMarkers(json,map,minzoom,maxzoom,iconSize,poiMsgID)
{

	if(json==''||json==null||json.headerData==null)
	{
		displayPOIMsg("#" + poiMsgID,"There was a problem displaying traffic data. Please try again later.",true);
		return;
	}
	if(trafficAlertMgr==null)
	{
		trafficAlertMgr = new MarkerManager(mapGoogle); 
	}
	if(trafficRoadworksMgr==null)
	{
		trafficRoadworksMgr=new MarkerManager(mapGoogle);
	}

	var taTitle;
	var taDesc;
	var taDate;
	var taStatus;
	var taHtml;
	var taAlertCCode;
	var taMarker;
	var taMarkerLarge;
	var taIncident;
	var time;
	var highwayImg;
	var taBearing;
	var taMarkerArray=new Array(); 
	var taMarkerLargeArray=new Array();
	var taRoadworkMarkerLargeArray=new Array();
	var taLaneClosedMarkerArray=new Array();
	var taDelay=0;
	var taAverageSpeed;
	var batchDate;
	var friendlyBatchDate="";
	var hasIncidents=false;
	
	if(json.headerData.loadPublishedDate!==null&&json.headerData.loadPublishedDate!==undefined)
	{
		batchDate=json.headerData.loadPublishedDate;
		friendlyBatchDate=getFriendlyTime(batchDate);
	}
	
	var isAlertTicked=false;
	if($("#dispTrafficAlert").is(':checked')) {isAlertTicked=true;}
	
	var curZoom=map.getZoom();
	
	
	$.each(json.content.situations, function(i,item){
	
		//assume valid item
		taDelay=parseInt(item.sitDelayValue/60);		
		taAlertCCode=item.sitAlertCCode;	
				
		/*only show roadworks and reduce duplicates*/
		if(!isAlertTicked)
		{
			if(taAlertCCode!="701") return;
		}
		
		hasIncidents=true;
		taIncident = item.sitType; 
		taHtml='';
		point = new GLatLng(item.sitRefPoints.refLat,item.sitRefPoints.refLong);
		taLocation="";//item.loc; 
		taDesc= item.sitComments; 
		taDate=item.sitStartTime; //first updated time
		taAverageSpeed=parseInt(item.sitAvgSpeed);
		taStatus="";
		taFriendlyTime="";
		

			if(taAlertCCode!="701" && !isNaN(taDelay) && taDelay<delayValueThresholdMin && taAlertCCode!="500")
			{
				taFriendlyTime=friendlyBatchDate;
			}
			else {
				taFriendlyTime=getFriendlyTime(taDate);
			}
		
		taBearing=parseInt(item.sitRefPoints.refBearingSec,10);
		strBearing="";
		if (taBearing<22||taBearing>=327){
			strBearing="Northwards";
			}
		else if (taBearing>=22&&taBearing<67){
			strBearing="Northeast";
			}
		else if (taBearing>=67&&taBearing<112){
			strBearing="Eastwards";
			}
		else if (taBearing>=112&&taBearing<157){
			strBearing="Southeast";
			}
		else if (taBearing>=157&&taBearing<202){
			strBearing="Southwards";
			}
		else if (taBearing>=202&&taBearing<247){
			strBearing="Southwest";
			}
		else if (taBearing>=247&&taBearing<292){
			strBearing="Westwards";
		}
		else if (taBearing>=292&&taBearing<327){
			strBearing="Northwest";
		}
		taTitle=taIncident.replace(/^([A-Z][a-z]*)(.*)/,"$1 $2") +" - " + strBearing;
		providerImg = "<img src='/images/traffic/tomtom-logo.gif' alt='Traffic data provided by TomTom HD Traffic' width='100' height='15'/>";	

		taHtml+="<div class='iw-traffic'><div class='iw-traffic-date'>" + taFriendlyTime + "</div>"
		+ "<div class='iw-traffic-direction'>" + strBearing;

		if(taDelay!=null&&taDelay!=0 && !isNaN(taDelay)) {
			taHtml+= ", <span class='iw-traffic-delay'> approx delay " + taDelay + " mins</span>";
		}
			
		taHtml+="</div><div class='iw-traffic-desc'>" + taDesc;
		
		if(!isNaN(taAverageSpeed)) {
			taHtml+= "<br/><span class='iw-traffic-speed'>Average speed: " + taAverageSpeed + " mph</span>";
		}
		taHtml+= "</div><div class='iw-traffic-logo'>"+providerImg+"</div></div>";
		
		if(taAlertCCode!="701") {
			if(!isNaN(taDelay)&& taDelay<delayValueThresholdMin)
			{
				taMarkerLarge=createTrafficAlertMarker(point,taTitle,taHtml,'small',taAlertCCode,taDelay);
			}
			else {
				taMarkerLarge=createTrafficAlertMarker(point,taTitle,taHtml,'regular',taAlertCCode,taDelay);	
			}
			if(taAlertCCode=="500")
			{
				taLaneClosedMarkerArray.push(taMarkerLarge);
			}
			else {
				taMarkerLargeArray.push(taMarkerLarge);
			}
		}
		else {
			taRoadworkMarkerLarge=createTrafficAlertMarker(point,taTitle,taHtml,'regular',taAlertCCode,taDelay);
			taRoadworkMarkerLargeArray.push(taRoadworkMarkerLarge);
		}
	});
	
	json=null; //clear up!
	
	var minLevel=delayZoomThreshold;
	var maxLevel=delayZoomThresholdMin;
	
	if(curZoom<delayZoomThreshold)
	{
		minLevel=4; //markers pointless at lower than 4
		maxLevel=delayZoomThreshold;
	}
	else if (curZoom>delayZoomThresholdMin)
	{
		minLevel=delayZoomThresholdMin;
		maxLevel=20;
	}
	
	if(taLaneClosedMarkerArray.length!=0)
	{
		//don't show lane closures at far zoom
		trafficAlertMgr.addMarkers(taLaneClosedMarkerArray,minLaneClosureLevel,maxLevel);
	}	
	if(taMarkerLargeArray.length!=0)
	{
		trafficAlertMgr.addMarkers(taMarkerLargeArray,minLevel,maxLevel);
		 
	}

	if(taMarkerLargeArray.length!=0|| taLaneClosedMarkerArray.length!=0)
	{
		trafficAlertMgr.refresh();
	}
	
	if(taRoadworkMarkerLargeArray.length!=0)
	{
		trafficRoadworksMgr.addMarkers(taRoadworkMarkerLargeArray,minLevel,maxLevel);
		trafficRoadworksMgr.refresh();
	}
	
	if(hasIncidents)
	{
		displayPOIMsg("#" + poiMsgID,'Traffic alerts last updated: ' + getFriendlyTime(batchDate),true);
	}
	else {
		displayPOIMsg("#" + poiMsgID,'No traffic alerts reported in this area.',true);
	}
}


var trafficMonthArray=new Array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec");

function getFriendlyTime(taDate)
{
	var taDatePartDD=taDate.split(" ");
	taDatePartDD[0]=taDatePartDD[0].split("-");
	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][2] + " " + trafficMonthArray[taDatePartDD[0][1]-1] + " " + taDatePartDD[0][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,bolClearAll)
{
	if(bolClearAll)
	{
		$(id).html("").hide();
	}
	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();		
		//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);
	$("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 truncateLatLng(inpNum,places)
{
	return Math.floor(inpNum*Math.pow(10,places))/Math.pow(10,places);
}

