Author: cfinck Date: Sat Feb 16 01:22:18 2008 New Revision: 32384
URL: http://svn.reactos.org/svn/reactos?rev=32384&view=rev Log: - Add an option to use circles instead of markers for the users on the map - Add information about the added users, all users with location data and all users in total - Always enable scroll-wheel zoom, but add an event handler to not scroll the window when the mouse is over the map - Don't close the DB connections implicitly at the end of the scripts, always close them when they are not needed anymore - Firefox doesn't reset the check marks on a reload, so do that manually in some cases
BTW, Translators, feel free to translate the People Map UI!
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_blue.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_cyan.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_green.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_lightgrey.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_red.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_violet.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_white.png (with props) trunk/web/reactos.org/htdocs/peoplemap/images/circle_yellow.png (with props) Modified: trunk/web/reactos.org/htdocs/peoplemap/ajax-deletelocation.php trunk/web/reactos.org/htdocs/peoplemap/ajax-getuser.php trunk/web/reactos.org/htdocs/peoplemap/ajax-setlocation.php trunk/web/reactos.org/htdocs/peoplemap/ie6-fixes.css trunk/web/reactos.org/htdocs/peoplemap/index.php trunk/web/reactos.org/htdocs/peoplemap/lang/de.inc.php trunk/web/reactos.org/htdocs/peoplemap/lang/en.inc.php trunk/web/reactos.org/htdocs/peoplemap/peoplemap.css trunk/web/reactos.org/htdocs/peoplemap/peoplemap.js.php
Modified: trunk/web/reactos.org/htdocs/peoplemap/ajax-deletelocation.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/aj... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/ajax-deletelocation.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/ajax-deletelocation.php Sat Feb 16 01:22:18 2008 @@ -30,6 +30,7 @@ // Delete the location entry $query = "DELETE FROM $DB_PEOPLEMAP.user_locations WHERE roscms_user_id = $userid;"; mysql_query($query, $db) or die("<error>Query failed #2!</error>"); + mysql_close($db); // Just return a success state echo "<deleted />";
Modified: trunk/web/reactos.org/htdocs/peoplemap/ajax-getuser.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/aj... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/ajax-getuser.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/ajax-getuser.php Sat Feb 16 01:22:18 2008 @@ -81,5 +81,6 @@ echo "</user>"; } + mysql_close($db); echo "</userinformation>"; ?>
Modified: trunk/web/reactos.org/htdocs/peoplemap/ajax-setlocation.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/aj... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/ajax-setlocation.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/ajax-setlocation.php Sat Feb 16 01:22:18 2008 @@ -43,6 +43,7 @@ $query = "SELECT user_name, user_fullname FROM $DB_ROSCMS.users WHERE user_id = $userid LIMIT 1;"; $result = mysql_query($query, $db) or die("<error>Query failed #3!</error>"); $row = mysql_fetch_row($result); + mysql_close($db); echo "<userinformation>"; echo "<user>";
Modified: trunk/web/reactos.org/htdocs/peoplemap/ie6-fixes.css URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/ie... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/ie6-fixes.css (original) +++ trunk/web/reactos.org/htdocs/peoplemap/ie6-fixes.css Sat Feb 16 01:22:18 2008 @@ -12,8 +12,16 @@ }
/* Show PNG's with alpha transparency through the AlphaImageLoader filter */ -#toolbox0_image, #toolbox1_image, #toolbox2_image { +#icon_marker, #icon_circle, #toolbox0_image, #toolbox1_image, #toolbox2_image { background: none; +} + +#icon_marker { + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="images/marker_white.png"); +} + +#icon_circle { + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="images/circle_white.png"); }
#toolbox0_image {
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_blue.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_blue.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_cyan.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_cyan.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_green.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_green.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_lightgrey.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_lightgrey.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_red.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_red.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_violet.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_violet.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_white.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_white.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/web/reactos.org/htdocs/peoplemap/images/circle_yellow.png URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/im... ============================================================================== Binary file - no diff available.
Propchange: trunk/web/reactos.org/htdocs/peoplemap/images/circle_yellow.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Modified: trunk/web/reactos.org/htdocs/peoplemap/index.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/in... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/index.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/index.php Sat Feb 16 01:22:18 2008 @@ -88,7 +88,7 @@
<table width="100%" cellspacing="0" cellpadding="0"> <tr> - <td> + <td id="map_td"> <div class="bubble_bg"> <div class="rounded_ll"> <div class="rounded_lr"> @@ -110,6 +110,51 @@ </div> </td> <td id="toolbox_td"> + <div class="bubble_bg"> + <div class="rounded_ll"> + <div class="rounded_lr"> + <div class="rounded_ul"> + <div class="rounded_ur"> + + <div class="bubble"> + <div id="counttext"> + <?php + $db = mysql_connect($DB_HOST, $DB_USER, $DB_PASS) or die("Could not connect to the database!"); + + $query = "SELECT COUNT(*) FROM $DB_ROSCMS.users;"; + $result = mysql_query($query, $db); + $user_count = mysql_result($result, 0); + + $query = "SELECT COUNT(*) FROM $DB_PEOPLEMAP.user_locations;"; + $result = mysql_query($query, $db); + $location_count = mysql_result($result, 0); + + echo $peoplemap_langres["count1"] . "0" . $peoplemap_langres["count2"] . $location_count . $peoplemap_langres["count3"] . $user_count . $peoplemap_langres["count4"]; + + echo "<script type=\"text/javascript\">"; + echo "LocationCount = $location_count;"; + echo "UserCount = $user_count;"; + echo "</script>"; + ?> + </div><br> + + <table> + <tr> + <td><?php echo $peoplemap_langres["icons"]; ?>:</td> + <td><input type="radio" name="icon" value="marker" checked="checked" onclick="SwitchIcon(this.value);"></td> + <td id="icon_marker"></td> + <td><input type="radio" name="icon" value="circle" onclick="SwitchIcon(this.value);"></td> + <td><div id="icon_circle"></div></td> + </tr> + </table> + </div> + + </div> + </div> + </div> + </div> + </div> + <div class="bubble_bg" id="toolbox0_bubble"> <div class="rounded_ll"> <div class="rounded_lr"> @@ -128,8 +173,6 @@ <?php echo $peoplemap_langres["filter_intro"] . "<br><br>"; - // We need a DB connection for getting the user groups and checking if the user is logged in - $db = mysql_connect($DB_HOST, $DB_USER, $DB_PASS) or die("Could not connect to the database!"); $query = "SELECT usrgroup_name_id, usrgroup_name FROM $DB_ROSCMS.usergroups WHERE usrgroup_visible = 1;"; $result = mysql_query($query, $db) or die("Query failed #1!"); @@ -141,7 +184,7 @@ while($row = mysql_fetch_row($result)) { echo "<tr>"; - echo "<td><input type="checkbox" onclick="ToggleUserGroup(this, '" . $row[0] . "');"></td>"; + echo "<td><input type="checkbox" name="usergroups" onclick="ToggleUserGroup(this, '" . $row[0] . "');"></td>"; echo "<td><div class="colorbox" style="background: " . current($MARKERS) . ""></div></td>"; echo "<td>" . $row[1] . "</td>"; echo "<td><img id="ajaxloading_" . $row[0] . "" style="visibility: hidden;" src="images/ajax_loading.gif" alt=""></td>";
Modified: trunk/web/reactos.org/htdocs/peoplemap/lang/de.inc.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/la... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/lang/de.inc.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/lang/de.inc.php Sat Feb 16 01:22:18 2008 @@ -44,4 +44,10 @@ $peoplemap_langres["nousers"] = "Keinen Benutzer mit Ortsdaten gefunden."; $peoplemap_langres["activatejs"] = "Sie müssen JavaScript aktivieren, um die Personen-Karte zu benutzen!"; $peoplemap_langres["unsupportedbrowser"] = "Die Personen-Karte wird von Ihrem Browser nicht unterstützt."; + + $peoplemap_langres["count1"] = "<strong>"; + $peoplemap_langres["count2"] = " von "; + $peoplemap_langres["count3"] = "</strong> Personen mit Positionsdaten werden angezeigt (von "; + $peoplemap_langres["count4"] = " Benutzern insgesamt)"; + $peoplemap_langres["icons"] = "Symbol benutzen"; ?>
Modified: trunk/web/reactos.org/htdocs/peoplemap/lang/en.inc.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/la... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/lang/en.inc.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/lang/en.inc.php Sat Feb 16 01:22:18 2008 @@ -13,7 +13,7 @@
$peoplemap_langres["header"] = '<a href="http://www.reactos.org/">Home</a> > ReactOS People Map'; $peoplemap_langres["title"] = "ReactOS People Map"; - $peoplemap_langres["intro"] = "The following map shows the locations of ReactOS Developers and Users"; + $peoplemap_langres["intro"] = "The following map shows the locations of ReactOS Developers and Users."; $peoplemap_langres["filter"] = "Filter by User Groups"; $peoplemap_langres["filter_intro"] = "Click a Checkbox next to a User Group to add all Users of this Group to the Map or remove them."; @@ -44,4 +44,10 @@ $peoplemap_langres["nousers"] = "No user with location data found!"; $peoplemap_langres["activatejs"] = "You have to activate JavaScript to use the People Map!"; $peoplemap_langres["unsupportedbrowser"] = "The People Map is not supported by your Browser."; + + $peoplemap_langres["count1"] = "Showing <strong>"; + $peoplemap_langres["count2"] = " of "; + $peoplemap_langres["count3"] = "</strong> users with location data (of "; + $peoplemap_langres["count4"] = " users in total)"; + $peoplemap_langres["icons"] = "Icon to use"; ?>
Modified: trunk/web/reactos.org/htdocs/peoplemap/peoplemap.css URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/pe... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/peoplemap.css (original) +++ trunk/web/reactos.org/htdocs/peoplemap/peoplemap.css Sat Feb 16 01:22:18 2008 @@ -20,10 +20,6 @@
a:hover { color: #000000; -} - -tr, td { - vertical-align: top; }
h1 { @@ -191,9 +187,25 @@ background: transparent url(images/lr.gif) no-repeat scroll right bottom; }
+#map_td, #toolbox_td { + vertical-align: top; +} + #toolbox_td { width: 300px; padding-left: 7px; +} + +#icon_marker { + height: 31px; + width: 19px; + background: url(images/marker_white.png) no-repeat; +} + +#icon_circle { + height: 10px; + width: 10px; + background: url(images/circle_white.png) no-repeat center; }
#toolbox0_image, #toolbox1_image, #toolbox2_image {
Modified: trunk/web/reactos.org/htdocs/peoplemap/peoplemap.js.php URL: http://svn.reactos.org/svn/reactos/trunk/web/reactos.org/htdocs/peoplemap/pe... ============================================================================== --- trunk/web/reactos.org/htdocs/peoplemap/peoplemap.js.php (original) +++ trunk/web/reactos.org/htdocs/peoplemap/peoplemap.js.php Sat Feb 16 01:22:18 2008 @@ -10,6 +10,27 @@ var IconTable; var MarkerTable; var MyLocationMarker = null; +var MarkerCount = 0; + +var CircleIcon; +var CurrentIcon; +var CurrentIconPrefix; +var MarkerIcon; + +function UpdateCounts() +{ + document.getElementById("counttext").innerHTML = "<?php echo $peoplemap_langres["count1"]; ?>" + MarkerCount + "<?php echo $peoplemap_langres["count2"]; ?>" + LocationCount + "<?php echo $peoplemap_langres["count3"]; ?>" + UserCount + "<?php echo $peoplemap_langres["count4"]; ?>"; +} + +function GetIconPath(UserGroup) +{ + if(!UserGroup) + IconColor = "white"; + else + IconColor = IconTable[UserGroup]; + + return "images/" + CurrentIconPrefix + "_" + IconColor + ".png"; +}
function AddUserToMap(UserId, UserName, FullName, Latitude, Longitude, UserGroup) { @@ -20,15 +41,10 @@ var IconColor; if(!UserGroup) - { UserGroup = ""; - IconColor = "white"; - } - else - IconColor = IconTable[UserGroup]; - - var Icon = new GIcon(G_DEFAULT_ICON, "images/marker_" + IconColor + ".png"); - var Marker = new GMarker( new GLatLng(Latitude, Longitude), Icon ); + + CurrentIcon.image = GetIconPath(UserGroup); + var Marker = new GMarker( new GLatLng(Latitude, Longitude), CurrentIcon ); var html; html = "<strong><a href="http://reactos.org/roscms/?page=user&sec=profil&sec2=" + UserId + "" target="_blank">" + UserName + "</a></strong><br>"; @@ -38,19 +54,21 @@ html += "<?php echo $peoplemap_langres["latitude"]; ?>: " + parseFloat(Latitude) + "°<br>"; html += "<?php echo $peoplemap_langres["longitude"]; ?>: " + parseFloat(Longitude) + "°<br><br>"; - html += "<a href="javascript:RemoveUserFromMap(" + UserId + ")"><?php echo $peoplemap_langres["removefrommap"]; ?></a>"; - - GEvent.addListener( Marker, "click", function() {Marker.openInfoWindowHtml(html);} ); + html += "<a href="javascript:RemoveUserFromMap(" + UserId + "); UpdateCounts();"><?php echo $peoplemap_langres["removefrommap"]; ?></a>"; MarkerTable[UserId] = new Object(); + MarkerTable[UserId].click = GEvent.addListener( Marker, "click", function() {Marker.openInfoWindowHtml(html);} ); MarkerTable[UserId].group = UserGroup; + MarkerTable[UserId].html = html; MarkerTable[UserId].marker = Marker; + MarkerCount++; Map.addOverlay(Marker); }
function RemoveUserFromMap(UserId) { + MarkerCount--; Map.removeOverlay(MarkerTable[UserId].marker); delete MarkerTable[UserId]; } @@ -167,7 +185,7 @@ var Longitude = users[i].getElementsByTagName("longitude")[0].firstChild.data; html += "<li>"; - html += "<a href="javascript:AddUserToMap(" + UserId + ", '" + UserName + "', '" + FullName + "', " + Latitude + ", " + Longitude + ");">"; + html += "<a href="javascript:AddUserToMap(" + UserId + ", '" + UserName + "', '" + FullName + "', " + Latitude + ", " + Longitude + "); UpdateCounts();">"; html += UserName; html += "</a>"; @@ -209,6 +227,8 @@ AddUserToMap(UserId, UserName, FullName, Latitude, Longitude, UserGroup); } + + UpdateCounts(); } SetLoading(UserGroup, false); @@ -235,31 +255,46 @@ } }
+// Cancel scrolling the window, when the mouse wheel is used while the mouse is in the map +function OnMapMouseScroll(event) +{ + // First hack to get this to work with IE + if(!event) + event = window.event; + + if(event.preventDefault) + { + // The DOM Level 2 way + event.preventDefault(); + } + else + { + // As always, IE also needs an extra handler here.. :-/ + return false; + } +} + function OnWindowResize() { var MinMapHeight = 300; - var MinWndScrollHeight = 800; var MinMapWidth = 500; var SubtractHeight = 300; var SubtractWidth = 500; var MapBox = document.getElementById("map"); var MapHeight; - var WndHeight; var MapWidth; // Set the height if(window.innerHeight) { // All browsers except IE - WndHeight = window.innerHeight; MapHeight = window.innerHeight - SubtractHeight; MapWidth = window.innerWidth - SubtractWidth; } else { // IE in Strict Mode - WndHeight = document.documentElement.clientHeight; MapHeight = document.documentElement.clientHeight - SubtractHeight; MapWidth = document.documentElement.clientWidth - SubtractWidth; } @@ -270,20 +305,14 @@ if(MapWidth < MinMapWidth) MapWidth = MinMapWidth; - if(Map) - { - if(WndHeight < MinWndScrollHeight) - Map.disableScrollWheelZoom(); - else - Map.enableScrollWheelZoom(); - } - MapBox.style.height = String(MapHeight) + "px"; MapBox.style.width = String(MapWidth) + "px"; }
function Load() { + var i; + // Exclude IE 5.5 as well, because it has problems with the CSS cursor attribute and various other stuff if( !GBrowserIsCompatible() || navigator.userAgent.indexOf("MSIE 5.5") >= 0) { @@ -301,11 +330,33 @@ Map.addControl(new GMapTypeControl()); Map.addControl(new GOverviewMapControl(new GSize(150,150))); Map.setCenter(new GLatLng(0, 0), 1); - - // Call it again for enabling/disabling scroll wheel zoom - OnWindowResize(); + Map.enableScrollWheelZoom(); + + // There is no standard way for capturing mouse wheel events + // - The "DOMMouseScroll" event is XUL-specific, so it only works with Gecko browsers + // - onmousewheel works with Safari/WebKit, Opera and IE + if(Map.getContainer().addEventListener) + Map.getContainer().addEventListener("DOMMouseScroll", OnMapMouseScroll, false); + + Map.getContainer().onmousewheel = OnMapMouseScroll; MarkerTable = new Object(); + + // Set up the icons + MarkerIcon = new GIcon(G_DEFAULT_ICON); + CircleIcon = new GIcon(G_DEFAULT_ICON); + CircleIcon.shadow = ""; + CircleIcon.iconSize = new GSize(10, 10); + CircleIcon.shadowSize = null; + CircleIcon.iconAnchor = new GPoint(5, 5); + + // Firefox doesn't reset check marks on a reload, so do that manually here + document.getElementsByName("icon")[0].checked = "checked"; + + for(i = 0; i < document.getElementsByName("usergroups").length; i++) + document.getElementsByName("usergroups")[i].checked = ""; + + SwitchIcon("marker"); }
function Unload() @@ -313,6 +364,41 @@ delete IconTable; delete MarkerTable; GUnload(); +} + +function SwitchIconCreateMarker(id) +{ + // For some reason, this needs to be done in a separate function. Otherwise all markers will always open the info window of the last marker. + var Marker = new GMarker(MarkerTable[id].marker.getLatLng(), CurrentIcon); + + MarkerTable[id].click = GEvent.addListener(Marker, "click", function() {Marker.openInfoWindowHtml(MarkerTable[id].html);} ); + MarkerTable[id].marker = Marker; + Map.addOverlay(Marker); +} + +function SwitchIcon(prefix) +{ + if(CurrentIconPrefix == prefix) + return; + + // Change the current icon and icon prefix + if(prefix == "circle") + CurrentIcon = CircleIcon; + else + CurrentIcon = MarkerIcon; + + CurrentIconPrefix = prefix; + + // Change the icons of all existing markers (we have to recreate them all :-/) + for(id in MarkerTable) + { + GEvent.removeListener(MarkerTable[id].click); + Map.removeOverlay(MarkerTable[id].marker); + + CurrentIcon.image = GetIconPath(MarkerTable[id].group); + SwitchIconCreateMarker(id); + } + }
function ToggleToolbox(id) @@ -372,6 +458,8 @@ if(MarkerTable[id].group == UserGroup) RemoveUserFromMap(id); } + + UpdateCounts(); } }