function strReplace(str, search, repl) {
	while (str.indexOf(search) != -1)
		str = str.replace(search, repl);
	return str;
}
function strRepeat(input, multiplier) {
    return new Array(multiplier+1).join(input); 
}
// Retourne l'objet flash
function getFlashObject() {
	if (navigator.appName.indexOf("Microsoft") != -1) {
		return window.movie;
	} else {
		return document.movie;
	}
}
// Itineraire
var directionsService;
var geocoder;
var globaltravelmode;
var pano;
function initialize() {
	// Instantiate a directions service.
	directionsService = new google.maps.DirectionsService();
	geocoder = new google.maps.Geocoder();
}
function reverseGeocode(lat,lng) {
	if (geocoder) {
		var latlng = new google.maps.LatLng(lat, lng);
		geocoder.geocode({'latLng': latlng}, function(results, status) {
			var movie=getFlashObject();
			if (status == google.maps.GeocoderStatus.OK) {
				movie.sendGeocodedAddress(results[0].formatted_address);
			} else {
				movie.sendGeocodedAddress("");
			}
		});
	}	
}
function calcRoute(startAdress,endAdress,travelMode) {
	var start=AccentToNoAccent(startAdress);
	var end=AccentToNoAccent(endAdress);	
	var mode=(travelMode=="walk" ? google.maps.DirectionsTravelMode.WALKING : google.maps.DirectionsTravelMode.DRIVING);
	globaltravelmode=(travelMode=="walk" ? "pieton" : "voiture");
	
	var request = {
		origin: start,
		destination: end,
		travelMode: mode
	};	
	directionsService.route(request, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			// avertissement BETA :
			// response.trips[0].warnings 
			showSteps(response);
		}
	});
}
function showSteps(response) {
	// Polyline
	var polylines=new Array();
	var levels=new Array();
	// elements
	var elements=new Array();
	// depart
	var startpoint=response.routes[0].legs[0].start_location;
	// distance totale
	var globaldistance=response.routes[0].legs[0].distance.text;
	// durée totale
	var globalduration=response.routes[0].legs[0].duration.text;

	var element={id:"INFO_0",type:"info",lat:startpoint.lat(),lng:startpoint.lng(),titre:"Durée du trajet : "+globalduration,note:globaldistance};
	elements.push(element);

	var element={id:"START_0",type:"start",lat:startpoint.lat(),lng:startpoint.lng(),titre:"Départ :\n"+response.routes[0].legs[0].start_address,note:""};
	elements.push(element);

	addStats("Outils|Itineraire|"+globaltravelmode+"|depart|"+response.routes[0].legs[0].start_address);

	// étapes
	var highway=false;
	for (var i=0;i<response.routes[0].legs[0].steps.length;i++) {
		var step=response.routes[0].legs[0].steps[i];
		/* Icon */
		var instructions=stripTags(step.instructions);
		var note=step.distance.text;
		
		polylines.push(step.encoded_lat_lngs);
		levels.push(strRepeat("B",step.lat_lngs.length));
	
		var lat=step.start_point.lat();
		var lng=step.start_point.lng();

		var tmp=instructions.split(/et|,|vers/gi);
		var text=tmp[0];
		
		var ico="continue";
		
		if (text.match(/(tourner|à|prendre)/gi)) {
			if (text.match(/gauche/gi)) {
				ico="turnleft";
			}
			if (text.match(/droite/gi)) {
				ico="turnright";
			}
			if (ico!="continue" && text.match(/légèrement/gi)) {
				ico="light"+ico;
			}
		}
	
		if (text.match(/(prendre|rejoindre|suivre|sortir)/gi)) {
			if (text.match(/(sortie|sortir)/gi)) {
				ico="exit";
			} else if (text.match(/(rejoindre)/gi)) {
				ico="join";
			}
		}
	
		if (text.match(/rond-point/gi)) {
			ico="circle";
		}
		if (text.match(/demi-tour/gi)) {
			ico="uturn";
		}
		
		if (text.match(/(autoroute|(A[0-9]+))/gi) && ico=="continue") {
			if (highway==false) {
				ico="";
			}
			highway=true;
		}
		
		ico=(highway==true ? "highway" : "")+ico;
		
		if (ico=="highwayexit") {
			if (text.match(/(direction).*(autoroute|(A[0-9]+))/gi)) {
				highway=true;
			} else {
				highway=false;
			}
		}
		var element={id:"STEP_"+i,type:ico,lat:lat,lng:lng,titre:instructions,note:note};
		elements.push(element);
	}

	// arrive
	var endpoint=response.routes[0].legs[0].end_location;
	var element={id:"END_0",type:"end",lat:endpoint.lat(),lng:endpoint.lng(),titre:"Arrivée :\n"+response.routes[0].legs[0].end_address+"\nDurée du trajet : "+globalduration,note:globaldistance};
	elements.push(element);
	
	addStats("Outils|Itineraire|"+globaltravelmode+"|arrivee|"+response.routes[0].legs[0].end_address);	
	
	var movie=getFlashObject();
	movie.sendRouteVertices(Array(polylines,levels));
	movie.sendRouteDatas(elements);
}
// Statistiques
var enableAnalytics=false;
var enableXiti=false;
function addStats(str) {
	str = AccentToNoAccent(str).toLowerCase();
	if (enableAnalytics==true) {
		pageTracker._trackPageview("/"+strReplace(str,"|","/")+"/");
	}
	if (enableXiti==true) {
		xt_med("F","0",strReplace(str,"|","::"));
	}
}

// Confirmation de deconnexion
function confirmDisconnect() {
	if (confirm("Voulez vous vraiment vous déconnecter ?")) {
		var swf = getFlashObject();
		swf.disconnect();
	}
}
// Supprime les tags d'une chaine
function stripTags(str) {
	str=str.replace("&nbsp;"," ");
	str=str.replace(/(<div)/gi,"\n<div");
  return str.replace(/<\/?[^>]+>/gi, '');
}
// Remplace les caractères accentués
function AccentToNoAccent(str) {
var norm = new Array('À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï', 'Ð','Ñ','Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß', 'à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ', 'ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ý','þ','ÿ');
var spec = new Array('A','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I', 'D','N','O','O','O','0','O','O','U','U','U','U','Y','b','s', 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','d','n', 'o','o','o','o','o','o','u','u','u','u','y','y','b','y');
for (var i = 0; i < spec.length; i++)
str = strReplace(str, norm[i], spec[i]);
return str;
}
// Street view
var checkLat;
var checkLng;
var checkRadius=50;
function showStreetView(w,h,top,lat,lng) {
	lat=parseFloat(lat);
	lng=parseFloat(lng);
	checkLat=lat;
	checkLng=lng;
	checkRadius=50;
	checkStreetView(lat,lng);
	resizeStreetViewDiv(w,h,top);
}
function checkStreetView(lat,lng) {
	var sv = new google.maps.StreetViewService();
	sv.getPanoramaByLocation(new google.maps.LatLng(lat, lng), checkRadius, checkStreetViewDatas);	
}
function checkStreetViewDatas(data, status) {
	var swf = getFlashObject();
	if (status == google.maps.StreetViewStatus.OK) {
		document.getElementById("streetview").style.display="block";
		if(!pano) {
			// Street view
			var center = data.location.latLng;
			var panoramaOptions = {
				position:center,
				pov: {
					heading: 165,
					pitch:0,
					zoom:1
				},
				addressControl:false,
				visible:true
			};
			pano = new google.maps.StreetViewPanorama(document.getElementById("streetview"), panoramaOptions);
			google.maps.event.addListener(pano, 'position_changed', function() {
				var swf = getFlashObject();
				var pos = pano.getPosition();
				var deg=pano.getPov().heading % 360;
				if (deg<0) {
					deg=deg+360;	
				}
				swf.moveStreetview(pos.lat(),pos.lng());
				swf.rotateStreetview(deg);
			});
			google.maps.event.addListener(pano, 'pov_changed', function() {
				var swf = getFlashObject();
				var deg=pano.getPov().heading % 360;
				if (deg<0) {
					deg=deg+360;	
				}
				swf.rotateStreetview(deg);
			});
		} else {
			pano.setPosition(data.location.latLng);
		}
		swf.enableStreetview(data.location.latLng.lat(),data.location.latLng.lng());
		checkRadius=50;
	} else {
		if (checkRadius>=5000) {
			checkRadius=50;
			swf.disableStreetview();
			alert("Streetview n'est pas encore disponible dans un rayon de 5km de cet emplacement,\nessayez de déplacer la carte.");
		} else {
			checkRadius=checkRadius*10;
			checkStreetView(checkLat,checkLng);
		}
	}
}
function resizeStreetViewDiv(w,h,top) {
	document.getElementById("streetview").style.width=w-10;
	document.getElementById("streetview").style.height=h-top;
	document.getElementById("streetview").style.top=top-1;
	document.getElementById("streetview").style.zindex=10000;
}
function resizeStreetView(w,h,top) {
	resizeStreetViewDiv(w,h,top);
	google.maps.event.trigger(pano,'resize');
}
function hideStreetView() {
	document.getElementById("streetview").style.display="none";
}
