]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Mapstraction/MapstractionPlugin.php
Merge branch 'master' of gitorious.org:statusnet/mainline into 0.9.x
[quix0rs-gnu-social.git] / plugins / Mapstraction / MapstractionPlugin.php
index c0c2c5b8e357c239648cdcdc63a38fc15104327d..020c0818ad20b055b778ad830c38ebf1616c3ca2 100644 (file)
@@ -44,9 +44,10 @@ if (!defined('STATUSNET')) {
  *
  * @seeAlso  Location
  */
-
 class MapstractionPlugin extends Plugin
 {
+    const VERSION = STATUSNET_VERSION;
+
     /** provider name, one of:
      'cloudmade', 'google', 'microsoft', 'openlayers', 'yahoo' */
     public $provider = 'openlayers';
@@ -62,15 +63,14 @@ class MapstractionPlugin extends Plugin
      *
      * @return boolean event handler return
      */
-
     function onRouterInitialized($m)
     {
         $m->connect(':nickname/all/map',
                     array('action' => 'allmap'),
-                    array('nickname' => '['.NICKNAME_FMT.']{1,64}'));
+                    array('nickname' => Nickname::DISPLAY_FMT));
         $m->connect(':nickname/map',
                     array('action' => 'usermap'),
-                    array('nickname' => '['.NICKNAME_FMT.']{1,64}'));
+                    array('nickname' => Nickname::DISPLAY_FMT));
         return true;
     }
 
@@ -83,13 +83,13 @@ class MapstractionPlugin extends Plugin
      *
      * @return boolean event handler return
      */
-
     function onAutoload($cls)
     {
         switch ($cls)
         {
         case 'AllmapAction':
         case 'UsermapAction':
+        case 'MapAction':
             include_once INSTALLDIR.'/plugins/Mapstraction/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
             return false;
         default:
@@ -106,13 +106,12 @@ class MapstractionPlugin extends Plugin
      *
      * @return boolean event handler return
      */
-
     function onEndShowScripts($action)
     {
         $actionName = $action->trimmed('action');
-        // These are the ones that have maps on 'em
+
         if (!in_array($actionName,
-                      array('showstream', 'all', 'allmap', 'usermap'))) {
+                      array('showstream', 'all', 'usermap', 'allmap'))) {
             return true;
         }
 
@@ -122,67 +121,53 @@ class MapstractionPlugin extends Plugin
             $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));
+            $action->script(sprintf('http://maps.google.com/maps?file=api&v=2&sensor=false&key=%s',
+                                    urlencode($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');
+            // Use our included stripped & minified OpenLayers.
+            $action->script(common_path('plugins/Mapstraction/OpenLayers/OpenLayers.js'));
             break;
         case 'yahoo':
             $action->script(sprintf('http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=%s',
-                                    $this->apikey));
+                                    urlencode($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));
-
-        $action->script(common_path('plugins/Mapstraction/usermap.js'));
-
-        $action->elementStart('script', array('type' => 'text/javascript'));
-        $action->raw(sprintf('var _provider = "%s";', $this->provider));
-        $action->elementEnd('script');
-
-        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;
+        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.
+            $action->script(common_path('plugins/Mapstraction/usermap-mxn-openlayers.min.js'));
+        } else {
+            $action->script(sprintf('%s?(%s)',
+                                    common_path('plugins/Mapstraction/js/mxn.js'),
+                                    $this->provider));
+
+            $action->script(common_path('plugins/Mapstraction/usermap.js'));
         }
 
-        $jsonArray = array();
+        $action->inlineScript(sprintf('var _provider = "%s";', $this->provider));
 
-        while ($notice->fetch()) {
-            if (!empty($notice->lat) && !empty($notice->lon)) {
-                $jsonNotice = $this->noticeAsJson($notice);
-                $jsonArray[] = $jsonNotice;
-            }
-        }
+        // usermap and allmap handle this themselves
 
-        $action->elementStart('script', array('type' => 'text/javascript'));
-        $action->raw('/*<![CDATA[*/'); // XHTML compat for Safari
-        $action->raw('var _notices = ' . json_encode($jsonArray));
-        $action->raw('/*]]>*/'); // XHTML compat for Safari
-        $action->elementEnd('script');
+        if (in_array($actionName,
+                     array('showstream', 'all'))) {
+            $action->inlineScript('$(document).ready(function() { '.
+                                  ' var user = null; '.
+                                  (($actionName == 'showstream') ? ' user = scrapeUser(); ' : '') .
+                                  ' var notices = scrapeNotices(user); ' .
+                                 ' var canvas = $("#map_canvas")[0]; ' .
+                                  ' if (typeof(canvas) != "undefined") { showMapstraction(canvas, notices); } '.
+                                  '});');
+        }
 
         return true;
     }
@@ -199,7 +184,7 @@ class MapstractionPlugin extends Plugin
         $action->elementStart('div', array('id' => 'entity_map',
                                          'class' => 'section'));
 
-        $action->element('h2', null, _('Map'));
+        $action->element('h2', null, _m('Map'));
 
         $action->element('div', array('id' => 'map_canvas',
                                     'class' => 'gray smallmap',
@@ -210,38 +195,21 @@ class MapstractionPlugin extends Plugin
                                     array('nickname' => $action->trimmed('nickname')));
 
         $action->element('a', array('href' => $mapUrl),
-                         _("Full size"));
+                         // TRANS: Clickable item to allow opening the map in full size.
+                         _m("Full size"));
 
         $action->elementEnd('div');
     }
 
-    function noticeAsJson($notice)
+    function onPluginVersion(&$versions)
     {
-        // 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();
-        $arr['html'] = $notice->rendered;
-        $arr['source'] = $arr['source'];
-
-        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;
+        $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 '.
+                               'with <a href="http://www.mapstraction.com/">Mapstraction</a>.'));
+        return true;
     }
 }