Newer
Older
<?php
/* $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.
*/
$gmap_initialized=FALSE;
function gmap_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('Filter to allow insertion of a google map into a node');
break;
}
}
function gmap_perm() {
return array('create macro', 'override defaults', 'show user map', 'user locations');
}
/**
*
* 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 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'
* tcontrol - whether the type control is on the map or not: 'off' or 'on'
* drag - 'yes' or 'no' map is draggable. Default is 'yes'
* points - an array of associative arrays for the points.
* 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.
*
* 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_from_var ($gmap,$javascript='') {
global $base_url;
_gmap_doheader();
(!isset($gmap['width'])) ? $gmap['width']=variable_get('gmap_default_width', 300): NULL;
(!isset($gmap['height'])) ? $gmap['height']=variable_get('gmap_default_height', 200):NULL;
(!isset($gmap['zoom'])) ? $gmap['zoom']=variable_get('gmap_default_zoom', 7):NULL;
(!isset($gmap['align'])) ? $gmap['align']='':NULL;
(!isset($gmap['id'])) ? $gmap['id']='map':NULL;
(!isset($gmap['control'])) ? $gmap['control']='Small':NULL;
(!isset($gmap['type'])) ? $gmap['type']='Map':NULL;
(!isset($gmap['tcontrol'])) ? $gmap['tcontrol']='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']=variable_get('gmap_default_latlong', '-123.1, 49.2');
}
$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.='<div id="'.$gmap['id'].'" style="'.$style.'"></div>
//initialize gmap variables
var mycontrol=null;
var mytypecontrol=null;
var '.$gmap['id'].'=null;
gmap_torun.push(\'gmap_load_'.$gmap['id'].'();\');
function gmap_load_'.$gmap['id'].'() {
'.$gmap['id'].' = new GMap(document.getElementById("'.$gmap['id'].'"));
'.$gmap['id'].'.centerAndZoom(new GPoint('.$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());
';
}
switch (strtolower($gmap['type'])) {
case 'hybrid':
$outtext .= $gmap['id'].".setMapType(G_HYBRID_TYPE); \n";
break;
case 'satellite':
$outtext .= $gmap['id'].".setMapType(G_SATELLITE_TYPE); \n";
}
if (isset($gmap['drag']) && strtolower($gmap['drag'])=='no') {
$outtext .= $gmap['id'].".disabledragging(); \n";
}
$outext .= $gmap['id'].'.centerAndZoom(new GPoint('.$gmap['center'].'), '.$gmap['zoom'].");\n";
if (isset($gmap['track'])) {
foreach ($gmap['track'] as $value) {
$tt=$value;
$tt['type']='line';
//open file parse into points
$gmap['shape'][]=$tt;
if (isset($gmap['markers'])) {
$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','modules/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','modules/gmap/markers').'/'.$item['markername'].'.png';
}
}
if (isset($item['label']) && strlen($item['label'])>0) {
$mytext=$item['label'];
$outtext .=$gmap['id'].'.addOverlay(createGMarker(new GPoint('.$item['point'].'),\''.$mytext.'\',\''.$mymarker."'));\n";
if (isset($gmap['shape']) && !variable_get('gmap_xmaps',0)) {
//if xmaps is not enabled then just show the lines using gma;
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'];
}
}
}
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";
}
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
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 (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
reset($gmap);
$value=current($gmap);
do {
if (key($gmap)=='id') {
if (strlen($out[0])==0) $out[0]='map';
$gmap[key($gmap)]=$out[0];
return $gmap;
}
/**
*
* Returns the html required to insert a map from a gmap associative array.
*
* @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 - a string of points to mark on the map with + between each point
* line -
* circle -
* rpolygon -
* polygon -
* track -
*
* @return
* A string with the google map ready to be inserted into a node.
*
*/
function gmap_parse_text($instring, $javascript='') {
unset($tt);
switch (trim($t[0])) {
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
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 {
$tt['point']=$ttt[$i];
}
if (isset($markername)){
$tt['markername']=$markername;
}
$gmap['markers'][]=$tt;
}
break;
case 'track':
$tt['color']=variable_get('gmap_default_line1_color', '#00cc00');
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];
$gmap['track'][] = $tt;
break;
case 'line1':
$tt['color']=variable_get('gmap_default_line1_color', '#00cc00');
case 'line2':
if (empty($tt['color'])){
$tt['color']=variable_get('gmap_default_line2_color', '#ff0000');
}
case 'line3':
if (empty($tt['color'])){
$tt['color']=variable_get('gmap_default_line3_color', '#0000ff');
}
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]);
$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']=variable_get('gmap_default_line1_color', '#00cc00');
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]);
}
return $gmap;
}
function gmap_from_text($instring, $javascript='') {
$gmap=gmap_parse_text($instring,$javascript);
$outtext = gmap_from_var($gmap,$javascript);
function _gmap_doheader(){
global $gmap_initialized;
if (variable_get('gmap_method','Static')=='None' || $gmap_initialized) {
drupal_set_html_head('<!--gmap_initialized already -->');
return;
}
$header_text = '<style type="text/css">
v\:* {
behavior:url(#default#VML);
}
</style>
<script src="http://maps.google.com/maps?file=api&v=1&key='.variable_get('googlemap_api_key', '').'" type="text/javascript"></script>
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
<script language="javascript">
//<![CDATA[
var gmap_torun= new Array();
// note: this is to allow the page to finish loading before it tries to modify the DOM
function gmap_onload() {
for (i=0; i < gmap_torun.length; i++) {
eval(gmap_torun[i]);
}
}
var oldOnload = window.onload;
if (typeof window.onload != \'function\') {
window.onload = gmap_onload;
}else {
window.onload = function() {
oldOnload();
gmap_onload();
}
}
var baseIcon = new GIcon();
baseIcon.image = "http://www.google.com/mapfiles/marker.png";
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);
function createGMarker(point, htmltext, marker) {
if (marker.length >0) {
var markerIcon = new GIcon(baseIcon);
markerIcon.image = marker;
var returnMarker = new GMarker(point, markerIcon);
}
else {
}
// Show this htmltext info window when it is clicked.
if (htmltext.length>0) {
GEvent.addListener(returnMarker, \'click\', function() {
returnMarker.openInfoWindowHtml(htmltext);
});
}
}
// ]]>
</script>
';
if (variable_get('gmap_xmaps',0)) {
$header_text .= '<script src="'.variable_get('gmap_xmaps_script','misc/xmaps.1c.js').'" type="text/javascript"> </script>'."\n";
}
drupal_set_html_head($header_text);
$gmap_initialized = true;
}
function _gmap_prepare($intext) {
$out=FALSE;
$mapexp = '/\[gmap([^\[\]]+ )* \] /x';
preg_match_all($mapexp, $intext, $matches);
$i=0;
while (isset($matches[1][$i])) {
$out[0][$i] = $matches[0][$i];
$out[1][$i] = gmap_from_text($matches[1][$i]);
$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_filter($op, $delta = 0, $format = -1, $text = '') {
switch ($op) {
case 'list':
return (array(0 => t('GMap filter')));
break;
case 'name':
return t('Google map filter');
break;
case 'description':
return t('converts a google map macro into the html required for inserting a google map.');
break;
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;
}
break;
case 'prepare':
return $text;
break;
case 'no cache':
return variable_get('gmap_method', 'Static')=='Dynamic';
break;
}
}
function gmap_filter_tips($delta, $format, $long = false) {
return t('Insert Google Map macro. <a href="gmapmacro" target="_blank" >Create a macro</a>');
}
function gmap_menu($may_cache) {
$items=array();
if ($may_cache) {
$items[] = array('path' => 'gmapmacro',
'type' => MENU_SUGGESTED_ITEM,
'title' => t('Create a Google Map Macro'),
'access' => user_access('create macro'),
'callback' => 'gmap_macro_page' );
if (variable_get('gmap_user',0)) {
$items[] = array('path' => 'users/map',
'type' => MENU_NORMAL_ITEM,
'title' => t('User Locations'),
'access' => user_access('show user map'),
'callback' => 'gmap_users_page' );
}
if (!$may_cache && (strlen(variable_get('googlemap_api_key', '')) > 0)) {
if (variable_get('gmap_method', 'Static')=='Static') {
_gmap_doheader();
}
function gmap_user($op, &$edit, &$user, $category = NULL) {
if (variable_get('gmap_user',0)) {
switch ($op) {
case 'categories':
return array(array('name'=>'gmap_user', 'title'=> t('Location Map'),'weight'=>5));
case 'validate':
if (isset($edit['gmap_latitude'])){
if (!is_numeric($edit['gmap_latitude']) || abs($edit['gmap_latitude'])>90) {
form_set_error('gmap_latitude', t('Latitude must be between -90 and 90'));
}
}
if (isset($edit['gmap_longitude'])){
if (!is_numeric($edit['gmap_longitude']) || abs($edit['gmap_longitude'])>180) {
form_set_error('gmap_longitude', t('Longitude must be between -180 and 180'));
}
}
return;
case 'load':
$res=db_query("SELECT * FROM {gmap_user} WHERE uid=%d",$user->uid);
if ($gmap_user=db_fetch_array($res)) {
$user->latitude=$gmap_user['latitude'];
$user->longitude=$gmap_user['longitude'];
$user->gmap_zoom=$gmap_user['zoom'];
}
return;
case 'insert':
case 'update':
if ((isset($edit['gmap_latitude']) && $edit['gmap_latitude'] !=0) && (isset($edit['gmap_longitude']) && $edit['gmap_longitude'] !=0)) {
db_query('DELETE from {gmap_user} WHERE uid=%d',$user->uid);
db_query("INSERT INTO {gmap_user} (uid, latitude, longitude, zoom) VALUES (%d, %f, %f, %d)", $user->uid, $edit['gmap_latitude'],$edit['gmap_longitude'], $edit['gmap_zoom']);
}
return;
//db_query ("UPDATE {gmap_user} SET latitude='%f', longitude='%f', zoom=%d WHERE uid=%d", $user->uid, $edit['gmap_latitude'],$edit['gmap_longitude'], $edit['gmap_zoom']);
//return;
case 'delete':
db_query ('DELETE from {gmap_user} WHERE uid=%d', $user->uid);
return;
case 'form':
if ($category=='gmap_user') {
if (isset($user->latitude) && isset($user->longitude)) {
$usermap=_gmap_user_form($user->longitude,$user->latitude, $user->gmap_zoom);
}
else {
$usermap = _gmap_user_form();
}
$form['map']=array('#type' => 'fieldset','#title' => t('Google Map'));
$form['map']['gmap_user']=array('#type'=>'markup','#value'=>$usermap);
$form['coordinates']=array('#type' => 'fieldset','#title' => t('Coordinates'));
$form['coordinates']['gmap_latitude']=array('#type'=>'textfield', '#title'=>t('Latitude'), '#default_value'=>$user->latitude, '#size'=>30, '#maxlength'=>120, '#description'=>t('The latitude will automatically be entered here (or you can do it manually).'),'#onchange'=>'gmap_textchange();');
$form['coordinates']['gmap_longitude']=array('#type'=>'textfield', '#title'=>t('Longitude'), '#default_value'=>$user->longitude, '#size'=>30, '#maxlength'=>120, '#description'=>t('The longitude will automatically be entered here (or you can do it manually).'),'#onchange'=>'gmap_textchange();');
$form['coordinates']['gmap_user_zoom']=array('#type'=>'hidden', '#default_value'=>variable_get('gmap_user_zoom', 15));
return $form;
/*
$form2 = form_textfield(t('Latitude'), 'gmap_latitude', $user->latitude, 30,120, t('The latitude will automatically be entered here (or you can do it manually).'), array('onchange'=>'gmap_textchange();') );
$form2 .= form_textfield(t('Longitude'), 'gmap_longitude', $user->longitude, 30,120, t('The longitude will automatically be entered here (or you can do it manually).'), array('onchange'=>'gmap_textchange();') );
$form2 .= form_hidden('gmap_zoom', variable_get('gmap_user_zoom', 15));
return array(array('title'=>t('Google Map'), 'data'=>$form, 'weight'=>0),array('title'=>t('Coordinates'), 'data'=>$form2, 'weight'=>1));
*/
}
}
}
}
/* Not used in Drupal 4.7 due to a bug in Drupal 4.7
if (strlen(variable_get('googlemap_api_key', ''))>0) return array('gmap_onload()');
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
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
$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'=>variable_get('gmap_method','Static'),'#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.'));
$form['initialization']['gmap_xmaps']=array('#type'=>'checkbox', '#title'=>t('Enable Xmaps features (circles and polygons)'), '#default_value'=>variable_get('gmap_xmaps',0),'#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'=>variable_get('gmap_xmaps_script','misc/xmaps.1c.js'), '#size' => 25, '#maxlength' => 50);
$form['defaults']=array('#type' => 'fieldset', '#title' => t('Default map settings'));
$form['defaults']['gmap_default_width']=array('#type'=>'textfield', '#title'=>t('Default width'), '#default_value'=>variable_get('gmap_default_width', 300), '#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'=>variable_get('gmap_default_height', 200), '#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'=>variable_get('gmap_default_latlong', '-123.1, 49.2'), '#size'=>50, '#maxlength'=>255, '#description'=>t('The default longitude, latitude of a Google map.'));
$form['defaults']['gmap_default_zoom']=array('#type'=>'textfield', '#title'=>t('Default zoom'), '#default_value'=>variable_get('gmap_default_zoom', 7), '#size'=>25, '#maxlength'=>4, '#description'=>t('The default zoom level of a Google map (between 1 and 24).'));
$form['defaults']['gmap_default_control']=array('#type'=>'select', '#title'=>t('Default control type'), '#default_value'=>variable_get('gmap_default_control', 'Small'), '#options'=>array('None'=>t('None'),'Small'=>t('Small'),'Large'=>t('Large')));
$form['defaults']['gmap_default_type']=array('#type'=>'select', '#title'=>t('Default map type'), '#default_value'=>variable_get('gmap_default_type', 'Map'), '#options'=>array('Map'=>t('Map'),'Hybrid'=>t('Hybrid'),'Satellite'=>t('Satellite')));
$form['defaults']['gmap_default_line1_color']=array('#type'=>'textfield', '#title'=>t('Default Line 1 Color'), '#default_value'=>variable_get('gmap_default_line1_color', '#00cc00'), '#size'=>25, '#maxlength'=>7 );
$form['defaults']['gmap_default_line2_color']=array('#type'=>'textfield', '#title'=>t('Default Line 2 Color'), '#default_value'=>variable_get('gmap_default_line2_color', '#ff0000'), '#size'=>25, '#maxlength'=>7 );
$form['defaults']['gmap_default_line3_color']=array('#type'=>'textfield', '#title'=>t('Default Line 3 Color'), '#default_value'=>variable_get('gmap_default_line3_color', '#0000ff'), '#size'=>25, '#maxlength'=>7 );
$form['user']=array('#type' => 'fieldset', '#title' => t('User map settings'));
$form['user']['gmap_user']=array('#type'=>'checkbox', '#title'=>t('Enable Mapping of user locations'), '#default_value'=>variable_get('gmap_user',0),'#description'=>t('Ensure that the database table gmap_user is created before turning on the user location mapping functions.'));
$form['user']['gmap_user_map']=array('#type'=>'textfield', '#title'=>t('Default user map'), '#default_value'=>variable_get('gmap_user_map', '[gmap|id=usermap|center=0,30|zoom=16|width=100%|height=400px]'), '#size'=>50, '#description'=>t('The gmap macro where the user information will be diplayed on.'));
return $form;
/* from 4.6 settings
$output = form_group(t('Google map initializations'),
form_textfield(t('Google API Key'), 'googlemap_api_key', variable_get('googlemap_api_key', ''), 100, 255, 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_select(t('Google map method'), 'gmap_map_method', variable_get('gmap_map method', 'Static'), array('Static'=>t('Static'), 'Dynamic'=>t('Dynamic'), 'None'=>t('None')),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.')));
$output .= form_group(t('Default map settings'),
form_textfield(t('Default width'), 'gmap_default_width', variable_get('gmap_default_width', 300), 100,4,t('The default width of a Google map.')).
form_textfield(t('Default height'), 'gmap_default_height', variable_get('gmap_default_height', 200), 100,4,t('The default height of a Google map.')).
form_textfield(t('Default center'), 'gmap_default_latlong', variable_get('gmap_default_latlong', '-123.1, 49.2'), 100,120,t('The default longitude, latitude of a Google map.')).
form_textfield(t('Default zoom'), 'gmap_default_zoom', variable_get('gmap_default_zoom', 7), 100,2,t('The default zoom level of a Google map.')).
form_select(t('Default Control type'), 'gmap_default_control', variable_get('gmap_default_control', 'Small'), array('None'=>t('None'), 'Small'=>t('Small'), 'Large'=>t('Large')),t('The default control type for the map.')).
form_select(t('Default map type'), 'gmap_map_type', variable_get('gmap_default_type', 'Map'),array('Map'=>t('Map'), 'Hybrid'=>t('Hybrid'), 'Satellite'=>t('Satellite')),t('The default map type.')).
form_textfield(t('Line1 color'), 'gmap_default_line1_color', variable_get('gmap_default_line1_color', '#00cc00'), 100,7).
form_textfield(t('Line2 color'), 'gmap_default_line2_color', variable_get('gmap_default_line2_color', '#ff0000'), 100,7).
form_textfield(t('Line3 color'), 'gmap_default_line3_color', variable_get('gmap_default_line3_color', '#0000ff'), 100,7));
$output .= form_group(t('User map settings'),
form_checkbox(t('Enable mapping of user locations.'),'gmap_user', 1, variable_get('gmap_user',0),t('Ensure that the database table gmap_user is created before turning on the user location mapping functions.')).
form_textfield(t('User Map View'), 'gmap_user_map', variable_get('gmap_user_map', '[gmap|id=usermap|center=0,30|zoom=16|width=100%|height=400px]'), 100,255));
}
/**
*
* Creates a page that has all of the javascript required for the macro-creation tool.
*
*/
function gmap_macro_page() {
$line_colour=array(1=>variable_get('gmap_default_line1_color', '#00cc00'), variable_get('gmap_default_line2_color', '#ff0000'),variable_get('gmap_default_line3_color', '#0000ff'));
(isset($_REQUEST['width'])) ? $newwidth=$_REQUEST['width'] : $newwidth= variable_get('gmap_default_width', 300);
(isset($_REQUEST['height'])) ? $newheight=$_REQUEST['height'] : $newheight= variable_get('gmap_default_height', 200);
(isset($_REQUEST['longlat'])) ? $newlonglat=$_REQUEST['longlat'] : $newlonglat= variable_get('gmap_default_latlong', '-123.1, 49.2');
(isset($_REQUEST['zoom'])) ? $newzoom=$_REQUEST['zoom'] : $newzoom= variable_get('gmap_default_zoom', 7);
(isset($_REQUEST['control'])) ? $newcontrol=$_REQUEST['control'] : $newcontrol= variable_get('gmap_default_control', 'Small');
$control=''; $small=''; $large='';
(variable_get('clean_url', true)) ? $qurl='' : $qurl='?q=';
if ($newcontrol=='Small') {
$small = 'SELECTED ';
$initiate .= "map.addControl(mycontrol = new GSmallMapControl());\n";
}
if ($newcontrol=='Large') {
$large = 'SELECTED ';
$initiate .= "map.addControl(mycontrol = new GLargeMapControl());\n";
for ($i=1; $i<=3; $i++) {
if (isset($_REQUEST['point'.$i]) && strlen($_REQUEST['point'.$i])>0) {
$newpoint[$i]=$_REQUEST['point'.$i];
$initiate .= 'point'.$i.'overlay=new GMarker(new GPoint('.$_REQUEST['point'.$i].'));'."\n";
$initiate .= 'map.addOverlay(point'.$i.'overlay);'."\n";
}
else {
$newpoint[$i]='';
}
if (isset($_REQUEST['line'.$i]) && strlen($_REQUEST['line'.$i])>0) {
$newline[$i]=$_REQUEST['line'.$i];
$initiate .= 'line'.$i.'overlay = new GPolyline([new GPoint('.str_replace(' + ','), new GPoint(',$newline[$i]).')],"'.$line_colour[$i].'", 5);'."\n";
$initiate .= 'map.addOverlay(line'.$i.'overlay);'."\n";
}
else {
$newline[$i]='';
}
}
$output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<title>GMap Macro Creator</title>
<script src="http://maps.google.com/maps?file=api&v=1&key='.variable_get('googlemap_api_key', 'abcdef').'" type="text/javascript"></script>
<style type="text/css">
v\:* {
behavior:url(#default#VML);
}
body {
font-family: Helvetica, Arial, Lucida, Verdana, sans-serif;
}
h1 {
font-size: 1.2em;
font-weight: 700;
}
</style>
</head>
<body onload="makemacro(); gmapload();">
<h1>GMap Macro creation tool</h1>
<p>Using the controls on this page, set the map as to how you would like it to appear and then use the gmap macro filter to insert this
into a node. Select the contents of the macro form (by clicking on macro text field) and then copy and paste it into a node where the
gmap filter has been enabled.
<p><div id="map" style="width: '.$newwidth.'; height: '.$newheight.'"></div>
<script type="text/javascript">
//<![CDATA[
function makemacro() {
var zooml = \' |zoom=\' + document.gmapform.zoom.value;
var center = \' |center=\' + document.gmapform.longlat.value;
var width = \' |width=\' + document.gmapform.width.value;
var height = \' |height=\' + document.gmapform.height.value;
var id = \' |id=\' + document.gmapform.id.value;
var control = \' |control=\' + document.gmapform.controltype.value;
var type = \' |type=\' + document.gmapform.maptype.value;
var alignment = \' |align=\' + document.gmapform.alignment.value;
if (points.length >0) {
var outpoints = \' |markers=\' + points.join(\' + \');
} else var outpoints=\'\';
if (document.gmapform.line1.value.length >0) {var line1 = \' |line1=\' + document.gmapform.line1.value} else line1=\'\';
if (document.gmapform.line2.value.length >0) {var line2 = \' |line2=\' + document.gmapform.line2.value} else line2=\'\';
if (document.gmapform.line3.value.length >0) {var line3 = \' |line3=\' + document.gmapform.line3.value} else line3=\'\';
document.gmapform.macro.value = \'[gmap\' + id + center + zooml + width + height + alignment + control + type + outpoints + line1 + line2 + line3 + \']\';
}
function mapat(instring) {
var splitstring=instring.split(",");
map.centerAtLatLng(new GPoint(splitstring[0],splitstring[1]));
}
function docontrol(incontrol) {
map.removeControl(mycontrol);
if (incontrol == "Small") map.addControl(mycontrol = new GSmallMapControl());
if (incontrol == "Large") map.addControl(mycontrol = new GLargeMapControl());
makemacro();
}
function changetype(intype) {
if (intype == "Map") map.setMapType(G_MAP_TYPE);
if (intype == "Hybrid") map.setMapType(G_HYBRID_TYPE);
if (intype == "Satellite") map.setMapType(G_SATELLITE_TYPE);
makemacro();
}
function doresize () {
var width = document.gmapform.width.value; //(in pixels, e.g. 500px)
var height = document.gmapform.height.value; //(in pixels, e.g. 300px)
if (mapdiv){
mapdiv.style.width=width;
mapdiv.style.height=height;
}
map.onResize();
makemacro();
}
var points=[];
var pointsOverlays=[];
var line1overlay=null; var line1points=new Array(); var line1string=new String();
var line2overlay=null; var line2points=new Array(); var line2string=new String();
var line3overlay=null; var line3points=new Array(); var line3string=new String();
function gmapload() {
if (GBrowserIsCompatible()) {
map = new GMap(document.getElementById("map"));
map.centerAndZoom(new GPoint('.$newlonglat.'), '.$newzoom.');
GEvent.addListener(map, "moveend", function() {
var center = map.getCenterLatLng();
var latLngStr = center.x + \', \' + center.y ;
makemacro();
});
GEvent.addListener(map, "zoom", function() {
var zooml = map.getZoomLevel();
document.gmapform.zoom.value = zooml;
makemacro();
});
GEvent.addListener(map, \'click\', function(overlay, point) {
if (overlay) {
var shft=false;
for (i=0; i<points.length; i++){
if (overlay==pointsOverlays[i]) {
shft=true;
}
if (shft==true) {
if (i<points.length) {
pointsOverlays[i]=pointsOverlays[i+1];
points[i]=points[i+1];
}
}
points.pop();
pointsOverlays.pop();
map.removeOverlay(overlay);
}
else if (point) {
if (document.gmapform.clicktype.value==\'Points\') {
map.addOverlay(marker=new GMarker(point));
pointsOverlays.push(marker);
points.push(point.x + \',\' + point.y);
}
else if (document.gmapform.clicktype.value==\'Line1\') {
line1points.push(point);
if (line1overlay) map.removeOverlay(line1overlay);
line1overlay=new GPolyline(line1points,"'.$line_colour[1].'", 5);
map.addOverlay(line1overlay);
if (line1string.length > 0) line1string += \' + \';
line1string += point.x + \',\' + point.y;
document.gmapform.line1.value = line1string;
}
else if (document.gmapform.clicktype.value==\'Line2\') {
line2points.push(point);
if (line2overlay) map.removeOverlay(line2overlay);
line2overlay=new GPolyline(line2points,"'.$line_colour[2].'", 5);
map.addOverlay(line2overlay);
if (line2string.length > 0) line2string += \' + \';
line2string += point.x + \',\' + point.y;
document.gmapform.line2.value = line2string;
}
else if (document.gmapform.clicktype.value==\'Line3\') {
line3points.push(point);
if (line3overlay) map.removeOverlay(line3overlay);
line3overlay=new GPolyline(line3points,"'.$line_colour[3].'", 5);
map.addOverlay(line3overlay);
if (line3string.length > 0) line3string += \' + \';
line3string += point.x + \',\' + point.y;
document.gmapform.line3.value = line3string;
}
}
makemacro();
});
}
}
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
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
function addpoint(formelement) {
var splitstring=formelement.value.split(",");
var point=new GPoint(splitstring[0],splitstring[1]);
if (document.gmapform.clicktype.value==\'Points\') {
map.addOverlay(marker=new GMarker(point));
pointsOverlays.push(marker);
points.push(formelement.value);
}
else if (document.gmapform.clicktype.value==\'Line1\') {
line1points.push(point);
if (line1overlay) map.removeOverlay(line1overlay);
line1overlay=new GPolyline(line1points,"'.$line_colour[1].'", 5);
map.addOverlay(line1overlay);
if (line1string.length > 0) line1string += \' + \';
line1string += point.x + \',\' + point.y;
document.gmapform.line1.value = line1string;
}
else if (document.gmapform.clicktype.value==\'Line2\') {
line2points.push(point);
if (line2overlay) map.removeOverlay(line2overlay);
line2overlay=new GPolyline(line2points,"'.$line_colour[2].'", 5);
map.addOverlay(line2overlay);
if (line2string.length > 0) line2string += \' + \';
line2string += point.x + \',\' + point.y;
document.gmapform.line2.value = line2string;
}
else if (document.gmapform.clicktype.value==\'Line3\') {
line3points.push(point);
if (line3overlay) map.removeOverlay(line3overlay);
line3overlay=new GPolyline(line3points,"'.$line_colour[3].'", 5);
map.addOverlay(line3overlay);
if (line3string.length > 0) line3string += \' + \';
line3string += point.x + \',\' + point.y;
document.gmapform.line3.value = line3string;
}
makemacro();
}
function newid ()
{
var newvalue = document.gmapform.id.value;
newvalue=newvalue.match(/^[0-9A-Za-z_-]+/);
if (newvalue.length==0) newvalue=\'map\';
makemacro();
};
<form action="'.$qurl.'gmapmacro" name="gmapform" method="post">
<tr><td><a title="When multiple maps are to be shown on the same page, each one must have a unique id. (only letters numbers and - and _ are permitted)">ID:</a></td><td><input type="text" size="25" name="id" value="map" onchange="newid(); " />
<td>Map type:</td><td><SELECT NAME="maptype" onchange="changetype(document.gmapform.maptype.value);">
<OPTION VALUE="Map" />Map
<OPTION VALUE="Hybrid" />Hybrid
<OPTION VALUE="Satellite" />Satellite
</SELECT> </td> </tr>
<tr><td><a title="The Longitude and Latitude of the centre of the map">Long, Lat:</a></td><td colspan=3><input type="text" size="50" name="longlat" value="'.$newlonglat.'" onchange="mapat(document.gmapform.longlat.value); " /> </td>
<tr><td><a title="Map size">Width:</a></td><td><input type="text" size="25" name="width" value="'.$newwidth.'" onchange="doresize();" /></td>
<td>Alignment:</td><td><SELECT NAME="alignment" onchange="makemacro();">