r53647 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r53646‎ | r53647 | r53648 >
Date:15:44, 22 July 2009
Author:yaron
Status:deferred
Tags:
Comment:
Version 0.1 of Semantic Maps, by Jeroen DeDauw et al.
Modified paths:
  • /trunk/extensions/SemanticMaps (added) (history)
  • /trunk/extensions/SemanticMaps/COPYING (added) (history)
  • /trunk/extensions/SemanticMaps/GoogleMaps (added) (history)
  • /trunk/extensions/SemanticMaps/GoogleMaps/SM_GoogleMaps.php (added) (history)
  • /trunk/extensions/SemanticMaps/GoogleMaps/SM_GoogleMapsFormInput.php (added) (history)
  • /trunk/extensions/SemanticMaps/INSTALL (added) (history)
  • /trunk/extensions/SemanticMaps/OpenLayers (added) (history)
  • /trunk/extensions/SemanticMaps/OpenLayers/SM_OpenLayers.php (added) (history)
  • /trunk/extensions/SemanticMaps/OpenLayers/SM_OpenLayersFormInput.php (added) (history)
  • /trunk/extensions/SemanticMaps/README (added) (history)
  • /trunk/extensions/SemanticMaps/RELEASE-NOTES (added) (history)
  • /trunk/extensions/SemanticMaps/SM_FormInput.php (added) (history)
  • /trunk/extensions/SemanticMaps/SM_MapPrinter.php (added) (history)
  • /trunk/extensions/SemanticMaps/SM_Mapper.php (added) (history)
  • /trunk/extensions/SemanticMaps/SemanticMaps.i18n.php (added) (history)
  • /trunk/extensions/SemanticMaps/SemanticMaps.php (added) (history)
  • /trunk/extensions/SemanticMaps/YahooMaps (added) (history)
  • /trunk/extensions/SemanticMaps/YahooMaps/SM_YahooMaps.php (added) (history)
  • /trunk/extensions/SemanticMaps/YahooMaps/SM_YahooMapsFormInput.php (added) (history)

Diff [purge]

Index: trunk/extensions/SemanticMaps/YahooMaps/SM_YahooMaps.php
@@ -0,0 +1,118 @@
 2+<?php
 3+/**
 4+ * A query printer for maps using the Yahoo Maps API
 5+ *
 6+ * @file SM_YahooMaps.php
 7+ * @ingroup SemanticMaps
 8+ *
 9+ * @author Jeroen De Dauw
 10+ */
 11+
 12+if( !defined( 'MEDIAWIKI' ) ) {
 13+ die( 'Not an entry point.' );
 14+}
 15+
 16+final class SMYahooMaps extends SMMapPrinter {
 17+
 18+ public function getName() {
 19+ wfLoadExtensionMessages('SemanticMaps');
 20+ return wfMsg('sm_yahoomaps_printername');
 21+ }
 22+
 23+ protected function getResultText($res, $outputmode) {
 24+ parent::getResultText($res, $outputmode);
 25+
 26+ // Go through the array with map parameters and create new variables
 27+ // with the name of the key and value of the item.
 28+ foreach($this->m_params as $paramName => $paramValue) {
 29+ if (empty(${$paramName})) ${$paramName} = $paramValue;
 30+ }
 31+
 32+ $result = "";
 33+
 34+ global $egYahooMapsOnThisPage, $egMapsYahooMapsZoom;
 35+
 36+ if (strlen($zoom) < 1) $zoom = $egMapsYahooMapsZoom;
 37+
 38+ if (empty($egYahooMapsOnThisPage)) {
 39+ $egYahooMapsOnThisPage = 0;
 40+ MapsYahooMaps::addYMapDependencies($result);
 41+ }
 42+
 43+ $egYahooMapsOnThisPage++;
 44+
 45+ // Get the Yahoo Maps names for the control and map types
 46+ $type = MapsYahooMaps::getYMapType($type);
 47+ $extraMapControls = MapsYahooMaps::getExtraMapControls($controls, $egYahooMapsOnThisPage);
 48+
 49+ $map_text = "";
 50+
 51+ if (count($this->m_locations) > 0) {
 52+ if (empty($centre)) {
 53+ // If the center is not set, it needs to be determined, together with the bounds
 54+ // This is done with the getBestZoomAndCenter function of the Y! Maps API
 55+ $map_text .= "var ymap_locations_$egYahooMapsOnThisPage = Array();";
 56+
 57+ foreach ($this->m_locations as $i => $location) {
 58+ // Add the markers to the map
 59+ list($lat, $lon, $title, $label, $icon) = $location;
 60+ $title = str_replace("'", "\'", $title);
 61+ $label = str_replace("'", "\'", $label);
 62+ $map_text .= "
 63+ yahoo_$egYahooMapsOnThisPage.addOverlay(createYMarker(new YGeoPoint($lat, $lon), '$title', '$label'));
 64+ ymap_locations_$egYahooMapsOnThisPage.push(new YGeoPoint($lat, $lon));";
 65+ }
 66+
 67+ $map_text .= "var centerAndZoom = yahoo_$egYahooMapsOnThisPage.getBestZoomAndCenter(ymap_locations_$egYahooMapsOnThisPage);
 68+ yahoo_$egYahooMapsOnThisPage.drawZoomAndCenter(centerAndZoom.YGeoPoint, centerAndZoom.zoomLevel);";
 69+ }
 70+ else {
 71+ //if ($centre == null) {
 72+ // $centre_lat = 0;
 73+ // $centre_lon = 0;
 74+ //}
 75+ //else {
 76+ // If the center is set, get the coordinates
 77+ list($centre_lat, $centre_lon) = MapsUtils::getLatLon($centre);
 78+ //}
 79+
 80+ foreach ($this->m_locations as $i => $location) {
 81+ // Add the markers to the map
 82+ list($lat, $lon, $title, $label, $icon) = $location;
 83+ $title = str_replace("'", "\'", $title);
 84+ $label = str_replace("'", "\'", $label);
 85+ $map_text .= "yahoo_$egYahooMapsOnThisPage.addMarker(createYMarker(new YGeoPoint($lat, $lon), '$title', '$label'));";
 86+ }
 87+
 88+ $map_text .= " yahoo_$egYahooMapsOnThisPage.drawZoomAndCenter(new YGeoPoint($centre_lat, $centre_lon), $zoom);";
 89+ }
 90+ }
 91+
 92+ // Disbale the scroll wheel zoom when autozoom is set to off
 93+ switch($autozoom) {
 94+ case 'no' : case 'off' :
 95+ $disbaleKeyControlCode = "yahoo_$egYahooMapsOnThisPage.disableKeyControls();";
 96+ break;
 97+ default:
 98+ $disbaleKeyControlCode = '';
 99+ break;
 100+ }
 101+
 102+ $width = $width . 'px';
 103+ $height = $height . 'px';
 104+
 105+ $result .= "
 106+ <div id='map-yahoo-$egYahooMapsOnThisPage' style='width: $width; height: $height;'></div>
 107+
 108+ <script type='text/javascript'>/*<![CDATA[*/
 109+ var yahoo_locations_$egYahooMapsOnThisPage = new YGeoPoint($lat, $lon);
 110+ var yahoo_$egYahooMapsOnThisPage = new YMap(document.getElementById('map-yahoo-$egYahooMapsOnThisPage'));
 111+ yahoo_$egYahooMapsOnThisPage.addTypeControl(); $extraMapControls
 112+ yahoo_$egYahooMapsOnThisPage.setMapType($type);
 113+ $disbaleKeyControlCode $map_text /*]]>*/</script>";
 114+
 115+ return array($result, 'noparse' => 'true', 'isHTML' => 'true');
 116+ }
 117+
 118+
 119+}
\ No newline at end of file
Index: trunk/extensions/SemanticMaps/YahooMaps/SM_YahooMapsFormInput.php
@@ -0,0 +1,62 @@
 2+<?php
 3+
 4+if (!defined('MEDIAWIKI')) die();
 5+
 6+/**
 7+* Form input hook that adds an Yahoo! Maps map format to Semantic Forms
 8+ *
 9+ * @file SM_YahooMapsFormInput.php
 10+ * @ingroup SemanticMaps
 11+ *
 12+ * @author Jeroen De Dauw
 13+ */
 14+
 15+final class SMYahooMapsFormInput extends SMFormInput {
 16+
 17+ /*
 18+ * This function is a hook for Semantic Forms, and returns the HTML needed in
 19+ * the form to handle coordinate data.
 20+ */
 21+ public static function formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args) {
 22+ global $wgJsMimeType;
 23+ global $egYahooMapsOnThisPage, $egGoogleMapsOnThisPage, $egMapsYahooMapsZoom;
 24+
 25+ SMYahooMapsFormInput::$coordinates = $coordinates;
 26+
 27+ if (empty($egGoogleMapsOnThisPage)) {
 28+ $egGoogleMapsOnThisPage = 0;
 29+ MapsGoogleMaps::addGMapDependencies(SMYahooMapsFormInput::$formOutput);
 30+ }
 31+
 32+ if (empty($egYahooMapsOnThisPage)) {
 33+ $egYahooMapsOnThisPage = 0;
 34+ MapsYahooMaps::addYMapDependencies(SMYahooMapsFormInput::$formOutput);
 35+ }
 36+ $egYahooMapsOnThisPage++;
 37+
 38+ parent::formInputHTML('map_yahoo', $egYahooMapsOnThisPage, $input_name, $is_mandatory, $is_disabled, $field_args, 'showYAddress');
 39+
 40+ if (empty(SMYahooMapsFormInput::$coordinates)) {
 41+ SMYahooMapsFormInput::$zoom = 17;
 42+ } else if (strlen(SMYahooMapsFormInput::$zoom) < 1) {
 43+ SMYahooMapsFormInput::$zoom = $egMapsYahooMapsZoom;
 44+ }
 45+
 46+ $type = MapsYahooMaps::getYMapType(SMYahooMapsFormInput::$type);
 47+
 48+ $controlItems = MapsYahooMaps::createControlsString(SMGoogleMapsFormInput::$controls);
 49+
 50+ $width = SMYahooMapsFormInput::$width . 'px';
 51+ $height = SMYahooMapsFormInput::$height . 'px';
 52+
 53+ SMYahooMapsFormInput::$formOutput .="
 54+ <div id='".SMYahooMapsFormInput::$mapName."' style='width: $width; height: $height;'></div>
 55+
 56+ <script type='$wgJsMimeType'>/*<![CDATA[*/
 57+ addLoadEvent(makeFormInputYahooMap('".SMYahooMapsFormInput::$mapName."', '".SMYahooMapsFormInput::$coordsFieldName."', ".SMYahooMapsFormInput::$centre_lat.", ".SMYahooMapsFormInput::$centre_lon.", ".SMYahooMapsFormInput::$zoom.", ".SMYahooMapsFormInput::$marker_lat.", ".SMYahooMapsFormInput::$marker_lon.", $type, [$controlItems], ".SMYahooMapsFormInput::$autozoom."));
 58+ /*]]>*/</script>";
 59+
 60+ return array(SMGoogleMapsFormInput::$formOutput, '');
 61+ }
 62+
 63+}
Index: trunk/extensions/SemanticMaps/OpenLayers/SM_OpenLayers.php
@@ -0,0 +1,89 @@
 2+<?php
 3+/**
 4+ * A query printer for maps using the Open Layers API
 5+ *
 6+ * @file SM_OpenLayers.php
 7+ * @ingroup SemanticMaps
 8+ *
 9+ * @author Jeroen De Dauw
 10+ */
 11+
 12+if( !defined( 'MEDIAWIKI' ) ) {
 13+ die( 'Not an entry point.' );
 14+}
 15+
 16+final class SMOpenLayers extends SMMapPrinter {
 17+
 18+ public function getName() {
 19+ wfLoadExtensionMessages('SemanticMaps');
 20+ return wfMsg('sm_openlayers_printername');
 21+ }
 22+
 23+ protected function getResultText($res, $outputmode) {
 24+ parent::getResultText($res, $outputmode);
 25+
 26+ // Go through the array with map parameters and create new variables
 27+ // with the name of the key and value of the item.
 28+ foreach($this->m_params as $paramName => $paramValue) {
 29+ if (empty(${$paramName})) ${$paramName} = $paramValue;
 30+ }
 31+
 32+ global $egOpenLayersOnThisPage, $egMapsOpenLayersZoom;
 33+ global $wgJsMimeType;
 34+
 35+ $result = "";
 36+
 37+ MapsOpenLayers::addOLDependencies($result);
 38+ $egOpenLayersOnThisPage++;
 39+
 40+ $controlItems = MapsOpenLayers::createControlsString($controls);
 41+
 42+ $layerItems = MapsOpenLayers::createLayersStringAndLoadDependencies($result, $layers);
 43+
 44+ $markerItems = '';
 45+
 46+ if (count($this->m_locations) > 0) {
 47+
 48+ foreach ($this->m_locations as $i => $location) {
 49+ // Create a string containing the marker JS
 50+ list($lat, $lon, $title, $label, $icon) = $location;
 51+ $title = str_replace("'", "\'", $title);
 52+ $label = str_replace("'", "\'", $label);
 53+ $markerItems .= "getOLMarkerData($lon, $lat, '$title', '$label'),";
 54+ }
 55+
 56+ $markerItems = rtrim($markerItems, ',');
 57+ }
 58+
 59+ if (strlen($zoom) < 1) {
 60+ if (count($this->m_locations) > 1) {
 61+ $zoom = 'null';
 62+ }
 63+ else {
 64+ $zoom = $egMapsOpenLayersZoom;
 65+ }
 66+ }
 67+
 68+ if (strlen($centre) > 0) {
 69+ list($centre_lat, $centre_lon) = MapsUtils::getLatLon($centre);
 70+ }
 71+ else {
 72+ $centre_lat = 'null';
 73+ $centre_lon = 'null';
 74+ }
 75+
 76+ $width = $width . 'px';
 77+ $height = $height . 'px';
 78+
 79+ $result .= "
 80+ <div id='openlayer_$egOpenLayersOnThisPage' style='width: $width; height: $height; background-color: #cccccc;'></div>
 81+ <script type='$wgJsMimeType'>/*<![CDATA[*/
 82+ initOpenLayer('openlayer_$egOpenLayersOnThisPage', $centre_lon, $centre_lat, $zoom, [$layerItems], [$controlItems],[$markerItems]);
 83+ /*]]>*/</script>";
 84+
 85+ return array($result, 'noparse' => 'true', 'isHTML' => 'true');
 86+ }
 87+
 88+
 89+}
 90+
Index: trunk/extensions/SemanticMaps/OpenLayers/SM_OpenLayersFormInput.php
@@ -0,0 +1,59 @@
 2+<?php
 3+
 4+if (!defined('MEDIAWIKI')) die();
 5+
 6+/**
 7+ * Form input hook that adds an Open Layers map format to Semantic Forms
 8+ *
 9+ * @file SM_OpenLayersFormInput.php
 10+ * @ingroup SemanticMaps
 11+ *
 12+ * @author Jeroen De Dauw
 13+ */
 14+
 15+final class SMOpenLayersFormInput extends SMFormInput {
 16+
 17+ /*
 18+ * This function is a hook for Semantic Forms, and returns the HTML needed in
 19+ * the form to handle coordinate data.
 20+ */
 21+ public static function formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args) {
 22+ global $wgJsMimeType;
 23+ global $egOpenLayersOnThisPage, $egGoogleMapsOnThisPage, $egMapsOpenLayersZoom;
 24+
 25+ SMOpenLayersFormInput::$coordinates = $coordinates;
 26+
 27+ MapsOpenLayers::addOLDependencies(SMOpenLayersFormInput::$formOutput);
 28+ $egOpenLayersOnThisPage++;
 29+
 30+ if (empty($egGoogleMapsOnThisPage)) {
 31+ $egGoogleMapsOnThisPage = 0;
 32+ MapsGoogleMaps::addGMapDependencies(SMYahooMapsFormInput::$formOutput);
 33+ }
 34+
 35+ parent::formInputHTML('open_layer', $egOpenLayersOnThisPage, $input_name, $is_mandatory, $is_disabled, $field_args, 'showOLAddress');
 36+
 37+ if (empty(SMOpenLayersFormInput::$coordinates)) {
 38+ SMOpenLayersFormInput::$zoom = 1;
 39+ } else if (strlen(SMOpenLayersFormInput::$zoom) < 1) {
 40+ SMOpenLayersFormInput::$zoom = $egMapsOpenLayersZoom;
 41+ }
 42+
 43+ $controlItems = MapsOpenLayers::createControlsString(SMOpenLayersFormInput::$controls);
 44+
 45+ $layerItems = MapsOpenLayers::createLayersStringAndLoadDependencies(SMOpenLayersFormInput::$formOutput, SMOpenLayersFormInput::$mapProperties['layers']);
 46+
 47+ $width = SMOpenLayersFormInput::$width . 'px';
 48+ $height = SMOpenLayersFormInput::$height . 'px';
 49+
 50+ SMOpenLayersFormInput::$formOutput .="
 51+ <div id='".SMOpenLayersFormInput::$mapName."' style='width: $width; height: $height; background-color: #cccccc;'></div>
 52+
 53+ <script type='$wgJsMimeType'>/*<![CDATA[*/
 54+ addLoadEvent(makeFormInputOpenLayer('".SMOpenLayersFormInput::$mapName."', '".SMOpenLayersFormInput::$coordsFieldName."', ".SMOpenLayersFormInput::$centre_lat.", ".SMOpenLayersFormInput::$centre_lon.", ".SMOpenLayersFormInput::$zoom.", ".SMOpenLayersFormInput::$marker_lat.", ".SMOpenLayersFormInput::$marker_lon.", [$layerItems], [$controlItems]));
 55+ /*]]>*/</script>";
 56+
 57+ return array(SMOpenLayersFormInput::$formOutput, '');
 58+ }
 59+
 60+}
Index: trunk/extensions/SemanticMaps/INSTALL
@@ -0,0 +1,16 @@
 2+[[Semantic Maps 0.1]]
 3+
 4+Make sure you have Semantic MediaWiki and Maps successfully installed before
 5+proceeding with the installation. Once you have downloaded the code, place
 6+the 'SemanticMaps' directory within your MediaWiki 'extensions' directory.
 7+Then add the following code to your LocalSettings.php file after the lines
 8+that install Maps:
 9+
 10+# Semantic Maps
 11+require_once( "$IP/extensions/SemanticMaps/SemanticMaps.php" );
 12+
 13+The inclusion of extensions should happen in this order: Semantic MediaWiki,
 14+Semantic Forms (if you use it), Semantic Maps. Maps should proceed Semantic
 15+Maps. See the installation instructions of Maps for info about the API keys.
 16+
 17+More information can be found at http://www.mediawiki.org/wiki/Extension:Semantic_Maps#Download_and_installation
\ No newline at end of file
Index: trunk/extensions/SemanticMaps/RELEASE-NOTES
@@ -0,0 +1,6 @@
 2+For a documentation of all features, see http://www.mediawiki.org/wiki/Extension:Semantic_Maps
 3+
 4+== Semantic Maps 0.1 ==
 5+(2009-07-1)
 6+
 7+* Initial release, featuring both result formats and form inputs for Google Maps (+ Google Earth), Yahoo! Maps and OpenLayers
\ No newline at end of file
Index: trunk/extensions/SemanticMaps/SM_MapPrinter.php
@@ -0,0 +1,114 @@
 2+<?php
 3+
 4+/**
 5+ * Abstract class that provides the common functionallity for all map query printers
 6+ *
 7+ * @file SM_MapPrinter.php
 8+ * @ingroup SemanticMaps
 9+ *
 10+ * @author Jeroen De Dauw
 11+ * @author Robert Buzink
 12+ * @author Yaron Koren
 13+ */
 14+
 15+if( !defined( 'MEDIAWIKI' ) ) {
 16+ die( 'Not an entry point.' );
 17+}
 18+
 19+abstract class SMMapPrinter extends SMWResultPrinter {
 20+
 21+ protected $m_locations = array();
 22+
 23+ public function getResult($results, $params, $outputmode) {
 24+ // Skip checks, results with 0 entries are normal
 25+ $this->readParameters($params, $outputmode);
 26+ return $this->getResultText($results, SMW_OUTPUT_HTML);
 27+ }
 28+
 29+ protected function getResultText($res, $outputmode) {
 30+ while ( ($row = $res->getNext()) !== false ) {
 31+ $this->addResultRow($outputmode, $row);
 32+ }
 33+
 34+ $this->m_params = MapsMapper::setDefaultParValues($this->m_params, true);
 35+ }
 36+
 37+ /**
 38+ * This function will loop through all properties (fields) of one record (row),
 39+ * and add the location data, title, label and icon to the m_locations array.
 40+ *
 41+ * @param unknown_type $outputmode
 42+ * @param unknown_type $row The record you want to add data from
 43+ */
 44+ private function addResultRow($outputmode, $row) {
 45+ global $wgUser;
 46+ $skin = $wgUser->getSkin();
 47+
 48+ $title = '';
 49+ $text = '';
 50+ $lat = '';
 51+ $lon = '';
 52+
 53+ // Loop throught all fields of the record
 54+ foreach ($row as $i => $field) {
 55+ $pr = $field->getPrintRequest();
 56+
 57+ // Loop throught all the parts of the field value
 58+ while ( ($object = $field->getNextObject()) !== false ) {
 59+ if ($object->getTypeID() == '_wpg' && $i == 0) {
 60+ $title = $object->getLongText($outputmode, $skin);
 61+ }
 62+
 63+ if ($object->getTypeID() != '_geo' && $i != 0) {
 64+ $text .= $pr->getHTMLText($skin) . ": " . $object->getLongText($outputmode, $skin) . "<br />";
 65+ }
 66+
 67+ if ($pr->getMode() == SMWPrintRequest::PRINT_PROP && $pr->getTypeID() == '_geo') {
 68+ list($lat,$lon) = explode(',', $object->getXSDValue());
 69+ }
 70+ }
 71+ }
 72+
 73+ if (strlen($lat) > 0 && strlen($lon) > 0) {
 74+ $icon = $this->getLocationIcon($row);
 75+ $this->m_locations[] = array($lat, $lon, $title, $text, $icon);
 76+ }
 77+ }
 78+
 79+ /**
 80+ * Get the icon for a row
 81+ *
 82+ * @param unknown_type $row
 83+ * @return unknown
 84+ */
 85+ private function getLocationIcon($row) {
 86+ $icon = '';
 87+ $legend_labels = array();
 88+
 89+ // Look for display_options field, which can be set by Semantic Compound Queries
 90+ if (property_exists($row[0], 'display_options')) {
 91+ if (array_key_exists('icon', $row[0]->display_options)) {
 92+ $icon = $row[0]->display_options['icon'];
 93+
 94+ // This is somewhat of a hack - if a legend label has been set, we're getting it for every point, instead of just once per icon
 95+ if (array_key_exists('legend label', $row[0]->display_options)) {
 96+
 97+ $legend_label = $row[0]->display_options['legend label'];
 98+
 99+ if (! array_key_exists($icon, $legend_labels)) {
 100+ $legend_labels[$icon] = $legend_label;
 101+ }
 102+ }
 103+ }
 104+ // Icon can be set even for regular, non-compound queries If it is, though, we have to translate the name into a URL here
 105+ } elseif (array_key_exists('icon', $this->m_params)) {
 106+
 107+ $icon_title = Title::newFromText($this->m_params['icon']);
 108+ $icon_image_page = new ImagePage($icon_title);
 109+ $icon = $icon_image_page->getDisplayedFile()->getURL();
 110+ }
 111+
 112+ return $icon;
 113+ }
 114+
 115+}
Index: trunk/extensions/SemanticMaps/COPYING
@@ -0,0 +1,348 @@
 2+The license text below "----" applies to all files within this distribution, other
 3+than those that are in a directory which contains files named "LICENSE" or
 4+"COPYING", or a subdirectory thereof. For those files, the license text contained in
 5+said file overrides any license information contained in directories of smaller depth.
 6+Alternative licenses are typically used for software that is provided by external
 7+parties, and merely packaged with the Semantic MediaWiki release for convenience.
 8+----
 9+
 10+ GNU GENERAL PUBLIC LICENSE
 11+ Version 2, June 1991
 12+
 13+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 14+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 15+ Everyone is permitted to copy and distribute verbatim copies
 16+ of this license document, but changing it is not allowed.
 17+
 18+ Preamble
 19+
 20+ The licenses for most software are designed to take away your
 21+freedom to share and change it. By contrast, the GNU General Public
 22+License is intended to guarantee your freedom to share and change free
 23+software--to make sure the software is free for all its users. This
 24+General Public License applies to most of the Free Software
 25+Foundation's software and to any other program whose authors commit to
 26+using it. (Some other Free Software Foundation software is covered by
 27+the GNU Library General Public License instead.) You can apply it to
 28+your programs, too.
 29+
 30+ When we speak of free software, we are referring to freedom, not
 31+price. Our General Public Licenses are designed to make sure that you
 32+have the freedom to distribute copies of free software (and charge for
 33+this service if you wish), that you receive source code or can get it
 34+if you want it, that you can change the software or use pieces of it
 35+in new free programs; and that you know you can do these things.
 36+
 37+ To protect your rights, we need to make restrictions that forbid
 38+anyone to deny you these rights or to ask you to surrender the rights.
 39+These restrictions translate to certain responsibilities for you if you
 40+distribute copies of the software, or if you modify it.
 41+
 42+ For example, if you distribute copies of such a program, whether
 43+gratis or for a fee, you must give the recipients all the rights that
 44+you have. You must make sure that they, too, receive or can get the
 45+source code. And you must show them these terms so they know their
 46+rights.
 47+
 48+ We protect your rights with two steps: (1) copyright the software, and
 49+(2) offer you this license which gives you legal permission to copy,
 50+distribute and/or modify the software.
 51+
 52+ Also, for each author's protection and ours, we want to make certain
 53+that everyone understands that there is no warranty for this free
 54+software. If the software is modified by someone else and passed on, we
 55+want its recipients to know that what they have is not the original, so
 56+that any problems introduced by others will not reflect on the original
 57+authors' reputations.
 58+
 59+ Finally, any free program is threatened constantly by software
 60+patents. We wish to avoid the danger that redistributors of a free
 61+program will individually obtain patent licenses, in effect making the
 62+program proprietary. To prevent this, we have made it clear that any
 63+patent must be licensed for everyone's free use or not licensed at all.
 64+
 65+ The precise terms and conditions for copying, distribution and
 66+modification follow.
 67+
 68+ GNU GENERAL PUBLIC LICENSE
 69+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 70+
 71+ 0. This License applies to any program or other work which contains
 72+a notice placed by the copyright holder saying it may be distributed
 73+under the terms of this General Public License. The "Program", below,
 74+refers to any such program or work, and a "work based on the Program"
 75+means either the Program or any derivative work under copyright law:
 76+that is to say, a work containing the Program or a portion of it,
 77+either verbatim or with modifications and/or translated into another
 78+language. (Hereinafter, translation is included without limitation in
 79+the term "modification".) Each licensee is addressed as "you".
 80+
 81+Activities other than copying, distribution and modification are not
 82+covered by this License; they are outside its scope. The act of
 83+running the Program is not restricted, and the output from the Program
 84+is covered only if its contents constitute a work based on the
 85+Program (independent of having been made by running the Program).
 86+Whether that is true depends on what the Program does.
 87+
 88+ 1. You may copy and distribute verbatim copies of the Program's
 89+source code as you receive it, in any medium, provided that you
 90+conspicuously and appropriately publish on each copy an appropriate
 91+copyright notice and disclaimer of warranty; keep intact all the
 92+notices that refer to this License and to the absence of any warranty;
 93+and give any other recipients of the Program a copy of this License
 94+along with the Program.
 95+
 96+You may charge a fee for the physical act of transferring a copy, and
 97+you may at your option offer warranty protection in exchange for a fee.
 98+
 99+ 2. You may modify your copy or copies of the Program or any portion
 100+of it, thus forming a work based on the Program, and copy and
 101+distribute such modifications or work under the terms of Section 1
 102+above, provided that you also meet all of these conditions:
 103+
 104+ a) You must cause the modified files to carry prominent notices
 105+ stating that you changed the files and the date of any change.
 106+
 107+ b) You must cause any work that you distribute or publish, that in
 108+ whole or in part contains or is derived from the Program or any
 109+ part thereof, to be licensed as a whole at no charge to all third
 110+ parties under the terms of this License.
 111+
 112+ c) If the modified program normally reads commands interactively
 113+ when run, you must cause it, when started running for such
 114+ interactive use in the most ordinary way, to print or display an
 115+ announcement including an appropriate copyright notice and a
 116+ notice that there is no warranty (or else, saying that you provide
 117+ a warranty) and that users may redistribute the program under
 118+ these conditions, and telling the user how to view a copy of this
 119+ License. (Exception: if the Program itself is interactive but
 120+ does not normally print such an announcement, your work based on
 121+ the Program is not required to print an announcement.)
 122+
 123+These requirements apply to the modified work as a whole. If
 124+identifiable sections of that work are not derived from the Program,
 125+and can be reasonably considered independent and separate works in
 126+themselves, then this License, and its terms, do not apply to those
 127+sections when you distribute them as separate works. But when you
 128+distribute the same sections as part of a whole which is a work based
 129+on the Program, the distribution of the whole must be on the terms of
 130+this License, whose permissions for other licensees extend to the
 131+entire whole, and thus to each and every part regardless of who wrote it.
 132+
 133+Thus, it is not the intent of this section to claim rights or contest
 134+your rights to work written entirely by you; rather, the intent is to
 135+exercise the right to control the distribution of derivative or
 136+collective works based on the Program.
 137+
 138+In addition, mere aggregation of another work not based on the Program
 139+with the Program (or with a work based on the Program) on a volume of
 140+a storage or distribution medium does not bring the other work under
 141+the scope of this License.
 142+
 143+ 3. You may copy and distribute the Program (or a work based on it,
 144+under Section 2) in object code or executable form under the terms of
 145+Sections 1 and 2 above provided that you also do one of the following:
 146+
 147+ a) Accompany it with the complete corresponding machine-readable
 148+ source code, which must be distributed under the terms of Sections
 149+ 1 and 2 above on a medium customarily used for software interchange; or,
 150+
 151+ b) Accompany it with a written offer, valid for at least three
 152+ years, to give any third party, for a charge no more than your
 153+ cost of physically performing source distribution, a complete
 154+ machine-readable copy of the corresponding source code, to be
 155+ distributed under the terms of Sections 1 and 2 above on a medium
 156+ customarily used for software interchange; or,
 157+
 158+ c) Accompany it with the information you received as to the offer
 159+ to distribute corresponding source code. (This alternative is
 160+ allowed only for noncommercial distribution and only if you
 161+ received the program in object code or executable form with such
 162+ an offer, in accord with Subsection b above.)
 163+
 164+The source code for a work means the preferred form of the work for
 165+making modifications to it. For an executable work, complete source
 166+code means all the source code for all modules it contains, plus any
 167+associated interface definition files, plus the scripts used to
 168+control compilation and installation of the executable. However, as a
 169+special exception, the source code distributed need not include
 170+anything that is normally distributed (in either source or binary
 171+form) with the major components (compiler, kernel, and so on) of the
 172+operating system on which the executable runs, unless that component
 173+itself accompanies the executable.
 174+
 175+If distribution of executable or object code is made by offering
 176+access to copy from a designated place, then offering equivalent
 177+access to copy the source code from the same place counts as
 178+distribution of the source code, even though third parties are not
 179+compelled to copy the source along with the object code.
 180+
 181+ 4. You may not copy, modify, sublicense, or distribute the Program
 182+except as expressly provided under this License. Any attempt
 183+otherwise to copy, modify, sublicense or distribute the Program is
 184+void, and will automatically terminate your rights under this License.
 185+However, parties who have received copies, or rights, from you under
 186+this License will not have their licenses terminated so long as such
 187+parties remain in full compliance.
 188+
 189+ 5. You are not required to accept this License, since you have not
 190+signed it. However, nothing else grants you permission to modify or
 191+distribute the Program or its derivative works. These actions are
 192+prohibited by law if you do not accept this License. Therefore, by
 193+modifying or distributing the Program (or any work based on the
 194+Program), you indicate your acceptance of this License to do so, and
 195+all its terms and conditions for copying, distributing or modifying
 196+the Program or works based on it.
 197+
 198+ 6. Each time you redistribute the Program (or any work based on the
 199+Program), the recipient automatically receives a license from the
 200+original licensor to copy, distribute or modify the Program subject to
 201+these terms and conditions. You may not impose any further
 202+restrictions on the recipients' exercise of the rights granted herein.
 203+You are not responsible for enforcing compliance by third parties to
 204+this License.
 205+
 206+ 7. If, as a consequence of a court judgment or allegation of patent
 207+infringement or for any other reason (not limited to patent issues),
 208+conditions are imposed on you (whether by court order, agreement or
 209+otherwise) that contradict the conditions of this License, they do not
 210+excuse you from the conditions of this License. If you cannot
 211+distribute so as to satisfy simultaneously your obligations under this
 212+License and any other pertinent obligations, then as a consequence you
 213+may not distribute the Program at all. For example, if a patent
 214+license would not permit royalty-free redistribution of the Program by
 215+all those who receive copies directly or indirectly through you, then
 216+the only way you could satisfy both it and this License would be to
 217+refrain entirely from distribution of the Program.
 218+
 219+If any portion of this section is held invalid or unenforceable under
 220+any particular circumstance, the balance of the section is intended to
 221+apply and the section as a whole is intended to apply in other
 222+circumstances.
 223+
 224+It is not the purpose of this section to induce you to infringe any
 225+patents or other property right claims or to contest validity of any
 226+such claims; this section has the sole purpose of protecting the
 227+integrity of the free software distribution system, which is
 228+implemented by public license practices. Many people have made
 229+generous contributions to the wide range of software distributed
 230+through that system in reliance on consistent application of that
 231+system; it is up to the author/donor to decide if he or she is willing
 232+to distribute software through any other system and a licensee cannot
 233+impose that choice.
 234+
 235+This section is intended to make thoroughly clear what is believed to
 236+be a consequence of the rest of this License.
 237+
 238+ 8. If the distribution and/or use of the Program is restricted in
 239+certain countries either by patents or by copyrighted interfaces, the
 240+original copyright holder who places the Program under this License
 241+may add an explicit geographical distribution limitation excluding
 242+those countries, so that distribution is permitted only in or among
 243+countries not thus excluded. In such case, this License incorporates
 244+the limitation as if written in the body of this License.
 245+
 246+ 9. The Free Software Foundation may publish revised and/or new versions
 247+of the General Public License from time to time. Such new versions will
 248+be similar in spirit to the present version, but may differ in detail to
 249+address new problems or concerns.
 250+
 251+Each version is given a distinguishing version number. If the Program
 252+specifies a version number of this License which applies to it and "any
 253+later version", you have the option of following the terms and conditions
 254+either of that version or of any later version published by the Free
 255+Software Foundation. If the Program does not specify a version number of
 256+this License, you may choose any version ever published by the Free Software
 257+Foundation.
 258+
 259+ 10. If you wish to incorporate parts of the Program into other free
 260+programs whose distribution conditions are different, write to the author
 261+to ask for permission. For software which is copyrighted by the Free
 262+Software Foundation, write to the Free Software Foundation; we sometimes
 263+make exceptions for this. Our decision will be guided by the two goals
 264+of preserving the free status of all derivatives of our free software and
 265+of promoting the sharing and reuse of software generally.
 266+
 267+ NO WARRANTY
 268+
 269+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 270+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
 271+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 272+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 273+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 274+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
 275+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
 276+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 277+REPAIR OR CORRECTION.
 278+
 279+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 280+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 281+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 282+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 283+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 284+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 285+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 286+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 287+POSSIBILITY OF SUCH DAMAGES.
 288+
 289+ END OF TERMS AND CONDITIONS
 290+
 291+ How to Apply These Terms to Your New Programs
 292+
 293+ If you develop a new program, and you want it to be of the greatest
 294+possible use to the public, the best way to achieve this is to make it
 295+free software which everyone can redistribute and change under these terms.
 296+
 297+ To do so, attach the following notices to the program. It is safest
 298+to attach them to the start of each source file to most effectively
 299+convey the exclusion of warranty; and each file should have at least
 300+the "copyright" line and a pointer to where the full notice is found.
 301+
 302+ <one line to give the program's name and a brief idea of what it does.>
 303+ Copyright (C) <year> <name of author>
 304+
 305+ This program is free software; you can redistribute it and/or modify
 306+ it under the terms of the GNU General Public License as published by
 307+ the Free Software Foundation; either version 2 of the License, or
 308+ (at your option) any later version.
 309+
 310+ This program is distributed in the hope that it will be useful,
 311+ but WITHOUT ANY WARRANTY; without even the implied warranty of
 312+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 313+ GNU General Public License for more details.
 314+
 315+ You should have received a copy of the GNU General Public License
 316+ along with this program; if not, write to the Free Software
 317+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 318+
 319+
 320+Also add information on how to contact you by electronic and paper mail.
 321+
 322+If the program is interactive, make it output a short notice like this
 323+when it starts in an interactive mode:
 324+
 325+ Gnomovision version 69, Copyright (C) year name of author
 326+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 327+ This is free software, and you are welcome to redistribute it
 328+ under certain conditions; type `show c' for details.
 329+
 330+The hypothetical commands `show w' and `show c' should show the appropriate
 331+parts of the General Public License. Of course, the commands you use may
 332+be called something other than `show w' and `show c'; they could even be
 333+mouse-clicks or menu items--whatever suits your program.
 334+
 335+You should also get your employer (if you work as a programmer) or your
 336+school, if any, to sign a "copyright disclaimer" for the program, if
 337+necessary. Here is a sample; alter the names:
 338+
 339+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 340+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
 341+
 342+ <signature of Ty Coon>, 1 April 1989
 343+ Ty Coon, President of Vice
 344+
 345+This General Public License does not permit incorporating your program into
 346+proprietary programs. If your program is a subroutine library, you may
 347+consider it more useful to permit linking proprietary applications with the
 348+library. If this is what you want to do, use the GNU Library General
 349+Public License instead of this License.
Index: trunk/extensions/SemanticMaps/SM_FormInput.php
@@ -0,0 +1,110 @@
 2+<?php
 3+
 4+/**
 5+ * Abstract class that provides the common functionallity for all map form inputs
 6+ *
 7+ * @file SM_FormInput.php
 8+ * @ingroup SemanticMaps
 9+ *
 10+ * @author Jeroen De Dauw
 11+ */
 12+
 13+if( !defined( 'MEDIAWIKI' ) ) {
 14+ die( 'Not an entry point.' );
 15+}
 16+
 17+abstract class SMFormInput {
 18+ protected static $formOutput = '';
 19+
 20+ protected static $coordinates;
 21+
 22+ protected static $width;
 23+ protected static $height;
 24+ protected static $zoom;
 25+ protected static $controls;
 26+ protected static $type;
 27+ protected static $autozoom;
 28+ protected static $centre;
 29+ protected static $class;
 30+ protected static $service;
 31+
 32+ protected static $mapName;
 33+ protected static $geocodeFieldName;
 34+ protected static $coordsFieldName;
 35+ protected static $infoFieldName;
 36+
 37+ protected static $mapProperties = array();
 38+
 39+ protected static $marker_lat;
 40+ protected static $marker_lon;
 41+ protected static $centre_lat;
 42+ protected static $centre_lon;
 43+
 44+ public static function formInputHTML($elementNamePrefix, $elementNr, $input_name, $is_mandatory, $is_disabled, $field_args, $showAddresFunction) {
 45+ global $egGoogleMapsKey;
 46+
 47+ SMFormInput::$mapName = $elementNamePrefix.'_'.$elementNr;
 48+ SMFormInput::$geocodeFieldName = $elementNamePrefix.'_geocode_'.$elementNr;
 49+ SMFormInput::$coordsFieldName = $elementNamePrefix.'_coords_'.$elementNr;
 50+ SMFormInput::$infoFieldName = $elementNamePrefix.'_info_'.$elementNr;
 51+
 52+ $mapProperties = MapsMapper::setDefaultParValues($field_args, true);
 53+
 54+ foreach($mapProperties as $paramName => $paramValue) {
 55+ if (property_exists('SMFormInput', $paramName) && $paramName != 'coordinates') {
 56+ SMFormInput::${$paramName} = $paramValue;
 57+ }
 58+ else {
 59+ SMFormInput::$mapProperties[$paramName] = $paramValue;
 60+ }
 61+ }
 62+
 63+ $starting_coords = '';
 64+
 65+ if (empty(SMFormInput::$coordinates)) {
 66+ // If no coordinates exist yet, no marker should be displayed
 67+ SMFormInput::$marker_lat = 'null';
 68+ SMFormInput::$marker_lon = 'null';
 69+ }
 70+ else {
 71+ list(SMFormInput::$marker_lat, SMFormInput::$marker_lon) = MapsUtils::getLatLon(SMFormInput::$coordinates);
 72+ $starting_coords = MapsUtils::latDecimal2Degree(SMFormInput::$marker_lat) . ', ' . MapsUtils::lonDecimal2Degree(SMFormInput::$marker_lon);
 73+ }
 74+
 75+ if (empty(SMFormInput::$centre)) {
 76+ if (isset(SMFormInput::$coordinates)) {
 77+ SMFormInput::$centre_lat = SMFormInput::$marker_lat;
 78+ SMFormInput::$centre_lon = SMFormInput::$marker_lon;
 79+ }
 80+ else {
 81+ SMFormInput::$centre_lat = '0';
 82+ SMFormInput::$centre_lon = '0';
 83+ }
 84+ }
 85+ else {
 86+ list(SMFormInput::$centre_lat, SMFormInput::$centre_lon) = MapsUtils::getLatLon(SMFormInput::$centre);
 87+ }
 88+
 89+ SMFormInput::$autozoom = (SMFormInput::$autozoom == 'no' || SMFormInput::$autozoom == 'off' ? 'false' : 'true');
 90+
 91+ // Retrieve language values
 92+ wfLoadExtensionMessages( 'SemanticMaps' );
 93+ $enter_address_here_text = wfMsg('sm_googlemaps_enteraddresshere');
 94+ $lookup_coordinates_text = wfMsg('sm_googlemaps_lookupcoordinates');
 95+ $not_found_text = wfMsg('sm_googlemaps_notfound');
 96+
 97+ SMFormInput::$formOutput .= "
 98+ <input id='".SMFormInput::$coordsFieldName."' name='$input_name' type='text' value='$starting_coords' size='40'>
 99+ <span id='".SMFormInput::$infoFieldName."' class='error_message'></span>";
 100+
 101+ if (strlen($egGoogleMapsKey) > 0) {
 102+ $adress_field = smfGetDynamicInput(SMFormInput::$geocodeFieldName, $enter_address_here_text, 'size="30" name="geocode" style="color: #707070"');
 103+ SMFormInput::$formOutput .= "
 104+ <p>
 105+ $adress_field
 106+ <input type='submit' onClick=\"$showAddresFunction(document.forms['createbox'].".SMFormInput::$geocodeFieldName.".value, '".SMFormInput::$mapName."', '".SMFormInput::$coordsFieldName."', '$not_found_text'); return false\" value='$lookup_coordinates_text' />
 107+ </p>";
 108+ }
 109+ }
 110+}
 111+
Index: trunk/extensions/SemanticMaps/SemanticMaps.i18n.php
@@ -0,0 +1,30 @@
 2+<?php
 3+
 4+/**
 5+ * Internationalization file for the Semantic Maps extension
 6+ *
 7+ * @file SemanticMaps.i18n.php
 8+ * @ingroup Semantic Maps
 9+ *
 10+ * @author Jeroen De Dauw
 11+*/
 12+
 13+$messages = array();
 14+
 15+/** English
 16+ * @author Jeroen De Dauw
 17+ */
 18+
 19+$messages['en'] = array(
 20+ 'semanticmaps_name' => 'Semantic Maps',
 21+ 'semanticmaps_desc' => 'Provides the ability to view and edit coordinate data stored through the Semantic MediaWiki extension. Available map services: ',
 22+
 23+ 'sm_googlemaps_printername' => 'Google Maps',
 24+ 'sm_googlemaps_lookupcoordinates' => 'Look up coordinates',
 25+ 'sm_googlemaps_enteraddresshere' => 'Enter address here',
 26+ 'sm_googlemaps_notfound' => 'not found',
 27+
 28+ 'sm_yahoomaps_printername' => 'Yahoo! Maps',
 29+
 30+ 'sm_openlayers_printername' => 'Open Layers',
 31+);
\ No newline at end of file
Index: trunk/extensions/SemanticMaps/SM_Mapper.php
@@ -0,0 +1,36 @@
 2+<?php
 3+
 4+/**
 5+ * General map query printer class
 6+ *
 7+ * @file SM_Mapper.php
 8+ * @ingroup SemanticMaps
 9+ *
 10+ * @author Jeroen De Dauw
 11+ */
 12+
 13+if( !defined( 'MEDIAWIKI' ) ) {
 14+ die( 'Not an entry point.' );
 15+}
 16+
 17+final class SMMapper extends SMMapPrinter {
 18+
 19+ protected function getResultText($res, $outputmode) {
 20+ global $egMapsDefaultService;
 21+
 22+ switch ($egMapsDefaultService) {
 23+ case 'openlayers' : case 'layers' :
 24+ $output = SMOpenLayers::getResultText($res, $outputmode);
 25+ break;
 26+ case 'yahoomaps' : case 'yahoo' :
 27+ $output = SMYahooMaps::getResultText($res, $outputmode);
 28+ break;
 29+ default:
 30+ $output = SMGoogleMaps::getResultText($res, $outputmode);
 31+ break;
 32+ }
 33+
 34+ return $output;
 35+ }
 36+
 37+}
\ No newline at end of file
Index: trunk/extensions/SemanticMaps/SemanticMaps.php
@@ -0,0 +1,167 @@
 2+<?php
 3+
 4+/**
 5+ * Initialization file for the Semantic Maps extension.
 6+ * Extension documentation: http://www.mediawiki.org/wiki/Extension:Semantic_Maps
 7+ *
 8+ * @file SemanticMaps.php
 9+ * @ingroup SemanticMaps
 10+ *
 11+ * @author Jeroen De Dauw
 12+ */
 13+
 14+if( !defined( 'MEDIAWIKI' ) ) {
 15+ die( 'Not an entry point.' );
 16+}
 17+
 18+define('SM_VERSION', '0.1');
 19+
 20+$smgScriptPath = $wgScriptPath . '/extensions/SemanticMaps';
 21+$smgIP = $IP . '/extensions/SemanticMaps';
 22+
 23+$wgExtensionFunctions[] = 'smfSetup';
 24+
 25+$wgExtensionMessagesFiles['SemanticMaps'] = $smgIP . '/SemanticMaps.i18n.php';
 26+
 27+// Autoload the general classes
 28+$wgAutoloadClasses['SMMapPrinter'] = $smgIP . '/SM_MapPrinter.php';
 29+$wgAutoloadClasses['SMMapper'] = $smgIP . '/SM_Mapper.php';
 30+$wgAutoloadClasses['SMFormInput'] = $smgIP . '/SM_FormInput.php';
 31+
 32+function smfSetup() {
 33+ global $wgExtensionCredits, $egMapsServices, $wgParser, $wgExtensionCredits;
 34+
 35+ foreach($egMapsServices as $fn) smfInitFormat($fn);
 36+ $services_list = implode(', ', $egMapsServices);
 37+
 38+ wfLoadExtensionMessages( 'SemanticMaps' );
 39+
 40+ $wgExtensionCredits['other'][]= array(
 41+ 'name' => wfMsg('semanticmaps_name'),
 42+ 'version' => SM_VERSION,
 43+ 'author' => array("[http://bn2vs.com Jeroen De Dauw]", "Yaron Koren", "Robert Buzink"),
 44+ 'url' => 'http://www.mediawiki.org/wiki/Extension:Semantic_Maps',
 45+ 'description' => wfMsg('semanticmaps_desc') . $services_list
 46+ );
 47+
 48+ // Add the map services that have form input type hooks to Semantic Forms if it is installed
 49+ global $sfgFormPrinter;
 50+ if ($sfgFormPrinter) {
 51+ $sfgFormPrinter->setInputTypeHook('map', 'selectFormInputHTML', array());
 52+
 53+ $sfgFormPrinter->setInputTypeHook('googlemap', array('SMGoogleMapsFormInput', 'formInputHTML'), array());
 54+ $sfgFormPrinter->setInputTypeHook('googlemaps', array('SMGoogleMapsFormInput', 'formInputHTML'), array());
 55+ $sfgFormPrinter->setInputTypeHook('google', array('SMGoogleMapsFormInput', 'formInputHTML'), array());
 56+
 57+ $sfgFormPrinter->setInputTypeHook('yahoomap', array('SMYahooMapsFormInput', 'formInputHTML'), array());
 58+ $sfgFormPrinter->setInputTypeHook('yahoomaps', array('SMYahooMapsFormInput', 'formInputHTML'), array());
 59+ $sfgFormPrinter->setInputTypeHook('yahoo', array('SMYahooMapsFormInput', 'formInputHTML'), array());
 60+
 61+ $sfgFormPrinter->setInputTypeHook('openlayer', array('SMOpenLayersFormInput', 'formInputHTML'), array());
 62+ $sfgFormPrinter->setInputTypeHook('openlayers', array('SMOpenLayersFormInput', 'formInputHTML'), array());
 63+ $sfgFormPrinter->setInputTypeHook('layers', array('SMOpenLayersFormInput', 'formInputHTML'), array());
 64+ }
 65+
 66+ // Check if $smwgResultFormats, a global variable introduced in SMW 1.2.2, is set
 67+ global $smwgResultFormats;
 68+ if (isset($smwgResultFormats)) {
 69+ $smwgResultFormats['map'] = 'SMMapper';
 70+
 71+ $smwgResultFormats['googlemap'] = 'SMGoogleMaps';
 72+ $smwgResultFormats['googlemaps'] = 'SMGoogleMaps';
 73+ $smwgResultFormats['google'] = 'SMGoogleMaps';
 74+
 75+ $smwgResultFormats['openlayer'] = 'SMOpenLayers';
 76+ $smwgResultFormats['openlayers'] = 'SMOpenLayers';
 77+ $smwgResultFormats['layers'] = 'SMOpenLayers';
 78+
 79+ $smwgResultFormats['yahoomap'] = 'SMYahooMaps';
 80+ $smwgResultFormats['yahoomaps'] = 'SMYahooMaps';
 81+ $smwgResultFormats['yahoo'] = 'SMYahooMaps';
 82+ }
 83+ else {
 84+ SMWQueryProcessor::$formats['map'] = 'SMMapper';
 85+
 86+ SMWQueryProcessor::$formats['googlemap'] = 'SMGoogleMaps';
 87+ SMWQueryProcessor::$formats['googlemaps'] = 'SMGoogleMaps';
 88+ SMWQueryProcessor::$formats['google'] = 'SMGoogleMaps';
 89+
 90+ SMWQueryProcessor::$formats['openlayer'] = 'SMOpenLayers';
 91+ SMWQueryProcessor::$formats['openlayers'] = 'SMOpenLayers';
 92+ SMWQueryProcessor::$formats['layers'] = 'SMOpenLayers';
 93+
 94+ SMWQueryProcessor::$formats['yahoomap'] = 'SMYahooMaps';
 95+ SMWQueryProcessor::$formats['yahoomaps'] = 'SMYahooMaps';
 96+ SMWQueryProcessor::$formats['yahoo'] = 'SMYahooMaps';
 97+ }
 98+}
 99+
 100+/**
 101+ * Initialize the result format depending on the map service
 102+ */
 103+function smfInitFormat( $format ) {
 104+ global $smwgResultFormats, $wgAutoloadClasses, $smgIP;
 105+
 106+ switch ($format) {
 107+ case 'googlemaps':
 108+ $class = 'SMGoogleMaps';
 109+ $file = $smgIP . '/GoogleMaps/SM_GoogleMaps';
 110+ break;
 111+ case 'openlayers':
 112+ $class = 'SMOpenLayers';
 113+ $file = $smgIP . '/OpenLayers/SM_OpenLayers';
 114+ break;
 115+ case 'yahoomaps':
 116+ $class = 'SMYahooMaps';
 117+ $file = $smgIP . '/YahooMaps/SM_YahooMaps';
 118+ break;
 119+ }
 120+
 121+ if (isset($class) && isset($file)) {
 122+ $smwgResultFormats[$format] = $class;
 123+ $wgAutoloadClasses[$class] = $file . ".php";
 124+ $wgAutoloadClasses[$class . "FormInput"] = $file . "FormInput.php";
 125+ }
 126+
 127+}
 128+
 129+/**
 130+ * Class for the form input type 'map'. The relevant form input class is called depending on the provided service.
 131+ *
 132+ * @param unknown_type $coordinates
 133+ * @param unknown_type $input_name
 134+ * @param unknown_type $is_mandatory
 135+ * @param unknown_type $is_disabled
 136+ * @param unknown_type $field_args
 137+ * @return unknown
 138+ */
 139+function selectFormInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args) {
 140+ global $egMapsAvailableServices, $egMapsDefaultService;
 141+
 142+ // If the provided service is not one of the allowed ones, use the default
 143+ if(!in_array($field_args['service'], $egMapsAvailableServices)) $field_args['service'] = $egMapsDefaultService;
 144+
 145+ // Get the form input HTML from the hook corresponding with the provided service
 146+ switch ($field_args['service']) {
 147+ case 'openlayers' : case 'layers' :
 148+ $output = SMOpenLayersFormInput::formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args);
 149+ break;
 150+ case 'yahoomaps' : case 'yahoo' :
 151+ $output = SMYahooMapsFormInput::formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args);
 152+ break;
 153+ default:
 154+ $output = SMGoogleMapsFormInput::formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args);
 155+ break;
 156+ }
 157+
 158+ return $output;
 159+
 160+}
 161+
 162+function smfGetDynamicInput($id, $value, $args='') {
 163+ // By De Dauw Jeroen - November 2008 - http://code.bn2vs.com/viewtopic.php?t=120
 164+ return '<input id="'.$id.'" '.$args.' value="'.$value.'" onfocus="if (this.value==\''.$value.'\') {this.value=\'\';}" onblur="if (this.value==\'\') {this.value=\''.$value.'\';}" />';
 165+}
 166+
 167+
 168+
Index: trunk/extensions/SemanticMaps/GoogleMaps/SM_GoogleMaps.php
@@ -0,0 +1,155 @@
 2+<?php
 3+/**
 4+ * A query printer for maps using the Google Maps API
 5+ *
 6+ * @file SM_GoogleMaps.php
 7+ * @ingroup SemanticMaps
 8+ *
 9+ * @author Robert Buzink
 10+ * @author Yaron Koren
 11+ * @author Jeroen De Dauw
 12+ */
 13+
 14+if( !defined( 'MEDIAWIKI' ) ) {
 15+ die( 'Not an entry point.' );
 16+}
 17+
 18+final class SMGoogleMaps extends SMMapPrinter {
 19+ // TODO: only js that should be printed is a claa to a js function that does all the work
 20+
 21+ public function getName() {
 22+ wfLoadExtensionMessages('SemanticMaps');
 23+ return wfMsg('sm_googlemaps_printername');
 24+ }
 25+
 26+ protected function getResultText($res, $outputmode) {
 27+ parent::getResultText($res, $outputmode);
 28+
 29+ // Go through the array with map parameters and create new variables
 30+ // with the name of the key and value of the item.
 31+ foreach($this->m_params as $paramName => $paramValue) {
 32+ if (empty(${$paramName})) ${$paramName} = $paramValue;
 33+ }
 34+
 35+ global $wgJsMimeType, $egGoogleMapsKey, $egGoogleMapsOnThisPage, $egMapsGoogleMapsZoom;
 36+ global $wgLang;
 37+
 38+ $result = "";
 39+
 40+ if (strlen($zoom) < 1) $zoom = $egMapsGoogleMapsZoom;
 41+
 42+ // TODO: autozoom does not work (accuratly) for GE?
 43+ switch($earth) {
 44+ case 'on' : case 'yes' :
 45+ $earthCode = "map.addMapType(G_SATELLITE_3D_MAP);";
 46+ break;
 47+ default :
 48+ $earthCode = '';
 49+ break;
 50+ }
 51+
 52+ // Get the Google Maps names for the control and map types
 53+ $type = MapsGoogleMaps::getGMapType($type, strlen($earthCode) > 0);
 54+ $control_class = MapsGoogleMaps::getGControlType($controls);
 55+
 56+ $map_text = '';
 57+
 58+ if (empty($egGoogleMapsOnThisPage)) {
 59+ $egGoogleMapsOnThisPage = 0;
 60+ MapsGoogleMaps::addGMapDependencies($map_text);
 61+ }
 62+ $egGoogleMapsOnThisPage++;
 63+
 64+ // Enable the scroll wheel zoom when autozoom is not set to off
 65+ switch($autozoom) {
 66+ case 'no' : case 'off' :
 67+ $autozoomCode = '';
 68+ break;
 69+ default:
 70+ $autozoomCode = 'map.enableScrollWheelZoom();';
 71+ break;
 72+ }
 73+
 74+ $map_text .= <<<END
 75+<div id="map$egGoogleMapsOnThisPage" class="$class"></div>
 76+<script type="text/javascript">
 77+function makeMap{$egGoogleMapsOnThisPage}() {
 78+ if (GBrowserIsCompatible()) {
 79+ var map = new GMap2(document.getElementById("map$egGoogleMapsOnThisPage"), {size: new GSize('$width', '$height')});
 80+ map.setMapType($type);
 81+ map.addControl(new {$control_class}());
 82+ map.addControl(new GMapTypeControl());
 83+ $autozoomCode $earthCode
 84+END;
 85+
 86+ if (count($this->m_locations) > 0) {
 87+ if (empty($centre)) {
 88+ // If the center is not set, it needs to be determined, together with the bounds
 89+ // This is done by extending the bounds with every point (Google Maps API)
 90+ // and then getting the center and zoom level
 91+ $map_text .= "var bounds = new GLatLngBounds();";
 92+
 93+ foreach ($this->m_locations as $i => $location) {
 94+ // Add the markers to the map
 95+ list($lat, $lon, $title, $label, $icon) = $location;
 96+ $title = str_replace("'", "\'", $title);
 97+ $label = str_replace("'", "\'", $label);
 98+ $map_text .= "
 99+ var point = new GLatLng($lat, $lon);
 100+ bounds.extend(point);
 101+ map.addOverlay(createGMarker(point, '$title', '$label', '$icon'));";
 102+ }
 103+
 104+ $map_text .= "map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));";
 105+ }
 106+ else {
 107+ if ($centre == null) {
 108+ $centre_lat = 0;
 109+ $centre_lon = 0;
 110+ }
 111+ else {
 112+ // If the center is set, get the coordinates
 113+ // GLatLng class expects only numbers, no letters or degree symbols
 114+ list($centre_lat, $centre_lon) = MapsUtils::getLatLon($centre);
 115+ }
 116+
 117+ foreach ($this->m_locations as $i => $location) {
 118+ // Add the markers to the map
 119+ list($lat, $lon, $title, $label, $icon) = $location;
 120+ $title = str_replace("'", "\'", $title);
 121+ $label = str_replace("'", "\'", $label);
 122+ $map_text .= "map.addOverlay(createGMarker(new GLatLng($lat, $lon), '$title', '$label', '$icon'));";
 123+ }
 124+
 125+ $map_text .= " map.setCenter(new GLatLng($centre_lat, $centre_lon), $zoom);\n";
 126+ }
 127+ }
 128+
 129+ $map_text .=<<<END
 130+ }
 131+}
 132+addLoadEvent(makeMap{$egGoogleMapsOnThisPage});
 133+</script>
 134+END;
 135+
 136+ $result .= $map_text;
 137+
 138+ // print further results footer
 139+ // getSearchLabel() method was added in SMW 1.3
 140+ if (method_exists($this, 'getSearchLabel')) {
 141+ $search_label = $this->getSearchLabel(SMW_OUTPUT_HTML);
 142+ } else {
 143+ $search_label = $this->mSearchlabel;
 144+ }
 145+ if ( $this->mInline && $res->hasFurtherResults() && $search_label !== '') {
 146+ $link = $res->getQueryLink();
 147+ $link->setCaption($search_label);
 148+ $result .= "\t<tr class=\"smwfooter\"><td class=\"sortbottom\" colspan=\"" . $res->getColumnCount() . '"> ' . $link->getText($outputmode,$this->mLinker) . "</td></tr>\n";
 149+ }
 150+ return array($result, 'noparse' => 'true', 'isHTML' => 'true');
 151+
 152+ }
 153+
 154+
 155+}
 156+
Index: trunk/extensions/SemanticMaps/GoogleMaps/SM_GoogleMapsFormInput.php
@@ -0,0 +1,62 @@
 2+<?php
 3+
 4+/**
 5+ * A class that holds static helper functions and extension hooks for the Google Maps service
 6+ *
 7+ * @file SM_GoogleMapsFormInput.php
 8+ * @ingroup SemanticMaps
 9+ *
 10+ * @author Robert Buzink
 11+ * @author Yaron Koren
 12+ * @author Jeroen De Dauw
 13+ */
 14+
 15+if( !defined( 'MEDIAWIKI' ) ) {
 16+ die( 'Not an entry point.' );
 17+}
 18+
 19+final class SMGoogleMapsFormInput extends SMFormInput {
 20+
 21+ /**
 22+ * This function is a hook for Semantic Forms, and returns the HTML needed in
 23+ * the form to handle coordinate data.
 24+ */
 25+ public static function formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args) {
 26+ global $wgJsMimeType;
 27+ global $egGoogleMapsOnThisPage, $egMapsGoogleMapsZoom;
 28+
 29+ SMGoogleMapsFormInput::$coordinates = $coordinates;
 30+
 31+ if (empty($egGoogleMapsOnThisPage)) {
 32+ $egGoogleMapsOnThisPage = 0;
 33+ MapsGoogleMaps::addGMapDependencies(SMGoogleMapsFormInput::$formOutput);
 34+ }
 35+ $egGoogleMapsOnThisPage++;
 36+
 37+ parent::formInputHTML('map_google', $egGoogleMapsOnThisPage, $input_name, $is_mandatory, $is_disabled, $field_args, 'showGAddress');
 38+
 39+
 40+ if (empty(SMGoogleMapsFormInput::$coordinates)) {
 41+ SMGoogleMapsFormInput::$zoom = 1;
 42+ } else if (strlen(SMGoogleMapsFormInput::$zoom) < 1) {
 43+ SMGoogleMapsFormInput::$zoom = $egMapsGoogleMapsZoom;
 44+ }
 45+
 46+ $enableEarth = SMGoogleMapsFormInput::$mapProperties['earth'] == 'on' || SMGoogleMapsFormInput::$mapProperties['earth'] == 'yes';
 47+ $earth = $enableEarth ? 'true' : 'false';
 48+
 49+ SMGoogleMapsFormInput::$type = MapsGoogleMaps::getGMapType(SMGoogleMapsFormInput::$type, $enableEarth);
 50+ $control = MapsGoogleMaps::getGControlType(SMGoogleMapsFormInput::$controls);
 51+
 52+ SMGoogleMapsFormInput::$formOutput .= "
 53+ <div id='".SMGoogleMapsFormInput::$mapName."' class='".SMGoogleMapsFormInput::$class."'></div>
 54+
 55+ <script type='$wgJsMimeType'>/*<![CDATA[*/
 56+ addLoadEvent(makeFormInputGoogleMap('".SMGoogleMapsFormInput::$mapName."', '".SMGoogleMapsFormInput::$coordsFieldName."', ".SMGoogleMapsFormInput::$width.", ".SMGoogleMapsFormInput::$height.", ".SMGoogleMapsFormInput::$centre_lat.", ".SMGoogleMapsFormInput::$centre_lon.", ".SMGoogleMapsFormInput::$zoom.", ".SMGoogleMapsFormInput::$marker_lat.", ".SMGoogleMapsFormInput::$marker_lon.", ".SMGoogleMapsFormInput::$type.", new $control(), ".SMGoogleMapsFormInput::$autozoom.", $earth));
 57+ window.unload = GUnload;
 58+ /*]]>*/</script>";
 59+
 60+ return array(SMGoogleMapsFormInput::$formOutput, '');
 61+ }
 62+
 63+}
Index: trunk/extensions/SemanticMaps/README
@@ -0,0 +1,14 @@
 2+== About ==
 3+
 4+Semantic Maps is an extension that adds semantic capabilities to the Maps extension,
 5+and therefore provides the ability to add, view and edit coordinate data stored through
 6+the Semantic MediaWiki extension, using multiple mapping services. These include Google
 7+Maps, Open Layers and Yahoo Maps. Semantic Maps and Maps are based on Semantic Google
 8+Maps and Semantic Layers, and are meant to replace these extensions. For this extension
 9+to work, you need to have both Semantic MediaWiki and Maps installed.
 10+
 11+Notes on installing Semantic Maps are found in the file INSTALL.
 12+
 13+== Contributors ==
 14+
 15+http://www.mediawiki.org/wiki/Extension:Semantic_Maps#Contributing_to_the_project

Status & tagging log