*
* @seeAlso Location
*/
-
class MapstractionPlugin extends Plugin
{
+ const VERSION = STATUSNET_VERSION;
+
/** provider name, one of:
'cloudmade', 'google', 'microsoft', 'openlayers', 'yahoo' */
public $provider = 'openlayers';
*
* The way to register new actions from a plugin.
*
- * @param Router &$m reference to router
+ * @param Router $m reference to router
*
* @return boolean event handler return
*/
-
- function onRouterInitialized(&$m)
+ 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;
}
- /**
- * 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
*
*
* @return boolean event handler return
*/
-
function onEndShowScripts($action)
{
- // These are the ones that have maps on 'em
- if (!in_array($action->trimmed('action'),
- array('showstream', 'all', 'allmap', 'usermap'))) {
+ $actionName = $action->trimmed('action');
+
+ if (!in_array($actionName,
+ array('showstream', 'all', 'usermap', 'allmap'))) {
return true;
}
$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');
+ $action->script((StatusNet::isHTTPS()?'https':'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($this->path('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));
+ 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($this->path('usermap-mxn-openlayers.min.js'));
+ } else {
+ $action->script(sprintf('%s?(%s)',
+ $this->path('js/mxn.js'),
+ $this->provider));
- $action->elementStart('script', array('type' => 'text/javascript'));
- $action->raw(sprintf('var _provider = "%s";', $this->provider));
- $action->elementEnd('script');
+ $action->script($this->path('usermap.js'));
+ }
+ $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); ' .
+ ' var canvas = $("#map_canvas")[0]; ' .
+ ' if (typeof(canvas) != "undefined") { showMapstraction(canvas, notices); } '.
+ '});');
+ }
+
+ return true;
+ }
+
+ 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'));
+
+ // TRANS: Header for Map widget that displays a map with geodata for notices.
+ $action->element('h2', null, _m('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),
+ // TRANS: Clickable item to allow opening the map in full size.
+ _m('Full size'));
+
+ $action->elementEnd('div');
+ }
+
+ function onPluginVersion(&$versions)
+ {
+ $versions[] = array('name' => 'Mapstraction',
+ 'version' => self::VERSION,
+ 'author' => 'Evan Prodromou',
+ 'homepage' => 'http://status.net/wiki/Plugin:Mapstraction',
+ 'rawdescription' =>
+ // TRANS: Plugin description.
+ _m('Show maps of users\' and friends\' notices '.
+ 'with <a href="http://www.mapstraction.com/">Mapstraction</a>.'));
return true;
}
}