Newer
Older
/**
* @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.
*/
define('GMAP_LOAD_METHOD', variable_get('gmap_method','Static'));
define('GMAP_WIDTH', variable_get('gmap_default_width', '300px'));
define('GMAP_HEIGHT', variable_get('gmap_default_height', '200px'));
define('GMAP_ZOOM', variable_get('gmap_default_zoom', 3));
define('GMAP_CONTROL', variable_get('gmap_default_control', 'Small'));
//define('GMAP_ALIGNMENT', variable_get('gmap_default_allignment', ???));
define('GMAP_LONGLAT', variable_get('gmap_default_latlong', '40,0'));
define('GMAP_TYPE', variable_get('gmap_default_type', 'Map'));
define('GMAP_LINECOLOR1', variable_get('gmap_default_line1_color', '#00cc00'));
define('GMAP_LINECOLOR2', variable_get('gmap_default_line2_color', '#ff0000'));
define('GMAP_LINECOLOR3', variable_get('gmap_default_line3_color', '#0000ff'));
//define('GMAP_XMAPS', variable_get('gmap_xmaps',0));
define ('GMAP_XMAPS',0); //xmaps not currently compatible with v2 of google maps api
define('GMAP_XMAPS_SCRIPT', variable_get('gmap_xmaps_script','misc/xmaps.1c.js'));
define('GMAP_CLUSTER', variable_get('gmap_cluster',0));
* Implementation of hook_help.
*
*/
function gmap_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('Filter to allow insertion of a google map into a node');
}
}
/**
* Implementation of hook_perm.
*
*/
return array('create macro');
}
/**
*
* Returns the html required to insert a map from a gmap associative array.
*
* @param $gmap
* An associative array with the following variables set:
*
* id - the id of the map every map on a page must have a unique id
* width - width of the map
* height - height of the map
* center - a string of the latitude, longitude of the centre of the map
* zoom - the zoom factor of the google map
* align - the alignment of the map 'right', 'left' or 'center'
* control - the control shown on the map 'Large', 'Small', or 'None'
* tcontrol - whether the type control is on the map or not: 'off' or 'on'
* scontrol - whether the scale control is on the map or not: 'off' or 'on'
* ocontrol - width and height of the overview control map: 'width,height'
* drag - 'yes' or 'no' map is draggable. Default is 'yes'
* shapes - an array of associative arrays for the overlays.
* track - a file containing a series of points in .plt format to be
* inserted into the node.
* wmss - an associative array of WMS services
*
* Xmaps must be enabled for circle and polygon to work.
* @param $javascript
* Some javascript to insert into function after drawing the map.
* note that '{id}' will be replaced with the map id.
*
* @return
* A string with the google map ready to be inserted into a node.
*
*/
function gmap_draw_map($gmap, $javascript='') {
global $base_url;
_gmap_doheader();
if (file_exists('misc/gxmarker.2.js')) {
$gxmarkerjs=1;
}
else {
$gxmarkerjs=0;
}
(!isset($gmap['width'])) ? $gmap['width']=GMAP_WIDTH: NULL;
(!isset($gmap['height'])) ? $gmap['height']=GMAP_HEIGHT:NULL;
(!isset($gmap['zoom'])) ? $gmap['zoom']=GMAP_ZOOM:NULL;
(!isset($gmap['align'])) ? $gmap['align']='':NULL;
(!isset($gmap['id'])) ? $gmap['id']='map':NULL;
(!isset($gmap['control'])) ? $gmap['control']=GMAP_CONTROL:NULL;
(!isset($gmap['type'])) ? $gmap['type']=GMAP_TYPE:NULL;
(!isset($gmap['tcontrol'])) ? $gmap['tcontrol']='off':NULL;
(!isset($gmap['scontrol'])) ? $gmap['scontrol']='off':NULL;
// (!isset($gmap['ocontrol'])) ? $gmap['ocontrol']='off':NULL;
(!isset($gmap['drag'])) ? $gmap['drag']='yes':NULL;
if (!isset($gmap['center'])&& isset($gmap['latlong'])){
//backwards compatible with macros created by previous version of this program
$gmap['center']=$gmap['latlong'];
}
elseif (!isset($gmap['center'])){
$gmap['center']=GMAP_LONGLAT;
$style='width: '.gmap_todim($gmap['width']).'; height: '.gmap_todim($gmap['height']).';';
switch (strtolower($gmap['align'])) {
case 'left':
$style .= ' float: left;';
break;
case 'right':
$style .= ' float: right;';
break;
case 'center':
case 'centre':
$style .= ' margin-left: auto; margin-right: auto;';
// $outtext .= "\n<!--\n\n".print_r($gmap)."\n\n -->\n";
$outtext.='<div id="'.$gmap['id'].'" style="'.$style.'" class="gmap-map"></div>
<script type="text/javascript">
//initialize global gmap variables
var mycontrol=null;
var mytypecontrol=null;
var '.$gmap['id'].'=null;
var gxmarkerjs='.$gxmarkerjs.';
var gmapMarkerLocation="/'.variable_get('gmap_markerfiles',drupal_get_path('module', 'gmap') .'/markers').'";
webgeer
committed
var markerlink='.variable_get('gmap_on_click',0).';
addLoadEvent(gmap_init);
addLoadEvent(gmap_load_'.$gmap['id'].');
'.$gmap['id'].' = new GMap2($("'.$gmap['id'].'"));
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
if (isset($gmap['wmss'])) {
$outtext.= '
// WMS layers ';
$outtext.= '
'.$gmap['id'].'.getMapTypes().length = 0;';
$ic=0;
foreach ($gmap['wmss'] as $item) {
$map_name = eregi_replace("[^a-z0-9_-]", "_", $item['name']);
(!isset($item['minresolution'])) ? $item['minresolution']='1': NULL;
(!isset($item['maxresolution'])) ? $item['maxresolution']='17': NULL;
(!isset($item['format'])) ? $item['format']='image/gif': NULL;
(!isset($item['merczoomlevel'])) ? $item['merczoomlevel']='5': NULL;
$outtext.= '
var ccol_'.$map_name.' = new GCopyrightCollection("'.$item['name'].'");
';
if(isset($item['copyrights'])){
foreach ($item['copyrights'] as $copyright) {
(!isset($copyright['bounds'])) ? $copyright['bounds']='-190,-90,180,90': NULL;
(!isset($copyright['minzoom'])) ? $copyright['minzoom']='1': NULL;
(!isset($copyright['text'])) ? $copyright['text']='': NULL;
$coords = explode(",", $copyright['bounds']);
$outtext.= '
var sw_'.$ic.' = new GLatLng('.$coords[0].','.$coords[1].',false);
var ne_'.$ic.' = new GLatLng('.$coords[2].','.$coords[3].',false);
var llb_'.$ic.' = new GLatLngBounds(sw_'.$ic.',ne_'.$ic.');
var cr_'.$ic.' = new GCopyright(1,llb_'.$ic.','.$copyright['minzoom'].',"'.$copyright['text'].'");
ccol_'.$map_name.'.addCopyright(cr_'.$ic.');
';
$ic++;
}
}
$outtext.= '
var t_'.$map_name.'= new GTileLayer(ccol_'.$map_name.','.$item['minresolution'].','.$item['maxresolution'].');
t_'.$map_name.'.myMercZoomLevel='.$item['merczoomlevel'].';
t_'.$map_name.'.myBaseURL=\''.$item['url'].'\';
t_'.$map_name.'.myLayers=\''.$item['layers'].'\';
t_'.$map_name.'.myFormat=\''.$item['format'].'\';
t_'.$map_name.'.getTileUrl=CustomGetTileUrl;
';
if(isset($item['overlaywith'])){
switch (strtolower($item['overlaywith'])) {
case 'map':
$outtext.= "var l_".$map_name."1=[G_NORMAL_MAP.getTileLayers()[0]]; \n ";
break;
case 'hybrid':
//We overlay with roads only, not with the satellite imagery
$outtext.= "var l_".$map_name."1=[G_HYBRID_MAP.getTileLayers()[1]]; \n ";
break;
case 'satellite':
$outtext.= "var l_".$map_name."1=[G_SATELLITE_MAP.getTileLayers()[0]]; \n ";
break;
default:
$outtext.= "var l_".$map_name."1=[]; \n ";
}
}
$outtext.= 'var l_'.$map_name.'2=[t_'.$map_name.'];';
switch (strtolower($item['overlaywith'])) {
case 'hybrid':
$outtext.= '
var l_'.$map_name.'=l_'.$map_name.'2.concat(l_'.$map_name.'1);';
break;
default:
$outtext.= '
var l_'.$map_name.'=l_'.$map_name.'1.concat(l_'.$map_name.'2);';
}
$outtext.= '
var m_'.$map_name.' = new GMapType(l_'.$map_name.', G_SATELLITE_MAP.getProjection(), "'.$item['name'].'", G_SATELLITE_MAP);
'.$gmap['id'].'.addMapType(m_'.$map_name.');
';
}
$outtext.= '
'.$gmap['id'].'.addMapType(G_NORMAL_MAP);
'.$gmap['id'].'.addMapType(G_SATELLITE_MAP);
'.$gmap['id'].'.addMapType(G_HYBRID_MAP);
';
}
$outtext.= $gmap['id'].'.setCenter(new GLatLng('.$gmap['center'].'), '.$gmap['zoom'].');
';
switch (strtolower($gmap['control'])) {
case 'small':
$outtext .='mycontrol=new GSmallMapControl();
'.$gmap['id'].'.addControl(mycontrol);
';
break;
case 'large':
$outtext .='mycontrol=new GLargeMapControl();
if (strtolower($gmap['tcontrol'])=='on' || strtolower($gmap['tcontrol'])=='yes') {
$outtext .= $gmap['id'].'.addControl(mytypecontrol=new GMapTypeControl());
';
}
if (strtolower($gmap['scontrol'])=='on' || strtolower($gmap['scontrol'])=='yes') {
$outtext .= $gmap['id'].'.addControl(myscalecontrol=new GScaleControl());
';
}
if (isset($gmap['ocontrol']) && strlen($gmap['ocontrol']) > 0) {
$osize = explode(",", $gmap['ocontrol']);
if (intval($osize[0]) > 0 and intval($osize[1]) > 0) {
$outtext .= $gmap['id'].'.addControl(myovcontrol=new GOverviewMapControl(new GSize('.$osize[0].','.$osize[1].')));
';
}
}
$outtext .= $gmap['id'].".setMapType(G_HYBRID_MAP); \n";
case 'satellite':
$outtext .= $gmap['id'].".setMapType(G_SATELLITE_MAP); \n";
if (isset($gmap['drag']) && strtolower($gmap['drag'])=='no') {
$outtext .= "keyboardhandler=new GKeyboardHandler(".$gmap['id'].");\n";
if (isset($gmap['tracks'])) {
foreach ($gmap['tracks'] as $value) {
$tt=$value;
$tt['type']='line';
$tt['points']=array();
if($trackFH = fopen($tt['filename'], "r")) {
while(!feof($trackFH)) {
$line = fgets($trackFH, 4096);
$line_exploded = explode(",", $line);
if(count($line_exploded) == 7) {
$tt['points'][]= trim($line_exploded[0]).','.trim($line_exploded[1]);
}
}
fclose($trackFH);
}
$gmap['shape'][]=$tt;
if (isset($gmap['markers'])) {
if (GMAP_CLUSTER) {
$outtext .="\n var clusterer = new Clusterer(".$gmap['id'].");\n";
$lastmarker='';
foreach ($gmap['markers'] as $item) {
$mymarker='';
$mytext='';
if (isset($item['markername'])){
if ($item['markername']==$lastmarker) {
$i++;
}
else {
$lastmarker=$item['markername'];
$i=1;
}
if (file_exists(variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].$i.'.png')) {
$mymarker=$base_url.'/'.variable_get('gmap_markerfiles',drupal_get_path('module', 'gmap') .'/markers').'/'.$item['markername'].$i.'.png';
}
elseif (file_exists(variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].'.png')) {
$mymarker=$base_url.'/'.variable_get('gmap_markerfiles',drupal_get_path('module', 'gmap') .'/markers').'/'.$item['markername'].'.png';
}
}
webgeer
committed
if (isset($item['text']) && strlen(trim($item['text']))>0) {
webgeer
committed
elseif (isset($item['label']) && strlen(trim($item['label']))>0) {
$mytext=$item['label'];
$divstyle='';
if (isset($item['winwidth']) && trim($item['winwidth']) != '') {
$divstyle='width: '.$item['winwidth'].'; ';
}
webgeer
committed
if (strlen($divstyle) >0 && strlen(trim($mytext))>0) {
$mytext = '<div class="gmap-popup" style="'.$divstyle.'">'.$mytext.'</div>';
}
webgeer
committed
elseif (strlen(trim($mytext))>0){
$mytext = '<div class="gmap-popup">'.$mytext.'</div>';
}
webgeer
committed
else {
$mytext='';
}
if (isset($item['tooltip'])) {
}
else {
$tooltip='';
}
if (isset($item['link'])) {
$link=$item['link'];
}
else {
$link='';
}
$outtext .='clusterer.AddMarker(createGMarker(new GLatLng('.$item['point'].'),\''.$mytext.'\',\''.$mymarker."','$tooltip','$link'));\n";
$outtext .=$gmap['id'].'.addOverlay(createGMarker(new GLatLng('.$item['point'].'),\''.$mytext.'\',\''.$mymarker."','$tooltip','$link'));\n";
if (isset($gmap['shape']) && !variable_get('gmap_xmaps',0)) {
//if xmaps is not enabled then just show the lines using straight google maps.
foreach ($gmap['shape'] as $value) {
$style ='';
if (trim($value['type'])=='line') {
if (isset($value['color'])) {
$style .=",'".$value['color']."'";
if (isset($value['width'])) {
$style .=','.$value['width'];
if (isset($value['opacity'])) {
$style .=','.$value['opacity'];
}
}
}
$linetxt ='new GLatLng('.implode('), new GLatLng(',$value['points']).')';
// foreach ($value['points'] as $lvalue) {
// if (strlen($linetxt)>0) {
// $linetxt .= ', ';
// }
// $linetxt .="new GPoint(".$lvalue.")";
// }
$outtext .="\n".$gmap['id'].".addOverlay(new GPolyline([$linetxt] $style));";
elseif (isset($gmap['shape'])) {
foreach ($gmap['shape'] as $value) {
$linestyle=array();
$fillstyle=array();
if (isset($value['color'])){
$linestyle[] = 'color: "'.$value['color'].'" ';
}
if (isset($value['width'])){
$linestyle[] = 'weight: '.$value['width'];
}
if (isset($value['opacity'])){
$linestyle[] = 'opacity: '.$value['opacity'];
}
if (isset($value['pattern'])){
$linestyle[] = 'pattern: ['.$value['pattern'].'] ';
}
if (isset($value['text'])){
$linestyle[] = 'text: "'.$value['text'].'" ';
}
if (isset($value['fillcolor'])){
$fillstyle[] = 'color: "'.$value['fillcolor'].'" ';
}
if (isset($value['fillopacity'])){
$fillstyle[] = 'opacity: '.$value['fillopacity'];
$outtext .= 'var lineStyle = {'.implode(',',$linestyle)."};\n";
if (count($fillstyle)>0) {
$outtext .= 'var fillStyle = {'.implode(',',$fillstyle)."};\n";
}
else {
$outtext .= "var fillStyle = null;\n";
}
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
switch ($value['type']) {
case 'line':
$outtext .= "var points = []; \n";
foreach ($value['points'] as $lvalue) {
$outtext .="points.push(new GPoint(".$lvalue."));\n";
}
$outtext .= $gmap['id'].".addOverlay(new XPolyline(points, lineStyle));\n";
break;
case 'circle':
//create a circle by using a radius in km
if (empty($value['sides'])){
$value['sides']=36;
}
$outtext .= 'var radius = new XDistance('.$value['radius'].",XDistance.KM);\n";
$outtext .= 'var centre = new GPoint('.$value['center'].");\n";
$outtext .= $gmap['id'].".addOverlay(XPolygon.createRegularPolygonFromRadius(centre, radius, ".$value['sides'].", 0, lineStyle, fillStyle));\n";
break;
case 'rpolygon':
if (isset($value['sides'])){
$value['sides']=36;
}
$outtext .= "var centre = new GPoint(".$value['center'].");\n";
$outtext .= $gmap['id'].".addOverlay(XPolygon.createRegularPolygonFromPoint( new GPoint(".$value['center']."), new GPoint(".$value['point']."), 36, lineStyle, fillStyle));\n";
break;
case 'polygon':
$outtext .= "var points=[];\n";
foreach ($value['points'] as $pvalue) {
$outtext .= "points.push(new GPoint($pvalue));\n";
}
$outtext .= $gmap['id'].".addOverlay(new XPolygon(points, lineStyle, fillStyle));\n";
if (isset($gmap['feeds'])) {
// if (GMAP_CLUSTER && !$clusterset) {
// $outtext .="\n var clusterer = new Clusterer(".$gmap['id'].");\n";
// }
foreach ($gmap['feeds'] as $item) {
$mymarker='';
if (isset($item['markername'])){
if (file_exists(variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].'.png')) {
$mymarker=$base_url.'/'.variable_get('gmap_markerfiles',drupal_get_path('module', 'gmap') .'/markers').'/'.$item['markername'].'.png';
}
}
if (isset($item['url'])) {
$outtext.= "parseGeoRSS(".$gmap['id'].",'".$item['url']."','$mymarker');\n";
}
}
}
if (strlen($javascript)>0) {
$javascript=str_replace('{id}',$gmap['id'],$javascript);
$outtext .=$javascript;
}
$outtext .="\n } \n //]]>
</script>";
return $outtext;
}
/**
*
* Cleans the gmap variables to prevent javascript interjection
*
* @param $gmap
* A Gmap variable
*
* @return
* A GMap variable with any dangerous text removed.
* This does not really do much of anything right now.
function gmap_sanitize(&$gmap){
//sanitizes the gmap variables to reduce the possibility of javascript inserts
foreach ($gmap as $key=>$value) {
if ($key=='id') {
$out = array();
preg_match('([a-zA-Z1-9_-]*)', $value, $out);
if (strlen($out[0])==0) {
$out[0]='map';
}
$gmap[$key]=$out[0];
$gmap[$key]=str_replace(';','',$value);
* Returns a variable based on .
*
* @param $instring
* A string with the settings of gmap insertion in the format var=setting|var2=setting2
* The possible variables are
* id - the id of the map every map on a page must have a unique id
* width - width of the map
* height - height of the map
* center - a string of the longitude and latitude of the centre of the map
* zoom - the zoom factor of the google map
* align - the alignment of the map 'right', 'left' or 'center'
* control - the control shown on the map 'Large', 'Small', or 'None'
* type - 'Map', 'Hybrid' or 'Satellite'
* points/markers - a string of points to mark on the map with + between
* each point
* line - the line is defined by a set of points separated by a +
* track - Draws a line based on the points in the .plt file
* The following shape types require XMaps:
* circle - a circle based on a center point and a radius in km separated
* by a + and optionally can include the number of sizes.
* rpolygon - a regular polygon is defined by the center point and a point
* on the permiter separated by a +
* polygon - a polygon is defined by a set of points
*
* Each of the shapes types can optionally have charecteristics of colour,
* width, opacity, pattern, text, fill colour, fill opacity. Pattern, text
* and fill are all only used by xmaps.
* color - hexadecimal for the colour include the '#'
* @return
* A string with the google map ready to be inserted into a node.
*
*/
if (substr(trim($instring),-1)==']') {
$instring=substr(trim($instring), 0, -1);
}
if (substr($instring, 0,5)=='[gmap') {
$instring=substr($instring, 6);
}
unset($tt);
switch (trim($t[0])) {
case 'center':
$gmap['center']=gmap_dopoint(trim($t[1]),$ver);
break;
case 'zoom':
if ($ver==1) {
$gmap['zoom'] = 18-trim($t[1]);
if ($gmap['zoom']<1) {
$gmap['zoom']=1;
}
}
else {
$gmap['zoom'] = trim($t[1]);
}
break;
case 'points':
case 'markers':
unset($markername);
if (strpos($t[1],'::')) { // note: we don't care about case starting with ':'
list($markername,$t[1])=explode('::',$t[1],2);
}
unset($ttt);
$ttt = explode('+',$t[1]);
for ($i =0; $i<count($ttt); $i++) {
unset($tt);
if (strpos($ttt[$i],':')) {
list($tt['point'],$tt['label']) = explode(':',$ttt[$i],2);
}
else {
}
if (isset($markername)){
$tt['markername']=$markername;
}
$gmap['markers'][]=$tt;
}
break;
case 'track':
$tt['color']=GMAP_LINECOLOR1;
if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
list($configs,$t[1])=explode(':',$t[1],2);
list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'])=explode('/',$configs);
}
$tt['filename'] =$t[1];
break;
if (strpos($t[1],'::')) { // note: we don't care about case starting with ':'
list($markername,$t[1])=explode('::',$t[1],2);
}
if (isset($markername)){
$tt['markername']=$markername;
}
case 'wmss':
unset($ttt);
$ttt = explode('+',$t[1]);
for ($i =0; $i<count($ttt); $i++) {
unset($tt);
list($tt['name'],$tt['url'],$tt['format'],$tt['layers'],$tt['minresolution'],$tt['maxresolution'],$tt['copyrights'],$tt['overlaywith'],$tt['merczoomlevel'])=explode('::',$ttt[$i]);
$crr = explode('/',$tt['copyrights']);
unset($tt['copyrights']);
for ($k =0; $k<count($crr); $k++) {
unset($cr);
list($cr['minzoom'],$cr['bounds'],$cr['text'])=explode(':',$crr[$k]);
$tt['copyrights'][]=$cr;
}
$gmap['wmss'][]=$tt;
}
break;
case 'line1':
$tt['color']=GMAP_LINECOLOR1;
case 'line2':
if (empty($tt['color'])){
$tt['color']=GMAP_LINECOLOR2;
}
case 'line3':
if (empty($tt['color'])){
$tt['color']=GMAP_LINECOLOR3;
}
case 'line':
if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
list($configs,$t[1])=explode(':',$t[1],2);
list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'])=explode('/',$configs);
}
$tt['points'] = explode('+',$t[1]);
if ($ver==1) {
foreach ($tt['points'] as $key=>$value) {
$tt['points'][$key]=gmap_dopoint($value,$ver);
}
}
$tt['type'] = 'line';
$gmap['shape'][] = $tt;
break;
case 'rpolygon':
if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
list($configs,$t[1])=explode(':',$t[1],2);
list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'],$tt['fillcolor'],$tt['fillopacity'])=explode('/',$configs);
}
list($tt['center'],$tt['point'],$tt['sides']) = explode('+',$t[1]);
$tt['type']='rpolygon';
$gmap['shape'][] = $tt;
break;
case 'circle':
if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
list($configs,$t[1])=explode(':',$t[1],2);
list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'],$tt['fillcolor'],$tt['fillopacity'])=explode('/',$configs);
}
list($tt['center'],$tt['radius'],$tt['sides'])= explode('+',$t[1]);
$tt['type']='circle';
$gmap['shape'][] = $tt;
break;
case 'polygon':
$tt['color']=GMAP_LINECOLOR1;
if (strpos(':',$t[1])) { // note: we don't care about case starting with ':'
list($configs,$t[1])=explode(':',$t[1],2);
list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'],$tt['fillcolor'],$tt['fillopacity'])=explode('/',$configs);
}
$tt['points'] = explode('+',$t[1]);
$tt['type']='polygon';
$gmap['shape'][] = $tt;
break;
default:
$gmap[trim($t[0])] = trim($t[1]);
}
gmap_sanitize($gmap);
return $gmap;
}
/**
*
* Creates a map that can be interactively used to fill a form with a
* location (latitude, longitude and zoom level)
*
* @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=gmap_parse_macro($map);
}
$form[$fields['latitude']]['#id']='gmap-latitude';
$form[$fields['latitude']]['#attributes']=array('onchange'=>'gmap_textchange('.$map['id'].');');
$form[$fields['longitude']]['#id']='gmap-longitude';
$form[$fields['longitude']]['#attributes']= array('onchange'=>'gmap_textchange('.$map['id'].');');
if (isset($fields['address'])) {
$form[$fields['address']]['#id']='gmap-address';
$form[$fields['address']]['#attributes']= array('onchange'=>'gmap_geocodeaddress('.$map['id'].', this.value);');
}
if ($lonform['#default_value']!=0 || $latform['#default_value']!=0) {
$myjava .= '{id}.panTo(new GLatLng('.$latform['#default_value'].', '.$lonform['#default_value'].'));'."\n".
'{id}.addOverlay(thispoint=new GMarker(new GLatLng('.$latform['#default_value'].', '.$lonform['#default_value'].')));'."\n";
$myjava .= ' GEvent.addListener({id}, "click", function(overlay, point) {
{id}.checkResize();
if (point) {
if (thispoint) {
{id}.removeOverlay(thispoint);
}
{id}.addOverlay(thispoint=new GMarker(point));
$("gmap-latitude").value=point.lat();
$("gmap-longitude").value=point.lng();
else {
{id}.removeOverlay(thispoint);
$("gmap-latitude").value="";
$("gmap-longitude").value="";
thispoint=null;
}
});
// GEvent.addListener({id}, "dragend", function() {{id}.checkResize();} )
';
return $out;
}
function _gmap_doheader(){
static $gmap_initialized = FALSE;
if (variable_get('gmap_method','Static')=='None' || $gmap_initialized) {
return;
}
theme_add_style(drupal_get_path('module','gmap'). '/gmap.css');
drupal_add_js('misc/drupal.js');
drupal_add_js(drupal_get_path('module','gmap'). '/gmap.js');
$js = '<script src="http://maps.google.com/maps?file=api&v=2.x&key='.variable_get('googlemap_api_key', '').'" type="text/javascript"></script>';
drupal_add_js(variable_get('gmap_xmaps_script','misc/xmaps.1c.js'));
}
if (GMAP_CLUSTER){
if (file_exists('misc/Clusterer2.js')) {
drupal_add_js('misc/Clusterer2.js');
}
else {
drupal_add_js('http://www.acme.com/javascript/Clusterer2.js');
}
}
if (GMAP_WMS){
if (file_exists('misc/wms-gs.js')) {
drupal_add_js('misc/wms-gs.js');
} elseif (file_exists('misc/wms236.js')) {
drupal_add_js('misc/wms236.js');
} elseif (file_exists('misc/wms-gs-1_0_0.js')) {
drupal_add_js('misc/wms-gs-1_0_0.js');
} else {
drupal_add_js('http://dist.codehaus.org/geoserver/gmaps-geoserver_scripts/wms-gs-1_0_0.js');
}
$gmap_initialized = TRUE;
}
$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);
}
else {
$ver=2;
}
$out[1][$i] = gmap_draw_map(gmap_parse_macro($matches[1][$i],$ver));
$i++;
} // endwhile process macro
return $out;
}
function gmap_todim($instring) {
if (strpos($instring,'px')) {
return intval($instring).'px';
}
elseif (strpos($instring,'%')) {
return intval($instring).'%';
}
else {
return intval($instring).'px';
}
}
function gmap_dopoint($point,$ver) {
if ($ver==1) {
$lonlat=explode(',',$point,2);
return $lonlat[1].','.$lonlat[0];
}
else {
return $point;
}
}
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.');
case 'process':
$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 (variable_get('gmap_method', 'Static')=='Dynamic');
}
}
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('gmapmacro').'" target="_blank" >'.t('Create a macro').'</a>';
}
else {
return t('Insert Google Map macro.');
}
}
function gmap_menu($may_cache) {
$items=array();
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' => 'map/macro',
'type' => MENU_NORMAL_ITEM,
'title' => t('build a macro'),
'access' => user_access('create macro'),
'callback' => 'gmap_macro_page',
);
if (!$may_cache && (strlen(variable_get('googlemap_api_key', '')) > 0)) {
if (variable_get('gmap_method', 'Static')=='Static') {
_gmap_doheader();
}
}
return $items;
}
function gmap_settings() {
//note the same google api key variable name as in the googlemap module is used
//note the name of the variable for center of the map is latlong although the format is actually longitude, latitude
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
$form['initialization']=array(
'#type' => 'fieldset',
'#title' => t('Google Map Initialize'),
);
$form['initialization']['googlemap_api_key']=array(
'#type' => 'textfield',
'#title' => t('Google map API key'),
'#default_value'=>variable_get('googlemap_api_key', ''),
'#size' => 50,
'#maxlength' => 255,
'#description' => t('Your personal Googlemaps API key. You must get this for each separate website at <a href="http://www.google.com/apis/maps/">Google Map API website</a>.'),
);
$form['initialization']['gmap_method']=array(
'#type' => 'select',
'#title' => t('Google map method'),
'#options'=> array('Static'=>t('Static'), 'Dynamic'=>t('Dynamic'), 'None'=>t('None')),
'#default_value'=>GMAP_LOAD_METHOD,
'#description' => t('How is the Google Map initialization script run:<br /><strong>Static</strong> - Loaded on every page, <br /><strong>Dynamic</strong> - Initialization script runs only on pages with google maps, but all pages with the gmap filter will not be cached. <br /><strong>None</strong> - Google map initialization script must be loaded some other way.'),
);
// xmaps not compatible with v2 of the Google Map API
/*
$form['initialization']['gmap_xmaps']=array(
'#type'=>'checkbox',
'#title'=>t('Enable Xmaps features (circles and polygons)'),
'#default_value'=>GMAP_XMAPS,
'#description'=>t('Enables XMaps features. XMaps is currently a <em>beta</em> release available from <a href="http://xmaps.busmonster.com/">xmaps.busmonser.com</a>. '),
);
$form['initialization']['gmap_xmaps_script']=array(
'#type' => 'textfield',
'#title' => t('Location of XMaps script'),
'#default_value'=>GMAP_XMAPS_SCRIPT,
'#size' => 25,
'#maxlength' => 50,
);
*/
$form['initialization']['gmap_cluster']=array(
'#type'=>'checkbox',
'#title'=>t('Enable clusterer.js'),
'#default_value'=>GMAP_CLUSTER,
'#description'=>t('Enables Jef Poskanzer\'s excellent <a href="http://www.acme.com/javascript/#Clusterer">clusterer.js</a> script. (useful for a large number of markers on a single map)'),
);
$form['initialization']['gmap_on_click']=array(
'#type'=>'radios',
webgeer
committed
'#title'=>t('On Click Marker'),
'#default_value'=>variable_get('gmap_on_click',0),
'#options'=>array(t('Open info window'), t('Open link')),
'#description'=>t('For markers that have link associated with them, it can either an info window or go directly to the link.'),
);
$form['defaults']=array(
'#type' => 'fieldset',
'#title' => t('Default map settings'),
);
$form['defaults']['gmap_default_width']=array(
'#type'=>'textfield',
'#title'=>t('Default width'),
'#default_value'=>GMAP_WIDTH,
'#size'=>25,
'#maxlength'=>6,
'#description'=>t('The default width of a Google map.'),
);
$form['defaults']['gmap_default_height']=array(
'#type'=>'textfield',
'#title'=>t('Default height'),
'#default_value'=>GMAP_HEIGHT,
'#size'=>25,
'#maxlength'=>6,
'#description'=>t('The default height of a Google map.'),
);
$form['defaults']['gmap_default_latlong']=array(
'#type'=>'textfield',
'#title'=>t('Default center'),
'#default_value'=>GMAP_LONGLAT,
'#description'=>'The decimal latitude,longitude of the centre of the map. The "." is used for decimal, and "," is used to separate latitude and longitude.',