var eMap,eForm,eDirections,eStart,eStartAddress,eEnd,eHidden,eTravelMode,eAvoidHighways;var oMap,oGeolocation,oGeocoder,oLatLngBounds,oGPS,oHover,oIconStart,oIconEnd,oIconStep,oDirections;var nTravelMode;var bAvoidHighways;var fGeolocation;var aWaypoints;window.addEvents({'domready':function(){eMap=document.id('gmaps-map');eForm=document.id('gmaps-form');eDirections=document.id('gmaps-directions');eStart=eForm.getElement('#gmaps-start');eEnd=eForm.getElement('#gmaps-end');eStartAddress=eForm.getElement('#gmaps-start-address');eTravelMode=eForm.getElement('#gmaps-travel-mode');eAvoidHighways=eForm.getElement('#gmaps-avoid-highways');eHidden=new Element('div');if(eStartAddress&&eStart.get('tag').toLowerCase()=='select')eStart.addEvent('change',function(){eStartAddress.set('value','').getParent('p').setStyle('display',this.getSelected()[0].get('value')==''?'block':'none');}).fireEvent('change');eTravelMode.addEvent('change',function(){nTravelMode=this.getSelected()[0].get('value')=='walking'?G_TRAVEL_MODE_WALKING:G_TRAVEL_MODE_DRIVING;eAvoidHighways.getParent('label').setStyle('display',this.getSelected()[0].get('value')=='walking'?'none':'inline');}).fireEvent('change');eAvoidHighways.addEvents({'change':function(){bAvoidHighways=this.get('checked');},'click':function(){this.blur();}}).fireEvent('change');aWaypoints={starts:[],ends:[],directions:[]};$$(eForm.getElements('.gmaps-start'),eForm.getElements('.gmaps-end')).each(function(input){if(input.hasClass('gmaps-start'))var sWaypoint='start';else var sWaypoint='end';var sGeocode=input.value.substr(0,input.value.lastIndexOf('@'));var aLatLng=input.value.substr(input.value.lastIndexOf('@')+1).split(',');aWaypoints[sWaypoint+'s'].push({'title':(input.get('tag')=='option')?input.get('text'):sGeocode,'geocode':sGeocode,'latitude':aLatLng[0],'longitude':aLatLng[1],'item':input,'waypoint':sWaypoint});});oMap=new google.maps.Map2(eMap,{backgroundColor:'#F2F2F2'});oMap.setCenter(new google.maps.LatLng(0,0),1);var oUI=oMap.getDefaultUI();oUI.controls.scalecontrol=false;oUI.zoom.scrollwheel=false;oMap.setUI(oUI);oGeocoder=new google.maps.ClientGeocoder();oGPS=new GPS(4,true);oLatLngBounds=new google.maps.LatLngBounds();oDirections=new google.maps.Directions(oMap,eHidden);oIconStep=new google.maps.Icon(G_DEFAULT_ICON,'/img/gmaps-step.png');oIconStep.shadow=false;oIconStep.iconSize=new google.maps.Size(43,43);oIconStep.shadowSize=new google.maps.Size(0,0);oIconStep.iconAnchor=new google.maps.Point(20,37);oIconStart=new google.maps.Icon(oIconStep,'/img/gmaps-start.png');oIconStart.iconSize=new google.maps.Size(55,48);oIconStart.iconAnchor=new google.maps.Point(25,45);oIconEnd=new google.maps.Icon(oIconStep,'/img/gmaps-end.png');oIconEnd.iconSize=new google.maps.Size(56,48);oIconEnd.iconAnchor=new google.maps.Point(25,45);aWaypoints.ends.each(function(end){var oLatLng=new google.maps.LatLng(end.latitude,end.longitude);end.marker=new google.maps.Marker(oLatLng,{clickable:(end.item.get('tag')=='option'?true:false),icon:oIconEnd,title:end.geocode});if(end.item.get('tag')=='option'){google.maps.Event.bind(end.marker,'click',end,function(){end.item.selected=true;});}
oLatLngBounds.extend(oLatLng);oMap.addOverlay(end.marker);});oMap.setCenter(oLatLngBounds.getCenter(),oMap.getBoundsZoomLevel(oLatLngBounds));eForm.addEvent('submit',function(event){if(event)event.stop();aWaypoints.directions.empty();eForm.getElements('*[name^=gmaps_waypoints]').each(function(item,i){if(item.get('tag')=='input')var sValue=item.value;else if(item.get('tag')=='select')var sValue=item.options[item.selectedIndex].value;if(sValue!='')aWaypoints.directions.push(sValue);});if(aWaypoints.directions.length>1){eForm.getElement('input[type=submit]').set('disabled',true);new Element('p',{'class':'loading',text:'Calcul de votre itinéraire en cours...'}).inject(eDirections.empty());oDirections.loadFromWaypoints(aWaypoints.directions,{getPolyline:true,getSteps:true,travelMode:nTravelMode,avoidHighways:bAvoidHighways});}});google.maps.Event.addListener(oDirections,'error',function(){if(oDirections.getStatus().code==G_GEO_UNKNOWN_ADDRESS)var erreur='Aucune position géographique ne peut être trouvée pour une des adresses spécifiées. Ceci peut être du au fait que cette adresse est nouvelle, ou peut être incorrecte. Code de l\'erreur : '+oDirections.getStatus().code;else if(oDirections.getStatus().code==G_GEO_SERVER_ERROR)var erreur='Une requête de géolocalisation n\'a pas pu être exécutée. Code de l\'erreur : '+oDirections.getStatus().code;else if(oDirections.getStatus().code==G_GEO_MISSING_QUERY)var erreur='Vous devez entrer une adresse de départ. Code de l\'erreur : '+oDirections.getStatus().code;else if(oDirections.getStatus().code==G_GEO_BAD_KEY)var erreur='La licence est invalide, veuillez vérifier l\'intégrité de la clé. Code de l\'erreur : '+oDirections.getStatus().code;else if(oDirections.getStatus().code==G_GEO_BAD_REQUEST)var erreur='Une requête de n\'a pas pu être exécutée. Code de l\'erreur : '+oDirections.getStatus().code;else var erreur='Une erreur inconnue est survenue. Essayez de préciser l\'adresse (ville, pays).';eForm.getElement('input[type=submit]').set({'disabled':false,'value':'Réessayer'});new Element('p',{'class':'error',text:erreur}).inject(eDirections.empty());});google.maps.Event.addListener(oDirections,'load',function(){oMap.clearOverlays();var sInfos='Itinéraire';if(nTravelMode==G_TRAVEL_MODE_WALKING)sInfos+=' à pied';else sInfos+=' en voiture';sInfos+=' de <em>'+oDirections.getGeocode(0).address+'</em> à <em>'+oDirections.getGeocode(oDirections.getNumRoutes()).address+'</em>';if(oDirections.getNumRoutes()==2)sInfos+=' en passant par <em>'+oDirections.getGeocode(1).address+'</em>';else if(oDirections.getNumRoutes()==3)sInfos+=' en passant par <em>'+oDirections.getGeocode(1).address+'</em> et <em>'+oDirections.getGeocode(2).address+'</em>';else if(oDirections.getNumRoutes()>3){sInfos+=' en passant par ';for(var i=1;i<oDirections.getNumRoutes()-2;i++)sInfos+='<em>'+oDirections.getGeocode(i).address+'</em>, ';sInfos+='<em>'+oDirections.getGeocode(oDirections.getNumRoutes()-2).address+'</em> et <em>'+oDirections.getGeocode(oDirections.getNumRoutes()-1).address+'</em>';}
sInfos+='.<br/>Distance totale : '+oDirections.getDistance().html+' (environ '+oDirections.getDuration().html+')';if(bAvoidHighways&&nTravelMode==G_TRAVEL_MODE_DRIVING)sInfos+=' en évitant les autoroutes';sInfos+='.<br/>'+oDirections.getCopyrightsHtml()+'.';eForm.inject(eDirections,'after').getElement('input[type=submit]').set({'disabled':false,'value':'Recalculer l\'itinéraire'});new Element('p',{html:sInfos,'class':'information'}).inject(eDirections.empty());if(nTravelMode==G_TRAVEL_MODE_WALKING)new Element('p',{'class':'warning','html':'Le calcul d\'itinéraires piétons est en bêta.<br/>Faites attention : cet itinéraire peut ne pas comporter de trottoirs, ni de voies piétonnes.'}).inject(eDirections);var eSteps=new Element('ul',{'class':'gmaps-steps'}).inject(eDirections);var i=0;oHover=new google.maps.Marker(new google.maps.LatLng(0,0),{icon:oIconStep});oMap.addOverlay(oHover);oHover.hide();aWaypoints.ends.each(function(end){end.marker.hide();});for(i=0;i<this.getNumRoutes();i++){var oRoute=this.getRoute(i);var eStep=new Element('li',{'class':'groute '+((i==0)?'start':'pause'),id:'groute-'+i,title:'Coordonnées GPS : '+oGPS.format(oRoute.getStep(0).getLatLng().lat(),true)+', '+oGPS.format(oRoute.getStep(0).getLatLng().lng(),false),html:'<strong>'+((i==0)?'Départ':'Arrêt')+' :</strong> '+oRoute.getStartGeocode().address+' <em><span class="distance">'+oRoute.getDistance().html+'</span> <span class="duration">environ '+oRoute.getDuration().html+'</span></em>'});eStep.oRoute=oRoute;eStep.addEvents({click:function(event){event=new Event(event).stop();oMap.showMapBlowup(oRoute.getStep(0).getLatLng());},mouseenter:function(event){this.addClass('hover');},mouseleave:function(event){this.removeClass('hover');}});eStep.injectInside(eSteps);var sNbSteps=oRoute.getNumSteps();for(var j=0;j<sNbSteps;j++){var oStep=oRoute.getStep(j);var eStep=new Element('li',{'class':'gstep '+(j%2==1?'alt':''),id:'gstep-'+j,title:'Coordonnées GPS : '+oGPS.format(oStep.getLatLng().lat(),true)+', '+oGPS.format(oStep.getLatLng().lng(),false),html:'<strong><span>Étape </span>'+(j+1)+'<span> :</span> </strong> '+oStep.getDescriptionHtml()+' <em><span class="distance">'+oStep.getDistance().html+'</span>'+(oStep.getDuration().seconds>60?' <span class="duration">'+oStep.getDuration().html+'</span>':'')+'</em>'});eStep.oStep=oStep;eStep.addEvents({click:function(event){event=new Event(event).stop();oMap.showMapBlowup(this.oStep.getLatLng());},mouseenter:function(event){this.addClass('hover');oHover.setPoint(this.oStep.getLatLng());oHover.show();},mouseleave:function(event){this.removeClass('hover');oHover.hide();}});if(j==0)eStep.addClass('first');else if(j==sNbSteps-1)eStep.addClass('last');eStep.inject(eSteps);}}
var eStep=new Element('li',{'class':'groute end',id:'groute-'+i,title:'Coordonnées GPS : '+oGPS.format(oRoute.getEndLatLng().lat(),true)+', '+oGPS.format(oRoute.getEndLatLng().lng(),false),html:'<strong>Arrivée :</strong> '+oRoute.getEndGeocode().address+' <em><span class="gps">Coordonnées GPS : '+oGPS.format(oRoute.getEndLatLng().lat(),true)+', '+oGPS.format(oRoute.getEndLatLng().lng(),false)+'</span></em>'});eStep.oRoute=oRoute;eStep.addEvents({click:function(event){event=new Event(event).stop();oMap.showMapBlowup(this.oRoute.getEndLatLng());},mouseenter:function(event){this.addClass('hover');},mouseleave:function(event){this.removeClass('hover');}});eStep.injectInside(eSteps);new Element('a',{'href':'#','text':'Imprimer l\'itinéraire','events':{'click':function(event){event.stop();window.print();}}}).inject(new Element('p',{'class':'print'}).inject(eDirections));});GEvent.addListener(oDirections,'addoverlay',function(){var oFirstMarker=oDirections.getMarker(0);oFirstMarker.hide();oFirstMarker=new google.maps.Marker(oFirstMarker.getPoint(),{icon:oIconStart});oMap.addOverlay(oFirstMarker);var oLastMarker=oDirections.getMarker(oDirections.getNumRoutes());oLastMarker.hide();oLastMarker=new google.maps.Marker(oLastMarker.getPoint(),{icon:oIconEnd});oMap.addOverlay(oLastMarker);});if(navigator.geolocation||(window.google&&google.gears))new Element('a',{'href':'#','text':'Essayer de déterminer ma position actuelle','class':'geolocation','events':{'click':function(event){event.stop();this.set('text','Localisation en cours...').addClass('loading').removeClass('error').removeClass('success');fGeolocation(function(position){this.set('text','Position localisée, recherche de l\'adresse...');var oLatLng=new google.maps.LatLng(position.coords.latitude,position.coords.longitude);eStartAddress.set('value',position.coords.latitude+','+position.coords.longitude);oGeocoder.getLocations(oLatLng,function(oResponse){if(oResponse&&oResponse.Status.code==200){eStartAddress.set('value',oResponse.Placemark[0].address+'@'+oResponse.Placemark[0].Point.coordinates[1]+','+oResponse.Placemark[0].Point.coordinates[0]);this.set('text','Adresse localisée, cliquez pour recommencer').removeClass('loading').addClass('success');}else this.set('text','Position localisée, cliquez pour recommencer').removeClass('loading').addClass('success');eForm.fireEvent('submit');}.bind(this));}.bind(this),function(error){var text='';switch(error.code){case error.UNKNOWN_ERROR:default:text='Erreur inconnue';break;case error.PERMISSION_DENIED:text='Permission non accordée';break;case error.POSITION_UNAVAILABLE:text='Position impossible à déterminer';break;case error.TIMEOUT:text='Requête trop longue';break;}
this.set('text',text+', cliquez pour réessayer').removeClass('loading').addClass('error');}.bind(this),{enableHighAccuracy:true});}}}).inject(eStartAddress.getParent(),'bottom');fGeolocation=function(fSuccess,fError,oOptions){if(navigator.geolocation)oGeolocation=navigator.geolocation.getCurrentPosition(fSuccess,fError,oOptions);else if(window.google&&google.gears){oGeolocation=google.gears.factory.create('beta.geolocation');if(oGeolocation.hasPermission||oGeolocation.getPermission('Penfeld','/img/penfeld-icon.png'))oGeolocation.getCurrentPosition(fSuccess,fError,oOptions);}else if(confirm('Votre navigateur ne permet pas de vous géolocaliser. Souhaitez-vous installer Google Gears ?'))window.location='http://gears.google.com/?action=install';}},'unload':function(){GUnload();}});var GPS=new Class({initialize:function(prec,card){if(prec)this.prec=prec;else this.prec=0;if(card)this.card=true;else this.card=false;},getCard:function(positive,lat){if(lat)return positive?"N":"S";else return positive?"E":"O";},formatToDegMinSec:function(value,lat){var prec=this.prec;var precMul=Math.pow(10,prec);var neg=value<0?true:false;if(neg)value=-value;var degs=Math.floor(value);value-=degs;value*=60;degs=degs.toString();if(neg&&!this.card)degs="-"+degs;var mins=Math.floor(value);value-=mins;value*=60;mins=mins.toString();var secs=value.toFixed(prec).toString();if(prec>0)prec++;while(degs.length<2)degs="0"+degs;while(mins.length<2)mins="0"+mins;while(secs.length<2+prec)secs=" "+secs;return degs+'°'+mins+"'"+secs+'"'+(this.card?this.getCard(!neg,lat):"");},formatToDegMin:function(value,lat){var prec=this.prec;var precMul=Math.pow(10,prec);var neg=value<0?true:false;if(neg)value=-value;var degs=Math.floor(value);value-=degs;value*=60;degs=degs.toString();if(neg&&!this.card)degs="-"+degs;var mins=value.toFixed(prec).toString();if(prec>0)prec++;while(degs.length<2)degs="0"+degs;while(mins.length<2+prec)mins="0"+mins;return degs+'°'+mins+"'"+(this.card?this.getCard(!neg,lat):"");},formatToDec:function(value,lat){var prec=this.prec;var precMul=Math.pow(10,prec);var neg=value<0?true:false;if(neg)value=-value;var degs=value.toFixed(prec).toString();if(neg&&!this.card)degs="-"+degs;if(prec>0)prec++;while(degs.length<3+prec)degs="0"+degs;return degs+'°'+(this.card?this.getCard(!neg,lat):"");},format:function(value,lat){return this.formatToDegMin(value,lat);}});