Mercurial > linkmap
view linkmap.html @ 0:fb5784aa45e6 default tip
from monotone. problematic https vs v2 API
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sun, 21 Oct 2012 23:03:51 +0800 |
parents | |
children |
line wrap: on
line source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Link Map</title> <style type="text/css"><!-- body{font-family: sans-serif; height:99%; margin:0; padding:0;} html{height:99%; margin:0; padding:0;} #error_log { font-family: Courier, "Courier New", monospace, Fixed; border: 3px solid red; padding: 0.5em; margin: 0.5em; display: none; } #map_canvas { height:99%; width: 100%; margin:0; padding:0; } #legend { font-size: small; background-color: #fff; opacity: 0.7; text-align: left; padding: 0.5em; border: 1px solid black; } #legend div { vertical-align: middle; display: inline-block; margin-right: 1em; } .node_label_id { font-size: smaller; } .node_marker_label { font-size: small; font-weight: bold; color: #800; opacity: 0.9; } //--> </style> <script> // define some constants for colours etc: LINKED_ICON = 'bluedot.png'; UNLINKED_ICON = 'yellowdot.png'; ICON_SIZE_W = 18; ICON_SIZE_H = 18; LINK_COLOUR_5GHZ = '#080'; LINK_COLOUR_2GHZ = '#00f'; LINK_COLOUR_VPN = '#777'; LINK_OPACITY = 0.7; LINK_WIDTH = 4; LEGEND_X_OFFSET = 7; LEGEND_Y_OFFSET = 240; CENTRE_COORDS_LAT = -31.9554; CENTRE_COORDS_LNG = 115.85859; // Note that these don't really help with privacy - people // can always inspect the raw javascript. Manually alter coordinates // if desired. MAX_ZOOM = 13; MIN_ZOOM = 3; INIT_ZOOM = 10; </script> <!-- load the nodes and links. --> <script src="freenet_data.js"></script> <script> var key = { 'localhost': 'ABQIAAAAN6v4BE-QSU4eUIUlNyDwJBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQeuZtV4Gh5jn5-Mzkw8HaJ-hZUxQ', 'matt.ucc.asn.au': 'ABQIAAAAN6v4BE-QSU4eUIUlNyDwJBTcvFJ22Qq_4Wpg4VhVaFRl5W3cyxRmrAk6RVdmqxBPO7KK8gwSWsrFVg', 'www.wafreenet.org': 'ABQIAAAAN6v4BE-QSU4eUIUlNyDwJBRTyFF_GlE7_llDeWLTuKgydpOCLhQydqjQALO8ZGbbZw5VaoTB-DBcMw', }[window.location.host] if (!key) { key = 'ABQIAAAAN6v4BE-QSU4eUIUlNyDwJBTR5ei7CukQRzAV2g5VZ7MlqVyAPxSs6pg6K2o24gSmaclijIuM-Q9KcA'; } document.write([ '<script src="https://maps.google.com/maps?file=api&v=2&key=', key, '" type="text/javascript"><\/script>' ].join('')); </script> <!-- 3rd party labelled marker code --> <script src="labeled_marker.js"></script> <script type="text/javascript"> // define a few constants after loading the gmaps API ICON_SIZE = new GSize(ICON_SIZE_W, ICON_SIZE_H); CENTRE_COORDS = new GLatLng(CENTRE_COORDS_LAT, CENTRE_COORDS_LNG); function add_node(map, nodeid, lat, lng, name, desc, url, is_linked) { var latlng = GLatLng.fromUrlValue('') var latlng = new GLatLng(lat, lng); var icon = new GIcon(G_DEFAULT_ICON); icon.shadow = ""; if (is_linked) { icon.image = LINKED_ICON; } else { icon.image = UNLINKED_ICON; } var middle = new GPoint(ICON_SIZE.width / 2.0, ICON_SIZE.height / 2.0); icon.iconAnchor = middle; icon.infoWindowAnchor = middle; icon.iconSize = ICON_SIZE; var marker_opts = { icon: icon, labelText: '<div class="node_marker_label">' + name + "</div>", labelOffset: new GSize(ICON_SIZE.width/2.0, 0), }; var marker = new LabeledMarker(latlng, marker_opts); var desc_text = ''; if (desc) { desc_text = '<br/>' + desc; } var name_text = nodeid; if (name) { name_text = name; } if (url) { name_text = '<a href="' + url + '">' + name_text + '</a>'; } var myhtml = '<div class="node_label"><b>' + name_text + "</b>" + desc_text + '<br/><div class="node_label_id">' + nodeid + "</div></div>"; GEvent.addListener(marker, "click", function() { map.openInfoWindowHtml(latlng, myhtml); }); map.addOverlay(marker); } function add_link(map, kind, lat1, lng1, lat2, lng2) { var pos1 = new GLatLng(lat1, lng1); var pos2 = new GLatLng(lat2, lng2); var polyOptions = {geodesic:true}; // line styling defined here. var colour = null; if (kind == '2ghz') { colour = LINK_COLOUR_2GHZ; } else if (kind == '5ghz') { colour = LINK_COLOUR_5GHZ; } else if (kind == 'vpn') { colour = LINK_COLOUR_VPN; } else { throw ("Link kind '" + kind + "' is not known."); } var line = new GPolyline([ pos1, pos2, ], colour, LINK_WIDTH, LINK_OPACITY, polyOptions); map.addOverlay(line); } function make_legend(map, legend_html) { // from // http://code.google.com/apis/maps/documentation/examples/control-custom.html function LegendControl() { } LegendControl.prototype = new GControl(); // Creates a one DIV for each of the buttons and places them in a container // DIV which is returned as our control element. We add the control to // to the map container and return the element for the map class to // position properly. LegendControl.prototype.initialize = function(map) { var legendDiv = document.createElement("div"); legendDiv.id = "legend"; legendDiv.innerHTML = legend_html; var container = document.createElement("div"); container.appendChild(legendDiv); map.getContainer().appendChild(container); return container; } // By default, the control will appear in the top left corner of the // map with 7 pixels of padding. LegendControl.prototype.getDefaultPosition = function() { return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(LEGEND_X_OFFSET, LEGEND_Y_OFFSET)); } map.addControl(new LegendControl()); } function limit_zoom(map, minMapScale, maxMapScale) { // get array of map types var mapTypes = map.getMapTypes(); // overwrite the getMinimumResolution() and getMaximumResolution() methods // for each map type for (var i=0; i<mapTypes.length; i++) { mapTypes[i].getMinimumResolution = function() {return minMapScale;} mapTypes[i].getMaximumResolution = function() {return maxMapScale;} } } function initialize() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map_canvas")); // turn on the zoom and terrain/sat buttons var customUI = map.getDefaultUI(); customUI.maptypes.hybrid = false; customUI.controls.scalecontrol = false; map.setUI(customUI); map.setMapType(G_PHYSICAL_MAP); map.enableContinuousZoom(); limit_zoom(map, MIN_ZOOM, MAX_ZOOM); // centered kind of on perth city. map.setCenter(CENTRE_COORDS, INIT_ZOOM); var legend_html = '<div><img src="' + LINKED_ICON + '"/></div><div>Linked Node</div>' + '<br/><div><img src="' + UNLINKED_ICON + '"/></div><div>Unlinked Node</div>' + '<br/><div style="background-color: ' + LINK_COLOUR_5GHZ + '; width: 3em; height: ' + LINK_WIDTH + 'px"></div><div>5GHz Link</div>' + '<br/><div style="background-color: ' + LINK_COLOUR_2GHZ + '; width: 3em; height: ' + LINK_WIDTH + 'px"></div><div>2GHz Link</div>' + '<br/><div style="background-color: ' + LINK_COLOUR_VPN + '; width: 3em; height: ' + LINK_WIDTH + 'px"></div><div>VPN Link</div>' ; ; make_legend(map, legend_html); var linked_nodes = {}; for (var i = 0; i < freenet_links.length; i++) { try { var l = freenet_links[i]; var kind = l[0]; var nodeid1 = l[1]; var nodeid2 = l[2]; var node1 = freenet_nodes[nodeid1]; var node2 = freenet_nodes[nodeid2]; if (node1 == undefined) { throw "Node ID " + nodeid1 + " is not in the node list."; } if (node2 == undefined) { throw "Node ID " + nodeid2 + " is not in the node list."; } if (kind != 'vpn') { linked_nodes[nodeid1] = true; linked_nodes[nodeid2] = true; } var lat1 = node1[0]; var lng1 = node1[1]; var lat2 = node2[0]; var lng2 = node2[1]; add_link(map, kind, lat1, lng1, lat2, lng2); } catch (e) { var error_log = document.getElementById("error_log"); error_log.innerHTML += "Error adding node link '" + l + "': '" + String(e) + "'<br/>"; error_log.style.display = "block"; } } for (var nodeid in freenet_nodes) { var n = freenet_nodes[nodeid]; var lat = n[0]; var lng = n[1]; var name = n[2]; var desc = n[3]; var url = n[4]; var is_linked = linked_nodes[nodeid]; add_node(map, nodeid, lat, lng, name, desc, url, is_linked); } } } </script> </head> <body onload="initialize()" onunload="GUnload()"> <div id="error_log"></div> <div id="map_canvas"></div> </body> </html>