| 
									
										
										
										
											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 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** 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-11-20 10:08:13 -08:00
										 |  |  |      * @param Router $m reference to router | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean event handler return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 10:08:13 -08:00
										 |  |  |     function onRouterInitialized($m) | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $m->connect(':nickname/all/map', | 
					
						
							|  |  |  |                     array('action' => 'allmap'), | 
					
						
							|  |  |  |                     array('nickname' => '['.NICKNAME_FMT.']{1,64}')); | 
					
						
							|  |  |  |         $m->connect(':nickname/map', | 
					
						
							|  |  |  |                     array('action' => 'usermap'), | 
					
						
							|  |  |  |                     array('nickname' => '['.NICKNAME_FMT.']{1,64}')); | 
					
						
							|  |  |  |         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': | 
					
						
							|  |  |  |             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
										 |  |  |         // These are the ones that have maps on 'em
 | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  |         if (!in_array($actionName, | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  |                       array('showstream', 'all', 'allmap', 'usermap'))) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch ($this->provider) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         case 'cloudmade': | 
					
						
							|  |  |  |             $action->script('http://tile.cloudmade.com/wml/0.2/web-maps-lite.js'); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'google': | 
					
						
							|  |  |  |             $action->script(sprintf('http://maps.google.com/maps?file=api&v=2&sensor=false&key=%s', | 
					
						
							|  |  |  |                                     $this->apikey)); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'microsoft': | 
					
						
							|  |  |  |             $action->script('http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6'); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'openlayers': | 
					
						
							|  |  |  |             // XXX: is this not nice...?
 | 
					
						
							|  |  |  |             $action->script('http://openlayers.org/api/OpenLayers.js'); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'yahoo': | 
					
						
							|  |  |  |             $action->script(sprintf('http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=%s', | 
					
						
							|  |  |  |                                     $this->apikey)); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'geocommons': // don't support this yet
 | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->script(sprintf('%s?(%s)', | 
					
						
							|  |  |  |                                 common_path('plugins/Mapstraction/js/mxn.js'), | 
					
						
							|  |  |  |                                 $this->provider)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  |         $action->script(common_path('plugins/Mapstraction/usermap.js')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 11:21:51 -05:00
										 |  |  |         $action->elementStart('script', array('type' => 'text/javascript')); | 
					
						
							|  |  |  |         $action->raw(sprintf('var _provider = "%s";', $this->provider)); | 
					
						
							|  |  |  |         $action->elementEnd('script'); | 
					
						
							| 
									
										
										
										
											2009-11-18 08:33:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  |         switch ($actionName) { | 
					
						
							|  |  |  |         case 'usermap': | 
					
						
							|  |  |  |         case 'showstream': | 
					
						
							|  |  |  |             $notice = empty($action->tag) | 
					
						
							|  |  |  |               ? $action->user->getNotices(($action->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1) | 
					
						
							|  |  |  |                 : $action->user->getTaggedNotices($action->tag, ($action->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, 0, 0, null); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'all': | 
					
						
							|  |  |  |         case 'allmap': | 
					
						
							|  |  |  |             $cur = common_current_user(); | 
					
						
							|  |  |  |             if (!empty($cur) && $cur->id == $action->user->id) { | 
					
						
							|  |  |  |                 $notice = $action->user->noticeInbox(($action->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $notice = $action->user->noticesWithFriends(($action->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $jsonArray = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while ($notice->fetch()) { | 
					
						
							|  |  |  |             if (!empty($notice->lat) && !empty($notice->lon)) { | 
					
						
							|  |  |  |                 $jsonNotice = $this->noticeAsJson($notice); | 
					
						
							|  |  |  |                 $jsonArray[] = $jsonNotice; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->elementStart('script', array('type' => 'text/javascript')); | 
					
						
							| 
									
										
										
										
											2009-11-20 12:04:27 -08:00
										 |  |  |         $action->raw('/*<![CDATA[*/'); // XHTML compat for Safari
 | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  |         $action->raw('var _notices = ' . json_encode($jsonArray)); | 
					
						
							| 
									
										
										
										
											2009-11-20 12:04:27 -08:00
										 |  |  |         $action->raw('/*]]>*/'); // XHTML compat for Safari
 | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  |         $action->elementEnd('script'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->element('h2', null, _('Map')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $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), | 
					
						
							|  |  |  |                          _("Full size")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->elementEnd('div'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function noticeAsJson($notice) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // FIXME: this code should be abstracted to a neutral third
 | 
					
						
							|  |  |  |         // party, like Notice::asJson(). I'm not sure of the ethics
 | 
					
						
							|  |  |  |         // of refactoring from within a plugin, so I'm just abusing
 | 
					
						
							|  |  |  |         // the ApiAction method. Don't do this unless you're me!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         require_once(INSTALLDIR.'/lib/api.php'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $act = new ApiAction('/dev/null'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $arr = $act->twitterStatusArray($notice, true); | 
					
						
							|  |  |  |         $arr['url'] = $notice->bestUrl(); | 
					
						
							| 
									
										
										
										
											2009-11-20 10:17:14 -08:00
										 |  |  |         $arr['html'] = $notice->rendered; | 
					
						
							|  |  |  |         $arr['source'] = $arr['source']; | 
					
						
							| 
									
										
										
										
											2009-11-19 12:34:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($notice->reply_to)) { | 
					
						
							|  |  |  |             $reply_to = Notice::staticGet('id', $notice->reply_to); | 
					
						
							|  |  |  |             if (!empty($reply_to)) { | 
					
						
							|  |  |  |                 $arr['in_reply_to_status_url'] = $reply_to->bestUrl(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $reply_to = null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $profile = $notice->getProfile(); | 
					
						
							|  |  |  |         $arr['user']['profile_url'] = $profile->profileurl; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $arr; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-17 23:23:13 -05:00
										 |  |  | } |