1 | var map; |
---|
2 | // Leo 090504. Arrays to hold values for median calculation. |
---|
3 | var latArray=new Array(); |
---|
4 | var lonArray=new Array(); |
---|
5 | var numCoords; |
---|
6 | var ignoreMove = false; |
---|
7 | var centerMap = false; |
---|
8 | |
---|
9 | |
---|
10 | // Calculates median from array. leo.erlandsson@piratpartiet.se 2009-05-04 |
---|
11 | function median(a) { |
---|
12 | |
---|
13 | a.sort(); |
---|
14 | |
---|
15 | if(a.length == 0) |
---|
16 | return 0; |
---|
17 | |
---|
18 | if(a.length % 2 == 0) |
---|
19 | return (a[(a.length/2)-1] + a[(a.length/2)]) / 2.0; |
---|
20 | else |
---|
21 | return a[Math.floor(a.length/2)]; |
---|
22 | } |
---|
23 | |
---|
24 | function createMarker(input) { |
---|
25 | var marker = new GMarker(new GLatLng(input.point.lat, |
---|
26 | input.point.lon)); |
---|
27 | |
---|
28 | // Leo 090504. Store coordinates for median calculation |
---|
29 | latArray[numCoords] = input.point.lat; |
---|
30 | lonArray[numCoords] = input.point.lon; |
---|
31 | |
---|
32 | numCoords++; |
---|
33 | |
---|
34 | GEvent.addListener(marker, "click", function() { |
---|
35 | html = "<div class=\"markerinfowindow\">"; |
---|
36 | html += "<strong>" + input.info + "</strong><br />"; |
---|
37 | html += "<span style=\"font-size: smaller;\">"; |
---|
38 | html += input.early ? "Förtidsröstningslokal" : "Vallokal"; |
---|
39 | html += "</span><br />"; |
---|
40 | |
---|
41 | html += "<p>"; |
---|
42 | for (var i = 0; i < input.address.length; i++) { |
---|
43 | if (input.address[i].length > 0) |
---|
44 | html += input.address[i] + "<br />"; |
---|
45 | } |
---|
46 | html += "</p>"; |
---|
47 | html += "</div>"; |
---|
48 | |
---|
49 | ignoreMove = true; |
---|
50 | marker.openInfoWindowHtml(html); |
---|
51 | setTimeout(function() { |
---|
52 | ignoreMove = false; |
---|
53 | }, 1000); |
---|
54 | }); |
---|
55 | |
---|
56 | return marker; |
---|
57 | } |
---|
58 | |
---|
59 | function parseJson (doc) { |
---|
60 | |
---|
61 | numCoords = 0; |
---|
62 | try { |
---|
63 | var jsonData = eval("(" + doc + ")"); |
---|
64 | } catch (ex) { |
---|
65 | map.clearOverlays(); |
---|
66 | $('mapinfo').set('text', 'För många markeringar på kartan. Zooma in mer för att visa.'); |
---|
67 | $('mapinfo').setStyle('display', 'block'); |
---|
68 | return; |
---|
69 | } |
---|
70 | map.clearOverlays(); |
---|
71 | for (var i = 0; i < jsonData.markers.length; i++) { |
---|
72 | var marker = createMarker(jsonData.markers[i]); |
---|
73 | map.addOverlay(marker); |
---|
74 | } |
---|
75 | if (centerMap) { |
---|
76 | if (numCoords > 1) { |
---|
77 | // Leo 090504. Get median point. |
---|
78 | centerLat = median(latArray); |
---|
79 | centerLon = median(lonArray); |
---|
80 | ignoreMove = true; |
---|
81 | map.setCenter(new GLatLng(centerLat, centerLon), 8); |
---|
82 | } |
---|
83 | centerMap = false; |
---|
84 | } |
---|
85 | $('mapinfo').setStyle('display', 'none'); |
---|
86 | } |
---|
87 | |
---|
88 | function fetchMarkers(url) { |
---|
89 | GDownloadUrl(url, function(data, responseCode) { parseJson(data); }); |
---|
90 | } |
---|
91 | |
---|
92 | function fetchMarkersFromBounds() |
---|
93 | { |
---|
94 | if (ignoreMove) { |
---|
95 | ignoreMove = false; |
---|
96 | return; |
---|
97 | } |
---|
98 | var bounds = map.getBounds(); |
---|
99 | var sw = bounds.getSouthWest(); |
---|
100 | var ne = bounds.getNorthEast(); |
---|
101 | var left = sw.lat(); |
---|
102 | var right = ne.lat(); |
---|
103 | var top = sw.lng(); |
---|
104 | var bottom = ne.lng(); |
---|
105 | |
---|
106 | $('mapinfo').set('text', 'Laddar markeringar...'); |
---|
107 | $('mapinfo').setStyle('display', 'block'); |
---|
108 | GDownloadUrl('/json/markers/by_boundaries/?left='+left+'&top='+top+'&right='+right+'&bottom='+bottom, |
---|
109 | function(data, responseCode) { parseJson(data); }); |
---|
110 | } |
---|
111 | |
---|
112 | window.addEvent('domready', function(){ |
---|
113 | if (GBrowserIsCompatible()) { |
---|
114 | map = new GMap2(document.getElementById("map_canvas")); |
---|
115 | map.setCenter(new GLatLng(63.105423, 14.441013), 4); |
---|
116 | map.setUIToDefault(); |
---|
117 | |
---|
118 | centerMap = true; |
---|
119 | fetchMarkers(getMarkersUrl()); |
---|
120 | |
---|
121 | if (IS_DEBUG) { |
---|
122 | GEvent.addListener(map, "moveend", function() { fetchMarkersFromBounds() }); |
---|
123 | } |
---|
124 | } |
---|
125 | }); |
---|