xref: /plugin/openlayersmap/syntax/olmap.php (revision 807d36ba696ee31bb38bbdcb77d6e88343dcf3c3)
138a47c60SMark Prins<?php
238a47c60SMark Prins/*
31c640875SMark Prins * Copyright (c) 2008-2014 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,
4138a47c60SMark Prins			'statusbar' => true,
4238a47c60SMark Prins			'controls' => true,
4338a47c60SMark Prins			'poihoverstyle' => false,
4438a47c60SMark Prins			'baselyr' => 'OpenStreetMap',
4538a47c60SMark Prins			'gpxfile' => '',
4645c50327SMark Prins			'kmlfile' => '',
476914b920SMark Prins			'geojsonfile' => '',
4845c50327SMark Prins			'summary' => ''
4938a47c60SMark Prins	);
5038a47c60SMark Prins
5138a47c60SMark Prins	/**
521c640875SMark Prins	 *
53cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::getType()
5438a47c60SMark Prins	 */
5575c98788SMark Prins	function getType() {
5675c98788SMark Prins		return 'substition';
5775c98788SMark Prins	}
5838a47c60SMark Prins
5938a47c60SMark Prins	/**
601c640875SMark Prins	 *
61cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::getPType()
6238a47c60SMark Prins	 */
6375c98788SMark Prins	function getPType() {
6475c98788SMark Prins		return 'block';
6575c98788SMark Prins	}
6638a47c60SMark Prins
6738a47c60SMark Prins	/**
681c640875SMark Prins	 *
69cc74a83cSMark Prins	 * @see Doku_Parser_Mode::getSort()
7038a47c60SMark Prins	 */
7175c98788SMark Prins	function getSort() {
7275c98788SMark Prins		return 901;
7375c98788SMark Prins	}
74fc16f3cdSMark Prins
7538a47c60SMark Prins	/**
761c640875SMark Prins	 *
77cc74a83cSMark Prins	 * @see Doku_Parser_Mode::connectTo()
7838a47c60SMark Prins	 */
7938a47c60SMark Prins	function connectTo($mode) {
8038a47c60SMark Prins		$this->Lexer->addSpecialPattern ( '<olmap ?[^>\n]*>.*?</olmap>', $mode, 'plugin_openlayersmap_olmap' );
8138a47c60SMark Prins	}
82fc16f3cdSMark Prins
8338a47c60SMark Prins	/**
841c640875SMark Prins	 *
85cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::handle()
8638a47c60SMark Prins	 */
8738a47c60SMark Prins	function handle($match, $state, $pos, &$handler) {
8838a47c60SMark Prins		// break matched cdata into its components
8938a47c60SMark Prins		list ( $str_params, $str_points ) = explode ( '>', substr ( $match, 7, - 9 ), 2 );
90554f43b5SMark Prins		// get the lat/lon for adding them to the metadata (used by geotag)
9131dcc5c2SMark Prins		preg_match ( '(lat[:|=]\"-?\d*\.\d*\")', $match, $mainLat );
9231dcc5c2SMark Prins		preg_match ( '(lon[:|=]\"-?\d*\.\d*\")', $match, $mainLon );
93554f43b5SMark Prins		$mainLat = substr ( $mainLat [0], 5, - 1 );
94554f43b5SMark Prins		$mainLon = substr ( $mainLon [0], 5, - 1 );
9538a47c60SMark Prins
9638a47c60SMark Prins		$gmap = $this->_extract_params ( $str_params );
9738a47c60SMark Prins		$overlay = $this->_extract_points ( $str_points );
98fc16f3cdSMark Prins		$_firstimageID = '';
9938a47c60SMark Prins
100*807d36baSMark Prins		// choose maptype based on the specified tag
101628e43ccSMark Prins		$imgUrl = "{{";
102585afb49SMark Prins		if (stripos ( $gmap ['baselyr'], 'google' ) !== false) {
103787a5195SMark Prins			// use google
10487d958d4SMark Prins			$imgUrl .= $this->_getGoogle ( $gmap, $overlay );
105628e43ccSMark Prins			$imgUrl .= "&.png";
106585afb49SMark Prins		} elseif (stripos ( $gmap ['baselyr'], 've' ) !== false) {
107*807d36baSMark Prins			// use bing, note that VE is deprecated
10887d958d4SMark Prins			$imgUrl .= $this->_getBing ( $gmap, $overlay );
109628e43ccSMark Prins			$imgUrl .= "&.png";
110585afb49SMark Prins		} elseif (stripos ( $gmap ['baselyr'], 'bing' ) !== false) {
1116e633dd6SMark Prins			// use bing
1126e633dd6SMark Prins			$imgUrl .= $this->_getBing ( $gmap, $overlay );
113628e43ccSMark Prins			$imgUrl .= "&.png";
114628e43ccSMark Prins		} elseif (stripos ( $gmap ['baselyr'], 'mapquest' ) !== false) {
115628e43ccSMark Prins			if ($this->getConf ( 'optionStaticMapGenerator' ) == 'remote') {
116628e43ccSMark Prins				// use mapquest remote
117628e43ccSMark Prins				$imgUrl .= $this->_getMapQuest ( $gmap, $overlay );
118628e43ccSMark Prins				$imgUrl .= "&.png";
119628e43ccSMark Prins			} else {
120fc16f3cdSMark Prins				$_firstimageID = $this->_getStaticOSM ( $gmap, $overlay );
121fc16f3cdSMark Prins				$imgUrl .= $_firstimageID;
122628e43ccSMark Prins			}
12363037f21SMark Prins		} else {
124*807d36baSMark Prins			// fall back to OpenStreetMap
125fc16f3cdSMark Prins			$_firstimageID = $this->_getStaticOSM ( $gmap, $overlay );
126fc16f3cdSMark Prins			$imgUrl .= $_firstimageID;
12753bfe4a3SMark Prins			if ($this->getConf ( 'optionStaticMapGenerator' ) == 'remote') {
12853bfe4a3SMark Prins				$imgUrl .= "&.png";
12953bfe4a3SMark Prins			}
13087d958d4SMark Prins		}
13187d958d4SMark Prins
132628e43ccSMark Prins		// append dw p_render specific params and render
133628e43ccSMark Prins		$imgUrl .= "?" . str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
1346ba8d085SMark Prins		$imgUrl .= "&nolink";
135fcd79b50SMark Prins		$imgUrl .= " |" . $gmap ['summary'] . " }}";
136fcd79b50SMark Prins
13738a47c60SMark Prins		$mapid = $gmap ['id'];
13838a47c60SMark Prins		// create a javascript parameter string for the map
13938a47c60SMark Prins		$param = '';
14038a47c60SMark Prins		foreach ( $gmap as $key => $val ) {
14138a47c60SMark Prins			$param .= is_numeric ( $val ) ? "$key: $val, " : "$key: '" . hsc ( $val ) . "', ";
14238a47c60SMark Prins		}
14338a47c60SMark Prins		if (! empty ( $param )) {
14445c50327SMark Prins			$param = substr ( $param, 0, - 2 );
14538a47c60SMark Prins		}
14638a47c60SMark Prins		unset ( $gmap ['id'] );
14738a47c60SMark Prins
14838a47c60SMark Prins		// create a javascript serialisation of the point data
14938a47c60SMark Prins		$poi = '';
15045c50327SMark Prins		$poitable = '';
15145c50327SMark Prins		$rowId = 0;
15238a47c60SMark Prins		if (! empty ( $overlay )) {
15338a47c60SMark Prins			foreach ( $overlay as $data ) {
15438a47c60SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
15545c50327SMark Prins				$rowId ++;
15645c50327SMark Prins				$poi .= ", {lat: $lat, lon: $lon, txt: '$text', angle: $angle, opacity: $opacity, img: '$img', rowId: $rowId}";
157a757236dSMark Prins				$poitable .= '
158a757236dSMark Prins						<tr>
159a757236dSMark Prins						<td class="rowId">' . $rowId . '</td>
160372f1508SMark Prins						<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/icons/' . $img . '" alt="icon" /></td>
161a57aaf07SMark Prins						<td class="lat" title="' . $this->getLang ( 'olmapPOIlatTitle' ) . '">' . $lat . '</td>
162a57aaf07SMark Prins						<td class="lon" title="' . $this->getLang ( 'olmapPOIlonTitle' ) . '">' . $lon . '</td>
163a757236dSMark Prins						<td class="txt">' . $text . '</td>
164a757236dSMark Prins						</tr>';
16538a47c60SMark Prins			}
16645c50327SMark Prins			$poi = substr ( $poi, 2 );
16738a47c60SMark Prins		}
168e61425c7SMark Prins		if (! empty ( $gmap ['kmlfile'] )) {
169e61425c7SMark Prins			$poitable .= '
170e61425c7SMark Prins					<tr>
171e61425c7SMark Prins					<td class="rowId"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/kml_file.png" alt="KML icon" /></td>
172e61425c7SMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/kml_line.png" alt="icon" /></td>
173cc74a83cSMark Prins					<td class="txt" colspan="3">KML track: ' . $this->getFileName ( $gmap ['kmlfile'] ) . '</td>
174e61425c7SMark Prins					</tr>';
175e61425c7SMark Prins		}
176e61425c7SMark Prins		if (! empty ( $gmap ['gpxfile'] )) {
177e61425c7SMark Prins			$poitable .= '
178e61425c7SMark Prins					<tr>
179e61425c7SMark Prins					<td class="rowId"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/gpx_file.png" alt="GPX icon" /></td>
180e61425c7SMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/gpx_line.png" alt="icon" /></td>
181cc74a83cSMark Prins					<td class="txt" colspan="3">GPX track: ' . $this->getFileName ( $gmap ['gpxfile'] ) . '</td>
182e61425c7SMark Prins					</tr>';
183e61425c7SMark Prins		}
1846914b920SMark Prins		if (! empty ( $gmap ['geojsonfile'] )) {
1856914b920SMark Prins			$poitable .= '
1866914b920SMark Prins					<tr>
1876914b920SMark Prins					<td class="rowId"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/geojson_file.png" alt="KML icon" /></td>
1886914b920SMark Prins					<td class="icon"><img src="' . DOKU_BASE . 'lib/plugins/openlayersmap/toolbar/geojson_line.png" alt="icon" /></td>
1896914b920SMark Prins					<td class="txt" colspan="3">GeoJSON track: ' . $this->getFileName ( $gmap ['geojsonfile'] ) . '</td>
1906914b920SMark Prins					</tr>';
1916914b920SMark Prins		}
192e61425c7SMark Prins
19338f1fa03SMark Prins		$js .= "{mapOpts:{" . $param . " },poi:[$poi]};";
194a757236dSMark Prins		// unescape the json
195a757236dSMark Prins		$poitable = stripslashes ( $poitable );
19638a47c60SMark Prins
1971c640875SMark Prins		return array (
1981c640875SMark Prins				$mapid,
1991c640875SMark Prins				$js,
2001c640875SMark Prins				$mainLat,
2011c640875SMark Prins				$mainLon,
2021c640875SMark Prins				$poitable,
2031c640875SMark Prins				$gmap ['summary'],
2041c640875SMark Prins				$imgUrl,
2051c640875SMark Prins				$_firstimageID
2061c640875SMark Prins		);
20738a47c60SMark Prins	}
20838a47c60SMark Prins
20938a47c60SMark Prins	/**
2101c640875SMark Prins	 *
211cc74a83cSMark Prins	 * @see DokuWiki_Syntax_Plugin::render()
21238a47c60SMark Prins	 */
21338a47c60SMark Prins	function render($mode, &$renderer, $data) {
214fc16f3cdSMark Prins		// set to true after external scripts tags are written
215fc16f3cdSMark Prins		static $initialised = false;
216*807d36baSMark Prins		// incremented for each map tag in the page source so we can keep track of each map in this page
217fc16f3cdSMark Prins		static $mapnumber = 0;
218fc16f3cdSMark Prins
219fc16f3cdSMark Prins		// dbglog($data, 'olmap::render() data.');
220fc16f3cdSMark Prins		list ( $mapid, $param, $mainLat, $mainLon, $poitable, $poitabledesc, $staticImgUrl, $_firstimage ) = $data;
221554f43b5SMark Prins
22238a47c60SMark Prins		if ($mode == 'xhtml') {
22338a47c60SMark Prins			$olscript = '';
22438a47c60SMark Prins			$olEnable = false;
22538a47c60SMark Prins			$gscript = '';
22675c98788SMark Prins			$gEnable = $this->getConf ( 'enableGoogle' );
22775c98788SMark Prins			$mqEnable = $this->getConf ( 'enableMapQuest' );
22875c98788SMark Prins			$osmEnable = $this->getConf ( 'enableOSM' );
2292a5c9dbfSMark Prins			$enableBing = $this->getConf ( 'enableBing' );
23038a47c60SMark Prins
23138a47c60SMark Prins			$scriptEnable = '';
23238a47c60SMark Prins			if (! $initialised) {
23338a47c60SMark Prins				$initialised = true;
23445c50327SMark Prins				// render necessary script tags
23575c98788SMark Prins				if ($gEnable) {
236fc16f3cdSMark Prins					$gscript = '<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.11&amp;sensor=false"></script>';
23775c98788SMark Prins				}
238*807d36baSMark Prins				//$olscript = $this->getConf ( 'olScriptUrl' );
239*807d36baSMark Prins				$olscript = '<script type="text/javascript" src="' . DOKU_BASE . 'lib/plugins/openlayersmap/lib/OpenLayers.js"></script>';
240*807d36baSMark Prins				//$olscript = str_replace ( 'DOKU_BASE/', DOKU_BASE, $olscript );
24138a47c60SMark Prins
242c0a46f41SMark Prins				$scriptEnable = '<script type="text/javascript" charset="utf-8">/*<![CDATA[*/';
24338a47c60SMark Prins				$scriptEnable .= $olscript ? 'olEnable = true;' : 'olEnable = false;';
24475c98788SMark Prins				$scriptEnable .= 'gEnable = ' . ($gEnable ? 'true' : 'false') . ';';
24575c98788SMark Prins				$scriptEnable .= 'osmEnable = ' . ($osmEnable ? 'true' : 'false') . ';';
24675c98788SMark Prins				$scriptEnable .= 'mqEnable = ' . ($mqEnable ? 'true' : 'false') . ';';
2472a5c9dbfSMark Prins				$scriptEnable .= 'bEnable = ' . ($enableBing ? 'true' : 'false') . ';';
2482a5c9dbfSMark Prins				$scriptEnable .= 'bApiKey="' . $this->getConf ( 'bingAPIKey' ) . '";';
249*807d36baSMark Prins				// $scriptEnable .= 'OpenLayers.ImgPath = "' . DOKU_BASE . 'lib/plugins/openlayersmap/lib/img' . $this->getConf ( 'olMapStyle' ) . '/";';
250c0a46f41SMark Prins				$scriptEnable .= '/*!]]>*/</script>';
25138a47c60SMark Prins			}
25275c98788SMark Prins			$renderer->doc .= "
25338a47c60SMark Prins			$gscript
25475c98788SMark Prins			$olscript
255a757236dSMark Prins			$scriptEnable";
256fc16f3cdSMark Prins
2576d91d4f8SMark Prins			if ($this->getConf ( 'enableA11y' )) {
258fc16f3cdSMark Prins				$renderer->doc .= '<div id="' . $mapid . '-static" class="olStaticMap">' . p_render ( $mode, p_get_instructions ( $staticImgUrl ), $info ) . '</div>';
2596d91d4f8SMark Prins			}
2606d91d4f8SMark Prins			$renderer->doc .= '<div id="' . $mapid . '-clearer" class="clearer"><p>&nbsp;</p></div>';
2616d91d4f8SMark Prins			if ($this->getConf ( 'enableA11y' )) {
262e61425c7SMark Prins				// render a (initially hidden) table of the POI for the print and a11y presentation
263a757236dSMark Prins				$renderer->doc .= '<div class="olPOItableSpan" id="' . $mapid . '-table-span"><table class="olPOItable" id="' . $mapid . '-table" summary="' . $poitabledesc . '" title="' . $this->getLang ( 'olmapPOItitle' ) . '">
264a57aaf07SMark Prins<caption class="olPOITblCaption">' . $this->getLang ( 'olmapPOItitle' ) . '</caption>
26545c50327SMark Prins<thead class="olPOITblHeader">
26645c50327SMark Prins<tr>
26745c50327SMark Prins<th class="rowId" scope="col">id</th>
268a57aaf07SMark Prins<th class="icon" scope="col">' . $this->getLang ( 'olmapPOIicon' ) . '</th>
269a57aaf07SMark Prins<th class="lat" scope="col" title="' . $this->getLang ( 'olmapPOIlatTitle' ) . '">' . $this->getLang ( 'olmapPOIlat' ) . '</th>
270a57aaf07SMark Prins<th class="lon" scope="col" title="' . $this->getLang ( 'olmapPOIlonTitle' ) . '">' . $this->getLang ( 'olmapPOIlon' ) . '</th>
271a57aaf07SMark Prins<th class="txt" scope="col">' . $this->getLang ( 'olmapPOItxt' ) . '</th>
27245c50327SMark Prins</tr>
273628e43ccSMark Prins</thead>';
274628e43ccSMark Prins				if ($poitabledesc != '') {
275628e43ccSMark Prins					$renderer->doc .= '<tfoot class="olPOITblFooter"><tr><td colspan="5">' . $poitabledesc . '</td></tr></tfoot>';
276628e43ccSMark Prins				}
277628e43ccSMark Prins				$renderer->doc .= '<tbody class="olPOITblBody">' . $poitable . '</tbody>
278a757236dSMark Prins						</table></div>';
2796d91d4f8SMark Prins			}
280fc16f3cdSMark Prins			// render inline mapscript parts
281c0a46f41SMark Prins			$renderer->doc .= '<script type="text/javascript" charset="utf-8">/*<![CDATA[*/';
282c0a46f41SMark Prins			$renderer->doc .= " olMapData[$mapnumber] = $param /*!]]>*/</script>";
28344aba0bcSMark Prins			$mapnumber ++;
284bddeae87SMark Prins			return true;
285554f43b5SMark Prins		} elseif ($mode == 'metadata') {
286fc16f3cdSMark Prins			if (! (($this->dflt ['lat'] == $mainLat) && ($thisdflt ['lon'] == $mainLon))) {
287fc16f3cdSMark Prins				// render geo metadata, unless they are the default
288554f43b5SMark Prins				$renderer->meta ['geo'] ['lat'] = $mainLat;
289554f43b5SMark Prins				$renderer->meta ['geo'] ['lon'] = $mainLon;
290fc16f3cdSMark Prins				if ($geophp = &plugin_load ( 'helper', 'geophp' )) {
291fc16f3cdSMark Prins					// if we have the geoPHP helper, add the geohash
292345ce679SMark Prins					// fails with older php versions.. $renderer->meta['geo']['geohash'] = (new Point($mainLon,$mainLat))->out('geohash');
293345ce679SMark Prins					$p = new Point ( $mainLon, $mainLat );
294345ce679SMark Prins					$renderer->meta ['geo'] ['geohash'] = $p->out ( 'geohash' );
295fc16f3cdSMark Prins				}
296fc16f3cdSMark Prins			}
297fc16f3cdSMark Prins
298fc16f3cdSMark Prins			if (($this->getConf ( 'enableA11y' )) && (! empty ( $_firstimage ))) {
299fc16f3cdSMark Prins				// add map local image into relation/firstimage if not already filled and when it is a local image
300fc16f3cdSMark Prins
301fc16f3cdSMark Prins				global $ID;
302fc16f3cdSMark Prins				$rel = p_get_metadata ( $ID, 'relation', METADATA_RENDER_USING_CACHE );
303fc16f3cdSMark Prins				$img = $rel ['firstimage'];
304c0a46f41SMark Prins				if (empty ( $img ) /* || $img == $_firstimage*/){
305c0a46f41SMark Prins					dbglog ( $_firstimage, 'olmap::render#rendering image relation metadata for _firstimage as $img was empty or the same.' );
306c0a46f41SMark Prins					// This seems to never work; the firstimage entry in the .meta file is empty
307c0a46f41SMark Prins					// $renderer->meta['relation']['firstimage'] = $_firstimage;
308fc16f3cdSMark Prins
309c0a46f41SMark Prins					// ... and neither does this; the firstimage entry in the .meta file is empty
310fc16f3cdSMark Prins					// $relation = array('relation'=>array('firstimage'=>$_firstimage));
311fc16f3cdSMark Prins					// p_set_metadata($ID, $relation, false, false);
312c0a46f41SMark Prins
313c0a46f41SMark Prins					// ... this works
314c0a46f41SMark Prins					$renderer->internalmedia ( $_firstimage, $poitabledesc );
315fc16f3cdSMark Prins				}
316554f43b5SMark Prins			}
317554f43b5SMark Prins			return true;
31838a47c60SMark Prins		}
31938a47c60SMark Prins		return false;
32038a47c60SMark Prins	}
32138a47c60SMark Prins
32238a47c60SMark Prins	/**
32338a47c60SMark Prins	 * extract parameters for the map from the parameter string
32438a47c60SMark Prins	 *
3251c640875SMark Prins	 * @param string $str_params
3261c640875SMark Prins	 *        	string of key="value" pairs
32738a47c60SMark Prins	 * @return array associative array of parameters key=>value
32838a47c60SMark Prins	 */
329fcd79b50SMark Prins	private function _extract_params($str_params) {
33038a47c60SMark Prins		$param = array ();
33138a47c60SMark Prins		preg_match_all ( '/(\w*)="(.*?)"/us', $str_params, $param, PREG_SET_ORDER );
33238a47c60SMark Prins		// parse match for instructions, break into key value pairs
33338a47c60SMark Prins		$gmap = $this->dflt;
33438a47c60SMark Prins		foreach ( $param as $kvpair ) {
33538a47c60SMark Prins			list ( $match, $key, $val ) = $kvpair;
33638a47c60SMark Prins			$key = strtolower ( $key );
33738a47c60SMark Prins			if (isset ( $gmap [$key] )) {
33845c50327SMark Prins				if ($key == 'summary') {
33945c50327SMark Prins					// preserve case for summary field
34045c50327SMark Prins					$gmap [$key] = $val;
3411c640875SMark Prins				} elseif ($key == 'id') {
3421c640875SMark Prins					// preserve case for id field
3431c640875SMark Prins					$gmap [$key] = $val;
34445c50327SMark Prins				} else {
34538a47c60SMark Prins					$gmap [$key] = strtolower ( $val );
34638a47c60SMark Prins				}
34738a47c60SMark Prins			}
34845c50327SMark Prins		}
34938a47c60SMark Prins		return $gmap;
35038a47c60SMark Prins	}
35138a47c60SMark Prins
35238a47c60SMark Prins	/**
35338a47c60SMark Prins	 * extract overlay points for the map from the wiki syntax data
35438a47c60SMark Prins	 *
3551c640875SMark Prins	 * @param string $str_points
3561c640875SMark Prins	 *        	multi-line string of lat,lon,text triplets
35738a47c60SMark Prins	 * @return array multi-dimensional array of lat,lon,text triplets
35838a47c60SMark Prins	 */
359fcd79b50SMark Prins	private function _extract_points($str_points) {
36038a47c60SMark Prins		$point = array ();
3617a3f422cSMark Prins		// preg_match_all('/^([+-]?[0-9].*?),\s*([+-]?[0-9].*?),(.*?),(.*?),(.*?),(.*)$/um', $str_points, $point, PREG_SET_ORDER);
3627a3f422cSMark Prins		/*
3631c640875SMark Prins		 * group 1: ([+-]?[0-9]+(?:\.[0-9]*)?) group 2: ([+-]?[0-9]+(?:\.[0-9]*)?) group 3: (.*?) group 4: (.*?) group 5: (.*?) group 6: (.*)
3647a3f422cSMark Prins		 */
3657a3f422cSMark Prins		preg_match_all ( '/^([+-]?[0-9]+(?:\.[0-9]*)?),\s*([+-]?[0-9]+(?:\.[0-9]*)?),(.*?),(.*?),(.*?),(.*)$/um', $str_points, $point, PREG_SET_ORDER );
366554f43b5SMark Prins		// create poi array
36738a47c60SMark Prins		$overlay = array ();
36838a47c60SMark Prins		foreach ( $point as $pt ) {
36938a47c60SMark Prins			list ( $match, $lat, $lon, $angle, $opacity, $img, $text ) = $pt;
37038a47c60SMark Prins			$lat = is_numeric ( $lat ) ? $lat : 0;
37138a47c60SMark Prins			$lon = is_numeric ( $lon ) ? $lon : 0;
37238a47c60SMark Prins			$angle = is_numeric ( $angle ) ? $angle : 0;
37338a47c60SMark Prins			$opacity = is_numeric ( $opacity ) ? $opacity : 0.8;
37487d958d4SMark Prins			// TODO validate using exist & set up default img?
3751c640875SMark Prins			$img = trim ( $img );
3761c640875SMark Prins			$text = p_get_instructions ( $text );
3771c640875SMark Prins			// dbg ( $text );
3781c640875SMark Prins			$text = p_render ( "xhtml", $text, $info );
3791c640875SMark Prins			// dbg ( $text );
3801c640875SMark Prins			$text = addslashes ( str_replace ( "\n", "", $text ) );
3811c640875SMark Prins			$overlay [] = array (
3821c640875SMark Prins					$lat,
3831c640875SMark Prins					$lon,
3841c640875SMark Prins					$text,
3851c640875SMark Prins					$angle,
3861c640875SMark Prins					$opacity,
3871c640875SMark Prins					$img
3881c640875SMark Prins			);
38938a47c60SMark Prins		}
39038a47c60SMark Prins		return $overlay;
39138a47c60SMark Prins	}
392fcd79b50SMark Prins
393fcd79b50SMark Prins	/**
394fcd79b50SMark Prins	 * Create a MapQuest static map API image url.
3951c640875SMark Prins	 *
396fcd79b50SMark Prins	 * @param array $gmap
397fcd79b50SMark Prins	 * @param array $overlay
398fcd79b50SMark Prins	 */
399fcd79b50SMark Prins	private function _getMapQuest($gmap, $overlay) {
400787a5195SMark Prins		$sUrl = $this->getConf ( 'iconUrlOverload' );
401787a5195SMark Prins		if (! $sUrl) {
402787a5195SMark Prins			$sUrl = DOKU_URL;
403787a5195SMark Prins		}
40487d958d4SMark Prins		switch ($gmap ['baselyr']) {
40594c2e868SMark Prins			case 'mapquest hybrid' :
406837eba2fSMark Prins				$maptype = 'hyb';
40787d958d4SMark Prins				break;
40818edeaa5SMark Prins			case 'mapquest sat' :
40944aba0bcSMark Prins				// because sat coverage is very limited use 'hyb' instead of 'sat' so we don't get a blank map
41044aba0bcSMark Prins				$maptype = 'hyb';
41187d958d4SMark Prins				break;
41294c2e868SMark Prins			case 'mapquest road' :
41387d958d4SMark Prins			default :
41487d958d4SMark Prins				$maptype = 'map';
41587d958d4SMark Prins				break;
41687d958d4SMark Prins		}
417004ad4e2SMark Prins		$imgUrl = "http://open.mapquestapi.com/staticmap/v4/getmap?declutter=true&";
41844aba0bcSMark Prins		if (count ( $overlay ) < 1) {
419787a5195SMark Prins			$imgUrl .= "?center=" . $gmap ['lat'] . "," . $gmap ['lon'];
420787a5195SMark Prins			// max level for mapquest is 16
421fcd79b50SMark Prins			if ($gmap ['zoom'] > 16) {
422fcd79b50SMark Prins				$imgUrl .= "&zoom=16";
423fcd79b50SMark Prins			} else {
424fcd79b50SMark Prins				$imgUrl .= "&zoom=" . $gmap ['zoom'];
425fcd79b50SMark Prins			}
42644aba0bcSMark Prins		}
42744aba0bcSMark Prins		// use bestfit instead of center/zoom, needs upperleft/lowerright corners
42844aba0bcSMark Prins		// $bbox=$this->_calcBBOX($overlay, $gmap['lat'], $gmap['lon']);
42944aba0bcSMark Prins		// $imgUrl .= "bestfit=".$bbox['minlat'].",".$bbox['maxlon'].",".$bbox['maxlat'].",".$bbox['minlon'];
43044aba0bcSMark Prins
43144aba0bcSMark Prins		// TODO declutter option works well for square maps but not for rectangular, maybe compensate for that or compensate the mbr..
43244aba0bcSMark Prins		$imgUrl .= "&size=" . str_replace ( "px", "", $gmap ['width'] ) . "," . str_replace ( "px", "", $gmap ['height'] );
43344aba0bcSMark Prins
434fcd79b50SMark Prins		// TODO mapquest allows using one image url with a multiplier $NUMBER eg:
435fcd79b50SMark Prins		// $NUMBER = 2
436fcd79b50SMark Prins		// $imgUrl .= DOKU_URL."/".DOKU_PLUGIN."/".getPluginName()."/icons/".$img.",$NUMBER,C,".$lat1.",".$lon1.",0,0,0,0,C,".$lat2.",".$lon2.",0,0,0,0";
437fcd79b50SMark Prins		if (! empty ( $overlay )) {
438fcd79b50SMark Prins			$imgUrl .= "&xis=";
439fcd79b50SMark Prins			foreach ( $overlay as $data ) {
440fcd79b50SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
44144aba0bcSMark Prins				// $imgUrl .= $sUrl."lib/plugins/openlayersmap/icons/".$img.",1,C,".$lat.",".$lon.",0,0,0,0,";
44244aba0bcSMark Prins				$imgUrl .= $sUrl . "lib/plugins/openlayersmap/icons/" . $img . ",1,C," . $lat . "," . $lon . ",";
443fcd79b50SMark Prins			}
444fcd79b50SMark Prins			$imgUrl = substr ( $imgUrl, 0, - 1 );
445fcd79b50SMark Prins		}
44687d958d4SMark Prins		$imgUrl .= "&imageType=png&type=" . $maptype;
447fc16f3cdSMark Prins		// dbglog($imgUrl,'syntax_plugin_openlayersmap_olmap::_getMapQuest: MapQuest image url is:');
448787a5195SMark Prins		return $imgUrl;
449787a5195SMark Prins	}
450cc74a83cSMark Prins
4516e633dd6SMark Prins	/**
4526e633dd6SMark Prins	 * Create a Google maps static image url w/ the poi.
4531c640875SMark Prins	 *
4546e633dd6SMark Prins	 * @param array $gmap
4556e633dd6SMark Prins	 * @param array $overlay
4566e633dd6SMark Prins	 */
457787a5195SMark Prins	private function _getGoogle($gmap, $overlay) {
458787a5195SMark Prins		$sUrl = $this->getConf ( 'iconUrlOverload' );
459787a5195SMark Prins		if (! $sUrl) {
460787a5195SMark Prins			$sUrl = DOKU_URL;
461787a5195SMark Prins		}
46287d958d4SMark Prins		switch ($gmap ['baselyr']) {
46387d958d4SMark Prins			case 'google hybrid' :
46487d958d4SMark Prins				$maptype = 'hybrid';
46587d958d4SMark Prins				break;
46687d958d4SMark Prins			case 'google sat' :
46787d958d4SMark Prins				$maptype = 'satellite';
46887d958d4SMark Prins				break;
46987d958d4SMark Prins			case 'google relief' :
47087d958d4SMark Prins				$maptype = 'terrain';
47187d958d4SMark Prins				break;
47218edeaa5SMark Prins			case 'google road' :
47387d958d4SMark Prins			default :
47487d958d4SMark Prins				$maptype = 'roadmap';
47587d958d4SMark Prins				break;
47687d958d4SMark Prins		}
47744aba0bcSMark Prins		// TODO maybe use viewport / visible instead of center/zoom,
478837eba2fSMark Prins		// see: https://code.google.com/intl/nl/apis/maps/documentation/staticmaps/#ImplicitPositioning
479787a5195SMark 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
48044aba0bcSMark Prins		$imgUrl = "http://maps.google.com/maps/api/staticmap?sensor=false";
481787a5195SMark Prins		$imgUrl .= "&size=" . str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
48244aba0bcSMark Prins		$imgUrl .= "&center=" . $gmap ['lat'] . "," . $gmap ['lon'];
483787a5195SMark Prins		// max is 21 (== building scale), but that's overkill..
484cc74a83cSMark Prins		if ($gmap ['zoom'] > 17) {
485cc74a83cSMark Prins			$imgUrl .= "&zoom=17";
486787a5195SMark Prins		} else {
487787a5195SMark Prins			$imgUrl .= "&zoom=" . $gmap ['zoom'];
488787a5195SMark Prins		}
489787a5195SMark Prins
490787a5195SMark Prins		if (! empty ( $overlay )) {
491787a5195SMark Prins			$rowId = 0;
492787a5195SMark Prins			foreach ( $overlay as $data ) {
493787a5195SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
494787a5195SMark Prins				$imgUrl .= "&markers=icon%3a" . $sUrl . "lib/plugins/openlayersmap/icons/" . $img . "%7c" . $lat . "," . $lon . "%7clabel%3a" . ++ $rowId;
495787a5195SMark Prins			}
496787a5195SMark Prins		}
49744aba0bcSMark Prins		$imgUrl .= "&format=png&maptype=" . $maptype;
498787a5195SMark Prins		global $conf;
499787a5195SMark Prins		$imgUrl .= "&language=" . $conf ['lang'];
500fc16f3cdSMark Prins		// dbglog($imgUrl,'syntax_plugin_openlayersmap_olmap::_getGoogle: Google image url is:');
501787a5195SMark Prins		return $imgUrl;
502787a5195SMark Prins	}
503787a5195SMark Prins
504787a5195SMark Prins	/**
5056e633dd6SMark Prins	 * Create a Bing maps static image url w/ the poi.
5061c640875SMark Prins	 *
507787a5195SMark Prins	 * @param array $gmap
508787a5195SMark Prins	 * @param array $overlay
509787a5195SMark Prins	 */
510787a5195SMark Prins	private function _getBing($gmap, $overlay) {
511585afb49SMark Prins		if (! $this->getConf ( 'bingAPIKey' )) {
5122d11d700SMark Prins			// in case there is no Bing api key we'll use OSM
5132d11d700SMark Prins			$this->_getStaticOSM ( $gmap, $overlay );
514585afb49SMark Prins		}
51587d958d4SMark Prins		switch ($gmap ['baselyr']) {
51687d958d4SMark Prins			case 've hybrid' :
51794c2e868SMark Prins			case 'bing hybrid' :
51887d958d4SMark Prins				$maptype = 'AerialWithLabels';
51987d958d4SMark Prins				break;
52087d958d4SMark Prins			case 've sat' :
52194c2e868SMark Prins			case 'bing sat' :
52287d958d4SMark Prins				$maptype = 'Aerial';
52387d958d4SMark Prins				break;
52487d958d4SMark Prins			case 've normal' :
52594c2e868SMark Prins			case 've road' :
52687d958d4SMark Prins			case 've' :
52718edeaa5SMark Prins			case 'bing road' :
52887d958d4SMark Prins			default :
52987d958d4SMark Prins				$maptype = 'Road';
53087d958d4SMark Prins				break;
53187d958d4SMark Prins		}
532837eba2fSMark Prins		$imgUrl = "http://dev.virtualearth.net/REST/v1/Imagery/Map/" . $maptype . "/";
5332d11d700SMark Prins		if (! $this->getConf ( 'autoZoomMap' )) {
5342d11d700SMark Prins			$bbox = $this->_calcBBOX ( $overlay, $gmap ['lat'], $gmap ['lon'] );
53544aba0bcSMark Prins			$imgUrl .= "?mapArea=" . $bbox ['minlat'] . "," . $bbox ['minlon'] . "," . $bbox ['maxlat'] . "," . $bbox ['maxlon'];
53644aba0bcSMark Prins			$imgUrl .= "&declutter=1";
5372d11d700SMark Prins			// or
5382d11d700SMark Prins			// $imgUrl .= $gmap['lat'].",".$gmap['lon']."/".$gmap['zoom']."?";
5392d11d700SMark Prins		}
5401c640875SMark Prins		if (strpos ( $imgUrl, "?" ) === false)
5411c640875SMark Prins			$imgUrl .= "?";
5422d11d700SMark Prins
543837eba2fSMark Prins		$imgUrl .= "&ms=" . str_replace ( "px", "", $gmap ['width'] ) . "," . str_replace ( "px", "", $gmap ['height'] );
544787a5195SMark Prins		$imgUrl .= "&key=" . $this->getConf ( 'bingAPIKey' );
545787a5195SMark Prins		if (! empty ( $overlay )) {
546787a5195SMark Prins			$rowId = 0;
547787a5195SMark Prins			foreach ( $overlay as $data ) {
548787a5195SMark Prins				list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
54987d958d4SMark Prins				// TODO icon style lookup, see: http://msdn.microsoft.com/en-us/library/ff701719.aspx for iconStyle
550787a5195SMark Prins				$iconStyle = 32;
551787a5195SMark Prins				$rowId ++;
552*807d36baSMark Prins				// NOTE: the max number of pushpins is 18! or we have to use POST (http://msdn.microsoft.com/en-us/library/ff701724.aspx)
553837eba2fSMark Prins				if ($rowId == 18) {
554837eba2fSMark Prins					break;
555837eba2fSMark Prins				}
556787a5195SMark Prins				$imgUrl .= "&pp=$lat,$lon;$iconStyle;$rowId";
557787a5195SMark Prins			}
558787a5195SMark Prins		}
559fc16f3cdSMark Prins		// dbglog($imgUrl,'syntax_plugin_openlayersmap_olmap::_getBing: bing image url is:');
560fcd79b50SMark Prins		return $imgUrl;
561fcd79b50SMark Prins	}
56287d958d4SMark Prins
56387d958d4SMark Prins	/**
56487d958d4SMark Prins	 * Create a static OSM map image url w/ the poi from http://staticmap.openstreetmap.de (staticMapLite)
565fcf646d2SMark Prins	 * use http://staticmap.openstreetmap.de "staticMapLite" or a local version
5661c640875SMark Prins	 *
56787d958d4SMark Prins	 * @param array $gmap
56887d958d4SMark Prins	 * @param array $overlay
569fcf646d2SMark Prins	 *
570fcf646d2SMark Prins	 * @todo implementation for http://ojw.dev.openstreetmap.org/StaticMapDev/
57187d958d4SMark Prins	 */
57287d958d4SMark Prins	private function _getStaticOSM($gmap, $overlay) {
57387d958d4SMark Prins		// http://staticmap.openstreetmap.de/staticmap.php?center=47.000622235634,10.117187497601&zoom=5&size=500x350
57487d958d4SMark 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
575fcf646d2SMark Prins		global $conf;
576372f1508SMark Prins
57753bfe4a3SMark Prins		if ($this->getConf ( 'optionStaticMapGenerator' ) == 'local') {
57853bfe4a3SMark Prins			if (! $my = &plugin_load ( 'helper', 'openlayersmap_staticmap' )) {
57953bfe4a3SMark Prins				dbglog ( $my, 'syntax_plugin_openlayersmap_olmap::_getStaticOSM: openlayersmap_staticmap plugin is not available.' );
58053bfe4a3SMark Prins			}
58153bfe4a3SMark Prins			if (! $geophp = &plugin_load ( 'helper', 'geophp' )) {
58253bfe4a3SMark Prins				dbglog ( $geophp, 'syntax_plugin_openlayersmap_olmap::_getStaticOSM: geophp plugin is not available.' );
58353bfe4a3SMark Prins			}
58453bfe4a3SMark Prins			$size = str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
58553bfe4a3SMark Prins
58653bfe4a3SMark Prins			$markers = '';
58753bfe4a3SMark Prins			if (! empty ( $overlay )) {
58853bfe4a3SMark Prins				foreach ( $overlay as $data ) {
58953bfe4a3SMark Prins					list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
59053bfe4a3SMark Prins					$iconStyle = substr ( $img, 0, strlen ( $img ) - 4 );
59153bfe4a3SMark Prins					$markers [] = array (
59253bfe4a3SMark Prins							'lat' => $lat,
59353bfe4a3SMark Prins							'lon' => $lon,
5941c640875SMark Prins							'type' => $iconStyle
5951c640875SMark Prins					);
59653bfe4a3SMark Prins				}
597372f1508SMark Prins			}
598372f1508SMark Prins
5991c640875SMark Prins			$result = $my->getMap ( $gmap ['lat'], $gmap ['lon'], $gmap ['zoom'], $size, $maptype, $markers, $gmap ['gpxfile'], $gmap ['kmlfile'], $gmap ['geojsonfile'] );
60053bfe4a3SMark Prins		} else {
60153bfe4a3SMark Prins			// default to external provider
60253bfe4a3SMark Prins			$imgUrl = "http://staticmap.openstreetmap.de/staticmap.php";
60353bfe4a3SMark Prins			$imgUrl .= "?center=" . $gmap ['lat'] . "," . $gmap ['lon'];
60487d958d4SMark Prins			$imgUrl .= "&size=" . str_replace ( "px", "", $gmap ['width'] ) . "x" . str_replace ( "px", "", $gmap ['height'] );
60553bfe4a3SMark Prins
60687d958d4SMark Prins			if ($gmap ['zoom'] > 16) {
607fcf646d2SMark Prins				// actually this could even be 18, but that seems overkill
60887d958d4SMark Prins				$imgUrl .= "&zoom=16";
60987d958d4SMark Prins			} else {
61087d958d4SMark Prins				$imgUrl .= "&zoom=" . $gmap ['zoom'];
61187d958d4SMark Prins			}
61287d958d4SMark Prins
61318edeaa5SMark Prins			switch ($gmap ['baselyr']) {
61418edeaa5SMark Prins				case 'mapnik' :
615fcf646d2SMark Prins				case 'openstreetmap' :
616fcf646d2SMark Prins					$maptype = 'openstreetmap';
61718edeaa5SMark Prins					break;
618fcf646d2SMark Prins				case 'transport' :
619fcf646d2SMark Prins					$maptype = 'transport';
620fcf646d2SMark Prins					break;
621fcf646d2SMark Prins				case 'landscape' :
622fcf646d2SMark Prins					$maptype = 'landscape';
62318edeaa5SMark Prins					break;
62418edeaa5SMark Prins				case 'cycle map' :
62518edeaa5SMark Prins					$maptype = 'cycle';
62618edeaa5SMark Prins					break;
627372f1508SMark Prins				case 'cloudmade' :
628372f1508SMark Prins					$maptype = 'cloudmade';
629372f1508SMark Prins					break;
630372f1508SMark Prins				case 'cloudmade fresh' :
631372f1508SMark Prins					$maptype = 'fresh';
632372f1508SMark Prins					break;
633fcf646d2SMark Prins				case 'hike and bike map' :
634fcf646d2SMark Prins					$maptype = 'hikeandbike';
635fcf646d2SMark Prins					break;
636fcf646d2SMark Prins				case 'mapquest hybrid' :
637fcf646d2SMark Prins				case 'mapquest road' :
638fcf646d2SMark Prins				case 'mapquest sat' :
639fcf646d2SMark Prins					$maptype = 'mapquest';
640fcf646d2SMark Prins					break;
64118edeaa5SMark Prins				default :
64218edeaa5SMark Prins					$maptype = '';
64318edeaa5SMark Prins					break;
64418edeaa5SMark Prins			}
64518edeaa5SMark Prins			$imgUrl .= "&maptype=" . $maptype;
64618edeaa5SMark Prins
64787d958d4SMark Prins			if (! empty ( $overlay )) {
64887d958d4SMark Prins				$rowId = 0;
64987d958d4SMark Prins				$imgUrl .= "&markers=";
65087d958d4SMark Prins				foreach ( $overlay as $data ) {
65187d958d4SMark Prins					list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
65287d958d4SMark Prins					$rowId ++;
65353bfe4a3SMark Prins					$iconStyle = "lightblue$rowId";
65487d958d4SMark Prins					$imgUrl .= "$lat,$lon,$iconStyle%7c";
65587d958d4SMark Prins				}
65687d958d4SMark Prins				$imgUrl = substr ( $imgUrl, 0, - 3 );
65787d958d4SMark Prins			}
65887d958d4SMark Prins
659f4b9bdacSMark Prins			$result = $imgUrl;
660628e43ccSMark Prins		}
661628e43ccSMark Prins
662fc16f3cdSMark Prins		// dbglog($result,'syntax_plugin_openlayersmap_olmap::_getStaticOSM: osm image url is:');
663628e43ccSMark Prins		return $result;
664628e43ccSMark Prins	}
665628e43ccSMark Prins
66644aba0bcSMark Prins	/**
66744aba0bcSMark Prins	 * Calculate the minimum bbox for a start location + poi.
66844aba0bcSMark Prins	 *
6691c640875SMark Prins	 * @param array $overlay
6701c640875SMark Prins	 *        	multi-dimensional array of array($lat, $lon, $text, $angle, $opacity, $img)
6711c640875SMark Prins	 * @param float $lat
6721c640875SMark Prins	 *        	latitude for map center
6731c640875SMark Prins	 * @param float $lon
6741c640875SMark Prins	 *        	longitude for map center
67544aba0bcSMark Prins	 * @return multitype:float array describing the mbr and center point
67644aba0bcSMark Prins	 */
677837eba2fSMark Prins	private function _calcBBOX($overlay, $lat, $lon) {
678837eba2fSMark Prins		$lats [] = $lat;
679837eba2fSMark Prins		$lons [] = $lon;
680837eba2fSMark Prins		foreach ( $overlay as $data ) {
681837eba2fSMark Prins			list ( $lat, $lon, $text, $angle, $opacity, $img ) = $data;
682837eba2fSMark Prins			$lats [] = $lat;
683837eba2fSMark Prins			$lons [] = $lon;
684837eba2fSMark Prins		}
685837eba2fSMark Prins		sort ( $lats );
686837eba2fSMark Prins		sort ( $lons );
68744aba0bcSMark Prins		// TODO: make edge/wrap around cases work
68844aba0bcSMark Prins		$centerlat = $lats [0] + ($lats [count ( $lats ) - 1] - $lats [0]);
68944aba0bcSMark Prins		$centerlon = $lons [0] + ($lons [count ( $lats ) - 1] - $lons [0]);
6901c640875SMark Prins		return array (
6911c640875SMark Prins				'minlat' => $lats [0],
6921c640875SMark Prins				'minlon' => $lons [0],
6931c640875SMark Prins				'maxlat' => $lats [count ( $lats ) - 1],
6941c640875SMark Prins				'maxlon' => $lons [count ( $lats ) - 1],
6951c640875SMark Prins				'centerlat' => $centerlat,
6961c640875SMark Prins				'centerlon' => $centerlon
6971c640875SMark Prins		);
69887d958d4SMark Prins	}
699cc74a83cSMark Prins
700cc74a83cSMark Prins	/**
701cc74a83cSMark Prins	 * Figures out the base filename of a media path.
7021c640875SMark Prins	 *
703cc74a83cSMark Prins	 * @param String $mediaLink
704cc74a83cSMark Prins	 */
705cc74a83cSMark Prins	private function getFileName($mediaLink) {
706cc74a83cSMark Prins		$mediaLink = str_replace ( '[[', '', $mediaLink );
707cc74a83cSMark Prins		$mediaLink = str_replace ( ']]', '', $mediaLink );
708cc74a83cSMark Prins		$mediaLink = substr ( $mediaLink, 0, - 4 );
709cc74a83cSMark Prins		$parts = explode ( ':', $mediaLink );
710cc74a83cSMark Prins		$mediaLink = end ( $parts );
711cc74a83cSMark Prins		return str_replace ( '_', ' ', $mediaLink );
712cc74a83cSMark Prins	}
71338a47c60SMark Prins}