diff -rU2 -x CVS openlayers.orig//includes/behaviors/js/openlayers_behavior_drawfeatures.js openlayers//includes/behaviors/js/openlayers_behavior_drawfeatures.js --- openlayers.orig//includes/behaviors/js/openlayers_behavior_drawfeatures.js 2010-05-21 17:35:39.000000000 +0200 +++ openlayers//includes/behaviors/js/openlayers_behavior_drawfeatures.js 2010-05-21 16:29:41.000000000 +0200 @@ -6,7 +6,4 @@ */ -// Declare global variable -openlayers_drawfeature_element = null; - /** * Update function for features @@ -25,5 +22,5 @@ } wkt_value = WktWriter.write(features_copy.features); - openlayers_drawfeature_element.val(wkt_value); + this.val(wkt_value); } @@ -37,5 +34,5 @@ // Add control - openlayers_drawfeature_element = + var openlayers_drawfeature_element = $("#" + data.map.behaviors['openlayers_behavior_drawfeatures'].element_id); @@ -50,6 +47,6 @@ if (openlayers_drawfeature_element.text() != '') { var wktFormat = new OpenLayers.Format.WKT(); - wkt = openlayers_drawfeature_element.text(); - features = wktFormat.read(wkt); + var wkt = openlayers_drawfeature_element.text(); + var features = wktFormat.read(wkt); for(var i in features) { features[i].geometry = features[i].geometry.transform( @@ -63,7 +60,7 @@ // registering events late, because adding data // would result in a reprojection loop - data_layer.events.register('featureadded', null, update); - data_layer.events.register('featureremoved', null, update); - data_layer.events.register('featuremodified', null, update); + data_layer.events.register('featureadded', openlayers_drawfeature_element, update); + data_layer.events.register('featureremoved', openlayers_drawfeature_element, update); + data_layer.events.register('featuremodified', openlayers_drawfeature_element, update); var control = new OpenLayers.Control.EditingToolbar(data_layer); diff -rU2 -x CVS openlayers.orig//includes/behaviors/js/openlayers_behavior_popup.js openlayers//includes/behaviors/js/openlayers_behavior_popup.js --- openlayers.orig//includes/behaviors/js/openlayers_behavior_popup.js 2010-05-21 17:35:39.000000000 +0200 +++ openlayers//includes/behaviors/js/openlayers_behavior_popup.js 2010-05-21 16:29:41.000000000 +0200 @@ -11,8 +11,28 @@ * @return * Formatted HTML + * + * @todo merge with openlayers_behavior_tooltip_popup_content ? */ function openlayers_behavior_popup_popup_content(feature) { - return "
" + feature.attributes.name +"
" + - "
" + feature.attributes.description +"
"; + if ( feature.cluster ) + { + var visited = []; // to keep trac of already-visited items + var info = ''; + for(var i = 0; i < feature.cluster.length; i++) { + var pf = feature.cluster[i]; // pseudo-feature + // should we use layer.name rather than drupalID here ? + var mapwide_id = feature.layer.drupalID+pf.drupalFID; + // skip duplicates + if ( visited[mapwide_id] ) continue; + visited[mapwide_id] = true; + info += openlayers_behavior_popup_popup_content(pf); + } + return info; + } + else + { + return "
" + feature.attributes.name + "
" + + "
" + feature.attributes.description +"
"; + } } diff -rU2 -x CVS openlayers.orig//includes/behaviors/js/openlayers_behavior_tooltip.js openlayers//includes/behaviors/js/openlayers_behavior_tooltip.js --- openlayers.orig//includes/behaviors/js/openlayers_behavior_tooltip.js 2010-05-21 17:35:39.000000000 +0200 +++ openlayers//includes/behaviors/js/openlayers_behavior_tooltip.js 2010-05-21 16:29:41.000000000 +0200 @@ -11,8 +11,28 @@ * @return * Formatted HTML + * + * @todo merge with openlayers_behavior_popup_popup_content ? */ function openlayers_behavior_tooltip_popup_content(feature) { - return "
" + feature.attributes.name +"
" + - "
" + feature.attributes.description +"
"; + if ( feature.cluster ) + { + var visited = []; // to keep trac of already-visited items + var info = ''; + for(var i = 0; i < feature.cluster.length; i++) { + var pf = feature.cluster[i]; // pseudo-feature + // should we use layer.name rather than drupalID here ? + var mapwide_id = feature.layer.drupalID+pf.drupalFID; + // skip duplicates + if ( visited[mapwide_id] ) continue; + visited[mapwide_id] = true; + info += openlayers_behavior_popup_popup_content(pf); + } + return info; + } + else + { + return "
" + feature.attributes.name +"
" + + "
" + feature.attributes.description +"
"; + } } diff -rU2 -x CVS openlayers.orig//includes/openlayers.behaviors.inc openlayers//includes/openlayers.behaviors.inc --- openlayers.orig//includes/openlayers.behaviors.inc 2010-05-21 17:35:39.000000000 +0200 +++ openlayers//includes/openlayers.behaviors.inc 2010-05-21 16:29:41.000000000 +0200 @@ -223,4 +223,15 @@ ), ), + 'openlayers_behavior_cluster' => array( + 'title' => t('Cluster'), + 'description' => t('Provides vector layer features clustering by proximity'), + 'type' => 'layer', + 'path' => drupal_get_path('module', 'openlayers') .'/includes/behaviors', + 'file' => 'openlayers_behavior_cluster.inc', + 'behavior' => array( + 'class' => 'openlayers_behavior_cluster', + 'parent' => 'openlayers_behavior', + ), + ), ); } diff -rU2 -x CVS openlayers.orig//js/openlayers.js openlayers//js/openlayers.js --- openlayers.orig//js/openlayers.js 2010-05-21 17:35:39.000000000 +0200 +++ openlayers//js/openlayers.js 2010-05-21 16:29:40.000000000 +0200 @@ -246,6 +246,17 @@ // Add attribute data if (feature.attributes){ + // Attributes belong to features, not single component geometries + // of them. But we're creating a geometry for each component for + // better performance and clustering support. Let's call these + // "pseudofeatures". + // + // In order to identify the real feature each geometry belongs to + // we then add a 'fid' parameter to the "pseudofeature". + // NOTE: 'drupalFID' is only unique within a single layer. + // newFeature.attributes = feature.attributes; - newFeature.data = feature.attributes; + newFeature.data = feature.attributes; // what is this needed for ? + newFeature.drupalFID = key; + //newFeature.layer = layer; } diff -rU2 -x CVS openlayers.orig//modules/openlayers_cck/includes/behaviors/js/openlayers_cck_vector_layer.js openlayers//modules/openlayers_cck/includes/behaviors/js/openlayers_cck_vector_layer.js --- openlayers.orig//modules/openlayers_cck/includes/behaviors/js/openlayers_cck_vector_layer.js 2010-05-21 17:35:39.000000000 +0200 +++ openlayers//modules/openlayers_cck/includes/behaviors/js/openlayers_cck_vector_layer.js 2010-05-21 16:29:41.000000000 +0200 @@ -10,5 +10,5 @@ var data = $(context).data('openlayers'); if (data && data.map.behaviors['openlayers_cck_vector_layer']) { - features = data.map.behaviors['openlayers_cck_vector_layer'].features; + var features = data.map.behaviors['openlayers_cck_vector_layer'].features; // Create options and layer