Newer
Older
Brandon Bergren
committed
// $Id$
/**
* @file
* GMap Filters is a module to include Google Map in a module
*
* GMap filter allows the insertion of a googlemap in a module. It has
* a page to creat a macro and then a filter to convet the macro into the
* html and javascript code required to insert a google map.
*/
// @@@ Remove these and generalize lines. @@@
// These are now stored in the map defaults, but not all the code uses it yet.
define('GMAP_LINECOLOR1', '#00cc00');
define('GMAP_LINECOLOR2', '#ff0000');
define('GMAP_LINECOLOR3', '#0000ff');
// @@@ Remove these and generalize lines. @@@
// Current minimum version: 2.113
// Minimum version last changed on: June 9 2008
// Reason: G_SATELLITE_3D_MAP support in gmap_addons. See http://code.google.com/apis/earth/.
//
// See http://groups.google.com/group/Google-Maps-API/web/api-version-changes
// for details on using other version numbers.
'width' => '300px',
'height' => '200px',
'zoom' => 3,
'controltype' => 'Small',
'align' => 'None',
'latlong' => '40,0',
'maptype' => 'Map',
'mtc' => 'standard',
'baselayers' => array('Map', 'Satellite', 'Hybrid'),
'line_default' => array('0000ff', 5, 45, '', 0, 0),
'poly_default' => array('000000', 3, 25, 'ff0000', 45),
'line_colors' => array('#00cc00', '#ff0000', '#0000ff'),
$m = array();
$behaviors = module_invoke_all('gmap', 'behaviors', $m);
foreach ($behaviors as $k => $v) {
$defaults['behavior'][$k] = $v['default'];
}
$defaults = array_merge($defaults, variable_get('gmap_default', array()));
return $defaults;
}
/**
* Implementation of hook_gmap().
*/
case 'macro':
return array(
'points' => array(
'multiple' => TRUE,
),
'markers' => array(
'multiple' => TRUE,
),
'feed' => array(
'multiple' => TRUE,
),
);
$path = drupal_get_path('module', 'gmap') .'/js/';
// Activate markers if needed
if ($map['behavior']['dynmarkers'] || !empty($map['markers'])) {
// The marker data is not a real file. Work around this fact.
static $header_set = FALSE;
if (!$header_set) {
$header_set = TRUE;
drupal_add_js("/* GMap markers enabled. */</script>\n<script type=". '"text/javascript" src="'. url('map/markerdata.js') .'">', 'inline', 'header', FALSE, TRUE, FALSE);
drupal_add_js($path .'icon.js');
drupal_add_js($path .'marker.js');
drupal_add_js($path . variable_get('gmap_mm_type', 'gmap') .'_marker.js');
}
if ($map['behavior']['locpick']) {
if (variable_get('gmap_load_zoom_plugin', TRUE) && !$map['behavior']['nomousezoom']) {
drupal_add_js(drupal_get_path('module', 'gmap') .'/thirdparty/mousewheel.js');
}
if ($map['markers'] || $map['lines']) {
drupal_add_js($path .'markerloader_static.js');
}
if ($map['shapes']) {
drupal_add_js($path .'shapeloader_static.js');
drupal_add_js($path .'gmap_shapes.js');
}
if (is_array($map['feed'])) {
drupal_add_js($path .'markerloader_georss.js');
return array('points', 'markers', 'feed', 'circle', 'rpolygon', 'polygon', 'line');
case 'behaviors':
return array(
'locpick' => array(
'title' => t('Location chooser'),
'default' => FALSE,
'help' => t('Used to activate location choosing using a gmap.'),
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
),
'nodrag' => array(
'title' => t('Disable dragging'),
'default' => FALSE,
'help' => t('Remove the ability for the user to drag the map. If dragging is disabled, keyboard shortcuts are implicitly disabled.'),
),
'nokeyboard' => array(
'title' => t('Disable keyboard'),
'default' => TRUE,
'help' => t('Disable the keyboard shortcuts.'),
),
'nomousezoom' => array(
'title' => t('Disable mousezoom'),
'default' => FALSE,
'help' => t('Disable using the scroll wheel to zoom the map.'),
),
'autozoom' => array(
'title' => t('Use AutoZoom'),
'default' => FALSE,
'help' => t('Automatically zoom the map to fit all markers when markers are added.'),
),
'dynmarkers' => array(
'title' => t('Unconditionally enable marker interface'),
'default' => FALSE,
'help' => t('Load the marker loader system even if no markers to load are detected. Useful if you are injecting markers from somewhere else.'),
),
'overview' => array(
'title' => t('Enable Overview Map'),
'default' => FALSE,
'help' => t('Enable the "overview map" in the bottom right corner.'),
'previewable' => TRUE,
/* 'notype' => array(
'title' => t('Disable map type control'),
'default' => FALSE,
'help' => t('Removes the map type control from the upper right corner. Recommended for very narrow maps.'),
'previewable' => TRUE,
), */
'collapsehack' => array(
'title' => t('Work around bugs when maps appear in collapsible fieldsets'),
'default' => FALSE,
'help' => t('Enabling this will work around some issues that can occur when maps appear inside collapsible fieldsets.'),
),
// Note to myself, who keeps forgetting what a scale control actually IS.:
// |------------ 1mi ------------|
'scale' => array(
'title' => t('Add scale control to map.'),
'default' => FALSE,
'help' => t('Adds a scale control to the map in the default position.'),
'previewable' => TRUE,
break;
case 'baselayers':
$map['Google']['Map'] = array(
'title' => t('Map: Standard street map.'),
'default' => TRUE,
'help' => t('The standard default street map. Internal name: G_NORMAL_MAP'),
);
$map['Google']['Satellite'] = array(
'title' => t('Satellite: Standard satellite map.'),
'default' => TRUE,
'help' => t('Satellite view without street overlay. Internal name: G_SATELLITE_MAP'),
);
$map['Google']['Hybrid'] = array(
'title' => t('Hybrid: Hybrid satellite map.'),
'default' => TRUE,
'help' => t('Satellite view with street overlay. Internal name: G_HYBRID_MAP'),
);
$map['Google']['Physical'] = array(
'title' => t('Terrain: Physical feature map.'),
'default' => FALSE,
'help' => t('Map with physical data (terrain, vegetation.) Internal name: G_PHYSICAL_MAP'),
);
break;
/**
* Set up the HTML header for GMap.
*/
static $gmap_initialized = FALSE;
if ($gmap_initialized) {
return;
$gmap_path = drupal_get_path('module', 'gmap');
drupal_add_js($gmap_path .'/js/gmap.js');
$mm = variable_get('gmap_mm_type', 'gmap');
drupal_add_js($gmap_path .'/js/icon.js');
drupal_add_js($gmap_path .'/thirdparty/Clusterer2.js');
drupal_add_js($gmap_path .'/js/marker.js');
drupal_add_js($gmap_path .'/js/'. $mm .'_marker.js');
$mms = variable_get('gmap_markermanager', array());
if (empty($mms[$mm])) {
$mms[$mm] = array();
}
drupal_add_js(array('gmap_markermanager' => $mms[$mm]), 'setting');
Brandon Bergren
committed
$key = variable_get('googlemap_api_key', '');
if (module_exists('keys_api')) {
Brandon Bergren
committed
}
drupal_set_html_head('<script src="'. check_url('http://maps.google.com/maps?file=api&v='. variable_get('gmap_api_version', GMAP_API_VERSION) .'&key='. $key) .'" type="text/javascript"></script>');
drupal_add_js(array(
'gmap_init' => array(
'querypath' => base_path() .'map/query',
),
), 'setting');
/**
* Parse a macro style definition.
* Example: #111111/1/100/#111111/1
*/
function _gmap_parse_style($style) {
$styles = explode('/', $style);
// @@@ Todo: Fix up old xmaps stuff. Possibly detect by looking for array length 7?
// Strip off # signs, they get added by code.
if (isset($styles[0]) && substr($styles[0], 0, 1) == '#') {
$styles[0] = substr($styles[0], 1);
}
if (isset($styles[3]) && substr($styles[3], 0, 1) == '#') {
$styles[3] = substr($styles[3], 1);
}
// Assume anything > 0 and < 1.1 was an old representation.
if ($styles[2] > 0 && $styles[2] < 1.1) {
$styles[2] = $styles[2] * 100;
}
if (isset($styles[4])) {
if ($styles[4] > 0 && $styles[4] < 1.1) {
$styles[4] = $styles[4] * 100;
}
}
* Convert a macro string into a GMap array.
* Macro to process.
* @param $ver
* Version to treat macro as.
* Set to 1 when processing very old macros, otherwise leave as is.
* A GMap array.
function gmap_parse_macro($instring, $ver = 2) {
$m = array();
$multiple = module_invoke_all('gmap', 'macro_multiple', $m);
if (substr(trim($instring), -1)==']') {
$instring = substr(trim($instring), 0, -1);
if (substr($instring, 0, 5)=='[gmap') {
$instring = substr($instring, 6);
$k = trim(substr($row, 0, $offset));
$r = trim(substr($row, $offset+1));
if (in_array($k, $multiple)) {
// Things that can appear multiple times
if (!isset($m[$k])) {
$m[$k] = array();
}
$m[$k][] = $r;
Brandon Bergren
committed
}
else {
Brandon Bergren
committed
}
// Synonyms
if ($m['type']) {
$m['maptype'] = $m['type'];
unset($m['type']);
}
if ($m['control']) {
$m['controltype'] = $m['control'];
unset($m['control']);
}
if (is_array($m['feed'])) {
foreach ($m['feed'] as $k => $v) {
if (substr($temp[1], 0, 1) == '/') {
$temp[1] = substr($temp[1], 1);
}
$temp[1] = url($temp[1]);
$m['feed'][$k] = array(
'markername' => $temp[0],
'url' => $temp[1],
);
}
}
if (!is_array($m['points'])) $m['points'] = array();
if (!is_array($m['markers'])) $m['markers'] = array();
$m['markers-temp'] = array_merge($m['points'], $m['markers']);
unset($m['points']);
unset($m['markers']);
// all shapes in 1 array
if ($m['circle']) {
foreach ($m['circle'] as $shape) {
$s = array('type' => 'circle');
$cp = strpos($shape, ':');
$stylestr = substr($shape, 0, $cp);
$s['style'] = _gmap_parse_style($stylestr);
$shape = substr($shape, $cp+1);
}
$tmp = explode('+', $shape);
if ($tmp[2]) $s['numpoints'] = trim($tmp[2]);
$s['center'] = $tmp[0];
$m['shapes'][] = $s;
}
unset($m['circle']);
}
// Fixup legacy lines.
if ($m['line1']) {
if (!isset($m['line'])) $m['line'] = array();
$m['line'][] = GMAP_LINECOLOR1 .':'. $m['line1'];
unset($m['line1']);
}
if ($m['line2']) {
if (!isset($m['line'])) $m['line'] = array();
$m['line'][] = GMAP_LINECOLOR2 .':'. $m['line3'];
unset($m['line2']);
}
if ($m['line3']) {
if (!isset($m['line'])) $m['line'] = array();
$m['line'][] = GMAP_LINECOLOR3 .':'. $m['line3'];
unset($m['line3']);
}
if ($m['line']) {
foreach ($m['line'] as $shape) {
$s = array('type' => 'line');
$cp = strpos($shape, ':');
$s['style'] = _gmap_parse_style($stylestr);
$shape = substr($shape, $cp+1);
}
$s['points'] = _gmap_str2coord($shape);
$m['shapes'][] = $s;
}
unset($m['line']);
}
if ($m['rpolygon']) {
foreach ($m['rpolygon'] as $shape) {
$s = array('type' => 'rpolygon');
$cp = strpos($shape, ':');
$stylestr = substr($shape, 0, $cp);
$s['style'] = _gmap_parse_style($stylestr);
$shape = substr($shape, $cp+1);
}
$tmp = explode('+', $shape);
if ($tmp[2]) {
$s['numpoints'] = (int)trim($tmp[2]);
$tmp = array_slice($tmp, 0, 2);
}
$shape = implode('+', $tmp);
$tmp = _gmap_str2coord($shape);
$s['center'] = $tmp[0];
$s['point2'] = $tmp[1];
$m['shapes'][] = $s;
}
unset($m['rpolygon']);
}
if ($m['polygon']) {
foreach ($m['polygon'] as $shape) {
$s = array('type' => 'polygon');
$cp = strpos($shape, ':');
$stylestr = substr($shape, 0, $cp);
$s['style'] = _gmap_parse_style($stylestr);
$shape = substr($shape, $cp+1);
}
$m['shapes'][] = $s;
}
unset($m['polygon']);
}
// Zoom is flipped
if ($m['zoom']) {
$m['zoom'] = 18 - $m['zoom'];
if ($m['zoom'] < 1) {
$m['zoom'] = 1;
}
}
}
// Center -> latitude and longitude
if ($m['center']) {
list($m['latitude'], $m['longitude']) = explode(',', $m['center']);
// Behavior
if ($m['behaviour']) {
$m['behavior'] = $m['behaviour'];
unset($m['behaviour']);
}
if ($m['behavior']) {
$m['behavior-temp'] = explode(' ', $m['behavior']);
$m['behavior'] = array();
foreach ($m['behavior-temp'] as $v) {
$m['behavior'][substr($v, 1)] = (substr($v, 0, 1) == '+') ? TRUE : FALSE;
if ($m['tcontrol']) {
if (strtolower(trim($m['tcontrol'])) == 'on') {
$m['mtc'] = 'standard';
}
else {
$m['mtc'] = 'none';
}
unset($m['tcontrol']);
}
// notype also controls mtc.
if (isset($m['behavior']['notype'])) {
if ($m['behavior']['notype']) {
$m['mtc']= 'none';
}
unset($m['behavior']['notype']);
}
// Stuff that was converted to behavior flags
// Scale control.
if ($m['scontrol']) {
if (strtolower(trim($m['scontrol'])) == 'on') {
$m['behavior']['scale'] = TRUE;
}
else {
$m['behavior']['scale'] = FALSE;
}
unset($m['scontrol']);
}
// Draggability.
if ($m['drag']) {
if (strtolower(trim($m['drag'])) == 'yes') {
$m['behavior']['nodrag'] = FALSE;
// Markers fixup
foreach ($m['markers-temp'] as $t) {
unset($markername);
// Named?
if (strpos($t, '::')) { // Single : gets handled below.
list($markername, $t) = explode('::', $t, 2);
foreach ($points as $point) {
$marker = array();
$offset++;
Brandon Bergren
committed
$marker['options'] = array();
// @@@ Gmap allows both a tooltip and a popup, how to represent?
if (strpos($point, ':')) {
list($point, $marker['text']) = explode(':', $point, 2);
$marker['text'] = theme('gmap_marker_popup', $marker['text']);
Brandon Bergren
committed
if (strpos($point, '%')) {
list($point, $addons) = explode('%', $point, 2);
$motemp = explode('%', $addons);
foreach ($motemp as $option) {
$marker['options'][trim($option)] = TRUE;
Brandon Bergren
committed
}
}
list($marker['latitude'], $marker['longitude']) = explode(',', $point, 2);
// Named markers get an offset too.
if (isset($markername)) {
$marker['markername'] = $markername;
$marker['offset'] = $offset;
}
$m['markers'][] = $marker;
}
}
unset($m['markers-temp']);
// Assign an id if one wasn't specified.
if (!$m['id']) {
$m['id'] = gmap_get_auto_mapid();
}
// The macro can now be manipulated by reference.
foreach (module_implements('gmap') as $module) {
$additions = call_user_func_array($module .'_gmap', array('parse_macro', &$m));
if (!empty($additions)) {
foreach ($additions as $k => $v) {
$m[$k] = $v;
}
}
* Parse "x.xxxxx , y.yyyyyy (+ x.xxxxx, y.yyyyy ...)" into an array of points.
*/
function _gmap_str2coord($str) {
// Explode along + axis
// Explode along , axis
$points = array();
foreach ($arr as $pt) {
list($lat, $lon) = explode(',', $pt);
$points[] = array((float)trim($lat), (float)trim($lon));
}
return $points;
}
/**
* Theme a marker popup.
* This will get called for markers embedded in macros.
*/
function theme_gmap_marker_popup($label) {
return $label;
}
/**
*
* Creates a map that can be interactively used to fill a form with a
* location (latitude, longitude and zoom level).
*
* Note: This is a utility function designed for location.module, there is no
* guarantee it will not be removed eventually.
* @param $map
* Either a macro to use as the base map for setting a location, or an already set map associative array.
* @param $form
* A formset associative array. Cannot be more than one deep.
* @param $fields
* An associative array for the field names. 'latitude', 'longitude'=>name of respective array, 'address' is optional.
* @return
* A string with the google map code to be inserted onto the page.
*
*/
function gmap_set_location($map, &$form, $fields) {
if (!is_array($map)) {
$map = array_merge(gmap_defaults(), gmap_parse_macro($map));
// This is a locpick map.
$map['behavior']['locpick'] = TRUE;
'#settings' => $map,
);
$form[$fields['latitude']]['#map']=$id;
gmap_widget_setup($form[$fields['latitude']], 'locpick_latitude');
$form[$fields['longitude']]['#map']=$id;
gmap_widget_setup($form[$fields['longitude']], 'locpick_longitude');
$form[$fields['address']]['#map'] = $id;
gmap_widget_setup($form[$fields['address']], 'locpick_address');
}
/**
* Handle filter preparation.
*/
$out = FALSE;
$matches = array();
$i = 0;
while (isset($matches[1][$i])) {
$out[0][$i] = $matches[0][$i];
if ($matches[1][$i][0] == '1') {
$ver = 1;
$matches[1][$i] = substr($matches[0][$i], 1);
$map = array('#settings' => gmap_parse_macro($matches[1][$i], $ver));
$out[1][$i] = theme('gmap', $map);
$i++;
} // endwhile process macro
return $out;
}
* Make sure a string is a valid css dimension.
function gmap_todim($instring) {
$s = strtolower($instring);
$matches = array();
if (preg_match('/([\d.]+)\s*(em|ex|px|in|cm|mm|pt|pc|%)/', $s, $matches)) {
return $matches[1] . $matches[2];
}
else {
}
}
Brandon Bergren
committed
/**
* Ensure a textfield is a valid css dimension string.
*/
function gmap_dimension_validate(&$elem) {
if (!gmap_todim($elem['#value'])) {
form_error($elem, t('The specified value is not a valid CSS dimension.'));
}
}
/**
* Implementation of hook_filter().
*/
function gmap_filter($op, $delta = 0, $format = -1, $text = '') {
switch ($op) {
case 'list':
return (array(0 => t('GMap filter')));
case 'name':
return t('Google map filter');
case 'description':
return t('converts a google map macro into the html required for inserting a google map.');
$gmaps = _gmap_prepare($text); //returns an array of $tables[0] = table macro $table[1]= table html
if ($gmaps) { // there are table macros in this node
return str_replace($gmaps[0], $gmaps[1], $text);
}
else {
return $text;
}
case 'prepare':
return $text;
case 'no cache':
return TRUE; // @@@ Possibly improve efficiency in the future?
/**
* Implementation of hook_filter_tips().
*/
function gmap_filter_tips($delta, $format, $long = FALSE) {
if (user_access('create macro')) { // only display macro if user can create one
return t('Insert Google Map macro.') .'<a href="'. url('map/macro') .'" target="_blank" >'. t('Create a macro') .'</a>';
}
else {
return t('Insert Google Map macro.');
}
/**
* Implementation of hook_menu().
*/
function gmap_menu($may_cache) {
if ($may_cache) {
/* $items[] = array(
'path' => 'map',
'type' => MENU_ITEM_GROUPING,
'title' => t('google maps'),
'access' => user_access('create macro')||user_access('show user map')||user_access('show node map'),
); */
$items[] = array(
'path' => 'admin/settings/gmap',
'title' => t('GMap'),
'description' => t('Configure GMap settings'),
'callback' => 'drupal_get_form',
'callback arguments' => 'gmap_admin_settings',
'access' => user_access('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
);
$items[] = array(
'path' => 'map/query',
'type' => MENU_CALLBACK,
'access' => user_access('access content'),
$items[] = array(
'path' => 'map/markerdata.js',
'type' => MENU_CALLBACK,
'access' => user_access('access content'),
'callback' => 'gmap_markerdata_js',
);
/**
* Generate the markerdata file.
*/
function gmap_markerdata_js() {
drupal_set_header('Content-Type: text/javascript');
echo "// GMap marker image data.\n";
echo "Drupal.gmap.iconpath = ". drupal_to_js(base_path() . drupal_get_path('module', 'gmap') .'/markers') .";\n";
echo "Drupal.gmap.icondata = ". drupal_to_js(gmap_get_icondata()) .";\n";
}
/**
* JSON request interface.
*/
function gmap_json_query() {
Brandon Bergren
committed
drupal_set_header('Content-Type: text/javascript');
Brandon Bergren
committed
echo drupal_to_js(array(
'path' => base_path() . drupal_get_path('module', 'gmap') .'/markers',
Brandon Bergren
committed
));
exit();
}
require_once(drupal_get_path('module', 'gmap') .'/gmap_settings_ui.inc');
/**
* Implementation of hook_elements().
*/
function gmap_elements() {
return array(
'gmap' => array(
'#input' => FALSE, // This isn't a *form* input!!
'#settings' => array_merge(gmap_defaults(), array(
'points' => array(),
'pointsOverlays' => array(),
)),
'#process' => array('expand_gmap' => array()),
),
'gmap_macrotext' => array(
'#input' => TRUE,
'#cols' => 60,
'#rows' => 5,
'#process' => array(
'process_gmap_control' => array('textarea', 'macrotext'),
'gmap_overlay_edit' => array('#input' => FALSE, '#process' => array('process_gmap_overlay_edit' => array())),
'gmap_style' => array('#input' => TRUE, '#tree' => TRUE, '#gmap_style_type' => 'poly', '#process' => array('process_gmap_style' => array())),
'gmap_address' => array('#input' => FALSE, '#process' => array('process_gmap_address' => array())),
'gmap_align' => array('#input' => TRUE, '#process' => array('process_gmap_align' => array())),
'gmap_latitude' => array('#input' => TRUE, '#process' => array('process_gmap_control' => array('textfield', 'latitude', 'gmap_coord'))),
'gmap_longitude' => array('#input' => TRUE, '#process' => array('process_gmap_control' => array('textfield', 'longitude', 'gmap_coord'))),
'gmap_latlon' => array('#input' => TRUE, '#process' => array('process_gmap_control' => array('textfield', 'latlon', 'gmap_coord'))),
'gmap_markerchooser' => array('#input' => TRUE, '#process' => array('process_gmap_markerchooser' => array())),
Brandon Bergren
committed
'gmap_dimension' => array('#input' => TRUE, '#theme' => 'textfield', '#validate' => array('gmap_dimension_validate' => array())),
$mapid = 'map';
if ($element['#map']) {
$mapid = $element['#map'];
}
if (!$element['#settings']) {
$element['#settings'] = array();
}
$element['#settings'] = array_merge(gmap_defaults(), array(
'points' => array(),
'pointsOverlays' => array(),
'lines' => array(),
* Generic gmap control #process function.
function process_gmap_control($element, $edit, $fieldtype, $control, $theme='') {
Brandon Bergren
committed
$element['#type'] = $fieldtype;
Brandon Bergren
committed
gmap_widget_setup($element, $control);
Brandon Bergren
committed
if (!empty($theme)) {
$element['#theme'] = $theme;
return $element;
}
/**
* Style fieldset #process function.
*/
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
function process_gmap_style($element) {
$isline = ($element['#gmap_style_type'] == 'line');
// Stroke color
$element[0] = array(
'#type' => 'textfield',
'#size' => 6,
'#maxlength' => 6,
'#field_prefix' => '#',
'#title' => t('Stroke color'),
'#value' => $element['#value'][0],
'#attributes' => array('class' => 'gmap_style'),
);
// Stroke weight
$element[1] = array(
'#type' => 'textfield',
'#title' => t('Stroke weight'),
'#description' => t('Thickness of line, in pixels.'),
'#size' => 3,
'#maxlength' => 3,
'#field_suffix' => t('px'),
'#value' => $element['#value'][1],
'#attributes' => array('class' => 'gmap_style'),
);
// Stroke opacity
$element[2] = array(
'#type' => 'textfield',
'#title' => t('Stroke opacity'),
'#size' => 3,
'#maxlength' => 3,
'#field_suffix' => '%',
'#value' => $element['#value'][2],
'#attributes' => array('class' => 'gmap_style'),
);
// Fill color
$element[3] = array(
'#type' => 'textfield',
'#title' => t('Fill color'),
'#description' => t('Hex color value for fill color. Example: #<em>00AA33</em>'),
'#size' => 6,
'#maxlength' => 6,
'#field_prefix' => '#',
'#value' => $element['#value'][3],
'#disabled' => $isline,
'#attributes' => array('class' => 'gmap_style'),
);
$element[4] = array(
'#type' => 'textfield',
'#title' => t('Fill opacity'),
'#description' => t('Opacity of fill, from 0 to 100%.'),
'#size' => 3,
'#maxlength' => 3,
'#field_suffix' => '%',
'#value' => $element['#value'][4],
'#disabled' => $isline,
'#attributes' => array('class' => 'gmap_style'),
);
return $element;
}
/**
* Theme a gmap_style fieldset.
*/
Brandon Bergren
committed
// Fieldsets print #value at the end, so we need to empty it out.
// Otherwise, it puts "Array" at the end of the fieldset.
$element['#value'] = '';
return theme('fieldset', $element, $element['#children']);
}
/**
* Overlay editor #process function.
*/
// Conver the root element into a fieldset.
$element['#type'] = 'fieldset';
if (!$element['#title']) {
$element['#title'] = t('Overlay editor');
}
$element['#tree'] = TRUE;
$element['mapclicktype'] = array(
'#type' => 'select',
'#title' => t('Click map'),
'#options' => array(
'Points' => t('Points'),
'Lines' => t('Lines'),
'Circles' => t('Circles'),
gmap_widget_setup($element['mapclicktype'], 'overlayedit_mapclicktype');
// 'updatestyle' => t('Update Styles'),
// 'removestyle' => t('Remove Styles'),
gmap_widget_setup($element['markerclicktype'], 'overlayedit_markerclicktype');
'#options' => gmap_get_marker_titles(),
'#title' => t('Marker'),
'#theme' => 'gmap_overlay_edit',
);
gmap_widget_setup($element['marker'], 'overlayedit');
$element['linestyle'] = array(
'#type' => 'gmap_style',
'#title' => t('Line style'),
'#gmap_style_type' => 'line',
'#default_value' => array('0000ff', 5, 45, '', ''), // @@@
gmap_widget_setup($element['linestyle'], 'overlayedit_linestyle', $element['#map']);
$element['linestyle']['linestyle_apply'] = array(
'#tree' => FALSE,
'#type' => 'checkbox',
'#title' => t('Use for new and changed lines'),
'#default_value' => FALSE,
gmap_widget_setup($element['linestyle']['linestyle_apply'], 'overlayedit_linestyle_apply', $element['#map']);
$element['polystyle'] = array(
'#type' => 'gmap_style',
'#title' => t('Polygon style'),