//
var home = null;
// carte
var map=null;
// Localisation courante
var cur_adr = "";
var cur_cp = "";
var cur_ville = "";
var cpt = 0;
//Zoom d'affichage
var niv_zoom = 14;
//Variables liées é l'adresse
var num_adr = "25";
var rue_adr = "rue de la république";
var cp_adr = "54000";
var ville_adr = "Saint Max";
//Bulle d'information sauvegardée en cas de géocodage é la volée.
var cur_bubble = '';
//Paramétre courant d'une géolocalisation d'adresse
var cur_param = null;
// Variable representant l'icone du pro
var properties_i_pro = {
image: "/ui/img/procat1.png",
size: new google.maps.Size(30,47),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(15, 46),
scaledSize: new google.maps.Size(25, 25),
shadow : "",
shadowSize : new google.maps.Size(45,30),
infoWindowAnchor : new google.maps.Point(15, 0),
};
var i_pro = new google.maps.Marker(properties_i_pro);
//Variable représentant l'icone de l'internaute
var properties_i_internaute = {
image: "/ui/img/z_bulle_internaute.png",
size: new google.maps.Size(30,47),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(15, 46),
scaledSize: new google.maps.Size(25, 25),
shadow : "",
shadowSize : new google.maps.Size(30,20),
infoWindowAnchor : new google.maps.Point(10, 0),
};
var i_internaute = new google.maps.Marker(properties_i_internaute);
/**
* Geocodeur utilisé pour l'adresse de l'utilisateur.
*/
var geocoderUser = null;
/**
* Geocodeur utilisé pour l'adresse du pro.
*/
var geocoderPro = null;
/**
* Fonction qui permet de localiser sur la carte l'adresse saisie par l'internaute
* dans son admin
*/
function geocodeFormulaire (rue_adr, cp_adr,ville_adr)
{
geocoderUser = null;
// Init
cpt = 0;
var rue_adr = rue_adr;
var cp_adr = cp_adr;
var ville_adr = ville_adr;
// si le geocoder de l'utilisateur n'existe pas
if(geocoderUser == null){
geocoderUser = new google.maps.Geocoder();
cur_adr = rue_adr;
cur_cp = cp_adr;
cur_ville = ville_adr;
}
// adresse complete
var adresse = rue_adr + " " + cp_adr + " " + ville_adr + " ";
var geocoder_request =
{
address: adresse
}
// on récupère la latitude et longitude de la position de l'utilisateur
var result = {};
geocoderUser.geocode( geocoder_request, function(results, status) {
// on check le status de retour
if (status == google.maps.GeocoderStatus.OK) {
// on stock les données dans result[]
let lat = results[0].geometry.location.lat();
let lng = results[0].geometry.location.lng();
result= new google.maps.LatLng(lat,lng);
} else if(status == google.maps.GeocoderStatus.ZERO_RESULTS) {
//result['message'] = "Unable to find address: " + status;
result=null;
} else if(status == google.maps.GeocoderStatus.INVALID_REQUEST){
//result['message'] = "Invalid request: " + status;
result=null;
} else {
//result['message'] = "Error, Request denied: " + status;
result=null;
}
// on traite les données dans la fonction callbackGeocodeUser()
this.callbackGeocodeUser(result);
});
}
/**
* Fonction qui gére la valeur de retour du geocodage d'un utilisateur.
* @param {Object} latlng
*/
function callbackGeocodeUser ( latlng )
{
cpt++;
var result=null;
if( latlng == null || latlng == undefined)
{
var adresse = "";
// on tente de trouver une localisation à partir
// du code postal et du champ France
if( cpt == 1 )
{
adresse= cur_cp + " france";
geocoderUser.geocode({ 'address' : adresse}, function(results,status){
if (status == google.maps.GeocoderStatus.OK) {
let lat = results[0].geometry.location.lat();
let lng = results[0].geometry.location.lng();
result = new google.maps.LatLng(lat,lng);
} else {
// on a rien trouvé donc on retourne null pour reboucler
// dans cette fonction
result = null;
}
this.callbackGeocodeUser(result);
});
return;
}
// on tente de trouver une localisation à partir
// du nom de la ville et du champ France
else if ( cpt ==2 )
{
adresse= cur_ville + " france";
geocoderUser.geocode({'adress' : adresse}, function(results,status){
if (status == google.maps.GeocoderStatus.OK) {
let lat = results[0].geometry.location.lat();
let lng = results[0].geometry.location.lng();
result = new google.maps.LatLng(lat,lng);
} else {
result = null;
}
this.callbackGeocodeUser(result);
});
return;
}
// Toujours aucun résultat, on ne peut pas le localiser
else if ( cpt == 3 )
{
alert ( "Nous sommes dans l'impossibilite de vous localiser sur la plan.");
return;
}
// Stopper la boucle
else
{
return ;
}
}
// On a des coordonnées, on peut placer un point
var map_canvas = new google.maps.Map(document.getElementById('map_canvas'), {
center: {lat:46,lng:2},
zoom: niv_zoom
});
//map_canvas.setCenter(new google.maps.LatLng(46,2), niv_zoom);
var pan_control =
{
map:map_canvas,
img:'/ui/img/',
width:25,
height:45
}
//map_canvas.addControl ( pan_control );
var zoom_control =
{
map:map_canvas,
img:"/ui/img/",
width:23,
height:23,
zoom:2
}
//map_canvas.addControl ( zoom_control );
// Le lieu où l'utilisateur arrivera en chargeant la carte
map_canvas.setCenter(latlng, niv_zoom);
// set un maker home sur la carte
home = new google.maps.Marker(latlng, { title:'', icon:i_internaute });
home.setMap(map_canvas);
//map_canvas.savePosition();
// lorsque l'on clique sur l'indicateur home, une bulle apparaitra avec l'adresse
var bulle_adr = "
"+cur_adr+"
"+cur_cp + "
"+cur_ville+"
";
google.maps.event.addListener( home , 'click',function (){openInfoUser(home, bulle_adr);} );
setTimeout (function() { openInfoUser ( home, bulle_adr ); }, 300 );
}
/**
* Fonction qui permet de localiser sur la carte l'adresse d'un pro
*/
function geocodePro ( rue_adr, cp_adr, ville_adr, param)
{
cpt = 0;
if( geocoderPro == null)
{
geocoderPro = new google.maps.Geocoder();
cur_cp= cp_adr;
cur_ville = ville_adr;
}
cur_bubble = param.bulle;
cur_param = param;
// adresse complete
var adresse = rue_adr + " " + cp_adr + " " + ville_adr + " ";
var geocoder_request =
{
address: adresse
}
// on récupère la latitude et longitude de la position de l'utilisateur
var result = {};
geocoderPro.geocode( geocoder_request, function(results, status) {
// on check le status de retour
if (status == google.maps.GeocoderStatus.OK) {
let lat = results[0].geometry.location.lat();
let lng = results[0].geometry.location.lng();
result = new google.maps.LatLng(lat,lng);
} else {
//result['message'] = "Unable to find address: " + status;
result=null;
}
// on traite les données dans la fonction callbackGeocodeUser()
this.callbackGeocodePro(result);
});
}
/**
* Fonction qui localise sur la carte le pro.
*/
/**
* Exemple de structure é passer é la fonction locatePro
* {
* map : '', Div utilisé pour la carte
* type_geoc:0, 0(adresse)/1(lat/lng),
* type_item:0, 0(internaute)/1(pro)
* adr:'', adresse
* cp:'', code postal
* ville:'', ville
* lat:0, latitude
* lng:0, longitude
* bulle :'', contenu de la bulle
* ctrl_zoom:0, (0/1)affichage des outils de zoom
* ctrl_pan:0 (0/1)affichage des fléches de déplacement
* }
*/
function locatePro ( param )
{
if( param.trl_pan == 1 )
{
var pan_control =
{
map:map_pro,
img:'/ui/img/',
width:25,
height:45
}
//map.addControl ( pan_control );
}
if( param.ctrl_zoom == 1 )
{
var zoom_control =
{
map:map_iti,
img:"/ui/img/",
width:23,
height:23,
zoom:2
}
//map.addControl ( zoom_control );
}
switch( parseInt (param.type_geoc ) )
{
case 0:
var latlng = geocodePro ( param.adr , param.cp , param.ville , param );
break;
case 1:
var position = new google.maps.LatLng(param.lat,param.lng);
map = new google.maps.Map(document.getElementById ( param.map ),{
center:{lat:position.lat(),lng:position.lng()},
zoom:14
});
var home = new google.maps.Marker( { title:'Home', position: position} );
home.setMap(map);
google.maps.event.addListener( home , 'click',function (){openInfoPro(home, param.bulle)} );
if ( param.showBulle == 1)
{
setTimeout ( function() { openInfoPro ( home, param.bulle ); }, 300);
}
break;
default:
break;
}
}
/**
* Méthde qui ouvre les bulles d'infos pour les pros.
* @param {Object} m le marqueur
* @param {Object} h le texte de la bulle au format HTML.
*
* La mise en forme autour du texte pourra se faire ici.
*/function openInfoPro (m, h)
{
// mise en forme
var infoWindow = new google.maps.InfoWindow({
content:h,
maxWidth:400
});
infoWindow.open(map,m);
}
/**
* Méthode qui ouvre les bulles d'infos pour les internautes.
* @param {Object} m le marqueur
* @param {Object} h le texte de la bulle au format HTML.
*
* La mise en forme autour du texte pourra se faire ici.
*/function openInfoUser (m, h)
{
var infoWindow = new google.maps.InfoWindow({
content:h,
maxWidth:400
});
infoWindow.open(map,m);
}
/**
* Fonction qui gére la valeur de retour du geocodage d'un pro.
* @param {Object} latlng
*/
function callbackGeocodePro ( latlng )
{
cpt++;
var result = {};
if( latlng == null || latlng == undefined)
{
var adresse = "";
// on tente de trouver une localisation à partir
// du code postal et du champ France
if( cpt == 1 )
{
adresse= cur_cp + " france";
geocoderPro.geocode({ 'address' : adresse}, function(results,status){
if (status == google.maps.GeocoderStatus.OK) {
// on stock les données dans result[]
result["lat"] = results[0].geometry.location.lat();
result["lng"] = results[0].geometry.location.lng();
} else {
// on a rien trouvé donc on retourne null pour reboucler
// dans cette fonction
result = null;
}
this.callbackGeocodePro(result);
});
return;
}
// on tente de trouver une localisation à partir
// du nom de la ville et du champ France
else if ( cpt ==2 )
{
adresse= cur_ville + " france";
geocoderPro.geocode({'adress' : adresse}, function(results,status){
if (status == google.maps.GeocoderStatus.OK) {
// on stock les données dans result[]
result["lat"] = results[0].geometry.location.lat();
result["lng"] = results[0].geometry.location.lng();
} else {
result = null;
}
this.callbackGeocodePro(result);
});
return;
}
// Toujours aucun résultat, on ne peut pas le localiser
else if ( cpt == 3 )
{
alert ( "Nous sommes dans l'impossibilite de localiser ce professionnel.");
return;
}
// Stopper la boucle
else
{
return ;
}
} else {
result=latlng;
}
var lat_pro = result['lat'];
var lng_pro = result['lng'];
locatePro( {
map:cur_param.map,
type_geoc:1,
type_item:0,
lat:lat_pro(),
lng:lng_pro(),
adr:'',
cp:'',
ville:'',
bulle:cur_param.bulle,
ctrl_zoom:cur_param.ctrl_zoom,
ctrl_pan:cur_param.ctrl_pan,
icon:cur_param.icon,
showBulle:cur_param.showBulle,
//zoom:cur_param.zoom
zoom:14
});
}
//Objet qui représente l'itinéraire
var direction = null;
var directionsService =null;
/**
* Fonction qui lance le calcul d'itinéraire entre deux points GPS.
* Le premier paramétre contiendra le point de départ
* Le second paramétre contiendra le point d'arrivée
* Le troisiéme paramétre contiendra les paramétres de la carte.
*/
/**
* structure du param1 et param2
*
* {
* type_geoc:0 0(adresse)/1(lat/lng),
* type_item:0 1(internaute)/1(pro)
* adr:'', adresse (si type_geoc:0)
* cp:'', code postal (si type_geoc:0)
* ville:'', ville (si type_geoc:0)
* lat:0, latitude (si type_geoc:1)
* lng:0, longitude (si type_geoc:1)
* bulle :'', contenu de la bulle
* }
*/
/**
* Structure du param3
* {
* map:'', Div contenant la carte
* ctrl_zoom:0, (0/1)affichage des outils de zoom
* ctrl_pan:0 (0/1)affichage des fléches de déplacement
* }
*/
function itineraire ( start_iti, end_iti, param_carte )
{
if ( direction != null )
{
// supprime les itinéraires déjà tracés sur la map
direction.setMap(null);
direction = null;
}
if (direction == null)
{
direction = new google.maps.DirectionsRenderer({
map : map
});
}
// tinéraire via deux adresses
if ( start_iti.type_geoc == 0 && end_iti.type_geoc == 0 )
{
var aa = start_iti.adr + ' ' + start_iti.cp + ' ' + start_iti.ville;
var bb = end_iti.adr + ' ' + end_iti.cp + ' ' + end_iti.ville;
var request = {
origin : aa,
destination : bb,
travelMode : google.maps.DirectionsTravelMode.DRIVING // Type de transport
}
directionsService = new google.maps.DirectionsService(); // Service de calcul d'itinéraire
directionsService.route(request, function(response, status){ // Envoie de la requête pour calculer le parcours
if(status == google.maps.DirectionsStatus.OK){
direction.setDirections(response); // Trace l'itinéraire sur la carte et les différentes étapes du parcours
//callBackRouting(start_iti, end_iti, param_carte);
}
});
//direction.load("from: " + aa + " to: "+ bb, { getPolyline:true,getSteps:false, "locale": "fr" });
}
//itinéraire via deux paires de coordonnées.
else if ( start_iti.type_geoc == 1 && end_iti.type_geoc == 1 )
{
//direction.loadFromWaypoints ( [new GLatLng(start_iti.lat,start_iti.lng), new GLatLng(end_iti.lat,end_iti.lng)], {getPolyline:true,getSteps:false} );
var aa = new google.maps.LatLng(start_iti.lat,start_iti.lng);
var bb = new google.maps.LatLng(end_iti.lat,end_iti.lng);
var request = {
origin : aa,
destination : bb,
travelMode : google.maps.DirectionsTravelMode.DRIVING // Type de transport
}
directionsService = new google.maps.DirectionsService(); // Service de calcul d'itinéraire
directionsService.route(request, function(response, status){ // Envoie de la requête pour calculer le parcours
if(status == google.maps.DirectionsStatus.OK){
direction.setDirections(response); // Trace l'itinéraire sur la carte et les différentes étapes du parcours
//callBackRouting(start_iti, end_iti, param_carte);
}
});
}
//Les types sont disparatres
else {
}
}
/**
* Méthode throwée si une erreure survient dans le calcul d'itinéraire.
*/
function callBackRoutingError ()
{
alert("Erreur dans le calcul de l'itinéraire, merci dêtre plus précis dans les adresses.");
}
/**
* Méthode throwée en cas de succés du calcul d'itinéraire.
* Affichage de la carte dans la div prévu é cet effet.
* Affichage de la route
* Affichage des points de départ et d'arrivée.
*/
function callBackRouting ( start_iti, end_iti, param_carte )
{
/*
var kms = directionsService.route().getDistance().meters/1000;
if($(param_carte.kmField) != undefined){
$(param_carte.kmField).replaceWith('Distance: '+kms+' km
');
}
var duree_seconde = direction.getRoute(0).getDuration().seconds;
var duree_html = direction.getRoute(0).getDuration().html;
if($(param_carte.timeField) != undefined){
$(param_carte.timeField).replaceWith('Temps en voiture :'+duree_html+'
');
}
//var map_iti = new GMap2 ( document.getElementById ( param_carte.map ) );
map.setCenter ( direction.getBounds().getCenter(), map.getBoundsZoomLevel(direction.getBounds())-1 );
if ( param_carte.ctrl_pan == 1 )
{
pan_control = new PanControl ( map_iti, "/ui/img/", 25, 45 );
map.addControl ( pan_control );
}
if ( param_carte.ctrl_zoom == 1 )
{
zoom_control = new ZoomControl ( map_iti, "/ui/img/", 23, 23, 2 );
map.addControl ( zoom_control );
}
map.addOverlay ( direction.getPolyline () );
map.savePosition() ;
var i_start = i_pro;
if ( start_iti.type_item == 0)
{
i_start = i_internaute;
}
var i_end = i_pro;
if ( end_iti.type_item == 0)
{
i_end = i_internaute;
}
var str_point = direction.getGeocode(0).Point.coordinates;
var m_start = new GMarker ( new GLatLng (str_point[1],str_point[0]), {icon:start_iti.icon} );
var end_point = direction.getGeocode(1).Point.coordinates;
var m_end = new GMarker ( new GLatLng (end_point[1],end_point[0]), {icon:end_iti.icon} );
map_iti.addOverlay ( m_start );
map_iti.addOverlay ( m_end );
if ( start_iti.type_item == 1 )
{
GEvent.addListener ( m_start, "click", function (){ openInfoPro ( m_start, start_iti.bulle ); } );
}
else if ( start_iti.type_item == 0 )
{
GEvent.addListener ( m_start, "click", function () { openInfoUser(m_start, start_iti.bulle ); } );
}
if ( end_iti.type_item == 1 )
{
GEvent.addListener ( m_end, "click", function () { openInfoPro ( m_end, end_iti.bulle ); } );
}
else if ( end_iti.type_item == 0 )
{
GEvent.addListener ( m_end, "click", function () { openInfoUser(m_end, end_iti.bulle ); } );
}
*/
}