PDVSearch = function(){ var me = this; me.MIN_ZOOM = 14; me.COOKIE_NAME = "geoloc"; // définition des variables : me.gmap = null; // google Maps me.dmap = $("#pdv_map"); // div maps me.list = $("#pdv_list"); me.markers = new Array(); me.userPosition = null; me.searchPosition = null; me.onNearMeAcceptedCallbacks = new Array(); me.serviceCount = 0; me.onStartServicesCallbacks = new Array(); me.onStopServicesCallbacks = new Array(); me.onResultsCallback = new Array(); me.onNoResultsCallback = new Array(); /** * Constructuer * */ me.init = function( ) { me.initMap(); me.onNearMeAccepted( me.centerMapOn ); me.onGetfDefaultMapPosition(); } /** * récupération de la position par défault * * @return {} */ me.onGetfDefaultMapPosition = function( callback ) { var currentLocation = me.getGeolocCookie(); if( currentLocation ){ me.goToCurrentlocation( currentLocation.lat , currentLocation.lng ); } else if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function (position) { me.setGeolocCookie( position.coords.latitude , position.coords.longitude ); me.goToCurrentlocation( position.coords.latitude , position.coords.longitude ); }); } } me.goToCurrentlocation = function ( lat , lng ) { me.userPosition = new google.maps.LatLng(lat , lng); for( var i in me.onNearMeAcceptedCallbacks ){ me.onNearMeAcceptedCallbacks[i]( me.userPosition ); } } /** * initialise la map autour de defaultPosition * * @param {MapsLatLng} defaultPosition * */ me.initMap = function( defaultPosition ) { var myOptions = { zoom : me.MIN_ZOOM, center: new google.maps.LatLng( 48.856578 , 2.351828), maxZoom : 20 }; me.gmap = new google.maps.Map( document.getElementById("pdv_map") , myOptions); } /** * Centre la map autour d'une position * * @param {} position */ me.centerMapOn = function( position ) { me.gmap.setCenter( position ); } /** * Lance une recherche autour de l'adresse : * * @param {} adresse */ me.searchAddress = function( address ){ if( address.length > 0 ){ me.launchSearch( {type:'address' , address:address } ); } } /** * Lance une recherche autour de l'utilisateur : * * @return {[type]} [description] */ me.searchNearMe = function(){ if( me.userPosition ){ me.launchSearch( {type:'coords' , lat:me.userPosition.lat , lng:me.userPosition.lng } ); } } me.launchSearch = function( data ){ data.dist = $("[name=distance]").val(); data.productId = $("[name=product]").val(); data.skin = $("[name=skin]").val(); me.startService(); $.get( '/action-PDVSearchActions-search', data, me.onSearchResponse); } me.onSearchResponse = function( data ){ me.deleteMarkers(); $(data).find(".pdv").each(function(i,n) { n = $(n); var mapPoint = n.find(".map_point"); var listPoint = n.find(".list_point"); var id = n.attr("id"); var lat = mapPoint.attr("data-lat"); var lng = mapPoint.attr("data-lng"); if( lat && lat.length >0 && lng && lng.length>0 ){ me.addPoint( "id"+id , mapPoint.html() , lat , lng , listPoint); } }); me.initBounds(); me.endService(); me.doResultsActions(); } me.addPoint = function( id , content, lattitude, longitude , listPoint) { // création de la coordonnée : var latLng = new google.maps.LatLng( parseFloat(lattitude) , parseFloat(longitude) ); // création du marker var markerData = { position : latLng, map : me.gmap, id_marker : id, } // gestion de l'icone : content = $("
").append( content ); if( content.find('.markerIcon').length > 0 ) { markerData.icon = content.find('.markerIcon').attr("src"); content.find('.markerIcon').remove(); } content = content.html(); var marker = new google.maps.Marker(markerData); // contenu du marker : var infoWindow = new google.maps.InfoWindow({ content : content, position : latLng }); // sauvegarde du marker : me.markers[ id ] = new Array( marker , infoWindow ); // ajout à la liste listPoint.attr("linkId" , id); listPoint.mouseenter(function(){me.highlightAddress( $(this).attr("linkId") )}); listPoint.mouseleave(function(){me.unlightAddress( $(this).attr("linkId") )}); me.list.append( listPoint ); // gestion du comportement : google.maps.event.addListener(marker, 'click', function() { // selectAddress( marker.id_marker ); infoWindow.open( me.gmap , marker ); }); google.maps.event.addListener(marker, 'mouseover', function() { me.highlightAddress( marker.id_marker ); // predefinedMarkers[ marker.id_marker ][ 1 ].open( predefinedMap , predefinedMarkers[ marker.id_marker ][0] ); // setScrollList( marker.id_marker ); }); google.maps.event.addListener(marker, 'mouseout', function() { // if( $("address.selected").attr("id") != marker.id_marker ){ // markers[ marker.id_marker ][ 1 ].close( map , markers[ marker.id_marker ][0] ); // } me.unlightAddress( marker.id_marker ); }); } me.highlightAddress = function(id){ $("[linkId=" + id + "]").addClass( "selected" ); me.markers[id][1].open( me.gmap , me.markers[id][0]); } me.unlightAddress = function(id){ $("[linkId=" + id + "]").removeClass( "selected" ); me.markers[id][1].close( me.gmap , me.markers[id][0]); } me.initBounds = function() { if( me.getMarkersNumber() > 0 ){ // définitions du bounsd var points = []; for( var i in me.markers ){ latLng = new google.maps.LatLng( me.markers[i][0].position.lat() , me.markers[i][0].position.lng()); points.push( latLng ); } var bounds = new google.maps.LatLngBounds(); for(var j in points ){ bounds.extend(points[j]); } me.gmap.fitBounds( bounds ); if( me.getMarkersNumber() ==1 ){ me.gmap.setZoom(me.MIN_ZOOM); } } } me.getMarkersNumber = function() { var size = 0; for (var key in me.markers) { size++; } return size; } me.deleteMarkers = function(){ for( var i in me.markers ){ me.markers[i][0].setMap(null); delete(me.markers[i]); } me.list.empty(); } /** * Ajoute une callabck lorsuqe l'utilisateur a valider la géoloc * * @param function callback [description] * * @return {[type]} [description] */ me.onNearMeAccepted = function(callback){ if( isFunc( callback ) ){ me.onNearMeAcceptedCallbacks.push( callback ); } } me.onStartServices = function(callback){ if( isFunc( callback ) ){ me.onStartServicesCallbacks.push( callback ); } } me.onStopServices = function(callback){ if( isFunc( callback ) ){ me.onStopServicesCallbacks.push( callback ); } } me.startService = function(){ if( me.serviceCount==0 ){ for( var i in me.onStartServicesCallbacks ){ if( isFunc( me.onStartServicesCallbacks[i] ) ){ me.onStartServicesCallbacks[i](); } } } me.serviceCount++; } me.endService = function() { me.serviceCount--; if( me.serviceCount==0 ){ for( var i in me.onStopServicesCallbacks ){ if( isFunc( me.onStartServicesCallbacks[i] ) ){ me.onStopServicesCallbacks[i](); } } } } me.onResult = function(callback){ if( isFunc( callback ) ){ me.onResultsCallback.push( callback ); } } me.onNoResult = function(callback){ if( isFunc( callback ) ){ me.onNoResultsCallback.push( callback ); } } me.doResultsActions = function(){ var resultTab = me.getMarkersNumber() > 0 ? me.onResultsCallback :me.onNoResultsCallback; for( var i in resultTab ){ if( isFunc( resultTab[i] ) ){ resultTab[i](); } } } me.setGeolocCookie = function (lat , lng){ //on enregistre un cookie var date = new Date(); date.setTime(date.getTime()+(24*60*60*1000)); var expires = "; expires="+date.toGMTString(); document.cookie = me.COOKIE_NAME+"="+lat+"_"+lng+expires+"; path=/;"; console.log( me.COOKIE_NAME+"="+lat+"_"+lng+expires+"; path=/;" ); console.log(lat , lng); console.log(document.cookie); } me.getGeolocCookie = function (){ if( document.cookie.indexOf( me.COOKIE_NAME ) > -1 ){ var index = document.cookie.indexOf(me.COOKIE_NAME) + me.COOKIE_NAME.length +1; var position = document.cookie.substr( index, document.cookie.length-index ).split(";")[0].split("_"); return {lat: position[0] , lng: position[1] }; } return false; } } PDVSearchInstance = null; $( document ).ready( onDocumentReady ); function onDocumentReady() { PDVSearchInstance = new PDVSearch(); // recherche textuelle $("[name='addressSearch']").keypress( function(evt){ if(evt.keyCode == 13 ){ search(); evt.preventDefault(); return null; } } ); $("[name='addressSearchButton']").click( search ); function search(){ PDVSearchInstance.searchAddress( $("[name=addressSearch]").val() ); } // recherche autour de moi : $( ".show-only-if-user-geoloc" ).hide(); PDVSearchInstance.onNearMeAccepted(function(){ $( ".show-only-if-user-geoloc" ).show(); $( "[name='nearSearchButton']" ).click(function(){ PDVSearchInstance.searchNearMe( $("[name=citySearch]").val() ); }); }) // gestion des services : PDVSearchInstance.onStartServices(function(){ $(".pdv_search").addClass("searching"); }); PDVSearchInstance.onStopServices(function(){ $(".pdv_search").removeClass("searching"); }); // retour de recherche : PDVSearchInstance.onResult(function(){ $(".no_result").hide(); }); PDVSearchInstance.onNoResult(function(){ $(".no_result").show(); }); // initialisation de la carte : PDVSearchInstance.init(); } function isFunc( element ) { return 'function' == typeof element; }