| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Plugin to provide map visualization of location data | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Action | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @copyright 2009 StatusNet Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Plugin to provide map visualization of location data | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This plugin uses the Mapstraction JavaScript library to | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @seeAlso  Location | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class MapstractionPlugin extends Plugin | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  |     const VERSION = STATUSNET_VERSION; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |     /** provider name, one of: | 
					
						
							|  |  |  |      'cloudmade', 'google', 'microsoft', 'openlayers', 'yahoo' */ | 
					
						
							|  |  |  |     public $provider = 'openlayers'; | 
					
						
							|  |  |  |     /** provider API key (or 'appid'), if required ('google' and 'yahoo' only) */ | 
					
						
							|  |  |  |     public $apikey = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Hook for new URLs | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * The way to register new actions from a plugin. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-12-03 19:59:31 -05:00
										 |  |  |      * @param Router $m reference to router | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean event handler return | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-12-03 19:59:31 -05:00
										 |  |  |     function onRouterInitialized($m) | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $m->connect(':nickname/all/map', | 
					
						
							|  |  |  |                     array('action' => 'allmap'), | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                     array('nickname' => Nickname::DISPLAY_FMT)); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |         $m->connect(':nickname/map', | 
					
						
							|  |  |  |                     array('action' => 'usermap'), | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                     array('nickname' => Nickname::DISPLAY_FMT)); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Hook for autoloading classes | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This makes sure our classes get autoloaded from our directory | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $cls name of class being used | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean event handler return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onAutoload($cls) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch ($cls) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         case 'AllmapAction': | 
					
						
							|  |  |  |         case 'UsermapAction': | 
					
						
							| 
									
										
										
										
											2009-12-03 19:43:02 -05:00
										 |  |  |         case 'MapAction': | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |             include_once INSTALLDIR.'/plugins/Mapstraction/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Hook for adding extra JavaScript | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This makes sure our scripts get loaded for map-related pages | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action Action object for the page | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean event handler return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onEndShowScripts($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  |         $actionName = $action->trimmed('action'); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-04 14:31:19 -05:00
										 |  |  |         if (!in_array($actionName, | 
					
						
							|  |  |  |                       array('showstream', 'all', 'usermap', 'allmap'))) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |         switch ($this->provider) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         case 'cloudmade': | 
					
						
							|  |  |  |             $action->script('http://tile.cloudmade.com/wml/0.2/web-maps-lite.js'); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'google': | 
					
						
							| 
									
										
										
										
											2010-06-01 18:29:01 +00:00
										 |  |  |             $action->script(sprintf('http://maps.google.com/maps?file=api&v=2&sensor=false&key=%s', | 
					
						
							|  |  |  |                                     urlencode($this->apikey))); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case 'microsoft': | 
					
						
							| 
									
										
										
										
											2010-10-27 00:09:43 -04:00
										 |  |  |             $action->script((StatusNet::isHTTPS()?'https':'http') + '://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6'); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case 'openlayers': | 
					
						
							| 
									
										
										
										
											2010-12-08 14:54:02 -08:00
										 |  |  |             // Use our included stripped & minified OpenLayers.
 | 
					
						
							| 
									
										
										
										
											2011-02-03 10:50:11 -05:00
										 |  |  |             $action->script($this->path('OpenLayers/OpenLayers.js')); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case 'yahoo': | 
					
						
							|  |  |  |             $action->script(sprintf('http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=%s', | 
					
						
							| 
									
										
										
										
											2010-06-01 18:29:01 +00:00
										 |  |  |                                     urlencode($this->apikey))); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case 'geocommons': // don't support this yet
 | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-08 14:54:02 -08:00
										 |  |  |         if ($this->provider == 'openlayers') { | 
					
						
							|  |  |  |             // We have an optimized path for our default case.
 | 
					
						
							|  |  |  |             //
 | 
					
						
							|  |  |  |             // Note that OpenLayers.js needs to be separate, or it won't
 | 
					
						
							|  |  |  |             // be able to find its UI images and styles.
 | 
					
						
							| 
									
										
										
										
											2011-02-03 10:50:11 -05:00
										 |  |  |             $action->script($this->path('usermap-mxn-openlayers.min.js')); | 
					
						
							| 
									
										
										
										
											2010-12-08 14:54:02 -08:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $action->script(sprintf('%s?(%s)', | 
					
						
							| 
									
										
										
										
											2011-02-03 10:50:11 -05:00
										 |  |  |                                     $this->path('js/mxn.js'), | 
					
						
							| 
									
										
										
										
											2010-12-08 14:54:02 -08:00
										 |  |  |                                     $this->provider)); | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 10:50:11 -05:00
										 |  |  |             $action->script($this->path('usermap.js')); | 
					
						
							| 
									
										
										
										
											2010-12-08 14:54:02 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-04 14:31:19 -05:00
										 |  |  |         $action->inlineScript(sprintf('var _provider = "%s";', $this->provider)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // usermap and allmap handle this themselves
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (in_array($actionName, | 
					
						
							|  |  |  |                      array('showstream', 'all'))) { | 
					
						
							|  |  |  |             $action->inlineScript('$(document).ready(function() { '. | 
					
						
							|  |  |  |                                   ' var user = null; '. | 
					
						
							|  |  |  |                                   (($actionName == 'showstream') ? ' user = scrapeUser(); ' : '') . | 
					
						
							|  |  |  |                                   ' var notices = scrapeNotices(user); ' . | 
					
						
							| 
									
										
										
										
											2010-11-12 11:46:45 -05:00
										 |  |  | 				  ' var canvas = $("#map_canvas")[0]; ' . | 
					
						
							|  |  |  |                                   ' if (typeof(canvas) != "undefined") { showMapstraction(canvas, notices); } '. | 
					
						
							| 
									
										
										
										
											2009-12-04 14:31:19 -05:00
										 |  |  |                                   '});'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-18 08:33:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onEndShowSections($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $actionName = $action->trimmed('action'); | 
					
						
							|  |  |  |         // These are the ones that have maps on 'em
 | 
					
						
							|  |  |  |         if (!in_array($actionName, | 
					
						
							|  |  |  |                       array('showstream', 'all'))) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->elementStart('div', array('id' => 'entity_map', | 
					
						
							|  |  |  |                                          'class' => 'section')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  |         $action->element('h2', null, _m('Map')); | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $action->element('div', array('id' => 'map_canvas', | 
					
						
							|  |  |  |                                     'class' => 'gray smallmap', | 
					
						
							|  |  |  |                                     'style' => "width: 100%; height: 240px")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $mapAct = ($actionName == 'showstream') ? 'usermap' : 'allmap'; | 
					
						
							|  |  |  |         $mapUrl =  common_local_url($mapAct, | 
					
						
							|  |  |  |                                     array('nickname' => $action->trimmed('nickname'))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->element('a', array('href' => $mapUrl), | 
					
						
							| 
									
										
										
										
											2010-09-18 15:10:49 +02:00
										 |  |  |                          // TRANS: Clickable item to allow opening the map in full size.
 | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  |                          _m("Full size")); | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $action->elementEnd('div'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $versions[] = array('name' => 'Mapstraction', | 
					
						
							|  |  |  |                             'version' => self::VERSION, | 
					
						
							|  |  |  |                             'author' => 'Evan Prodromou', | 
					
						
							|  |  |  |                             'homepage' => 'http://status.net/wiki/Plugin:Mapstraction', | 
					
						
							|  |  |  |                             'rawdescription' => | 
					
						
							|  |  |  |                             _m('Show maps of users\' and friends\' notices '. | 
					
						
							| 
									
										
										
										
											2010-09-18 15:10:49 +02:00
										 |  |  |                                'with <a href="http://www.mapstraction.com/">Mapstraction</a>.')); | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  | } |