// file = nodemap3 /* nodemap.js Description : Functions used to create the map and display nodes and coverage zone informations Contributors: Pascal Vitoux (pascal@vitoux.com) Flavien Gateuil (flavien@freephonie.org) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ var map; var markers = new Array(); var currentMarker = null; var firstLoad = true; var status_array = new Array("potential", "active"); var RELOAD = 0; var CONNECT = 1; var DECONNECT = 2; var geocoder = new GClientGeocoder(); var idMarkers = ""; var initialPoint = null; function nextStep() { var latMax = map.getBounds().getNorthEast().lat(); if (distanceBetween(initialPoint, map.getCenter()) >= (latMax-map.getCenter().lat())) { initialPoint = map.getCenter(); loadData(50,0); } } function plusMarkers() { loadData(50,0); } var loading = null; var nbTotal = 0; var nb = 0; var isIE = document.all?true:false; var request = null; function distanceBetween(point1, point2) { return Math.sqrt((point1.lng() - point2.lng()) * (point1.lng() - point2.lng()) + (point1.lat() - point2.lat()) * (point1.lat() - point2.lat())); } function loadData(limit, reset) { if (!loading) { loading = document.createElement("div"); loading.style.position = "absolute"; loading.style.top = (map.getSize().height/2 - 60)+"px"; loading.style.fontSize= "30px"; if (isIE) { //loading.filters.alpha.opacity = 60; } else { loading.style.opacity = 0.6; } loading.style.zIndex = "1000000"; loading.style.textAlign = "center"; loading.id = "loading"; loading.style.background = "white"; loading.style.width = "100%"; loading.innerHTML = "Chargement..."; loading.style.display = "none"; map.container.appendChild(loading); } loading.style.display = "block"; var latMin = map.getBounds().getSouthWest().lat(); var latMax = map.getBounds().getNorthEast().lat(); var lngMin = map.getBounds().getSouthWest().lng(); var lngMax = map.getBounds().getNorthEast().lng(); if (request) { request.abort(); } request = GXmlHttp.create (); request.open ('GET', 'data3.php?reset='+reset+'&latMin='+latMin+'&latMax='+latMax+'&lngMin='+lngMin+'&lngMax='+lngMax+'&limit='+limit+'&idMarkers='+idMarkers, true); idMarkers = ""; request.onreadystatechange = function () { if (request.readyState == 4) { //var xmlDoc = request.responseXML; var xmlDoc = GXml.parse(request.responseText); // Add Nodes which come from the database var markersFromXml = xmlDoc.documentElement.getElementsByTagName ("nodes")[0].getElementsByTagName ("node"); var temp; for (var i = 0; i < markersFromXml.length; i++) { var idUser = parseInt(markersFromXml[i].getAttribute("idUser")); var idMarker = parseInt(markersFromXml[i].getAttribute("idMarker")); var name = markersFromXml[i].getAttribute("name"); var lat = parseFloat(markersFromXml[i].getAttribute("lat")); var lng = parseFloat(markersFromXml[i].getAttribute("lng")); var status = parseInt(markersFromXml[i].getAttribute("status")); var desc = unescape(markersFromXml[i].getAttribute("description")); var IPAddr = markersFromXml[i].getAttribute("IPAddr"); var modemType= parseInt(markersFromXml[i].getAttribute("modemType")); var actif; temp = parseInt(markersFromXml[i].getAttribute("actif")); if (temp != 0) { actif = true; } else { actif = false; } var site = markersFromXml[i].getAttribute("site"); var perso; temp = markersFromXml[i].getAttribute("perso"); if (temp != 0) { perso = true; } else { perso = false; } if (!document.getElementById('showV5').checked) { var markerTemp = new NodeMarker (name, idUser, idMarker, desc, status, lng, lat, IPAddr, modemType, actif, site, perso); markers[markerTemp.name] = markerTemp ; if (markerTemp.perso) { currentMarker = markerTemp; } addMarkerInMap(markerTemp, showWiFiCoverage.checked); idMarkers += idMarker+','; nb++; } else { if (modemType == 5) { var markerTemp = new NodeMarker (name, idUser, idMarker, desc, status, lng, lat, IPAddr, modemType, actif, site, perso); markers[markerTemp.name] = markerTemp ; if (markerTemp.perso) { currentMarker = markerTemp; } addMarkerInMap(markerTemp, showWiFiCoverage.checked); idMarkers += idMarker+','; nb++; } } } if (!note) { note = document.createElement("span"); note.style.position = "absolute"; note.style.bottom = 30+"px"; note.style.left ="0px"; note.style.fontSize= "20px"; if (isIE) { //note.filters.alpha.opacity = 60; } else { note.style.opacity = 0.6; } note.style.zIndex = "1000000"; note.style.textAlign = "left"; note.id = "note"; note.style.background = "white"; map.container.appendChild(note); } if (nb > 0) { note.innerHTML = nb + " marqueurs affichés sur "+nbTotal; } else { note.innerHTML = "0 marqueur affiché sur "+nbTotal; } if (loading) { //map.container.removeChild(loading); loading.style.display = "none"; } } } request.send (null); } // Get different HTML nodes var nodeList; var markerList; var showWiFiCoverage; var showPerso; var showPublic; function createMap () { map = new GMap2(document.getElementById("mapColumn")); map.container = document.getElementById("mapColumn"); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.addControl(new GOverviewMapControl(new GSize(120,120)), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10))); map.setCenter(new GLatLng(MAP_START_LAT, MAP_START_LON), parseInt(MAP_START_ZOOM)); map.setMapType(G_NORMAL_MAP); //map.addControl(new GScaleControl()); var mapTypes = map.getMapTypes(); map.setMapType(mapTypes[MAP_START_TYPE]); GEvent.addListener (map, 'click', function (marker, point) { if (!marker) { addMarker (point.lat(), point.lng()); } }); GEvent.addListener(map, 'dragend', nextStep); GEvent.addListener(map, 'zoomend', nextStep); nodeList = document.getElementById ("nodeList"); markerList = document.getElementById ("markerList"); showWiFiCoverage = document.getElementById ("showZone"); showPerso = document.getElementById("showPerso"); showPublic = document.getElementById("showPublic"); initialPoint = map.getCenter(); loadData(100,1); } var note = null; function addMarkerInMap(marker, WiFiCoverage) { // if (marker.state == 'potential' && document.getElementById('showPotential').checked == false) { // marker.visible = false; // continue; // } else if (marker.state == 'marker' && document.getElementById('showPerso').checked == false) { // marker.visible = false; // continue; // } if (marker.visible) { // Adds the marker in the map map.addOverlay(marker); // Show the WiFi coverage if ((WiFiCoverage)&&(marker.wifi)) { map.addOverlay(marker.wifi); } // Display the markers in the different tabs "Noeuds" and "Mes marqueurs" var liNode = document.createElement('li'); liNode.style.height = "1.5em"; marker.liNode = liNode; if (marker.perso) { liNode.className = "nodeitem-marker"; } else { if (marker.status == POTENTIAL) { liNode.className = "nodeitem-potential-v" + marker.modemType; } else { liNode.className = "nodeitem-v" + marker.modemType; } // liNode.className = "nodeitem-" + status_array[marker.status]; } if (marker.perso) { var divNode = document.createElement("div"); divNode.style.cssFloat = "right"; divNode.style.styleFloat = "right"; divNode.style.paddingRight = "5px"; var aNode = document.createElement("a"); aNode.href = "javascript:removeMarkerFromMap('" + encode64(marker.name) + "');currentMarker=null;void(0);"; aNode.appendChild(document.createTextNode("(x)")); divNode.appendChild(aNode); liNode.appendChild(divNode); } var aNode = document.createElement("a"); aNode.href = "javascript:void(0);"; // aNode.href = "javascript:getMarker('" + encode64(marker.name) + "').select();"; // aNode.onmouseover = function() {getMarker(encode64(marker.name)).showTooltip();}; // aNode.onclick = function() {getMarker(encode64(marker.name)).showTooltip();}; aNode.onclick = function() {getMarker(encode64(marker.name)).select();}; aNode.style.fontweight = "bold"; aNode.appendChild(document.createTextNode(marker.name)); liNode.appendChild(aNode); liNode.appendChild(document.createTextNode(" ")); aNode = document.createElement("a"); aNode.href = "javascript:void(0);"; aNode.onclick = function() {getMarker(encode64(marker.name)).zoomTo();}; aNode.className = "zoomLink"; aNode.appendChild(document.createTextNode("zoom")); liNode.appendChild(aNode); if (marker.perso) { markerList.appendChild(liNode); } else { nodeList.appendChild(liNode); } } } function updateMarker(marker) { if (marker) { removeMarkerFromMap(encode64(marker.name)); marker.name = DEFAULT_NODE_NAME; markers[marker.name] = marker; addMarkerInMap(marker, showWiFiCoverage.checked); marker.openInfoWindowHtml(marker.getHtml()); new EditableElement("editableDesc", 12, marker); } } // Removes the marker from the map function removeMarkerFromMap(markerName64) { var marker = getMarker(markerName64); if (marker.liNode) { if (marker.perso) { markerList.removeChild(marker.liNode); } else { nodeList.removeChild(marker.liNode); } } map.removeOverlay(marker.wifi); map.removeOverlay(marker); marker.destroyTooltip (); delete markers[this.name]; } // Returns the marker associated to the 64-bits name function getMarker (b64index) { var index = decode64 (b64index); return markers[index]; } // Adds a marker to the markers collection function addMarker (lat, lng) { // Check if a marker already exists at the same location for (var key in markers) { if (markers[key].getPoint().lng() == lng & markers[key].getPoint().lat() == lat) { alert ("Un marqueur existe deja a cet endroit."); return; } } if (currentMarker) { // Update the current marker's position var point = new GLatLng(lat, lng); currentMarker.status = POTENTIAL; currentMarker.moveTo(point); } else { // Creation of the new current marker currentMarker= new NodeMarker(DEFAULT_NODE_NAME, -1, -1, 'Cliquez ici pour modifier', POTENTIAL, lng, lat, ip_addr, 5, false, DEFAULT_SITE, true); // Adds the marker to the markers collection markers[currentMarker.name] = currentMarker; // Displays the marker in the Google map addMarkerInMap(currentMarker, showWiFiCoverage.checked); } // Displays the marker's info tooltip if (currentMarker.visible) { currentMarker.destroyTooltip(); currentMarker.select(); } // new EditableElement("editableDesc", 12, currentMarker); resizeMe (); scrollMarkersToBottom(); // Display the "Mes marqueurs" tab showMarkers (); } // Show/Hide the WiFi coverage function showWiFi() { for (key in markers) { if (markers[key].modemType == 5) { //markers[key].wifi.style.display = "none"; map.removeOverlay(markers[key].wifi); if (showWiFiCoverage.checked) { //markers[key].wifi.style.display = "block"; map.addOverlay(markers[key].wifi); } } } } // Show/Hide the personal markers function showPersoMarker() { for (key in markers) { if (markers[key].perso) { markers[key].destroyTooltip(); map.removeOverlay(markers[key].wifi); map.removeOverlay(markers[key]); if (showPerso.checked) { map.addOverlay(markers[key]); if (showWiFiCoverage.checked) { map.addOverlay(markers[key].wifi); } } } } } // Show/Hide the personal markers function showPublicMarkers() { for (key in markers) { if (!markers[key].perso) { markers[key].destroyTooltip(); map.removeOverlay(markers[key].wifi); map.removeOverlay(markers[key]); if (showPublic.checked) { map.addOverlay(markers[key]); if (showWiFiCoverage.checked) { map.addOverlay(markers[key].wifi); } } } } } // Show/Hide the V5 markers only function showV5Markers(val) { var showV5 = document.getElementById("showV5"); for (key in markers) { if (markers[key].modemType != 5) { markers[key].destroyTooltip(); map.removeOverlay(markers[key]); if (!showV5.checked) { map.addOverlay(markers[key]); } } } } function updateMyPersoMarker(typeOfUpdate) { switch (typeOfUpdate) { case RELOAD : break ; case CONNECT : var exists = false; var myMarker = null; for (key in markers) { if ((markers[key].idUser==ID_USER) && (markers[key]!=currentMarker)) { myMarker = markers[key]; exists = true; break; } } if (exists) { if (currentMarker) { removeMarkerFromMap(encode64(currentMarker.name)); } removeMarkerFromMap(encode64(myMarker.name)); currentMarker = new NodeMarker(myMarker.name, myMarker.idUser, myMarker.idMarker, myMarker.description, myMarker.status, myMarker.lng, myMarker.lat, myMarker.IPAddr, myMarker.modemType, myMarker.actif, myMarker.site, true); markers[currentMarker .name] = currentMarker; addMarkerInMap(currentMarker, showWiFiCoverage.checked); } else { if (currentMarker) { updateMarker(currentMarker); } } break; case DECONNECT : if (currentMarker) { var theMarker; removeMarkerFromMap(encode64(currentMarker.name)); if (currentMarker.idMarker == -1) { theMarker = new NodeMarker(DEFAULT_NODE_NAME, -1, -1, 'Cliquez ici', POTENTIAL, currentMarker.getPoint().lng(), currentMarker.getPoint().lat(), ip_addr, '5', true, DEFAULT_SITE, true); currentMarker = theMarker; } else { theMarker= new NodeMarker(currentMarker.name, currentMarker.idUser, currentMarker.idMarker, currentMarker.description, currentMarker.status, currentMarker.pointDB.lng(), currentMarker.pointDB.lat(), currentMarker.IPAddr, currentMarker.modemType, currentMarker.actif, currentMarker.site, false); currentMarker = null; } markers[theMarker.name] = theMarker; addMarkerInMap(theMarker, showWiFiCoverage.checked); } break ; default : break; } } // some helper functions // based on code from // http://www.activsoftware.com/code_samples/code.cfm/CodeID/59/JavaScript/Get_Query_String_variables_in_JavaScript function getQueryVariable (variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i=0;i