<?php
function gmap_geo_elements() {
return array(
'gmap_geo_picker' => array(
'#input' => TRUE,
'#columns' => array('lat', 'lon', 'wkt'),
'#delta' => 0,
'#process' => array('gmap_geo_picker_process'),
),
);
}
function gmap_geo_widget_info() {
return array(
'gmap_geo_picker' => array(
'label' => t('GMap picker'),
'field types' => array('geo'),
),
);
}
function gmap_geo_widget(&$form, &$form_state, $field, $items, $delta = 0) {
return array(
'#type' => $field['widget']['type'],
'#default_value' => isset($items[$delta]) ? $items[$delta] : '',
);
}
function gmap_geo_widget_settings($op, $widget) {
switch ($op) {
case 'form':
$form = array();
$form['gmap_geo_picker_macro'] = array(
'#type' => 'textfield',
'#title' => 'GMap macro',
'#default_value' => $widget['gmap_geo_picker_macro'] ? $widget['gmap_geo_picker_macro'] : '[gmap]',
'#description' => t("A GMap macro describing the initial location picker map. <em>[gmap]</em> displays a map with the settings from !gmap-admin.", array('!gmap-admin' => l('admin/settings/gmap', 'admin/settings/gmap'))),
);
return $form;
case 'save':
return array('gmap_geo_picker_macro');
}
}
function gmap_geo_picker_process($element, $edit, $form_state, $form) {
$field = $form['#field_info'][$element['#field_name']];
$element['#title'] = $field['widget']['label'];
$element['#type'] = 'fieldset';
$element['map'] = array();
$element['lat'] = array(
'#type' => 'textfield',
'#title' => t('Latitude'),
'#default_value' => isset($element['#value']['lat']) ? $element['#value']['lat'] : NULL,
'#required' => $field['required'],
'#size' => 15,
'#prefix' => '<div class="container-inline">',
);
$element['lon'] = array(
'#type' => 'textfield',
'#title' => t('Longitude'),
'#default_value' => isset($element['#value']['lon']) ? $element['#value']['lon'] : NULL,
'#required' => $field['required'],
'#size' => 15,
'#suffix' => '</div>',
);
$element['wkt'] = array(
'#type' => 'value',
'#value' => isset($element['#value']['wkt']) ? $element['#value']['wkt'] : NULL,
);
$element['map']['gmap']['#value'] = gmap_set_location($field['widget']['gmap_geo_picker_macro'], $element, array('latitude' => 'lat', 'longitude' => 'lon'));
$element['map_instructions'] = array(
'#type' => 'markup',
'#weight' => 2,
'#prefix' => '<div class=\'description\'>',
'#value' => t('You may set the location by clicking on the map, or dragging the location marker. To clear the location, click on the marker.'),
'#suffix' => '</div>',
);
return $element;
}
function gmap_geo_theme() {
return array(
'gmap_geo_picker' => array(
'arguments' => array('element' => NULL),
),
'gmap_geo_formatter_gmap_geo' => array(
'function' => 'theme_gmap_geo_formatter',
'arguments' => array('element' => NULL),
),
);
}
function theme_gmap_geo_picker($element) {
return $element['#children'];
}
function gmap_geo_field_formatter_info() {
return array(
'gmap_geo' => array(
'label' => t('GMap'),
'field types' => array('geo', 'geo_data'),
'multiple values' => CONTENT_HANDLE_MODULE,
),
);
}
function theme_gmap_geo_formatter($element) {
module_load_include('inc', 'geo', 'includes/geo.wkb');
module_load_include('inc', 'gmap', 'gmap_polyutil');
foreach (element_children($element) as $i) {
$item = $element[$i]['#item'];
$wkb = (isset($item['wkb']) ? $item['wkb'] : $item[$element['#field_name'] . '_wkb']);
$feature = geo_wkb_get_data($wkb, 'array');
switch ($feature['type']) {
case 'point':
$map['markers'][] = array('latitude' => $item['lat'], 'longitude' => $item['lon']);
break;
case 'linestring':
$polyline = gmap_polyutil_polyline($feature['value']);
$polyline['type'] = 'encoded_line';
$map['shapes'][] = $polyline;
break;
case 'polygon':
$polyline = gmap_polyutil_polyline($feature['value']);
$map['shapes'][] = array(
'type' => 'encoded_polygon',
'polylines' => array($polyline),
);
break;
}
}
if ($map) {
$field = content_fields($element['#field_name'], $element['#type_name']);
if (isset($field['widget']['gmap_geo_picker_macro'])) {
$field_map = gmap_parse_macro($field['widget']['gmap_geo_picker_macro']);
$map = array_merge($field_map, $map);
}
$map['behavior'] = array('autozoom' => TRUE);
if (isset($field_map['zoom'])) {
$map['maxzoom'] = $field_map['zoom'];
}
return theme('gmap', $map);
}
}