var PulseEnergy=PulseEnergy||{};
PulseEnergy.competitionMapLabels={title:{en:"Competition Map",fr:"Carte du concours"},paceCar:{en:"Pace Car",fr:"Voiture pilote"},routeTitle:{en:"Competition Route",fr:"Route du concours"},distance:{en:"Distance:",fr:"Distance :"},savings:{en:"Savings:",fr:"??conomies :"},percent:{en:"%",fr:" %"},error:{en:"Unable to display map. Please verify that the from and to addresses are valid.",fr:"Impossible d'afficher la carte. S'il vous pla??t v??rifiez que l'adresse de d??part et l'adresse de destination sont valides."}};
PulseEnergy.toTeams=function(teamsJson){var teams=[];
$.each(teamsJson,function(i,currentTeam){teams.push({name:currentTeam.paceCar?PulseEnergy.competitionMapLabels.paceCar[PulseEnergy.language]:currentTeam.name,color:"red",distance:currentTeam.totalDistance||0,distance_unit:currentTeam.distanceUnit,distance_in_meters:currentTeam.totalDistanceInMetres,savings:currentTeam.totalSavings||0,savings_unit:currentTeam.savingsUnit,savings_percentage:currentTeam.savingsPercentage||0})
});
return teams.sort(function(a,b){return a.distance_in_meters-b.distance_in_meters
})
};
PulseEnergy.generatePolylines=function(polyline,teams){var polylines=[];
var d=0,t=0,i=0;
var currentVertex=polyline.getVertex(0);
var vertices=[currentVertex];
$.each(teams,function(t){while(d<teams[t].distance_in_meters&&i<polyline.getVertexCount()){var nextVertex=polyline.getVertex(i++);
d+=currentVertex.distanceFrom(nextVertex);
vertices.push(currentVertex);
currentVertex=nextVertex
}polylines.push(new GPolyline(vertices,teams[t].color));
vertices=[currentVertex]
});
return polylines
};
PulseEnergy.createMarker=function(latLng,team){var icon=new GIcon();
icon.image="/images/dashboard/car_map.png";
icon.iconSize=new GSize(30,20);
icon.iconAnchor=new GPoint(15,10);
icon.infoWindowAnchor=new GPoint(15,10);
var locationMarker=new GMarker(latLng,{icon:icon,title:team.name});
GEvent.addListener(locationMarker,"click",function(){var l=PulseEnergy.language;
var html="<h4>"+team.name+"</h4><ul>";
html+="<li>"+PulseEnergy.competitionMapLabels.distance[l]+" "+team.distance+" "+team.distance_unit+"</li>";
html+="<li>"+PulseEnergy.competitionMapLabels.savings[l]+" "+team.savings+" "+team.savings_unit;
if(team.savings_percentage&&!isNaN(team.savings_percentage)&&team.savings_percentage>0){html+=" ("+team.savings_percentage+PulseEnergy.competitionMapLabels.percent[l]+")"
}html+="</li></ul>";
locationMarker.openInfoWindowHtml(html)
});
return locationMarker
};
PulseEnergy.loadMap=function(canvas,teams,from_address,to_address,options){if(canvas instanceof jQuery){canvas=canvas.get(0)
}var map=new GMap2(canvas,options);
var directions=new GDirections();
GEvent.addListener(directions,"load",function(){var directionsLine=directions.getPolyline();
var polylines=PulseEnergy.generatePolylines(directionsLine,teams);
var startLatLng=polylines[0].getVertex(0);
var endLatLng=polylines[polylines.length-1].getVertex(polylines[polylines.length-1].getVertexCount()-1);
map.addOverlay(new GMarker(startLatLng,{title:from_address}));
map.addOverlay(new GMarker(directionsLine.getVertex(directionsLine.getVertexCount()-1),{title:to_address}));
var bounds=new GLatLngBounds();
bounds.extend(startLatLng);
bounds.extend(endLatLng);
$.each(teams,function(t){var marker=PulseEnergy.createMarker(polylines[t].getVertex(polylines[t].getVertexCount()-1),teams[t]);
map.addOverlay(marker);
bounds.extend(marker.getLatLng())
});
$.each(teams,function(i){map.addOverlay(polylines[i])
});
map.setCenter(bounds.getCenter(),PulseEnergy.getRecommendedZoomLevel(map,bounds));
map.addControl(new GSmallMapControl())
});
GEvent.addListener(directions,"error",function(){alert(PulseEnergy.competitionMapLabels.error[PulseEnergy.language]);
return false
});
directions.load("from:"+from_address+" to:"+to_address,{getSteps:true,getPolyline:true});
return true
};
PulseEnergy.openMap=function(competitionId){var width=800,height=500;
var dialogTitle=PulseEnergy.competitionMapLabels.title[PulseEnergy.language];
$.ajax({url:PulseEnergy.getRouteTo("competition",competitionId)+"/map/",type:"GET",dataType:"json",cache:false,success:function(competition){var teams=PulseEnergy.toTeams(competition.teams);
var $map=$("#competitionMap");
if(PulseEnergy.loadMap($map,teams,competition.from,competition.to,{size:new GSize(width,height)})){$map.dialog({width:width,height:height,title:dialogTitle}).bgiframe()
}}})
};
PulseEnergy.getRecommendedZoomLevel=function(map,bounds){var zoom=map.getBoundsZoomLevel(bounds)-1;
return(zoom>14)?14:zoom
};
PulseEnergy.viewRoute=function(from,to){var width=800,height=500;
var $map=$("#competitionMap");
var map=new GMap2($map.get(0),{size:new GSize(width,height)});
var directions=new GDirections();
var dialogTitle=PulseEnergy.competitionMapLabels.routeTitle[PulseEnergy.language];
GEvent.addListener(directions,"load",function(){map.setCenter(directions.getBounds().getCenter(),PulseEnergy.getRecommendedZoomLevel(map,directions.getBounds()));
map.addControl(new GSmallMapControl());
var polyline=directions.getPolyline();
map.addOverlay(polyline);
map.addOverlay(new GMarker(polyline.getVertex(0),{title:from}));
map.addOverlay(new GMarker(polyline.getVertex(polyline.getVertexCount()-1),{title:to}));
$map.dialog({width:width,height:height,title:dialogTitle}).bgiframe()
});
GEvent.addListener(directions,"error",function(){alert(PulseEnergy.competitionMapLabels.error[PulseEnergy.language])
});
directions.load("from:"+from+" to:"+to,{getPolyline:true})
};
