r252624 - in tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap: . docs tecnoteca/googlemap tecnoteca/googlemap/browser tecnoteca/googlemap/content tecnoteca/googlemap/interfaces tecnoteca/googlemap/locales tecnoteca/googlemap/locales/en/LC_MESSAGES tecnoteca/googlemap/locales/fr tecnoteca/googlemap/locales/fr/LC_MESSAGES tecnoteca/googlemap/locales/it/LC_MESSAGES tecnoteca/googlemap/portlets tecnoteca/googlemap/profiles/default tecnoteca/googlemap/skins/TTGoogleMapCss tecnoteca/googlemap/skins/TTGoogleMapJS tecnoteca/googlemap/skins/TTGoogleMapScripts tecnoteca/googlemap/skins/TTGoogleMapViews

"Marco Celotti" <svn-changes-z4DKO/[email protected]> Wed, 9 Oct 2013 15:36:34 +0000 (UTC)
Newsgroups gmane.comp.web.zope.plone.collective.cvs
Message-ID <[email protected]>
Author: mcelotti
Date: Wed Oct  9 15:36:33 2013
New Revision: 252624

Added:
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/viewlet_ct_link.pt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/viewlets.py   (contents, props changed)
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/views.py   (contents, props changed)
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/views.py   (contents, props changed)
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/LC_MESSAGES/
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/LC_MESSAGES/tecnoteca.googlemap.mo   (contents, props changed)
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/LC_MESSAGES/tecnoteca.googlemap.po
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/profiles/default/tinymce.xml   (contents, props changed)
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/profiles/default/viewlets.xml   (contents, props changed)
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_widget_functions.js   (contents, props changed)
Removed:
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/egeoxml.js
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/pano_layer.js
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/pano_maptypecontrol.js
Modified:
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/HISTORY.txt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/INSTALL.txt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/README.txt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/setup.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/config.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/configure.zcml
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/controlpanel.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/config.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/configure.zcml
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemap.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategory.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategorycontainer.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategoryct.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapmarker.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolygon.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolyline.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/i18n.sh
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/ttgooglemap.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/en/LC_MESSAGES/tecnoteca.googlemap.mo
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/en/LC_MESSAGES/tecnoteca.googlemap.po
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/it/LC_MESSAGES/tecnoteca.googlemap.mo
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/it/LC_MESSAGES/tecnoteca.googlemap.po
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/tecnoteca.googlemap.pot
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/portlets/TTGeoReference.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/setuphandlers.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapCss/TTGoogleMapStyle.css.dtml
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_functions.js
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markerclusterer.js
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markermanager.js
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMain.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMarkers.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolygons.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolylines.py
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapMacro.pt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapView.pt
   tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMarkerView.pt
Log:
    - GoogleMaps API v3
    - Georeference custom ContentTypes
    - French translation (thanks André Nuyens)
	- Traffic, Bicycle, Weather, Street view buttons
	- Full width option

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/HISTORY.txt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/HISTORY.txt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/HISTORY.txt	Wed Oct  9 15:36:33 2013
@@ -1,6 +1,13 @@
 Changelog
 =========
 
+Tecnoteca Google Map 1.1 - October 8, 2013
+    - GoogleMaps API v3
+    - Georeference custom ContentTypes
+    - French translation (thanks André Nuyens)
+	- Traffic, Bicycle, Weather, Street view buttons
+	- Full width option
+
 Tecnoteca Google Map 1.0 - August 4, 2010
 	- Markers and categories boxes with customizable max-height
 	- Improved markers list (added categories titles)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/INSTALL.txt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/INSTALL.txt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/INSTALL.txt	Wed Oct  9 15:36:33 2013
@@ -56,7 +56,8 @@
 Additional informations
 --------------------------------
 - Dependencies 
-Plone 3, SmartColorWidget
+
+Plone 3 and 4, SmartColorWidget
 Plone 2 not supported
 
 - Google Maps API Key

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/README.txt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/README.txt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/docs/README.txt	Wed Oct  9 15:36:33 2013
@@ -1,8 +1,6 @@
-                   Tecnoteca GoogleMap Module for Plone 3
-
-                                 WARNING:
+Tecnoteca GoogleMap Module for Plone 3 and Plone 4
+---------------------------------------------------------------------------
 
-                           USE AT YOUR OWN RISK
 The Tecnoteca GoogleMap module and these instructions are distributed
 in the hope that they will be useful, but WITHOUT ANY WARRANTY;
 without even the implied warranty of MERCHANTABILITY
@@ -16,61 +14,106 @@
 
 **************************************************************************
 
-CONTENTS
----------------------------------------------------------------------------
-1. Module functions
-2. Module manufacturer 
-3. Installation
-
-
 
-1. Module functions
+Introduction
 ---------------------------------------------------------------------------
+This product lets you include Google Maps v3 in a Plone 3 / Plone 4 environment.
+The Tecnoteca GoogleMap module extends Plone with the capability to display different maps with macro-categories, categories, markers, paths and areas.
+Thanks to the Plone relations feature it's possible to define georeference from/to map markers and other Plone objects.
+You can also extend your custom content types (Archetypes) to add geolocalization attributes and then show your content types on the google map.
 
-This product lets you include google map service in a Plone 3 environment.
-The Tecnoteca GoogleMap module extends Plone 3 with the capability to display 
-different maps with macro-categories, categories, markers, paths and areas.
-Thanks to the Plone relations feature it's possible to define georeference 
-from/to map markers and other Plone objects.
+.. image:: http://www.tecnoteca.com/it/release/plone-google-map/immagini/TecnotecaGoogleMap.png/image_preview
 
-Features
 
-- Complete map definition (center,zoom,size,advanced controls,etc) for each map
+Features
+---------------------------------------------------------------------------
+- Plone 3 and Plone 4 compatibility
+- Complete map definition (center,zoom,size,advanced controls,traffic,panoramio,weather,bicycle,street view, etc)
 - Custom categories with custom icons and unlimited markers per category
 - Location widget to define markers' position
+- Georeference for custom content types (Archetypes), see section below
+- Georeference for plone pages, events, news, images etc
 - Custom paths
 - Custom areas
-- Georeference for plone pages, events, news, images etc
 - Portlet to show georeference relations
-- Panoramio photos
-- JQuery based interface
-- Italian and English localizations
+- Cache load option (@ram.cache)
+- Italian, English and French localizations
 
-Scenario
+**Scenario**
 
 You have a Plone site and you'd like to add several maps (culture, health, 
 transportation, etc) each one containing several categories (ie museums, 
 theaters, churches etc), and every category containing several markers 
 (ie museum n.1, museum n.2, museum n.3 etc).
+
 Moreover you'd like to link together the content page regarding the "museum n.1" 
 and the marker "museum n.1" you've defined in your map, so that a user reading 
 the content page could see where that specific museum is located.
+
+Also, you have your custom content types and you would like to extend them with 
+georeference feature so that you can show them on a google map.
+
 Finally, you'd like to highlight some areas of your city / territory (ie highlight 
 residential area) and highlight some paths (ie highlight streets or tourist routes).
 
 
+Usage
+---------------------------------------------------------------------------
+Once you've installed and configured the product you can create a google map object.
+Then, inside the google map object, you can create paths / areas / categories and, inside categories, markers.
+Important: you must publish categories / markers / paths / areas to show them on the map!
+
+Example:
+
+1. Add new >> Google Map
+2. (inside Google Map object) Add new >> Google Map Category
+3. (inside Google Map Category) Add new >> Google Map Marker
+4. **Publish your categories and markers in order to see them on the map**
+
+If you'd like to add the "related markers" portlet please use the Plone portlet manager ( http://path_to_your_installation/@@manage-portlets ).
+
 
-2. Module manufacturer
+Extend your custom content types (Archetype)
 ---------------------------------------------------------------------------
+1. Import:
 
-Tecnoteca srl
-via L'Aquila 1/B
-33010 Tavagnacco UD
-http://www.tecnoteca.com
+    **from tecnoteca.googlemap.content.ttgooglemapcoordinates import TTGoogleMapCoordinates,TTGoogleMapCoordinatesSchema**
+
+2. Extend schema:
+    schemata.ATContentTypeSchema.copy() + atapi.Schema((
+        ...
+
+    )) + **TTGoogleMapCoordinatesSchema.copy()**
+
+3. Extend class:
+    class MyContentType(base.ATCTContent, **TTGoogleMapCoordinates**):
 
+4. Done! Now your content type has the required georeference fields and you can edit your items to set location
+
+5. Add to your GoogleMap a new "Google Map Category Content Type" object to show your items on the map
+
+
+Requirements
+---------------------------------------------------------------------------
+- Plone 3 / 4
+- SmartColorWidget
 
 
-3. Installation
+Configuration
 ---------------------------------------------------------------------------
+Before creating a GoogleMap object please configure product parameters in plone control panel (http://path_to_your_installation/plone_control_panel).
 
-See docs/INSTALL.txt
\ No newline at end of file
+The google map api key can be generated here: http://code.google.com/apis/maps/signup.html
+
+
+Installation
+---------------------------------------------------------------------------
+Standard buildout installation, see docs/INSTALL.txt
+
+
+Author
+---------------------------------------------------------------------------
+Tecnoteca srl
+Via l'Aquila, 1/B
+33010 Tavagnacco UD
+http://www.tecnoteca.com
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/setup.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/setup.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/setup.py	Wed Oct  9 15:36:33 2013
@@ -39,7 +39,7 @@
       zip_safe=False,
       install_requires=['setuptools',
                         # -*- Extra requirements: -*-
-                        'Products.SmartColorWidget',
+                        'Products.SmartColorWidget>=1.1.5',
                         ],
       tests_require=tests_require,
       extras_require=dict(tests=tests_require),

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/config.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/config.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/config.py	Wed Oct  9 15:36:33 2013
@@ -1,6 +1,5 @@
 from zope.interface import implements
 from Products.Five.browser import BrowserView
-from Products.Five.formlib import formbase
 from tecnoteca.googlemap.config import *
 from tecnoteca.googlemap.interfaces.config import ITTGoogleMapConfig
 from tecnoteca.googlemap.validator import LocationFieldValidator

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/configure.zcml
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/configure.zcml	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/configure.zcml	Wed Oct  9 15:36:33 2013
@@ -3,17 +3,31 @@
     xmlns:browser="http://namespaces.zope.org/browser"
     i18n_domain="tecnoteca.googlemap">
 
-  <include package="plone.app.contentmenu" />
+    <include package="plone.app.contentmenu" />
 
-  <!-- -*- extra stuff goes here -*- -->  
-      
-  <adapter factory=".controlpanel.MapsControlPanelAdapter" />
-  
-  <browser:page
-  	  name="ttgooglemap_controlpanel"      
-      for="Products.CMFPlone.interfaces.IPloneSiteRoot"
-      class=".controlpanel.MapsControlPanel"
-      permission="cmf.ManagePortal"
-  />
-  
+    <adapter factory=".controlpanel.MapsControlPanelAdapter" />
+    
+    <!-- Control panel view -->
+    <browser:page
+        name="ttgooglemap_controlpanel"
+        for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+        class=".controlpanel.MapsControlPanel"
+        permission="cmf.ManagePortal" />
+        
+    <!-- Helper browser view -->
+    <browser:page
+		name="ttgooglemap_helpersview"
+		for="*"
+		class=".views.HelpersView"
+		allowed_attributes="customEscape getTitleHTML getDescriptionHTML getRelatedItemsHTML"
+		permission="zope2.Public" />
+    
+    <!-- The related-maps viewlet for CT objects -->
+    <browser:viewlet
+        name="plone.belowcontentbody.relatedmaps"
+        manager="plone.app.layout.viewlets.interfaces.IBelowContentBody"
+        class=".viewlets.CTLinkViewlet"
+        view="plone.app.layout.globals.interfaces.IViewView"
+        permission="zope2.View" />
+    
 </configure>
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/controlpanel.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/controlpanel.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/controlpanel.py	Wed Oct  9 15:36:33 2013
@@ -47,6 +47,11 @@
         description=_(u"Coordinates widget mapsize desc"),
         required=True)
     
+    markers_cache = Int(
+        title=_(u"Markers cache in seconds"),
+        description=_(u"Markers cache in seconds desc"),
+        required=False)
+    
     marker_icons = Tuple(
         title=_(u'Available icons'),
         description=_(u"Available icons desc"),
@@ -54,10 +59,6 @@
         required=True,
         value_type=TextLine())
     
-    markers_cache = Int(
-        title=_(u"Markers cache in seconds"),
-        description=_(u"Markers cache in seconds desc"),
-        required=False)
 
 
 class MapsControlPanelAdapter(SchemaAdapterBase):
@@ -93,7 +94,7 @@
     
     
     def get_default_mapsize(self):
-        return getattr(self.context,PROPERTY_DEFAULT_MAPSIZE,"400,550")
+        return getattr(self.context,PROPERTY_DEFAULT_MAPSIZE,"400,600")
 
     def set_default_mapsize(self, value):
         self.context._updateProperty(PROPERTY_DEFAULT_MAPSIZE, value)
@@ -104,13 +105,23 @@
    
 
     def get_widget_mapsize(self):
-        return getattr(self.context,PROPERTY_COORD_WIDGET_MAP_SIZE,"400,400")
+        return getattr(self.context,PROPERTY_COORD_WIDGET_MAP_SIZE,"400,550")
 
     def set_widget_mapsize(self, value):
         self.context._updateProperty(PROPERTY_COORD_WIDGET_MAP_SIZE, value)
 
     widget_mapsize = property(get_widget_mapsize,set_widget_mapsize)
-    
+
+
+
+    def get_markers_cache(self):
+        return getattr(self.context, PROPERTY_MARKERS_CACHE, '')
+
+    def set_markers_cache(self, value):
+        self.context._updateProperty(PROPERTY_MARKERS_CACHE, value)
+
+    markers_cache = property(get_markers_cache, set_markers_cache)   
+        
     
     
     def get_marker_icons(self):
@@ -120,16 +131,7 @@
         self.context._updateProperty(PROPERTY_MARKERS, value)
 
     marker_icons = property(get_marker_icons, set_marker_icons)    
-    
-    
-    
-    def get_markers_cache(self):
-        return getattr(self.context, PROPERTY_MARKERS_CACHE, '')
-
-    def set_markers_cache(self, value):
-        self.context._updateProperty(PROPERTY_MARKERS_CACHE, value)
-
-    markers_cache = property(get_markers_cache, set_markers_cache)    
+     
 
 
 

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/viewlet_ct_link.pt
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/viewlet_ct_link.pt	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,19 @@
+<div class="relatedItems relatedMaps"
+     i18n:domain="tecnoteca.googlemap"
+     tal:condition="view/show">
+    <div class="visualClear" id="clear-space-before-relatedMapBox"><!-- --></div>
+    <dl id="relatedMapBox">
+        <dt i18n:translate="label_related_maps">Maps</dt>
+        <tal:related repeat="item view/items">
+            <dd>
+                <img tal:attributes="title item/title;
+                                     alt item/title;
+                                     src string:${here/portal_url}/ttgooglemap_marker.png;" />
+                <a href="" class=""
+                   tal:attributes="href item/url;
+                                   title item/description;"
+                   tal:content="item/title">Related Maps</a>
+            </dd>
+        </tal:related>
+    </dl>
+</div>
\ No newline at end of file

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/viewlets.py
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/viewlets.py	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,44 @@
+from plone.app.layout.viewlets.common import ViewletBase
+from plone.memoize.view import memoize
+
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from Products.CMFCore.utils import getToolByName
+
+
+class CTLinkViewlet(ViewletBase):
+    """ Viewlet to show web links to google maps objects containing current content-type """
+    
+    render = ViewPageTemplateFile('viewlet_ct_link.pt')
+    
+    @property
+    def show(self):
+        if hasattr(self.context, "getCoordinates") and self.context.getCoordinates() and len(self.items()):
+            return True
+        return False
+    
+    @memoize
+    def items(self):
+        # create query
+        query = dict(gmap_category_objecttype = self.context.portal_type,
+                     sort_on = 'sortable_title')
+        # state
+        properties = getToolByName(self.context, 'portal_properties')
+        navtree_properties = getattr(properties, "navtree_properties")
+        if navtree_properties.getProperty("enable_wf_state_filtering", False):
+            query['review_state'] = navtree_properties.getProperty("wf_states_to_show", ())
+        # query catalog
+        catalog = getToolByName(self.context, 'portal_catalog')
+        brains = catalog(query)
+        # get site encoding
+        site_properties = getattr(properties, "site_properties")
+        encoding = site_properties.getProperty("default_charset", "utf-8")
+        # create list of dictionaries
+        items = list()
+        for brain in brains:
+            object = brain.getObject()
+            map = object.getParentMap()
+            if map is not None:
+                items.append(dict(title = map.Title().decode(encoding, "ignore"),
+                                  description = map.Description().decode(encoding, "ignore"),
+                                  url = "%s?mk=%s" % (map.absolute_url(), self.context.UID())))
+        return items
\ No newline at end of file

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/views.py
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/browser/views.py	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,70 @@
+from Products.Five.browser import BrowserView
+from AccessControl.SecurityInfo import ClassSecurityInfo
+from Products.CMFCore.permissions import View
+from zope.interface import implements
+from tecnoteca.googlemap.interfaces.views import IHelpersView
+from DateTime import DateTime
+
+class HelpersView(BrowserView):
+    """ Utility class """
+    
+    implements(IHelpersView)
+    
+    security = ClassSecurityInfo()
+    
+    security.declareProtected(View,'customEscape')
+    def customEscape(self, text):
+        text = text.replace('"','\\"')
+        text = text.replace("\r", "")
+        text = text.replace("\n", "")
+        text = unicode(text, errors='ignore')
+        return text    
+
+
+    security.declareProtected(View,'isGMContentType')
+    def isGMContentType(self, object):
+        """ tecnoteca.googlemap content-type """
+        return object.portal_type == 'TTGoogleMapMarker' \
+            or object.portal_type == 'TTGoogleMapPolygon' \
+            or object.portal_type == 'TTGoogleMapPolyline' 
+        
+    
+    security.declareProtected(View,'getTitleHTML')
+    def getTitleHTML(self, object):
+        output = "" 
+        if self.isGMContentType(object):
+            output += "<b>"+self.customEscape(object.Title())+"</b><br/>"
+        else: # other content-type obj
+            output += "<a href='"+object.absolute_url()+"'><b>"+self.customEscape(object.Title())+"</b></a><br/>"            
+        return output
+        
+
+                
+    security.declareProtected(View,'getDescriptionHTML')
+    def getDescriptionHTML(self, object):
+        output = ""
+        if self.isGMContentType(object) and hasattr(object, "getText"):
+            output = (self.customEscape(object.getText())).strip()            
+        else:
+            output = (self.customEscape(object.Description())).strip()
+        return output        
+ 
+    
+    security.declareProtected(View,'getRelatedItemsHTML')
+    def getRelatedItemsHTML(self, object):
+        output = ""        
+        if object.getRelatedItems() or object.getBRefs():
+            output += "<ul>"
+            for relation in object.getRelatedItems(): # A>B relation
+                if relation and (not hasattr(relation, 'getLanguage') or relation.getLanguage()==context.REQUEST.get("Language","it")) and relation.expires() > DateTime():
+                    output += "<li>"
+                    output += "<a href='"+relation.absolute_url()+"' title='"+self.customEscape(relation.Title())+"'>"+self.customEscape(relation.Title())+"</a>"
+                    output += "</li>"
+            for relation in object.getBRefs(): # B>A relation
+                if relation and relation.expires() > DateTime():
+                    output += "<li>"
+                    output += "<a href='"+relation.absolute_url()+"' title='"+self.customEscape(relation.pretty_title_or_id())+"'>"+self.customEscape(relation.pretty_title_or_id())+"</a>"
+                    output += "</li>"
+            output += "</ul>"
+        return output
+            
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/config.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/config.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/config.py	Wed Oct  9 15:36:33 2013
@@ -23,10 +23,10 @@
     'TTGoogleMap': 'tecnoteca.googlemap: Add TTGoogleMap',
 }
 
-PROPERTIES_LIST = [{'id' : PROPERTY_GOOGLE_KEYS, 'type' : 'lines', 'value' : ["http://localhost:8080 | localhost_googlemap_key"]},
-                   {'id' : PROPERTY_DEFAULT_LOCATION, 'type' : 'string', 'value' : '46.10262,13.20933'},
-                   {'id' : PROPERTY_DEFAULT_MAPSIZE, 'type' : 'string', 'value' : '400,550'},
-                   {'id' : PROPERTY_COORD_WIDGET_MAP_SIZE, 'type' : 'string', 'value' : '400,400'},
+PROPERTIES_LIST = [{'id' : PROPERTY_GOOGLE_KEYS, 'type' : 'lines', 'value' : ["http://localhost:8080 |","www.mydomain.com|google_map_key"]},
+                   {'id' : PROPERTY_DEFAULT_LOCATION, 'type' : 'string', 'value' : '46.10857,13.22452'},
+                   {'id' : PROPERTY_DEFAULT_MAPSIZE, 'type' : 'string', 'value' : '400,600'},
+                   {'id' : PROPERTY_COORD_WIDGET_MAP_SIZE, 'type' : 'string', 'value' : '400,450'},
                    {'id' : PROPERTY_MARKERS, 'type' : 'lines', 'value' : ["marker_accident.png|accident",\
                                                                         "marker_airplane-tourism.png|airplane-tourism",\
                                                                         "marker_ancientmonument.png|ancientmonument",\

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/configure.zcml
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/configure.zcml	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/configure.zcml	Wed Oct  9 15:36:33 2013
@@ -11,70 +11,42 @@
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMapPolygon"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMapPolygon"
-        />
   </class>
   <class class=".ttgooglemappolyline.TTGoogleMapPolyline">
     <require
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMapPolyline"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMapPolyline"
-        />
   </class>
   <class class=".ttgooglemapmarker.TTGoogleMapMarker">
     <require
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMapMarker"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMapMarker"
-        />
   </class>
   <class class=".ttgooglemapcategory.TTGoogleMapCategory">
     <require
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMapCategory"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMapCategory"
-        />
   </class>
   <class class=".ttgooglemapcategoryct.TTGoogleMapCategoryCT">
     <require
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMapCategory"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMapCategory"
-        />
   </class>
   <class class=".ttgooglemapcategorycontainer.TTGoogleMapCategoryContainer">
     <require
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMapCategoryContainer"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMapCategoryContainer"
-        />
   </class>
   <class class=".ttgooglemap.TTGoogleMap">
     <require
         permission="zope2.View"
         interface="..interfaces.ITTGoogleMap"
         />
-    <require
-        permission="cmf.ModifyPortalContent"
-        set_schema="..interfaces.ITTGoogleMap"
-        />
   </class>
 
 </configure>

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemap.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemap.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemap.py	Wed Oct  9 15:36:33 2013
@@ -12,6 +12,7 @@
     # No multilingual support
     from Products.Archetypes import atapi
 
+from Products.ATContentTypes.content import base
 from Products.ATContentTypes.content import folder
 from Products.ATContentTypes.content import schemata
 
@@ -46,6 +47,18 @@
         required=True,
         default_method = 'defaultWidth',
     ),
+    
+                                                                                                       
+    atapi.BooleanField(
+        'FullWidth',
+        storage=atapi.AnnotationStorage(),
+        languageIndependent = True,
+        widget=atapi.BooleanWidget(
+            label=_(u"FullWidth"),
+            description=_(u"Set map to full width (overrides MapWidth)"),
+        ),
+        default=True,
+    ),                                                                                                       
 
 
     atapi.IntegerField(
@@ -78,12 +91,15 @@
         'MapType',
         storage=atapi.AnnotationStorage(),
         languageIndependent = True,
-        vocabulary = [("G_NORMAL_MAP","Normal"),("G_SATELLITE_MAP","Satellite"),("G_HYBRID_MAP","Hybrid")],
+        vocabulary = [("google.maps.MapTypeId.ROADMAP","Normal"),
+                      ("google.maps.MapTypeId.SATELLITE","Satellite"),
+                      ("google.maps.MapTypeId.HYBRID","Hybrid"),
+                      ("google.maps.MapTypeId.TERRAIN","Terrain")],
         widget=atapi.SelectionWidget(
             label=_(u"Map Type"),
             description=_(u"Select default map type"),
         ),
-        default="G_NORMAL_MAP",
+        default="google.maps.MapTypeId.ROADMAP",
         required=True,
     ),
     
@@ -123,17 +139,57 @@
             label=_(u"Panoramio"),
             description=_(u"Show Panoramio button"),
         ),
-        default=True,
+        default=False,
     ),
+                                                                                                       
+                                                                                                       
+                                                                                                       
+    atapi.BooleanField(
+        'Weather',
+        storage=atapi.AnnotationStorage(),
+        languageIndependent = True,
+        widget=atapi.BooleanWidget(
+            label=_(u"Weather"),
+            description=_(u"Show weather button"),
+        ),
+        default=False,
+    ),
+                                                                                                       
+                                                                                                       
+                                                                                                       
+    atapi.BooleanField(
+        'Traffic',
+        storage=atapi.AnnotationStorage(),
+        languageIndependent = True,
+        widget=atapi.BooleanWidget(
+            label=_(u"Traffic"),
+            description=_(u"Show traffic button"),
+        ),
+        default=False,
+    ),  
+                                                                                                       
+                                                                                                       
+                                                                                                       
+    atapi.BooleanField(
+        'Bicycle',
+        storage=atapi.AnnotationStorage(),
+        languageIndependent = True,
+        widget=atapi.BooleanWidget(
+            label=_(u"Bicycle"),
+            description=_(u"Show bicycle button"),
+        ),
+        default=False,
+    ),  
+                                                                                                       
 
 
     atapi.BooleanField(
-        'LargeMapControl',
+        'StreetViewControl',
         storage=atapi.AnnotationStorage(),
         languageIndependent = True,
         widget=atapi.BooleanWidget(
-            label=_(u"Large Map Control"),
-            description=_(u"Large map control buttons"),
+            label=_(u"Street View Control"),
+            description=_(u"Street view map control button"),
         ),
         default=True,
     ),
@@ -204,6 +260,7 @@
 TTGoogleMapSchema['title'].storage = atapi.AnnotationStorage()
 TTGoogleMapSchema['description'].storage = atapi.AnnotationStorage()
 
+
 schemata.finalizeATCTSchema(
     TTGoogleMapSchema,
     folderish=True,
@@ -225,6 +282,8 @@
     Text = atapi.ATFieldProperty('Text')
 
     MapWidth = atapi.ATFieldProperty('MapWidth')
+    
+    FullWidth = atapi.ATFieldProperty('FullWidth')
 
     MapHeight = atapi.ATFieldProperty('MapHeight')
 
@@ -237,8 +296,14 @@
     MarkerBoxHeight = atapi.ATFieldProperty('MarkerBoxHeight')
 
     Panoramio = atapi.ATFieldProperty('Panoramio')
+    
+    Weather = atapi.ATFieldProperty('Weather')
+    
+    Traffic = atapi.ATFieldProperty('Traffic')
+    
+    Bicycle = atapi.ATFieldProperty('Bicycle')    
 
-    LargeMapControl = atapi.ATFieldProperty('LargeMapControl')
+    StreetViewControl = atapi.ATFieldProperty('StreetViewControl')
 
     MapTypeControl = atapi.ATFieldProperty('MapTypeControl')
 
@@ -281,6 +346,4 @@
         
         return vocabulary
 
-   
-
-atapi.registerType(TTGoogleMap, PROJECTNAME)
+base.registerATCT(TTGoogleMap, PROJECTNAME)
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategory.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategory.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategory.py	Wed Oct  9 15:36:33 2013
@@ -6,6 +6,7 @@
 
 from time import time
 from plone.memoize import ram
+from Products.CMFCore.interfaces._content import ISiteRoot
 
 try:
     from Products.LinguaPlone import public as atapi
@@ -13,11 +14,13 @@
     # No multilingual support
     from Products.Archetypes import atapi
 
+from Products.ATContentTypes.content import base
 from Products.ATContentTypes.content import folder
 from Products.ATContentTypes.content import schemata
 from Products.CMFCore.utils import getToolByName
 
 from tecnoteca.googlemap import googlemapMessageFactory as _
+from tecnoteca.googlemap.interfaces import ITTGoogleMap
 from tecnoteca.googlemap.interfaces import ITTGoogleMapCategory
 from tecnoteca.googlemap.config import *
 from tecnoteca.googlemap.browser.config import TTGoogleMapConfig
@@ -87,7 +90,7 @@
 )
 
 
-def markers_cachekay(method, self, **args):
+def markers_cachekey(method, self, **args):
     """
     Returns the key used by @ram.cache
     """
@@ -126,7 +129,17 @@
         config = getMultiAdapter((self, self.REQUEST), name="ttgooglemap_config")
         return config.marker_icons
     
-    @ram.cache(markers_cachekay)
+    def getParentMap(self, context = None):
+        if not context:
+            context = self.aq_inner
+        if ITTGoogleMap.providedBy(context):
+            return context
+        elif ISiteRoot.providedBy(context):
+            return None
+        else:
+            return self.getParentMap(context.aq_parent)
+    
+    @ram.cache(markers_cachekey)
     def getMarkers(self, **args):
         log('Query the catalog to get markers for TTGoogleMapCategory. Category: "%s"' % self.Title())
         filter={'portal_type':'TTGoogleMapMarker', 'review_state':'published'}
@@ -134,4 +147,4 @@
             filter = dict(filter.items() + args.items())            
         return self.getFolderContents(contentFilter=filter);
 
-atapi.registerType(TTGoogleMapCategory, PROJECTNAME)
+base.registerATCT(TTGoogleMapCategory, PROJECTNAME)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategorycontainer.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategorycontainer.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategorycontainer.py	Wed Oct  9 15:36:33 2013
@@ -9,6 +9,7 @@
     # No multilingual support
     from Products.Archetypes import atapi
 
+from Products.ATContentTypes.content import base
 from Products.ATContentTypes.content import folder
 from Products.ATContentTypes.content import schemata
 
@@ -47,4 +48,4 @@
 
     # -*- Your ATSchema to Python Property Bridges Here ... -*-
 
-atapi.registerType(TTGoogleMapCategoryContainer, PROJECTNAME)
+base.registerATCT(TTGoogleMapCategoryContainer, PROJECTNAME)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategoryct.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategoryct.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapcategoryct.py	Wed Oct  9 15:36:33 2013
@@ -21,7 +21,7 @@
 from tecnoteca.googlemap import googlemapMessageFactory as _
 from tecnoteca.googlemap.interfaces import ITTGoogleMapCategoryCT
 from tecnoteca.googlemap.config import *
-from tecnoteca.googlemap.content.ttgooglemapcategory import TTGoogleMapCategorySchema,TTGoogleMapCategory, markers_cachekay
+from tecnoteca.googlemap.content.ttgooglemapcategory import TTGoogleMapCategorySchema,TTGoogleMapCategory, markers_cachekey
 from tecnoteca.googlemap.browser.logger import log
 
 TTGoogleMapCategoryCTSchema = schemata.ATContentTypeSchema.copy() + atapi.Schema((
@@ -61,7 +61,11 @@
     # -*- Your ATSchema to Python Property Bridges Here ... -*-
     CType = atapi.ATFieldProperty('CType')
     
-    @ram.cache(markers_cachekay)
+    @property
+    def gmap_category_objecttype(self):
+        return self.getCType()
+    
+    @ram.cache(markers_cachekey)
     def getMarkers(self, **args):
         log('Query the catalog to get markers for TTGoogleMapCategoryCT. Content Type: "%s"' % self.getCType())
         catalog = getToolByName(self, 'portal_catalog')
@@ -71,4 +75,4 @@
         config = getMultiAdapter((self, self.REQUEST), name="ttgooglemap_config")
         return config.get_configured_content_types()
 
-atapi.registerType(TTGoogleMapCategoryCT, PROJECTNAME)
+base.registerATCT(TTGoogleMapCategoryCT, PROJECTNAME)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapmarker.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapmarker.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemapmarker.py	Wed Oct  9 15:36:33 2013
@@ -56,4 +56,4 @@
     # -*- Your ATSchema to Python Property Bridges Here ... -*-
     Text = atapi.ATFieldProperty('Text')    
 
-atapi.registerType(TTGoogleMapMarker, PROJECTNAME)
+base.registerATCT(TTGoogleMapMarker, PROJECTNAME)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolygon.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolygon.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolygon.py	Wed Oct  9 15:36:33 2013
@@ -18,6 +18,7 @@
 
 from Products.SmartColorWidget.Widget import SmartColorWidget
 
+
 TTGoogleMapPolygonSchema = schemata.ATContentTypeSchema.copy() + atapi.Schema((
 
     # -*- Your Archetypes field definitions here ... -*-
@@ -175,4 +176,4 @@
     NumLevels = atapi.ATFieldProperty('NumLevels')
 
 
-atapi.registerType(TTGoogleMapPolygon, PROJECTNAME)
+base.registerATCT(TTGoogleMapPolygon, PROJECTNAME)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolyline.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolyline.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/content/ttgooglemappolyline.py	Wed Oct  9 15:36:33 2013
@@ -133,18 +133,12 @@
 
     # -*- Your ATSchema to Python Property Bridges Here ... -*-
     Color = atapi.ATFieldProperty('Color')
-
     DefaultActive = atapi.ATFieldProperty('DefaultActive')
-
     Weight = atapi.ATFieldProperty('Weight')
-
     EncodedPolyline = atapi.ATFieldProperty('EncodedPolyline')
-
     Levels = atapi.ATFieldProperty('Levels')
-
     ZoomFactor = atapi.ATFieldProperty('ZoomFactor')
-
     NumLevels = atapi.ATFieldProperty('NumLevels')
 
 
-atapi.registerType(TTGoogleMapPolyline, PROJECTNAME)
+base.registerATCT(TTGoogleMapPolyline, PROJECTNAME)

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/i18n.sh
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/i18n.sh	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/i18n.sh	Wed Oct  9 15:36:33 2013
@@ -11,4 +11,4 @@
     if test -d $lang/LC_MESSAGES; then
         msgfmt -o $lang/LC_MESSAGES/${DOMAIN}.mo $lang/LC_MESSAGES/${DOMAIN}.po
     fi
-done
\ No newline at end of file
+done

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/ttgooglemap.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/ttgooglemap.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/ttgooglemap.py	Wed Oct  9 15:36:33 2013
@@ -6,89 +6,3 @@
 
 class ITTGoogleMap(Interface):
     """Google Map Object"""
-
-    # -*- schema definition goes here -*-
-    Text = schema.Text(
-        title=_(u"Text"),
-        required=False,
-        description=_(u"Text on top of the map"),
-    )
-#
-    MapWidth = schema.Int(
-        title=_(u"Map Width"),
-        required=True,
-        description=_(u"Map width (px)"),
-    )
-#
-    MapHeight = schema.Int(
-        title=_(u"Map Height"),
-        required=True,
-        description=_(u"Map height (px)"),
-    )
-#
-    ZoomLevel = schema.Int(
-        title=_(u"Zoom Level"),
-        required=True,
-        description=_(u"Default zoom level"),
-    )
-#
-    MapType = schema.TextLine(
-        title=_(u"Map Type"),
-        required=True,
-        description=_(u"Select default map type"),
-    )
-#    
-    CatBoxHeight = schema.Int(
-        title=_(u"Cat Box Height"),
-        required=True,
-        description=_(u"Cat box max-height"),
-    )
-#   
-    MarkerBoxHeight = schema.Int(
-        title=_(u"Marker Box Height"),
-        required=True,
-        description=_(u"Marker box max-height"),
-    )
-#
-    Panoramio = schema.Bool(
-        title=_(u"Panoramio"),
-        required=False,
-        description=_(u"Show Panoramio button"),
-    )
-#
-    LargeMapControl = schema.Bool(
-        title=_(u"Large Map Control"),
-        required=False,
-        description=_(u"Large map control buttons"),
-    )
-#
-    MapTypeControl = schema.Bool(
-        title=_(u"Map Type Control"),
-        required=False,
-        description=_(u"Show map type buttons"),
-    )
-#
-    OverviewMapControl = schema.Bool(
-        title=_(u"Overview Map Control"),
-        required=False,
-        description=_(u"Show the overview map"),
-    )
-#
-    OpenBoxes = schema.Bool(
-        title=_(u"OpenBoxes"),
-        required=False,
-        description=_(u"Open boxes"),
-    )
-#
-    Directions = schema.Bool(
-        title=_(u"Directions"),
-        required=False,
-        description=_(u"Show directions"),
-    )
-#
-    DefaultMarker = schema.Bool(
-        title=_(u"Default Marker"),
-        required=False,
-        description=_(u"Default marker startup"),
-    )
-#
\ No newline at end of file

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/views.py
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/interfaces/views.py	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,5 @@
+from zope.interface import Interface
+
+class IHelpersView(Interface):
+   """Browser view for offices.
+   """
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/en/LC_MESSAGES/tecnoteca.googlemap.mo
==============================================================================
Binary files. No diff available.

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/en/LC_MESSAGES/tecnoteca.googlemap.po
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/en/LC_MESSAGES/tecnoteca.googlemap.po	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/en/LC_MESSAGES/tecnoteca.googlemap.po	Wed Oct  9 15:36:33 2013
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: tecnoteca.googlemap\n"
-"POT-Creation-Date: 2011-07-27 09:58+0000\n"
+"POT-Creation-Date: 2013-10-09 14:38+0000\n"
 "PO-Revision-Date: 05/02/2010\n"
 "Last-Translator: Tecnoteca srl\n"
 "Language-Team: Tecnoteca srl\n"
@@ -15,25 +15,29 @@
 "Domain: tecnoteca.googlemap\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
 
-#: ./browser/controlpanel.py:51
+#: ./browser/controlpanel.py:56
 msgid "Available icons"
 msgstr "Available icons"
 
-#: ./browser/controlpanel.py:52
+#: ./browser/controlpanel.py:57
 msgid "Available icons desc"
 msgstr "Available marker icons"
 
-#: ./content/ttgooglemap.py:91
-#: ./interfaces/ttgooglemap.py:42
+#: ./content/ttgooglemap.py:178
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:56
+msgid "Bicycle"
+msgstr "Bicycle"
+
+#: ./content/ttgooglemap.py:112
 msgid "Cat Box Height"
 msgstr "Categories box max-height"
 
-#: ./content/ttgooglemap.py:92
-#: ./interfaces/ttgooglemap.py:44
+#: ./content/ttgooglemap.py:113
 msgid "Cat box max-height"
 msgstr "Max-height of the box before adding scrollbars"
 
-#: ./content/ttgooglemapcategory.py:30
+#: ./content/ttgooglemapcategory.py:38
 #: ./interfaces/ttgooglemapcategory.py:20
 msgid "Category icon"
 msgstr "Category icon"
@@ -46,35 +50,35 @@
 msgid "CategoryIcon"
 msgstr "Category icon"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:142
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:133
 msgid "City"
 msgstr "City"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:64
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:58
 msgid "Close panel"
 msgstr "close"
 
-#: ./content/ttgooglemapcategory.py:53
+#: ./content/ttgooglemapcategory.py:61
 msgid "Clusterer icon"
 msgstr "Clusterer icon"
 
-#: ./content/ttgooglemappolygon.py:25
-#: ./content/ttgooglemappolyline.py:25
+#: ./content/ttgooglemappolygon.py:31
+#: ./content/ttgooglemappolyline.py:30
 #: ./interfaces/ttgooglemappolygon.py:12
 msgid "Color"
 msgstr "Color"
 
-#: ./content/ttgooglemapcategoryct.py:31
+#: ./content/ttgooglemapcategoryct.py:36
 #: ./interfaces/ttgooglemapcategoryct.py:11
 msgid "Content type"
 msgstr "Content type"
 
-#: ./content/ttgooglemapcoordinates.py:21
+#: ./content/ttgooglemapcoordinates.py:26
 #: ./interfaces/ttgooglemapcoordinates.py:12
 msgid "Coordinates"
 msgstr "Coordinates"
 
-#: ./content/ttgooglemapcoordinates.py:22
+#: ./content/ttgooglemapcoordinates.py:27
 #: ./interfaces/ttgooglemapcoordinates.py:14
 msgid "Coordinates lat long"
 msgstr "Latitude and longitude values"
@@ -87,19 +91,18 @@
 msgid "Coordinates widget mapsize desc"
 msgstr "Widget mapsize (width,height px)"
 
-#: ./content/ttgooglemapcategory.py:42
+#: ./content/ttgooglemapcategory.py:50
 #: ./interfaces/ttgooglemapcategory.py:12
 msgid "Custom icon"
 msgstr "Custom icon"
 
-#: ./content/ttgooglemapcategory.py:64
-#: ./content/ttgooglemappolygon.py:37
-#: ./content/ttgooglemappolyline.py:38
+#: ./content/ttgooglemapcategory.py:72
+#: ./content/ttgooglemappolygon.py:43
+#: ./content/ttgooglemappolyline.py:43
 msgid "Default Active"
 msgstr "Default Active"
 
-#: ./content/ttgooglemap.py:188
-#: ./interfaces/ttgooglemap.py:90
+#: ./content/ttgooglemap.py:249
 msgid "Default Marker"
 msgstr "Default marker"
 
@@ -107,9 +110,9 @@
 msgid "Default active"
 msgstr "Default active"
 
-#: ./content/ttgooglemapcategory.py:65
-#: ./content/ttgooglemappolygon.py:38
-#: ./content/ttgooglemappolyline.py:39
+#: ./content/ttgooglemapcategory.py:73
+#: ./content/ttgooglemappolygon.py:44
+#: ./content/ttgooglemappolyline.py:44
 msgid "Default active at map start"
 msgstr "Default active at map start"
 
@@ -129,18 +132,15 @@
 msgid "Default mapsize desc"
 msgstr "Default mapsize for new map objects (width,height px)"
 
-#: ./content/ttgooglemap.py:189
-#: ./interfaces/ttgooglemap.py:92
+#: ./content/ttgooglemap.py:250
 msgid "Default marker startup"
 msgstr "Default marker at map startup"
 
-#: ./content/ttgooglemap.py:65
-#: ./interfaces/ttgooglemap.py:32
+#: ./content/ttgooglemap.py:83
 msgid "Default zoom level"
 msgstr "Default zoom level"
 
-#: ./content/ttgooglemap.py:176
-#: ./interfaces/ttgooglemap.py:84
+#: ./content/ttgooglemap.py:237
 msgid "Directions"
 msgstr "Directions"
 
@@ -152,14 +152,14 @@
 msgid "Disable coordinates"
 msgstr "Disable coordinates"
 
-#: ./content/ttgooglemappolygon.py:87
-#: ./content/ttgooglemappolyline.py:63
+#: ./content/ttgooglemappolygon.py:93
+#: ./content/ttgooglemappolyline.py:68
 #: ./interfaces/ttgooglemappolygon.py:36
 msgid "Encoded Polyline"
 msgstr "Encoded Polyline"
 
-#: ./content/ttgooglemappolygon.py:100
-#: ./content/ttgooglemappolyline.py:76
+#: ./content/ttgooglemappolygon.py:106
+#: ./content/ttgooglemappolyline.py:81
 #: ./interfaces/ttgooglemappolygon.py:44
 msgid "Encoded levels"
 msgstr "Encoded levels - <a href='http://code.google.com/apis/maps/documentation/polylineutility.html' target='_blank'>click here</a> to get the encoded levels"
@@ -169,113 +169,135 @@
 msgid "Encoded polyline"
 msgstr "Encoded polyline"
 
-#: ./content/ttgooglemappolygon.py:88
-#: ./content/ttgooglemappolyline.py:64
+#: ./content/ttgooglemappolygon.py:94
+#: ./content/ttgooglemappolyline.py:69
 msgid "Encoded polyline value"
 msgstr "Encoded polyline - <a href='http://code.google.com/apis/maps/documentation/polylineutility.html' target='_blank'>click here</a> to get the encoded polyline"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:90
 #. Default: "Categories"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:84
 msgid "Frontend Categories"
 msgstr "Categories"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:105
 #. Default: "Markers"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:99
 msgid "Frontend Markers"
 msgstr "Markers"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:119
 #. Default: "JavaScript must be enabled in order for you to use Google Maps.However, it seems JavaScript is either disabled or not supported by your browser. To view Google Maps, enable JavaScript by changing your browser options, and then try again."
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:113
 msgid "Frontend NoJavascript"
 msgstr "JavaScript must be enabled in order for you to use Google Maps. However, it seems JavaScript is either disabled or not supported by your browser. To view Google Maps, enable JavaScript by changing your browser options, and then try again."
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:62
 #. Default: "Areas"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:56
 msgid "Frontend Polygons"
 msgstr "Areas"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:76
 #. Default: "Paths"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:70
 msgid "Frontend Polylines"
 msgstr "Paths"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./content/ttgooglemap.py:57
+msgid "FullWidth"
+msgstr "Full width"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:77
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:79
 msgid "G_GEO_BAD_KEY"
 msgstr "The given key is either invalid or does not match the domain for which it was given."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:47
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:70
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:72
 msgid "G_GEO_BAD_REQUEST"
 msgstr "A directions request could not be successfully parsed. For example, the request may have been rejected if it contained more than the maximum number of waypoints allowed."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:50
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:73
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:75
 msgid "G_GEO_MISSING_ADDRESS"
 msgstr "The HTTP q parameter was either missing or had no value. For geocoding requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:72
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:74
 msgid "G_GEO_MISSING_QUERY"
 msgstr "The HTTP q parameter was either missing or had no value. For geocoding requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:48
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:71
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:73
 msgid "G_GEO_SERVER_ERROR"
 msgstr "A geocoding, directions or maximum zoom level request could not be successfully processed, yet the exact reason for the failure is not known."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:46
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:69
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:71
 msgid "G_GEO_SUCCESS"
 msgstr "No errors occurred; the address was successfully parsed and its geocode has been returned."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:55
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:78
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:80
 msgid "G_GEO_TOO_MANY_QUERIES"
 msgstr "The given key has gone over the requests limit in the 24 hour period or has submitted too many requests in too short a period of time. If you re sending multiple requests in parallel or in a tight loop, use a timer or pause in your code to make sure you dont send the requests too quickly."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:52
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:75
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:77
 msgid "G_GEO_UNAVAILABLE_ADDRESS"
 msgstr "The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:51
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:27
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:74
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:76
 msgid "G_GEO_UNKNOWN_ADDRESS"
 msgstr "No corresponding geographic location could be found for the specified address. This may be due to the fact that the address is relatively new, or it may be incorrect."
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:53
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:76
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:78
 msgid "G_GEO_UNKNOWN_DIRECTIONS"
 msgstr "The GDirections object could not compute directions between the points mentioned in the query. This is usually because there is no route available between the two points, or because we do not have data for routing in that region."
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:159
-msgid "Get directions btn"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:150
+msgid "Get directions"
 msgstr "Get directions"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:136
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:127
 msgid "Get directions from"
-msgstr "Get directions"
+msgstr "Get directions from"
 
 #. Default: "Google Map Category"
+#: ./profiles/default/types/TTGoogleMapCategory.xml
 msgid "Google Map Category"
 msgstr "Google Map Category"
 
 #. Default: "Google Map Category Container"
+#: ./profiles/default/types/TTGoogleMapCategoryContainer.xml
 msgid "Google Map Category Container"
 msgstr "Google Map Category Container"
 
 #. Default: "Google Map Category Content Type"
+#: ./profiles/default/types/TTGoogleMapCategoryCT.xml
 msgid "Google Map Category Content Type"
 msgstr "Google Map Category Content Type"
 
 #. Default: "Google Map Marker"
+#: ./profiles/default/types/TTGoogleMapMarker.xml
 msgid "Google Map Marker"
 msgstr "Google Map Marker"
 
 #. Default: "Google Map Object"
+#: ./profiles/default/types/TTGoogleMap.xml
 msgid "Google Map Object"
 msgstr "Google Map Object"
 
 #. Default: "Google Map Polygon"
+#: ./profiles/default/types/TTGoogleMapPolygon.xml
 msgid "Google Map Polygon"
 msgstr "Google Map Polygon"
 
 #. Default: "Google Map Polyline"
+#: ./profiles/default/types/TTGoogleMapPolyline.xml
 msgid "Google Map Polyline"
 msgstr "Google Map Polyline"
 
-#: ./portlets/TTGeoReference.py:25
+#: ./portlets/TTGeoReference.py:27
 msgid "Google Map related markers"
 msgstr "Google Map related markers"
 
@@ -287,7 +309,7 @@
 msgid "GoogleMap api keys desc"
 msgstr "List of URLS and related google keys"
 
-#: ./content/ttgooglemapcategory.py:29
+#: ./content/ttgooglemapcategory.py:37
 msgid "Icon"
 msgstr "Icon"
 
@@ -295,94 +317,76 @@
 msgid "Items in relation with marker"
 msgstr "Items in relation with marker"
 
-#: ./content/ttgooglemap.py:130
-#: ./interfaces/ttgooglemap.py:60
-msgid "Large Map Control"
-msgstr "Large map control"
-
-#: ./content/ttgooglemap.py:131
-#: ./interfaces/ttgooglemap.py:62
-msgid "Large map control buttons"
-msgstr "Large map control buttons"
-
-#: ./content/ttgooglemappolygon.py:99
-#: ./content/ttgooglemappolyline.py:75
+#: ./content/ttgooglemappolygon.py:105
+#: ./content/ttgooglemappolyline.py:80
 #: ./interfaces/ttgooglemappolygon.py:42
 msgid "Levels"
 msgstr "Levels"
 
-#: ./content/ttgooglemappolygon.py:75
-#: ./content/ttgooglemappolyline.py:51
+#: ./content/ttgooglemappolygon.py:81
+#: ./content/ttgooglemappolyline.py:56
 #: ./interfaces/ttgooglemappolygon.py:32
 msgid "Line thickness (px)"
 msgstr "Line thickness (px)"
 
-#: ./content/ttgooglemap.py:51
-#: ./interfaces/ttgooglemap.py:24
+#: ./content/ttgooglemap.py:69
 msgid "Map Height"
 msgstr "Map height"
 
-#: ./content/ttgooglemap.py:78
-#: ./interfaces/ttgooglemap.py:36
+#: ./content/ttgooglemap.py:99
 msgid "Map Type"
 msgstr "Map type"
 
-#: ./content/ttgooglemap.py:142
-#: ./interfaces/ttgooglemap.py:66
+#: ./content/ttgooglemap.py:203
 msgid "Map Type Control"
 msgstr "Map Type Control"
 
-#: ./content/ttgooglemap.py:38
-#: ./interfaces/ttgooglemap.py:18
+#: ./content/ttgooglemap.py:44
 msgid "Map Width"
 msgstr "Map width"
 
-#: ./content/ttgooglemap.py:52
-#: ./interfaces/ttgooglemap.py:26
+#: ./content/ttgooglemap.py:70
 msgid "Map height (px)"
 msgstr "Map height (px)"
 
-#: ./content/ttgooglemap.py:39
-#: ./interfaces/ttgooglemap.py:20
+#: ./content/ttgooglemap.py:45
 msgid "Map width (px)"
 msgstr "Map width (px)"
 
-#: ./content/ttgooglemap.py:104
-#: ./interfaces/ttgooglemap.py:48
+#: ./content/ttgooglemap.py:125
 msgid "Marker Box Height"
 msgstr "Marker box max-height"
 
-#: ./content/ttgooglemap.py:105
-#: ./interfaces/ttgooglemap.py:50
+#: ./content/ttgooglemap.py:126
 msgid "Marker box max-height"
 msgstr "Max-height of the box before adding scrollbars"
 
-#: ./content/ttgooglemapmarker.py:25
+#: ./content/ttgooglemapmarker.py:30
 #: ./interfaces/ttgooglemapmarker.py:14
 msgid "Marker text"
 msgstr "Text content"
 
-#: ./browser/controlpanel.py:58
+#: ./browser/controlpanel.py:51
 msgid "Markers cache in seconds"
 msgstr "Markers cache in seconds"
 
-#: ./browser/controlpanel.py:59
+#: ./browser/controlpanel.py:52
 msgid "Markers cache in seconds desc"
 msgstr "Markers cache in seconds"
 
-#: ./content/ttgooglemappolygon.py:124
-#: ./content/ttgooglemappolyline.py:100
+#: ./content/ttgooglemappolygon.py:130
+#: ./content/ttgooglemappolyline.py:105
 #: ./interfaces/ttgooglemappolygon.py:54
 msgid "Num Levels"
 msgstr "Num Levels"
 
-#: ./content/ttgooglemappolygon.py:125
-#: ./content/ttgooglemappolyline.py:101
+#: ./content/ttgooglemappolygon.py:131
+#: ./content/ttgooglemappolyline.py:106
 #: ./interfaces/ttgooglemappolygon.py:56
 msgid "Number of levels"
 msgstr "Number of levels"
 
-#: ./content/ttgooglemappolygon.py:48
+#: ./content/ttgooglemappolygon.py:54
 #: ./interfaces/ttgooglemappolygon.py:18
 msgid "Opacity"
 msgstr "Opacity"
@@ -391,59 +395,57 @@
 msgid "Opacity level"
 msgstr "Opacity level: 0=invisible, 1=no transparency"
 
-#: ./content/ttgooglemappolygon.py:49
+#: ./content/ttgooglemappolygon.py:55
 msgid "Opacity level - from 0=invisible to 1=no transparency"
 msgstr "Opacity level - from 0=invisible to 1=no transparency"
 
-#: ./content/ttgooglemap.py:166
-#: ./interfaces/ttgooglemap.py:80
+#: ./content/ttgooglemap.py:227
 msgid "Open boxes"
 msgstr "Open control boxes at map startup"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:63
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:57
 msgid "Open panel"
 msgstr "open"
 
-#: ./content/ttgooglemap.py:165
-#: ./interfaces/ttgooglemap.py:78
+#: ./content/ttgooglemap.py:226
 msgid "OpenBoxes"
 msgstr "Open boxes at startup"
 
-#: ./content/ttgooglemappolygon.py:62
+#: ./content/ttgooglemappolygon.py:68
 #: ./interfaces/ttgooglemappolygon.py:24
 msgid "Outline"
 msgstr "Outline"
 
-#: ./content/ttgooglemappolygon.py:63
+#: ./content/ttgooglemappolygon.py:69
 #: ./interfaces/ttgooglemappolygon.py:26
 msgid "Outline area"
 msgstr "Outline area"
 
-#: ./content/ttgooglemap.py:154
-#: ./interfaces/ttgooglemap.py:72
+#: ./content/ttgooglemap.py:215
 msgid "Overview Map Control"
 msgstr "Overview Map Control"
 
-#: ./content/ttgooglemap.py:118
-#: ./interfaces/ttgooglemap.py:54
+#: ./content/ttgooglemap.py:139
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:39
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:41
 msgid "Panoramio"
 msgstr "Panoramio"
 
-#: ./browser/controlpanel.py:141
+#: ./browser/controlpanel.py:143
 msgid "Parameters configuration"
 msgstr "Parameters configuration"
 
-#: ./content/ttgooglemappolygon.py:26
+#: ./content/ttgooglemappolygon.py:32
 #: ./interfaces/ttgooglemappolygon.py:14
 msgid "Polygon color"
 msgstr "Polygon color"
 
-#: ./content/ttgooglemappolyline.py:26
+#: ./content/ttgooglemappolyline.py:31
 #: ./interfaces/ttgooglemappolyline.py:14
 msgid "Polyline color"
 msgstr "Polyline color"
 
-#: ./browser/controlpanel.py:139
+#: ./browser/controlpanel.py:141
 msgid "Product settings"
 msgstr "Maps settings"
 
@@ -451,138 +453,183 @@
 msgid "Related Markers"
 msgstr "Related markers"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:59
 #. Default: "Search address"
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:59
 msgid "Search Address"
 msgstr "Search address: "
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:61
 #. Default: "Search"
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:61
 msgid "Search_button"
 msgstr "Search"
 
-#: ./content/ttgooglemapcategory.py:43
+#: ./content/ttgooglemapcategory.py:51
 #: ./interfaces/ttgooglemapcategory.py:14
 msgid "Select a custom icon for category"
 msgstr "Select a custom icon for category - visit <a href='http://code.google.com/p/google-maps-icons/' target='_blank'>this page</a> for other icons"
 
-#: ./content/ttgooglemapcategory.py:54
+#: ./content/ttgooglemapcategory.py:62
 msgid "Select a custom icon for clusterer"
 msgstr "Select a custom icon for clusterer group"
 
-#: ./content/ttgooglemapcategoryct.py:32
+#: ./content/ttgooglemapcategoryct.py:37
 #: ./interfaces/ttgooglemapcategoryct.py:13
 msgid "Select content type"
 msgstr "Select content type"
 
-#: ./content/ttgooglemap.py:79
-#: ./interfaces/ttgooglemap.py:38
+#: ./content/ttgooglemap.py:100
 msgid "Select default map type"
 msgstr "Select default map type"
 
-#: ./content/ttgooglemap.py:119
-#: ./interfaces/ttgooglemap.py:56
+#: ./content/ttgooglemap.py:58
+msgid "Set map to full width (overrides MapWidth)"
+msgstr "Set map to full width (overrides MapWidth)"
+
+#: ./content/ttgooglemap.py:140
 msgid "Show Panoramio button"
 msgstr "Show Panoramio button"
 
-#: ./content/ttgooglemap.py:177
-#: ./interfaces/ttgooglemap.py:86
+#: ./content/ttgooglemap.py:179
+msgid "Show bicycle button"
+msgstr "Show bicycle button"
+
+#: ./content/ttgooglemap.py:238
 msgid "Show directions"
 msgstr "Show directions box"
 
-#: ./content/ttgooglemap.py:143
-#: ./interfaces/ttgooglemap.py:68
+#: ./content/ttgooglemap.py:204
 msgid "Show map type buttons"
 msgstr "Show map type buttons"
 
-#: ./content/ttgooglemap.py:155
-#: ./interfaces/ttgooglemap.py:74
+#: ./content/ttgooglemap.py:216
 msgid "Show the overview map"
 msgstr "Show the overview map"
 
+#: ./content/ttgooglemap.py:166
+msgid "Show traffic button"
+msgstr "Show traffic button"
+
+#: ./content/ttgooglemap.py:153
+msgid "Show weather button"
+msgstr "Show weather button"
+
 #: ./skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt:29
 msgid "Standard icon disabled"
 msgstr "Standard icon disabled (custom icon active)"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:138
 #. Default: "Street Address"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:129
 msgid "Street"
 msgstr "Street"
 
+#: ./content/ttgooglemap.py:191
+msgid "Street View Control"
+msgstr "Street View Control"
+
+#: ./content/ttgooglemap.py:192
+msgid "Street view map control button"
+msgstr "Street view map control button"
+
 #. Default: "TTGoogleMap"
+#: ./profiles/default/types/TTGoogleMap.xml
 msgid "TTGoogleMap"
 msgstr "Google Map"
 
 #. Default: "TTGoogleMapCategory"
+#: ./profiles/default/types/TTGoogleMapCategory.xml
 msgid "TTGoogleMapCategory"
 msgstr "Google Map Category"
 
 #. Default: "TTGoogleMapCategoryCT"
+#: ./profiles/default/types/TTGoogleMapCategoryCT.xml
 msgid "TTGoogleMapCategoryCT"
 msgstr "Google Map Category Content Type"
 
 #. Default: "TTGoogleMapCategoryContainer"
+#: ./profiles/default/types/TTGoogleMapCategoryContainer.xml
 msgid "TTGoogleMapCategoryContainer"
 msgstr "Google Map Category Container"
 
 #. Default: "TTGoogleMapMarker"
+#: ./profiles/default/types/TTGoogleMapMarker.xml
 msgid "TTGoogleMapMarker"
 msgstr "Google Map Marker"
 
 #. Default: "TTGoogleMapPolygon"
+#: ./profiles/default/types/TTGoogleMapPolygon.xml
 msgid "TTGoogleMapPolygon"
 msgstr "Google Map Polygon"
 
 #. Default: "Google Map Polyline"
+#: ./profiles/default/types/TTGoogleMapPolyline.xml
 msgid "TTGoogleMapPolyline"
 msgstr "Google Map Polyline"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:45
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:26
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:68
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:70
 msgid "TT_ERROR"
 msgstr "Error"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:57
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:80
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:82
 msgid "TT_NO_MARKER_FOUND"
 msgstr "No marker found with id"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:56
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:79
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:81
 msgid "TT_NO_MARKER_SELECTED"
 msgstr "You must select the destination marker before, if none is available please add one or contact your site administrator to do so."
 
-#: ./content/ttgooglemap.py:27
-#: ./content/ttgooglemapmarker.py:24
-#: ./interfaces/ttgooglemap.py:12
+#: ./content/ttgooglemap.py:33
+#: ./content/ttgooglemapmarker.py:29
+#: ./interfaces/ttgooglemapmarker.py:12
 msgid "Text"
 msgstr "Text"
 
-#: ./content/ttgooglemap.py:28
-#: ./interfaces/ttgooglemap.py:14
+#: ./content/ttgooglemap.py:34
 msgid "Text on top of the map"
 msgstr "Text on top of the map"
 
-#: ./content/ttgooglemappolygon.py:74
-#: ./content/ttgooglemappolyline.py:50
+#: ./content/ttgooglemap.py:165
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:51
+msgid "Traffic"
+msgstr "Traffic"
+
+#: ./content/ttgooglemap.py:152
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:44
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:46
+msgid "Weather"
+msgstr "Weather"
+
+#: ./content/ttgooglemappolygon.py:80
+#: ./content/ttgooglemappolyline.py:55
 #: ./interfaces/ttgooglemappolygon.py:30
 msgid "Weight"
 msgstr "Weight"
 
-#: ./content/ttgooglemappolygon.py:111
-#: ./content/ttgooglemappolyline.py:87
+#: ./content/ttgooglemappolygon.py:117
+#: ./content/ttgooglemappolyline.py:92
 #: ./interfaces/ttgooglemappolygon.py:48
 msgid "Zoom Factor"
 msgstr "Zoom Factor"
 
-#: ./content/ttgooglemap.py:64
-#: ./interfaces/ttgooglemap.py:30
+#: ./content/ttgooglemap.py:82
 msgid "Zoom Level"
 msgstr "Zoom level"
 
-#: ./content/ttgooglemappolygon.py:112
+#: ./content/ttgooglemappolygon.py:118
 #: ./interfaces/ttgooglemappolyline.py:44
 msgid "Zoom factor"
 msgstr "Zoom factor"
 
-#: ./content/ttgooglemappolyline.py:88
+#: ./content/ttgooglemappolyline.py:93
 msgid "Zoom factor parameter"
 msgstr "Zoom factor parameter"
 
+#. Default: "Maps"
+#: ./browser/viewlet_ct_link.pt:6
+msgid "label_related_maps"
+msgstr "Maps"
+

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/LC_MESSAGES/tecnoteca.googlemap.mo
==============================================================================
Binary file. No diff available.

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/LC_MESSAGES/tecnoteca.googlemap.po
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/fr/LC_MESSAGES/tecnoteca.googlemap.po	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,633 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2013-10-09 14:38+0000\n"
+"PO-Revision-Date: 2012-06-12 12:09+0100\n"
+"Last-Translator: Andre NUYENS <[email protected]>\n"
+"Language-Team: LANGUAGE <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: fr\n"
+"Language-Name: French\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: tecnoteca.googlemap\n"
+"X-is-fallback-for: fr-be fr-ca fr-lu fr-mc fr-ch fr-fr\n"
+
+#: ./browser/controlpanel.py:56
+msgid "Available icons"
+msgstr "Icônes disponibles"
+
+#: ./browser/controlpanel.py:57
+msgid "Available icons desc"
+msgstr "Icônes de marqueurs disponibles"
+
+#: ./content/ttgooglemap.py:178
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:56
+msgid "Bicycle"
+msgstr "Vèlo"
+
+#: ./content/ttgooglemap.py:112
+msgid "Cat Box Height"
+msgstr "Hauteur de la boîte contenant la catégorie"
+
+#: ./content/ttgooglemap.py:113
+msgid "Cat box max-height"
+msgstr "Hauteur maximum de la boîte contenant la catégorie avant l'utilisation d'un ascenseur"
+
+#: ./content/ttgooglemapcategory.py:38
+#: ./interfaces/ttgooglemapcategory.py:20
+msgid "Category icon"
+msgstr "Icône de la catégorie"
+
+#: ./interfaces/ttgooglemapcategory.py:26
+msgid "Category selected (active) at map start"
+msgstr "La catégorie est active au départ de la carte"
+
+#: ./interfaces/ttgooglemapcategory.py:18
+msgid "CategoryIcon"
+msgstr "Icône de la catégorie"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:133
+msgid "City"
+msgstr "Ville"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:58
+msgid "Close panel"
+msgstr "Fermé le paneau"
+
+#: ./content/ttgooglemapcategory.py:61
+msgid "Clusterer icon"
+msgstr "Icône de groupe"
+
+#: ./content/ttgooglemappolygon.py:31
+#: ./content/ttgooglemappolyline.py:30
+#: ./interfaces/ttgooglemappolygon.py:12
+msgid "Color"
+msgstr "Couleur"
+
+#: ./content/ttgooglemapcategoryct.py:36
+#: ./interfaces/ttgooglemapcategoryct.py:11
+msgid "Content type"
+msgstr "Type de contenu"
+
+#: ./content/ttgooglemapcoordinates.py:26
+#: ./interfaces/ttgooglemapcoordinates.py:12
+msgid "Coordinates"
+msgstr "Coordonnées"
+
+#: ./content/ttgooglemapcoordinates.py:27
+#: ./interfaces/ttgooglemapcoordinates.py:14
+msgid "Coordinates lat long"
+msgstr "Coordonnées (latitude et longitude)"
+
+#: ./browser/controlpanel.py:46
+msgid "Coordinates widget mapsize"
+msgstr "Taille de la carte pour le widget coordonnées"
+
+#: ./browser/controlpanel.py:47
+msgid "Coordinates widget mapsize desc"
+msgstr "Taille de la carte (largeur,hauteur px)"
+
+#: ./content/ttgooglemapcategory.py:50
+#: ./interfaces/ttgooglemapcategory.py:12
+msgid "Custom icon"
+msgstr "Icône personalisée"
+
+#: ./content/ttgooglemapcategory.py:72
+#: ./content/ttgooglemappolygon.py:43
+#: ./content/ttgooglemappolyline.py:43
+msgid "Default Active"
+msgstr "Actif par défaut"
+
+#: ./content/ttgooglemap.py:249
+msgid "Default Marker"
+msgstr "Marqueur par défaut"
+
+#: ./interfaces/ttgooglemappolyline.py:20
+msgid "Default active"
+msgstr "Actif par défaut"
+
+#: ./content/ttgooglemapcategory.py:73
+#: ./content/ttgooglemappolygon.py:44
+#: ./content/ttgooglemappolyline.py:44
+msgid "Default active at map start"
+msgstr "Actif par défaut au départ de la carte"
+
+#: ./browser/controlpanel.py:36
+msgid "Default location"
+msgstr "Localisation par défaut"
+
+#: ./browser/controlpanel.py:37
+msgid "Default location desc"
+msgstr "Localisation initial pour une nouvelle carte avec marqueur"
+
+#: ./browser/controlpanel.py:41
+msgid "Default mapsize"
+msgstr "Taille de la carte par défaut"
+
+#: ./browser/controlpanel.py:42
+msgid "Default mapsize desc"
+msgstr "Taille par défaut pour les nouvelles cartes (largeur, hauteur px)"
+
+#: ./content/ttgooglemap.py:250
+msgid "Default marker startup"
+msgstr "Marqueur par défaut pour les nouvelles cartes"
+
+#: ./content/ttgooglemap.py:83
+msgid "Default zoom level"
+msgstr "Niveau de zoom par défaut"
+
+#: ./content/ttgooglemap.py:237
+msgid "Directions"
+msgstr "Directions"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:66
+msgid "Disable"
+msgstr "Désactiver"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:65
+msgid "Disable coordinates"
+msgstr "Coordonnées désactivées"
+
+#: ./content/ttgooglemappolygon.py:93
+#: ./content/ttgooglemappolyline.py:68
+#: ./interfaces/ttgooglemappolygon.py:36
+msgid "Encoded Polyline"
+msgstr "Chemins codées"
+
+#: ./content/ttgooglemappolygon.py:106
+#: ./content/ttgooglemappolyline.py:81
+#: ./interfaces/ttgooglemappolygon.py:44
+msgid "Encoded levels"
+msgstr "Niveaux codées - <a href='http://code.google.com/apis/maps/documentation/polylineutility.html' target='_blank'>click here</a> pour en obtenir"
+
+#: ./interfaces/ttgooglemappolygon.py:38
+#: ./interfaces/ttgooglemappolyline.py:32
+msgid "Encoded polyline"
+msgstr "Chemins codées"
+
+#: ./content/ttgooglemappolygon.py:94
+#: ./content/ttgooglemappolyline.py:69
+msgid "Encoded polyline value"
+msgstr "Valeurs des parcours codées - <a href='http://code.google.com/apis/maps/documentation/polylineutility.html' target='_blank'>click here</a> pour en obtenir"
+
+#. Default: "Categories"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:84
+msgid "Frontend Categories"
+msgstr "Catégories"
+
+#. Default: "Markers"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:99
+msgid "Frontend Markers"
+msgstr "Marqueurs"
+
+#. Default: "JavaScript must be enabled in order for you to use Google Maps.However, it seems JavaScript is either disabled or not supported by your browser. To view Google Maps, enable JavaScript by changing your browser options, and then try again."
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:113
+msgid "Frontend NoJavascript"
+msgstr "Javascript doit être activé afin d'utiliser des Cartes Google. Cependant, il semble que le Javascript est désactivé ou non supporté par votre navigateur. Pour voir des Cartes Google, activer le Javascript dans vos options du navigateur et ré-essayez."
+
+#. Default: "Areas"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:56
+msgid "Frontend Polygons"
+msgstr "Zones"
+
+#. Default: "Paths"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:70
+msgid "Frontend Polylines"
+msgstr "Chemins"
+
+#: ./content/ttgooglemap.py:57
+msgid "FullWidth"
+msgstr "Pleine largeur"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:77
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:79
+msgid "G_GEO_BAD_KEY"
+msgstr "La clé donnée est soit invalide, soit ne correspond pas au domaine pour lequel on l'a donné."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:70
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:72
+msgid "G_GEO_BAD_REQUEST"
+msgstr "Une requête de directions a échouée. Par exemple, la requête peut avoir été rejetée si elle contient plus que le nombre maximal de points de chemin permis."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:73
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:75
+msgid "G_GEO_MISSING_ADDRESS"
+msgstr "Le paramètre q HTTP manque ou n'a aucune valeur. Pour géoréférencer des requêtes, cela signifie qu'une adresse vide a été spécifiée à la saisie. Pour des requêtes de directions, cela signifie qu'aucune question n'a été spécifiée dans la saisie"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:72
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:74
+msgid "G_GEO_MISSING_QUERY"
+msgstr "Le paramètre q HTTP manque ou n'a aucune valeur. Pour géoréférencer des requêtes, cela signifie qu'une adresse vide a été spécifiée à la saisie. Pour des requêtes de directions, cela signifie qu'aucune question n'a été spécifiée dans la saisie"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:71
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:73
+msgid "G_GEO_SERVER_ERROR"
+msgstr "Un géoréférencement, des directions ou la requête de niveau d'agrandissement maximale ne peut pas être traités avec succès, on ne connaît pas la raison exacte de l'échec."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:69
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:71
+msgid "G_GEO_SUCCESS"
+msgstr "Aucune erreur n'est survenue; l'adresse a été analysé avec succès et son geocode a été rendu."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:78
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:80
+msgid "G_GEO_TOO_MANY_QUERIES"
+msgstr "La clé donnée a atteint la limite de requêtes dans la période de 24 heure ou a soumis trop de requêtes dans une trop courte période. Si vous renvoyé des requêtes multiples, utilisez un minuteur ou une pause dans votre code pour vous vous assurer que l'envoi des requêtes ne soit trop rapide."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:75
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:77
+msgid "G_GEO_UNAVAILABLE_ADDRESS"
+msgstr "Le geocode pour l'adresse donnée ou le parcours pour la direction donnée ne peut pas être rendu en raison des raisons légales ou contractuelles."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:27
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:74
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:76
+msgid "G_GEO_UNKNOWN_ADDRESS"
+msgstr "Aucun emplacement géographique correspondant n'est trouvé pour l'adresse indiquée. Ceci peut être dû en raison du fait que l'adresse est relativement nouvelle ou peut être incorrect."
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:76
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:78
+msgid "G_GEO_UNKNOWN_DIRECTIONS"
+msgstr "L'objet GDIRECTIONS ne peut pas calculer des directions entre les points mentionnés dans la requête. Ceci est d'habitude parce qu'il n'y a aucun parcours disponible entre les deux points, ou parce que nous n'avons pas de données pour acheminer dans cette région."
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:150
+msgid "Get directions"
+msgstr "Itinéraire"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:127
+msgid "Get directions from"
+msgstr "Itinéraire à partir"
+
+#. Default: "Google Map Category"
+#: ./profiles/default/types/TTGoogleMapCategory.xml
+msgid "Google Map Category"
+msgstr "Catégorie de carte Google"
+
+#. Default: "Google Map Category Container"
+#: ./profiles/default/types/TTGoogleMapCategoryContainer.xml
+msgid "Google Map Category Container"
+msgstr "Conteneur de catégorie de carte Google"
+
+#. Default: "Google Map Category Content Type"
+#: ./profiles/default/types/TTGoogleMapCategoryCT.xml
+msgid "Google Map Category Content Type"
+msgstr "Type de contenu de la catégorie de carte Google"
+
+#. Default: "Google Map Marker"
+#: ./profiles/default/types/TTGoogleMapMarker.xml
+msgid "Google Map Marker"
+msgstr "Marqueur de carte Google"
+
+#. Default: "Google Map Object"
+#: ./profiles/default/types/TTGoogleMap.xml
+msgid "Google Map Object"
+msgstr "Carte Google"
+
+#. Default: "Google Map Polygon"
+#: ./profiles/default/types/TTGoogleMapPolygon.xml
+msgid "Google Map Polygon"
+msgstr "Zone dans carte Google"
+
+#: ./profiles/default/types/TTGoogleMapPolyline.xml
+msgid "Google Map Polyline"
+msgstr "Chemins dans carte Google"
+
+#: ./portlets/TTGeoReference.py:27
+msgid "Google Map related markers"
+msgstr "Carte Google lié aux marqueurs"
+
+#: ./browser/controlpanel.py:29
+msgid "GoogleMap api keys"
+msgstr "Clé GoogleMap"
+
+#: ./browser/controlpanel.py:30
+msgid "GoogleMap api keys desc"
+msgstr "Liste d'URL et clés Google liées"
+
+#: ./content/ttgooglemapcategory.py:37
+msgid "Icon"
+msgstr "Icônes"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMarkerView.pt:48
+msgid "Items in relation with marker"
+msgstr "Objets liés aux marqueurs"
+
+#: ./content/ttgooglemappolygon.py:105
+#: ./content/ttgooglemappolyline.py:80
+#: ./interfaces/ttgooglemappolygon.py:42
+msgid "Levels"
+msgstr "Niveaux"
+
+#: ./content/ttgooglemappolygon.py:81
+#: ./content/ttgooglemappolyline.py:56
+#: ./interfaces/ttgooglemappolygon.py:32
+msgid "Line thickness (px)"
+msgstr "Épaisseur de ligne (px)"
+
+#: ./content/ttgooglemap.py:69
+msgid "Map Height"
+msgstr "Hauteur de la carte"
+
+#: ./content/ttgooglemap.py:99
+msgid "Map Type"
+msgstr "Type de carte"
+
+#: ./content/ttgooglemap.py:203
+msgid "Map Type Control"
+msgstr "Contrôle du type de carte"
+
+#: ./content/ttgooglemap.py:44
+msgid "Map Width"
+msgstr "Largeur de carte"
+
+#: ./content/ttgooglemap.py:70
+msgid "Map height (px)"
+msgstr "Hauteur de carte (px)"
+
+#: ./content/ttgooglemap.py:45
+msgid "Map width (px)"
+msgstr "Largeur de carte (px)"
+
+#: ./content/ttgooglemap.py:125
+msgid "Marker Box Height"
+msgstr "Hauteur des boites de marqueurs"
+
+#: ./content/ttgooglemap.py:126
+msgid "Marker box max-height"
+msgstr "Hauteur maximum des boîtes de marqueurs avant l'ajout d'un ascenseur"
+
+#: ./content/ttgooglemapmarker.py:30
+#: ./interfaces/ttgooglemapmarker.py:14
+msgid "Marker text"
+msgstr "Marqueur de texte"
+
+#: ./browser/controlpanel.py:51
+msgid "Markers cache in seconds"
+msgstr "Cache des marqueurs en secondes"
+
+#: ./browser/controlpanel.py:52
+msgid "Markers cache in seconds desc"
+msgstr "Cache des marqueurs en secondes"
+
+#: ./content/ttgooglemappolygon.py:130
+#: ./content/ttgooglemappolyline.py:105
+#: ./interfaces/ttgooglemappolygon.py:54
+msgid "Num Levels"
+msgstr "Nombre de niveaux"
+
+#: ./content/ttgooglemappolygon.py:131
+#: ./content/ttgooglemappolyline.py:106
+#: ./interfaces/ttgooglemappolygon.py:56
+msgid "Number of levels"
+msgstr "Nombre de niveaux"
+
+#: ./content/ttgooglemappolygon.py:54
+#: ./interfaces/ttgooglemappolygon.py:18
+msgid "Opacity"
+msgstr "Opacité"
+
+#: ./interfaces/ttgooglemappolygon.py:20
+msgid "Opacity level"
+msgstr "Niveau d'opacité : 0=invisible, 1=pas de transparence"
+
+#: ./content/ttgooglemappolygon.py:55
+msgid "Opacity level - from 0=invisible to 1=no transparency"
+msgstr "Niveau d'opacité - de 0=invisible à 1=pas de transparence"
+
+#: ./content/ttgooglemap.py:227
+msgid "Open boxes"
+msgstr "Boîtes de contrôle ouvertes au démarrage de carte"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:57
+msgid "Open panel"
+msgstr "Ouvrir"
+
+#: ./content/ttgooglemap.py:226
+msgid "OpenBoxes"
+msgstr "Boîtes ouverte au démarrage"
+
+#: ./content/ttgooglemappolygon.py:68
+#: ./interfaces/ttgooglemappolygon.py:24
+msgid "Outline"
+msgstr "Contour"
+
+#: ./content/ttgooglemappolygon.py:69
+#: ./interfaces/ttgooglemappolygon.py:26
+msgid "Outline area"
+msgstr "Zone de contour"
+
+#: ./content/ttgooglemap.py:215
+msgid "Overview Map Control"
+msgstr "Contrôle de carte de Vue d'ensemble"
+
+#: ./content/ttgooglemap.py:139
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:39
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:41
+msgid "Panoramio"
+msgstr "Panoramio"
+
+#: ./browser/controlpanel.py:143
+msgid "Parameters configuration"
+msgstr "Configuration des paramètres"
+
+#: ./content/ttgooglemappolygon.py:32
+#: ./interfaces/ttgooglemappolygon.py:14
+msgid "Polygon color"
+msgstr "Couleur des zones"
+
+#: ./content/ttgooglemappolyline.py:31
+#: ./interfaces/ttgooglemappolyline.py:14
+msgid "Polyline color"
+msgstr "Couleur des chemins"
+
+#: ./browser/controlpanel.py:141
+msgid "Product settings"
+msgstr "Paramètres du produit"
+
+#: ./portlets/TTGeoReference.pt:4
+msgid "Related Markers"
+msgstr "Marqueurs liés"
+
+#. Default: "Search address"
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:59
+msgid "Search Address"
+msgstr "Recherche d'adresse"
+
+#. Default: "Search"
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:61
+msgid "Search_button"
+msgstr "Recherche"
+
+#: ./content/ttgooglemapcategory.py:51
+#: ./interfaces/ttgooglemapcategory.py:14
+msgid "Select a custom icon for category"
+msgstr "Sélectionnez une icône pour la catégorie- visitez <a href='http://code.google.com/p/google-maps-icons/' target='_blank'>this page</a> pour d'autres icônes'"
+
+#: ./content/ttgooglemapcategory.py:62
+msgid "Select a custom icon for clusterer"
+msgstr "Choisissez une icône personnalisée pour le groupe"
+
+#: ./content/ttgooglemapcategoryct.py:37
+#: ./interfaces/ttgooglemapcategoryct.py:13
+msgid "Select content type"
+msgstr "Choisir un type de contenu"
+
+#: ./content/ttgooglemap.py:100
+msgid "Select default map type"
+msgstr "Choisir le type de carte par défaut"
+
+#: ./content/ttgooglemap.py:58
+msgid "Set map to full width (overrides MapWidth)"
+msgstr "Ajuster à la largeur disponible (remplace la largeur définie)"
+
+#: ./content/ttgooglemap.py:140
+msgid "Show Panoramio button"
+msgstr "Voir le bouton Panoramio"
+
+#: ./content/ttgooglemap.py:179
+msgid "Show bicycle button"
+msgstr "Afficher le bouton vélo"
+
+#: ./content/ttgooglemap.py:238
+msgid "Show directions"
+msgstr "Voir les directions"
+
+#: ./content/ttgooglemap.py:204
+msgid "Show map type buttons"
+msgstr "Voir le bouton de type de carte"
+
+#: ./content/ttgooglemap.py:216
+msgid "Show the overview map"
+msgstr "Montrez la carte de vue d'ensemble"
+
+#: ./content/ttgooglemap.py:166
+msgid "Show traffic button"
+msgstr "Afficher le bouton de la circulation"
+
+#: ./content/ttgooglemap.py:153
+msgid "Show weather button"
+msgstr "Afficher le bouton météo"
+
+#: ./skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt:29
+msgid "Standard icon disabled"
+msgstr "Icône standard désactivée"
+
+#. Default: "Street Address"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:129
+msgid "Street"
+msgstr "Rue"
+
+#: ./content/ttgooglemap.py:191
+msgid "Street View Control"
+msgstr "Contrôle street view"
+
+#: ./content/ttgooglemap.py:192
+msgid "Street view map control button"
+msgstr "Contrôle street view"
+
+#. Default: "TTGoogleMap"
+#: ./profiles/default/types/TTGoogleMap.xml
+msgid "TTGoogleMap"
+msgstr "Carte Google"
+
+#. Default: "TTGoogleMapCategory"
+#: ./profiles/default/types/TTGoogleMapCategory.xml
+msgid "TTGoogleMapCategory"
+msgstr "Catégorie carte Google"
+
+#. Default: "TTGoogleMapCategoryCT"
+#: ./profiles/default/types/TTGoogleMapCategoryCT.xml
+msgid "TTGoogleMapCategoryCT"
+msgstr "Type de contenu catégorie carte Google"
+
+#. Default: "TTGoogleMapCategoryContainer"
+#: ./profiles/default/types/TTGoogleMapCategoryContainer.xml
+msgid "TTGoogleMapCategoryContainer"
+msgstr "Conteneur de catégorie carte Google"
+
+#. Default: "TTGoogleMapMarker"
+#: ./profiles/default/types/TTGoogleMapMarker.xml
+msgid "TTGoogleMapMarker"
+msgstr "Marqueur carte Google"
+
+#. Default: "TTGoogleMapPolygon"
+#: ./profiles/default/types/TTGoogleMapPolygon.xml
+msgid "TTGoogleMapPolygon"
+msgstr "Zone carte Google"
+
+#: ./profiles/default/types/TTGoogleMapPolyline.xml
+msgid "TTGoogleMapPolyline"
+msgstr "Chemins carte Google"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:26
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:68
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:70
+msgid "TT_ERROR"
+msgstr "Erreur"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:80
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:82
+msgid "TT_NO_MARKER_FOUND"
+msgstr "Pas de marqueur trouvé pour l'id"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:79
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:81
+msgid "TT_NO_MARKER_SELECTED"
+msgstr "Vous devez choisir le marqueur de destination avant, si aucun n'est disponible, ajoutez en un ou contactez votre administrateur de site pour le faire."
+
+#: ./content/ttgooglemap.py:33
+#: ./content/ttgooglemapmarker.py:29
+#: ./interfaces/ttgooglemapmarker.py:12
+msgid "Text"
+msgstr "Texte"
+
+#: ./content/ttgooglemap.py:34
+msgid "Text on top of the map"
+msgstr "Texte au dessus de la carte"
+
+#: ./content/ttgooglemap.py:165
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:51
+msgid "Traffic"
+msgstr "Trafic"
+
+#: ./content/ttgooglemap.py:152
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:44
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:46
+msgid "Weather"
+msgstr "Météo"
+
+#: ./content/ttgooglemappolygon.py:80
+#: ./content/ttgooglemappolyline.py:55
+#: ./interfaces/ttgooglemappolygon.py:30
+msgid "Weight"
+msgstr "Poids"
+
+#: ./content/ttgooglemappolygon.py:117
+#: ./content/ttgooglemappolyline.py:92
+#: ./interfaces/ttgooglemappolygon.py:48
+msgid "Zoom Factor"
+msgstr "Facteur de zoom"
+
+#: ./content/ttgooglemap.py:82
+msgid "Zoom Level"
+msgstr "Niveau de zoom"
+
+#: ./content/ttgooglemappolygon.py:118
+#: ./interfaces/ttgooglemappolyline.py:44
+msgid "Zoom factor"
+msgstr "Facteur de zoom"
+
+#: ./content/ttgooglemappolyline.py:93
+msgid "Zoom factor parameter"
+msgstr "Paramètre de facteur de zoom"
+
+#. Default: "Maps"
+#: ./browser/viewlet_ct_link.pt:6
+msgid "label_related_maps"
+msgstr "Cartes connexes"
+

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/it/LC_MESSAGES/tecnoteca.googlemap.mo
==============================================================================
Binary files. No diff available.

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/it/LC_MESSAGES/tecnoteca.googlemap.po
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/it/LC_MESSAGES/tecnoteca.googlemap.po	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/it/LC_MESSAGES/tecnoteca.googlemap.po	Wed Oct  9 15:36:33 2013
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: tecnoteca.googlemap\n"
-"POT-Creation-Date: 2011-07-27 09:58+0000\n"
+"POT-Creation-Date: 2013-10-09 14:38+0000\n"
 "PO-Revision-Date: 05/02/2010\n"
 "Last-Translator: Tecnoteca srl\n"
 "Language-Team: Tecnoteca srl\n"
@@ -16,25 +16,29 @@
 "Report-Msgid-Bugs-To: [email protected]\n"
 "X-Is-Fallback-For: it-ch it-it\n"
 
-#: ./browser/controlpanel.py:51
+#: ./browser/controlpanel.py:56
 msgid "Available icons"
 msgstr "Icone disponibili"
 
-#: ./browser/controlpanel.py:52
+#: ./browser/controlpanel.py:57
 msgid "Available icons desc"
 msgstr "Icone dei punti d'interesse"
 
-#: ./content/ttgooglemap.py:91
-#: ./interfaces/ttgooglemap.py:42
+#: ./content/ttgooglemap.py:178
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:56
+msgid "Bicycle"
+msgstr "Bicicletta"
+
+#: ./content/ttgooglemap.py:112
 msgid "Cat Box Height"
 msgstr "Altezza box categorie"
 
-#: ./content/ttgooglemap.py:92
-#: ./interfaces/ttgooglemap.py:44
+#: ./content/ttgooglemap.py:113
 msgid "Cat box max-height"
 msgstr "Altezza massima box categorie, poi utilizzo scrollbar"
 
-#: ./content/ttgooglemapcategory.py:30
+#: ./content/ttgooglemapcategory.py:38
 #: ./interfaces/ttgooglemapcategory.py:20
 msgid "Category icon"
 msgstr "Icona categoria"
@@ -47,35 +51,35 @@
 msgid "CategoryIcon"
 msgstr "Icona categoria"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:142
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:133
 msgid "City"
 msgstr "Città"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:64
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:58
 msgid "Close panel"
 msgstr "&raquo; chiudi"
 
-#: ./content/ttgooglemapcategory.py:53
+#: ./content/ttgooglemapcategory.py:61
 msgid "Clusterer icon"
 msgstr "Icona raggruppamento"
 
-#: ./content/ttgooglemappolygon.py:25
-#: ./content/ttgooglemappolyline.py:25
+#: ./content/ttgooglemappolygon.py:31
+#: ./content/ttgooglemappolyline.py:30
 #: ./interfaces/ttgooglemappolygon.py:12
 msgid "Color"
 msgstr "Colore"
 
-#: ./content/ttgooglemapcategoryct.py:31
+#: ./content/ttgooglemapcategoryct.py:36
 #: ./interfaces/ttgooglemapcategoryct.py:11
 msgid "Content type"
 msgstr "Content type"
 
-#: ./content/ttgooglemapcoordinates.py:21
+#: ./content/ttgooglemapcoordinates.py:26
 #: ./interfaces/ttgooglemapcoordinates.py:12
 msgid "Coordinates"
 msgstr "Coordinate del punto"
 
-#: ./content/ttgooglemapcoordinates.py:22
+#: ./content/ttgooglemapcoordinates.py:27
 #: ./interfaces/ttgooglemapcoordinates.py:14
 msgid "Coordinates lat long"
 msgstr "Valori di latitudine e longitudine"
@@ -88,19 +92,18 @@
 msgid "Coordinates widget mapsize desc"
 msgstr "Dimensione mappa - larghezza x altezza, in px - del widget per la selezione delle coordinate"
 
-#: ./content/ttgooglemapcategory.py:42
+#: ./content/ttgooglemapcategory.py:50
 #: ./interfaces/ttgooglemapcategory.py:12
 msgid "Custom icon"
 msgstr "Icona personalizzata"
 
-#: ./content/ttgooglemapcategory.py:64
-#: ./content/ttgooglemappolygon.py:37
-#: ./content/ttgooglemappolyline.py:38
+#: ./content/ttgooglemapcategory.py:72
+#: ./content/ttgooglemappolygon.py:43
+#: ./content/ttgooglemappolyline.py:43
 msgid "Default Active"
 msgstr "Attivo all'apertura"
 
-#: ./content/ttgooglemap.py:188
-#: ./interfaces/ttgooglemap.py:90
+#: ./content/ttgooglemap.py:249
 msgid "Default Marker"
 msgstr "Punto d'interesse default"
 
@@ -108,9 +111,9 @@
 msgid "Default active"
 msgstr "Attivo all'apertura"
 
-#: ./content/ttgooglemapcategory.py:65
-#: ./content/ttgooglemappolygon.py:38
-#: ./content/ttgooglemappolyline.py:39
+#: ./content/ttgooglemapcategory.py:73
+#: ./content/ttgooglemappolygon.py:44
+#: ./content/ttgooglemappolyline.py:44
 msgid "Default active at map start"
 msgstr "Selezionare per attivare all'apertura della mappa"
 
@@ -130,18 +133,15 @@
 msgid "Default mapsize desc"
 msgstr "Dimensione mappa - larghezza x altezza, in px - dei nuovi oggetti \"Google Map\""
 
-#: ./content/ttgooglemap.py:189
-#: ./interfaces/ttgooglemap.py:92
+#: ./content/ttgooglemap.py:250
 msgid "Default marker startup"
 msgstr "Punti d'interesse in evidenza all'apertura della mappa"
 
-#: ./content/ttgooglemap.py:65
-#: ./interfaces/ttgooglemap.py:32
+#: ./content/ttgooglemap.py:83
 msgid "Default zoom level"
 msgstr "Livello di zoom iniziale della mappa"
 
-#: ./content/ttgooglemap.py:176
-#: ./interfaces/ttgooglemap.py:84
+#: ./content/ttgooglemap.py:237
 msgid "Directions"
 msgstr "Indicazioni stradali"
 
@@ -153,14 +153,14 @@
 msgid "Disable coordinates"
 msgstr "Disabilita coordinate"
 
-#: ./content/ttgooglemappolygon.py:87
-#: ./content/ttgooglemappolyline.py:63
+#: ./content/ttgooglemappolygon.py:93
+#: ./content/ttgooglemappolyline.py:68
 #: ./interfaces/ttgooglemappolygon.py:36
 msgid "Encoded Polyline"
 msgstr "Codifica percorso"
 
-#: ./content/ttgooglemappolygon.py:100
-#: ./content/ttgooglemappolyline.py:76
+#: ./content/ttgooglemappolygon.py:106
+#: ./content/ttgooglemappolyline.py:81
 #: ./interfaces/ttgooglemappolygon.py:44
 msgid "Encoded levels"
 msgstr "Codifica livelli - <a href='http://code.google.com/apis/maps/documentation/polylineutility.html' target='_blank'>clicca qui</a> per calcolare la codifica dei livelli"
@@ -170,113 +170,135 @@
 msgid "Encoded polyline"
 msgstr "Codifica percorso"
 
-#: ./content/ttgooglemappolygon.py:88
-#: ./content/ttgooglemappolyline.py:64
+#: ./content/ttgooglemappolygon.py:94
+#: ./content/ttgooglemappolyline.py:69
 msgid "Encoded polyline value"
 msgstr "Codifica del percorso - <a href='http://code.google.com/apis/maps/documentation/polylineutility.html' target='_blank'>clicca qui</a> per calcolare la codifica del percorso"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:90
 #. Default: "Categories"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:84
 msgid "Frontend Categories"
 msgstr "Categorie di punti"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:105
 #. Default: "Markers"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:99
 msgid "Frontend Markers"
 msgstr "Punti d'interesse"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:119
 #. Default: "JavaScript must be enabled in order for you to use Google Maps.However, it seems JavaScript is either disabled or not supported by your browser. To view Google Maps, enable JavaScript by changing your browser options, and then try again."
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:113
 msgid "Frontend NoJavascript"
 msgstr "JavaScript deve essere abilitato per poter visualizzare la mappa!"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:62
 #. Default: "Areas"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:56
 msgid "Frontend Polygons"
 msgstr "Aree"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:76
 #. Default: "Paths"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:70
 msgid "Frontend Polylines"
 msgstr "Percorsi"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./content/ttgooglemap.py:57
+msgid "FullWidth"
+msgstr "Larghezza massima"
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:77
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:79
 msgid "G_GEO_BAD_KEY"
 msgstr "Google Key non valida"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:47
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:70
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:72
 msgid "G_GEO_BAD_REQUEST"
 msgstr "Richiesta non valida"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:50
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:73
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:75
 msgid "G_GEO_MISSING_ADDRESS"
 msgstr "Indirizzo non trovato"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:72
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:74
 msgid "G_GEO_MISSING_QUERY"
 msgstr "Inserire l'indirizzo di partenza"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:48
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:71
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:73
 msgid "G_GEO_SERVER_ERROR"
 msgstr "Errore del server, impossibile completare l'operazione"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:46
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:69
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:71
 msgid "G_GEO_SUCCESS"
 msgstr "Richiesta eseguita con successo"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:55
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:78
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:80
 msgid "G_GEO_TOO_MANY_QUERIES"
 msgstr "Troppe richieste in corso, riprovare piu tardi"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:52
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:75
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:77
 msgid "G_GEO_UNAVAILABLE_ADDRESS"
 msgstr "Indirizzo non trovato"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:51
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:27
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:74
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:76
 msgid "G_GEO_UNKNOWN_ADDRESS"
 msgstr "Indirizzo non trovato"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:53
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:76
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:78
 msgid "G_GEO_UNKNOWN_DIRECTIONS"
 msgstr "Impossibile ottenere le indicazioni stradali per il punto selezionato"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:159
-msgid "Get directions btn"
-msgstr "Ottieni indicazioni"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:150
+msgid "Get directions"
+msgstr "Indicazioni stradali"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:136
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:127
 msgid "Get directions from"
-msgstr "Seleziona un punto d'interesse e ottieni le indicazioni stradali"
+msgstr "Indicazioni da"
 
 #. Default: "Google Map Category"
+#: ./profiles/default/types/TTGoogleMapCategory.xml
 msgid "Google Map Category"
 msgstr "Categoria di punti"
 
 #. Default: "Google Map Category Container"
+#: ./profiles/default/types/TTGoogleMapCategoryContainer.xml
 msgid "Google Map Category Container"
 msgstr "Macro Categoria"
 
 #. Default: "Google Map Category Content Type"
+#: ./profiles/default/types/TTGoogleMapCategoryCT.xml
 msgid "Google Map Category Content Type"
 msgstr "Content type categoria"
 
 #. Default: "Google Map Marker"
+#: ./profiles/default/types/TTGoogleMapMarker.xml
 msgid "Google Map Marker"
 msgstr "Punto d'interesse"
 
 #. Default: "Google Map Object"
+#: ./profiles/default/types/TTGoogleMap.xml
 msgid "Google Map Object"
 msgstr "Oggetto Google Map"
 
 #. Default: "Google Map Polygon"
+#: ./profiles/default/types/TTGoogleMapPolygon.xml
 msgid "Google Map Polygon"
 msgstr "Area"
 
 #. Default: "Google Map Polyline"
+#: ./profiles/default/types/TTGoogleMapPolyline.xml
 msgid "Google Map Polyline"
 msgstr "Percorso"
 
-#: ./portlets/TTGeoReference.py:25
+#: ./portlets/TTGeoReference.py:27
 msgid "Google Map related markers"
 msgstr "Google Map punti in relazione"
 
@@ -288,7 +310,7 @@
 msgid "GoogleMap api keys desc"
 msgstr "URL configurati e relative Google Key"
 
-#: ./content/ttgooglemapcategory.py:29
+#: ./content/ttgooglemapcategory.py:37
 msgid "Icon"
 msgstr "Icona"
 
@@ -296,94 +318,76 @@
 msgid "Items in relation with marker"
 msgstr "Contenuti in relazione con il punto d'interesse"
 
-#: ./content/ttgooglemap.py:130
-#: ./interfaces/ttgooglemap.py:60
-msgid "Large Map Control"
-msgstr "Controlli mappa"
-
-#: ./content/ttgooglemap.py:131
-#: ./interfaces/ttgooglemap.py:62
-msgid "Large map control buttons"
-msgstr "Controlli mappa estesi"
-
-#: ./content/ttgooglemappolygon.py:99
-#: ./content/ttgooglemappolyline.py:75
+#: ./content/ttgooglemappolygon.py:105
+#: ./content/ttgooglemappolyline.py:80
 #: ./interfaces/ttgooglemappolygon.py:42
 msgid "Levels"
 msgstr "Livelli"
 
-#: ./content/ttgooglemappolygon.py:75
-#: ./content/ttgooglemappolyline.py:51
+#: ./content/ttgooglemappolygon.py:81
+#: ./content/ttgooglemappolyline.py:56
 #: ./interfaces/ttgooglemappolygon.py:32
 msgid "Line thickness (px)"
 msgstr "Spessore della linea in pixel"
 
-#: ./content/ttgooglemap.py:51
-#: ./interfaces/ttgooglemap.py:24
+#: ./content/ttgooglemap.py:69
 msgid "Map Height"
 msgstr "Altezza mappa"
 
-#: ./content/ttgooglemap.py:78
-#: ./interfaces/ttgooglemap.py:36
+#: ./content/ttgooglemap.py:99
 msgid "Map Type"
 msgstr "Tipologia mappa"
 
-#: ./content/ttgooglemap.py:142
-#: ./interfaces/ttgooglemap.py:66
+#: ./content/ttgooglemap.py:203
 msgid "Map Type Control"
 msgstr "Selezione tipologia mappa"
 
-#: ./content/ttgooglemap.py:38
-#: ./interfaces/ttgooglemap.py:18
+#: ./content/ttgooglemap.py:44
 msgid "Map Width"
 msgstr "Larghezza mappa"
 
-#: ./content/ttgooglemap.py:52
-#: ./interfaces/ttgooglemap.py:26
+#: ./content/ttgooglemap.py:70
 msgid "Map height (px)"
 msgstr "Specificare l'altezza della mappa in pixel"
 
-#: ./content/ttgooglemap.py:39
-#: ./interfaces/ttgooglemap.py:20
+#: ./content/ttgooglemap.py:45
 msgid "Map width (px)"
 msgstr "Specificare la larghezza della mappa in pixel"
 
-#: ./content/ttgooglemap.py:104
-#: ./interfaces/ttgooglemap.py:48
+#: ./content/ttgooglemap.py:125
 msgid "Marker Box Height"
 msgstr "Altezza box punti d'interesse"
 
-#: ./content/ttgooglemap.py:105
-#: ./interfaces/ttgooglemap.py:50
+#: ./content/ttgooglemap.py:126
 msgid "Marker box max-height"
 msgstr "Altezza massima box dei punti d'interesse, poi utilizzo scrollbar"
 
-#: ./content/ttgooglemapmarker.py:25
+#: ./content/ttgooglemapmarker.py:30
 #: ./interfaces/ttgooglemapmarker.py:14
 msgid "Marker text"
 msgstr "Testo del marker"
 
-#: ./browser/controlpanel.py:58
+#: ./browser/controlpanel.py:51
 msgid "Markers cache in seconds"
 msgstr "Cache punti mappa"
 
-#: ./browser/controlpanel.py:59
+#: ./browser/controlpanel.py:52
 msgid "Markers cache in seconds desc"
 msgstr "Tempo validità cache (in secondi) per i punti della mappa"
 
-#: ./content/ttgooglemappolygon.py:124
-#: ./content/ttgooglemappolyline.py:100
+#: ./content/ttgooglemappolygon.py:130
+#: ./content/ttgooglemappolyline.py:105
 #: ./interfaces/ttgooglemappolygon.py:54
 msgid "Num Levels"
 msgstr "Numero livelli"
 
-#: ./content/ttgooglemappolygon.py:125
-#: ./content/ttgooglemappolyline.py:101
+#: ./content/ttgooglemappolygon.py:131
+#: ./content/ttgooglemappolyline.py:106
 #: ./interfaces/ttgooglemappolygon.py:56
 msgid "Number of levels"
 msgstr "Numero di livelli"
 
-#: ./content/ttgooglemappolygon.py:48
+#: ./content/ttgooglemappolygon.py:54
 #: ./interfaces/ttgooglemappolygon.py:18
 msgid "Opacity"
 msgstr "Trasparenza"
@@ -392,59 +396,57 @@
 msgid "Opacity level"
 msgstr "Livello trsparenza: 0=invisibile, 1=no transparenza"
 
-#: ./content/ttgooglemappolygon.py:49
+#: ./content/ttgooglemappolygon.py:55
 msgid "Opacity level - from 0=invisible to 1=no transparency"
 msgstr "Livello trasparenza - da 0=invisibile a 1=senza trasparenza"
 
-#: ./content/ttgooglemap.py:166
-#: ./interfaces/ttgooglemap.py:80
+#: ./content/ttgooglemap.py:227
 msgid "Open boxes"
 msgstr "Visualizza i box (aree, percorsi, categorie) aperti all'apertura della mappa"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:63
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:57
 msgid "Open panel"
 msgstr "&raquo; apri"
 
-#: ./content/ttgooglemap.py:165
-#: ./interfaces/ttgooglemap.py:78
+#: ./content/ttgooglemap.py:226
 msgid "OpenBoxes"
 msgstr "Box aperti all'apertura"
 
-#: ./content/ttgooglemappolygon.py:62
+#: ./content/ttgooglemappolygon.py:68
 #: ./interfaces/ttgooglemappolygon.py:24
 msgid "Outline"
 msgstr "Mostra bordo"
 
-#: ./content/ttgooglemappolygon.py:63
+#: ./content/ttgooglemappolygon.py:69
 #: ./interfaces/ttgooglemappolygon.py:26
 msgid "Outline area"
 msgstr "Mostra bordo intorno all'area"
 
-#: ./content/ttgooglemap.py:154
-#: ./interfaces/ttgooglemap.py:72
+#: ./content/ttgooglemap.py:215
 msgid "Overview Map Control"
 msgstr "Mappa di overview"
 
-#: ./content/ttgooglemap.py:118
-#: ./interfaces/ttgooglemap.py:54
+#: ./content/ttgooglemap.py:139
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:39
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:41
 msgid "Panoramio"
 msgstr "Panoramio"
 
-#: ./browser/controlpanel.py:141
+#: ./browser/controlpanel.py:143
 msgid "Parameters configuration"
 msgstr "Configurazione parametri"
 
-#: ./content/ttgooglemappolygon.py:26
+#: ./content/ttgooglemappolygon.py:32
 #: ./interfaces/ttgooglemappolygon.py:14
 msgid "Polygon color"
 msgstr "Colore area"
 
-#: ./content/ttgooglemappolyline.py:26
+#: ./content/ttgooglemappolyline.py:31
 #: ./interfaces/ttgooglemappolyline.py:14
 msgid "Polyline color"
 msgstr "Colore percorso"
 
-#: ./browser/controlpanel.py:139
+#: ./browser/controlpanel.py:141
 msgid "Product settings"
 msgstr "Impostazioni GoogleMap"
 
@@ -452,138 +454,183 @@
 msgid "Related Markers"
 msgstr "Punti d'interesse associati"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:59
 #. Default: "Search address"
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:59
 msgid "Search Address"
 msgstr "Digita qui l'indirizzo: "
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:61
 #. Default: "Search"
+#: ./skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt:61
 msgid "Search_button"
 msgstr "Cerca"
 
-#: ./content/ttgooglemapcategory.py:43
+#: ./content/ttgooglemapcategory.py:51
 #: ./interfaces/ttgooglemapcategory.py:14
 msgid "Select a custom icon for category"
 msgstr "Inserisci un'icona diversa per questa categoria - visita <a href='http://code.google.com/p/google-maps-icons/' target='_blank'>questa pagina</a> per ottenere altre icone da poter utilizzare"
 
-#: ./content/ttgooglemapcategory.py:54
+#: ./content/ttgooglemapcategory.py:62
 msgid "Select a custom icon for clusterer"
 msgstr "Selezionare un'icona per il raggruppamento di punti ravvicinati; si consiglia un'icona con colore pieno (affinchè sia leggibile il numero che comparirà all'interno)"
 
-#: ./content/ttgooglemapcategoryct.py:32
+#: ./content/ttgooglemapcategoryct.py:37
 #: ./interfaces/ttgooglemapcategoryct.py:13
 msgid "Select content type"
 msgstr "Selezionare il content type"
 
-#: ./content/ttgooglemap.py:79
-#: ./interfaces/ttgooglemap.py:38
+#: ./content/ttgooglemap.py:100
 msgid "Select default map type"
 msgstr "Selezionare la tipologia iniziale della mappa"
 
-#: ./content/ttgooglemap.py:119
-#: ./interfaces/ttgooglemap.py:56
+#: ./content/ttgooglemap.py:58
+msgid "Set map to full width (overrides MapWidth)"
+msgstr "Adatta alla larghezza disponibile (sovrascrive la larghezza impostata)"
+
+#: ./content/ttgooglemap.py:140
 msgid "Show Panoramio button"
 msgstr "Visualizza pulsante Panoramio - <a href='http://www.panoramio.com/' target='_blank'>clicca qui</a> per maggiori informazioni su Panoramio"
 
-#: ./content/ttgooglemap.py:177
-#: ./interfaces/ttgooglemap.py:86
+#: ./content/ttgooglemap.py:179
+msgid "Show bicycle button"
+msgstr "Visualizza pulsante \"bicicletta\""
+
+#: ./content/ttgooglemap.py:238
 msgid "Show directions"
 msgstr "Visualizza box per ricerca indicazioni stradali"
 
-#: ./content/ttgooglemap.py:143
-#: ./interfaces/ttgooglemap.py:68
+#: ./content/ttgooglemap.py:204
 msgid "Show map type buttons"
 msgstr "Visualizza i pulsanti per la selezione della tipologia della mappa"
 
-#: ./content/ttgooglemap.py:155
-#: ./interfaces/ttgooglemap.py:74
+#: ./content/ttgooglemap.py:216
 msgid "Show the overview map"
 msgstr "Visualizza la mappa di overview"
 
+#: ./content/ttgooglemap.py:166
+msgid "Show traffic button"
+msgstr "Visualizza pulsante \"traffico\""
+
+#: ./content/ttgooglemap.py:153
+msgid "Show weather button"
+msgstr "Visualizza pulsante \"meteo\""
+
 #: ./skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt:29
 msgid "Standard icon disabled"
 msgstr "Icona personalizzata inserita"
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:138
 #. Default: "Street Address"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:129
 msgid "Street"
 msgstr "Via"
 
+#: ./content/ttgooglemap.py:191
+msgid "Street View Control"
+msgstr "Pulsante Street View"
+
+#: ./content/ttgooglemap.py:192
+msgid "Street view map control button"
+msgstr "Visualizza pulsante google map street view"
+
 #. Default: "TTGoogleMap"
+#: ./profiles/default/types/TTGoogleMap.xml
 msgid "TTGoogleMap"
 msgstr "Google Map"
 
 #. Default: "TTGoogleMapCategory"
+#: ./profiles/default/types/TTGoogleMapCategory.xml
 msgid "TTGoogleMapCategory"
 msgstr "Categoria di punti"
 
 #. Default: "TTGoogleMapCategoryCT"
+#: ./profiles/default/types/TTGoogleMapCategoryCT.xml
 msgid "TTGoogleMapCategoryCT"
 msgstr "Categoria content type"
 
 #. Default: "TTGoogleMapCategoryContainer"
+#: ./profiles/default/types/TTGoogleMapCategoryContainer.xml
 msgid "TTGoogleMapCategoryContainer"
 msgstr "Macro Categoria"
 
 #. Default: "TTGoogleMapMarker"
+#: ./profiles/default/types/TTGoogleMapMarker.xml
 msgid "TTGoogleMapMarker"
 msgstr "Punto d'interesse"
 
 #. Default: "TTGoogleMapPolygon"
+#: ./profiles/default/types/TTGoogleMapPolygon.xml
 msgid "TTGoogleMapPolygon"
 msgstr "Area"
 
 #. Default: "Google Map Polyline"
+#: ./profiles/default/types/TTGoogleMapPolyline.xml
 msgid "TTGoogleMapPolyline"
 msgstr "Percorso"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:45
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:26
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:68
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:70
 msgid "TT_ERROR"
 msgstr "Errore"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:57
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:80
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:82
 msgid "TT_NO_MARKER_FOUND"
 msgstr "Nessun punto d'interesse trovato con id"
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:56
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:79
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:81
 msgid "TT_NO_MARKER_SELECTED"
 msgstr "Selezionare prima un punto d'interesse"
 
-#: ./content/ttgooglemap.py:27
-#: ./content/ttgooglemapmarker.py:24
-#: ./interfaces/ttgooglemap.py:12
+#: ./content/ttgooglemap.py:33
+#: ./content/ttgooglemapmarker.py:29
+#: ./interfaces/ttgooglemapmarker.py:12
 msgid "Text"
 msgstr "Testo"
 
-#: ./content/ttgooglemap.py:28
-#: ./interfaces/ttgooglemap.py:14
+#: ./content/ttgooglemap.py:34
 msgid "Text on top of the map"
 msgstr "Testo da inserire prima della mappa"
 
-#: ./content/ttgooglemappolygon.py:74
-#: ./content/ttgooglemappolyline.py:50
+#: ./content/ttgooglemap.py:165
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:51
+msgid "Traffic"
+msgstr "Traffico"
+
+#: ./content/ttgooglemap.py:152
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:44
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:46
+msgid "Weather"
+msgstr "Meteo"
+
+#: ./content/ttgooglemappolygon.py:80
+#: ./content/ttgooglemappolyline.py:55
 #: ./interfaces/ttgooglemappolygon.py:30
 msgid "Weight"
 msgstr "Spessore"
 
-#: ./content/ttgooglemappolygon.py:111
-#: ./content/ttgooglemappolyline.py:87
+#: ./content/ttgooglemappolygon.py:117
+#: ./content/ttgooglemappolyline.py:92
 #: ./interfaces/ttgooglemappolygon.py:48
 msgid "Zoom Factor"
 msgstr "Zoom"
 
-#: ./content/ttgooglemap.py:64
-#: ./interfaces/ttgooglemap.py:30
+#: ./content/ttgooglemap.py:82
 msgid "Zoom Level"
 msgstr "Livello zoom"
 
-#: ./content/ttgooglemappolygon.py:112
+#: ./content/ttgooglemappolygon.py:118
 #: ./interfaces/ttgooglemappolyline.py:44
 msgid "Zoom factor"
 msgstr "Livello zoom"
 
-#: ./content/ttgooglemappolyline.py:88
+#: ./content/ttgooglemappolyline.py:93
 msgid "Zoom factor parameter"
 msgstr "Livello di zoom"
 
+#. Default: "Maps"
+#: ./browser/viewlet_ct_link.pt:6
+msgid "label_related_maps"
+msgstr "Mappe"
+

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/tecnoteca.googlemap.pot
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/tecnoteca.googlemap.pot	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/locales/tecnoteca.googlemap.pot	Wed Oct  9 15:36:33 2013
@@ -4,7 +4,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2011-07-27 09:58+0000\n"
+"POT-Creation-Date: 2013-10-09 14:38+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <[email protected]>\n"
@@ -17,25 +17,29 @@
 "Preferred-Encodings: utf-8 latin1\n"
 "Domain: tecnoteca.googlemap\n"
 
-#: ./browser/controlpanel.py:51
+#: ./browser/controlpanel.py:56
 msgid "Available icons"
 msgstr ""
 
-#: ./browser/controlpanel.py:52
+#: ./browser/controlpanel.py:57
 msgid "Available icons desc"
 msgstr ""
 
-#: ./content/ttgooglemap.py:91
-#: ./interfaces/ttgooglemap.py:42
+#: ./content/ttgooglemap.py:178
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:56
+msgid "Bicycle"
+msgstr ""
+
+#: ./content/ttgooglemap.py:112
 msgid "Cat Box Height"
 msgstr ""
 
-#: ./content/ttgooglemap.py:92
-#: ./interfaces/ttgooglemap.py:44
+#: ./content/ttgooglemap.py:113
 msgid "Cat box max-height"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:30
+#: ./content/ttgooglemapcategory.py:38
 #: ./interfaces/ttgooglemapcategory.py:20
 msgid "Category icon"
 msgstr ""
@@ -48,35 +52,35 @@
 msgid "CategoryIcon"
 msgstr ""
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:142
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:133
 msgid "City"
 msgstr ""
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:64
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:58
 msgid "Close panel"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:53
+#: ./content/ttgooglemapcategory.py:61
 msgid "Clusterer icon"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:25
-#: ./content/ttgooglemappolyline.py:25
+#: ./content/ttgooglemappolygon.py:31
+#: ./content/ttgooglemappolyline.py:30
 #: ./interfaces/ttgooglemappolygon.py:12
 msgid "Color"
 msgstr ""
 
-#: ./content/ttgooglemapcategoryct.py:31
+#: ./content/ttgooglemapcategoryct.py:36
 #: ./interfaces/ttgooglemapcategoryct.py:11
 msgid "Content type"
 msgstr ""
 
-#: ./content/ttgooglemapcoordinates.py:21
+#: ./content/ttgooglemapcoordinates.py:26
 #: ./interfaces/ttgooglemapcoordinates.py:12
 msgid "Coordinates"
 msgstr ""
 
-#: ./content/ttgooglemapcoordinates.py:22
+#: ./content/ttgooglemapcoordinates.py:27
 #: ./interfaces/ttgooglemapcoordinates.py:14
 msgid "Coordinates lat long"
 msgstr ""
@@ -89,19 +93,18 @@
 msgid "Coordinates widget mapsize desc"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:42
+#: ./content/ttgooglemapcategory.py:50
 #: ./interfaces/ttgooglemapcategory.py:12
 msgid "Custom icon"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:64
-#: ./content/ttgooglemappolygon.py:37
-#: ./content/ttgooglemappolyline.py:38
+#: ./content/ttgooglemapcategory.py:72
+#: ./content/ttgooglemappolygon.py:43
+#: ./content/ttgooglemappolyline.py:43
 msgid "Default Active"
 msgstr ""
 
-#: ./content/ttgooglemap.py:188
-#: ./interfaces/ttgooglemap.py:90
+#: ./content/ttgooglemap.py:249
 msgid "Default Marker"
 msgstr ""
 
@@ -109,9 +112,9 @@
 msgid "Default active"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:65
-#: ./content/ttgooglemappolygon.py:38
-#: ./content/ttgooglemappolyline.py:39
+#: ./content/ttgooglemapcategory.py:73
+#: ./content/ttgooglemappolygon.py:44
+#: ./content/ttgooglemappolyline.py:44
 msgid "Default active at map start"
 msgstr ""
 
@@ -131,18 +134,15 @@
 msgid "Default mapsize desc"
 msgstr ""
 
-#: ./content/ttgooglemap.py:189
-#: ./interfaces/ttgooglemap.py:92
+#: ./content/ttgooglemap.py:250
 msgid "Default marker startup"
 msgstr ""
 
-#: ./content/ttgooglemap.py:65
-#: ./interfaces/ttgooglemap.py:32
+#: ./content/ttgooglemap.py:83
 msgid "Default zoom level"
 msgstr ""
 
-#: ./content/ttgooglemap.py:176
-#: ./interfaces/ttgooglemap.py:84
+#: ./content/ttgooglemap.py:237
 msgid "Directions"
 msgstr ""
 
@@ -154,14 +154,14 @@
 msgid "Disable coordinates"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:87
-#: ./content/ttgooglemappolyline.py:63
+#: ./content/ttgooglemappolygon.py:93
+#: ./content/ttgooglemappolyline.py:68
 #: ./interfaces/ttgooglemappolygon.py:36
 msgid "Encoded Polyline"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:100
-#: ./content/ttgooglemappolyline.py:76
+#: ./content/ttgooglemappolygon.py:106
+#: ./content/ttgooglemappolyline.py:81
 #: ./interfaces/ttgooglemappolygon.py:44
 msgid "Encoded levels"
 msgstr ""
@@ -171,81 +171,96 @@
 msgid "Encoded polyline"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:88
-#: ./content/ttgooglemappolyline.py:64
+#: ./content/ttgooglemappolygon.py:94
+#: ./content/ttgooglemappolyline.py:69
 msgid "Encoded polyline value"
 msgstr ""
 
 #. Default: "Categories"
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:90
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:84
 msgid "Frontend Categories"
 msgstr ""
 
 #. Default: "Markers"
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:105
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:99
 msgid "Frontend Markers"
 msgstr ""
 
 #. Default: "JavaScript must be enabled in order for you to use Google Maps.However, it seems JavaScript is either disabled or not supported by your browser. To view Google Maps, enable JavaScript by changing your browser options, and then try again."
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:119
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:113
 msgid "Frontend NoJavascript"
 msgstr ""
 
 #. Default: "Areas"
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:62
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:56
 msgid "Frontend Polygons"
 msgstr ""
 
 #. Default: "Paths"
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:76
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:70
 msgid "Frontend Polylines"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:54
+#: ./content/ttgooglemap.py:57
+msgid "FullWidth"
+msgstr ""
+
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:77
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:79
 msgid "G_GEO_BAD_KEY"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:47
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:70
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:72
 msgid "G_GEO_BAD_REQUEST"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:50
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:73
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:75
 msgid "G_GEO_MISSING_ADDRESS"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:72
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:74
 msgid "G_GEO_MISSING_QUERY"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:48
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:71
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:73
 msgid "G_GEO_SERVER_ERROR"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:46
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:69
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:71
 msgid "G_GEO_SUCCESS"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:55
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:78
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:80
 msgid "G_GEO_TOO_MANY_QUERIES"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:52
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:75
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:77
 msgid "G_GEO_UNAVAILABLE_ADDRESS"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:51
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:27
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:74
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:76
 msgid "G_GEO_UNKNOWN_ADDRESS"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:53
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:76
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:78
 msgid "G_GEO_UNKNOWN_DIRECTIONS"
 msgstr ""
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:159
-msgid "Get directions btn"
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:150
+msgid "Get directions"
 msgstr ""
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:136
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:127
 msgid "Get directions from"
 msgstr ""
 
@@ -283,7 +298,7 @@
 msgid "Google Map Polyline"
 msgstr ""
 
-#: ./portlets/TTGeoReference.py:25
+#: ./portlets/TTGeoReference.py:27
 msgid "Google Map related markers"
 msgstr ""
 
@@ -295,7 +310,7 @@
 msgid "GoogleMap api keys desc"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:29
+#: ./content/ttgooglemapcategory.py:37
 msgid "Icon"
 msgstr ""
 
@@ -303,94 +318,76 @@
 msgid "Items in relation with marker"
 msgstr ""
 
-#: ./content/ttgooglemap.py:130
-#: ./interfaces/ttgooglemap.py:60
-msgid "Large Map Control"
-msgstr ""
-
-#: ./content/ttgooglemap.py:131
-#: ./interfaces/ttgooglemap.py:62
-msgid "Large map control buttons"
-msgstr ""
-
-#: ./content/ttgooglemappolygon.py:99
-#: ./content/ttgooglemappolyline.py:75
+#: ./content/ttgooglemappolygon.py:105
+#: ./content/ttgooglemappolyline.py:80
 #: ./interfaces/ttgooglemappolygon.py:42
 msgid "Levels"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:75
-#: ./content/ttgooglemappolyline.py:51
+#: ./content/ttgooglemappolygon.py:81
+#: ./content/ttgooglemappolyline.py:56
 #: ./interfaces/ttgooglemappolygon.py:32
 msgid "Line thickness (px)"
 msgstr ""
 
-#: ./content/ttgooglemap.py:51
-#: ./interfaces/ttgooglemap.py:24
+#: ./content/ttgooglemap.py:69
 msgid "Map Height"
 msgstr ""
 
-#: ./content/ttgooglemap.py:78
-#: ./interfaces/ttgooglemap.py:36
+#: ./content/ttgooglemap.py:99
 msgid "Map Type"
 msgstr ""
 
-#: ./content/ttgooglemap.py:142
-#: ./interfaces/ttgooglemap.py:66
+#: ./content/ttgooglemap.py:203
 msgid "Map Type Control"
 msgstr ""
 
-#: ./content/ttgooglemap.py:38
-#: ./interfaces/ttgooglemap.py:18
+#: ./content/ttgooglemap.py:44
 msgid "Map Width"
 msgstr ""
 
-#: ./content/ttgooglemap.py:52
-#: ./interfaces/ttgooglemap.py:26
+#: ./content/ttgooglemap.py:70
 msgid "Map height (px)"
 msgstr ""
 
-#: ./content/ttgooglemap.py:39
-#: ./interfaces/ttgooglemap.py:20
+#: ./content/ttgooglemap.py:45
 msgid "Map width (px)"
 msgstr ""
 
-#: ./content/ttgooglemap.py:104
-#: ./interfaces/ttgooglemap.py:48
+#: ./content/ttgooglemap.py:125
 msgid "Marker Box Height"
 msgstr ""
 
-#: ./content/ttgooglemap.py:105
-#: ./interfaces/ttgooglemap.py:50
+#: ./content/ttgooglemap.py:126
 msgid "Marker box max-height"
 msgstr ""
 
-#: ./content/ttgooglemapmarker.py:25
+#: ./content/ttgooglemapmarker.py:30
 #: ./interfaces/ttgooglemapmarker.py:14
 msgid "Marker text"
 msgstr ""
 
-#: ./browser/controlpanel.py:58
+#: ./browser/controlpanel.py:51
 msgid "Markers cache in seconds"
 msgstr ""
 
-#: ./browser/controlpanel.py:59
+#: ./browser/controlpanel.py:52
 msgid "Markers cache in seconds desc"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:124
-#: ./content/ttgooglemappolyline.py:100
+#: ./content/ttgooglemappolygon.py:130
+#: ./content/ttgooglemappolyline.py:105
 #: ./interfaces/ttgooglemappolygon.py:54
 msgid "Num Levels"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:125
-#: ./content/ttgooglemappolyline.py:101
+#: ./content/ttgooglemappolygon.py:131
+#: ./content/ttgooglemappolyline.py:106
 #: ./interfaces/ttgooglemappolygon.py:56
 msgid "Number of levels"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:48
+#: ./content/ttgooglemappolygon.py:54
 #: ./interfaces/ttgooglemappolygon.py:18
 msgid "Opacity"
 msgstr ""
@@ -399,59 +396,57 @@
 msgid "Opacity level"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:49
+#: ./content/ttgooglemappolygon.py:55
 msgid "Opacity level - from 0=invisible to 1=no transparency"
 msgstr ""
 
-#: ./content/ttgooglemap.py:166
-#: ./interfaces/ttgooglemap.py:80
+#: ./content/ttgooglemap.py:227
 msgid "Open boxes"
 msgstr ""
 
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:63
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:57
 msgid "Open panel"
 msgstr ""
 
-#: ./content/ttgooglemap.py:165
-#: ./interfaces/ttgooglemap.py:78
+#: ./content/ttgooglemap.py:226
 msgid "OpenBoxes"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:62
+#: ./content/ttgooglemappolygon.py:68
 #: ./interfaces/ttgooglemappolygon.py:24
 msgid "Outline"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:63
+#: ./content/ttgooglemappolygon.py:69
 #: ./interfaces/ttgooglemappolygon.py:26
 msgid "Outline area"
 msgstr ""
 
-#: ./content/ttgooglemap.py:154
-#: ./interfaces/ttgooglemap.py:72
+#: ./content/ttgooglemap.py:215
 msgid "Overview Map Control"
 msgstr ""
 
-#: ./content/ttgooglemap.py:118
-#: ./interfaces/ttgooglemap.py:54
+#: ./content/ttgooglemap.py:139
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:39
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:41
 msgid "Panoramio"
 msgstr ""
 
-#: ./browser/controlpanel.py:141
+#: ./browser/controlpanel.py:143
 msgid "Parameters configuration"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:26
+#: ./content/ttgooglemappolygon.py:32
 #: ./interfaces/ttgooglemappolygon.py:14
 msgid "Polygon color"
 msgstr ""
 
-#: ./content/ttgooglemappolyline.py:26
+#: ./content/ttgooglemappolyline.py:31
 #: ./interfaces/ttgooglemappolyline.py:14
 msgid "Polyline color"
 msgstr ""
 
-#: ./browser/controlpanel.py:139
+#: ./browser/controlpanel.py:141
 msgid "Product settings"
 msgstr ""
 
@@ -469,54 +464,73 @@
 msgid "Search_button"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:43
+#: ./content/ttgooglemapcategory.py:51
 #: ./interfaces/ttgooglemapcategory.py:14
 msgid "Select a custom icon for category"
 msgstr ""
 
-#: ./content/ttgooglemapcategory.py:54
+#: ./content/ttgooglemapcategory.py:62
 msgid "Select a custom icon for clusterer"
 msgstr ""
 
-#: ./content/ttgooglemapcategoryct.py:32
+#: ./content/ttgooglemapcategoryct.py:37
 #: ./interfaces/ttgooglemapcategoryct.py:13
 msgid "Select content type"
 msgstr ""
 
-#: ./content/ttgooglemap.py:79
-#: ./interfaces/ttgooglemap.py:38
+#: ./content/ttgooglemap.py:100
 msgid "Select default map type"
 msgstr ""
 
-#: ./content/ttgooglemap.py:119
-#: ./interfaces/ttgooglemap.py:56
+#: ./content/ttgooglemap.py:58
+msgid "Set map to full width (overrides MapWidth)"
+msgstr ""
+
+#: ./content/ttgooglemap.py:140
 msgid "Show Panoramio button"
 msgstr ""
 
-#: ./content/ttgooglemap.py:177
-#: ./interfaces/ttgooglemap.py:86
+#: ./content/ttgooglemap.py:179
+msgid "Show bicycle button"
+msgstr ""
+
+#: ./content/ttgooglemap.py:238
 msgid "Show directions"
 msgstr ""
 
-#: ./content/ttgooglemap.py:143
-#: ./interfaces/ttgooglemap.py:68
+#: ./content/ttgooglemap.py:204
 msgid "Show map type buttons"
 msgstr ""
 
-#: ./content/ttgooglemap.py:155
-#: ./interfaces/ttgooglemap.py:74
+#: ./content/ttgooglemap.py:216
 msgid "Show the overview map"
 msgstr ""
 
+#: ./content/ttgooglemap.py:166
+msgid "Show traffic button"
+msgstr ""
+
+#: ./content/ttgooglemap.py:153
+msgid "Show weather button"
+msgstr ""
+
 #: ./skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt:29
 msgid "Standard icon disabled"
 msgstr ""
 
 #. Default: "Street Address"
-#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:138
+#: ./skins/TTGoogleMapViews/TTGoogleMapView.pt:129
 msgid "Street"
 msgstr ""
 
+#: ./content/ttgooglemap.py:191
+msgid "Street View Control"
+msgstr ""
+
+#: ./content/ttgooglemap.py:192
+msgid "Street view map control button"
+msgstr ""
+
 #. Default: "TTGoogleMap"
 #: ./profiles/default/types/TTGoogleMap.xml
 msgid "TTGoogleMap"
@@ -551,52 +565,71 @@
 msgid "TTGoogleMapPolyline"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:45
+#: ./skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py:26
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:68
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:70
 msgid "TT_ERROR"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:57
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:80
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:82
 msgid "TT_NO_MARKER_FOUND"
 msgstr ""
 
-#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:56
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:79
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:81
 msgid "TT_NO_MARKER_SELECTED"
 msgstr ""
 
-#: ./content/ttgooglemap.py:27
-#: ./content/ttgooglemapmarker.py:24
-#: ./interfaces/ttgooglemap.py:12
+#: ./content/ttgooglemap.py:33
+#: ./content/ttgooglemapmarker.py:29
+#: ./interfaces/ttgooglemapmarker.py:12
 msgid "Text"
 msgstr ""
 
-#: ./content/ttgooglemap.py:28
-#: ./interfaces/ttgooglemap.py:14
+#: ./content/ttgooglemap.py:34
 msgid "Text on top of the map"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:74
-#: ./content/ttgooglemappolyline.py:50
+#: ./content/ttgooglemap.py:165
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:49
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:51
+msgid "Traffic"
+msgstr ""
+
+#: ./content/ttgooglemap.py:152
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMain.py:44
+#: ./skins/TTGoogleMapScripts/TTGoogleMapMarco.py:46
+msgid "Weather"
+msgstr ""
+
+#: ./content/ttgooglemappolygon.py:80
+#: ./content/ttgooglemappolyline.py:55
 #: ./interfaces/ttgooglemappolygon.py:30
 msgid "Weight"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:111
-#: ./content/ttgooglemappolyline.py:87
+#: ./content/ttgooglemappolygon.py:117
+#: ./content/ttgooglemappolyline.py:92
 #: ./interfaces/ttgooglemappolygon.py:48
 msgid "Zoom Factor"
 msgstr ""
 
-#: ./content/ttgooglemap.py:64
-#: ./interfaces/ttgooglemap.py:30
+#: ./content/ttgooglemap.py:82
 msgid "Zoom Level"
 msgstr ""
 
-#: ./content/ttgooglemappolygon.py:112
+#: ./content/ttgooglemappolygon.py:118
 #: ./interfaces/ttgooglemappolyline.py:44
 msgid "Zoom factor"
 msgstr ""
 
-#: ./content/ttgooglemappolyline.py:88
+#: ./content/ttgooglemappolyline.py:93
 msgid "Zoom factor parameter"
 msgstr ""
 
+#. Default: "Maps"
+#: ./browser/viewlet_ct_link.pt:6
+msgid "label_related_maps"
+msgstr ""
+

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/portlets/TTGeoReference.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/portlets/TTGeoReference.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/portlets/TTGeoReference.py	Wed Oct  9 15:36:33 2013
@@ -12,6 +12,8 @@
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from Products.CMFCore.utils import getToolByName
 
+from zope.component import getMultiAdapter
+
 _ = MessageFactory('tecnoteca.googlemap')
 
 class ITTGeoReferencePortlet(IPortletDataProvider):
@@ -28,6 +30,7 @@
     render = ViewPageTemplateFile('TTGeoReference.pt')
         
     def getRelatedMarkers(self):
+        helper = getMultiAdapter((self.context, self.request), name=u'ttgooglemap_helpersview')
         context = aq_inner(self.context)
         markers = []
         try:
@@ -37,7 +40,7 @@
             # add inverse relations
             related.extend(context.getBRefs())
             for rel in related:
-                if(rel.portal_type == 'TTGoogleMapMarker'):
+                if(rel.portal_type == 'TTGoogleMapMarker'): # helper.isGMContentType(rel)
                     markers.append(rel)
         except:
             pass

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/profiles/default/tinymce.xml
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/profiles/default/tinymce.xml	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<object>
+    <resourcetypes>
+        <linkable>
+            <element value="TTGoogleMap"/>
+            <element value="TTGoogleMapCategory"/>
+            <element value="TTGoogleMapCategoryContainer"/>
+            <element value="TTGoogleMapCategoryCT"/>
+            <element value="TTGoogleMapMarker"/>
+            <element value="TTGoogleMapPolygon"/>
+            <element value="TTGoogleMapPolyline"/>
+        </linkable>
+        <containsobjects>
+            <element value="TTGoogleMap"/>
+            <element value="TTGoogleMapCategory"/>
+            <element value="TTGoogleMapCategoryContainer"/>
+        </containsobjects>
+    </resourcetypes>
+</object>

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/profiles/default/viewlets.xml
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/profiles/default/viewlets.xml	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!-- This file holds the setup configuration of the viewlet managers
+for the "Tecnoteca Vigevano Theme 2012" skin.
+-->
+
+<object>
+    
+    <!-- plone.app.layout.viewlets.interfaces.IBelowContentBody -->
+    <order manager="plone.belowcontentbody" 
+           skinname="*">
+        <viewlet name="plone.belowcontentbody.relatedmaps" 
+                 insert-before="plone.belowcontentbody.relateditems" />
+    </order>
+    
+</object>

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/setuphandlers.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/setuphandlers.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/setuphandlers.py	Wed Oct  9 15:36:33 2013
@@ -16,10 +16,14 @@
     props_sheet = getToolByName(props_tool, PROPERTY_SHEET)
     # add properties to the sheet
     for property in PROPERTIES_LIST:
-        print property
         if not props_sheet.hasProperty(property['id']):
             props_sheet.manage_addProperty(id = property['id'], value = property['value'], type = property['type'])           
 
+def updateIndexes(portal):
+    catalog_tool = getToolByName(portal, 'portal_catalog')
+    if 'gmap_category_objecttype' not in catalog_tool.indexes():
+        catalog_tool.addIndex(name = 'gmap_category_objecttype',
+                              type = 'FieldIndex')
 def setupVarious(context):
 
     if context.readDataFile('tecnoteca.googlemap_various.txt') is None:
@@ -28,4 +32,5 @@
     # Add additional setup code here
     portal = context.getSite()
     # update prop
-    updateProperties(portal)
\ No newline at end of file
+    updateProperties(portal)
+    updateIndexes(portal)
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapCss/TTGoogleMapStyle.css.dtml
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapCss/TTGoogleMapStyle.css.dtml	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapCss/TTGoogleMapStyle.css.dtml	Wed Oct  9 15:36:33 2013
@@ -15,16 +15,16 @@
 
 .TTMapContainer {}
 
-.TTMapColLeft {
+.TTMapFloatLeft {
 	float:left;	
 }
 
-.TTMapColRight {
-	padding-left:12px;	
+.TTMapFullWidth {
+	width:100%;	
 }
 
 .TTMapCollapsiblePanel {
-	border: 1px solid <dtml-var globalBorderColor>;
+	margin-top:15px;
 }
 
 .TTMapCollapsiblePanelTab {
@@ -35,6 +35,7 @@
 
 .TTMapCollapsiblePanelContent {
 	padding: 5px 10px 5px;
+	border:1px solid <dtml-var globalBackgroundColor>;
 }
 
 .TTMapPanelLabel {
@@ -71,8 +72,7 @@
     font-size:11px;
     display: block;
 }
-.TTMapCheckbox {
-    float:left;
+.TTMapCheckbox {    
 }
 
 .TTMapCatContainter{
@@ -88,7 +88,7 @@
 }
 
 .documentContent ul.TTMapMarkerList, .TTMapMarkerList {
-	margin:0;
+	margin:0 !important;
 	padding:0;
 	line-height:1.4em;	
 }
@@ -117,14 +117,10 @@
     cursor:pointer;
 }
 
-.TTMapMarkerWin {
-    width:300px;
-}
-
 .TTMapDirLabel {
 	display:block;
 	float:left;
-	min-width:70px;
+	min-width:120px;
 	font-weight:bold;
 }
 

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_functions.js
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_functions.js	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_functions.js	Wed Oct  9 15:36:33 2013
@@ -12,15 +12,16 @@
 // == Create icon function ==
 function createIcon(imgUrl) {
     var imgsize = getImgSize(imgUrl);    
-    var icon = new GIcon(G_DEFAULT_ICON,imgUrl);
+    var icon = new google.maps.MarkerImage(imgUrl);
+    
     if(imgsize[0]!=null && imgsize[0]!=0) { // if size defined
-        icon.iconSize = new GSize(imgsize[1], imgsize[0]);
+        icon.iconSize = new google.maps.Size({width: imgsize[1], height: imgsize[0]}); 
     } else { // set default
-        icon.iconSize = new GSize(32,37);
+        icon.iconSize = new google.maps.Size({width: 32, height: 37});
     }
-    icon.iconAnchor = new GPoint(16,34); // set anchor point
+    icon.iconAnchor = new google.maps.Point(16,34); // set anchor point
     icon.imageMap = [0,0, icon.iconSize.width,0, icon.iconSize.width,icon.iconSize.height, 0,icon.iconSize.height]; // set clickable area
-    icon.shadowSize = new GSize(0, 0); // disable shadow
+    icon.shadowSize = new google.maps.Size(0, 0); // disable shadow
     return icon;
 }
 
@@ -45,15 +46,18 @@
 
 
 // == Create marker ==
-function createMarker(id,point,name,html,category,categoryFullName) {    
-	var marker = new GMarker(point, {icon:gicons[category], title:name})
+function createMarker(id,point,name,html,category,categoryFullName) {
+	var marker = new google.maps.Marker({position:point, icon:gicons[category], title:name})	
+	
     // === Store the category and name info as a marker properties ===
     marker.myid = id;
     marker.mycategory = category;
     marker.mycategoryfullname = categoryFullName;
     marker.myname = name;
-    GEvent.addListener(marker, "click", function() {
-      marker.openInfoWindowHtml(html);
+    
+    google.maps.event.addListener(marker, "click", function() {
+      infoWindow.setContent(html);
+      infoWindow.open(map, marker);
       active_gmarker = marker;
     });    
     gmarkers[id]=marker;
@@ -64,47 +68,43 @@
 function show(category) {
 	hide(category); // cleanup
 	var activeMarkers = [];
-	var i;
-    for (i in gmarkers) {
+    for (var i in gmarkers) {
       if (gmarkers[i].mycategory == category) {
-        // gmarkers[i].show();
-        activeMarkers.push(gmarkers[i]);
+        activeMarkers.push(gmarkers[i]);        
       }
     }
-    // == check the checkbox ==
-    document.getElementById(category+"box").checked = true;
-    
-    // == marker clusterer
+
     var markerClusterer = null;
     if (clusterersIcon[category]!=null) {
-    	markerClusterer = new MarkerClusterer(map, activeMarkers, {styles: clusterersIcon[category]});
+        markerClusterer = new MarkerClusterer(map, activeMarkers, {styles: clusterersIcon[category]});
     } else {
-    	markerClusterer = new MarkerClusterer(map, activeMarkers);
+        markerClusterer = new MarkerClusterer(map, activeMarkers);
     }
     clusterers[category] = markerClusterer;
+
+    
+    // == check the checkbox ==
+    document.getElementById(category+"box").checked = true;
 }
 
 // == hides all markers of a particular category, and ensures the checkbox is cleared ==
-function hide(category) {
-	for (i in gmarkers) {
-      if (gmarkers[i].mycategory == category) {
-        gmarkers[i].hide();
-      }
-    }
-    // == clear the checkbox ==
-    document.getElementById(category+"box").checked = false;
-    // == close the info window, in case its open on a marker that we just hid
-    map.closeInfoWindow();
-    
+function hide(category) {	   
+    // == close the info window, in case its open on a marker that we just hid       
+    infoWindow.close();
+
     // == marker clusterer
     var markerClusterer = clusterers[category];
-    if (markerClusterer!=null && markerClusterer.hasOwnProperty("clearMarkers")) {
-    	markerClusterer.clearMarkers();
+   
+    if (markerClusterer!=null) {
+        markerClusterer.clearMarkers();
         markerClusterer = null;
     }
+    
+    // == clear the checkbox ==
+    document.getElementById(category+"box").checked = false;   
 }
 
-// == a checkbox has been clicked ==
+// == a checkbox has been clicked in side box ==
 function boxclick(box,category) {
     if (box.checked) {
       show(category);
@@ -116,12 +116,19 @@
 }            
 
 // == This function picks up the click and opens the corresponding info window
-function myclick(i) {
+function markerclick(i) {
 	active_gmarker = gmarkers[i];
-	map.panTo(active_gmarker.getLatLng());
-	map.enableInfoWindow();
-	active_gmarker.initialize(map);
-    GEvent.trigger(active_gmarker,"click");
+	
+	// zoom in
+	var markerCategory = active_gmarker.mycategory;
+	var markerClusterer = clusterers[markerCategory];
+	markerClusterer.fitMapToMarkers();
+	
+	// pan 
+	map.panTo(active_gmarker.getPosition());
+	
+	// trigger click
+    google.maps.event.trigger(active_gmarker,"click");
 }
 
 // == rebuilds the sidebar to match the markers currently displayed ==
@@ -137,7 +144,7 @@
       }
       mem = mc;
       if (catIsChecked) {
-        html += '<li class="TTMapMarkerListItem"><a href="javascript:myclick(\'' + i + '\')">' + gmarkers[i].myname + '</a></li>';
+        html += '<li class="TTMapMarkerListItem"><a href="javascript:markerclick(\'' + i + '\')">' + gmarkers[i].myname + '</a></li>';
       }
     }
     html += "</ul>";
@@ -158,250 +165,212 @@
         var category = gmarkers[i].mycategory;
         document.getElementById(category+"box").checked = true;
         show(category);
-        makeSidebar();
-        
-        // show specific marker (marker clusterer might not ... )
-        gmarkers[i].show();
+        makeSidebar();        
 
         //simulate click on marker
-        myclick(i);
+        markerclick(i);
       }
     }
     if(!found) {
-    	errnotify(ERRCODES[TT_NO_MARKER_FOUND]+": "+markerId);
+    	errnotify(ERRCODES['TT_NO_MARKER_FOUND']+": "+markerId);
     }
 }
 
 
 // == Create polyline
-function createPolyline(position_,defaultActive_,color_,weight_,points_,levels_,zoom_,numLevels_,polylinetxt_, isAnon_) {
-    var encodedPolyline = new GPolyline.fromEncoded({
-                                color: color_,
-                                weight: weight_,
-                                points: points_,
-                                latlngs: "40,12",
-                                levels: levels_,
-                                zoomFactor: zoom_,
-                                numLevels: numLevels_
-                                  });
-    
-    try {
-    	encodedPolyline.getLength()
-    } catch (err) {
-    	if(!isAnon_)
-    		alert("Encoding problem found for polyline: "+polylinetxt_)
-    	return null;
-    }
+function createPolyline(position_,defaultActive_,color_,weight_,points_,levels_,zoom_,numLevels_,polylinetxt_) {
     
-    GEvent.addListener(encodedPolyline, 'click', function(overlay) {
-    		map.openInfoWindow(overlay,polylinetxt_);
-    });
+    var decodedPath = google.maps.geometry.encoding.decodePath(points_); 
+    var decodedLevels = decodeLevels(levels_);
+   
+   
+    var encodedPolyline = new google.maps.Polyline({
+        path: decodedPath,
+        levels: decodedLevels,
+        strokeColor: color_,
+        strokeWeight: weight_,
+        zoom: zoom_,
+
+    });   
     
-    GEvent.addListener(encodedPolyline, 'mouseover', function(overlay) {
-    	// DO NOTHING
+    //Polyline Info window
+    google.maps.event.addListener(encodedPolyline,'click', function(event){
+        var infowindow = new google.maps.InfoWindow({content: polylinetxt_});
+        var point = event.latLng;
+        var marker = new google.maps.Marker({position:point});
+        infowindow.open(map,marker);
     });
-    
+
+
     if(defaultActive_)
-        encodedPolyline.show();
+        encodedPolyline.setMap(map);
     else
-        encodedPolyline.hide();
-    
-    gpolylines[position_] = encodedPolyline;
-    map.addOverlay(encodedPolyline);
-        
-    return encodedPolyline;
+        encodedPolyline.setMap(null);    
+ 
+	gpolylines[position_] = encodedPolyline;
 }
 
-// == a polyline has been clicked ==
+
+
+// == a polyline has been clicked in lateral box ==
 function polylineClick(box,i) {
 	var poly = gpolylines[i];
 	if(poly) {
 	    if (box.checked) {
-	      poly.show();
-	      map.setCenter(poly.getBounds().getCenter());
-	      var midVertex = Math.round(poly.getVertexCount() / 2);
-	      GEvent.trigger(poly,"click",poly.getVertex(midVertex));
+	      gpolylines[i].setMap(map);
+
 	    } else {
-	    	poly.hide();
-	    	map.closeInfoWindow();
+	    	gpolylines[i].setMap(null);
+	    	infoWindow.close();	    	
 	    }
 	}
 }
 
+
 // == Create polygon
-function createPolygon(position_,defaultActive_,color_,opacity_,outline_,weight_,points_,levels_,zoom_,numLevels_) {
-    var lines = new Array;
-    lines.push({
-            color:color_,
-            weight:weight_,
-            opacity:1,
-            zoomFactor:zoom_,
-            numLevels:numLevels_,
-            points:points_,
-            levels:levels_
-            });
-
-    var encodedPolygon = new GPolygon.fromEncoded({
-                            polylines:lines,
-                            fill:true,
-                            color:color_,
-                            opacity:opacity_,
-                            outline:outline_
-                            });    
+function createPolygon(html_ , position_,defaultActive_,color_,opacity_,outline_,weight_,points_,levels_,zoom_,numLevels_) {
+    var decodedPath = google.maps.geometry.encoding.decodePath(points_); 
+    var decodedLevels = decodeLevels(levels_);
+   
+    if (outline_==false)
+    	weight_=0
+   
+    var polygon = new google.maps.Polygon({
+        path: decodedPath,
+        fill:true,
+        levels: decodedLevels,
+        strokeColor: color_,
+        strokeOpacity:1,        
+        fillColor: color_,
+        fillOpacity: opacity_,
+        strokeWeight: weight_
+    });
+    
+    google.maps.event.addListener(polygon, 'click', function (event) {
+    	var lat = event.latLng.lat();
+        var lng = event.latLng.lng();
+        var latlng = new google.maps.LatLng(lat, lng);
+    	infoWindow.setContent(html_);
+    	infoWindow.setPosition(latlng);
+        infoWindow.open(map);
+    });    
+       
     if(defaultActive_)
-        map.addOverlay(encodedPolygon);
-    gpolygons[position_] = encodedPolygon;    
+       polygon.setMap(map);
+    gpolygons[position_] = polygon;
 }
 
+
 // == a polygon has been clicked ==
 function polygonClick(box,i) {
     if (box.checked) {
-      map.addOverlay(gpolygons[i]);
-      map.setCenter(gpolygons[i].getBounds().getCenter());
-    } else {
-      map.removeOverlay(gpolygons[i]);
-    }
-}
-
-
+      gpolygons[i].setMap(map);
 
-// == refresh map position and marker ==
-function refreshPosition(point) {
-	var map = new GMap2(document.getElementById("map"));
-	map.addControl(new GSmallMapControl());
-    map.addControl(new GMapTypeControl());
-	map.clearOverlays()
-    map.setCenter(point,14);
-    var marker = new GMarker(point, {
-        draggable :true
-    });
-    map.addOverlay(marker);
-
-    GEvent.addListener(marker, "dragend", function() {
-        var pt = marker.getPoint();
-        map.panTo(pt);
-        document.getElementById(fieldId).value = pt.lat().toFixed(5) + "|" + pt.lng().toFixed(5);
-    });
+    } else {
+      gpolygons[i].setMap(null);	
 
-    GEvent.addListener(map, "moveend", function() {
-        map.clearOverlays();
-        var center = map.getCenter();
-        var marker = new GMarker(center, {
-            draggable :true
-        });
-        map.addOverlay(marker);
-        document.getElementById(fieldId).value = center.lat().toFixed(5) + "|" + center.lng().toFixed(5);
-
-        GEvent.addListener(marker, "dragend", function() {
-            var pt = marker.getPoint();
-            map.panTo(pt);
-            document.getElementById(fieldId).value = pt.lat().toFixed(5) + "|" + pt.lng().toFixed(5);
-        });
-    });
+    }
 }
 
 
-// == disableCoordinates ==
-function disableCoordinates(coordField) {
-	document.getElementById(coordField).value = "0|0";
-	var lat = 0;
-	var long = 0;
-	var point = new GLatLng(lat,long);
-	refreshPosition(point);
-}
-
+function decodeLevels(encodedLevelsString) {
+    var decodedLevels = [];
 
-// == update latlong (marker edit) ==
-function updateMapLatLong(fieldId) {
-	var splitCoords= document.getElementById(fieldId).value.split("|");
-	var lat = splitCoords[0];
-	var long = splitCoords[1];
-	var point = new GLatLng(lat,long);
-	refreshPosition(point);
-}
-
-// == search address (marker edit) ==
-function searchAddress(address, fieldId) {
-    if (geocoder) {
-        geocoder.getLatLng(address, function(point) {
-            if (!point) {
-            	errnotify(ERRCODES[G_GEO_UNKNOWN_ADDRESS]);
-            } else {
-            	document.getElementById(fieldId).value = point.lat().toFixed(5) + "|" + point.lng().toFixed(5); 
-            	refreshPosition(point);
-            }
-        });
+    for (var i = 0; i < encodedLevelsString.length; ++i) {
+        var level = encodedLevelsString.charCodeAt(i) - 63;
+        decodedLevels.push(level);
     }
-}
-
-//== disable enter ==
-function disableEnterKey(e) {
-     var key;     
-     if(window.event)
-          key = window.event.keyCode; // IE
-     else
-          key = e.which; // firefox
-     return (key != 13);
+    return decodedLevels;
 }
 
 
 //== Get Directions has been clicked ==//
-function get_directions_from_data(){
+function get_directions_from_data() {
 	var street = document.getElementById("tt_street_address").value;
 	var city = document.getElementById("tt_city_name").value;
 	var state = document.getElementById("tt_state_name").value;
 	var country = document.getElementById("tt_country_name").value;
-	var full_address = street + ', ' + city + ', ' + state + ', ' + country;
-	if (!geocoder){
-        var geocoder = new GClientGeocoder();
-	}
-	if (active_gmarker==null){
-        errnotify(ERRCODES[TT_NO_MARKER_SELECTED]);
-	}
-	else if (active_directions){
-	        active_directions.clear()
-	}
-	else {
-	    active_directions=new GDirections(map, document.getElementById("g_directions"));
-	    GEvent.addListener(active_directions, "error", g_notify_error);
-	    GEvent.addListener(active_directions, "load", g_clear_on_success);
+	var start = street + ', ' + city + ', ' + state + ', ' + country;
+	
+	if (active_gmarker==null) {
+        errnotify(ERRCODES['TT_NO_MARKER_SELECTED']);
 	}
+	else if (active_directions) {
+	    active_directions.clear(); 
+	}	
+	var latlng = active_gmarker.getPosition();
 	
-	geocoder.getLatLng(full_address, function(g_point){
-	    if (g_point != null) {
-	    	try {
-	    		active_directions.load("from:" + full_address + "@" + g_point.toUrlValue(6) + " to:" + active_gmarker.myname + "@" + active_gmarker.getLatLng().toUrlValue(6) );
-	    		self.location.hash='directionsBox';
-	    	} catch (e) {
-	    		// do nothing
-	    	}	        
-	    }
-	    else{
-	        errnotify(ERRCODES[G_GEO_UNKNOWN_ADDRESS]);
-	    }
-	});
-        
+	var geocoder = new google.maps.Geocoder();
+	geocoder.geocode({'latLng': latlng}, function(results, status) {
+		if (status == google.maps.GeocoderStatus.OK) {
+			if (results[0]) {
+				var end = results[0].formatted_address;
+
+				var request = {
+					origin : start,
+					destination : end,
+					travelMode : google.maps.TravelMode.DRIVING
+				};
+				directionsService.route(request, function(response, status) {
+					if (status == google.maps.DirectionsStatus.OK) {
+						directionsDisplay.setDirections(response);
+					} else {
+						errnotify(ERRCODES['G_GEO_UNKNOWN_ADDRESS']);
+					}
+				});
+			}
+		} else {
+			console.log(results);
+			console.log(status);
+		}
+    });	
 }
 
+
 //== Notify errors to a section of the page ==
-function errnotify(err_message){
+function errnotify(err_message) {
 	var err_display = document.getElementById('error_display');
-	err_display.innerHTML = '<dl class="portalMessage error"><dt>'+ERRCODES[TT_ERROR]+'</dt> <dd>'+err_message+'</dd>  </dl>';
+	err_display.innerHTML = '<dl class="portalMessage error"><dt>'+ERRCODES['TT_ERROR']+'</dt> <dd>'+err_message+'</dd>  </dl>';
 	self.location.hash='errorBox';
 }
 
-function g_notify_error(){
-	g_directions_status = active_directions.getStatus().code;
-	if (g_directions_status != 200){
-	    errnotify(ERRCODES[g_directions_status]);
-	}
-	else{
-        errnotify("hellllp");
-	}
+//== Notify errors to a popup ==
+function errpopup(err_message) {
+	alert(ERRCODES['TT_ERROR'] + ": " + err_message);
 }
 
-function g_clear_on_success(){
-	var err_display = document.getElementById('error_display');
-	err_display.innerHTML = "";
-}
+
+function addMapButton(HTMLlabel, callbackFunction) {
+	
+	  var buttonDiv = document.createElement('div');
+	  buttonDiv.index = 1;
+
+	  buttonDiv.style.padding = '5px';
+
+	  // Set CSS for the control border
+	  var controlUI = document.createElement('div');
+	  controlUI.style.backgroundColor = 'white';
+	  controlUI.style.borderStyle = 'solid';
+	  controlUI.style.borderWidth = '1px';
+	  controlUI.style.borderColor = '#717B87';	  
+	  controlUI.style.cursor = 'pointer';
+	  controlUI.style.textAlign = 'center';
+	  buttonDiv.appendChild(controlUI);
+
+	  // Set CSS for the control interior
+	  var controlText = document.createElement('div');
+	  controlText.style.paddingLeft = '6px';
+	  controlText.style.paddingRight = '6px';
+	  controlText.style.paddingTop = '1px';
+	  controlText.style.paddingBottom = '1px';
+	  controlText.innerHTML = HTMLlabel;
+	  controlUI.appendChild(controlText);
+
+	  google.maps.event.addDomListener(controlUI, 'click', function() {
+		  callbackFunction();
+	  });
+	  
+	  map.controls[google.maps.ControlPosition.TOP_RIGHT].push(buttonDiv);
+
+	}
 

Added: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_widget_functions.js
==============================================================================
--- (empty file)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/googlemap_widget_functions.js	Wed Oct  9 15:36:33 2013
@@ -0,0 +1,40 @@
+// == refresh map position and marker ==
+function refreshMarkerPosition(point) {		
+	marker.setPosition(point);
+    map.panTo(point);
+    
+    if (coordFieldId && coordFieldId!="") { // if edit mode
+    	document.getElementById(coordFieldId).value = point.lat().toFixed(5) + "|" + point.lng().toFixed(5);
+    }
+}
+
+
+// == disableCoordinates ==
+function disableCoordinates() {
+	var point = new google.maps.LatLng(0,0);
+	refreshMarkerPosition(point);
+}
+
+
+// == search address (marker edit map) ==
+function searchAddress(address) {
+    var geocoder = new google.maps.Geocoder();
+    geocoder.geocode( {'address': address}, function(results,status) {
+        if (status == google.maps.GeocoderStatus.OK) {
+	        var point = results[0].geometry.location;        
+	        refreshMarkerPosition(point);
+        } else {
+            errpopup(ERRCODES['G_GEO_UNKNOWN_ADDRESS']);
+        }
+    });
+}
+
+//== disable enter ==
+function disableEnterKey(e) {
+     var key;     
+     if(window.event)
+          key = window.event.keyCode; // IE
+     else
+          key = e.which; // firefox
+     return (key != 13);
+}
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markerclusterer.js
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markerclusterer.js	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markerclusterer.js	Wed Oct  9 15:36:33 2013
@@ -1,27 +1,22 @@
+// ==ClosureCompiler==
+// @compilation_level ADVANCED_OPTIMIZATIONS
+// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3_3.js
+// ==/ClosureCompiler==
+
 /**
- * @name MarkerClusterer
- * @version 1.0
- * @author Xiaoxi Wu
- * @copyright (c) 2009 Xiaoxi Wu
+ * @name MarkerClusterer for Google Maps v3
+ * @version version 1.0.1
+ * @author Luke Mahe
  * @fileoverview
- * This javascript library creates and manages per-zoom-level 
- * clusters for large amounts of markers (hundreds or thousands).
- * This library was inspired by the <a href="http://www.maptimize.com">
- * Maptimize</a> hosted clustering solution.
- * <br /><br/>
- * <b>How it works</b>:<br/>
- * The <code>MarkerClusterer</code> will group markers into clusters according to
- * their distance from a cluster's center. When a marker is added,
- * the marker cluster will find a position in all the clusters, and 
- * if it fails to find one, it will create a new cluster with the marker.
- * The number of markers in a cluster will be displayed
- * on the cluster marker. When the map viewport changes,
- * <code>MarkerClusterer</code> will destroy the clusters in the viewport 
- * and regroup them into new clusters.
- *
+ * The library creates and manages per-zoom-level clusters for large amounts of
+ * markers.
+ * <br/>
+ * This is a v3 implementation of the
+ * <a href="http://gmaps-utility-library-dev.googlecode.com/svn/tags/markerclusterer/"
+ * >v2 MarkerClusterer</a>.
  */
 
-/*
+/**
  * 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
@@ -37,700 +32,1279 @@
 
 
 /**
- * @name MarkerClustererOptions
- * @class This class represents optional arguments to the {@link MarkerClusterer}
- * constructor.
- * @property {Number} [maxZoom] The max zoom level monitored by a
- * marker cluster. If not given, the marker cluster assumes the maximum map
- * zoom level. When maxZoom is reached or exceeded all markers will be shown
- * without cluster.
- * @property {Number} [gridSize=60] The grid size of a cluster in pixel. Each
- * cluster will be a square. If you want the algorithm to run faster, you can set
- * this value larger.
- * @property {Array of MarkerStyleOptions} [styles]
- * Custom styles for the cluster markers.
- * The array should be ordered according to increasing cluster size,
- * with the style for the smallest clusters first, and the style for the
- * largest clusters last.
- */
-
-/**
- * @name MarkerStyleOptions
- * @class An array of these is passed into the {@link MarkerClustererOptions}
- * styles option.
- * @property {String} [url] Image url.
- * @property {Number} [height] Image height.
- * @property {Number} [height] Image width.
- * @property {Array of Number} [opt_anchor] Anchor for label text, like [24, 12]. 
- *    If not set, the text will align center and middle.
- * @property {String} [opt_textColor="black"] Text color.
- */
-
-/**
- * Creates a new MarkerClusterer to cluster markers on the map.
+ * A Marker Clusterer that clusters markers.
  *
+ * @param {google.maps.Map} map The Google map to attach to.
+ * @param {Array.<google.maps.Marker>=} opt_markers Optional markers to add to
+ *   the cluster.
+ * @param {Object=} opt_options support the following options:
+ *     'gridSize': (number) The grid size of a cluster in pixels.
+ *     'maxZoom': (number) The maximum zoom level that a marker can be part of a
+ *                cluster.
+ *     'zoomOnClick': (boolean) Whether the default behaviour of clicking on a
+ *                    cluster is to zoom into it.
+ *     'averageCenter': (boolean) Wether the center of each cluster should be
+ *                      the average of all markers in the cluster.
+ *     'minimumClusterSize': (number) The minimum number of markers to be in a
+ *                           cluster before the markers are hidden and a count
+ *                           is shown.
+ *     'styles': (object) An object that has style properties:
+ *       'url': (string) The image url.
+ *       'height': (number) The image height.
+ *       'width': (number) The image width.
+ *       'anchor': (Array) The anchor position of the label text.
+ *       'textColor': (string) The text color.
+ *       'textSize': (number) The text size.
+ *       'backgroundPosition': (string) The position of the backgound x, y.
  * @constructor
- * @param {GMap2} map The map that the markers should be added to.
- * @param {Array of GMarker} opt_markers Initial set of markers to be clustered.
- * @param {MarkerClustererOptions} opt_opts A container for optional arguments.
- */
-function MarkerClusterer(map, opt_markers, opt_opts) {
-  // private members
-  var clusters_ = [];
-  var map_ = map;
-  var maxZoom_ = null;
-  var me_ = this;
-  var gridSize_ = 60;
-  var sizes = [53, 56, 66, 78, 90];
-  var styles_ = [];
-  var leftMarkers_ = [];
-  var mcfn_ = null;
-
-  var i = 0;
-  for (i = 1; i <= 5; ++i) {
-    styles_.push({
-      'url': "http://gmaps-utility-library.googlecode.com/svn/trunk/markerclusterer/images/m" + i + ".png",
-      'height': sizes[i - 1],
-      'width': sizes[i - 1]
-    });
-  }
-
-  if (typeof opt_opts === "object" && opt_opts !== null) {
-    if (typeof opt_opts.gridSize === "number" && opt_opts.gridSize > 0) {
-      gridSize_ = opt_opts.gridSize;
-    }
-    if (typeof opt_opts.maxZoom === "number") {
-      maxZoom_ = opt_opts.maxZoom;
-    }
-    if (typeof opt_opts.styles === "object" && opt_opts.styles !== null && opt_opts.styles.length !== 0) {
-      styles_ = opt_opts.styles;
-    }
-  }
+ * @extends google.maps.OverlayView
+ */
+function MarkerClusterer(map, opt_markers, opt_options) {
+  // MarkerClusterer implements google.maps.OverlayView interface. We use the
+  // extend function to extend MarkerClusterer with google.maps.OverlayView
+  // because it might not always be available when the code is defined so we
+  // look for it at the last possible moment. If it doesn't exist now then
+  // there is no point going ahead :)
+  this.extend(MarkerClusterer, google.maps.OverlayView);
+  this.map_ = map;
 
   /**
-   * When we add a marker, the marker may not in the viewport of map, then we don't deal with it, instead
-   * we add the marker into a array called leftMarkers_. When we reset MarkerClusterer we should add the
-   * leftMarkers_ into MarkerClusterer.
+   * @type {Array.<google.maps.Marker>}
+   * @private
    */
-  function addLeftMarkers_() {
-    if (leftMarkers_.length === 0) {
-      return;
-    }
-    var leftMarkers = [];
-    for (i = 0; i < leftMarkers_.length; ++i) {
-      me_.addMarker(leftMarkers_[i], true, null, null, true);
-    }
-    leftMarkers_ = leftMarkers;
-  }
+  this.markers_ = [];
 
   /**
-   * Get cluster marker images of this marker cluster. Mostly used by {@link Cluster}
-   * @private
-   * @return {Array of String}
+   *  @type {Array.<Cluster>}
    */
-  this.getStyles_ = function () {
-    return styles_;
-  };
+  this.clusters_ = [];
+
+  this.sizes = [53, 56, 66, 78, 90];
 
   /**
-   * Remove all markers from MarkerClusterer.
+   * @private
    */
-  this.clearMarkers = function () {
-    for (var i = 0; i < clusters_.length; ++i) {
-      if (typeof clusters_[i] !== "undefined" && clusters_[i] !== null) {
-        clusters_[i].clearMarkers();
-      }
-    }
-    clusters_ = [];
-    leftMarkers_ = [];
-    GEvent.removeListener(mcfn_);
-  };
+  this.styles_ = [];
 
   /**
-   * Check a marker, whether it is in current map viewport.
+   * @type {boolean}
    * @private
-   * @return {Boolean} if it is in current map viewport
    */
-  function isMarkerInViewport_(marker) {
-    return map_.getBounds().containsLatLng(marker.getLatLng());
-  }
+  this.ready_ = false;
+
+  var options = opt_options || {};
 
   /**
-   * When reset MarkerClusterer, there will be some markers get out of its cluster.
-   * These markers should be add to new clusters.
-   * @param {Array of GMarker} markers Markers to add.
+   * @type {number}
+   * @private
    */
-  function reAddMarkers_(markers) {
-    var len = markers.length;
-    var clusters = [];
-    for (var i = len - 1; i >= 0; --i) {
-      me_.addMarker(markers[i].marker, true, markers[i].isAdded, clusters, true);
-    }
-    addLeftMarkers_();
-  }
+  this.gridSize_ = options['gridSize'] || 60;
 
   /**
-   * Add a marker.
    * @private
-   * @param {GMarker} marker Marker you want to add
-   * @param {Boolean} opt_isNodraw Whether redraw the cluster contained the marker
-   * @param {Boolean} opt_isAdded Whether the marker is added to map. Never use it.
-   * @param {Array of Cluster} opt_clusters Provide a list of clusters, the marker
-   *     cluster will only check these cluster where the marker should join.
    */
-  this.addMarker = function (marker, opt_isNodraw, opt_isAdded, opt_clusters, opt_isNoCheck) {
-    if (opt_isNoCheck !== true) {
-      if (!isMarkerInViewport_(marker)) {
-        leftMarkers_.push(marker);
-        return;
-      }
-    }
-
-    var isAdded = opt_isAdded;
-    var clusters = opt_clusters;
-    var pos = map_.fromLatLngToDivPixel(marker.getLatLng());
-
-    if (typeof isAdded !== "boolean") {
-      isAdded = false;
-    }
-    if (typeof clusters !== "object" || clusters === null) {
-      clusters = clusters_;
-    }
-
-    var length = clusters.length;
-    var cluster = null;
-    for (var i = length - 1; i >= 0; i--) {
-      cluster = clusters[i];
-      var center = cluster.getCenter();
-      if (center === null) {
-        continue;
-      }
-      center = map_.fromLatLngToDivPixel(center);
-
-      // Found a cluster which contains the marker.
-      if (pos.x >= center.x - gridSize_ && pos.x <= center.x + gridSize_ &&
-          pos.y >= center.y - gridSize_ && pos.y <= center.y + gridSize_) {
-        cluster.addMarker({
-          'isAdded': isAdded,
-          'marker': marker
-        });
-        if (!opt_isNodraw) {
-          cluster.redraw_();
-        }
-        return;
-      }
-    }
-
-    // No cluster contain the marker, create a new cluster.
-    cluster = new Cluster(this, map);
-    cluster.addMarker({
-      'isAdded': isAdded,
-      'marker': marker
-    });
-    if (!opt_isNodraw) {
-      cluster.redraw_();
-    }
+  this.minClusterSize_ = options['minimumClusterSize'] || 2;
 
-    // Add this cluster both in clusters provided and clusters_
-    clusters.push(cluster);
-    if (clusters !== clusters_) {
-      clusters_.push(cluster);
-    }
-  };
 
   /**
-   * Remove a marker.
-   *
-   * @param {GMarker} marker The marker you want to remove.
+   * @type {?number}
+   * @private
    */
+  this.maxZoom_ = options['maxZoom'] || null;
 
-  this.removeMarker = function (marker) {
-    for (var i = 0; i < clusters_.length; ++i) {
-      if (clusters_[i].remove(marker)) {
-        clusters_[i].redraw_();
-        return;
-      }
-    }
-  };
+  this.styles_ = options['styles'] || [];
 
   /**
-   * Redraw all clusters in viewport.
+   * @type {string}
+   * @private
    */
-  this.redraw_ = function () {
-    var clusters = this.getClustersInViewport_();
-    for (var i = 0; i < clusters.length; ++i) {
-      clusters[i].redraw_(true);
-    }
-  };
+  this.imagePath_ = options['imagePath'] ||
+      this.MARKER_CLUSTER_IMAGE_PATH_;
 
   /**
-   * Get all clusters in viewport.
-   * @return {Array of Cluster}
+   * @type {string}
+   * @private
    */
-  this.getClustersInViewport_ = function () {
-    var clusters = [];
-    var curBounds = map_.getBounds();
-    for (var i = 0; i < clusters_.length; i ++) {
-      if (clusters_[i].isInBounds(curBounds)) {
-        clusters.push(clusters_[i]);
-      }
-    }
-    return clusters;
-  };
+  this.imageExtension_ = options['imageExtension'] ||
+      this.MARKER_CLUSTER_IMAGE_EXTENSION_;
 
   /**
-   * Get max zoom level.
+   * @type {boolean}
    * @private
-   * @return {Number}
    */
-  this.getMaxZoom_ = function () {
-    return maxZoom_;
-  };
+  this.zoomOnClick_ = true;
+
+  if (options['zoomOnClick'] != undefined) {
+    this.zoomOnClick_ = options['zoomOnClick'];
+  }
 
   /**
-   * Get map object.
+   * @type {boolean}
    * @private
-   * @return {GMap2}
    */
-  this.getMap_ = function () {
-    return map_;
-  };
+  this.averageCenter_ = false;
+
+  if (options['averageCenter'] != undefined) {
+    this.averageCenter_ = options['averageCenter'];
+  }
+
+  this.setupStyles_();
+
+  this.setMap(map);
 
   /**
-   * Get grid size
+   * @type {number}
    * @private
-   * @return {Number}
    */
-  this.getGridSize_ = function () {
-    return gridSize_;
-  };
+  this.prevZoom_ = this.map_.getZoom();
 
-  /**
-   * Get total number of markers.
-   * @return {Number}
-   */
-  this.getTotalMarkers = function () {
-    var result = 0;
-    for (var i = 0; i < clusters_.length; ++i) {
-      result += clusters_[i].getTotalMarkers();
+  // Add the map event listeners
+  var that = this;
+  google.maps.event.addListener(this.map_, 'zoom_changed', function() {
+    // Determines map type and prevent illegal zoom levels
+    var zoom = that.map_.getZoom();
+    var minZoom = that.map_.minZoom || 0;
+    var maxZoom = Math.min(that.map_.maxZoom || 100,
+                         that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom);
+    zoom = Math.min(Math.max(zoom,minZoom),maxZoom);
+
+    if (that.prevZoom_ != zoom) {
+      that.prevZoom_ = zoom;
+      that.resetViewport();
     }
-    return result;
-  };
+  });
 
-  /**
-   * Get total number of clusters.
-   * @return {int}
-   */
-  this.getTotalClusters = function () {
-    return clusters_.length;
-  };
+  google.maps.event.addListener(this.map_, 'idle', function() {
+    that.redraw();
+  });
 
-  /**
-   * Collect all markers of clusters in viewport and regroup them.
-   */
-  this.resetViewport = function () {
-    var clusters = this.getClustersInViewport_();
-    var tmpMarkers = [];
-    var removed = 0;
-
-    for (var i = 0; i < clusters.length; ++i) {
-      var cluster = clusters[i];
-      var oldZoom = cluster.getCurrentZoom();
-      if (oldZoom === null) {
-        continue;
-      }
-      var curZoom = map_.getZoom();
-      if (curZoom !== oldZoom) {
+  // Finally, add the markers
+  if (opt_markers && (opt_markers.length || Object.keys(opt_markers).length)) {
+    this.addMarkers(opt_markers, false);
+  }
+}
 
-        // If the cluster zoom level changed then destroy the cluster
-        // and collect its markers.
-        var mks = cluster.getMarkers();
-        for (var j = 0; j < mks.length; ++j) {
-          var newMarker = {
-            'isAdded': false,
-            'marker': mks[j].marker
-          };
-          tmpMarkers.push(newMarker);
-        }
-        cluster.clearMarkers();
-        removed++;
-        for (j = 0; j < clusters_.length; ++j) {
-          if (cluster === clusters_[j]) {
-            clusters_.splice(j, 1);
-          }
-        }
-      }
-    }
 
-    // Add the markers collected into marker cluster to reset
-    reAddMarkers_(tmpMarkers);
-    this.redraw_();
-  };
+/**
+ * The marker cluster image path.
+ *
+ * @type {string}
+ * @private
+ */
+MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ =
+    'http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/' +
+    'images/m';
 
 
-  /**
-   * Add a set of markers.
-   *
-   * @param {Array of GMarker} markers The markers you want to add.
-   */
-  this.addMarkers = function (markers) {
-    for (var i = 0; i < markers.length; ++i) {
-      this.addMarker(markers[i], true);
+/**
+ * The marker cluster image path.
+ *
+ * @type {string}
+ * @private
+ */
+MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';
+
+
+/**
+ * Extends a objects prototype by anothers.
+ *
+ * @param {Object} obj1 The object to be extended.
+ * @param {Object} obj2 The object to extend with.
+ * @return {Object} The new extended object.
+ * @ignore
+ */
+MarkerClusterer.prototype.extend = function(obj1, obj2) {
+  return (function(object) {
+    for (var property in object.prototype) {
+      this.prototype[property] = object.prototype[property];
     }
-    this.redraw_();
-  };
+    return this;
+  }).apply(obj1, [obj2]);
+};
 
-  // initialize
-  if (typeof opt_markers === "object" && opt_markers !== null) {
-    this.addMarkers(opt_markers);
-  }
 
-  // when map move end, regroup.
-  mcfn_ = GEvent.addListener(map_, "moveend", function () {
-    me_.resetViewport();
-  });
-}
+/**
+ * Implementaion of the interface method.
+ * @ignore
+ */
+MarkerClusterer.prototype.onAdd = function() {
+  this.setReady_(true);
+};
 
 /**
- * Create a cluster to collect markers.
- * A cluster includes some markers which are in a block of area.
- * If there are more than one markers in cluster, the cluster
- * will create a {@link ClusterMarker_} and show the total number
- * of markers in cluster.
+ * Implementaion of the interface method.
+ * @ignore
+ */
+MarkerClusterer.prototype.draw = function() {};
+
+/**
+ * Sets up the styles object.
  *
- * @constructor
  * @private
- * @param {MarkerClusterer} markerClusterer The marker cluster object
  */
-function Cluster(markerClusterer) {
-  var center_ = null;
-  var markers_ = [];
-  var markerClusterer_ = markerClusterer;
-  var map_ = markerClusterer.getMap_();
-  var clusterMarker_ = null;
-  var zoom_ = map_.getZoom();
+MarkerClusterer.prototype.setupStyles_ = function() {
+  if (this.styles_.length) {
+    return;
+  }
 
-  /**
-   * Get markers of this cluster.
-   *
-   * @return {Array of GMarker}
-   */
-  this.getMarkers = function () {
-    return markers_;
-  };
+  for (var i = 0, size; size = this.sizes[i]; i++) {
+    this.styles_.push({
+      url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_,
+      height: size,
+      width: size
+    });
+  }
+};
 
-  /**
-   * If this cluster intersects certain bounds.
-   *
-   * @param {GLatLngBounds} bounds A bounds to test
-   * @return {Boolean} Is this cluster intersects the bounds
-   */
-  this.isInBounds = function (bounds) {
-    if (center_ === null) {
-      return false;
-    }
+/**
+ *  Fit the map to the bounds of the markers in the clusterer.
+ */
+MarkerClusterer.prototype.fitMapToMarkers = function() {
+  var markers = this.getMarkers();
+  var bounds = new google.maps.LatLngBounds();
+  for (var i = 0, marker; marker = markers[i]; i++) {
+    bounds.extend(marker.getPosition());
+  }
 
-    if (!bounds) {
-      bounds = map_.getBounds();
-    }
-    var sw = map_.fromLatLngToDivPixel(bounds.getSouthWest());
-    var ne = map_.fromLatLngToDivPixel(bounds.getNorthEast());
+  this.map_.fitBounds(bounds);
+};
 
-    var centerxy = map_.fromLatLngToDivPixel(center_);
-    var inViewport = true;
-    var gridSize = markerClusterer.getGridSize_();
-    if (zoom_ !== map_.getZoom()) {
-      var dl = map_.getZoom() - zoom_;
-      gridSize = Math.pow(2, dl) * gridSize;
-    }
-    if (ne.x !== sw.x && (centerxy.x + gridSize < sw.x || centerxy.x - gridSize > ne.x)) {
-      inViewport = false;
-    }
-    if (inViewport && (centerxy.y + gridSize < ne.y || centerxy.y - gridSize > sw.y)) {
-      inViewport = false;
-    }
-    return inViewport;
-  };
 
-  /**
-   * Get cluster center.
-   *
-   * @return {GLatLng}
-   */
-  this.getCenter = function () {
-    return center_;
-  };
+/**
+ *  Sets the styles.
+ *
+ *  @param {Object} styles The style to set.
+ */
+MarkerClusterer.prototype.setStyles = function(styles) {
+  this.styles_ = styles;
+};
 
-  /**
-   * Add a marker.
-   *
-   * @param {Object} marker An object of marker you want to add:
-   *   {Boolean} isAdded If the marker is added on map.
-   *   {GMarker} marker The marker you want to add.
-   */
-  this.addMarker = function (marker) {
-    if (center_ === null) {
-      /*var pos = marker['marker'].getLatLng();
-       pos = map.fromLatLngToContainerPixel(pos);
-       pos.x = parseInt(pos.x - pos.x % (GRIDWIDTH * 2) + GRIDWIDTH);
-       pos.y = parseInt(pos.y - pos.y % (GRIDWIDTH * 2) + GRIDWIDTH);
-       center = map.fromContainerPixelToLatLng(pos);*/
-      center_ = marker.marker.getLatLng();
-    }
-    markers_.push(marker);
-  };
 
-  /**
-   * Remove a marker from cluster.
-   *
-   * @param {GMarker} marker The marker you want to remove.
-   * @return {Boolean} Whether find the marker to be removed.
-   */
-  this.removeMarker = function (marker) {
-    for (var i = 0; i < markers_.length; ++i) {
-      if (marker === markers_[i].marker) {
-        if (markers_[i].isAdded) {
-          map_.removeOverlay(markers_[i].marker);
-        }
-        markers_.splice(i, 1);
-        return true;
-      }
-    }
-    return false;
-  };
+/**
+ *  Gets the styles.
+ *
+ *  @return {Object} The styles object.
+ */
+MarkerClusterer.prototype.getStyles = function() {
+  return this.styles_;
+};
 
-  /**
-   * Get current zoom level of this cluster.
-   * Note: the cluster zoom level and map zoom level not always the same.
-   *
-   * @return {Number}
-   */
-  this.getCurrentZoom = function () {
-    return zoom_;
-  };
 
-  /**
-   * Redraw a cluster.
-   * @private
-   * @param {Boolean} isForce If redraw by force, no matter if the cluster is
-   *     in viewport.
-   */
-  this.redraw_ = function (isForce) {
-    if (!isForce && !this.isInBounds()) {
-      return;
-    }
-
-    // Set cluster zoom level.
-    zoom_ = map_.getZoom();
-    var i = 0;
-    var mz = markerClusterer.getMaxZoom_();
-    if (mz === null) {
-      mz = map_.getCurrentMapType().getMaximumResolution();
-    }
-    if (zoom_ >= mz || this.getTotalMarkers() === 1) {
-
-      // If current zoom level is beyond the max zoom level or the cluster
-      // have only one marker, the marker(s) in cluster will be showed on map.
-      for (i = 0; i < markers_.length; ++i) {
-        if (markers_[i].isAdded) {
-          if (markers_[i].marker.isHidden()) {
-            markers_[i].marker.show();
-          }
-        } else {
-          map_.addOverlay(markers_[i].marker);
-          markers_[i].isAdded = true;
-        }
-      }
-      if (clusterMarker_ !== null) {
-        clusterMarker_.hide();
-      }
-    } else {
-      // Else add a cluster marker on map to show the number of markers in
-      // this cluster.
-      for (i = 0; i < markers_.length; ++i) {
-        if (markers_[i].isAdded && (!markers_[i].marker.isHidden())) {
-          markers_[i].marker.hide();
-        }
-      }
-      if (clusterMarker_ === null) {
-        clusterMarker_ = new ClusterMarker_(center_, this.getTotalMarkers(), markerClusterer_.getStyles_(), markerClusterer_.getGridSize_());
-        map_.addOverlay(clusterMarker_);
-      } else {
-        if (clusterMarker_.isHidden()) {
-          clusterMarker_.show();
-        }
-        clusterMarker_.redraw(true);
-      }
-    }
-  };
+/**
+ * Whether zoom on click is set.
+ *
+ * @return {boolean} True if zoomOnClick_ is set.
+ */
+MarkerClusterer.prototype.isZoomOnClick = function() {
+  return this.zoomOnClick_;
+};
 
-  /**
-   * Remove all the markers from this cluster.
-   */
-  this.clearMarkers = function () {
-    if (clusterMarker_ !== null) {
-      map_.removeOverlay(clusterMarker_);
-    }
-    for (var i = 0; i < markers_.length; ++i) {
-      if (markers_[i].isAdded) {
-        map_.removeOverlay(markers_[i].marker);
-      }
-    }
-    markers_ = [];
-  };
+/**
+ * Whether average center is set.
+ *
+ * @return {boolean} True if averageCenter_ is set.
+ */
+MarkerClusterer.prototype.isAverageCenter = function() {
+  return this.averageCenter_;
+};
 
-  /**
-   * Get number of markers.
-   * @return {Number}
-   */
-  this.getTotalMarkers = function () {
-    return markers_.length;
-  };
-}
 
 /**
- * ClusterMarker_ creates a marker that shows the number of markers that
- * a cluster contains.
+ *  Returns the array of markers in the clusterer.
  *
- * @constructor
- * @private
- * @param {GLatLng} latlng Marker's lat and lng.
- * @param {Number} count Number to show.
- * @param {Array of Object} styles The image list to be showed:
- *   {String} url Image url.
- *   {Number} height Image height.
- *   {Number} width Image width.
- *   {Array of Number} anchor Text anchor of image left and top.
- *   {String} textColor text color.
- * @param {Number} padding Padding of marker center.
+ *  @return {Array.<google.maps.Marker>} The markers.
+ */
+MarkerClusterer.prototype.getMarkers = function() {
+  return this.markers_;
+};
+
+
+/**
+ *  Returns the number of markers in the clusterer
+ *
+ *  @return {Number} The number of markers.
+ */
+MarkerClusterer.prototype.getTotalMarkers = function() {
+  return this.markers_.length;
+};
+
+
+/**
+ *  Sets the max zoom for the clusterer.
+ *
+ *  @param {number} maxZoom The max zoom level.
+ */
+MarkerClusterer.prototype.setMaxZoom = function(maxZoom) {
+  this.maxZoom_ = maxZoom;
+};
+
+
+/**
+ *  Gets the max zoom for the clusterer.
+ *
+ *  @return {number} The max zoom level.
  */
-function ClusterMarker_(latlng, count, styles, padding) {
+MarkerClusterer.prototype.getMaxZoom = function() {
+  return this.maxZoom_;
+};
+
+
+/**
+ *  The function for calculating the cluster icon image.
+ *
+ *  @param {Array.<google.maps.Marker>} markers The markers in the clusterer.
+ *  @param {number} numStyles The number of styles available.
+ *  @return {Object} A object properties: 'text' (string) and 'index' (number).
+ *  @private
+ */
+MarkerClusterer.prototype.calculator_ = function(markers, numStyles) {
   var index = 0;
+  var count = markers.length;
   var dv = count;
   while (dv !== 0) {
     dv = parseInt(dv / 10, 10);
-    index ++;
+    index++;
   }
 
-  if (styles.length < index) {
-    index = styles.length;
-  }
-  this.url_ = styles[index - 1].url;
-  this.height_ = styles[index - 1].height;
-  this.width_ = styles[index - 1].width;
-  this.textColor_ = styles[index - 1].opt_textColor;
-  this.anchor_ = styles[index - 1].opt_anchor;
-  this.latlng_ = latlng;
-  this.index_ = index;
-  this.styles_ = styles;
-  this.text_ = count;
-  this.padding_ = padding;
-}
+  index = Math.min(index, numStyles);
+  return {
+    text: count,
+    index: index
+  };
+};
 
-ClusterMarker_.prototype = new GOverlay();
 
 /**
- * Initialize cluster marker.
- * @private
+ * Set the calculator function.
+ *
+ * @param {function(Array, number)} calculator The function to set as the
+ *     calculator. The function should return a object properties:
+ *     'text' (string) and 'index' (number).
+ *
  */
-ClusterMarker_.prototype.initialize = function (map) {
-  this.map_ = map;
-  var div = document.createElement("div");
-  var latlng = this.latlng_;
-  var pos = map.fromLatLngToDivPixel(latlng);
-  pos.x -= parseInt(this.width_ / 2, 10);
-  pos.y -= parseInt(this.height_ / 2, 10);
-  var mstyle = "";
-  if (document.all) {
-    mstyle = 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="' + this.url_ + '");';
-  } else {
-    mstyle = "background:url(" + this.url_ + ");";
-  }
-  if (typeof this.anchor_ === "object") {
-    if (typeof this.anchor_[0] === "number" && this.anchor_[0] > 0 && this.anchor_[0] < this.height_) {
-      mstyle += 'height:' + (this.height_ - this.anchor_[0]) + 'px;padding-top:' + this.anchor_[0] + 'px;';
-    } else {
-      mstyle += 'height:' + this.height_ + 'px;line-height:' + this.height_ + 'px;';
-    }
-    if (typeof this.anchor_[1] === "number" && this.anchor_[1] > 0 && this.anchor_[1] < this.width_) {
-      mstyle += 'width:' + (this.width_ - this.anchor_[1]) + 'px;padding-left:' + this.anchor_[1] + 'px;';
-    } else {
-      mstyle += 'width:' + this.width_ + 'px;text-align:center;';
-    }
-  } else {
-    mstyle += 'height:' + this.height_ + 'px;line-height:' + this.height_ + 'px;';
-    mstyle += 'width:' + this.width_ + 'px;text-align:center;';
-  }
-  var txtColor = this.textColor_ ? this.textColor_ : 'black';
-
-  div.style.cssText = mstyle + 'cursor:pointer;top:' + pos.y + "px;left:" +
-      pos.x + "px;color:" + txtColor +  ";position:absolute;font-size:11px;" +
-      'font-family:Arial,sans-serif;font-weight:bold';
-  div.innerHTML = this.text_;
-  map.getPane(G_MAP_FLOAT_SHADOW_PANE).appendChild(div);
-  var padding = this.padding_;
-  GEvent.addDomListener(div, "click", function () {
-    var pos = map.fromLatLngToDivPixel(latlng);
-    var sw = new GPoint(pos.x - padding, pos.y + padding);
-    sw = map.fromDivPixelToLatLng(sw);
-    var ne = new GPoint(pos.x + padding, pos.y - padding);
-    ne = map.fromDivPixelToLatLng(ne);
-    var zoom = map.getBoundsZoomLevel(new GLatLngBounds(sw, ne), map.getSize());
-    map.setCenter(latlng, zoom);
-    map.closeInfoWindow();
-  });
-  this.div_ = div;
+MarkerClusterer.prototype.setCalculator = function(calculator) {
+  this.calculator_ = calculator;
 };
 
+
 /**
- * Remove this overlay.
- * @private
+ * Get the calculator function.
+ *
+ * @return {function(Array, number)} the calculator function.
  */
-ClusterMarker_.prototype.remove = function () {
-  this.div_.parentNode.removeChild(this.div_);
+MarkerClusterer.prototype.getCalculator = function() {
+  return this.calculator_;
 };
 
+
 /**
- * Copy this overlay.
- * @private
+ * Add an array of markers to the clusterer.
+ *
+ * @param {Array.<google.maps.Marker>} markers The markers to add.
+ * @param {boolean=} opt_nodraw Whether to redraw the clusters.
  */
-ClusterMarker_.prototype.copy = function () {
-  return new ClusterMarker_(this.latlng_, this.index_, this.text_, this.styles_, this.padding_);
+MarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) {
+  if (markers.length) {
+    for (var i = 0, marker; marker = markers[i]; i++) {
+      this.pushMarkerTo_(marker);
+    }
+  } else if (Object.keys(markers).length) {
+    for (var marker in markers) {
+      this.pushMarkerTo_(markers[marker]);
+    }
+  }
+  if (!opt_nodraw) {
+    this.redraw();
+  }
 };
 
+
 /**
- * Redraw this overlay.
+ * Pushes a marker to the clusterer.
+ *
+ * @param {google.maps.Marker} marker The marker to add.
  * @private
  */
-ClusterMarker_.prototype.redraw = function (force) {
-  if (!force) {
-    return;
+MarkerClusterer.prototype.pushMarkerTo_ = function(marker) {
+  marker.isAdded = false;
+  if (marker['draggable']) {
+    // If the marker is draggable add a listener so we update the clusters on
+    // the drag end.
+    var that = this;
+    google.maps.event.addListener(marker, 'dragend', function() {
+      marker.isAdded = false;
+      that.repaint();
+    });
   }
-  var pos = this.map_.fromLatLngToDivPixel(this.latlng_);
-  pos.x -= parseInt(this.width_ / 2, 10);
-  pos.y -= parseInt(this.height_ / 2, 10);
-  this.div_.style.top =  pos.y + "px";
-  this.div_.style.left = pos.x + "px";
+  this.markers_.push(marker);
 };
 
-/**
- * Hide this cluster marker.
- */
-ClusterMarker_.prototype.hide = function () {
-  this.div_.style.display = "none";
-};
 
 /**
- * Show this cluster marker.
+ * Adds a marker to the clusterer and redraws if needed.
+ *
+ * @param {google.maps.Marker} marker The marker to add.
+ * @param {boolean=} opt_nodraw Whether to redraw the clusters.
  */
-ClusterMarker_.prototype.show = function () {
-  this.div_.style.display = "";
+MarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) {
+  this.pushMarkerTo_(marker);
+  if (!opt_nodraw) {
+    this.redraw();
+  }
 };
 
+
 /**
- * Get whether the cluster marker is hidden.
- * @return {Boolean}
+ * Removes a marker and returns true if removed, false if not
+ *
+ * @param {google.maps.Marker} marker The marker to remove
+ * @return {boolean} Whether the marker was removed or not
+ * @private
  */
-ClusterMarker_.prototype.isHidden = function () {
-  return this.div_.style.display === "none";
-};
+MarkerClusterer.prototype.removeMarker_ = function(marker) {
+  var index = -1;
+  if (this.markers_.indexOf) {
+    index = this.markers_.indexOf(marker);
+  } else {
+    for (var i = 0, m; m = this.markers_[i]; i++) {
+      if (m == marker) {
+        index = i;
+        break;
+      }
+    }
+  }
+
+  if (index == -1) {
+    // Marker is not in our list of markers.
+    return false;
+  }
+
+  marker.setMap(null);
+
+  this.markers_.splice(index, 1);
+
+  return true;
+};
+
+
+/**
+ * Remove a marker from the cluster.
+ *
+ * @param {google.maps.Marker} marker The marker to remove.
+ * @param {boolean=} opt_nodraw Optional boolean to force no redraw.
+ * @return {boolean} True if the marker was removed.
+ */
+MarkerClusterer.prototype.removeMarker = function(marker, opt_nodraw) {
+  var removed = this.removeMarker_(marker);
+
+  if (!opt_nodraw && removed) {
+    this.resetViewport();
+    this.redraw();
+    return true;
+  } else {
+   return false;
+  }
+};
+
+
+/**
+ * Removes an array of markers from the cluster.
+ *
+ * @param {Array.<google.maps.Marker>} markers The markers to remove.
+ * @param {boolean=} opt_nodraw Optional boolean to force no redraw.
+ */
+MarkerClusterer.prototype.removeMarkers = function(markers, opt_nodraw) {
+  var removed = false;
+
+  for (var i = 0, marker; marker = markers[i]; i++) {
+    var r = this.removeMarker_(marker);
+    removed = removed || r;
+  }
+
+  if (!opt_nodraw && removed) {
+    this.resetViewport();
+    this.redraw();
+    return true;
+  }
+};
+
+
+/**
+ * Sets the clusterer's ready state.
+ *
+ * @param {boolean} ready The state.
+ * @private
+ */
+MarkerClusterer.prototype.setReady_ = function(ready) {
+  if (!this.ready_) {
+    this.ready_ = ready;
+    this.createClusters_();
+  }
+};
+
+
+/**
+ * Returns the number of clusters in the clusterer.
+ *
+ * @return {number} The number of clusters.
+ */
+MarkerClusterer.prototype.getTotalClusters = function() {
+  return this.clusters_.length;
+};
+
+
+/**
+ * Returns the google map that the clusterer is associated with.
+ *
+ * @return {google.maps.Map} The map.
+ */
+MarkerClusterer.prototype.getMap = function() {
+  return this.map_;
+};
+
+
+/**
+ * Sets the google map that the clusterer is associated with.
+ *
+ * @param {google.maps.Map} map The map.
+ */
+MarkerClusterer.prototype.setMap = function(map) {
+  this.map_ = map;
+};
+
+
+/**
+ * Returns the size of the grid.
+ *
+ * @return {number} The grid size.
+ */
+MarkerClusterer.prototype.getGridSize = function() {
+  return this.gridSize_;
+};
+
+
+/**
+ * Sets the size of the grid.
+ *
+ * @param {number} size The grid size.
+ */
+MarkerClusterer.prototype.setGridSize = function(size) {
+  this.gridSize_ = size;
+};
+
+
+/**
+ * Returns the min cluster size.
+ *
+ * @return {number} The grid size.
+ */
+MarkerClusterer.prototype.getMinClusterSize = function() {
+  return this.minClusterSize_;
+};
+
+/**
+ * Sets the min cluster size.
+ *
+ * @param {number} size The grid size.
+ */
+MarkerClusterer.prototype.setMinClusterSize = function(size) {
+  this.minClusterSize_ = size;
+};
+
+
+/**
+ * Extends a bounds object by the grid size.
+ *
+ * @param {google.maps.LatLngBounds} bounds The bounds to extend.
+ * @return {google.maps.LatLngBounds} The extended bounds.
+ */
+MarkerClusterer.prototype.getExtendedBounds = function(bounds) {
+  var projection = this.getProjection();
+
+  // Turn the bounds into latlng.
+  var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),
+      bounds.getNorthEast().lng());
+  var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),
+      bounds.getSouthWest().lng());
+
+  // Convert the points to pixels and the extend out by the grid size.
+  var trPix = projection.fromLatLngToDivPixel(tr);
+  trPix.x += this.gridSize_;
+  trPix.y -= this.gridSize_;
+
+  var blPix = projection.fromLatLngToDivPixel(bl);
+  blPix.x -= this.gridSize_;
+  blPix.y += this.gridSize_;
+
+  // Convert the pixel points back to LatLng
+  var ne = projection.fromDivPixelToLatLng(trPix);
+  var sw = projection.fromDivPixelToLatLng(blPix);
+
+  // Extend the bounds to contain the new bounds.
+  bounds.extend(ne);
+  bounds.extend(sw);
+
+  return bounds;
+};
+
+
+/**
+ * Determins if a marker is contained in a bounds.
+ *
+ * @param {google.maps.Marker} marker The marker to check.
+ * @param {google.maps.LatLngBounds} bounds The bounds to check against.
+ * @return {boolean} True if the marker is in the bounds.
+ * @private
+ */
+MarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) {
+  return bounds.contains(marker.getPosition());
+};
+
+
+/**
+ * Clears all clusters and markers from the clusterer.
+ */
+MarkerClusterer.prototype.clearMarkers = function() {
+  this.resetViewport(true);
+
+  // Set the markers a empty array.
+  this.markers_ = [];
+};
+
+
+/**
+ * Clears all existing clusters and recreates them.
+ * @param {boolean} opt_hide To also hide the marker.
+ */
+MarkerClusterer.prototype.resetViewport = function(opt_hide) {
+  // Remove all the clusters
+  for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {
+    cluster.remove();
+  }
+
+  // Reset the markers to not be added and to be invisible.
+  for (var i = 0, marker; marker = this.markers_[i]; i++) {
+    marker.isAdded = false;
+    if (opt_hide) {
+      marker.setMap(null);
+    }
+  }
+
+  this.clusters_ = [];
+};
+
+/**
+ *
+ */
+MarkerClusterer.prototype.repaint = function() {
+  var oldClusters = this.clusters_.slice();
+  this.clusters_.length = 0;
+  this.resetViewport();
+  this.redraw();
+
+  // Remove the old clusters.
+  // Do it in a timeout so the other clusters have been drawn first.
+  window.setTimeout(function() {
+    for (var i = 0, cluster; cluster = oldClusters[i]; i++) {
+      cluster.remove();
+    }
+  }, 0);
+};
+
+
+/**
+ * Redraws the clusters.
+ */
+MarkerClusterer.prototype.redraw = function() {
+  this.createClusters_();
+};
+
+
+/**
+ * Calculates the distance between two latlng locations in km.
+ * @see http://www.movable-type.co.uk/scripts/latlong.html
+ *
+ * @param {google.maps.LatLng} p1 The first lat lng point.
+ * @param {google.maps.LatLng} p2 The second lat lng point.
+ * @return {number} The distance between the two points in km.
+ * @private
+*/
+MarkerClusterer.prototype.distanceBetweenPoints_ = function(p1, p2) {
+  if (!p1 || !p2) {
+    return 0;
+  }
+
+  var R = 6371; // Radius of the Earth in km
+  var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
+  var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
+  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+    Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *
+    Math.sin(dLon / 2) * Math.sin(dLon / 2);
+  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+  var d = R * c;
+  return d;
+};
+
+
+/**
+ * Add a marker to a cluster, or creates a new cluster.
+ *
+ * @param {google.maps.Marker} marker The marker to add.
+ * @private
+ */
+MarkerClusterer.prototype.addToClosestCluster_ = function(marker) {
+  var distance = 40000; // Some large number
+  var clusterToAddTo = null;
+  var pos = marker.getPosition();
+  for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {
+    var center = cluster.getCenter();
+    if (center) {
+      var d = this.distanceBetweenPoints_(center, marker.getPosition());
+      if (d < distance) {
+        distance = d;
+        clusterToAddTo = cluster;
+      }
+    }
+  }
+
+  if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {
+    clusterToAddTo.addMarker(marker);
+  } else {
+    var cluster = new Cluster(this);
+    cluster.addMarker(marker);
+    this.clusters_.push(cluster);
+  }
+};
+
+
+/**
+ * Creates the clusters.
+ *
+ * @private
+ */
+MarkerClusterer.prototype.createClusters_ = function() {
+  if (!this.ready_) {
+    return;
+  }
+
+  // Get our current map view bounds.
+  // Create a new bounds object so we don't affect the map.
+  var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),
+      this.map_.getBounds().getNorthEast());
+  var bounds = this.getExtendedBounds(mapBounds);
+
+  for (var i = 0, marker; marker = this.markers_[i]; i++) {
+    if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {
+      this.addToClosestCluster_(marker);
+    }
+  }
+};
+
+
+/**
+ * A cluster that contains markers.
+ *
+ * @param {MarkerClusterer} markerClusterer The markerclusterer that this
+ *     cluster is associated with.
+ * @constructor
+ * @ignore
+ */
+function Cluster(markerClusterer) {
+  this.markerClusterer_ = markerClusterer;
+  this.map_ = markerClusterer.getMap();
+  this.gridSize_ = markerClusterer.getGridSize();
+  this.minClusterSize_ = markerClusterer.getMinClusterSize();
+  this.averageCenter_ = markerClusterer.isAverageCenter();
+  this.center_ = null;
+  this.markers_ = [];
+  this.bounds_ = null;
+  this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(),
+      markerClusterer.getGridSize());
+}
+
+/**
+ * Determins if a marker is already added to the cluster.
+ *
+ * @param {google.maps.Marker} marker The marker to check.
+ * @return {boolean} True if the marker is already added.
+ */
+Cluster.prototype.isMarkerAlreadyAdded = function(marker) {
+  if (this.markers_.indexOf) {
+    return this.markers_.indexOf(marker) != -1;
+  } else {
+    for (var i = 0, m; m = this.markers_[i]; i++) {
+      if (m == marker) {
+        return true;
+      }
+    }
+  }
+  return false;
+};
+
+
+/**
+ * Add a marker the cluster.
+ *
+ * @param {google.maps.Marker} marker The marker to add.
+ * @return {boolean} True if the marker was added.
+ */
+Cluster.prototype.addMarker = function(marker) {
+  if (this.isMarkerAlreadyAdded(marker)) {
+    return false;
+  }
+
+  if (!this.center_) {
+    this.center_ = marker.getPosition();
+    this.calculateBounds_();
+  } else {
+    if (this.averageCenter_) {
+      var l = this.markers_.length + 1;
+      var lat = (this.center_.lat() * (l-1) + marker.getPosition().lat()) / l;
+      var lng = (this.center_.lng() * (l-1) + marker.getPosition().lng()) / l;
+      this.center_ = new google.maps.LatLng(lat, lng);
+      this.calculateBounds_();
+    }
+  }
+
+  marker.isAdded = true;
+  this.markers_.push(marker);
+
+  var len = this.markers_.length;
+  if (len < this.minClusterSize_ && marker.getMap() != this.map_) {
+    // Min cluster size not reached so show the marker.
+    marker.setMap(this.map_);
+  }
+
+  if (len == this.minClusterSize_) {
+    // Hide the markers that were showing.
+    for (var i = 0; i < len; i++) {
+      this.markers_[i].setMap(null);
+    }
+  }
+
+  if (len >= this.minClusterSize_) {
+    marker.setMap(null);
+  }
+
+  this.updateIcon();
+  return true;
+};
+
+
+/**
+ * Returns the marker clusterer that the cluster is associated with.
+ *
+ * @return {MarkerClusterer} The associated marker clusterer.
+ */
+Cluster.prototype.getMarkerClusterer = function() {
+  return this.markerClusterer_;
+};
+
+
+/**
+ * Returns the bounds of the cluster.
+ *
+ * @return {google.maps.LatLngBounds} the cluster bounds.
+ */
+Cluster.prototype.getBounds = function() {
+  var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
+  var markers = this.getMarkers();
+  for (var i = 0, marker; marker = markers[i]; i++) {
+    bounds.extend(marker.getPosition());
+  }
+  return bounds;
+};
+
+
+/**
+ * Removes the cluster
+ */
+Cluster.prototype.remove = function() {
+  this.clusterIcon_.remove();
+  this.markers_.length = 0;
+  delete this.markers_;
+};
+
+
+/**
+ * Returns the center of the cluster.
+ *
+ * @return {number} The cluster center.
+ */
+Cluster.prototype.getSize = function() {
+  return this.markers_.length;
+};
+
+
+/**
+ * Returns the center of the cluster.
+ *
+ * @return {Array.<google.maps.Marker>} The cluster center.
+ */
+Cluster.prototype.getMarkers = function() {
+  return this.markers_;
+};
+
+
+/**
+ * Returns the center of the cluster.
+ *
+ * @return {google.maps.LatLng} The cluster center.
+ */
+Cluster.prototype.getCenter = function() {
+  return this.center_;
+};
+
+
+/**
+ * Calculated the extended bounds of the cluster with the grid.
+ *
+ * @private
+ */
+Cluster.prototype.calculateBounds_ = function() {
+  var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
+  this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);
+};
+
+
+/**
+ * Determines if a marker lies in the clusters bounds.
+ *
+ * @param {google.maps.Marker} marker The marker to check.
+ * @return {boolean} True if the marker lies in the bounds.
+ */
+Cluster.prototype.isMarkerInClusterBounds = function(marker) {
+  return this.bounds_.contains(marker.getPosition());
+};
+
+
+/**
+ * Returns the map that the cluster is associated with.
+ *
+ * @return {google.maps.Map} The map.
+ */
+Cluster.prototype.getMap = function() {
+  return this.map_;
+};
+
+
+/**
+ * Updates the cluster icon
+ */
+Cluster.prototype.updateIcon = function() {
+  var zoom = this.map_.getZoom();
+  var mz = this.markerClusterer_.getMaxZoom();
+
+  if (mz && zoom > mz) {
+    // The zoom is greater than our max zoom so show all the markers in cluster.
+    for (var i = 0, marker; marker = this.markers_[i]; i++) {
+      marker.setMap(this.map_);
+    }
+    return;
+  }
+
+  if (this.markers_.length < this.minClusterSize_) {
+    // Min cluster size not yet reached.
+    this.clusterIcon_.hide();
+    return;
+  }
+
+  var numStyles = this.markerClusterer_.getStyles().length;
+  var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);
+  this.clusterIcon_.setCenter(this.center_);
+  this.clusterIcon_.setSums(sums);
+  this.clusterIcon_.show();
+};
+
+
+/**
+ * A cluster icon
+ *
+ * @param {Cluster} cluster The cluster to be associated with.
+ * @param {Object} styles An object that has style properties:
+ *     'url': (string) The image url.
+ *     'height': (number) The image height.
+ *     'width': (number) The image width.
+ *     'anchor': (Array) The anchor position of the label text.
+ *     'textColor': (string) The text color.
+ *     'textSize': (number) The text size.
+ *     'backgroundPosition: (string) The background postition x, y.
+ * @param {number=} opt_padding Optional padding to apply to the cluster icon.
+ * @constructor
+ * @extends google.maps.OverlayView
+ * @ignore
+ */
+function ClusterIcon(cluster, styles, opt_padding) {
+  cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);
+
+  this.styles_ = styles;
+  this.padding_ = opt_padding || 0;
+  this.cluster_ = cluster;
+  this.center_ = null;
+  this.map_ = cluster.getMap();
+  this.div_ = null;
+  this.sums_ = null;
+  this.visible_ = false;
+
+  this.setMap(this.map_);
+}
+
+
+/**
+ * Triggers the clusterclick event and zoom's if the option is set.
+ */
+ClusterIcon.prototype.triggerClusterClick = function() {
+  var markerClusterer = this.cluster_.getMarkerClusterer();
+
+  // Trigger the clusterclick event.
+  google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_);
+
+  if (markerClusterer.isZoomOnClick()) {
+    // Zoom into the cluster.
+    this.map_.fitBounds(this.cluster_.getBounds());
+  }
+};
+
+
+/**
+ * Adding the cluster icon to the dom.
+ * @ignore
+ */
+ClusterIcon.prototype.onAdd = function() {
+  this.div_ = document.createElement('DIV');
+  if (this.visible_) {
+    var pos = this.getPosFromLatLng_(this.center_);
+    this.div_.style.cssText = this.createCss(pos);
+    this.div_.innerHTML = this.sums_.text;
+  }
+
+  var panes = this.getPanes();
+  panes.overlayMouseTarget.appendChild(this.div_);
+
+  var that = this;
+  google.maps.event.addDomListener(this.div_, 'click', function() {
+    that.triggerClusterClick();
+  });
+};
+
+
+/**
+ * Returns the position to place the div dending on the latlng.
+ *
+ * @param {google.maps.LatLng} latlng The position in latlng.
+ * @return {google.maps.Point} The position in pixels.
+ * @private
+ */
+ClusterIcon.prototype.getPosFromLatLng_ = function(latlng) {
+  var pos = this.getProjection().fromLatLngToDivPixel(latlng);
+  pos.x -= parseInt(this.width_ / 2, 10);
+  pos.y -= parseInt(this.height_ / 2, 10);
+  return pos;
+};
+
+
+/**
+ * Draw the icon.
+ * @ignore
+ */
+ClusterIcon.prototype.draw = function() {
+  if (this.visible_) {
+    var pos = this.getPosFromLatLng_(this.center_);
+    this.div_.style.top = pos.y + 'px';
+    this.div_.style.left = pos.x + 'px';
+  }
+};
+
+
+/**
+ * Hide the icon.
+ */
+ClusterIcon.prototype.hide = function() {
+  if (this.div_) {
+    this.div_.style.display = 'none';
+  }
+  this.visible_ = false;
+};
+
+
+/**
+ * Position and show the icon.
+ */
+ClusterIcon.prototype.show = function() {
+  if (this.div_) {
+    var pos = this.getPosFromLatLng_(this.center_);
+    this.div_.style.cssText = this.createCss(pos);
+    this.div_.style.display = '';
+  }
+  this.visible_ = true;
+};
+
+
+/**
+ * Remove the icon from the map
+ */
+ClusterIcon.prototype.remove = function() {
+  this.setMap(null);
+};
+
+
+/**
+ * Implementation of the onRemove interface.
+ * @ignore
+ */
+ClusterIcon.prototype.onRemove = function() {
+  if (this.div_ && this.div_.parentNode) {
+    this.hide();
+    this.div_.parentNode.removeChild(this.div_);
+    this.div_ = null;
+  }
+};
+
+
+/**
+ * Set the sums of the icon.
+ *
+ * @param {Object} sums The sums containing:
+ *   'text': (string) The text to display in the icon.
+ *   'index': (number) The style index of the icon.
+ */
+ClusterIcon.prototype.setSums = function(sums) {
+  this.sums_ = sums;
+  this.text_ = sums.text;
+  this.index_ = sums.index;
+  if (this.div_) {
+    this.div_.innerHTML = sums.text;
+  }
+
+  this.useStyle();
+};
+
+
+/**
+ * Sets the icon to the the styles.
+ */
+ClusterIcon.prototype.useStyle = function() {
+  var index = Math.max(0, this.sums_.index - 1);
+  index = Math.min(this.styles_.length - 1, index);
+  var style = this.styles_[index];
+  this.url_ = style['url'];
+  this.height_ = style['height'];
+  this.width_ = style['width'];
+  this.textColor_ = style['textColor'];
+  this.anchor_ = style['anchor'];
+  this.textSize_ = style['textSize'];
+  this.backgroundPosition_ = style['backgroundPosition'];
+};
+
+
+/**
+ * Sets the center of the icon.
+ *
+ * @param {google.maps.LatLng} center The latlng to set as the center.
+ */
+ClusterIcon.prototype.setCenter = function(center) {
+  this.center_ = center;
+};
+
+
+/**
+ * Create the css text based on the position of the icon.
+ *
+ * @param {google.maps.Point} pos The position.
+ * @return {string} The css style text.
+ */
+ClusterIcon.prototype.createCss = function(pos) {
+  var style = [];
+  style.push('background-image:url(' + this.url_ + ');');
+  var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';
+  style.push('background-position:' + backgroundPosition + ';');
+
+  if (typeof this.anchor_ === 'object') {
+    if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&
+        this.anchor_[0] < this.height_) {
+      style.push('height:' + (this.height_ - this.anchor_[0]) +
+          'px; padding-top:' + this.anchor_[0] + 'px;');
+    } else {
+      style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +
+          'px;');
+    }
+    if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&
+        this.anchor_[1] < this.width_) {
+      style.push('width:' + (this.width_ - this.anchor_[1]) +
+          'px; padding-left:' + this.anchor_[1] + 'px;');
+    } else {
+      style.push('width:' + this.width_ + 'px; text-align:center;');
+    }
+  } else {
+    style.push('height:' + this.height_ + 'px; line-height:' +
+        this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');
+  }
+
+  var txtColor = this.textColor_ ? this.textColor_ : 'black';
+  var txtSize = this.textSize_ ? this.textSize_ : 11;
+
+  style.push('cursor:pointer; top:' + pos.y + 'px; left:' +
+      pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +
+      txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');
+  return style.join('');
+};
+
+
+// Export Symbols for Closure
+// If you are not going to compile with closure then you can remove the
+// code below.
+window['MarkerClusterer'] = MarkerClusterer;
+MarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker;
+MarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers;
+MarkerClusterer.prototype['clearMarkers'] =
+    MarkerClusterer.prototype.clearMarkers;
+MarkerClusterer.prototype['fitMapToMarkers'] =
+    MarkerClusterer.prototype.fitMapToMarkers;
+MarkerClusterer.prototype['getCalculator'] =
+    MarkerClusterer.prototype.getCalculator;
+MarkerClusterer.prototype['getGridSize'] =
+    MarkerClusterer.prototype.getGridSize;
+MarkerClusterer.prototype['getExtendedBounds'] =
+    MarkerClusterer.prototype.getExtendedBounds;
+MarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap;
+MarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers;
+MarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom;
+MarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles;
+MarkerClusterer.prototype['getTotalClusters'] =
+    MarkerClusterer.prototype.getTotalClusters;
+MarkerClusterer.prototype['getTotalMarkers'] =
+    MarkerClusterer.prototype.getTotalMarkers;
+MarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw;
+MarkerClusterer.prototype['removeMarker'] =
+    MarkerClusterer.prototype.removeMarker;
+MarkerClusterer.prototype['removeMarkers'] =
+    MarkerClusterer.prototype.removeMarkers;
+MarkerClusterer.prototype['resetViewport'] =
+    MarkerClusterer.prototype.resetViewport;
+MarkerClusterer.prototype['repaint'] =
+    MarkerClusterer.prototype.repaint;
+MarkerClusterer.prototype['setCalculator'] =
+    MarkerClusterer.prototype.setCalculator;
+MarkerClusterer.prototype['setGridSize'] =
+    MarkerClusterer.prototype.setGridSize;
+MarkerClusterer.prototype['setMaxZoom'] =
+    MarkerClusterer.prototype.setMaxZoom;
+MarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd;
+MarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw;
+
+Cluster.prototype['getCenter'] = Cluster.prototype.getCenter;
+Cluster.prototype['getSize'] = Cluster.prototype.getSize;
+Cluster.prototype['getMarkers'] = Cluster.prototype.getMarkers;
+
+ClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd;
+ClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw;
+ClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove;
+
+Object.keys = Object.keys || function(o) {  
+    var result = [];  
+    for(var name in o) {  
+        if (o.hasOwnProperty(name))  
+          result.push(name);  
+    }  
+    return result;  
+};
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markermanager.js
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markermanager.js	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapJS/markermanager.js	Wed Oct  9 15:36:33 2013
@@ -1,7 +1,29 @@
-/* 
- * MarkerManager, v1.0
- * Copyright (c) 2007 Google Inc.
- *
+/**
+ * @name MarkerManager v3
+ * @version 1.1
+ * @copyright (c) 2007 Google Inc.
+ * @author Doug Ricket, Bjorn Brala (port to v3), others,
+ *
+ * @fileoverview Marker manager is an interface between the map and the user,
+ * designed to manage adding and removing many points when the viewport changes.
+ * <br /><br />
+ * <b>How it Works</b>:<br/> 
+ * The MarkerManager places its markers onto a grid, similar to the map tiles.
+ * When the user moves the viewport, it computes which grid cells have
+ * entered or left the viewport, and shows or hides all the markers in those
+ * cells.
+ * (If the users scrolls the viewport beyond the markers that are loaded,
+ * no markers will be visible until the <code>EVENT_moveend</code> 
+ * triggers an update.)
+ * In practical consequences, this allows 10,000 markers to be distributed over
+ * a large area, and as long as only 100-200 are visible in any given viewport,
+ * the user will see good performance corresponding to the 100 visible markers,
+ * rather than poor performance corresponding to the total 10,000 markers.
+ * Note that some code is optimized for speed over space,
+ * with the goal of accommodating thousands of markers.
+ */
+
+/*
  * 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
@@ -13,36 +35,33 @@
  * 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. 
- *
- *
- * Author: Doug Ricket, others
- * 
- * Marker manager is an interface between the map and the user, designed
- * to manage adding and removing many points when the viewport changes.
- *
- *
- * Algorithm: The MM places its markers onto a grid, similar to the map tiles.
- * When the user moves the viewport, the MM computes which grid cells have
- * entered or left the viewport, and shows or hides all the markers in those
- * cells.
- * (If the users scrolls the viewport beyond the markers that are loaded,
- * no markers will be visible until the EVENT_moveend triggers an update.)
- *
- * In practical consequences, this allows 10,000 markers to be distributed over
- * a large area, and as long as only 100-200 are visible in any given viewport,
- * the user will see good performance corresponding to the 100 visible markers,
- * rather than poor performance corresponding to the total 10,000 markers.
- *
- * Note that some code is optimized for speed over space,
- * with the goal of accommodating thousands of markers.
- *
  */
 
-
+/**
+ * @name MarkerManagerOptions
+ * @class This class represents optional arguments to the {@link MarkerManager}
+ *     constructor.
+ * @property {Number} maxZoom Sets the maximum zoom level monitored by a
+ *     marker manager. If not given, the manager assumes the maximum map zoom
+ *     level. This value is also used when markers are added to the manager
+ *     without the optional {@link maxZoom} parameter.
+ * @property {Number} borderPadding Specifies, in pixels, the extra padding
+ *     outside the map's current viewport monitored by a manager. Markers that
+ *     fall within this padding are added to the map, even if they are not fully
+ *     visible.
+ * @property {Boolean} trackMarkers=false Indicates whether or not a marker
+ *     manager should track markers' movements. If you wish to move managed
+ *     markers using the {@link setPoint}/{@link setLatLng} methods, 
+ *     this option should be set to {@link true}.
+ */
 
 /**
  * Creates a new MarkerManager that will show/hide markers on a map.
  *
+ * Events:
+ * @event changed (Parameters: shown bounds, shown markers) Notify listeners when the state of what is displayed changes.
+ * @event loaded MarkerManager has succesfully been initialized.
+ *
  * @constructor
  * @param {Map} map The map to manage.
  * @param {Object} opt_opts A container for optional arguments:
@@ -56,86 +75,145 @@
   var me = this;
   me.map_ = map;
   me.mapZoom_ = map.getZoom();
-  me.projection_ = map.getCurrentMapType().getProjection();
+  
+  me.projectionHelper_ = new ProjectionHelperOverlay(map);
+  google.maps.event.addListener(me.projectionHelper_, 'ready', function () {
+    me.projection_ = this.getProjection();
+    me.initialize(map, opt_opts);
+  });
+}
 
+  
+MarkerManager.prototype.initialize = function (map, opt_opts) {
+  var me = this;
+  
   opt_opts = opt_opts || {};
   me.tileSize_ = MarkerManager.DEFAULT_TILE_SIZE_;
-  
-  var maxZoom = MarkerManager.DEFAULT_MAX_ZOOM_;
-  if(opt_opts.maxZoom != undefined) {
-    maxZoom = opt_opts.maxZoom;
+
+  var mapTypes = map.mapTypes;
+
+  // Find max zoom level
+  var mapMaxZoom = 1;
+  for (var sType in mapTypes ) {
+    if (mapTypes.hasOwnProperty(sType) &&
+        mapTypes.get(sType) && mapTypes.get(sType).maxZoom === 'number') {
+      var mapTypeMaxZoom = map.mapTypes.get(sType).maxZoom;
+      if (mapTypeMaxZoom > mapMaxZoom) {
+        mapMaxZoom = mapTypeMaxZoom;
+      }
+    }
   }
-  me.maxZoom_ = maxZoom;
+  
+  me.maxZoom_  = opt_opts.maxZoom || 19;
 
   me.trackMarkers_ = opt_opts.trackMarkers;
+  me.show_ = opt_opts.show || true;
 
   var padding;
-  if (typeof opt_opts.borderPadding == "number") {
+  if (typeof opt_opts.borderPadding === 'number') {
     padding = opt_opts.borderPadding;
   } else {
     padding = MarkerManager.DEFAULT_BORDER_PADDING_;
   }
   // The padding in pixels beyond the viewport, where we will pre-load markers.
-  me.swPadding_ = new GSize(-padding, padding);
-  me.nePadding_ = new GSize(padding, -padding);
+  me.swPadding_ = new google.maps.Size(-padding, padding);
+  me.nePadding_ = new google.maps.Size(padding, -padding);
   me.borderPadding_ = padding;
 
-  me.gridWidth_ = [];
+  me.gridWidth_ = {};
+
+  me.grid_ = {};
+  me.grid_[me.maxZoom_] = {};
+  me.numMarkers_ = {};
+  me.numMarkers_[me.maxZoom_] = 0;
+
+
+  google.maps.event.addListener(map, 'dragend', function () {
+    me.onMapMoveEnd_();
+  });
+  
+  google.maps.event.addListener(map, 'idle', function () {
+    me.onMapMoveEnd_();
+  });
+  
+  google.maps.event.addListener(map, 'zoom_changed', function () {
+    me.onMapMoveEnd_();
+  });
+
 
-  me.grid_ = [];
-  me.grid_[maxZoom] = [];
-  me.numMarkers_ = [];
-  me.numMarkers_[maxZoom] = 0;
-
-  GEvent.bind(map, "moveend", me, me.onMapMoveEnd_);
-
-  // NOTE: These two closures provide easy access to the map.
-  // They are used as callbacks, not as methods.
-  me.removeOverlay_ = function(marker) {
-    map.removeOverlay(marker);
+
+  /**
+   * This closure provide easy access to the map.
+   * They are used as callbacks, not as methods.
+   * @param GMarker marker Marker to be removed from the map
+   * @private
+   */
+  me.removeOverlay_ = function (marker) {
+    marker.setMap(null);
     me.shownMarkers_--;
   };
-  me.addOverlay_ = function(marker) {
-    map.addOverlay(marker);
-    me.shownMarkers_++;
+
+  /**
+   * This closure provide easy access to the map.
+   * They are used as callbacks, not as methods.
+   * @param GMarker marker Marker to be added to the map
+   * @private
+   */
+  me.addOverlay_ = function (marker) {
+    if (me.show_) {
+      marker.setMap(me.map_);
+      me.shownMarkers_++;
+    }
   };
 
   me.resetManager_();
   me.shownMarkers_ = 0;
 
   me.shownBounds_ = me.getMapGridBounds_();
+  
+  google.maps.event.trigger(me, 'loaded');
+  
 };
 
-// Static constants:
+/**
+ *  Default tile size used for deviding the map into a grid.
+ */
 MarkerManager.DEFAULT_TILE_SIZE_ = 1024;
-MarkerManager.DEFAULT_MAX_ZOOM_ = 17;
+
+/*
+ *  How much extra space to show around the map border so
+ *  dragging doesn't result in an empty place.
+ */
 MarkerManager.DEFAULT_BORDER_PADDING_ = 100;
+
+/**
+ *  Default tilesize of single tile world.
+ */
 MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE = 256;
 
 
 /**
  * Initializes MarkerManager arrays for all zoom levels
  * Called by constructor and by clearAllMarkers
- */ 
-MarkerManager.prototype.resetManager_ = function() {
-  var me = this;
+ */
+MarkerManager.prototype.resetManager_ = function () {
   var mapWidth = MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;
-  for (var zoom = 0; zoom <= me.maxZoom_; ++zoom) {
-    me.grid_[zoom] = [];
-    me.numMarkers_[zoom] = 0;
-    me.gridWidth_[zoom] = Math.ceil(mapWidth/me.tileSize_);
+  for (var zoom = 0; zoom <= this.maxZoom_; ++zoom) {
+    this.grid_[zoom] = {};
+    this.numMarkers_[zoom] = 0;
+    this.gridWidth_[zoom] = Math.ceil(mapWidth / this.tileSize_);
     mapWidth <<= 1;
   }
+
 };
 
 /**
- * Removes all currently displayed markers
- * and calls resetManager to clear arrays
+ * Removes all markers in the manager, and
+ * removes any visible markers from the map.
  */
-MarkerManager.prototype.clearMarkers = function() {
-  var me = this;
-  me.processAll_(me.shownBounds_, me.removeOverlay_);
-  me.resetManager_();
+MarkerManager.prototype.clearMarkers = function () {
+  this.processAll_(this.shownBounds_, this.removeOverlay_);
+  this.resetManager_();
 };
 
 
@@ -144,17 +222,22 @@
  *
  * @param {LatLng} latlng The geographical point.
  * @param {Number} zoom The zoom level.
- * @param {GSize} padding The padding used to shift the pixel coordinate.
+ * @param {google.maps.Size} padding The padding used to shift the pixel coordinate.
  *               Used for expanding a bounds to include an extra padding
  *               of pixels surrounding the bounds.
  * @return {GPoint} The point in tile coordinates.
  *
  */
-MarkerManager.prototype.getTilePoint_ = function(latlng, zoom, padding) {
-  var pixelPoint = this.projection_.fromLatLngToPixel(latlng, zoom);
-  return new GPoint(
-      Math.floor((pixelPoint.x + padding.width) / this.tileSize_),
-      Math.floor((pixelPoint.y + padding.height) / this.tileSize_));
+MarkerManager.prototype.getTilePoint_ = function (latlng, zoom, padding) {
+
+  var pixelPoint = this.projectionHelper_.LatLngToPixel(latlng, zoom);
+
+  var point = new google.maps.Point(
+    Math.floor((pixelPoint.x + padding.width) / this.tileSize_),
+    Math.floor((pixelPoint.y + padding.height) / this.tileSize_)
+  );
+
+  return point;
 };
 
 
@@ -167,15 +250,22 @@
  * @param {Number} minZoom The minimum zoom for displaying the marker.
  * @param {Number} maxZoom The maximum zoom for displaying the marker.
  */
-MarkerManager.prototype.addMarkerBatch_ = function(marker, minZoom, maxZoom) {
-  var mPoint = marker.getPoint();
+MarkerManager.prototype.addMarkerBatch_ = function (marker, minZoom, maxZoom) {
+  var me = this;
+
+  var mPoint = marker.getPosition();
+  marker.MarkerManager_minZoom = minZoom;
+  
+  
   // Tracking markers is expensive, so we do this only if the
   // user explicitly requested it when creating marker manager.
   if (this.trackMarkers_) {
-    GEvent.bind(marker, "changed", this, this.onMarkerMoved_);
+    google.maps.event.addListener(marker, 'changed', function (a, b, c) {
+      me.onMarkerMoved_(a, b, c);
+    });
   }
 
-  var gridPoint = this.getTilePoint_(mPoint, maxZoom, GSize.ZERO);
+  var gridPoint = this.getTilePoint_(mPoint, maxZoom, new google.maps.Size(0, 0, 0, 0));
 
   for (var zoom = maxZoom; zoom >= minZoom; zoom--) {
     var cell = this.getGridCellCreate_(gridPoint.x, gridPoint.y, zoom);
@@ -196,20 +286,19 @@
  * @return {Boolean} Whether or not the given point is visible in the currently
  * shown bounds.
  */
-MarkerManager.prototype.isGridPointVisible_ = function(point) {
-  var me = this;
-  var vertical = me.shownBounds_.minY <= point.y &&
-      point.y <= me.shownBounds_.maxY;
-  var minX = me.shownBounds_.minX;
-  var horizontal = minX <= point.x && point.x <= me.shownBounds_.maxX;
+MarkerManager.prototype.isGridPointVisible_ = function (point) {
+  var vertical = this.shownBounds_.minY <= point.y &&
+      point.y <= this.shownBounds_.maxY;
+  var minX = this.shownBounds_.minX;
+  var horizontal = minX <= point.x && point.x <= this.shownBounds_.maxX;
   if (!horizontal && minX < 0) {
     // Shifts the negative part of the rectangle. As point.x is always less
     // than grid width, only test shifted minX .. 0 part of the shown bounds.
-    var width = me.gridWidth_[me.shownBounds_.z];
+    var width = this.gridWidth_[this.shownBounds_.z];
     horizontal = minX + width <= point.x && point.x <= width - 1;
   }
   return vertical && horizontal;
-}
+};
 
 
 /**
@@ -221,35 +310,34 @@
  * @param {LatLng} oldPoint The old position of the marker.
  * @param {LatLng} newPoint The new position of the marker.
  */
-MarkerManager.prototype.onMarkerMoved_ = function(marker, oldPoint, newPoint) {
+MarkerManager.prototype.onMarkerMoved_ = function (marker, oldPoint, newPoint) {
   // NOTE: We do not know the minimum or maximum zoom the marker was
   // added at, so we start at the absolute maximum. Whenever we successfully
   // remove a marker at a given zoom, we add it at the new grid coordinates.
-  var me = this;
-  var zoom = me.maxZoom_;
+  var zoom = this.maxZoom_;
   var changed = false;
-  var oldGrid = me.getTilePoint_(oldPoint, zoom, GSize.ZERO);
-  var newGrid = me.getTilePoint_(newPoint, zoom, GSize.ZERO);
-  while (zoom >= 0 && (oldGrid.x != newGrid.x || oldGrid.y != newGrid.y)) {
-    var cell = me.getGridCellNoCreate_(oldGrid.x, oldGrid.y, zoom);
+  var oldGrid = this.getTilePoint_(oldPoint, zoom, new google.maps.Size(0, 0, 0, 0));
+  var newGrid = this.getTilePoint_(newPoint, zoom, new google.maps.Size(0, 0, 0, 0));
+  while (zoom >= 0 && (oldGrid.x !== newGrid.x || oldGrid.y !== newGrid.y)) {
+    var cell = this.getGridCellNoCreate_(oldGrid.x, oldGrid.y, zoom);
     if (cell) {
-      if (me.removeFromArray(cell, marker)) {
-        me.getGridCellCreate_(newGrid.x, newGrid.y, zoom).push(marker);
+      if (this.removeFromArray_(cell, marker)) {
+        this.getGridCellCreate_(newGrid.x, newGrid.y, zoom).push(marker);
       }
     }
     // For the current zoom we also need to update the map. Markers that no
     // longer are visible are removed from the map. Markers that moved into
     // the shown bounds are added to the map. This also lets us keep the count
     // of visible markers up to date.
-    if (zoom == me.mapZoom_) {
-      if (me.isGridPointVisible_(oldGrid)) {
-        if (!me.isGridPointVisible_(newGrid)) {
-          me.removeOverlay_(marker);
+    if (zoom === this.mapZoom_) {
+      if (this.isGridPointVisible_(oldGrid)) {
+        if (!this.isGridPointVisible_(newGrid)) {
+          this.removeOverlay_(marker);
           changed = true;
         }
       } else {
-        if (me.isGridPointVisible_(newGrid)) {
-          me.addOverlay_(marker);
+        if (this.isGridPointVisible_(newGrid)) {
+          this.addOverlay_(marker);
           changed = true;
         }
       }
@@ -261,45 +349,44 @@
     --zoom;
   }
   if (changed) {
-    me.notifyListeners_();
+    this.notifyListeners_();
   }
 };
 
 
 /**
- * Searches at every zoom level to find grid cell
- * that marker would be in, removes from that array if found.
- * Also removes marker with removeOverlay if visible.
+ * Removes marker from the manager and from the map
+ * (if it's currently visible).
  * @param {GMarker} marker The marker to delete.
  */
-MarkerManager.prototype.removeMarker = function(marker) {
-  var me = this;
-  var zoom = me.maxZoom_;
+MarkerManager.prototype.removeMarker = function (marker) {
+  var zoom = this.maxZoom_;
   var changed = false;
-  var point = marker.getPoint();
-  var grid = me.getTilePoint_(point, zoom, GSize.ZERO);
+  var point = marker.getPosition();
+  var grid = this.getTilePoint_(point, zoom, new google.maps.Size(0, 0, 0, 0));
   while (zoom >= 0) {
-    var cell = me.getGridCellNoCreate_(grid.x, grid.y, zoom);
+    var cell = this.getGridCellNoCreate_(grid.x, grid.y, zoom);
 
     if (cell) {
-      me.removeFromArray(cell, marker);
+      this.removeFromArray_(cell, marker);
     }
     // For the current zoom we also need to update the map. Markers that no
     // longer are visible are removed from the map. This also lets us keep the count
     // of visible markers up to date.
-    if (zoom == me.mapZoom_) {
-      if (me.isGridPointVisible_(grid)) {
-          me.removeOverlay_(marker);
-          changed = true;
-      } 
+    if (zoom === this.mapZoom_) {
+      if (this.isGridPointVisible_(grid)) {
+        this.removeOverlay_(marker);
+        changed = true;
+      }
     }
     grid.x = grid.x >> 1;
     grid.y = grid.y >> 1;
     --zoom;
   }
   if (changed) {
-    me.notifyListeners_();
+    this.notifyListeners_();
   }
+  this.numMarkers_[marker.MarkerManager_minZoom]--;
 };
 
 
@@ -311,7 +398,7 @@
  * @param {Number} minZoom The minimum zoom level to display the markers.
  * @param {Number} opt_maxZoom The maximum zoom level to display the markers.
  */
-MarkerManager.prototype.addMarkers = function(markers, minZoom, opt_maxZoom) {
+MarkerManager.prototype.addMarkers = function (markers, minZoom, opt_maxZoom) {
   var maxZoom = this.getOptMaxZoom_(opt_maxZoom);
   for (var i = markers.length - 1; i >= 0; i--) {
     this.addMarkerBatch_(markers[i], minZoom, maxZoom);
@@ -328,9 +415,9 @@
  * @param {Number} opt_maxZoom The optinal maximum zoom.
  * @return The maximum zoom.
  */
-MarkerManager.prototype.getOptMaxZoom_ = function(opt_maxZoom) {
-  return opt_maxZoom != undefined ? opt_maxZoom : this.maxZoom_;
-}
+MarkerManager.prototype.getOptMaxZoom_ = function (opt_maxZoom) {
+  return opt_maxZoom || this.maxZoom_;
+};
 
 
 /**
@@ -339,7 +426,7 @@
  *
  * @param {Number} zoom The zoom level to check.
  */
-MarkerManager.prototype.getMarkerCount = function(zoom) {
+MarkerManager.prototype.getMarkerCount = function (zoom) {
   var total = 0;
   for (var z = 0; z <= zoom; z++) {
     total += this.numMarkers_[z];
@@ -347,6 +434,33 @@
   return total;
 };
 
+/** 
+ * Returns a marker given latitude, longitude and zoom. If the marker does not 
+ * exist, the method will return a new marker. If a new marker is created, 
+ * it will NOT be added to the manager. 
+ * 
+ * @param {Number} lat - the latitude of a marker. 
+ * @param {Number} lng - the longitude of a marker. 
+ * @param {Number} zoom - the zoom level 
+ * @return {GMarker} marker - the marker found at lat and lng 
+ */ 
+MarkerManager.prototype.getMarker = function (lat, lng, zoom) {
+  var mPoint = new google.maps.LatLng(lat, lng); 
+  var gridPoint = this.getTilePoint_(mPoint, zoom, new google.maps.Size(0, 0, 0, 0));
+
+  var marker = new google.maps.Marker({position: mPoint}); 
+    
+  var cellArray = this.getGridCellNoCreate_(gridPoint.x, gridPoint.y, zoom);
+  if (cellArray !== undefined) {
+    for (var i = 0; i < cellArray.length; i++) 
+    { 
+      if (lat === cellArray[i].getPosition().lat() && lng === cellArray[i].getPosition().lng()) {
+        marker = cellArray[i]; 
+      } 
+    } 
+  } 
+  return marker; 
+}; 
 
 /**
  * Add a single marker to the map.
@@ -355,32 +469,57 @@
  * @param {Number} minZoom The minimum zoom level to display the marker.
  * @param {Number} opt_maxZoom The maximum zoom level to display the marker.
  */
-MarkerManager.prototype.addMarker = function(marker, minZoom, opt_maxZoom) {
-  var me = this;
+MarkerManager.prototype.addMarker = function (marker, minZoom, opt_maxZoom) {
   var maxZoom = this.getOptMaxZoom_(opt_maxZoom);
-  me.addMarkerBatch_(marker, minZoom, maxZoom);
-  var gridPoint = me.getTilePoint_(marker.getPoint(), me.mapZoom_, GSize.ZERO);
-  if(me.isGridPointVisible_(gridPoint) && 
-     minZoom <= me.shownBounds_.z &&
-     me.shownBounds_.z <= maxZoom ) {
-    me.addOverlay_(marker);
-    me.notifyListeners_();
+  this.addMarkerBatch_(marker, minZoom, maxZoom);
+  var gridPoint = this.getTilePoint_(marker.getPosition(), this.mapZoom_, new google.maps.Size(0, 0, 0, 0));
+  if (this.isGridPointVisible_(gridPoint) &&
+      minZoom <= this.shownBounds_.z &&
+      this.shownBounds_.z <= maxZoom) {
+    this.addOverlay_(marker);
+    this.notifyListeners_();
   }
   this.numMarkers_[minZoom]++;
 };
 
+
+/**
+ * Helper class to create a bounds of INT ranges.
+ * @param bounds Array.<Object.<string, number>> Bounds object.
+ * @constructor
+ */
+function GridBounds(bounds) {
+  // [sw, ne]
+  
+  this.minX = Math.min(bounds[0].x, bounds[1].x);
+  this.maxX = Math.max(bounds[0].x, bounds[1].x);
+  this.minY = Math.min(bounds[0].y, bounds[1].y);
+  this.maxY = Math.max(bounds[0].y, bounds[1].y);
+      
+}
+
+/**
+ * Returns true if this bounds equal the given bounds.
+ * @param {GridBounds} gridBounds GridBounds The bounds to test.
+ * @return {Boolean} This Bounds equals the given GridBounds.
+ */
+GridBounds.prototype.equals = function (gridBounds) {
+  if (this.maxX === gridBounds.maxX && this.maxY === gridBounds.maxY && this.minX === gridBounds.minX && this.minY === gridBounds.minY) {
+    return true;
+  } else {
+    return false;
+  }  
+};
+
 /**
  * Returns true if this bounds (inclusively) contains the given point.
  * @param {Point} point  The point to test.
  * @return {Boolean} This Bounds contains the given Point.
  */
-GBounds.prototype.containsPoint = function(point) {
+GridBounds.prototype.containsPoint = function (point) {
   var outer = this;
-  return (outer.minX <= point.x &&
-          outer.maxX >= point.x &&
-          outer.minY <= point.y &&
-          outer.maxY >= point.y);
-}
+  return (outer.minX <= point.x && outer.maxX >= point.x && outer.minY <= point.y && outer.maxY >= point.y);
+};
 
 /**
  * Get a cell in the grid, creating it first if necessary.
@@ -392,7 +531,7 @@
  * @param {Number} z The z coordinate of the cell.
  * @return {Array} The cell in the array.
  */
-MarkerManager.prototype.getGridCellCreate_ = function(x, y, z) {
+MarkerManager.prototype.getGridCellCreate_ = function (x, y, z) {
   var grid = this.grid_[z];
   if (x < 0) {
     x += this.gridWidth_[z];
@@ -400,11 +539,11 @@
   var gridCol = grid[x];
   if (!gridCol) {
     gridCol = grid[x] = [];
-    return gridCol[y] = [];
+    return (gridCol[y] = []);
   }
   var gridCell = gridCol[y];
   if (!gridCell) {
-    return gridCol[y] = [];
+    return (gridCol[y] = []);
   }
   return gridCell;
 };
@@ -420,8 +559,9 @@
  * @param {Number} z The z coordinate of the cell.
  * @return {Array} The cell in the array.
  */
-MarkerManager.prototype.getGridCellNoCreate_ = function(x, y, z) {
+MarkerManager.prototype.getGridCellNoCreate_ = function (x, y, z) {
   var grid = this.grid_[z];
+  
   if (x < 0) {
     x += this.gridWidth_[z];
   }
@@ -435,22 +575,22 @@
  *
  * @param {LatLngBounds} bounds The geographical bounds.
  * @param {Number} zoom The zoom level of the bounds.
- * @param {GSize} swPadding The padding in pixels to extend beyond the
+ * @param {google.maps.Size} swPadding The padding in pixels to extend beyond the
  * given bounds.
- * @param {GSize} nePadding The padding in pixels to extend beyond the
+ * @param {google.maps.Size} nePadding The padding in pixels to extend beyond the
  * given bounds.
- * @return {GBounds} The bounds in grid space.
+ * @return {GridBounds} The bounds in grid space.
  */
-MarkerManager.prototype.getGridBounds_ = function(bounds, zoom, swPadding,
-                                                  nePadding) {
+MarkerManager.prototype.getGridBounds_ = function (bounds, zoom, swPadding, nePadding) {
   zoom = Math.min(zoom, this.maxZoom_);
-  
+
   var bl = bounds.getSouthWest();
   var tr = bounds.getNorthEast();
   var sw = this.getTilePoint_(bl, zoom, swPadding);
+
   var ne = this.getTilePoint_(tr, zoom, nePadding);
   var gw = this.gridWidth_[zoom];
-  
+
   // Crossing the prime meridian requires correction of bounds.
   if (tr.lng() < bl.lng() || ne.x < sw.x) {
     sw.x -= gw;
@@ -460,8 +600,10 @@
     sw.x = 0;
     ne.x = gw - 1;
   }
-  var gridBounds = new GBounds([sw, ne]);
+
+  var gridBounds = new GridBounds([sw, ne]);
   gridBounds.z = zoom;
+
   return gridBounds;
 };
 
@@ -471,10 +613,8 @@
  *
  * @return {Bounds} The bounds in grid space.
  */
-MarkerManager.prototype.getMapGridBounds_ = function() {
-  var me = this;
-  return me.getGridBounds_(me.map_.getBounds(), me.mapZoom_,
-                           me.swPadding_, me.nePadding_);
+MarkerManager.prototype.getMapGridBounds_ = function () {
+  return this.getGridBounds_(this.map_.getBounds(), this.mapZoom_, this.swPadding_, this.nePadding_);
 };
 
 
@@ -483,10 +623,10 @@
  * NOTE: Use a timeout so that the user is not blocked
  * from moving the map.
  *
+ * Removed this because a a lack of a scopy override/callback function on events. 
  */
-MarkerManager.prototype.onMapMoveEnd_ = function() {
-  var me = this;
-  me.objectSetTimeout_(this, this.updateMarkers_, 0);
+MarkerManager.prototype.onMapMoveEnd_ = function () {
+  this.objectSetTimeout_(this, this.updateMarkers_, 0);
 };
 
 
@@ -497,72 +637,126 @@
  * Equivalent to the standard window.setTimeout function, but the given
  * function executes as a method of this instance. So the function passed to
  * objectSetTimeout can contain references to this.
- *    objectSetTimeout(this, function() { alert(this.x) }, 1000);
+ *    objectSetTimeout(this, function () { alert(this.x) }, 1000);
  *
  * @param {Object} object  The target object.
  * @param {Function} command  The command to run.
  * @param {Number} milliseconds  The delay.
  * @return {Boolean}  Success.
  */
-MarkerManager.prototype.objectSetTimeout_ = function(object, command, milliseconds) {
-  return window.setTimeout(function() {
+MarkerManager.prototype.objectSetTimeout_ = function (object, command, milliseconds) {
+  return window.setTimeout(function () {
     command.call(object);
   }, milliseconds);
 };
 
 
 /**
+ * Is this layer visible?
+ *
+ * Returns visibility setting
+ *
+ * @return {Boolean} Visible
+ */
+MarkerManager.prototype.visible = function () {
+  return this.show_ ? true : false;
+};
+
+
+/**
+ * Returns true if the manager is hidden.
+ * Otherwise returns false.
+ * @return {Boolean} Hidden
+ */
+MarkerManager.prototype.isHidden = function () {
+  return !this.show_;
+};
+
+
+/**
+ * Shows the manager if it's currently hidden.
+ */
+MarkerManager.prototype.show = function () {
+  this.show_ = true;
+  this.refresh();
+};
+
+
+/**
+ * Hides the manager if it's currently visible
+ */
+MarkerManager.prototype.hide = function () {
+  this.show_ = false;
+  this.refresh();
+};
+
+
+/**
+ * Toggles the visibility of the manager.
+ */
+MarkerManager.prototype.toggle = function () {
+  this.show_ = !this.show_;
+  this.refresh();
+};
+
+
+/**
  * Refresh forces the marker-manager into a good state.
  * <ol>
  *   <li>If never before initialized, shows all the markers.</li>
  *   <li>If previously initialized, removes and re-adds all markers.</li>
  * </ol>
  */
-MarkerManager.prototype.refresh = function() {
-  var me = this;
-  if (me.shownMarkers_ > 0) {
-    me.processAll_(me.shownBounds_, me.removeOverlay_);
+MarkerManager.prototype.refresh = function () {
+  if (this.shownMarkers_ > 0) {
+    this.processAll_(this.shownBounds_, this.removeOverlay_);
+  }
+  // An extra check on this.show_ to increase performance (no need to processAll_)
+  if (this.show_) {
+    this.processAll_(this.shownBounds_, this.addOverlay_);
   }
-  me.processAll_(me.shownBounds_, me.addOverlay_);
-  me.notifyListeners_();
+  this.notifyListeners_();
 };
 
 
 /**
  * After the viewport may have changed, add or remove markers as needed.
  */
-MarkerManager.prototype.updateMarkers_ = function() {
-  var me = this;
-  me.mapZoom_ = this.map_.getZoom();
-  var newBounds = me.getMapGridBounds_();
-  
+MarkerManager.prototype.updateMarkers_ = function () {
+  this.mapZoom_ = this.map_.getZoom();
+  var newBounds = this.getMapGridBounds_();
+    
   // If the move does not include new grid sections,
   // we have no work to do:
-  if (newBounds.equals(me.shownBounds_) && newBounds.z == me.shownBounds_.z) {
+  if (newBounds.equals(this.shownBounds_) && newBounds.z === this.shownBounds_.z) {
     return;
   }
 
-  if (newBounds.z != me.shownBounds_.z) {
-    me.processAll_(me.shownBounds_, me.removeOverlay_);
-    me.processAll_(newBounds, me.addOverlay_);
+  if (newBounds.z !== this.shownBounds_.z) {
+    this.processAll_(this.shownBounds_, this.removeOverlay_);
+    if (this.show_) { // performance
+      this.processAll_(newBounds, this.addOverlay_);
+    }
   } else {
     // Remove markers:
-    me.rectangleDiff_(me.shownBounds_, newBounds, me.removeCellMarkers_);
+    this.rectangleDiff_(this.shownBounds_, newBounds, this.removeCellMarkers_);
 
     // Add markers:
-    me.rectangleDiff_(newBounds, me.shownBounds_, me.addCellMarkers_);
+    if (this.show_) { // performance
+      this.rectangleDiff_(newBounds, this.shownBounds_, this.addCellMarkers_);
+    }
   }
-  me.shownBounds_ = newBounds;
+  this.shownBounds_ = newBounds;
 
-  me.notifyListeners_();
+  this.notifyListeners_();
 };
 
 
 /**
  * Notify listeners when the state of what is displayed changes.
  */
-MarkerManager.prototype.notifyListeners_ = function() {
-  GEvent.trigger(this, "changed", this.shownBounds_, this.shownMarkers_);
+MarkerManager.prototype.notifyListeners_ = function () {
+  google.maps.event.trigger(this, 'changed', this.shownBounds_, this.shownMarkers_);
 };
 
 
@@ -572,7 +766,7 @@
  * @param {Bounds} bounds The bounds in grid space.
  * @param {Function} callback The function to call for each marker.
  */
-MarkerManager.prototype.processAll_ = function(bounds, callback) {
+MarkerManager.prototype.processAll_ = function (bounds, callback) {
   for (var x = bounds.minX; x <= bounds.maxX; x++) {
     for (var y = bounds.minY; y <= bounds.maxY; y++) {
       this.processCellMarkers_(x, y,  bounds.z, callback);
@@ -589,7 +783,7 @@
  * @param {Number} z The z coordinate of the cell.
  * @param {Function} callback The function to call for each marker.
  */
-MarkerManager.prototype.processCellMarkers_ = function(x, y, z, callback) {
+MarkerManager.prototype.processCellMarkers_ = function (x, y, z, callback) {
   var cell = this.getGridCellNoCreate_(x, y, z);
   if (cell) {
     for (var i = cell.length - 1; i >= 0; i--) {
@@ -606,7 +800,7 @@
  * @param {Number} y The y coordinate of the cell.
  * @param {Number} z The z coordinate of the cell.
  */
-MarkerManager.prototype.removeCellMarkers_ = function(x, y, z) {
+MarkerManager.prototype.removeCellMarkers_ = function (x, y, z) {
   this.processCellMarkers_(x, y, z, this.removeOverlay_);
 };
 
@@ -618,13 +812,13 @@
  * @param {Number} y The y coordinate of the cell.
  * @param {Number} z The z coordinate of the cell.
  */
-MarkerManager.prototype.addCellMarkers_ = function(x, y, z) {
+MarkerManager.prototype.addCellMarkers_ = function (x, y, z) {
   this.processCellMarkers_(x, y, z, this.addOverlay_);
 };
 
 
 /**
- * Use the rectangleDiffCoords function to process all grid cells
+ * Use the rectangleDiffCoords_ function to process all grid cells
  * that are in bounds1 but not bounds2, using a callback, and using
  * the current MarkerManager object as the instance.
  *
@@ -635,9 +829,9 @@
  * @param {Function} callback The callback function to call
  *                   for each grid coordinate (x, y, z).
  */
-MarkerManager.prototype.rectangleDiff_ = function(bounds1, bounds2, callback) {
+MarkerManager.prototype.rectangleDiff_ = function (bounds1, bounds2, callback) {
   var me = this;
-  me.rectangleDiffCoords(bounds1, bounds2, function(x, y) {
+  me.rectangleDiffCoords_(bounds1, bounds2, function (x, y) {
     callback.apply(me, [x, y, bounds1.z]);
   });
 };
@@ -651,7 +845,7 @@
  * @param {Function} callback The callback function to call
  *                   for each grid coordinate.
  */
-MarkerManager.prototype.rectangleDiffCoords = function(bounds1, bounds2, callback) {
+MarkerManager.prototype.rectangleDiffCoords_ = function (bounds1, bounds2, callback) {
   var minX1 = bounds1.minX;
   var minY1 = bounds1.minY;
   var maxX1 = bounds1.maxX;
@@ -661,27 +855,28 @@
   var maxX2 = bounds2.maxX;
   var maxY2 = bounds2.maxY;
 
-  for (var x = minX1; x <= maxX1; x++) {  // All x in R1
+  var x, y;
+  for (x = minX1; x <= maxX1; x++) {  // All x in R1
     // All above:
-    for (var y = minY1; y <= maxY1 && y < minY2; y++) {  // y in R1 above R2
+    for (y = minY1; y <= maxY1 && y < minY2; y++) {  // y in R1 above R2
       callback(x, y);
     }
     // All below:
-    for (var y = Math.max(maxY2 + 1, minY1);  // y in R1 below R2
+    for (y = Math.max(maxY2 + 1, minY1);  // y in R1 below R2
          y <= maxY1; y++) {
       callback(x, y);
     }
   }
 
-  for (var y = Math.max(minY1, minY2);
+  for (y = Math.max(minY1, minY2);
        y <= Math.min(maxY1, maxY2); y++) {  // All y in R2 and in R1
     // Strictly left:
-    for (var x = Math.min(maxX1 + 1, minX2) - 1;
+    for (x = Math.min(maxX1 + 1, minX2) - 1;
          x >= minX1; x--) {  // x in R1 left of R2
       callback(x, y);
     }
     // Strictly right:
-    for (var x = Math.max(minX1, maxX2 + 1);  // x in R1 right of R2
+    for (x = Math.max(minX1, maxX2 + 1);  // x in R1 right of R2
          x <= maxX1; x++) {
       callback(x, y);
     }
@@ -697,13 +892,89 @@
  * @param {Boolean} opt_notype  Flag to disable type checking in equality.
  * @return {Number}  The number of instances of value that were removed.
  */
-MarkerManager.prototype.removeFromArray = function(array, value, opt_notype) {
+MarkerManager.prototype.removeFromArray_ = function (array, value, opt_notype) {
   var shift = 0;
   for (var i = 0; i < array.length; ++i) {
-    if (array[i] === value || (opt_notype && array[i] == value)) {
+    if (array[i] === value || (opt_notype && array[i] === value)) {
       array.splice(i--, 1);
       shift++;
     }
   }
   return shift;
 };
+
+
+
+
+
+
+
+/**
+*   Projection overlay helper. Helps in calculating
+*   that markers get into the right grid.
+*   @constructor
+*   @param {Map} map The map to manage.
+**/
+function ProjectionHelperOverlay(map) {
+  
+  this.setMap(map);
+
+  var TILEFACTOR = 8;
+  var TILESIDE = 1 << TILEFACTOR;
+  var RADIUS = 7;
+
+  this._map = map;
+  this._zoom = -1;
+  this._X0 =
+  this._Y0 =
+  this._X1 =
+  this._Y1 = -1;
+
+  
+}
+ProjectionHelperOverlay.prototype = new google.maps.OverlayView();
+
+/**
+ *  Helper function to convert Lng to X
+ *  @private
+ *  @param {float} lng
+ **/
+ProjectionHelperOverlay.prototype.LngToX_ = function (lng) {
+  return (1 + lng / 180);
+};
+
+/**
+ *  Helper function to convert Lat to Y
+ *  @private
+ *  @param {float} lat
+ **/
+ProjectionHelperOverlay.prototype.LatToY_ = function (lat) {
+  var sinofphi = Math.sin(lat * Math.PI / 180);
+  return (1 - 0.5 / Math.PI * Math.log((1 + sinofphi) / (1 - sinofphi)));
+};
+
+/**
+*   Old school LatLngToPixel
+*   @param {LatLng} latlng google.maps.LatLng object
+*   @param {Number} zoom Zoom level
+*   @return {position} {x: pixelPositionX, y: pixelPositionY}
+**/
+ProjectionHelperOverlay.prototype.LatLngToPixel = function (latlng, zoom) {
+  var map = this._map;
+  var div = this.getProjection().fromLatLngToDivPixel(latlng);
+  var abs = {x: ~~(0.5 + this.LngToX_(latlng.lng()) * (2 << (zoom + 6))), y: ~~(0.5 + this.LatToY_(latlng.lat()) * (2 << (zoom + 6)))};
+  return abs;
+};
+
+
+/**
+ * Draw function only triggers a ready event for
+ * MarkerManager to know projection can proceed to
+ * initialize.
+ */
+ProjectionHelperOverlay.prototype.draw = function () {
+  if (!this.ready) {
+    this.ready = true;
+    google.maps.event.trigger(this, 'ready');
+  }
+};
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapCoordinatesWidgetMain.py	Wed Oct  9 15:36:33 2013
@@ -7,31 +7,7 @@
 ##parameters=marker,default_location,coordFieldId
 ##title=
 
-# edit-mode js
-edit_mode_listeners = """
-GEvent.addListener(marker, "dragend", function() {
-    var point = marker.getPoint();
-    map.panTo(point);
-    document.getElementById(fieldId).value = point.lat().toFixed(5) + "|" + point.lng().toFixed(5);
-});
-
-GEvent.addListener(map, "moveend", function() {
-    map.clearOverlays();
-    var center = map.getCenter();
-    var marker = new GMarker(center, {
-        draggable :true
-    });
-    map.addOverlay(marker);
-    document.getElementById(fieldId).value = center.lat().toFixed(5) + "|" + center.lng().toFixed(5);
-
-    GEvent.addListener(marker, "dragend", function() {
-        var point = marker.getPoint();
-        map.panTo(point);
-        document.getElementById(fieldId).value = point.lat().toFixed(5) + "|" + point.lng().toFixed(5);
-    });
-
-});
-"""
+from tecnoteca.googlemap import googlemapMessageFactory as _
 
 # init lat/long
 latitude = marker.getLatitude()
@@ -46,26 +22,45 @@
 output = """
 <script type="text/javascript">
 
-var fieldId = '"""+ (coordFieldId!=None and str(coordFieldId) or '') +"""';
+var ERRCODES = new Array(); 
+ERRCODES['TT_ERROR'] = " """ + context.translate(_(u'TT_ERROR')) + """ ";
+ERRCODES['G_GEO_UNKNOWN_ADDRESS'] =" """ + context.translate(_(u'G_GEO_UNKNOWN_ADDRESS')) + """ ";
+
+
+coordFieldId = '"""+ (coordFieldId!=None and str(coordFieldId) or '') +"""';
+
+editMode = false;
+if(coordFieldId)
+    editMode = true;
 
 Gload = function() {
-     if (GBrowserIsCompatible()) {
-         var map = new GMap2(document.getElementById("map"));
-         map.addControl(new GSmallMapControl());
-         map.addControl(new GMapTypeControl());
-         var center = new GLatLng("""+str(latitude)+""", """+str(longitude)+""");
-         map.setCenter(center, 15);
-         geocoder = new GClientGeocoder();
-         var marker = new GMarker(center, {draggable:"""+ (coordFieldId!=None and 'true' or 'false') +"""});
-         map.addOverlay(marker);
-         
-         """+ (coordFieldId!=None and edit_mode_listeners or '') +"""
-     }
-   }
+    var initialPosition = new google.maps.LatLng("""+str(latitude)+""", """+str(longitude)+""");    
+
+    // map
+    map = new google.maps.Map(document.getElementById("map"), {
+        zoom: 15,
+        center: initialPosition,        
+        mapTypeId: google.maps.MapTypeId.ROADMAP,
+        draggable: editMode,
+        panControl: editMode,
+    });
+    google.maps.event.addListener(map, "dragend", function() {
+        refreshMarkerPosition(map.getCenter());
+    });
+    
+    
+    // marker
+    marker = new google.maps.Marker({
+        draggable: editMode
+    });
+    marker.setMap(map);
+    google.maps.event.addListener(marker, "dragend", function() {
+        refreshMarkerPosition(marker.position);
+    });
+    refreshMarkerPosition(initialPosition);
+}
    
-   // register functions
-   registerEventListener(window, 'load', Gload);
-   registerEventListener(window, 'unload', GUnload);
+   google.maps.event.addDomListener(window, 'load', Gload);
    
 </script>
 """

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMain.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMain.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMain.py	Wed Oct  9 15:36:33 2013
@@ -21,6 +21,7 @@
 mapMarkers = googleMap.TTGoogleMapMarkers(categories)
 mapMarkers += googleMap.TTGoogleMapCatContainers(catcontainers,contentFilterCategories,'markers')
 
+
 # generate polylines' code
 mapPolyjs = googleMap.TTGoogleMapPolylines(polylines)
 
@@ -32,32 +33,57 @@
 if(defaultMarker!=None and defaultMarker!=""):
     mapDefaultMarker = 'showMarkerAtStartup(\''+str(defaultMarker)+'\');'
 
+# panoramio js code
+jsPano = "var panoramioLayer = new google.maps.panoramio.PanoramioLayer();" 
+jsPano += "panoramioLayer.setMap(map);"
+jsPano += "addMapButton('%s', function() {panoramioLayer.setMap(panoramioLayer.getMap() ? null : map);} );" % context.translate(_(u"Panoramio"))
+
+# weather js code
+jsWeather = "var weatherLayer = new google.maps.weather.WeatherLayer();" 
+jsWeather += "weatherLayer.setMap(map);"
+jsWeather += "addMapButton('%s', function() {weatherLayer.setMap(weatherLayer.getMap() ? null : map);} );" % context.translate(_(u"Weather"))
+
+# traffic js code
+jsTraffic = "var trafficLayer = new google.maps.TrafficLayer();" 
+jsTraffic += "trafficLayer.setMap(map);"
+jsTraffic += "addMapButton('%s', function() {trafficLayer.setMap(trafficLayer.getMap() ? null : map);} );" % context.translate(_(u"Traffic"))
+
+# bicycle js code
+jsBicycle = "var bicycleLayer = new google.maps.BicyclingLayer();" 
+jsBicycle += "bicycleLayer.setMap(map);"
+jsBicycle += "addMapButton('%s', function() {bicycleLayer.setMap(bicycleLayer.getMap() ? null : map);} );" % context.translate(_(u"Bicycle"))
+
+# directions js code
+jsDirections = "directionsService = new google.maps.DirectionsService();"
+jsDirections += "directionsDisplay = new google.maps.DirectionsRenderer();"
+jsDirections += "directionsDisplay.setMap(map);"
+jsDirections += "directionsDisplay.setPanel(document.getElementById('g_directions'));"
 
 # main js
 output = """
 <script type="text/javascript">
 //<![CDATA[
+
 var ERRCODES = new Array(); 
-var TT_NO_MARKER_SELECTED = 667;
-var TT_NO_MARKER_FOUND = 668;
-var TT_ERROR = 669;
-
-ERRCODES[TT_ERROR] = " """ + context.translate(_(u'TT_ERROR')) + """ ";
-ERRCODES[G_GEO_SUCCESS] = " """ + context.translate(_(u'G_GEO_SUCCESS')) + """ ";
-ERRCODES[G_GEO_BAD_REQUEST] = " """ + context.translate(_(u'G_GEO_BAD_REQUEST')) + """ ";
-ERRCODES[G_GEO_SERVER_ERROR] =" """ + context.translate(_(u'G_GEO_SERVER_ERROR')) + """ ";
-ERRCODES[G_GEO_MISSING_QUERY] =" """ + context.translate(_(u'G_GEO_MISSING_QUERY')) + """ ";
-ERRCODES[G_GEO_MISSING_ADDRESS] =" """ + context.translate(_(u'G_GEO_MISSING_ADDRESS')) +""" ";
-ERRCODES[G_GEO_UNKNOWN_ADDRESS] =" """ + context.translate(_(u'G_GEO_UNKNOWN_ADDRESS')) + """ ";
-ERRCODES[G_GEO_UNAVAILABLE_ADDRESS] = " """ + context.translate(_(u'G_GEO_UNAVAILABLE_ADDRESS')) +""" ";
-ERRCODES[G_GEO_UNKNOWN_DIRECTIONS] = " """ + context.translate(_(u'G_GEO_UNKNOWN_DIRECTIONS')) +""" ";
-ERRCODES[G_GEO_BAD_KEY] = " """ + context.translate(_(u'G_GEO_BAD_KEY')) + """ ";
-ERRCODES[G_GEO_TOO_MANY_QUERIES] = " """ + context.translate(_(u'G_GEO_TOO_MANY_QUERIES')) + """ ";
-ERRCODES[TT_NO_MARKER_SELECTED] = " """ + context.translate(_(u'TT_NO_MARKER_SELECTED')) + """ ";
-ERRCODES[TT_NO_MARKER_FOUND] = " """ + context.translate(_(u'TT_NO_MARKER_FOUND')) + """ ";
+ERRCODES['TT_ERROR'] = " """ + context.translate(_(u'TT_ERROR')) + """ ";
+ERRCODES['G_GEO_SUCCESS'] = " """ + context.translate(_(u'G_GEO_SUCCESS')) + """ ";
+ERRCODES['G_GEO_BAD_REQUEST'] = " """ + context.translate(_(u'G_GEO_BAD_REQUEST')) + """ ";
+ERRCODES['G_GEO_SERVER_ERROR'] =" """ + context.translate(_(u'G_GEO_SERVER_ERROR')) + """ ";
+ERRCODES['G_GEO_MISSING_QUERY'] =" """ + context.translate(_(u'G_GEO_MISSING_QUERY')) + """ ";
+ERRCODES['G_GEO_MISSING_ADDRESS'] =" """ + context.translate(_(u'G_GEO_MISSING_ADDRESS')) +""" ";
+ERRCODES['G_GEO_UNKNOWN_ADDRESS'] =" """ + context.translate(_(u'G_GEO_UNKNOWN_ADDRESS')) + """ ";
+ERRCODES['G_GEO_UNAVAILABLE_ADDRESS'] = " """ + context.translate(_(u'G_GEO_UNAVAILABLE_ADDRESS')) +""" ";
+ERRCODES['G_GEO_UNKNOWN_DIRECTIONS'] = " """ + context.translate(_(u'G_GEO_UNKNOWN_DIRECTIONS')) +""" ";
+ERRCODES['G_GEO_BAD_KEY'] = " """ + context.translate(_(u'G_GEO_BAD_KEY')) + """ ";
+ERRCODES['G_GEO_TOO_MANY_QUERIES'] = " """ + context.translate(_(u'G_GEO_TOO_MANY_QUERIES')) + """ ";
+ERRCODES['TT_NO_MARKER_SELECTED'] = " """ + context.translate(_(u'TT_NO_MARKER_SELECTED')) + """ ";
+ERRCODES['TT_NO_MARKER_FOUND'] = " """ + context.translate(_(u'TT_NO_MARKER_FOUND')) + """ ";
 
 // init vars
 var icon;
+var overview_control="""+test(googleMap.getOverviewMapControl()==True,'true','false')+""";
+var maptype_control="""+test(googleMap.getMapTypeControl()==True,'true','false')+""";
+var streetview_control="""+test(googleMap.getStreetViewControl()==True,'true','false')+""";
 var gmarkers = new Object();
 var clusterers = new Array();
 var clusterersIcon = new Array();
@@ -70,27 +96,46 @@
 var i = 0;
 var mgr;
 var map;
+var infoWindow;
+var mc;
+
+//var activeMarkers = []
+
         
 Gload = function() {
-    if (GBrowserIsCompatible()) {
-        
-        
-        // create the map
-        map = new GMap2(document.getElementById("map"));
-        
-        // set center
-        var center = new GLatLng("""+str(googleMap.getLatitude())+""", """+str(googleMap.getLongitude())+"""); 
-        map.setCenter(center, """+str(googleMap.getZoomLevel())+""");
-        
-        mgr = new MarkerManager(map);
-        
-        // map controls
-        map.setMapType("""+ googleMap.getMapType() +""");    
-        """+ (googleMap.getLargeMapControl() and "map.addControl(new GLargeMapControl());" or "map.addControl(new GSmallMapControl());") +"""
-        """+ (googleMap.getMapTypeControl() and "// map.addControl(new GMapTypeControl());" or "") +"""
-        """+ (googleMap.getOverviewMapControl() and "map.addControl(new GOverviewMapControl());" or "") +"""
-        """+ (googleMap.getPanoramio() and "map.addControl(new PanoMapTypeControl()); var geocoder = new GClientGeocoder();" or "") +"""                        
-        
+
+    // create the map
+    map = new google.maps.Map(
+        document.getElementById('map'), {   
+            center: new google.maps.LatLng("""+str(googleMap.getLatitude())+""", """+str(googleMap.getLongitude())+"""), 
+            mapTypeId: """+ googleMap.getMapType() +""",
+            zoom : """+str(googleMap.getZoomLevel())+""",
+            overviewMapControl: overview_control,
+            overviewMapControlOptions: {opened: true},
+            mapTypeControl: maptype_control,
+            streetViewControl: streetview_control
+      });
+    
+     //var activeMarkers = []
+
+    // map directions
+    """+ (googleMap.getDirections() and jsDirections or "") +"""
+    
+    // map controls
+    """+ (googleMap.getPanoramio() and jsPano or "") +"""
+    """+ (googleMap.getWeather() and jsWeather or "") +"""
+    """+ (googleMap.getTraffic() and jsTraffic or "") +"""
+    """+ (googleMap.getBicycle() and jsBicycle or "") +"""
+    
+    // marker manager
+    mgr = new MarkerManager(map);
+    
+    
+    // info window
+    infoWindow = new google.maps.InfoWindow();
+    
+    google.maps.event.addListener(mgr, 'loaded', function() { 
+    
         // icons
         """+mapCatIcons+"""
         
@@ -108,16 +153,16 @@
         
         // create the initial sidebar    
         makeSidebar();
-        
-        // default marker js
-        """+mapDefaultMarker+"""
                 
-    }
+        // default marker js
+        """+mapDefaultMarker+"""        
+
+    });
+
 }
 
-// register functions
-registerEventListener(window, 'load', Gload);
-registerEventListener(window, 'unload', GUnload);
+google.maps.event.addDomListener(window, 'load', Gload);
+
 
 // initialize jquery panels
 jq(document).ready(function() {

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMarkers.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMarkers.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapMarkers.py	Wed Oct  9 15:36:33 2013
@@ -7,24 +7,10 @@
 ##parameters=categories
 ##title=
 
-def custom_escape(text):
-        text = text.replace('"','\\"')
-        text = text.replace('“','&quot;')
-        text = text.replace('”','&quot;')
-        text = text.replace("\r", "")
-        text = text.replace("\n", "")
-        text = unicode(text, errors='ignore')
-        return text     
+helper = context.restrictedTraverse('@@ttgooglemap_helpersview')     
 
-newline="\n"
 output=""
 
-# create js vars
-output += "var point;"
-output += newline
-output += "var html;"
-output += newline
-
 ## loop through categories
 for catloop in categories:
     category = catloop.getObject()
@@ -35,50 +21,29 @@
         marker = entry.getObject()
         
         if not(hasattr(marker, "getLatitude")) or marker.getLatitude() == None or marker.isDisabled():
-            continue
-        
-        output += newline;
-        output += newline;
-        
-        # lat - lng
-        output += "point = new GLatLng("+marker.getLatitude()+","+marker.getLongitude()+");"
-        output += newline;
-        
-        # title and description 
-        output += "html = '<div class=\"TTMapMarkerWin\">';"
-        output += newline 
-        if marker.portal_type == 'TTGoogleMapMarker': # if TTGoogleMapMarker object
-            output += "html += \"<b>"+custom_escape(marker.Title())+"</b><br/>"+(custom_escape(marker.getText())).strip()+"\";"
-        else: # content-type obj
-            output += "html += \"<a href='"+marker.absolute_url()+"'><b>"+custom_escape(marker.Title())+"</b></a><br/>"
-            output += (custom_escape(marker.Description())).strip()+"\";"
-        output += newline;
-        
-        # relations
-        if marker.getRelatedItems() or marker.getBRefs():
-            output += "html += '<ul>';"
-            output += newline
-            for relation in marker.getRelatedItems(): # standard relation (marker >> object)
-                if relation and relation.getLanguage()==context.REQUEST.get("Language","it"):
-                    output += "html += '<li>';"
-                    output += "html += \"<a href='"+relation.absolute_url()+"' title='"+custom_escape(relation.Title())+"'>"+custom_escape(relation.Title())+"</a>\";"
-                    output += "html += '</li>';"
-                    output += newline
-            for relation in marker.getBRefs(): # custom relation (object >> marker)
-                if relation and relation.getLanguage()==context.REQUEST.get("Language","it"):
-                    output += "html += '<li>';"
-                    output += "html += \"<a href='"+relation.absolute_url()+"' title='"+custom_escape(relation.pretty_title_or_id())+"'>"+custom_escape(relation.pretty_title_or_id())+"</a>\";"
-                    output += "html += '</li>';"
-                    output += newline
-            output += "html += '</ul>';"
-            output += newline
+            continue        
+            
+        # info window html
+        html = helper.getTitleHTML(marker)
+        html += helper.getDescriptionHTML(marker)
+        html += helper.getRelatedItemsHTML(marker);
             
-        output += "html += '<br/>';"
-        output += newline
-        output += "html += '</div>';"
+        latlng = "new google.maps.LatLng("+marker.getLatitude()+","+marker.getLongitude()+")"
             
-        # careate marker
-        output += newline
-        output += "mgr.addMarker(createMarker(\""+marker.UID()+"\", point, \""+custom_escape(marker.Title())+"\", html, '"+category.UID()+"', \""+custom_escape(category.pretty_title_or_id())+"\"));"
+        # create marker
+        output += "\n"
+        output += "mgr.addMarker(createMarker("
+        output += "\"" + marker.UID() + "\""
+        output += ","
+        output += latlng
+        output += ","
+        output += "\"" + helper.customEscape(marker.Title()) + "\""
+        output += ","
+        output += "\"" + html + "\""
+        output += ","
+        output += "\"" + category.UID() + "\""
+        output += ","
+        output += "\"" + helper.customEscape(category.pretty_title_or_id()) + "\""
+        output += "));"
         
 return output
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolygons.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolygons.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolygons.py	Wed Oct  9 15:36:33 2013
@@ -7,13 +7,22 @@
 ##parameters=polygons
 ##title=
 
+helper = context.restrictedTraverse('@@ttgooglemap_helpersview')
+
 output=""
 count=0;
 for polyloop in polygons:    
     polygon = polyloop.getObject()
     count = count+1
     
+    # info window html
+    html = helper.getTitleHTML(polygon)
+    html += helper.getDescriptionHTML(polygon)
+    html += helper.getRelatedItemsHTML(polygon);
+    
     output += "createPolygon("
+    output += "\"" + str(html) + "\""
+    output += ","
     output += str(count)
     output += ","
     output += str(polygon.getDefaultActive()).lower()

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolylines.py
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolylines.py	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapScripts/TTGoogleMapPolylines.py	Wed Oct  9 15:36:33 2013
@@ -7,49 +7,20 @@
 ##parameters=polylines
 ##title=
 
-def custom_escape(text):
-        text = text.replace('"','\\"')
-        text = text.replace('“','&quot;')
-        text = text.replace('”','&quot;')
-        text = text.replace("\r", "")
-        text = text.replace("\n", "")
-        text = unicode(text, errors='ignore')
-        return text   
-
-mtool = getattr(context,'portal_membership')
-isAnonymousUser = mtool.isAnonymousUser()
+helper = context.restrictedTraverse('@@ttgooglemap_helpersview')
 
 newline="\n"
-output="var polylinetxt;"
-output += newline
+output=newline
 
 count=0;
 for polyloop in polylines:    
     polyline = polyloop.getObject()
     count = count+1
-    
-    output += "polylinetxt = \"<a href='"+polyline.absolute_url()+"'><b>"+custom_escape(polyline.Title())+"</b></a><br/>"
-    output += (custom_escape(polyline.Description())).strip()+"\";"
-    output += newline
-    
-    # relations
-    if polyline.getRelatedItems() or polyline.getBRefs():
-        output += "polylinetxt += '<ul>';"
-        output += newline
-        for relation in polyline.getRelatedItems(): # standard relation (polyline >> object)
-            if relation and relation.getLanguage()==context.REQUEST.get("Language","it"):
-                output += "polylinetxt += '<li>';"
-                output += "polylinetxt += \"<a href='"+relation.absolute_url()+"' title='"+custom_escape(relation.Title())+"'>"+custom_escape(relation.Title())+"</a>\";"
-                output += "polylinetxt += '</li>';"
-                output += newline
-        for relation in polyline.getBRefs(): # custom relation (object >> polyline)
-            if relation and relation.getLanguage()==context.REQUEST.get("Language","it"):
-                output += "polylinetxt += '<li>';"
-                output += "polylinetxt += \"<a href='"+relation.absolute_url()+"' title='"+custom_escape(relation.pretty_title_or_id())+"'>"+custom_escape(relation.pretty_title_or_id())+"</a>\";"
-                output += "polylinetxt += '</li>';"
-                output += newline
-        output += "polylinetxt += '</ul>';"
-        output += newline
+        
+    # info window html
+    html = helper.getTitleHTML(polyline)
+    html += helper.getDescriptionHTML(polyline)
+    html += helper.getRelatedItemsHTML(polyline);
     
     output += "createPolyline("
     output += str(count)
@@ -68,10 +39,8 @@
     output += ","
     output += str(polyline.getNumLevels())
     output += ","
-    output += "polylinetxt"
-    output += ","
-    output += str(isAnonymousUser)
+    output += "\"" + html + "\""    
     output += ");";
-    output += "\n";
+    output += newline;
     
-return output
+return output
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapCoordinatesWidget.pt	Wed Oct  9 15:36:33 2013
@@ -70,7 +70,7 @@
 			<div id="map" class="TTMapCoordinates" tal:attributes="style python:'width:'+str(map_size[0])+'px;; height:'+str(map_size[1])+'px;;'"></div>			
 			
 			<!-- load map js -->
-			<div metal:use-macro="here/TTGoogleMapMacro/macros/MapJS"></div>
+			<div metal:use-macro="here/TTGoogleMapMacro/macros/MapJS"></div>	
 			
 			<!-- print js main (edit version) -->		
 			<div tal:replace="structure python:here.TTGoogleMapCoordinatesWidgetMain(context,default_location,elementId)"></div>

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapIconWidget.pt	Wed Oct  9 15:36:33 2013
@@ -51,7 +51,6 @@
 	                                               checked python:item in selection and 'checked' or None;
 	                                               value item;"
 	                               />
-							
 							<img tal:attributes="src python:here.portal_url()+'/'+item; alt python:vocab.getValue(item); title python:vocab.getValue(item)" />
 						</div>
                     </tal:radios>

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapMacro.pt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapMacro.pt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapMacro.pt	Wed Oct  9 15:36:33 2013
@@ -13,7 +13,7 @@
 					<img class="TTMapIcon" tal:replace="structure python:category.getCustomIcon().tag(css_class='TTMapIcon', onclick='javascript: document.getElementById(\''+category.UID()+'box\').click();')"/>
 				</tal:if>
 				<tal:if tal:condition="python: not (category.getCustomIcon() != None and category.getCustomIcon() != '') and (category.getCategoryIcon() != None and category.getCategoryIcon() != '')">
-					<img class="TTMapIcon" tal:attributes="src python:category.getCategoryIcon(); alt python:category.Title()" />
+					<img class="TTMapIcon" tal:attributes="src python:category.getCategoryIcon(); alt python:category.Title(); onclick python:'javascript: document.getElementById(\''+category.UID()+'box\').click();;'" />
 				</tal:if>
 				<input type="checkbox" class="TTMapCheckbox" name="ttcategorycheckbox" tal:attributes="id python:category.UID()+'box'; onclick python:'boxclick(this,\''+category.UID()+'\');;'"/>
                 <label class="TTMapCatLabel" for="ttcategorycheckbox" tal:content="python:category.Title()"></label>
@@ -38,7 +38,7 @@
 	<metal:block define-macro="Polylines">
 		<tal:block tal:repeat="polyloop polylines">
 			<div class="TTMapPolyline" tal:define="polyline python:polyloop.getObject()">
-				<input type="checkbox" name="ttpolylcheckbox" class="TTMapCheckbox" tal:attributes="checked python:polyline.getDefaultActive() and 'checked' or None; onclick python:'polylineClick(this,'+str(repeat['polyloop'].number())+')'" />
+				<input type="checkbox" name="ttpolylcheckbox" class="TTMapCheckbox TTMapFloatLeft" tal:attributes="checked python:polyline.getDefaultActive() and 'checked' or None; onclick python:'polylineClick(this,'+str(repeat['polyloop'].number())+')'" />
                 <label class="TTMapPolyLabel" for="ttpolylcheckbox" tal:content="python:polyline.Title()"></label>
 			</div>
 		</tal:block>
@@ -49,7 +49,7 @@
 	<metal:block define-macro="Polygons">
 		<tal:block tal:repeat="polyloop polygons">
 			<div class="TTMapPolygon" tal:define="polygon python:polyloop.getObject()">
-				<input type="checkbox" name="ttpolygcheckbox" class="TTMapCheckbox" tal:attributes="checked python:polygon.getDefaultActive() and 'checked' or None; onclick python:'polygonClick(this,'+str(repeat['polyloop'].number())+')'" />
+				<input type="checkbox" name="ttpolygcheckbox" class="TTMapCheckbox TTMapFloatLeft" tal:attributes="checked python:polygon.getDefaultActive() and 'checked' or None; onclick python:'polygonClick(this,'+str(repeat['polyloop'].number())+')'" />
                 <label class="TTMapPolyLabel" for="ttpolygcheckbox" tal:content="python:polygon.Title()"></label>
 			</div>
 		</tal:block>
@@ -58,23 +58,22 @@
 	
 	<!-- Map JS -->		
 	<metal:block define-macro="MapJS">
+		
 		<!-- google api -->
-		<script tal:define="googlemap_key config/googlemaps_key" tal:attributes="src python:'http://maps.google.com/maps?file=api&amp;v=2&amp;key='+googlemap_key+'&hl='+context.REQUEST.get('LANGUAGE','en')" type="text/javascript"></script>
+		<script tal:define="googlemap_key config/googlemaps_key" tal:attributes="src python:'http://maps.googleapis.com/maps/api/js?v=3&amp;sensor=false&amp;libraries=geometry,panoramio,weather&amp;key='+googlemap_key+'&amp;language='+context.REQUEST.get('LANGUAGE','en')" type="text/javascript"></script>
+		
+		<!-- marker manager -->
         <script type="text/javascript" tal:attributes="src string:${here/portal_url}/markermanager.js"></script>
 		
-		<!-- google functions -->
+		<!-- map functions -->
 		<script type="text/javascript" tal:attributes="src string:${here/portal_url}/googlemap_functions.js"></script>
 		
-		<!-- load panoramio -->
-		<script type="text/javascript" tal:attributes="src string:${here/portal_url}/pano_layer.js"></script>
-		<script type="text/javascript" tal:attributes="src string:${here/portal_url}/pano_maptypecontrol.js"></script>
-        
-        <!-- marker clusterer -->
+		<!-- widget functions -->
+		<script type="text/javascript" tal:attributes="src string:${here/portal_url}/googlemap_widget_functions.js"></script>
+		
+		<!-- marker clusterer -->
         <script type="text/javascript" tal:attributes="src string:${here/portal_url}/markerclusterer.js"></script>
-        
-        <!-- egeoxml -->
-        <script type="text/javascript" tal:attributes="src string:${here/portal_url}/egeoxml.js"></script>
-                
+
 	</metal:block>	
 	
 </body>

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapView.pt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapView.pt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMapView.pt	Wed Oct  9 15:36:33 2013
@@ -18,14 +18,14 @@
 
 <div metal:fill-slot="main">
     <tal:main-macro metal:define-macro="main"
-                    tal:define="kssClassesView context/@@kss_field_decorator_view;
-                                getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;								
-								contentFilterCategories python:{'portal_type':('TTGoogleMapCategory','TTGoogleMapCategoryCT'), 'review_state':'published'};
-								catcontainers python:context.getFolderContents(contentFilter={'portal_type':'TTGoogleMapCategoryContainer', 'review_state':'published'});
-								polylines python:context.getFolderContents({'portal_type':'TTGoogleMapPolyline', 'review_state':'published'});
-								polygons python:context.getFolderContents({'portal_type':'TTGoogleMapPolygon', 'review_state':'published'});
-                                categories python:context.getFolderContents(contentFilter=contentFilterCategories);
-								defaultMarker python:request.get('mk', None) or context.getDefaultMarker();">
+                     tal:define="kssClassesView context/@@kss_field_decorator_view;
+                                 getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;								
+								 contentFilterCategories python:{'portal_type':('TTGoogleMapCategory','TTGoogleMapCategoryCT'), 'review_state':'published'};
+								 catcontainers python:context.getFolderContents(contentFilter={'portal_type':'TTGoogleMapCategoryContainer', 'review_state':'published'});
+								 polylines python:context.getFolderContents({'portal_type':'TTGoogleMapPolyline', 'review_state':'published'});
+								 polygons python:context.getFolderContents({'portal_type':'TTGoogleMapPolygon', 'review_state':'published'});
+                                 categories python:context.getFolderContents(contentFilter=contentFilterCategories);
+								 defaultMarker python:request.get('mk', None) or context.getDefaultMarker();">
 
         <div tal:replace="structure provider:plone.abovecontenttitle" />
 
@@ -59,13 +59,20 @@
 		
 		<!-- Map HTML  -->
 		<div class="TTMapContainer">
-			<div class="TTMapColLeft">
-				<div id="map" class="TTMap" tal:attributes="style python:'width:'+str(context.getMapWidth())+'px;; height:'+str(context.getMapHeight())+'px;;'"></div>
-			</div>
-			<div class="TTMapColRight" tal:attributes="style string:margin-left:${here/getMapWidth}px;">
-				
+			<tal:if tal:condition="python:context.getFullWidth()">
+				<div id="TTMapWrap" class="TTMapFullWidth">
+					<div id="map" class="TTMap TTMapFullWidth" tal:attributes="style python:'height:'+str(context.getMapHeight())+'px;;'"></div>
+				</div>			
+			</tal:if>
+			<tal:else tal:condition="python:not context.getFullWidth()">
+				<div id="TTMapWrap" class="TTMapFloatLeft">
+					<div id="map" class="TTMap" tal:attributes="style python:'width:'+str(context.getMapWidth())+'px;; height:'+str(context.getMapHeight())+'px;;'"></div>
+				</div>					
+			</tal:else>
+			
+			<div id="TTMapCollapsiblePanels" tal:attributes="style python:not context.getFullWidth() and 'margin-left:'+str(context.getMapWidth())+'px;;' or '' ;">
 				<tal:if tal:condition="python:len(polygons)>0">
-					<div class="TTMapCollapsiblePanel" id="PolygonsPanel">
+					<div class="TTMapCollapsiblePanel" id="TTMapPolygonsPanel">
 					  <div class="TTMapCollapsiblePanelTab">
 					  	<div class="TTMapPanelLabel" i18n:translate="Frontend Polygons">Areas</div>
 						<div class="TTMapPanelOpenClose" tal:attributes="style python:context.getOpenBoxes() and 'display:none' or ''; " i18n:translate="Open panel">Open panel</div>
@@ -75,11 +82,10 @@
 						<div metal:use-macro="here/TTGoogleMapMacro/macros/Polygons"></div>
 					  </div>
 					</div>
-					<br/>
 				</tal:if>							
 	
 				<tal:if tal:condition="python:len(polylines)>0">
-					<div class="TTMapCollapsiblePanel" id="PolylinesPanel">
+					<div class="TTMapCollapsiblePanel" id="TTMapPolylinesPanel">
 					  <div class="TTMapCollapsiblePanelTab">
 					  	<div class="TTMapPanelLabel" i18n:translate="Frontend Polylines">Paths</div>
 						<div class="TTMapPanelOpenClose" tal:attributes="style python:context.getOpenBoxes() and 'display:none' or ''; " i18n:translate="Open panel">Open panel</div>
@@ -89,11 +95,10 @@
 						<div metal:use-macro="here/TTGoogleMapMacro/macros/Polylines"></div>
 					  </div>
 					</div>
-					<br/>
 				</tal:if>							
 														
 				<tal:if tal:condition="python: (len(categories)>0) or (len(catcontainers)>0)">	
-					<div class="TTMapCollapsiblePanel" id="CategoriesPanel">
+					<div class="TTMapCollapsiblePanel" id="TTMapCategoriesPanel">
 					  <div class="TTMapCollapsiblePanelTab">
 					  	<div class="TTMapPanelLabel" i18n:translate="Frontend Categories">Categories</div>
 						<div class="TTMapPanelOpenClose" tal:attributes="style python:context.getOpenBoxes() and 'display:none' or ''; " i18n:translate="Open panel">Open panel</div>
@@ -104,11 +109,10 @@
 						<div metal:use-macro="here/TTGoogleMapMacro/macros/MacroCategories"></div>
 					  </div>		
 					</div>
-					<br/>
 				</tal:if>
 				
 				<tal:if tal:condition="python: (len(categories)>0) or (len(catcontainers)>0)">
-					<div class="TTMapCollapsiblePanel" id="MarkersPanel">
+					<div class="TTMapCollapsiblePanel" id="TTMapMarkersPanel">
 					  <div class="TTMapCollapsiblePanelTab">
 					  	<div class="TTMapPanelLabel" i18n:translate="Frontend Markers">Markers</div>
 						<div class="TTMapPanelOpenClose" tal:attributes="style python:context.getOpenBoxes() and 'display:none' or ''; " i18n:translate="Open panel">Open panel</div>
@@ -161,7 +165,7 @@
 		                </div>
 						-->
 		                <div class="formControls">
-		                        <input i18n:attributes="value" class="context" name="get_directions_btn" type="button" value="Get directions btn" onClick="javascript:get_directions_from_data();"/>
+		                        <input i18n:attributes="value" class="context" name="get_directions_btn" type="button" value="Get directions" onClick="javascript:get_directions_from_data();"/>
 		                </div>
 	                </fieldset>
 				</form>
@@ -176,6 +180,6 @@
 		<div tal:replace="structure provider:plone.belowcontentbody" />
 
     </tal:main-macro>
-</div>
+ </div>
 </body>
 </html>  
\ No newline at end of file

Modified: tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMarkerView.pt
==============================================================================
--- tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMarkerView.pt	(original)
+++ tecnoteca.googlemap/trunk/googlemap/src/tecnoteca.googlemap/tecnoteca/googlemap/skins/TTGoogleMapViews/TTGoogleMarkerView.pt	Wed Oct  9 15:36:33 2013
@@ -48,7 +48,9 @@
 					<legend i18n:translate="Items in relation with marker">Items in relation with marker</legend>
 					<ul class="visualNoMarker">
 					<tal:related tal:repeat="item python:context.getBRefs()" 
-								 tal:define="use_view_action site_properties/typesUseViewActionInListings|python:(); getInfoFor python:wtool.getInfoFor;">
+								 tal:define="use_view_action site_properties/typesUseViewActionInListings|python:(); 
+								             getInfoFor nocall: here/portal_workflow/getInfoFor;
+								             normalizeString nocall: here/@@plone/normalizeString;">
 					    <li tal:define="
 					            desc                item/Description;
 					            item_type           item/portal_type;

------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
_______________________________________________
Collective-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/collective-checkins