xref: /plugin/openlayersmap/syntax/olmap.php (revision c8eb13626ece0cdbb2369662b8c76ea8fa800c3a)
138a47c60SMark Prins<?php
238a47c60SMark Prins/*
3bc5164eaSMark Prins * Copyright (c) 2008-2016 Mark C. Prins <mprins@users.sf.net>
438a47c60SMark Prins *
538a47c60SMark Prins * Permission to use, copy, modify, and distribute this software for any
638a47c60SMark Prins * purpose with or without fee is hereby granted, provided that the above
738a47c60SMark Prins * copyright notice and this permission notice appear in all copies.
838a47c60SMark Prins *
938a47c60SMark Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1038a47c60SMark Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1138a47c60SMark Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1238a47c60SMark Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1338a47c60SMark Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1438a47c60SMark Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1538a47c60SMark Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1638a47c60SMark Prins */
171c640875SMark Prinsif (! defined ( 'DOKU_INC' ))
181c640875SMark Prins	define ( 'DOKU_INC', realpath ( dirname ( __FILE__ ) . '/../../' ) . '/' );
191c640875SMark Prinsif (! defined ( 'DOKU_PLUGIN' ))
201c640875SMark Prins	define ( 'DOKU_PLUGIN', DOKU_INC . 'lib/plugins/' );
2138a47c60SMark Prinsrequire_once (DOKU_PLUGIN . 'syntax.php');
2238a47c60SMark Prins
2338a47c60SMark Prins/**
24cc74a83cSMark Prins * DokuWiki Plugin openlayersmap (Syntax Component).
25cc74a83cSMark Prins * Provides for display of an OpenLayers based map in a wiki page.
26cc74a83cSMark Prins *
27cc74a83cSMark Prins * @author Mark Prins
2838a47c60SMark Prins */
2938a47c60SMark Prinsclass syntax_plugin_openlayersmap_olmap extends DokuWiki_Syntax_Plugin {
30fcf646d2SMark Prins
311c640875SMark Prins	/**
321c640875SMark Prins	 * defaults of the known attributes of the olmap tag.
331c640875SMark Prins	 */
3438a47c60SMark Prins	private $dflt = array (
3538a47c60SMark Prins			'id' => 'olmap',
3638a47c60SMark Prins			'width' => '550px',
3738a47c60SMark Prins			'height' => '450px',
3838a47c60SMark Prins			'lat' => 50.0,
3938a47c60SMark Prins			'lon' => 5.1,
4038a47c60SMark Prins			'zoom' => 12,
41*c8eb1362SMark Prins			'autozoom' => 1,
4238a47c60SMark Prins			'statusbar' => true,
43*c8eb1362SMark Prins			'toolbar' => true,
4438a47c60SMark Prins			'controls' => true,
4538a47c60SMark Prins			'poihoverstyle' => false,
4638a47c60SMark Prins			'baselyr' => 'OpenStreetMap',
4738a47c60SMark Prins			'gpxfile' => '',
4845c50327SMark Prins			'kmlfile' => '',
496914b920SMark Prins			'geojsonfile' => '',
5045c50327SMark Prins			'summary' => ''
5138a47c60SMark Prins	);
5238a47c60SMark Prins
5338a47c60SMark Prins	/**
541c640875SMark Prins	 *
55cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::getType()
5638a47c60SMark Prins	 */
5775c98788SMark Prins	function getType() {
5875c98788SMark Prins		return 'substition';
5975c98788SMark Prins	}
6038a47c60SMark Prins
6138a47c60SMark Prins	/**
621c640875SMark Prins	 *
63cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::getPType()
6438a47c60SMark Prins	 */
6575c98788SMark Prins	function getPType() {
6675c98788SMark Prins		return 'block';
6775c98788SMark Prins	}
6838a47c60SMark Prins
6938a47c60SMark Prins	/**
701c640875SMark Prins	 *
71cc74a83cSMark Prins	 * @see Doku_Parser_Mode::getSort()
7238a47c60SMark Prins	 */
7375c98788SMark Prins	function getSort() {
7475c98788SMark Prins		return 901;
7575c98788SMark Prins	}
76fc16f3cdSMark Prins
7738a47c60SMark Prins	/**
781c640875SMark Prins	 *
79cc74a83cSMark Prins	 * @see Doku_Parser_Mode::connectTo()
8038a47c60SMark Prins	 */
8138a47c60SMark Prins	function connectTo($mode) {
8238a47c60SMark Prins		$this->Lexer->addSpecialPattern ( '<olmap ?[^>\n]*>.*?</olmap>', $mode, 'plugin_openlayersmap_olmap' );
8338a47c60SMark Prins	}
84fc16f3cdSMark Prins
8538a47c60SMark Prins	/**
861c640875SMark Prins	 *
87cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::handle()
8838a47c60SMark Prins	 */
89bc5164eaSMark Prins	function handle($match, $state, $pos, Doku_Handler $handler) {
9038a47c60SMark Prins		// break matched cdata into its components
9138a47c60SMark Prins		list ( $str_params, $str_points ) = explode ( '>', substr ( $match, 7, - 9 ), 2 );
92554f43b5SMark Prins		// get the lat/lon for adding them to the metadata (used by geotag)
93d2f4772aSMark Prins		preg_match ( '(lat[:|=]\"-?\d*\.?\d*\")', $match, $mainLat );
94d2f4772aSMark Prins		preg_match ( '(lon[:|=]\"-?\d*\.?\d*\")', $match, $mainLon );
95554f43b5SMark Prins		$mainLat = substr ( $mainLat [0], 5, - 1 );
96554f43b5SMark Prins		$mainLon = substr ( $mainLon [0], 5, - 1 );
97d2f4772aSMark Prins		if (!is_numeric($mainLat)) {
98d2f4772aSMark Prins			$mainLat = $this->dflt ['lat'];
99d2f4772aSMark Prins		}
100d2f4772aSMark Prins		if (!is_numeric($mainLon)) {
101d2f4772aSMark Prins			$mainLon = $this->dflt ['lon'];
102d2f4772aSMark Prins		}
10338a47c60SMark Prins
10438a47c60SMark Prins		$gmap = $this->_extract_params ( $str_params );
10538a47c60SMark Prins		$overlay = $this->_extract_points ( $str_points );
106fc16f3cdSMark Prins		$_firstimageID = '';
10738a47c60SMark Prins
1088e7c4263SMark Prins		$_nocache = false;
109807d36baSMark Prins		// choose maptype based on the specified tag
110628e43ccSMark Prins		$imgUrl = "{{";
111585afb49SMark Prins		if (stripos ( $gmap ['baselyr'], 'google' ) !== false) {
1128e7c4263SMark Prins			// Google
11387d958d4SMark Prins			$imgUrl .= $this->_getGoogle ( $gmap, $overlay );
1148e7c4263SMark Prins			$imgUrl .= "&.png";
115585afb49SMark Prins		} elseif (stripos ( $gmap ['baselyr'], 'bing' ) !== false) {
1168e7c4263SMark Prins			// Bing
117d974ea02SMark Prins			if (! $this->getConf ( 'bingAPIKey' )) {
118d974ea02SMark Prins				// in case there is no Bing api key we'll use OSM
119d974ea02SMark Prins				$_firstimageID = $this->_getStaticOSM ( $gmap, $overlay );
120d974ea02SMark Prins				$imgUrl .= $_firstimageID;
121628e43ccSMark Prins				if ($this->getConf ( 'optionStaticMapGenerator' ) == 'remote') {
122628e43ccSMark Prins					$imgUrl .= "&.png";
123d974ea02SMark Prins				}
124d974ea02SMark Prins			} else {
1258e7c4263SMark Prins				// seems that Bing doesn't like the DW client, turn off caching
1268e7c4263SMark Prins				$_nocache = true;
1278e7c4263SMark Prins				$imgUrl .= $this->_getBing ( $gmap, $overlay ) . "&.png";
128d974ea02SMark Prins			}
129e72390dbSMark Prins		} /* elseif (stripos ( $gmap ['baselyr'], 'mapquest' ) !== false) {
1308e7c4263SMark Prins			// MapQuest
1318e7c4263SMark Prins			if (! $this->getConf ( 'mapquestAPIKey' )) {
1328e7c4263SMark Prins				// no API key for MapQuest, use OSM
133fc16f3cdSMark Prins				$_firstimageID = $this->_getStaticOSM ( $gmap, $overlay );
134fc16f3cdSMark Prins				$imgUrl .= $_firstimageID;
1358e7c4263SMark Prins				if ($this->getConf ( 'optionStaticMapGenerator' ) == 'remote') {
1368e7c4263SMark Prins					$imgUrl .= "&.png";
137628e43ccSMark Prins				}
13863037f21SMark Prins			} else {
1398e7c4263SMark Prins				$imgUrl .= $this->_getMapQuest ( $gmap, $overlay );
1408e7c4263SMark Prins				$imgUrl .= "&.png";
1418e7c4263SMark Prins			}
142e72390dbSMark Prins		} */ else {
1438e7c4263SMark Prins			// default OSM
144fc16f3cdSMark Prins			$_firstimageID = $this->_getStaticOSM ( $gmap, $overlay );
145fc16f3cdSMark Prins			$imgUrl .= $_firstimageID;
14653bfe4a3SMark Prins			if ($this->getConf ( 'optionStaticMapGenerator' ) == 'remote') {
14753bfe4a3SMark Prins				$imgUrl .= "&.png";
14853bfe4a3SMark Prins			}
14987d958d4SMark Prins		}
15087d958d4SMark Prins
151628e43ccSMark Prins		// append dw p_render specific params and render
152628e43ccSMark Prins		$imgUrl .= "?" . str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
1536ba8d085SMark Prins		$imgUrl .= "&nolink";
1548e7c4263SMark Prins
1558e7c4263SMark Prins		// add nocache option for selected services
1568e7c4263SMark Prins		if ($_nocache) {
1578e7c4263SMark Prins			$imgUrl .= "&nocache";
1588e7c4263SMark Prins		}
1598e7c4263SMark Prins
160fcd79b50SMark Prins		$imgUrl .= " |".$gmap ['summary'] . " }}";
161fcd79b50SMark Prins
1628e7c4263SMark Prins		// dbglog($imgUrl,"complete image tags is:");
1638e7c4263SMark Prins
16438a47c60SMark Prins		$mapid = $gmap ['id'];
16538a47c60SMark Prins		// create a javascript parameter string for the map
16638a47c60SMark Prins		$param = '';
16738a47c60SMark Prins		foreach ( $gmap as $key => $val ) {
16838a47c60SMark Prins			$param .= is_numeric ( $val ) ? "$key: $val, " : "$key: '" . hsc ( $val ) . "', ";
16938a47c60SMark Prins		}
17038a47c60SMark Prins		if (! empty ( $param )) {
17145c50327SMark Prins			$param = substr ( $param, 0, - 2 );
17238a47c60SMark Prins		}
17338a47c60SMark Prins		unset ( $gmap ['id'] );
17438a47c60SMark Prins
17538a47c60SMark Prins		// create a javascript serialisation of the point data
17638a47c60SMark Prins		$poi = '';
17745c50327SMark Prins		$poitable = '';
17845c50327SMark Prins		$rowId = 0;
17938a47c60SMark Prins		if (! empty ( $overlay )) {
18038a47c60SMark Prins			foreach ( $overlay as $data ) {
18138a47c60SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
18245c50327SMark Prins				$rowId ++;
18345c50327SMark Prins				$poi .= ", {lat: $lat, lon: $lon, txt: '$text', angle: $angle, opacity: $opacity, img: '$img', rowId: $rowId}";
1848c4eb2fdSMark Prins
1858c4eb2fdSMark Prins				if ($this->getConf ( 'displayformat' ) === 'DMS') {
1868c4eb2fdSMark Prins					$lat = $this->convertLat ( $lat );
1878c4eb2fdSMark Prins					$lon = $this->convertLon ( $lon );
1888c4eb2fdSMark Prins				} else {
1898c4eb2fdSMark Prins					$lat .= 'º';
1908c4eb2fdSMark Prins					$lon .= 'º';
1918c4eb2fdSMark Prins				}
1928c4eb2fdSMark Prins
193a757236dSMark Prins				$poitable .= '
194a757236dSMark Prins					<tr>
195a757236dSMark Prins					<td class="rowId">' . $rowId . '</td>
196615f0b2eSMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/icons/' . $img . '" alt="'. substr($img, 0, -4) . $this->getlang('alt_legend_poi').' " /></td>
197a57aaf07SMark Prins					<td class="lat" title="' . $this->getLang ( 'olmapPOIlatTitle' ) . '">' . $lat . '</td>
198a57aaf07SMark Prins					<td class="lon" title="' . $this->getLang ( 'olmapPOIlonTitle' ) . '">' . $lon . '</td>
199a757236dSMark Prins					<td class="txt">' . $text . '</td>
200a757236dSMark Prins					</tr>';
20138a47c60SMark Prins			}
20245c50327SMark Prins			$poi = substr ( $poi, 2 );
20338a47c60SMark Prins		}
204e61425c7SMark Prins		if (! empty ( $gmap ['kmlfile'] )) {
205e61425c7SMark Prins			$poitable .= '
206e61425c7SMark Prins					<tr>
207d974ea02SMark Prins					<td class="rowId"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/kml_file.png" alt="KML file" /></td>
208615f0b2eSMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/kml_line.png" alt="' . $this->getlang('alt_legend_kml') .'" /></td>
209cc74a83cSMark Prins					<td class="txt" colspan="3">KML track: ' . $this->getFileName ( $gmap ['kmlfile'] ) . '</td>
210e61425c7SMark Prins					</tr>';
211e61425c7SMark Prins		}
212e61425c7SMark Prins		if (! empty ( $gmap ['gpxfile'] )) {
213e61425c7SMark Prins			$poitable .= '
214e61425c7SMark Prins					<tr>
215d974ea02SMark Prins					<td class="rowId"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/gpx_file.png" alt="GPX file" /></td>
216615f0b2eSMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/gpx_line.png" alt="' . $this->getlang('alt_legend_gpx') .'" /></td>
217cc74a83cSMark Prins					<td class="txt" colspan="3">GPX track: ' . $this->getFileName ( $gmap ['gpxfile'] ) . '</td>
218e61425c7SMark Prins					</tr>';
219e61425c7SMark Prins		}
2206914b920SMark Prins		if (! empty ( $gmap ['geojsonfile'] )) {
2216914b920SMark Prins			$poitable .= '
2226914b920SMark Prins					<tr>
223d974ea02SMark Prins					<td class="rowId"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/geojson_file.png" alt="GeoJSON file" /></td>
224615f0b2eSMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/geojson_line.png" alt="' . $this->getlang('alt_legend_geojson') .'" /></td>
2256914b920SMark Prins					<td class="txt" colspan="3">GeoJSON track: ' . $this->getFileName ( $gmap ['geojsonfile'] ) . '</td>
2266914b920SMark Prins					</tr>';
2276914b920SMark Prins		}
228e61425c7SMark Prins
229*c8eb1362SMark Prins		$autozoom = empty ( $gmap ['autozoom'] ) ? $this->getConf ( 'autoZoomMap' ) : $gmap ['autozoom'];
230*c8eb1362SMark Prins		$js .= "{mapOpts: {" . $param . ", displayformat: '" . $this->getConf ( 'displayformat' ) . "', autozoom: " . $autozoom . "}, poi: [$poi]};";
231a757236dSMark Prins		// unescape the json
232a757236dSMark Prins		$poitable = stripslashes ( $poitable );
23338a47c60SMark Prins
2341c640875SMark Prins		return array (
2351c640875SMark Prins				$mapid,
2361c640875SMark Prins				$js,
2371c640875SMark Prins				$mainLat,
2381c640875SMark Prins				$mainLon,
2391c640875SMark Prins				$poitable,
2401c640875SMark Prins				$gmap ['summary'],
2411c640875SMark Prins				$imgUrl,
2421c640875SMark Prins				$_firstimageID
2431c640875SMark Prins		);
24438a47c60SMark Prins	}
24538a47c60SMark Prins
24638a47c60SMark Prins	/**
2471c640875SMark Prins	 *
248cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::render()
24938a47c60SMark Prins	 */
250bc5164eaSMark Prins	function render($mode, Doku_Renderer $renderer, $data) {
251fc16f3cdSMark Prins		// set to true after external scripts tags are written
252fc16f3cdSMark Prins		static $initialised = false;
253807d36baSMark Prins		// incremented for each map tag in the page source so we can keep track of each map in this page
254fc16f3cdSMark Prins		static $mapnumber = 0;
255fc16f3cdSMark Prins
256fc16f3cdSMark Prins		// dbglog($data, 'olmap::render() data.');
257fc16f3cdSMark Prins		list ( $mapid, $param, $mainLat, $mainLon, $poitable, $poitabledesc, $staticImgUrl, $_firstimage ) = $data;
258554f43b5SMark Prins
25938a47c60SMark Prins		if ($mode == 'xhtml') {
26038a47c60SMark Prins			$olscript = '';
26138a47c60SMark Prins			$olEnable = false;
26238a47c60SMark Prins			$gscript = '';
26375c98788SMark Prins			$gEnable = $this->getConf ( 'enableGoogle' );
264e72390dbSMark Prins			$stamenEnable = $this->getConf ( 'enableStamen' );
26575c98788SMark Prins			$osmEnable = $this->getConf ( 'enableOSM' );
2662a5c9dbfSMark Prins			$enableBing = $this->getConf ( 'enableBing' );
26738a47c60SMark Prins
26838a47c60SMark Prins			$scriptEnable = '';
26938a47c60SMark Prins			if (! $initialised) {
27038a47c60SMark Prins				$initialised = true;
27145c50327SMark Prins				// render necessary script tags
27275c98788SMark Prins				if ($gEnable) {
2735c603532SMark Prins					$gscript = '<script type="text/javascript" src="//maps.google.com/maps/api/js?v=3.29&amp;key='.$this->getConf ( 'googleAPIkey' ).'"></script>';
27475c98788SMark Prins				}
275807d36baSMark Prins				$olscript = '<script type="text/javascript" src="' . DOKU_BASE . 'lib/plugins/openlayersmap/lib/OpenLayers.js"></script>';
27638a47c60SMark Prins
277494ac476SMark Prins				$scriptEnable = '<script type="text/javascript">/*<![CDATA[*/';
27838a47c60SMark Prins				$scriptEnable .= $olscript ? 'olEnable = true;' : 'olEnable = false;';
27975c98788SMark Prins				$scriptEnable .= 'gEnable = ' . ($gEnable ? 'true' : 'false') . ';';
28075c98788SMark Prins				$scriptEnable .= 'osmEnable = ' . ($osmEnable ? 'true' : 'false') . ';';
281e72390dbSMark Prins				$scriptEnable .= 'stamenEnable = ' . ($stamenEnable ? 'true' : 'false') . ';';
2822a5c9dbfSMark Prins				$scriptEnable .= 'bEnable = ' . ($enableBing ? 'true' : 'false') . ';';
2832a5c9dbfSMark Prins				$scriptEnable .= 'bApiKey="' . $this->getConf ( 'bingAPIKey' ) . '";';
2845c603532SMark Prins				$scriptEnable .= 'tfApiKey="' . $this->getConf ( 'tfApiKey' ) . '";';
285dd99534aSMark Prins				$scriptEnable .= 'gApiKey="' . $this->getConf ( 'googleAPIkey' ) . '";';
286c0a46f41SMark Prins				$scriptEnable .= '/*!]]>*/</script>';
28738a47c60SMark Prins			}
288d9ed90b9SMark Prins			$renderer->doc .= "$gscript\n$olscript\n$scriptEnable";
289d9ed90b9SMark Prins			$renderer->doc .= '<div class="olMapHelp">' . $this->locale_xhtml ( "help" ) . '</div>';
2906d91d4f8SMark Prins			if ($this->getConf ( 'enableA11y' )) {
291fc16f3cdSMark Prins				$renderer->doc .= '<div id="' . $mapid . '-static" class="olStaticMap">' . p_render ( $mode, p_get_instructions ( $staticImgUrl ), $info ) . '</div>';
2926d91d4f8SMark Prins			}
2936d91d4f8SMark Prins			$renderer->doc .= '<div id="' . $mapid . '-clearer" class="clearer"><p>&nbsp;</p></div>';
2946d91d4f8SMark Prins			if ($this->getConf ( 'enableA11y' )) {
295751cafd6SMark Prins				// render a table of the POI for the print and a11y presentation, it is hidden using javascript
296751cafd6SMark Prins				$renderer->doc .= '<div class="olPOItableSpan" id="' . $mapid . '-table-span">
297751cafd6SMark Prins					<table class="olPOItable" id="' . $mapid . '-table">
298a57aaf07SMark Prins					<caption class="olPOITblCaption">' . $this->getLang ( 'olmapPOItitle' ) . '</caption>
29945c50327SMark Prins					<thead class="olPOITblHeader">
30045c50327SMark Prins					<tr>
30145c50327SMark Prins					<th class="rowId" scope="col">id</th>
302a57aaf07SMark Prins					<th class="icon" scope="col">' . $this->getLang ( 'olmapPOIicon' ) . '</th>
303a57aaf07SMark Prins					<th class="lat" scope="col" title="' . $this->getLang ( 'olmapPOIlatTitle' ) . '">' . $this->getLang ( 'olmapPOIlat' ) . '</th>
304a57aaf07SMark Prins					<th class="lon" scope="col" title="' . $this->getLang ( 'olmapPOIlonTitle' ) . '">' . $this->getLang ( 'olmapPOIlon' ) . '</th>
305a57aaf07SMark Prins					<th class="txt" scope="col">' . $this->getLang ( 'olmapPOItxt' ) . '</th>
30645c50327SMark Prins					</tr>
307628e43ccSMark Prins					</thead>';
308628e43ccSMark Prins				if ($poitabledesc != '') {
309628e43ccSMark Prins					$renderer->doc .= '<tfoot class="olPOITblFooter"><tr><td colspan="5">' . $poitabledesc . '</td></tr></tfoot>';
310628e43ccSMark Prins				}
311628e43ccSMark Prins				$renderer->doc .= '<tbody class="olPOITblBody">' . $poitable . '</tbody>
312a757236dSMark Prins					</table></div>';
3136d91d4f8SMark Prins			}
314fc16f3cdSMark Prins			// render inline mapscript parts
315494ac476SMark Prins			$renderer->doc .= '<script type="text/javascript">/*<![CDATA[*/';
316c0a46f41SMark Prins			$renderer->doc .= " olMapData[$mapnumber] = $param /*!]]>*/</script>";
31744aba0bcSMark Prins			$mapnumber ++;
318bddeae87SMark Prins			return true;
319554f43b5SMark Prins		} elseif ($mode == 'metadata') {
320*c8eb1362SMark Prins			if (! (($this->dflt ['lat'] == $mainLat) && ($this->dflt ['lon'] == $mainLon))) {
321fc16f3cdSMark Prins				// render geo metadata, unless they are the default
322554f43b5SMark Prins				$renderer->meta ['geo'] ['lat'] = $mainLat;
323554f43b5SMark Prins				$renderer->meta ['geo'] ['lon'] = $mainLon;
324fc16f3cdSMark Prins				if ($geophp = &plugin_load ( 'helper', 'geophp' )) {
325fc16f3cdSMark Prins					// if we have the geoPHP helper, add the geohash
326345ce679SMark Prins					// fails with older php versions.. $renderer->meta['geo']['geohash'] = (new Point($mainLon,$mainLat))->out('geohash');
327345ce679SMark Prins					$p = new Point ( $mainLon, $mainLat );
328345ce679SMark Prins					$renderer->meta ['geo'] ['geohash'] = $p->out ( 'geohash' );
329fc16f3cdSMark Prins				}
330fc16f3cdSMark Prins			}
331fc16f3cdSMark Prins
332fc16f3cdSMark Prins			if (($this->getConf ( 'enableA11y' )) && (! empty ( $_firstimage ))) {
333fc16f3cdSMark Prins				// add map local image into relation/firstimage if not already filled and when it is a local image
334fc16f3cdSMark Prins
335fc16f3cdSMark Prins				global $ID;
336fc16f3cdSMark Prins				$rel = p_get_metadata ( $ID, 'relation', METADATA_RENDER_USING_CACHE );
337fc16f3cdSMark Prins				$img = $rel ['firstimage'];
338c0a46f41SMark Prins				if (empty ( $img ) /* || $img == $_firstimage*/){
3398e7c4263SMark Prins					//dbglog ( $_firstimage, 'olmap::render#rendering image relation metadata for _firstimage as $img was empty or the same.' );
340c0a46f41SMark Prins					// This seems to never work; the firstimage entry in the .meta file is empty
341c0a46f41SMark Prins					// $renderer->meta['relation']['firstimage'] = $_firstimage;
342fc16f3cdSMark Prins
343c0a46f41SMark Prins					// ... and neither does this; the firstimage entry in the .meta file is empty
344fc16f3cdSMark Prins					// $relation = array('relation'=>array('firstimage'=>$_firstimage));
345fc16f3cdSMark Prins					// p_set_metadata($ID, $relation, false, false);
346c0a46f41SMark Prins
347c0a46f41SMark Prins					// ... this works
348c0a46f41SMark Prins					$renderer->internalmedia ( $_firstimage, $poitabledesc );
349fc16f3cdSMark Prins				}
350554f43b5SMark Prins			}
351554f43b5SMark Prins			return true;
35238a47c60SMark Prins		}
35338a47c60SMark Prins		return false;
35438a47c60SMark Prins	}
35538a47c60SMark Prins
35638a47c60SMark Prins	/**
35738a47c60SMark Prins	 * extract parameters for the map from the parameter string
35838a47c60SMark Prins	 *
3591c640875SMark Prins	 * @param string $str_params
3601c640875SMark Prins	 *        	string of key="value" pairs
36138a47c60SMark Prins	 * @return array associative array of parameters key=>value
36238a47c60SMark Prins	 */
363fcd79b50SMark Prins	private function _extract_params($str_params) {
36438a47c60SMark Prins		$param = array ();
36538a47c60SMark Prins		preg_match_all ( '/(\w*)="(.*?)"/us', $str_params, $param, PREG_SET_ORDER );
36638a47c60SMark Prins		// parse match for instructions, break into key value pairs
36738a47c60SMark Prins		$gmap = $this->dflt;
368*c8eb1362SMark Prins		foreach ( $gmap as $key => &$value ) {
369*c8eb1362SMark Prins			$defval = $this->getConf ( 'default_' . $key );
370*c8eb1362SMark Prins			if ($defval !== '') {
371*c8eb1362SMark Prins				$value = $defval;
372*c8eb1362SMark Prins			}
373*c8eb1362SMark Prins		}
374*c8eb1362SMark Prins		unset ( $value );
37538a47c60SMark Prins		foreach ( $param as $kvpair ) {
37638a47c60SMark Prins			list ( $match, $key, $val ) = $kvpair;
37738a47c60SMark Prins			$key = strtolower ( $key );
37838a47c60SMark Prins			if (isset ( $gmap [$key] )) {
37945c50327SMark Prins				if ($key == 'summary') {
38045c50327SMark Prins					// preserve case for summary field
38145c50327SMark Prins					$gmap [$key] = $val;
3821c640875SMark Prins				} elseif ($key == 'id') {
3831c640875SMark Prins					// preserve case for id field
3841c640875SMark Prins					$gmap [$key] = $val;
38545c50327SMark Prins				} else {
38638a47c60SMark Prins					$gmap [$key] = strtolower ( $val );
38738a47c60SMark Prins				}
38838a47c60SMark Prins			}
38945c50327SMark Prins		}
39038a47c60SMark Prins		return $gmap;
39138a47c60SMark Prins	}
39238a47c60SMark Prins
39338a47c60SMark Prins	/**
39438a47c60SMark Prins	 * extract overlay points for the map from the wiki syntax data
39538a47c60SMark Prins	 *
3961c640875SMark Prins	 * @param string $str_points
3971c640875SMark Prins	 *        	multi-line string of lat,lon,text triplets
39838a47c60SMark Prins	 * @return array multi-dimensional array of lat,lon,text triplets
39938a47c60SMark Prins	 */
400fcd79b50SMark Prins	private function _extract_points($str_points) {
40138a47c60SMark Prins		$point = array ();
4027a3f422cSMark Prins		// preg_match_all('/^([+-]?[0-9].*?),\s*([+-]?[0-9].*?),(.*?),(.*?),(.*?),(.*)$/um', $str_points, $point, PREG_SET_ORDER);
4037a3f422cSMark Prins		/*
4041c640875SMark Prins		 * group 1: ([+-]?[0-9]+(?:\.[0-9]*)?) group 2: ([+-]?[0-9]+(?:\.[0-9]*)?) group 3: (.*?) group 4: (.*?) group 5: (.*?) group 6: (.*)
4057a3f422cSMark Prins		 */
4067a3f422cSMark Prins		preg_match_all ( '/^([+-]?[0-9]+(?:\.[0-9]*)?),\s*([+-]?[0-9]+(?:\.[0-9]*)?),(.*?),(.*?),(.*?),(.*)$/um', $str_points, $point, PREG_SET_ORDER );
407554f43b5SMark Prins		// create poi array
40838a47c60SMark Prins		$overlay = array ();
40938a47c60SMark Prins		foreach ( $point as $pt ) {
41038a47c60SMark Prins			list ( $match, $lat, $lon, $angle, $opacity, $img, $text ) = $pt;
41138a47c60SMark Prins			$lat = is_numeric ( $lat ) ? $lat : 0;
41238a47c60SMark Prins			$lon = is_numeric ( $lon ) ? $lon : 0;
41338a47c60SMark Prins			$angle = is_numeric ( $angle ) ? $angle : 0;
41438a47c60SMark Prins			$opacity = is_numeric ( $opacity ) ? $opacity : 0.8;
41587d958d4SMark Prins			// TODO validate using exist & set up default img?
4161c640875SMark Prins			$img = trim ( $img );
4171c640875SMark Prins			$text = p_get_instructions ( $text );
4181c640875SMark Prins			// dbg ( $text );
4191c640875SMark Prins			$text = p_render ( "xhtml", $text, $info );
4201c640875SMark Prins			// dbg ( $text );
4211c640875SMark Prins			$text = addslashes ( str_replace ( "\n", "", $text ) );
4221c640875SMark Prins			$overlay [] = array (
4231c640875SMark Prins					$lat,
4241c640875SMark Prins					$lon,
4251c640875SMark Prins					$text,
4261c640875SMark Prins					$angle,
4271c640875SMark Prins					$opacity,
4281c640875SMark Prins					$img
4291c640875SMark Prins			);
43038a47c60SMark Prins		}
43138a47c60SMark Prins		return $overlay;
43238a47c60SMark Prins	}
433fcd79b50SMark Prins
434fcd79b50SMark Prins	/**
435fcd79b50SMark Prins	 * Create a MapQuest static map API image url.
4361c640875SMark Prins	 *
437fcd79b50SMark Prins	 * @param array $gmap
438fcd79b50SMark Prins	 * @param array $overlay
439fcd79b50SMark Prins	 */
440e72390dbSMark Prins	 /*
441fcd79b50SMark Prins	private function _getMapQuest($gmap, $overlay) {
442787a5195SMark Prins		$sUrl = $this->getConf ( 'iconUrlOverload' );
443787a5195SMark Prins		if (! $sUrl) {
444787a5195SMark Prins			$sUrl = DOKU_URL;
445787a5195SMark Prins		}
44687d958d4SMark Prins		switch ($gmap ['baselyr']) {
44794c2e868SMark Prins			case 'mapquest hybrid' :
448837eba2fSMark Prins				$maptype = 'hyb';
44987d958d4SMark Prins				break;
45018edeaa5SMark Prins			case 'mapquest sat' :
45144aba0bcSMark Prins				// because sat coverage is very limited use 'hyb' instead of 'sat' so we don't get a blank map
45244aba0bcSMark Prins				$maptype = 'hyb';
45387d958d4SMark Prins				break;
45494c2e868SMark Prins			case 'mapquest road' :
45587d958d4SMark Prins			default :
45687d958d4SMark Prins				$maptype = 'map';
45787d958d4SMark Prins				break;
45887d958d4SMark Prins		}
459004ad4e2SMark Prins		$imgUrl = "http://open.mapquestapi.com/staticmap/v4/getmap?declutter=true&";
46044aba0bcSMark Prins		if (count ( $overlay ) < 1) {
461787a5195SMark Prins			$imgUrl .= "?center=" . $gmap ['lat'] . "," . $gmap ['lon'];
462787a5195SMark Prins			// max level for mapquest is 16
463fcd79b50SMark Prins			if ($gmap ['zoom'] > 16) {
464fcd79b50SMark Prins				$imgUrl .= "&zoom=16";
465fcd79b50SMark Prins			} else {
466fcd79b50SMark Prins				$imgUrl .= "&zoom=" . $gmap ['zoom'];
467fcd79b50SMark Prins			}
46844aba0bcSMark Prins		}
46944aba0bcSMark Prins		// use bestfit instead of center/zoom, needs upperleft/lowerright corners
47044aba0bcSMark Prins		// $bbox=$this->_calcBBOX($overlay, $gmap['lat'], $gmap['lon']);
47144aba0bcSMark Prins		// $imgUrl .= "bestfit=".$bbox['minlat'].",".$bbox['maxlon'].",".$bbox['maxlat'].",".$bbox['minlon'];
47244aba0bcSMark Prins
47344aba0bcSMark Prins		// TODO declutter option works well for square maps but not for rectangular, maybe compensate for that or compensate the mbr..
47444aba0bcSMark Prins		$imgUrl .= "&size=" . str_replace ( "px", "", $gmap ['width'] ) . "," . str_replace ( "px", "", $gmap ['height'] );
47544aba0bcSMark Prins
476fcd79b50SMark Prins		// TODO mapquest allows using one image url with a multiplier $NUMBER eg:
477fcd79b50SMark Prins		// $NUMBER = 2
478fcd79b50SMark Prins		// $imgUrl .= DOKU_URL."/".DOKU_PLUGIN."/".getPluginName()."/icons/".$img.",$NUMBER,C,".$lat1.",".$lon1.",0,0,0,0,C,".$lat2.",".$lon2.",0,0,0,0";
479fcd79b50SMark Prins		if (! empty ( $overlay )) {
480fcd79b50SMark Prins			$imgUrl .= "&xis=";
481fcd79b50SMark Prins			foreach ( $overlay as $data ) {
482fcd79b50SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
48344aba0bcSMark Prins				// $imgUrl .= $sUrl."lib/plugins/openlayersmap/icons/".$img.",1,C,".$lat.",".$lon.",0,0,0,0,";
48444aba0bcSMark Prins				$imgUrl .= $sUrl . "lib/plugins/openlayersmap/icons/" . $img . ",1,C," . $lat . "," . $lon . ",";
485fcd79b50SMark Prins			}
486fcd79b50SMark Prins			$imgUrl = substr ( $imgUrl, 0, - 1 );
487fcd79b50SMark Prins		}
48887d958d4SMark Prins		$imgUrl .= "&imageType=png&type=" . $maptype;
489d974ea02SMark Prins		$imgUrl .= "&key=".$this->getConf ( 'mapquestAPIKey' );
4908e7c4263SMark Prins		// dbglog($imgUrl,'syntax_plugin_openlayersmap_olmap::_getMapQuest: MapQuest image url is:');
491787a5195SMark Prins		return $imgUrl;
492787a5195SMark Prins	}
493e72390dbSMark Prins	*/
494cc74a83cSMark Prins
4956e633dd6SMark Prins	/**
4966e633dd6SMark Prins	 * Create a Google maps static image url w/ the poi.
4971c640875SMark Prins	 *
4986e633dd6SMark Prins	 * @param array $gmap
4996e633dd6SMark Prins	 * @param array $overlay
5006e633dd6SMark Prins	 */
501787a5195SMark Prins	private function _getGoogle($gmap, $overlay) {
502787a5195SMark Prins		$sUrl = $this->getConf ( 'iconUrlOverload' );
503787a5195SMark Prins		if (! $sUrl) {
504787a5195SMark Prins			$sUrl = DOKU_URL;
505787a5195SMark Prins		}
50687d958d4SMark Prins		switch ($gmap ['baselyr']) {
50787d958d4SMark Prins			case 'google hybrid' :
50887d958d4SMark Prins				$maptype = 'hybrid';
50987d958d4SMark Prins				break;
51087d958d4SMark Prins			case 'google sat' :
51187d958d4SMark Prins				$maptype = 'satellite';
51287d958d4SMark Prins				break;
5138e7c4263SMark Prins			case 'terrain' :
51487d958d4SMark Prins			case 'google relief' :
51587d958d4SMark Prins				$maptype = 'terrain';
51687d958d4SMark Prins				break;
51718edeaa5SMark Prins			case 'google road' :
51887d958d4SMark Prins			default :
51987d958d4SMark Prins				$maptype = 'roadmap';
52087d958d4SMark Prins				break;
52187d958d4SMark Prins		}
52244aba0bcSMark Prins		// TODO maybe use viewport / visible instead of center/zoom,
5238e7c4263SMark Prins		// see: https://developers.google.com/maps/documentation/staticmaps/index#Viewports
524787a5195SMark Prins		// http://maps.google.com/maps/api/staticmap?center=51.565690,5.456756&zoom=16&size=600x400&markers=icon:http://wild-water.nl/dokuwiki/lib/plugins/openlayersmap/icons/marker.png|label:1|51.565690,5.456756&markers=icon:http://wild-water.nl/dokuwiki/lib/plugins/openlayersmap/icons/marker-blue.png|51.566197,5.458966|label:2&markers=icon:http://wild-water.nl/dokuwiki/lib/plugins/openlayersmap/icons/parking.png|51.567177,5.457909|label:3&markers=icon:http://wild-water.nl/dokuwiki/lib/plugins/openlayersmap/icons/parking.png|51.566283,5.457330|label:4&markers=icon:http://wild-water.nl/dokuwiki/lib/plugins/openlayersmap/icons/parking.png|51.565630,5.457695|label:5&sensor=false&format=png&maptype=roadmap
5257aeda37bSMark Prins		$imgUrl = "http://maps.googleapis.com/maps/api/staticmap?";
526787a5195SMark Prins		$imgUrl .= "&size=" . str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
5278e7c4263SMark Prins		//if (!$this->getConf( 'autoZoomMap')) { // no need for center & zoom params }
52844aba0bcSMark Prins		$imgUrl .= "&center=" . $gmap ['lat'] . "," . $gmap ['lon'];
529787a5195SMark Prins		// max is 21 (== building scale), but that's overkill..
530cc74a83cSMark Prins		if ($gmap ['zoom'] > 17) {
531cc74a83cSMark Prins			$imgUrl .= "&zoom=17";
532787a5195SMark Prins		} else {
533787a5195SMark Prins			$imgUrl .= "&zoom=" . $gmap ['zoom'];
534787a5195SMark Prins		}
535787a5195SMark Prins		if (! empty ( $overlay )) {
536787a5195SMark Prins			$rowId = 0;
537787a5195SMark Prins			foreach ( $overlay as $data ) {
538787a5195SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
539787a5195SMark Prins				$imgUrl .= "&markers=icon%3a" . $sUrl . "lib/plugins/openlayersmap/icons/" . $img . "%7c" . $lat . "," . $lon . "%7clabel%3a" . ++ $rowId;
540787a5195SMark Prins			}
541787a5195SMark Prins		}
54244aba0bcSMark Prins		$imgUrl .= "&format=png&maptype=" . $maptype;
543787a5195SMark Prins		global $conf;
544787a5195SMark Prins		$imgUrl .= "&language=" . $conf ['lang'];
5458e7c4263SMark Prins		if ($this->getConf( 'googleAPIkey' )) {
5468e7c4263SMark Prins			$imgUrl .= "&key=" . $this->getConf( 'googleAPIkey' );
5478e7c4263SMark Prins		}
5488e7c4263SMark Prins		// dbglog($imgUrl,'syntax_plugin_openlayersmap_olmap::_getGoogle: Google image url is:');
549787a5195SMark Prins		return $imgUrl;
550787a5195SMark Prins	}
551787a5195SMark Prins
552787a5195SMark Prins	/**
5536e633dd6SMark Prins	 * Create a Bing maps static image url w/ the poi.
5541c640875SMark Prins	 *
555787a5195SMark Prins	 * @param array $gmap
556787a5195SMark Prins	 * @param array $overlay
557787a5195SMark Prins	 */
558787a5195SMark Prins	private function _getBing($gmap, $overlay) {
55987d958d4SMark Prins		switch ($gmap ['baselyr']) {
56087d958d4SMark Prins			case 've hybrid' :
56194c2e868SMark Prins			case 'bing hybrid' :
56287d958d4SMark Prins				$maptype = 'AerialWithLabels';
56387d958d4SMark Prins				break;
56487d958d4SMark Prins			case 've sat' :
56594c2e868SMark Prins			case 'bing sat' :
56687d958d4SMark Prins				$maptype = 'Aerial';
56787d958d4SMark Prins				break;
56887d958d4SMark Prins			case 've normal' :
56994c2e868SMark Prins			case 've road' :
57087d958d4SMark Prins			case 've' :
57118edeaa5SMark Prins			case 'bing road' :
57287d958d4SMark Prins			default :
57387d958d4SMark Prins				$maptype = 'Road';
57487d958d4SMark Prins				break;
57587d958d4SMark Prins		}
5768e7c4263SMark Prins		$imgUrl = "http://dev.virtualearth.net/REST/v1/Imagery/Map/" . $maptype;// . "/";
5778e7c4263SMark Prins		if ($this->getConf ( 'autoZoomMap' )) {
5782d11d700SMark Prins			$bbox = $this->_calcBBOX ( $overlay, $gmap ['lat'], $gmap ['lon'] );
5798e7c4263SMark Prins			//$imgUrl .= "?ma=" . $bbox ['minlat'] . "," . $bbox ['minlon'] . "," . $bbox ['maxlat'] . "," . $bbox ['maxlon'];
5808e7c4263SMark Prins			$imgUrl .= "?ma=" . $bbox ['minlat'] . "%2C" . $bbox ['minlon'] . "%2C" . $bbox ['maxlat'] . "%2C" . $bbox ['maxlon'];
5818e7c4263SMark Prins			$imgUrl .= "&dcl=1";
5822d11d700SMark Prins		}
5831c640875SMark Prins		if (strpos ( $imgUrl, "?" ) === false)
5841c640875SMark Prins			$imgUrl .= "?";
5852d11d700SMark Prins
5868e7c4263SMark Prins		//$imgUrl .= "&ms=" . str_replace ( "px", "", $gmap ['width'] ) . "," . str_replace ( "px", "", $gmap ['height'] );
5878e7c4263SMark Prins		$imgUrl .= "&ms=" . str_replace ( "px", "", $gmap ['width'] ) . "%2C" . str_replace ( "px", "", $gmap ['height'] );
588787a5195SMark Prins		$imgUrl .= "&key=" . $this->getConf ( 'bingAPIKey' );
589787a5195SMark Prins		if (! empty ( $overlay )) {
590787a5195SMark Prins			$rowId = 0;
591787a5195SMark Prins			foreach ( $overlay as $data ) {
592787a5195SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
59387d958d4SMark Prins				// TODO icon style lookup, see: http://msdn.microsoft.com/en-us/library/ff701719.aspx for iconStyle
594787a5195SMark Prins				$iconStyle = 32;
595787a5195SMark Prins				$rowId ++;
596807d36baSMark Prins				// NOTE: the max number of pushpins is 18! or we have to use POST (http://msdn.microsoft.com/en-us/library/ff701724.aspx)
597837eba2fSMark Prins				if ($rowId == 18) {
598837eba2fSMark Prins					break;
599837eba2fSMark Prins				}
6008e7c4263SMark Prins				//$imgUrl .= "&pp=$lat,$lon;$iconStyle;$rowId";
6018e7c4263SMark Prins				$imgUrl .= "&pp=$lat%2C$lon%3B$iconStyle%3B$rowId";
6028e7c4263SMark Prins
603787a5195SMark Prins			}
604787a5195SMark Prins		}
6058e7c4263SMark Prins		global $conf;
6068e7c4263SMark Prins		$imgUrl .= "&fmt=png";
6078e7c4263SMark Prins		$imgUrl .= "&c=" . $conf ['lang'];
6088e7c4263SMark Prins		// dbglog($imgUrl,'syntax_plugin_openlayersmap_olmap::_getBing: bing image url is:');
609fcd79b50SMark Prins		return $imgUrl;
610fcd79b50SMark Prins	}
61187d958d4SMark Prins
61287d958d4SMark Prins	/**
61387d958d4SMark Prins	 * Create a static OSM map image url w/ the poi from http://staticmap.openstreetmap.de (staticMapLite)
614fcf646d2SMark Prins	 * use http://staticmap.openstreetmap.de "staticMapLite" or a local version
6151c640875SMark Prins	 *
61687d958d4SMark Prins	 * @param array $gmap
61787d958d4SMark Prins	 * @param array $overlay
618fcf646d2SMark Prins	 *
619fcf646d2SMark Prins	 * @todo implementation for http://ojw.dev.openstreetmap.org/StaticMapDev/
62087d958d4SMark Prins	 */
62187d958d4SMark Prins	private function _getStaticOSM($gmap, $overlay) {
622fcf646d2SMark Prins		global $conf;
623372f1508SMark Prins
62453bfe4a3SMark Prins		if ($this->getConf ( 'optionStaticMapGenerator' ) == 'local') {
625d974ea02SMark Prins			// using local basemap composer
6268e7c4263SMark Prins			if (! $myMap = &plugin_load ( 'helper', 'openlayersmap_staticmap' )) {
6278e7c4263SMark Prins				dbglog ( $myMap, 'syntax_plugin_openlayersmap_olmap::_getStaticOSM: openlayersmap_staticmap plugin is not available.' );
62853bfe4a3SMark Prins			}
62953bfe4a3SMark Prins			if (! $geophp = &plugin_load ( 'helper', 'geophp' )) {
63053bfe4a3SMark Prins				dbglog ( $geophp, 'syntax_plugin_openlayersmap_olmap::_getStaticOSM: geophp plugin is not available.' );
63153bfe4a3SMark Prins			}
63253bfe4a3SMark Prins			$size = str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
63353bfe4a3SMark Prins
6344c9f9dfcSMark Prins			$markers = array();
63553bfe4a3SMark Prins			if (! empty ( $overlay )) {
63653bfe4a3SMark Prins				foreach ( $overlay as $data ) {
63753bfe4a3SMark Prins					list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
63853bfe4a3SMark Prins					$iconStyle = substr ( $img, 0, strlen ( $img ) - 4 );
63953bfe4a3SMark Prins					$markers [] = array (
64053bfe4a3SMark Prins							'lat' => $lat,
64153bfe4a3SMark Prins							'lon' => $lon,
6421c640875SMark Prins							'type' => $iconStyle
6431c640875SMark Prins					);
64453bfe4a3SMark Prins				}
645372f1508SMark Prins			}
646372f1508SMark Prins
647d2f4772aSMark Prins			$apikey = '';
64818edeaa5SMark Prins			switch ($gmap ['baselyr']) {
64918edeaa5SMark Prins				case 'mapnik' :
650fcf646d2SMark Prins				case 'openstreetmap' :
651fcf646d2SMark Prins					$maptype = 'openstreetmap';
65218edeaa5SMark Prins					break;
653fcf646d2SMark Prins				case 'transport' :
654fcf646d2SMark Prins					$maptype = 'transport';
655d2f4772aSMark Prins					$apikey = $this->getConf ( 'tfApiKey' );
656fcf646d2SMark Prins					break;
657fcf646d2SMark Prins				case 'landscape' :
658fcf646d2SMark Prins					$maptype = 'landscape';
659d2f4772aSMark Prins					$apikey = $this->getConf ( 'tfApiKey' );
660d2f4772aSMark Prins					break;
661d2f4772aSMark Prins				case 'outdoors' :
662d2f4772aSMark Prins					$maptype = 'outdoors';
663d2f4772aSMark Prins					$apikey = $this->getConf ( 'tfApiKey' );
66418edeaa5SMark Prins					break;
66518edeaa5SMark Prins				case 'cycle map' :
66618edeaa5SMark Prins					$maptype = 'cycle';
667d2f4772aSMark Prins					$apikey = $this->getConf ( 'tfApiKey' );
668372f1508SMark Prins					break;
669fcf646d2SMark Prins				case 'hike and bike map' :
670fcf646d2SMark Prins					$maptype = 'hikeandbike';
671fcf646d2SMark Prins					break;
672fcf646d2SMark Prins				case 'mapquest hybrid' :
673fcf646d2SMark Prins				case 'mapquest road' :
674fcf646d2SMark Prins				case 'mapquest sat' :
675fcf646d2SMark Prins					$maptype = 'mapquest';
676fcf646d2SMark Prins					break;
67718edeaa5SMark Prins				default :
67818edeaa5SMark Prins					$maptype = '';
67918edeaa5SMark Prins					break;
68018edeaa5SMark Prins			}
681d974ea02SMark Prins
6828e7c4263SMark Prins			$result = $myMap->getMap ( $gmap ['lat'], $gmap ['lon'], $gmap ['zoom'], $size, $maptype, $markers, $gmap ['gpxfile'], $gmap ['kmlfile'], $gmap ['geojsonfile'] );
683d974ea02SMark Prins		} else {
684d974ea02SMark Prins			// using external basemap composer
685d974ea02SMark Prins
686d974ea02SMark Prins			// http://staticmap.openstreetmap.de/staticmap.php?center=47.000622235634,10.117187497601&zoom=5&size=500x350
687d974ea02SMark Prins			// &markers=48.999812532766,8.3593749976708,lightblue1|43.154850037315,17.499999997306,lightblue1|49.487527053077,10.820312497573,ltblu-pushpin|47.951071133739,15.917968747369,ol-marker|47.921629720114,18.027343747285,ol-marker-gold|47.951071133739,19.257812497236,ol-marker-blue|47.180141361692,19.257812497236,ol-marker-green
688d974ea02SMark Prins			$imgUrl = "http://staticmap.openstreetmap.de/staticmap.php";
689d974ea02SMark Prins			$imgUrl .= "?center=" . $gmap ['lat'] . "," . $gmap ['lon'];
690d974ea02SMark Prins			$imgUrl .= "&size=" . str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
691d974ea02SMark Prins
692d974ea02SMark Prins			if ($gmap ['zoom'] > 16) {
693d974ea02SMark Prins				// actually this could even be 18, but that seems overkill
694d974ea02SMark Prins				$imgUrl .= "&zoom=16";
695d974ea02SMark Prins			} else {
696d974ea02SMark Prins				$imgUrl .= "&zoom=" . $gmap ['zoom'];
697d974ea02SMark Prins			}
69818edeaa5SMark Prins
69987d958d4SMark Prins			if (! empty ( $overlay )) {
70087d958d4SMark Prins				$rowId = 0;
70187d958d4SMark Prins				$imgUrl .= "&markers=";
70287d958d4SMark Prins				foreach ( $overlay as $data ) {
70387d958d4SMark Prins					list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
70487d958d4SMark Prins					$rowId ++;
70553bfe4a3SMark Prins					$iconStyle = "lightblue$rowId";
70687d958d4SMark Prins					$imgUrl .= "$lat,$lon,$iconStyle%7c";
70787d958d4SMark Prins				}
70887d958d4SMark Prins				$imgUrl = substr ( $imgUrl, 0, - 3 );
70987d958d4SMark Prins			}
71087d958d4SMark Prins
711f4b9bdacSMark Prins			$result = $imgUrl;
712628e43ccSMark Prins		}
7138e7c4263SMark Prins		// dbglog ( $result, 'syntax_plugin_openlayersmap_olmap::_getStaticOSM: osm image url is:' );
714628e43ccSMark Prins		return $result;
715628e43ccSMark Prins	}
716628e43ccSMark Prins
71744aba0bcSMark Prins	/**
71844aba0bcSMark Prins	 * Calculate the minimum bbox for a start location + poi.
71944aba0bcSMark Prins	 *
7201c640875SMark Prins	 * @param array $overlay
7211c640875SMark Prins	 *        	multi-dimensional array of array($lat, $lon, $text, $angle, $opacity, $img)
7221c640875SMark Prins	 * @param float $lat
7231c640875SMark Prins	 *        	latitude for map center
7241c640875SMark Prins	 * @param float $lon
7251c640875SMark Prins	 *        	longitude for map center
72644aba0bcSMark Prins	 * @return multitype:float array describing the mbr and center point
72744aba0bcSMark Prins	 */
728837eba2fSMark Prins	private function _calcBBOX($overlay, $lat, $lon) {
7294c9f9dfcSMark Prins		$lats = array($lat);
7304c9f9dfcSMark Prins		$lons = array($lon);
731837eba2fSMark Prins		foreach ( $overlay as $data ) {
732837eba2fSMark Prins			list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
733837eba2fSMark Prins			$lats [] = $lat;
734837eba2fSMark Prins			$lons [] = $lon;
735837eba2fSMark Prins		}
736837eba2fSMark Prins		sort ( $lats );
737837eba2fSMark Prins		sort ( $lons );
73844aba0bcSMark Prins		// TODO: make edge/wrap around cases work
73944aba0bcSMark Prins		$centerlat = $lats [0] + ($lats [count ( $lats ) - 1] - $lats [0]);
74044aba0bcSMark Prins		$centerlon = $lons [0] + ($lons [count ( $lats ) - 1] - $lons [0]);
7411c640875SMark Prins		return array (
7421c640875SMark Prins				'minlat' => $lats [0],
7431c640875SMark Prins				'minlon' => $lons [0],
7441c640875SMark Prins				'maxlat' => $lats [count ( $lats ) - 1],
7451c640875SMark Prins				'maxlon' => $lons [count ( $lats ) - 1],
7461c640875SMark Prins				'centerlat' => $centerlat,
7471c640875SMark Prins				'centerlon' => $centerlon
7481c640875SMark Prins		);
74987d958d4SMark Prins	}
750cc74a83cSMark Prins
751cc74a83cSMark Prins	/**
752cc74a83cSMark Prins	 * Figures out the base filename of a media path.
7531c640875SMark Prins	 *
754cc74a83cSMark Prins	 * @param String $mediaLink
755cc74a83cSMark Prins	 */
756cc74a83cSMark Prins	private function getFileName($mediaLink) {
757cc74a83cSMark Prins		$mediaLink = str_replace ( '[[', '', $mediaLink );
758cc74a83cSMark Prins		$mediaLink = str_replace ( ']]', '', $mediaLink );
759cc74a83cSMark Prins		$mediaLink = substr ( $mediaLink, 0, - 4 );
760cc74a83cSMark Prins		$parts = explode ( ':', $mediaLink );
761cc74a83cSMark Prins		$mediaLink = end ( $parts );
762cc74a83cSMark Prins		return str_replace ( '_', ' ', $mediaLink );
763cc74a83cSMark Prins	}
7648c4eb2fdSMark Prins
7658c4eb2fdSMark Prins	/**
7668c4eb2fdSMark Prins	 * Convert decimal degrees to degrees, minutes, seconds format
7678c4eb2fdSMark Prins	 *
7688c4eb2fdSMark Prins	 * @todo move this into a shared library
7698c4eb2fdSMark Prins	 * @param float $decimaldegrees
7708c4eb2fdSMark Prins	 * @return string dms
7718c4eb2fdSMark Prins	 */
7728c4eb2fdSMark Prins	private function _convertDDtoDMS($decimaldegrees) {
7738c4eb2fdSMark Prins		$dms = floor ( $decimaldegrees );
7748c4eb2fdSMark Prins		$secs = ($decimaldegrees - $dms) * 3600;
7758c4eb2fdSMark Prins		$min = floor ( $secs / 60 );
7768c4eb2fdSMark Prins		$sec = round ( $secs - ($min * 60), 3 );
7778c4eb2fdSMark Prins		$dms .= 'º' . $min . '\'' . $sec . '"';
7788c4eb2fdSMark Prins		return $dms;
7798c4eb2fdSMark Prins	}
7808c4eb2fdSMark Prins
7818c4eb2fdSMark Prins	/**
7828c4eb2fdSMark Prins	 * convert latitude in decimal degrees to DMS+hemisphere.
7838c4eb2fdSMark Prins	 *
7848c4eb2fdSMark Prins	 * @todo move this into a shared library
7858c4eb2fdSMark Prins	 * @param float $decimaldegrees
7868c4eb2fdSMark Prins	 * @return string
7878c4eb2fdSMark Prins	 */
7888c4eb2fdSMark Prins	private function convertLat($decimaldegrees) {
7898c4eb2fdSMark Prins		if (strpos ( $decimaldegrees, '-' ) !== false) {
7908c4eb2fdSMark Prins			$latPos = "S";
7918c4eb2fdSMark Prins		} else {
7928c4eb2fdSMark Prins			$latPos = "N";
7938c4eb2fdSMark Prins		}
7948c4eb2fdSMark Prins		$dms = $this->_convertDDtoDMS ( abs ( floatval ( $decimaldegrees ) ) );
7958c4eb2fdSMark Prins		return hsc ( $dms . $latPos );
7968c4eb2fdSMark Prins	}
7978c4eb2fdSMark Prins
7988c4eb2fdSMark Prins	/**
7998c4eb2fdSMark Prins	 * convert longitude in decimal degrees to DMS+hemisphere.
8008c4eb2fdSMark Prins	 *
8018c4eb2fdSMark Prins	 * @todo move this into a shared library
8028c4eb2fdSMark Prins	 * @param float $decimaldegrees
8038c4eb2fdSMark Prins	 * @return string
8048c4eb2fdSMark Prins	 */
8058c4eb2fdSMark Prins	private function convertLon($decimaldegrees) {
8068c4eb2fdSMark Prins		if (strpos ( $decimaldegrees, '-' ) !== false) {
8078c4eb2fdSMark Prins			$lonPos = "W";
8088c4eb2fdSMark Prins		} else {
8098c4eb2fdSMark Prins			$lonPos = "E";
8108c4eb2fdSMark Prins		}
8118c4eb2fdSMark Prins		$dms = $this->_convertDDtoDMS ( abs ( floatval ( $decimaldegrees ) ) );
8128c4eb2fdSMark Prins		return hsc ( $dms . $lonPos );
8138c4eb2fdSMark Prins	}
81438a47c60SMark Prins}
815