	var geocoder = new google.maps.Geocoder();
	var map;
	var gmarkers = [];
	var infowindow;
	var directions = new google.maps.DirectionsRenderer();
	var directionsService = new google.maps.DirectionsService();
	var current_lat = 0;
	var current_lng = 0;

	function getCurrentLat() {
		return current_lat;
	}
	function getCurrentLng() {
		return current_lng;
	}
	
	function addMarker(latlng,title,content,category,icon, rank, rayon) {
		var marker = new google.maps.Marker({
			map: map,
			title : title,
			icon:  new google.maps.MarkerImage(icon, new google.maps.Size(57,34)),
			position: latlng
		});
		
		if (rayon > 0) {
			addCircle(marker, rayon);
		}
		
		google.maps.event.addListener(marker, "click", function() {
			if (infowindow) infowindow.close();
			infowindow = new google.maps.InfoWindow({content: content});
			infowindow.open(map,marker);
		map.setCenter(new google.maps.LatLng(latlng.lat(),latlng.lng()),3);
		});
		
		marker.mycategory = category;
		
		if (rank > 0) {
			gmarkers[rank] = marker;
		} else {
			gmarkers.push(marker);
		}
	}
	function geocodeMarker(address,title,content,category,icon) {
		if (geocoder) {
			geocoder.geocode( { "address" : address}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
					var latlng = 	results[0].geometry.location;
					addMarker(results[0].geometry.location,title,content,category,icon)
				}
			});
		}
	}
	function geocodeCenter(address) {
		if (geocoder) {
			geocoder.geocode( { "address": address}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
				map.setCenter(results[0].geometry.location);
				} else {
				alert("Geocode was not successful for the following reason: " + status);
				}
			});
		}
	}
	function addDirection(from,to) {
		var request = {
		origin:from, 
		destination:to,
		travelMode: google.maps.DirectionsTravelMode.DRIVING
		};
		directionsService.route(request, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
		directions.setDirections(response);
		}
		});
		if(infowindow) { infowindow.close(); }
	}
	function showCategory(category) {
		for (var i=0; i<gmarkers.length; i++) {
			if (gmarkers[i].mycategory == category) {
				gmarkers[i].setVisible(true);
			}
		}
	}
	function hideCategory(category) {
		for (var i=0; i<gmarkers.length; i++) {
			if (gmarkers[i].mycategory == category) {
				gmarkers[i].setVisible(false);
			}
		}
		if(infowindow) { infowindow.close(); }
	}
	function hideAll() {
		for (var i=0; i<gmarkers.length; i++) {
			gmarkers[i].setVisible(false);
		}
		if(infowindow) { infowindow.close(); }
	}
	function showAll() {
		for (var i=0; i<gmarkers.length; i++) {
			gmarkers[i].setVisible(true);
		}
		if(infowindow) { infowindow.close(); }
	}
	function toggleHideShow(category) {
		for (var i=0; i<gmarkers.length; i++) {
			if (gmarkers[i].mycategory === category) {
				if (gmarkers[i].getVisible()===true) { gmarkers[i].setVisible(false); }
				else gmarkers[i].setVisible(true);
			}
		}
		if(infowindow) { infowindow.close(); }
	}
	function addKML(file) {
		var ctaLayer = new google.maps.KmlLayer(file);
		ctaLayer.setMap(map);
	}
	
	function dessineUnCercle() {
		var latConv = centre.distanceFrom(new GLatLng(centre.lat()+0.1, centre.lng()))/100;
		var lngConv = centre.distanceFrom(new GLatLng(centre.lat(), centre.lng()+0.1))/100;
		var points = [];
		var step = parseInt(360/segment)||10;
		for(var i=0; i<=360; i+=step){
		var pint = new GLatLng(centre.lat() + (rayon/latConv * Math.cos(i * Math.PI/180)), centre.lng() + (rayon/lngConv * Math.sin(i * Math.PI/180)));
		points.push(pint);
		}
		cercle = new GPolygon(points, cercleCouleur, cercleEpaisseur, cercleOpacite, disqueCouleur, disqueOpacite);
		map.addOverlay(cercle);
	}
	
	function addCircle(marker, km) {
		
        // Add a Circle overlay to the map.
        var circle = new google.maps.Circle({
          map: map,
		  fillColor: '#336699',
		  fillOpacity: 0.2,
		  strokeColor: '#333333',
		  strokeOpacity: 0.4,
		  strokeWeight : 3,
          radius: km  * 1000
        });
		
        // http://code.google.com/apis/maps/documentation/v3/reference.html#MVCObject
        circle.bindTo('center', marker, 'position');
	}
