ym4r_gm 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +22 -0
- data/README.md +467 -0
- data/Rakefile +54 -0
- data/VERSION +2 -0
- data/gmaps_api_key.yml.sample +14 -0
- data/init.rb +3 -0
- data/install.rb +10 -0
- data/javascript/clusterer.js +444 -0
- data/javascript/geoRssOverlay.js +194 -0
- data/javascript/markerGroup.js +114 -0
- data/javascript/wms-gs.js +69 -0
- data/javascript/ym4r-gm.js +117 -0
- data/lib/gm_plugin/control.rb +107 -0
- data/lib/gm_plugin/encoder.rb +395 -0
- data/lib/gm_plugin/geocoding.rb +118 -0
- data/lib/gm_plugin/helper.rb +72 -0
- data/lib/gm_plugin/key.rb +37 -0
- data/lib/gm_plugin/layer.rb +126 -0
- data/lib/gm_plugin/map.rb +301 -0
- data/lib/gm_plugin/mapping.rb +129 -0
- data/lib/gm_plugin/overlay.rb +400 -0
- data/lib/gm_plugin/point.rb +34 -0
- data/lib/tasks/gm_tasks.rake +4 -0
- data/lib/ym4r_gm.rb +12 -0
- data/rakefile.rb +22 -0
- data/test/gm_test.rb +91 -0
- data/ym4r_gm.gemspec +83 -0
- metadata +161 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
// GeoRssOverlay: GMaps API extension to display a group of markers from
|
2
|
+
// a RSS feed
|
3
|
+
//
|
4
|
+
// Copyright 2006 Mikel Maron (email: mikel_maron yahoo com)
|
5
|
+
//
|
6
|
+
// The original version of this code is called MGeoRSS and can be found
|
7
|
+
// at the following address:
|
8
|
+
// http://brainoff.com/gmaps/mgeorss.html
|
9
|
+
//
|
10
|
+
// Modified by Andrew Turner to add support for the GeoRss Simple vocabulary
|
11
|
+
//
|
12
|
+
// Modified and bundled with YM4R in accordance with the following
|
13
|
+
// license:
|
14
|
+
//
|
15
|
+
// This work is public domain
|
16
|
+
|
17
|
+
function GeoRssOverlay(rssurl,icon,proxyurl,options){
|
18
|
+
this.rssurl = rssurl;
|
19
|
+
this.icon = icon;
|
20
|
+
this.proxyurl = proxyurl;
|
21
|
+
if(options['visible'] == undefined)
|
22
|
+
this.visible = true;
|
23
|
+
else
|
24
|
+
this.visible = options['visible'];
|
25
|
+
this.listDiv = options['listDiv']; //ID of the item list DIV
|
26
|
+
this.contentDiv = options['contentDiv']; //ID of the content DIV
|
27
|
+
this.listItemClass = options['listItemClass']; //Class of the list item DIV
|
28
|
+
this.limitItems = options['limit']; //Maximum number of displayed entries
|
29
|
+
this.request = false;
|
30
|
+
this.markers = [];
|
31
|
+
}
|
32
|
+
|
33
|
+
GeoRssOverlay.prototype = new GOverlay();
|
34
|
+
|
35
|
+
GeoRssOverlay.prototype.initialize=function(map) {
|
36
|
+
this.map = map;
|
37
|
+
this.load();
|
38
|
+
}
|
39
|
+
|
40
|
+
GeoRssOverlay.prototype.redraw = function(force){
|
41
|
+
//nothing to do : the markers are already taken care of
|
42
|
+
}
|
43
|
+
|
44
|
+
GeoRssOverlay.prototype.remove = function(){
|
45
|
+
for(var i= 0, len = this.markers.length ; i< len; i++){
|
46
|
+
this.map.removeOverlay(this.markers[i]);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
GeoRssOverlay.prototype.showHide=function() {
|
51
|
+
if (this.visible) {
|
52
|
+
for (var i=0;i<this.markers.length;i++) {
|
53
|
+
this.map.removeOverlay(this.markers[i]);
|
54
|
+
}
|
55
|
+
this.visible = false;
|
56
|
+
} else {
|
57
|
+
for (var i=0;i<this.markers.length;i++) {
|
58
|
+
this.map.addOverlay(this.markers[i]);
|
59
|
+
}
|
60
|
+
this.visible = true;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
GeoRssOverlay.prototype.showMarker = function(id){
|
65
|
+
var marker = this.markers[id];
|
66
|
+
if(marker != undefined){
|
67
|
+
GEvent.trigger(marker,"click");
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
GeoRssOverlay.prototype.copy = function(){
|
72
|
+
var oCopy = new GeoRssOVerlay(this.rssurl,this.icon,this.proxyurl);
|
73
|
+
oCopy.markers = [];
|
74
|
+
for(var i = 0 , len = this.markers.length ;i < len ; i++){
|
75
|
+
oCopy.markers.push(this.markers[i].copy());
|
76
|
+
}
|
77
|
+
return oCopy;
|
78
|
+
}
|
79
|
+
|
80
|
+
GeoRssOverlay.prototype.load=function() {
|
81
|
+
if (this.request != false) {
|
82
|
+
return;
|
83
|
+
}
|
84
|
+
this.request = GXmlHttp.create();
|
85
|
+
if (this.proxyurl != undefined) {
|
86
|
+
this.request.open("GET",this.proxyurl + '?q=' + encodeURIComponent(this.rssurl),true);
|
87
|
+
} else {
|
88
|
+
this.request.open("GET",this.rssurl, true);
|
89
|
+
}
|
90
|
+
var m = this;
|
91
|
+
this.request.onreadystatechange = function() {
|
92
|
+
m.callback();
|
93
|
+
}
|
94
|
+
this.request.send(null);
|
95
|
+
}
|
96
|
+
|
97
|
+
GeoRssOverlay.prototype.callback = function() {
|
98
|
+
if (this.request.readyState == 4) {
|
99
|
+
if (this.request.status == "200") {
|
100
|
+
var xmlDoc = this.request.responseXML;
|
101
|
+
if(xmlDoc.documentElement.getElementsByTagName("item").length != 0){
|
102
|
+
//RSS
|
103
|
+
var items = xmlDoc.documentElement.getElementsByTagName("item");
|
104
|
+
}else if(xmlDoc.documentElement.getElementsByTagName("entry").length != 0){
|
105
|
+
//Atom
|
106
|
+
var items = xmlDoc.documentElement.getElementsByTagName("entry");
|
107
|
+
}
|
108
|
+
for (var i = 0, len = this.limitItems?Math.min(this.limitItems,items.length):items.length; i < len; i++) {
|
109
|
+
try {
|
110
|
+
var marker = this.createMarker(items[i],i);
|
111
|
+
this.markers.push(marker);
|
112
|
+
if(this.visible){
|
113
|
+
this.map.addOverlay(marker);
|
114
|
+
}
|
115
|
+
} catch (e) {
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
this.request = false;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
GeoRssOverlay.prototype.createMarker = function(item,index) {
|
124
|
+
|
125
|
+
var title = item.getElementsByTagName("title")[0].childNodes[0].nodeValue;
|
126
|
+
if(item.getElementsByTagName("description").length != 0){
|
127
|
+
//Rss
|
128
|
+
var description = item.getElementsByTagName("description")[0].childNodes[0].nodeValue;
|
129
|
+
var link = item.getElementsByTagName("link")[0].childNodes[0].nodeValue; }else if(item.getElementsByTagName("summary").length != 0){
|
130
|
+
//Atom
|
131
|
+
var description = item.getElementsByTagName("summary")[0].childNodes[0].nodeValue;
|
132
|
+
var link = item.getElementsByTagName("link")[0].attributes[0].nodeValue;
|
133
|
+
}
|
134
|
+
/* namespaces are handled by spec in moz, not in ie */
|
135
|
+
if (navigator.userAgent.toLowerCase().indexOf("msie") < 0) {
|
136
|
+
if(item.getElementsByTagNameNS("http://www.w3.org/2003/01/geo/wgs84_pos#","lat").length != 0){
|
137
|
+
//W3C Geo Vocabulary
|
138
|
+
var lat = item.getElementsByTagNameNS("http://www.w3.org/2003/01/geo/wgs84_pos#","lat")[0].childNodes[0].nodeValue;
|
139
|
+
var lng = item.getElementsByTagNameNS("http://www.w3.org/2003/01/geo/wgs84_pos#","long")[0].childNodes[0].nodeValue;
|
140
|
+
}else if(item.getElementsByTagNameNS("http://www.georss.org/georss","point").length != 0){
|
141
|
+
|
142
|
+
//Simple
|
143
|
+
var latlng = item.getElementsByTagNameNS("http://www.georss.org/georss","point")[0].childNodes[0].nodeValue.split(" ");
|
144
|
+
var lat = latlng[0];
|
145
|
+
var lng = latlng[1];
|
146
|
+
}
|
147
|
+
} else {
|
148
|
+
|
149
|
+
if(item.getElementsByTagName("geo:lat").length != 0){
|
150
|
+
//W3C Geo Vocabulary
|
151
|
+
var lat = item.getElementsByTagName("geo:lat")[0].childNodes[0].nodeValue;
|
152
|
+
var lng = item.getElementsByTagName("geo:long")[0].childNodes[0].nodeValue;
|
153
|
+
}else if(item.getElementsByTagName("georss:point").length != 0){
|
154
|
+
//Simple
|
155
|
+
var latlng = item.getElementsByTagName("georss:point")[0].childNodes[0].nodeValue.split(" ");
|
156
|
+
var lat = latlng[0];
|
157
|
+
var lng = latlng[1];
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
var point = new GLatLng(parseFloat(lat), parseFloat(lng));
|
162
|
+
var marker = new GMarker(point,{'title': title});
|
163
|
+
var html = "<a href=\"" + link + "\">" + title + "</a><p/>" + description;
|
164
|
+
|
165
|
+
if(this.contentDiv == undefined){
|
166
|
+
GEvent.addListener(marker, "click", function() {
|
167
|
+
marker.openInfoWindowHtml(html);
|
168
|
+
});
|
169
|
+
}else{
|
170
|
+
var contentDiv = this.contentDiv;
|
171
|
+
GEvent.addListener(marker, "click", function() {
|
172
|
+
document.getElementById(contentDiv).innerHTML = html;
|
173
|
+
});
|
174
|
+
}
|
175
|
+
|
176
|
+
if(this.listDiv != undefined){
|
177
|
+
var a = document.createElement('a');
|
178
|
+
a.innerHTML = title;
|
179
|
+
a.setAttribute("href","#");
|
180
|
+
var georss = this;
|
181
|
+
a.onclick = function(){
|
182
|
+
georss.showMarker(index);
|
183
|
+
return false;
|
184
|
+
};
|
185
|
+
var div = document.createElement('div');
|
186
|
+
if(this.listItemClass != undefined){
|
187
|
+
div.setAttribute("class",this.listItemClass);
|
188
|
+
}
|
189
|
+
div.appendChild(a);
|
190
|
+
document.getElementById(this.listDiv).appendChild(div);
|
191
|
+
}
|
192
|
+
|
193
|
+
return marker;
|
194
|
+
}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
function GMarkerGroup(active, markers, markersById) {
|
2
|
+
this.active = active;
|
3
|
+
this.markers = markers || new Array();
|
4
|
+
this.markersById = markersById || new Object();
|
5
|
+
}
|
6
|
+
|
7
|
+
GMarkerGroup.prototype = new GOverlay();
|
8
|
+
|
9
|
+
GMarkerGroup.prototype.initialize = function(map) {
|
10
|
+
this.map = map;
|
11
|
+
|
12
|
+
if(this.active){
|
13
|
+
for(var i = 0 , len = this.markers.length; i < len; i++) {
|
14
|
+
this.map.addOverlay(this.markers[i]);
|
15
|
+
}
|
16
|
+
for(var id in this.markersById){
|
17
|
+
this.map.addOverlay(this.markersById[id]);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
//If not already done (ie if not inactive) remove all the markers from the map
|
23
|
+
GMarkerGroup.prototype.remove = function() {
|
24
|
+
this.deactivate();
|
25
|
+
}
|
26
|
+
|
27
|
+
GMarkerGroup.prototype.redraw = function(force){
|
28
|
+
//Nothing to do : markers are already taken care of
|
29
|
+
}
|
30
|
+
|
31
|
+
//Copy the data to a new Marker Group
|
32
|
+
GMarkerGroup.prototype.copy = function() {
|
33
|
+
var overlay = new GMarkerGroup(this.active);
|
34
|
+
overlay.markers = this.markers; //Need to do deep copy
|
35
|
+
overlay.markersById = this.markersById; //Need to do deep copy
|
36
|
+
return overlay;
|
37
|
+
}
|
38
|
+
|
39
|
+
//Inactivate the Marker group and clear the internal content
|
40
|
+
GMarkerGroup.prototype.clear = function(){
|
41
|
+
//deactivate the map first (which removes the markers from the map)
|
42
|
+
this.deactivate();
|
43
|
+
//Clear the internal content
|
44
|
+
this.markers = new Array();
|
45
|
+
this.markersById = new Object();
|
46
|
+
}
|
47
|
+
|
48
|
+
//Add a marker to the GMarkerGroup ; Adds it now to the map if the GMarkerGroup is active
|
49
|
+
GMarkerGroup.prototype.addMarker = function(marker,id){
|
50
|
+
if(id == undefined){
|
51
|
+
this.markers.push(marker);
|
52
|
+
}else{
|
53
|
+
this.markersById[id] = marker;
|
54
|
+
}
|
55
|
+
if(this.active && this.map != undefined ){
|
56
|
+
this.map.addOverlay(marker);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
//Open the info window (or info window tabs) of a marker
|
61
|
+
GMarkerGroup.prototype.showMarker = function(id){
|
62
|
+
var marker = this.markersById[id];
|
63
|
+
if(marker != undefined){
|
64
|
+
GEvent.trigger(marker,"click");
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
//Activate (or deactivate depending on the argument) the GMarkerGroup
|
69
|
+
GMarkerGroup.prototype.activate = function(active){
|
70
|
+
active = (active == undefined) ? true : active;
|
71
|
+
if(!active){
|
72
|
+
if(this.active){
|
73
|
+
if(this.map != undefined){
|
74
|
+
for(var i = 0 , len = this.markers.length; i < len; i++){
|
75
|
+
this.map.removeOverlay(this.markers[i])
|
76
|
+
}
|
77
|
+
for(var id in this.markersById){
|
78
|
+
this.map.removeOverlay(this.markersById[id]);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
this.active = false;
|
82
|
+
}
|
83
|
+
}else{
|
84
|
+
if(!this.active){
|
85
|
+
if(this.map != undefined){
|
86
|
+
for(var i = 0 , len = this.markers.length; i < len; i++){
|
87
|
+
this.map.addOverlay(this.markers[i]);
|
88
|
+
}
|
89
|
+
for(var id in this.markersById){
|
90
|
+
this.map.addOverlay(this.markersById[id]);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
this.active = true;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
GMarkerGroup.prototype.centerAndZoomOnMarkers = function() {
|
99
|
+
if(this.map != undefined){
|
100
|
+
//merge markers and markersById
|
101
|
+
var tmpMarkers = this.markers.slice();
|
102
|
+
for (var id in this.markersById){
|
103
|
+
tmpMarkers.push(this.markersById[id]);
|
104
|
+
}
|
105
|
+
if(tmpMarkers.length > 0){
|
106
|
+
this.map.centerAndZoomOnMarkers(tmpMarkers);
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
//Deactivate the Group Overlay (convenience method)
|
112
|
+
GMarkerGroup.prototype.deactivate = function(){
|
113
|
+
this.activate(false);
|
114
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
/*
|
2
|
+
* Call generic wms service for GoogleMaps v2
|
3
|
+
* John Deck, UC Berkeley
|
4
|
+
* Inspiration & Code from:
|
5
|
+
* Mike Williams http://www.econym.demon.co.uk/googlemaps2/ V2 Reference & custommap code
|
6
|
+
* Brian Flood http://www.spatialdatalogic.com/cs/blogs/brian_flood/archive/2005/07/11/39.aspx V1 WMS code
|
7
|
+
* Kyle Mulka http://blog.kylemulka.com/?p=287 V1 WMS code modifications
|
8
|
+
* http://search.cpan.org/src/RRWO/GPS-Lowrance-0.31/lib/Geo/Coordinates/MercatorMeters.pm
|
9
|
+
*
|
10
|
+
* Modified by Chris Holmes, TOPP to work by default with GeoServer.
|
11
|
+
*
|
12
|
+
* Bundled with YM4R with John Deck's permission.
|
13
|
+
* Slightly modified to fit YM4R.
|
14
|
+
* See johndeck.blogspot.com for the original version and for examples and instructions of how to use it.
|
15
|
+
*/
|
16
|
+
|
17
|
+
var WGS84_SEMI_MAJOR_AXIS = 6378137.0; //equatorial radius
|
18
|
+
var WGS84_ECCENTRICITY = 0.0818191913108718138;
|
19
|
+
var DEG2RAD=0.0174532922519943;
|
20
|
+
var PI=3.14159267;
|
21
|
+
|
22
|
+
function dd2MercMetersLng(p_lng) {
|
23
|
+
return WGS84_SEMI_MAJOR_AXIS * (p_lng*DEG2RAD);
|
24
|
+
}
|
25
|
+
|
26
|
+
function dd2MercMetersLat(p_lat) {
|
27
|
+
var lat_rad = p_lat * DEG2RAD;
|
28
|
+
return WGS84_SEMI_MAJOR_AXIS * Math.log(Math.tan((lat_rad + PI / 2) / 2) * Math.pow( ((1 - WGS84_ECCENTRICITY * Math.sin(lat_rad)) / (1 + WGS84_ECCENTRICITY * Math.sin(lat_rad))), (WGS84_ECCENTRICITY/2)));
|
29
|
+
}
|
30
|
+
|
31
|
+
function addWMSPropertiesToLayer(tile_layer,base_url,layers,styles,format,merc_proj,use_geo){
|
32
|
+
tile_layer.format = format;
|
33
|
+
tile_layer.baseURL = base_url;
|
34
|
+
tile_layer.styles = styles;
|
35
|
+
tile_layer.layers = layers;
|
36
|
+
tile_layer.mercatorEpsg = merc_proj;
|
37
|
+
tile_layer.useGeographic = use_geo;
|
38
|
+
return tile_layer;
|
39
|
+
}
|
40
|
+
|
41
|
+
getTileUrlForWMS=function(a,b,c) {
|
42
|
+
var lULP = new GPoint(a.x*256,(a.y+1)*256);
|
43
|
+
var lLRP = new GPoint((a.x+1)*256,a.y*256);
|
44
|
+
var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP,b,c);
|
45
|
+
var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP,b,c);
|
46
|
+
|
47
|
+
if (this.useGeographic){
|
48
|
+
var lBbox=lUL.x+","+lUL.y+","+lLR.x+","+lLR.y;
|
49
|
+
var lSRS="EPSG:4326";
|
50
|
+
}else{
|
51
|
+
var lBbox=dd2MercMetersLng(lUL.x)+","+dd2MercMetersLat(lUL.y)+","+dd2MercMetersLng(lLR.x)+","+dd2MercMetersLat(lLR.y);
|
52
|
+
var lSRS="EPSG:" + this.mercatorEpsg;
|
53
|
+
}
|
54
|
+
var lURL=this.baseURL;
|
55
|
+
lURL+="?REQUEST=GetMap";
|
56
|
+
lURL+="&SERVICE=WMS";
|
57
|
+
lURL+="&VERSION=1.1.1";
|
58
|
+
lURL+="&LAYERS="+this.layers;
|
59
|
+
lURL+="&STYLES="+this.styles;
|
60
|
+
lURL+="&FORMAT=image/"+this.format;
|
61
|
+
lURL+="&BGCOLOR=0xFFFFFF";
|
62
|
+
lURL+="&TRANSPARENT=TRUE";
|
63
|
+
lURL+="&SRS="+lSRS;
|
64
|
+
lURL+="&BBOX="+lBbox;
|
65
|
+
lURL+="&WIDTH=256";
|
66
|
+
lURL+="&HEIGHT=256";
|
67
|
+
lURL+="&reaspect=false";
|
68
|
+
return lURL;
|
69
|
+
}
|
@@ -0,0 +1,117 @@
|
|
1
|
+
// JS helper functions for YM4R
|
2
|
+
|
3
|
+
function addInfoWindowToMarker(marker,info,options){
|
4
|
+
GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(info,options);});
|
5
|
+
return marker;
|
6
|
+
}
|
7
|
+
|
8
|
+
function addInfoWindowTabsToMarker(marker,info,options){
|
9
|
+
GEvent.addListener(marker, "click", function() {marker.openInfoWindowTabsHtml(info,options);});
|
10
|
+
return marker;
|
11
|
+
}
|
12
|
+
|
13
|
+
function addPropertiesToLayer(layer,getTile,copyright,opacity,isPng){
|
14
|
+
layer.getTileUrl = getTile;
|
15
|
+
layer.getCopyright = copyright;
|
16
|
+
layer.getOpacity = opacity;
|
17
|
+
layer.isPng = isPng;
|
18
|
+
return layer;
|
19
|
+
}
|
20
|
+
|
21
|
+
function addOptionsToIcon(icon,options){
|
22
|
+
for(var k in options){
|
23
|
+
icon[k] = options[k];
|
24
|
+
}
|
25
|
+
return icon;
|
26
|
+
}
|
27
|
+
|
28
|
+
function addCodeToFunction(func,code){
|
29
|
+
if(func == undefined)
|
30
|
+
return code;
|
31
|
+
else{
|
32
|
+
return function(){
|
33
|
+
func();
|
34
|
+
code();
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
function addGeocodingToMarker(marker,address){
|
40
|
+
marker.orig_initialize = marker.initialize;
|
41
|
+
orig_redraw = marker.redraw;
|
42
|
+
marker.redraw = function(force){}; //empty the redraw method so no error when called by addOverlay.
|
43
|
+
marker.initialize = function(map){
|
44
|
+
new GClientGeocoder().getLatLng(address,
|
45
|
+
function(latlng){
|
46
|
+
if(latlng){
|
47
|
+
marker.redraw = orig_redraw;
|
48
|
+
marker.orig_initialize(map); //init before setting point
|
49
|
+
marker.setPoint(latlng);
|
50
|
+
}//do nothing
|
51
|
+
});
|
52
|
+
};
|
53
|
+
return marker;
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
GMap2.prototype.centerAndZoomOnMarkers = function(markers) {
|
59
|
+
var bounds = new GLatLngBounds(markers[0].getPoint(),
|
60
|
+
markers[0].getPoint());
|
61
|
+
for (var i=1, len = markers.length ; i<len; i++) {
|
62
|
+
bounds.extend(markers[i].getPoint());
|
63
|
+
}
|
64
|
+
|
65
|
+
this.centerAndZoomOnBounds(bounds);
|
66
|
+
}
|
67
|
+
|
68
|
+
GMap2.prototype.centerAndZoomOnPoints = function(points) {
|
69
|
+
var bounds = new GLatLngBounds(points[0],
|
70
|
+
points[0]);
|
71
|
+
for (var i=1, len = points.length ; i<len; i++) {
|
72
|
+
bounds.extend(points[i]);
|
73
|
+
}
|
74
|
+
|
75
|
+
this.centerAndZoomOnBounds(bounds);
|
76
|
+
}
|
77
|
+
|
78
|
+
GMap2.prototype.centerAndZoomOnBounds = function(bounds) {
|
79
|
+
var center = bounds.getCenter();
|
80
|
+
this.setCenter(center, this.getBoundsZoomLevel(bounds));
|
81
|
+
}
|
82
|
+
|
83
|
+
//For full screen mode
|
84
|
+
function setWindowDims(elem) {
|
85
|
+
if (window.innerWidth){
|
86
|
+
elem.style.height = (window.innerHeight) + 'px;';
|
87
|
+
elem.style.width = (window.innerWidth) + 'px;';
|
88
|
+
}else if (document.body.clientWidth){
|
89
|
+
elem.style.width = (document.body.clientWidth) + 'px';
|
90
|
+
elem.style.height = (document.body.clientHeight) + 'px';
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
ManagedMarker = function(markers,minZoom,maxZoom) {
|
95
|
+
this.markers = markers;
|
96
|
+
this.minZoom = minZoom;
|
97
|
+
this.maxZoom = maxZoom;
|
98
|
+
}
|
99
|
+
|
100
|
+
//Add the markers and refresh
|
101
|
+
function addMarkersToManager(manager,managedMarkers){
|
102
|
+
for(var i = 0, length = managedMarkers.length; i < length;i++) {
|
103
|
+
mm = managedMarkers[i];
|
104
|
+
manager.addMarkers(mm.markers,mm.minZoom,mm.maxZoom);
|
105
|
+
}
|
106
|
+
manager.refresh();
|
107
|
+
return manager;
|
108
|
+
}
|
109
|
+
|
110
|
+
|
111
|
+
var INVISIBLE = new GLatLng(0,0); //almost always invisible
|
112
|
+
|
113
|
+
if(self.Event && Event.observe){
|
114
|
+
Event.observe(window, 'unload', GUnload);
|
115
|
+
}else{
|
116
|
+
window.onunload = GUnload;
|
117
|
+
}
|