Index: main/plugin-cms/plugin.xml =================================================================== --- main/plugin-cms/plugin.xml (revision 26911) +++ main/plugin-cms/plugin.xml (working copy) @@ -1140,7 +1140,7 @@ js/org/ametys/cms/widgets/GeocodeWidget.i18n.js js/org/ametys/cms/helper/ChooseLocation.i18n.js js/org/ametys/cms/helper/ChooseLocation/LoadGoogleMaps.i18n.js - js/org/ametys/cms/helper/GMapPanel.i18n.js + js/Ext/ux/GMapPanel3.i18n.js css/content/Widget.css Index: main/plugin-cms/i18n/messages_en.xml =================================================================== --- main/plugin-cms/i18n/messages_en.xml (revision 26911) +++ main/plugin-cms/i18n/messages_en.xml (working copy) @@ -1494,6 +1494,9 @@ There was a problem during the geocoding handling The address was not found + N + E + Index: main/plugin-cms/i18n/messages_fr.xml =================================================================== --- main/plugin-cms/i18n/messages_fr.xml (revision 26911) +++ main/plugin-cms/i18n/messages_fr.xml (working copy) @@ -1495,6 +1495,9 @@ Une erreur est survenue lors du traitement de votre demande L'adresse est introuvable + N + E + Index: main/plugin-cms/resources/js/org/ametys/cms/widgets/GeocodeWidget.i18n.js =================================================================== --- main/plugin-cms/resources/js/org/ametys/cms/widgets/GeocodeWidget.i18n.js (revision 26911) +++ main/plugin-cms/resources/js/org/ametys/cms/widgets/GeocodeWidget.i18n.js (working copy) @@ -23,7 +23,7 @@ * Creates a geocode widget field. * @class This class provides a widget to select a map location.<br> * @extends Ext.form.TextField - * @xtype GeocodeWidget + * @xtype geocodefield */ org.ametys.cms.widgets.GeocodeWidget = function(config) { @@ -42,7 +42,7 @@ * @static * The xtype */ -org.ametys.cms.widgets.GeocodeWidget.XTYPE = 'GeocodeWidget'; +org.ametys.cms.widgets.GeocodeWidget.XTYPE = 'geocodefield'; Ext.extend(org.ametys.cms.widgets.GeocodeWidget, Ext.form.TextField, { @@ -377,7 +377,8 @@ { if (location && location.latitude) { - return parseFloat(location.latitude).toFixed(4) + "°N , " + parseFloat(location.longitude).toFixed(4) + "°E"; + return parseFloat(location.latitude).toFixed(4) + "°" + "" + ", " + + parseFloat(location.longitude).toFixed(4) + "°" + ""; } else { Index: main/plugin-cms/resources/js/org/ametys/cms/helper/GMapPanel.i18n.js =================================================================== --- main/plugin-cms/resources/js/org/ametys/cms/helper/GMapPanel.i18n.js (revision 26911) +++ main/plugin-cms/resources/js/org/ametys/cms/helper/GMapPanel.i18n.js (working copy) @@ -1,759 +0,0 @@ -/* - * Copyright 2011 Anyware Services - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -Ext.namespace('Ext.ux'); - -Ext.ux.GMapPanel3 = Ext.extend(Ext.Panel, { - /** - * @cfg {Boolean} border - * Defaults to <tt>false</tt>. See {@link Ext.Panel}.<code>{@link Ext.Panel#border border}</code>. - */ - border: false, - - /** - * @cfg {Array} respErrors - * An array of msg/code pairs. - */ - respErrors: [{ - code: 'UNKNOWN_ERROR', - //msg: 'A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.' - msg : "" - },{ - code: 'ERROR', -// msg: 'There was a problem contacting the Google servers.' - msg: "" - },{ - code: 'ZERO_RESULTS', - //msg: 'The request did not encounter any errors but returns zero results.' - msg: "" - },{ - code: 'INVALID_REQUEST', - //msg: 'This request was invalid.' - msg: "" - },{ - code: 'REQUEST_DENIED', - //msg: 'The webpage is not allowed to use the geocoder for some reason.' - msg: "" - },{ - code: 'OVER_QUERY_LIMIT', - //msg: 'The webpage has gone over the requests limit in too short a period of time.' - msg: "" - }], - /** - * @cfg {Array} locationTypes - * An array of msg/code/level pairs. - */ - locationTypes: [{ - level: 4, - code: 'ROOFTOP', - msg: 'The returned result is a precise geocode for which we have location information accurate down to street address precision.' - },{ - level: 3, - code: 'RANGE_INTERPOLATED', - msg: 'The returned result reflects an approximation (usually on a road) interpolated between two precise points (such as intersections). Interpolated results are generally returned when rooftop geocodes are unavailable for a street address.' - },{ - level: 2, - code: 'GEOMETRIC_CENTER', - msg: 'The returned result is the geometric center of a result such as a polyline (for example, a street) or polygon (region).' - },{ - level: 1, - code: 'APPROXIMATE', - msg: 'The returned result is approximate.' - }], - /** - * @cfg {String} respErrorTitle - * Defaults to <tt>'Error'</tt>. - */ - respErrorTitle : 'Error', - /** - * @cfg {String} geoErrorMsgUnable - * Defaults to <tt>'Unable to Locate the Address you provided'</tt>. - */ - geoErrorMsgUnable : 'Unable to Locate the Address you provided', - /** - * @cfg {String} geoErrorTitle - * Defaults to <tt>'Address Location Error'</tt>. - */ - geoErrorTitle : 'Address Location Error', - /** - * @cfg {String} geoErrorMsgAccuracy - * Defaults to <tt>'The address provided has a low accuracy.<br><br>{0} Accuracy.'</tt>. - * <div class="mdetail-params"><ul> - * <li><b><code>ROOFTOP</code></b> : <div class="sub-desc"><p> - * The returned result is a precise geocode for which we have location information accurate down to street address precision. - * </p></div></li> - * <li><b><code>RANGE_INTERPOLATED</code></b> : <div class="sub-desc"><p> - * The returned result reflects an approximation (usually on a road) interpolated between two precise points (such as intersections). Interpolated results are generally returned when rooftop geocodes are unavailable for a street address. - * </p></div></li> - * <li><b><code>GEOMETRIC_CENTER</code></b> : <div class="sub-desc"><p> - * The returned result is the geometric center of a result such as a polyline (for example, a street) or polygon (region). - * </p></div></li> - * <li><b><code>APPROXIMATE</code></b> : <div class="sub-desc"><p> - * The returned result is approximate. - * </p></div></li> - * </ul></div> - */ - geoErrorMsgAccuracy : 'The address provided has a low accuracy.<br><br>"{0}" Accuracy.<br><br>{1}', - /** - * @cfg {String} gmapType - * The type of map to display, generic options available are: 'map', 'panorama'. - * Defaults to <tt>'map'</tt>. - * More specific maps can be used by specifying the google map type: - * <div class="mdetail-params"><ul> - * <li><b><code>G_NORMAL_MAP</code></b> : <div class="sub-desc"><p> - * Displays the default road map view - * </p></div></li> - * <li><b><code>G_SATELLITE_MAP</code></b> : <div class="sub-desc"><p> - * Displays Google Earth satellite images - * </p></div></li> - * <li><b><code>G_HYBRID_MAP</code></b> : <div class="sub-desc"><p> - * Displays a mixture of normal and satellite views - * </p></div></li> - * <li><b><code>G_DEFAULT_MAP_TYPES</code></b> : <div class="sub-desc"><p> - * Contains an array of the above three types, useful for iterative processing. - * </p></div></li> - * <li><b><code>G_PHYSICAL_MAP</code></b> : <div class="sub-desc"><p> - * Displays a physical map based on terrain information. - * </p></div></li> - * <li><b><code>G_MOON_ELEVATION_MAP</code></b> : <div class="sub-desc"><p> - * Displays a shaded terrain map of the surface of the Moon, color-coded by altitude. - * </p></div></li> - * <li><b><code>G_MOON_VISIBLE_MAP</code></b> : <div class="sub-desc"><p> - * Displays photographic imagery taken from orbit around the moon. - * </p></div></li> - * <li><b><code>G_MARS_ELEVATION_MAP</code></b> : <div class="sub-desc"><p> - * Displays a shaded terrain map of the surface of Mars, color-coded by altitude. - * </p></div></li> - * <li><b><code>G_MARS_VISIBLE_MAP</code></b> : <div class="sub-desc"><p> - * Displays photographs taken from orbit around Mars. - * </p></div></li> - * <li><b><code>G_MARS_INFRARED_MAP</code></b> : <div class="sub-desc"><p> - * Displays a shaded infrared map of the surface of Mars, where warmer areas appear brighter and colder areas appear darker. - * </p></div></li> - * <li><b><code>G_SKY_VISIBLE_MAP</code></b> : <div class="sub-desc"><p> - * Displays a mosaic of the sky, as seen from Earth, covering the full celestial sphere. - * </p></div></li> - * </ul></div> - * Sample usage: - * <pre><code> - * gmapType: G_MOON_VISIBLE_MAP - * </code></pre> - */ - gmapType : 'map', - /** - * @cfg {Object} setCenter - * The initial center location of the map. The map needs to be centered before it can be used. - * A marker is not required to be specified. - * More markers can be added to the map using the <code>{@link #markers}</code> array. - * For example: - * <pre><code> -setCenter: { - geoCodeAddr: '4 Yawkey Way, Boston, MA, 02215-3409, USA', - marker: {title: 'Fenway Park'} -}, - -// or just specify lat/long -setCenter: { - lat: 42.345573, - lng: -71.098326 -} - * </code></pre> - */ - /** - * @cfg {Number} zoomLevel - * The zoom level to initialize the map at, generally between 1 (whole planet) and 40 (street). - * Also used as the zoom level for panoramas, zero specifies no zoom at all. - * Defaults to <tt>3</tt>. - */ - zoomLevel: 3, - /** - * @cfg {Number} yaw - * The Yaw, or rotational direction of the users perspective in degrees. Only applies to panoramas. - * Defaults to <tt>180</tt>. - */ - yaw: 180, - /** - * @cfg {Number} pitch - * The pitch, or vertical direction of the users perspective in degrees. - * Defaults to <tt>0</tt> (straight ahead). Valid values are between +90 (straight up) and -90 (straight down). - */ - pitch: 0, - /** - * @cfg {Boolean} displayGeoErrors - * True to display geocoding errors to the end user via a message box. - * Defaults to <tt>false</tt>. - */ - displayGeoErrors: false, - /** - * @cfg {Boolean} minGeoAccuracy - * The level to display an accuracy error below. Defaults to <tt>ROOFTOP</tt>. For additional information - * see <a href="http://code.google.com/apis/maps/documentation/reference.html#GGeoAddressAccuracy">here</a>. - */ - minGeoAccuracy: 'APPROXIMATE', - /** - * @cfg {Object} mapOpts - * Object of options representing map option, a full list can be found - * <a href="http://code.google.com/intl/fr-FR/apis/maps/documentation/javascript/reference.html#MapOptions">here</a>. - * For example: - * <pre><code> - * mapOpts:{'mapTypeControl' : false, 'zoomControl' : true,} - * </code></pre> - */ - /** - * @cfg {Array} markers - * Markers may be added to the map. Instead of specifying <code>lat</code>/<code>lng</code>, - * geocoding can be specified via a <code>geoCodeAddr</code> string. - * For example: - * <pre><code> -markers: [{ - //lat: 42.339641, - //lng: -71.094224, - // instead of lat/lng: - geoCodeAddr: '465 Huntington Avenue, Boston, MA, 02215-5597, USA', - marker: {title: 'Boston Museum of Fine Arts'}, - listeners: { - click: function(e){ - Ext.Msg.alert('Its fine', 'and its art.'); - } - } -},{ - lat: 42.339419, - lng: -71.09077, - marker: {title: 'Northeastern University'} -}] - * </code></pre> - */ - // private - mapDefined: false, - // private - mapDefinedGMap: false, - initComponent : function(){ - - this.addEvents( - /** - * @event mapready - * Fires when the map is ready for interaction - * @param {GMapPanel} this - * @param {GMap} map - */ - 'mapready', - /** - * @event apiready - * Fires when the Google Maps API is loaded - */ - 'apiready' - ); - - Ext.applyIf(this,{ - markers: [], - cache: { - marker: [], - polyline: [], - polygon: [], - infowindow: [] - } - }); - - Ext.ux.GMapPanel3.superclass.initComponent.call(this); - - if (window.google && window.google.maps){ - this.on('afterrender', this.apiReady, this); - }else{ - window.gmapapiready = this.apiReady.createDelegate(this); - this.buildScriptTag('//maps.google.com/maps/api/js?sensor=false&callback=gmapapiready'); - } - - }, - apiReady: function() { - - if (this.rendered) - { - - if (!this.zoomLevel) - this.zoomLevel = 1; - - (function(){ - var mapOptions = { - zoom:this.zoomLevel, - mapTypeId: this.mapTypeId - }; - - if(this.mapOpts && typeof this.mapOpts === 'object'){ - Ext.applyIf(mapOptions, this.mapOpts); - } - - - if (this.gmapType === 'map'){ - this.gmap = new google.maps.Map(this.body.dom, mapOptions); - this.mapDefined = true; - this.mapDefinedGMap = true; - } - - if (this.gmapType === 'panorama'){ - this.gmap = new GStreetviewPanorama(this.body.dom); - this.mapDefined = true; - } - - if (!this.mapDefined && this.gmapType){ - this.gmap = new google.maps.Map(this.body.dom, mapOptions); - this.gmap.setMapTypeId(this.gmapType); - this.mapDefined = true; - this.mapDefinedGMap = true; - } - - google.maps.event.addListenerOnce(this.getMap(), 'tilesloaded', this.onMapReady.createDelegate(this)); - google.maps.event.addListener(this.getMap(), 'dragend', this.dragEnd.createDelegate(this)); - - if (typeof this.setCenter === 'object') { - if (typeof this.setCenter.geoCodeAddr === 'string'){ - if(this.setCenter.geoCodeAddr == 'currentLocation'){ - this.centerOnClientLocation(); - } - else { - this.geoCodeLookup(this.setCenter.geoCodeAddr, this.setCenter.marker, false, true, this.setCenter.listeners); - } - }else{ - if (this.gmapType === 'map'){ - var point = new google.maps.LatLng(this.setCenter.lat,this.setCenter.lng); - this.getMap().setCenter(point, this.zoomLevel); - this.lastCenter = point; - } - if (typeof this.setCenter.marker === 'object' && typeof point === 'object') { - this.addMarker(point, this.setCenter.marker, this.setCenter.marker.clear); - } - } - if (this.gmapType === 'panorama'){ - this.getMap().setLocationAndPOV(new google.maps.LatLng(this.setCenter.lat,this.setCenter.lng), {yaw: this.yaw, pitch: this.pitch, zoom: this.zoomLevel}); - } - } else { - //no center defined center on greenwitch - var point = new google.maps.LatLng(0.0,0.0); - this.zoomLevel = 1; - this.getMap().setCenter(point, this.zoomLevel); - this.lastCenter = point; - } - - }).defer(200,this); - - }else{ - this.on('afterrender', this.apiReady, this); - } - }, - // private - afterRender : function(){ - - var wh = this.ownerCt.getSize(); - Ext.applyIf(this, wh); - - Ext.ux.GMapPanel3.superclass.afterRender.call(this); - - }, - // private - buildScriptTag: function(filename, callback) { - var script = document.createElement('script'), - head = document.getElementsByTagName("head")[0]; - script.type = "text/javascript"; - script.src = filename; - - return head.appendChild(script); - }, - // private - onMapReady : function(){ - - this.addMarkers(this.markers); - - this.fireEvent('mapready', this, this.getMap()); - - }, - // private - onResize : function(w, h){ - - Ext.ux.GMapPanel3.superclass.onResize.call(this, w, h); - - // check for the existance of the google map in case the onResize fires too early - if (typeof this.getMap() == 'object') { - google.maps.event.trigger(this.getMap(), 'resize'); - if (this.lastCenter){ - this.getMap().setCenter(this.lastCenter, this.zoomLevel); - } - } - }, - // private - setSize : function(width, height, animate) { - - Ext.ux.GMapPanel3.superclass.setSize.call(this, width, height, animate); - - // check for the existance of the google map in case setSize is called too early - if (Ext.isObject(this.getMap())) { - google.maps.event.trigger(this.getMap(), 'resize'); - if (this.lastCenter){ - this.getMap().setCenter(this.lastCenter, this.zoomLevel); - } - } - - }, - // private - dragEnd: function(){ - this.lastCenter = this.getMap().getCenter(); - }, - /** - * Returns the current google map which can be used to call Google Maps API specific handlers. - * @return {GMap} this - */ - getMap : function(){ - - return this.gmap; - - }, - /** - * Returns the maps center as a GLatLng object - * @return {GLatLng} this - */ - getCenter : function(){ - - return this.getMap().getCenter(); - - }, - /** - * Returns the maps center as a simple object - * @return {Object} this has lat and lng properties only - */ - getCenterLatLng : function(){ - - var ll = this.getCenter(); - return {lat: ll.lat(), lng: ll.lng()}; - - }, - /** - * Creates markers from the array that is passed in. Each marker must consist of at least - * <code>lat</code> and <code>lng</code> properties or a <code>geoCodeAddr</code>. - * @param {Array} markers an array of marker objects - */ - addMarkers : function(markers) { - if (Ext.isArray(markers)){ - for (var i = 0; i < markers.length; i++) { - if (markers[i]) { - if (typeof markers[i].geoCodeAddr == 'string') { - this.geoCodeLookup(markers[i].geoCodeAddr, markers[i].marker, false, markers[i].setCenter, markers[i].listeners); - } else { - var mkr_point = new google.maps.LatLng(markers[i].lat, markers[i].lng); - this.addMarker(mkr_point, markers[i].marker, false, markers[i].setCenter, markers[i].listeners); - } - } - } - } - - }, - /** - * Creates a single marker. - * @param {Object} point a GLatLng point - * @param {Object} marker a marker object consisting of at least lat and lng - * @param {Boolean} clear clear other markers before creating this marker - * @param {Boolean} center true to center the map on this marker - * @param {Object} listeners a listeners config - */ - addMarker : function(point, marker, clear, center, listeners){ - - Ext.applyIf(marker,{}); - - if (clear === true){ - this.clearMarkers(); - } - if (center === true) { - this.getMap().setCenter(point, this.zoomLevel) - this.lastCenter = point; - } - - var mark = new google.maps.Marker(Ext.apply(marker, { - position: point - })); - - if (marker.infoWindow){ - this.createInfoWindow(marker.infoWindow, point, mark); - } - - this.cache.marker.push(mark); - mark.setMap(this.getMap()); - - if (typeof listeners === 'object'){ - for (evt in listeners) { - google.maps.event.addListener(mark, evt, listeners[evt]); - } - } - - return mark; - - }, - /** - * Creates a single polyline. - * @param {Array} points an array of polyline points - * @param {Object} linestyle an object defining the line style to use - */ - addPolyline : function(points, linestyle){ - - var plinepnts = new google.maps.MVCArray, pline, linestyle = linestyle ? linestyle : { - strokeColor: '#FF0000', - strokeOpacity: 1.0, - strokeWeight: 2 - }; - - Ext.each(points, function(point){ - plinepnts.push(new google.maps.LatLng(point.lat, point.lng)); - }, this); - - var pline = new google.maps.Polyline(Ext.apply({ - path: plinepnts - },linestyle)); - - this.cache.polyline.push(pline); - - pline.setMap(this.getMap()); - - }, - - /** - * Creates a single polygon. - * @param {Array} points an array of polygone points - * @param {Object} polygonOptions an object defining the style to use - */ - addPolygon : function(points, polygonOptions, listeners){ - var polygonPoints = new google.maps.MVCArray(); - - Ext.applyIf(polygonOptions,{ - strokeColor: '#FF0000', - strokeOpacity: 1.0, - strokeWeight: 2, - fillColor: "#FF0000", - fillOpacity: 0.4 - }); - - var latLng; - var bounds = new google.maps.LatLngBounds(); - Ext.each(points, function(point){ - latLng = new google.maps.LatLng(point.lat, point.lng) - polygonPoints.push(latLng); - bounds.extend(latLng); - }, this); - - var polygon = new google.maps.Polygon(Ext.apply({ - path: polygonPoints - }, polygonOptions)); - - - if (polygonOptions.infoWindow){ - this.createInfoWindow(polygonOptions.infoWindow, bounds.getCenter(), polygon); - } - - this.cache.polygon.push(polygon); - - polygon.setMap(this.getMap()); - - if (typeof listeners === 'object'){ - for (evt in listeners) { - google.maps.event.addListener(polygon, evt, listeners[evt]); - } - } - - return polygon; - - }, - - /** - * Creates an Info Window. - * @param {Object} inwin an Info Window configuration - * @param {GLatLng} point the point to show the Info Window at - * @param {GMarker} marker a marker to attach the Info Window to - */ - createInfoWindow : function(inwin, point, marker){ - - var me = this, infoWindow = new google.maps.InfoWindow({ - content: inwin.content, - position: point - }); - - if (marker) { - google.maps.event.addListener(marker, 'click', function(){ - me.hideAllInfoWindows(); - infoWindow.open(me.getMap()); - }); - } - - this.cache.infowindow.push(infoWindow); - - return infoWindow; - - }, - // private - hideAllInfoWindows : function(){ - for (var i = 0; i < this.cache.infowindow.length; i++) { - this.cache.infowindow[i].close(); - } - }, - // private - clearMarkers : function(){ - - this.hideAllInfoWindows(); - this.hideMarkers(); - - }, - // private - hideMarkers : function(){ - Ext.each(this.cache.marker, function(mrk){ - mrk.setMap(null); - }); - }, - // private - showMarkers : function(){ - Ext.each(this.cache.marker, function(mrk){ - mrk.setMap(this.getMap()); - },this); - }, - /** - * Looks up and address and optionally add a marker, center the map to this location, or - * clear other markers. Sample usage: - * <pre><code> -buttons: [ - { - text: 'Fenway Park', - handler: function(){ - var addr = '4 Yawkey Way, Boston, MA, 02215-3409, USA'; - Ext.getCmp('my_map').geoCodeLookup(addr, undefined, false, true, undefined); - } - },{ - text: 'Zoom Fenway Park', - handler: function(){ - Ext.getCmp('my_map').zoomLevel = 19; - var addr = '4 Yawkey Way, Boston, MA, 02215-3409, USA'; - Ext.getCmp('my_map').geoCodeLookup(addr, undefined, false, true, undefined); - } - },{ - text: 'Low Accuracy', - handler: function(){ - Ext.getCmp('my_map').geoCodeLookup('Paris, France', undefined, false, true, undefined); - } - },{ - - text: 'Bogus Address', - handler: function(){ - var addr = 'Some Fake, Address, For, Errors'; - Ext.getCmp('my_map').geoCodeLookup(addr, undefined, false, true, undefined); - } - } -] - * </code></pre> - * @param {String} addr the address to lookup. - * @param {Object} marker the marker to add (optional). - * @param {Boolean} clear clear other markers before creating this marker - * @param {Boolean} center true to set this point as the center of the map. - * @param {Object} listeners a listeners config - * @param {Boolean} adaptZoom true to set the zoom to position accuracy - */ - geoCodeLookup : function(addr, marker, clear, center, listeners, adaptZoom) { - - if (!this.geocoder) { - this.geocoder = new google.maps.Geocoder(); - } - this.geocoder.geocode({ - address: addr - }, this.addAddressToMap.createDelegate(this, [addr, marker, clear, center, listeners, adaptZoom], true)); - - }, - // private - centerOnClientLocation : function(){ - this.getClientLocation(function(loc){ - var point = new google.maps.LatLng(loc.latitude,loc.longitude); - this.getMap().setCenter(point, this.zoomLevel); - this.lastCenter = point; - }); - }, - // private - getClientLocation : function(fn, errorFn){ - if (!errorFn) { - errorFn = Ext.emptyFn; - } - if (!this.clientGeo) { - this.clientGeo = google.gears.factory.create('beta.geolocation'); - } - geo.getCurrentPosition(fn.createDelegate(this), errorFn); - }, - // private - addAddressToMap: function(response, status, addr, marker, clear, center, listeners, adaptZoom){ - if (!response || status !== 'OK') { - this.respErrorMsg(status); - } - else - { - var place = response[0].geometry.location, - accuracy = this.getLocationTypeInfo(response[0].geometry.location_type,'level'), - reqAccuracy = this.getLocationTypeInfo(this.minGeoAccuracy,'level'); - if (accuracy === 0) { - this.geoErrorMsg(this.geoErrorTitle, this.geoErrorMsgUnable); - }else{ - if (accuracy < reqAccuracy) { - this.geoErrorMsg(this.geoErrorTitle, String.format(this.geoErrorMsgAccuracy, response[0].geometry.location_type, this.getLocationTypeInfo(response[0].geometry.location_type,'msg'))); - }else{ - - if(adaptZoom){ - this.getMap().setZoom(accuracy*10); - this.zoomLevel = accuracy*8; - } - - point = new google.maps.LatLng(place.lat(),place.lng()); - if (center){ - this.getMap().setCenter(point, this.zoomLevel); - this.lastCenter = point; - } - if (marker && typeof marker === 'object') { - if (!marker.title){ - marker.title = response.formatted_address; - } - var mkr = this.addMarker(point, marker, clear, false, listeners); - if (marker.callback){ - marker.callback.call(this, mkr, point); - } - } - } - } - } - - }, - // private - geoErrorMsg : function(title,msg){ - if (this.displayGeoErrors) { - Ext.MessageBox.alert(title,msg); - } - }, - // private - respErrorMsg : function(code){ - Ext.each(this.respErrors, function(obj){ - if (code == obj.code){ - Ext.MessageBox.alert(this.respErrorTitle, obj.msg); - } - }, this); - }, - // private - getLocationTypeInfo: function(location_type,property){ - var val = 0; - Ext.each(this.locationTypes, function(itm){ - if (itm.code === location_type){ - val = itm[property]; - } - }); - return val; - } -}); - -Ext.reg('gmappanel', Ext.ux.GMapPanel3); Index: main/plugin-cms/resources/js/Ext/ux/GMapPanel3.i18n.js =================================================================== --- main/plugin-cms/resources/js/Ext/ux/GMapPanel3.i18n.js (revision 0) +++ main/plugin-cms/resources/js/Ext/ux/GMapPanel3.i18n.js (working copy) @@ -30,27 +30,27 @@ respErrors: [{ code: 'UNKNOWN_ERROR', //msg: 'A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.' - msg : "" + msg : "" },{ code: 'ERROR', // msg: 'There was a problem contacting the Google servers.' - msg: "" + msg: "" },{ code: 'ZERO_RESULTS', //msg: 'The request did not encounter any errors but returns zero results.' - msg: "" + msg: "" },{ code: 'INVALID_REQUEST', //msg: 'This request was invalid.' - msg: "" + msg: "" },{ code: 'REQUEST_DENIED', //msg: 'The webpage is not allowed to use the geocoder for some reason.' - msg: "" + msg: "" },{ code: 'OVER_QUERY_LIMIT', //msg: 'The webpage has gone over the requests limit in too short a period of time.' - msg: "" + msg: "" }], /** * @cfg {Array} locationTypes Property changes on: main\plugin-cms\resources\js\Ext\ux\GMapPanel3.i18n.js ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Index: main/plugin-cms/src/org/ametys/cms/workflow/EditContentFunction.java =================================================================== --- main/plugin-cms/src/org/ametys/cms/workflow/EditContentFunction.java (revision 26911) +++ main/plugin-cms/src/org/ametys/cms/workflow/EditContentFunction.java (working copy) @@ -796,6 +796,12 @@ geocodeValues[i] = Double.parseDouble(values[i]); i++; geocodeValues[i] = Double.parseDouble(values[i]); + + // TODO [Comment from LTE] Validate metadata. Need a DoubleValidator ?? + if (_validateMetadata(cType, metadataDefinition, metadataPath, allErrors, geocodeValues)) + { + form.setField(metadataName, geocodeValues); + } } catch (NumberFormatException e) { @@ -805,12 +811,6 @@ } } } - - // TODO [Comment from LTE] Validate metadata. Need a DoubleValidator ?? - if (_validateMetadata(cType, metadataDefinition, metadataPath, allErrors, geocodeValues)) - { - form.setField(metadataName, geocodeValues); - } } /** Index: main/plugin-cms/src/org/ametys/cms/lucene/MetadataIndexer.java =================================================================== --- main/plugin-cms/src/org/ametys/cms/lucene/MetadataIndexer.java (revision 26911) +++ main/plugin-cms/src/org/ametys/cms/lucene/MetadataIndexer.java (working copy) @@ -231,6 +231,9 @@ case DATETIME: // index only alone indexDateTimeMetadata(metadata, prefix, document, name, fieldName); break; + case GEOCODE: // index latitude and longitude + indexGeocodeMetadata(metadata, prefix, document, name, fieldName); + break; default: // do not index REFERENCE break; @@ -372,6 +375,39 @@ } /** + * Index a datetime metadata + * @param metadata + * @param prefix The path of parent metadata + * @param document + * @param name + * @param fieldName + */ + public void indexGeocodeMetadata(CompositeMetadata metadata, String prefix, Document document, String name, String fieldName) + { + CompositeMetadata values = metadata.getCompositeMetadata(name); + if (values != null) + { + if (values.hasMetadata("latitude") && values.hasMetadata("longitude")) + { + String latitude = values.getString("latitude"); + String longitude = values.getString("longitude"); + document.add(new Field(FieldNames.GEOCODE_COORDINATES, latitude + ',' + longitude, Store.YES, Index.NOT_ANALYZED)); + + document.add(new Field(prefix + fieldName + "$latitude", latitude, Store.YES, Index.NOT_ANALYZED)); + document.add(new Field(prefix + fieldName + "$longitude", longitude, Store.YES, Index.NOT_ANALYZED)); + + } + else + { + if (_logger.isWarnEnabled()) + { + _logger.warn("The geocode must contain 2 values."); + } + } + } + } + + /** * Index a file metadata * @param parentPath The path of parent metadata * @param metadata Index: main/plugin-cms/src/org/ametys/cms/lucene/FieldNames.java =================================================================== --- main/plugin-cms/src/org/ametys/cms/lucene/FieldNames.java (revision 26911) +++ main/plugin-cms/src/org/ametys/cms/lucene/FieldNames.java (working copy) @@ -44,4 +44,7 @@ public static final String MIME_TYPES = "mime-types"; /** The length of a resource. */ public static final String LENGTH = "length"; + + /** Coordinate field name (bound to geocode) */ + public static final String GEOCODE_COORDINATES = "geocode-coordinates"; } Index: main/plugin-cms/src/org/ametys/cms/contenttype/MetadataManager.java =================================================================== --- main/plugin-cms/src/org/ametys/cms/contenttype/MetadataManager.java (revision 26911) +++ main/plugin-cms/src/org/ametys/cms/contenttype/MetadataManager.java (working copy) @@ -514,33 +514,22 @@ CompositeMetadata values = metadata.getCompositeMetadata(metadataName); if (values != null) { - try + if (values.hasMetadata("latitude") && values.hasMetadata("longitude")) { - Double latitude = null; - Double longitude = null; - if (values.hasMetadata("latitude")) - { - latitude = values.getDouble("latitude"); - } - if (values.hasMetadata("longitude")) - { - longitude = values.getDouble("longitude"); - } - - if (longitude != null && latitude != null) - { - String[] latLng = new String[] {String.valueOf(latitude), String.valueOf(longitude)}; - - AttributesImpl attrs = new AttributesImpl(); - attrs.addCDATAAttribute("latitude", latLng[0]); - attrs.addCDATAAttribute("longitude", latLng[1]); - - XMLUtils.createElement(contentHandler, metadataName, attrs, StringUtils.join(latLng, ',')); - } + String[] latLng = new String[] {values.getString("latitude"), values.getString("longitude")}; + + AttributesImpl attrs = new AttributesImpl(); + attrs.addCDATAAttribute("latitude", latLng[0]); + attrs.addCDATAAttribute("longitude", latLng[1]); + + XMLUtils.createElement(contentHandler, metadataName, attrs, StringUtils.join(latLng, ',')); } - catch (ArrayIndexOutOfBoundsException e) + else { - getLogger().warn("The geocode must contain 2 values.", e); + if (getLogger().isWarnEnabled()) + { + getLogger().warn("The geocode must contain 2 values."); + } } } }