var infoWindow; var emajineMap = function(divmap) { this.divmap = divmap; infoWindow = new google.maps.InfoWindow; this.map = new google.maps.Map(document.getElementById(divmap)); this.map.setMapTypeId(google.maps.MapTypeId.TERRAIN); this.map.setOptions({zoom:8}); this.latlngbounds = new google.maps.LatLngBounds(); this.nbMarkers = 0; this.editableMarkers = {}; this.infowindows = []; this.pov = null; this.isStreetviewLoaded = false; this.currentEditSpot = null; this.currentEditSpotIsNew = false; google.maps.event.addListener(this.map, 'click', function() { infoWindow.close(); }); if (parent.googleMapBindEvents) { parent.googleMapBindEvents(this.map, google); } this.onInit(); }; emajineMap.prototype.onInit = function() { }; emajineMap.prototype.setInfowindowSize = function(infoWindow) { if ($('.googleMapBulle').width() > 100) { // on considère qu'une css est correctement appliquée sinon // on applique une taille par défault return; } $('.googleMapBulle, .gm-style-iw').css({ 'width':'250px', 'height':'150px', 'overflow-x': 'hidden', }); }; emajineMap.prototype.setAddLocationIconUrl = function(iconUrl) { this.addLocationIconUrl = iconUrl; }; emajineMap.prototype.getAddLocationIconUrl = function() { return this.addLocationIconUrl; }; emajineMap.prototype.setSize = function(width, height) { this.width = width; this.height = height; }; emajineMap.prototype.setPov = function(pov) { this.pov = pov; }; emajineMap.prototype.setFormUrlSpotAdd = function(formUrl) { this.formUrlSpotAdd = formUrl; }; emajineMap.prototype.setFormUrlSpotEdit = function(formUrl) { this.formUrlSpotEdit = formUrl; }; emajineMap.prototype.setMarkerEditable = function(marker, spotId) { var self = this; self.editableMarkers[spotId.toString()] = marker; google.maps.event.addListener(marker, 'click', function(event) { self.editMarker(spotId); }); if (!self.latlngbounds.contains(marker.getPosition())) { self.latlngbounds.extend(marker.getPosition()); } }; emajineMap.prototype.editMarker = function(spotId) { var self = this; $.getJSON('googlemap-json-' + spotId + '.html', function(data) { self.createFormPoint(self.editableMarkers[spotId.toString()], data, true); }); }; emajineMap.prototype.reverseGeoCode = function(address) { var self = this; if (address == '') { if (parent) { parent.simpleAlert("Information", "
Vous devez renseigner le champ adresse
", "fermer"); } return; } self.geocoder(address, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { self.map.setCenter(results[0].geometry.location); self.map.setZoom(15); } else if (parent) { parent.simpleAlert("Adresse inconnue", address, "fermer"); } }); }; emajineMap.prototype.geocoder = function(address, callback) { var geocoder = new google.maps.Geocoder(); geocoder.geocode({'address': address}, callback ); }; emajineMap.prototype.manualGeoCode = function(callback) { this.createFormPoint(this.map.getCenter(), {}, false, callback); }; emajineMap.prototype.openMarker = function(marker) { var position = marker.getPosition(); this.setPoint(position.lat(), position.lng()); this.setPointToCoord(); google.maps.event.trigger(marker, 'click'); } emajineMap.prototype.createFormPoint = function(coordOrMarker, values, isEdit, callback) { var self = this, isPaned = false, width = Math.round(this.width * 0.7, 0), infowindow = null; // créer ou modifie le point if (isEdit) { var marker = coordOrMarker; var coord = marker.getPosition(); marker.setDraggable(true); marker.setCursor('move'); } else { var coord = coordOrMarker; var marker = new google.maps.Marker({ map: self.map, position: coord, icon: self.getAddLocationIconUrl(), draggable: true, cursor: 'move' }); } var hidingInfo = google.maps.event.addListener(marker, 'dragstart', function(event) { infowindow.close(); }); var reCenter = google.maps.event.addListener(marker, 'dragend', function(event) { infowindow.open(self.map, marker); self.setInfowindowSize(infowindow); }); // créer l'infobulle infowindow = new google.maps.InfoWindow({ maxWidth: width }), content = '
' + '
' + '' + '

'+ '' + ''+ '

' + '

'+ '' + '' + '

' + '

' + 'Valider ' + 'Annuler' + '

' + '
' + '
'; // repositionne le point pour faire place à l'infobulle if (!isEdit) { google.maps.event.addListener(this.map, 'center_changed', function() { setTimeout(function() { if (!isPaned) { self.map.panBy(0, -40); isPaned = true; } }, 1000); }); } // action sur l'infobulle google.maps.event.addListener(infowindow, 'domready', function() { var content = $('#contentSpot'), nom = $('#spotName', content), desc = $('#spotDesc', content), ckeLink = $('label a', desc.parent()), iconCurrent = $('#spotIconCurrent', content), mainPanel = $('#spotMainPanel', content), btnValid = $('#spotBtnValid', content), btnCancel = $('#spotBtnCancel', content), advanced = parent.window.jQuery('#marquerIconSelector', parent.window.document), url = (isEdit) ? self.formUrlSpotEdit : self.formUrlSpotAdd; advanced.hide(); // rempli le formulaire avec les valeurs // sauf l'icone qui est chargée plus loin if (isEdit) { nom.val(values.nom); desc.val(values.description); url = url.replace('{spotId}', values.id); } // switch de layer dans l'infobulle var togglePanel = function(type) { advanced.toggle(); if (type == 'icon') { $('#divimarquer', advanced).show(); $('#divdescriptionspot', advanced).hide(); advanced.addClass('panelIconSelector').removeClass('panelCkEditor'); } else if (type == 'cke') { $('#divimarquer', advanced).hide(); $('#divdescriptionspot', advanced).show().find('.fck_preview').hide(); advanced.addClass('panelCkEditor').removeClass('panelIconSelector'); } else { } return false; }; // ferme l'infobulle var cancel = function() { advanced.hide(); infowindow.close(); infowindow.setMap(null); if (isEdit) { marker.setDraggable(false); marker.setCursor('normal'); marker.setPosition(coord); self.map.setCenter(coord); } else { marker.setMap(null); } self.currentEditSpot = null; // appelle la callback si elle existe if (typeof callback == 'function') { callback(); } return false; }; // post le formulaire var valid = function() { var inputIcon = $('#div_imarquer_selector .radio:checked', advanced).val(), inputCustom = $('#custom_imarquer', advanced).val(), coord = marker.getPosition(); var data = { 'icon': (inputCustom != '') ? inputCustom : inputIcon, 'spot': coord.lat() + '|' + coord.lng(), 'nom': nom.val(), 'descriptionSpot': desc.val() }; if (data.nom == '') { if (typeof parent.simpleAlert == 'function') { parent.simpleAlert("Information", "Veuillez entrer un nom", "fermer"); return false; } } else { // création ou mise à jour de spot $.post(url, data, function() { if (parent && parent.window != window) { var activeLayer = parent.window.jQuery('#iframe_contener', parent.window.document).parent().find('.active_tab a'); activeLayer.trigger('click'); } }); return cancel(); } }; iconCurrent.click(function() { togglePanel('icon'); }); ckeLink.click(function() { togglePanel('cke'); }); btnValid.click(valid); btnCancel.click(cancel); google.maps.event.addListener(infowindow, 'closeclick', cancel); // charge le selecteur d'icon via ajax // see: mods\Emajine_Ressources_Center_Spot::makeForm(); advanced.load(url, function() { $('#divspot', advanced).remove(); $('#divnom', advanced).remove(); $('#divdescriptionspot label', advanced).remove(); $('a.closeBox', advanced).unbind('click').click(function(e) { e.preventDefault(); e.stopPropagation(); var inputIcon = $('#div_imarquer_selector .radio:checked', advanced), inputCustom = $('#custom_imarquer', advanced); if (inputCustom.val() != '') { var icon = inputCustom.parent().find('.icon img').first(); } else { var icon = inputIcon.parent().find('img'); } iconCurrent.children().remove(); iconCurrent.append(icon.clone()); parent.window.CKEDITOR.instances['descriptionspot'].updateElement(); desc.val($('#descriptionspot', advanced).val()); togglePanel(); }).appendTo($('a.closeBox', advanced).closest('.wrap')); var antiDoubleAction = true; $('.pin', advanced).click(function() { if (!antiDoubleAction) { $('.delete', advanced).trigger('click'); $('a.closeBox', advanced).trigger('click'); } antiDoubleAction = ! antiDoubleAction; }); var c = $('div.formw', advanced).children(); iconCurrent.append(c.first().find('img').clone()); c.first().remove(); c.show(); }); }); // centre la carte sur le point et affiche l'infobulle (et masque les autres) self.closeAllInfowindow(); self.map.setCenter(coord); infowindow.setContent(content); infowindow.open(this.map, marker); self.infowindows.push(infowindow); self.setInfowindowSize(infowindow); // supprime l'edition précédante non validée si il y en a une if (self.currentEditSpot != null && self.currentEditSpotIsNew) { // supprime le spot précédent self.currentEditSpot.setMap(null); } // enregistre l'édition courante self.currentEditSpot = marker; self.currentEditSpotIsNew = !isEdit; }; emajineMap.prototype.setNewMarkerPosition = function(event, url) { var position = event.latLng; url += '&lat=' + position.lat() + '&lng=' + position.lng(); $.get(url); } emajineMap.prototype.closeAllInfowindow = function() { var i; for (i in this.infowindows) { if (this.infowindows[i]) { this.infowindows[i].close(); this.infowindows[i].setMap(null); this.infowindows[i] = null; } } }; // initialise les points du centre emajineMap.prototype.setPoint = function(latitude, longitude) { this.point = new google.maps.LatLng(latitude, longitude); // le centre de la carte (qui n'est pas un spot, // ne doit pas être utiliser pour centrer sur les spots) //this.latlngbounds.extend(this.point); }; emajineMap.prototype.setPointToUserLocation = function() { var self = this; if(navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { self.setPoint(position.coords.latitude, position.coords.longitude); self.setPointToCoord(); }, function() { // no geolocatisation }); } else { // no geolocatisation } }; emajineMap.prototype.setPointToCoord = function() { this.setCenter(); }; emajineMap.prototype.setPointToSpot = function() { this.setCenter(true); }; // initialise le zoom emajineMap.prototype.setZoom = function(zoom) { this.zoom = zoom; this.map.setOptions({zoom: zoom}); }; // creation du point centrale emajineMap.prototype.setCenter = function(ignorePoint) { if (ignorePoint || typeof this.point === 'undefined') { if (this.nbMarkers < 2) { this.map.setCenter(this.latlngbounds.getCenter(), this.zoom ? this.zoom : 1); } else { var maxZoom = this.map.getZoom(); this.map.fitBounds(this.latlngbounds); // si tous les marqueurs sont trop proche le niveau de zoom de la carte est // considéré comme le niveau de zoom maximum. if (this.map.getZoom() > maxZoom) { this.map.setZoom(maxZoom); } } } else { this.map.setCenter(this.point, this.zoom ? this.zoom : 8); } }; emajineMap.prototype.setType = function(type) { this.map.setMapTypeId(type); }; emajineMap.prototype.setStreetview = function(callback) { if (this.isStreetviewLoaded) { this.map.getStreetView().setVisible(true); if (callback) callback(true); return; } var self = this; zoom = this.map.getZoom(), stview = new google.maps.StreetViewService(), pano = this.map.getStreetView(), status = null; this.isStreetviewLoaded = true; stview.getPanoramaByLocation(this.map.getCenter(), 50, function(panoInfo, status) { if (status == google.maps.StreetViewStatus.OK) { pano.setPosition(panoInfo.location.latLng); pano.setZoom((zoom >= 1 && zoom <= 5) ? zoom : 3); var pov = self.pov.split('|'); pano.setPov({heading:parseFloat(pov[0], 10), pitch:parseFloat(pov[1], 10)}); pano.setVisible(true); if (callback) callback(true); google.maps.event.addListener(pano, 'closeclick', function() { self.setZoom(23); }); } else { self.isStreetviewLoaded = false; if (parent.alertStreetViewImpossible) { parent.alertStreetViewImpossible(); } if (callback) callback(false); } }); }; // Fixe les controles // @deprecated emajineMap.prototype.setControl = function(control) { return false; }; emajineMap.prototype.setZoomControl = function(control) { var options = {}; options.zoomControl = true; this.map.setOptions(options); }; emajineMap.prototype.setOptions = function(options) { this.map.setOptions(options); }; emajineMap.prototype.setGoogleBar = function(bool) { // Déprécié et supprimé en e-majine 1.9 }; emajineMap.prototype.setDefaultControl = function() { this.map.setOptions({keyboardShortcuts: true}); }; emajineMap.prototype.addTrafficLayer = function() { this.trafficLayer = new google.maps.TrafficLayer(); this.trafficLayer.setMap(this.map); }; emajineMap.prototype.addTransitLayer = function() { this.transitLayer = new google.maps.TransitLayer(); this.transitLayer.setMap(this.map); }; emajineMap.prototype.addWeatherLayer = function() { // supprimé en API 3.22 }; emajineMap.prototype.addBikeLayer = function() { this.bikeLayer = new google.maps.BicyclingLayer(); this.bikeLayer.setMap(this.map); }; emajineMap.prototype.addKmlLayer = function(file) { this.kmlLayer = new google.maps.KmlLayer({url: file}); this.kmlLayer.setMap(this.map); }; emajineMap.prototype.switchKmlLayer = function(file) { if (this.kmlLayer) { this.kmlLayer.setMap(null); this.kmlLayer = null; } this.addKmlLayer(file); } /****************************************************************************** * LIVE * ******************************************************************************/ emajineMap.prototype.liveMapMode = function(value, callback) { if (value == 'GM_MapMode_Street') { this.setStreetview(callback); } else { this.map.getStreetView().setVisible(false); } }; emajineMap.prototype.liveType = function(value) { switch(value) { case 'GM_Map_Normal' : this.map.setMapTypeId(google.maps.MapTypeId.ROADMAP); break; case 'GM_Map_Hybrid' : this.map.setMapTypeId(google.maps.MapTypeId.HYBRID); break; case 'GM_Map_Satellite' : this.map.setMapTypeId(google.maps.MapTypeId.SATELLITE); break; case 'GM_Map_Physical' : this.map.setMapTypeId(google.maps.MapTypeId.TERRAIN); break; } }; emajineMap.prototype.liveCenter = function(value) { switch (value) { case 'GM_MapCenter_Spot' : this.setPointToSpot(); break; case 'GM_MapCenter_User' : this.setPointToUserLocation(); break; case 'GM_MapCenter_Coord' : this.setPointToCoord(); break; } }; emajineMap.prototype.liveZoom = function(value) { this.map.setZoom(parseInt(value, 10)); }; emajineMap.prototype.liveStreetviewControl = function(value) { this.map.setOptions({'streetViewControl': value}); }; emajineMap.prototype.liveZoomControl = function(value) { // Supprimé en API 3.22 }; emajineMap.prototype.livePanControl = function(value) { // Supprimé en API 3.22 }; emajineMap.prototype.liveScaleControl = function(value) { this.map.setOptions({'scaleControl': value}); }; emajineMap.prototype.liveMapTypeControl = function(value) { switch(value) { case 'GM_MapTypeControl_Default' : value = google.maps.MapTypeControlStyle.DEFAULT; break; case 'GM_MapTypeControl_DropDownMenu' : value = google.maps.MapTypeControlStyle.DROPDOWN_MENU; break; case 'GM_MapTypeControl_HorizontalBar' : value = google.maps.MapTypeControlStyle.HORIZONTAL_BAR; break; } this.map.setOptions({'mapTypeControlOptions': {'style': value}}); }; emajineMap.prototype.liveOverviewControl = function(value) { // Supprimé en API 3.22 }; emajineMap.prototype.liveTraficLayer = function(value) { if (value) { this.addTrafficLayer(); } else { this.trafficLayer.setMap(null); } }; emajineMap.prototype.liveBuswayLayer = function(value) { if (value) { this.addTransitLayer(); } else { this.transitLayer.setMap(null); } }; emajineMap.prototype.liveMeteoLayer = function(value) { // Supprimé en API 3.22 }; emajineMap.prototype.liveBicycleLayer = function(value) { if (value) { this.addBikeLayer(); } else { this.bikeLayer.setMap(null); } }; emajineMap.prototype.liveKmlLayer = function(value) { if (!value) { this.kmlLayer.setMap(null); this.kmlLayer = null; } }; /******************************************************************************/ //initialisation de l'image du marker emajineMap.prototype.setIcon = function(icon) { this.tinyIcon = false; if (icon) { this.tinyIcon = {}; this.tinyIcon.url = icon; } }; // Creation d'un point emajineMap.prototype.getMarker = function (latitude, longitude, icon) { var marker = new google.maps.Marker(); marker.setMap(this.map); if (this.tinyIcon) { marker.setIcon(this.tinyIcon); } if (icon !== '') { marker.setIcon(icon); } latitude = parseFloat(latitude); longitude = parseFloat(longitude); if (!isNaN(latitude) && !isNaN(longitude)) { var point = new google.maps.LatLng(latitude, longitude); marker.setPosition(point); if (!this.latlngbounds.contains(point)) { this.latlngbounds.extend(point); } } return marker; }; //Decrepated emajineMap.prototype.getLabeledMarker = function (latitude,longitude,label) { var point = new google.maps.LatLng(latitude, longitude); if (!this.latlngbounds.contains(point)) { this.latlngbounds.extend(point); } return new StyledMarker({styleIcon: new StyledIcon(StyledIconTypes.MARKER,{text:label}), position: point, map: this.map, icon: this.tinyIcon}); }; //Ajout du layer sur le marker (infobulle) emajineMap.prototype.setMarker = function (marker,url) { var self = this; if(url) { google.maps.event.addListener(marker, "click", function () { marker = this; var coord = marker.getPosition(); infoWindow.setContent('
Please wait...
'); infoWindow.open(this.map, marker); google.maps.event.clearListeners(infoWindow, 'domready'); google.maps.event.addListener(infoWindow, 'domready', function() { displayFileContent(url, 'gMapWindowContent'); }); self.setInfowindowSize(infoWindow); }); } if (!this.latlngbounds.contains(marker.getPosition())) { this.latlngbounds.extend(marker.getPosition()); } this.nbMarkers ++; }; // layer pour afficher les coordonnées. emajineMap.prototype.afficheCoord = function (marker){ var coord = marker.getLatLng(); var coord1 = coord.lat(); var coord2 = coord.lng(); var info = 'Coordonnées :
Latitude : '+coord1+'
Longitude : '+coord2+'
'; infoWindow.setContent(info); infoWindow.open(this.map, marker); self.setInfowindowSize(infoWindow); }; //Itineraire : emajineMap.prototype.getDirection = function (divdirection) { document.getElementById(divdirection).innerHTML = ''; this.gdir = new google.maps.DirectionsService(); this.directionsDisplay = new google.maps.DirectionsRenderer({ 'map': this.map, 'preserveViewport': true, 'draggable': true }); this.directionsDisplay.setPanel(document.getElementById(divdirection)); var directionsDisplay = this.directionsDisplay; google.maps.event.addListener(this.directionsDisplay, 'directions_changed', function() { currentDirections = directionsDisplay.getDirections(); }); }; emajineMap.prototype.setDirections = function (fromAddress, toAddress, locale) { var request = { origin: fromAddress, destination: toAddress, travelMode: google.maps.DirectionsTravelMode.DRIVING }; var direction = this.directionsDisplay; var map = this.map; this.gdir.route(request, function(response, status) { if (status == google.maps.DirectionsStatus.OK) { direction.setDirections(response); map.fitBounds(response.routes[0].bounds); } }); }; emajineMap.prototype.loadJsonSpots = function(url) { var latlngbounds = this.latlngbounds; var defaultZoomLevel = this.zoom ? this.zoom : 1; var emajineMap = this; var map = this.map; var centerPoint = this.point; var nbSpot = this.nbMarkers $.get(url, function(datas) { datas = eval(datas); var len = datas.length; if (len>0) { for (var i = 0; i < len;i++) { if (typeof datas[i] != 'undefined') { emajineMap.setIcon(datas[i].icon); var m = emajineMap.getMarker(datas[i].latitude, datas[i].longitude, datas[i].icon); emajineMap.setMarker(m, datas[i].uri); nbSpot ++; } } } emajineMap.setPointToSpot(); return; }); }; var map, fieldId, mod, fieldHidden, fieldHtml, defCoord, _coord, _info, marker, mapOptions; function loadFieldMap(fieldID, mode) { fieldId = fieldID; mod = mode; fieldHidden = document.getElementById(fieldId + 'idhidden'); fieldHtml = document.getElementById(fieldId+'span'); defCoord = document.getElementById(fieldId+'idhidden').value; _coord='';// coordonnées sous la forme "latitude|longitude" _info='';// coordonnées sous la forme "Latitude : latitude Longitude : longitude" mapOptions=new Array(); if (mod=='address') { initGeocoder(fieldId); } else if(mod=='map') { initMap(defCoord); } else { initMap(defCoord); initGeocoder(fieldId, map); } mapOptions["map"]= map; return mapOptions; } function initGeocoder(fieldId, map) { var geo = document.getElementById("search" + fieldId); geo.onclick = function() { var geocoder = new google.maps.Geocoder(); var address = document.getElementById("adresse" + fieldId).value; if (address != '') { geocoder.geocode({'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { updateCoord(results[0].geometry.location); if (typeof map !== 'undefined') { initMarker(results[0].geometry.location); } } else { alert(address + " _not_found_"); } }); }else{ alert("_vous_devez_renseigner_le_champ_adresse_"); document.getElementById("adresse" + fieldId).focus(); } } } function updateCoord(location) { var lat = location.lat(); var lng = location.lng(); _coord = lat + '|' + lng; _info = "Latitude"+' : '+lat+" Longitude"+' : '+lng; updateFieldsMap(_coord, _info) } function displayFileContent(url, divID) { $.get(url, function(data) { $('#' + divID).html(data); }); } function updateFieldsMap(coordhidden, coordhtml) { if(fieldHidden) fieldHidden.value=coordhidden; if(fieldHtml) fieldHtml.innerHTML=coordhtml; } function initMap(defCoord) { map = new google.maps.Map(document.getElementById("map" + fieldId)); if(defCoord){ defCoord = defCoord.split('|'); var defPt = new google.maps.LatLng(defCoord[0], defCoord[1]); updateCoord(defPt); initMarker(defPt); }else{ //fixe le centre de la carte sur Paris map.setCenter(new google.maps.LatLng(46.80851951372989, 2.180614471435547), 5); } map.setZoom(5); map.setMapTypeId(google.maps.MapTypeId.ROADMAP); //affiche la barre latérale de navigation et le button [plan|satellite|mixte] var options = {}; options.zoomControl = true; options.zoomControlOptions = {style: google.maps.ZoomControlStyle.DEFAULT}; options.mapTypeControl = true; options.mapTypeControlOptions = {style: google.maps.MapTypeControlStyle.DEFAULT}; options.keyboardShortcuts = true; map.setOptions(options); google.maps.event.addListener(map, "click", function(point) { updateCoord(point.latLng); initMarker(point.latLng); }); } function initMarker(location) { map.setCenter(location); if (typeof marker !== 'undefined') { marker.setMap(null); } marker = new google.maps.Marker({ map: map, draggable: true, position: location }); google.maps.event.addListener(marker, 'dragend', function() { updateCoord(marker.getPosition()); map.setCenter(marker.getPosition()); }); } function initGmapContentIziMedia() { checkboxBeautiful(); }