Index: main/plugin-cms/i18n/messages_en.xml
===================================================================
--- main/plugin-cms/i18n/messages_en.xml	(revision 42493)
+++ main/plugin-cms/i18n/messages_en.xml	(working copy)
@@ -32,6 +32,11 @@
     <message key="PLUGINS_CMS_SKIPBROWSERCOMPATIBILITYTEST_LABEL">Skip browser compatibility test</message>
     <message key="PLUGINS_CMS_SKIPBROWSERCOMPATIBILITYTEST_DESCRIPTION">By default (when false) the browser of the user is tested during its connection to the cms and the user redirected if its browser is not detected as compatible. Check this to remove this test. Beware, that this parameter only affects the normal connection to the cms contributor space.</message>
     
+    <message key="PLUGINS_CMS_APPLICATIONS_CONFIG_CATEGORY">Applications</message>
+    <message key="PLUGINS_CMS_GOOGLE_API_KEY_CONFIG_GROUP">Google Maps</message>
+    <message key="PLUGINS_CMS_GOOGLE_API_KEY">API key</message>
+    <message key="PLUGINS_CMS_GOOGLE_API_KEY_DESCRIPTION">Key that will be used to authenticate applications using the Google Maps API.</message>
+    
     <!-- +
         | DROITS
         + -->
@@ -65,6 +70,11 @@
     <message key="PLUGINS_CMS_RIGHTS_DELEGATE_RIGHTS_LABEL">Delegate rights</message>
     <message key="PLUGINS_CMS_RIGHTS_DELEGATE_RIGHTS_DESCRIPTION">Allows to delegate his own rights to a third person</message>
     
+    <!-- +
+         | GOOGLE MAPS API KEY
+         + -->
+    <message key="PLUGINS_CMS_GOOGLE_MAPS_GET_API_KEY_ERROR">An error has occurred while retrieving the Google Maps API key.</message>
+    
     <!--+
         | HISTORIQUE
         +-->
Index: main/plugin-cms/i18n/messages_fr.xml
===================================================================
--- main/plugin-cms/i18n/messages_fr.xml	(revision 42493)
+++ main/plugin-cms/i18n/messages_fr.xml	(working copy)
@@ -31,7 +31,12 @@
 
     <message key="PLUGINS_CMS_SKIPBROWSERCOMPATIBILITYTEST_LABEL">Ignorer le test du navigateur</message>
     <message key="PLUGINS_CMS_SKIPBROWSERCOMPATIBILITYTEST_DESCRIPTION">Par défaut (lorsque décoché) le navigateur de l'utilisateur est testé lors de sa connexion au cms et l'utilisateur est redirigé si son navigateur est non compatible. En cochant cette case ce test n'est plus effectué. Attention, ce paramètre n'est utilisé que lors d'une connexion normale au cms.</message>
-
+    
+    <message key="PLUGINS_CMS_APPLICATIONS_CONFIG_CATEGORY">Applications</message>
+    <message key="PLUGINS_CMS_GOOGLE_API_KEY_CONFIG_GROUP">Google Maps</message>
+    <message key="PLUGINS_CMS_GOOGLE_API_KEY">Clé d'API</message>
+    <message key="PLUGINS_CMS_GOOGLE_API_KEY_DESCRIPTION">Clé qui sera utilisée pour authentifier les applications utilisant l'API Google Maps.</message>
+    
     <!-- +
         | DROITS
         + -->
@@ -65,6 +70,12 @@
     <message key="PLUGINS_CMS_RIGHTS_DELEGATE_RIGHTS_LABEL">Déléguer ses droits</message>
     <message key="PLUGINS_CMS_RIGHTS_DELEGATE_RIGHTS_DESCRIPTION">Permet de déléguer ses droits à une tierce personne</message>
     
+    <!-- +
+         | GOOGLE MAPS API KEY
+         + -->
+    <message key="PLUGINS_CMS_GOOGLE_MAPS_GET_API_KEY_ERROR">Une erreur est survenue lors de la récupération de la clé d'API pour Google Maps.</message>
+         
+    
     <!--+
         | HISTORIQUE
         +-->
Index: main/plugin-cms/plugin.xml
===================================================================
--- main/plugin-cms/plugin.xml	(revision 42493)
+++ main/plugin-cms/plugin.xml	(working copy)
@@ -81,6 +81,16 @@
             <order>20</order>
             <widget>hour</widget>
         </param>
+        <param id="runtime.google-api-key" type="string">
+            <!-- 
+                This parameter stores the google maps API key to use in javascript applications (such as the geocode widget)
+             -->
+            <label i18n="true">PLUGINS_CMS_GOOGLE_API_KEY</label>
+            <description i18n="true">PLUGINS_CMS_GOOGLE_API_KEY_DESCRIPTION</description>
+            <category i18n="true">PLUGINS_CMS_APPLICATIONS_CONFIG_CATEGORY</category>
+            <group i18n="true">PLUGINS_CMS_GOOGLE_API_KEY_CONFIG_GROUP</group>
+             <order>1</order>
+         </param>
 	</config>
 
     <extension-points>
@@ -1148,6 +1158,10 @@
 	</feature>
 
 	<feature name="userinterface.content.widgets">
+	    <config>
+            <param-ref id="runtime.google-api-key"/>
+        </config>
+	
 		<extensions>
 			<extension id="org.ametys.cms.Widgets"
     				   point="org.ametys.cms.workspace.uitool.StaticFileImportsManager"
Index: main/plugin-cms/resources/js/org/ametys/cms/helper/ChooseLocation/LoadGoogleMaps.i18n.js
===================================================================
--- main/plugin-cms/resources/js/org/ametys/cms/helper/ChooseLocation/LoadGoogleMaps.i18n.js	(revision 42493)
+++ main/plugin-cms/resources/js/org/ametys/cms/helper/ChooseLocation/LoadGoogleMaps.i18n.js	(working copy)
@@ -26,7 +26,7 @@
  * @readonly
  * The GoogleMaps libs url
  */
-org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps.__GOOGLE_MAPS_URL = '//maps.googleapis.com/maps/api/js?sensor=false';
+org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps.__GOOGLE_MAPS_URL = '//maps.googleapis.com/maps/api/js';
 	
 /**
  * Load GoogleMap libs if needed then execute the callback function after loading
@@ -40,19 +40,50 @@
 	}
 	else
 	{
+		// Fetch the API key for google maps and load the script
+		org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._getAPIKey();
+		
 		this._callbackFn = callback;
-		this._loadScript();
 	}
 };
+
+
+/**
+ * @private
+ * Get the configured googled maps API key
+ */
+org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._getAPIKey = function()
+{
+	var serverMessage = new org.ametys.servercomm.ServerMessage('cms', 'google-api-key/get', {}, org.ametys.servercomm.ServerComm.PRIORITY_MAJOR, org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._getAPIKeyCb, this, null);
+	org.ametys.servercomm.ServerComm.getInstance().send(serverMessage);
+};
+
+/**
+ * @private
+ * Callback invoked once the api key is retrieved
+ * @param {Object} response the server's response
+ */
+org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._getAPIKeyCb = function(response)
+{
+	if (org.ametys.servercomm.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_CMS_GOOGLE_MAPS_GET_API_KEY_ERROR'/>", response, "org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps"))
+	{
+       return;
+	}
 	
+	org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._loadScript(response.selectNodes('ActionResult/apiKey')[0][org.ametys.servercomm.ServerComm.xmlTextContent]);
+};
+
 /**
  * @private
  * Load GoogleMap libs
+ * @param {String} apiKey the configured google map API key
  */
-org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._loadScript = function()
+org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._loadScript = function(apiKey)
 {
 	var baseUrl = (document.location.protocol == 'https:' ? 'https:' : 'http:') + this.__GOOGLE_MAPS_URL;
-	var url = baseUrl + '&amp;callback=org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._loadScriptCb';
+	var url = baseUrl + '?callback=org.ametys.cms.helper.ChooseLocation.LoadGoogleMaps._loadScriptCb';
+	url += apiKey ? '&amp;key=' + apiKey : '';
+	
 	Utils.loadScript(url, null);
 };
 	
Index: main/plugin-cms/sitemap.xmap
===================================================================
--- main/plugin-cms/sitemap.xmap	(revision 42493)
+++ main/plugin-cms/sitemap.xmap	(working copy)
@@ -830,6 +830,15 @@
                     <map:serialize type="xml"/>
                 </map:act>
             </map:match>
+            
+            <!-- Google maps API key -->
+            <map:match pattern="google-api-key/get">
+                <map:generate type="action-result">
+                    <map:parameter name="apiKey" value="{config:runtime.google-api-key}"/>
+                </map:generate>
+                <map:serialize type="xml"/>
+            </map:match>
+            
         </map:pipeline>
 	</map:pipelines>
 </map:sitemap>
