gmaps4rails 0.9.1 → 0.10.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +23 -11
- data/app/views/gmaps4rails/_gmaps4rails.html.erb +35 -8
- data/lib/{gmaps4rails/generators → generators}/gmaps4rails/install_generator.rb +0 -0
- data/lib/{gmaps4rails/generators → generators}/templates/README +0 -0
- data/lib/gmaps4rails.rb +2 -2
- data/lib/gmaps4rails/acts_as_gmappable.rb +2 -2
- data/lib/gmaps4rails/base.rb +8 -4
- data/lib/gmaps4rails/extensions/array.rb +2 -2
- data/lib/gmaps4rails/extensions/hash.rb +19 -19
- data/public/javascripts/gmaps4rails.bing.js +195 -0
- data/public/javascripts/gmaps4rails.googlemaps.js +263 -0
- data/public/javascripts/gmaps4rails.js +444 -675
- data/public/javascripts/gmaps4rails.mapquest.js +172 -0
- data/public/javascripts/gmaps4rails.openlayers.js +259 -0
- data/public/stylesheets/gmaps4rails.css +9 -0
- data/test/dummy/app/controllers/users_controller.rb +1 -2
- data/test/dummy/app/helpers/application_helper.rb +0 -1
- data/test/dummy/app/models/user.rb +11 -6
- data/test/dummy/spec/base/base_spec.rb +3 -3
- data/test/dummy/spec/models/user_spec.rb +19 -5
- metadata +21 -14
@@ -0,0 +1,263 @@
|
|
1
|
+
//Map settings
|
2
|
+
Gmaps4Rails.map_options.disableDefaultUI = false;
|
3
|
+
Gmaps4Rails.map_options.disableDoubleClickZoom = false;
|
4
|
+
Gmaps4Rails.map_options.type = "ROADMAP"; // HYBRID, ROADMAP, SATELLITE, TERRAIN
|
5
|
+
|
6
|
+
//markers + info styling
|
7
|
+
Gmaps4Rails.markers_conf.clusterer_gridSize = 50;
|
8
|
+
Gmaps4Rails.markers_conf.clusterer_maxZoom = 5;
|
9
|
+
Gmaps4Rails.markers_conf.custom_cluster_pictures = null;
|
10
|
+
Gmaps4Rails.markers_conf.custom_infowindow_class = null;
|
11
|
+
|
12
|
+
//Polygon Styling
|
13
|
+
Gmaps4Rails.polygons_conf = { // default style for polygons
|
14
|
+
strokeColor: "#FFAA00",
|
15
|
+
strokeOpacity: 0.8,
|
16
|
+
strokeWeight: 2,
|
17
|
+
fillColor: "#000000",
|
18
|
+
fillOpacity: 0.35
|
19
|
+
};
|
20
|
+
|
21
|
+
//Polyline Styling
|
22
|
+
Gmaps4Rails.polylines_conf = { //default style for polylines
|
23
|
+
strokeColor: "#FF0000",
|
24
|
+
strokeOpacity: 1,
|
25
|
+
strokeWeight: 2
|
26
|
+
};
|
27
|
+
|
28
|
+
//Circle Styling
|
29
|
+
Gmaps4Rails.circles_conf = { //default style for circles
|
30
|
+
fillColor: "#00AAFF",
|
31
|
+
fillOpacity: 0.35,
|
32
|
+
strokeColor: "#FFAA00",
|
33
|
+
strokeOpacity: 0.8,
|
34
|
+
strokeWeight: 2,
|
35
|
+
clickable: false,
|
36
|
+
zIndex: null
|
37
|
+
};
|
38
|
+
|
39
|
+
//Direction Settings
|
40
|
+
Gmaps4Rails.direction_conf = {
|
41
|
+
panel_id: null,
|
42
|
+
display_panel: false,
|
43
|
+
origin: null,
|
44
|
+
destination: null,
|
45
|
+
waypoints: [], //[{location: "toulouse,fr", stopover: true}, {location: "Clermont-Ferrand, fr", stopover: true}]
|
46
|
+
optimizeWaypoints: false,
|
47
|
+
unitSystem: "METRIC", //IMPERIAL
|
48
|
+
avoidHighways: false,
|
49
|
+
avoidTolls: false,
|
50
|
+
region: null,
|
51
|
+
travelMode: "DRIVING" //WALKING, BICYCLING
|
52
|
+
};
|
53
|
+
|
54
|
+
////////////////////////////////////////////////////
|
55
|
+
/////////////// Basic Objects //////////////
|
56
|
+
////////////////////////////////////////////////////
|
57
|
+
|
58
|
+
Gmaps4Rails.createPoint = function(lat, lng){
|
59
|
+
return new google.maps.Point(lat, lng);
|
60
|
+
};
|
61
|
+
|
62
|
+
Gmaps4Rails.createLatLng = function(lat, lng){
|
63
|
+
return new google.maps.LatLng(lat, lng);
|
64
|
+
};
|
65
|
+
|
66
|
+
Gmaps4Rails.createLatLngBounds = function(){
|
67
|
+
return new google.maps.LatLngBounds();
|
68
|
+
};
|
69
|
+
|
70
|
+
Gmaps4Rails.createMap = function(){
|
71
|
+
return new google.maps.Map(document.getElementById(Gmaps4Rails.map_options.id), {
|
72
|
+
maxZoom: Gmaps4Rails.map_options.maxZoom,
|
73
|
+
minZoom: Gmaps4Rails.map_options.minZoom,
|
74
|
+
zoom: Gmaps4Rails.map_options.zoom,
|
75
|
+
center: Gmaps4Rails.createLatLng(this.map_options.center_latitude, this.map_options.center_longitude),
|
76
|
+
mapTypeId: google.maps.MapTypeId[this.map_options.type],
|
77
|
+
mapTypeControl: Gmaps4Rails.map_options.mapTypeControl,
|
78
|
+
disableDefaultUI: Gmaps4Rails.map_options.disableDefaultUI,
|
79
|
+
disableDoubleClickZoom: Gmaps4Rails.map_options.disableDoubleClickZoom,
|
80
|
+
draggable: Gmaps4Rails.map_options.draggable
|
81
|
+
});
|
82
|
+
};
|
83
|
+
|
84
|
+
Gmaps4Rails.createMarkerImage = function(markerPicture, markerSize, origin, anchor, scaledSize) {
|
85
|
+
return new google.maps.MarkerImage(markerPicture, markerSize, origin, anchor, scaledSize);
|
86
|
+
};
|
87
|
+
|
88
|
+
|
89
|
+
Gmaps4Rails.createSize = function(width, height){
|
90
|
+
return new google.maps.Size(width, height);
|
91
|
+
};
|
92
|
+
|
93
|
+
////////////////////////////////////////////////////
|
94
|
+
////////////////////// Markers /////////////////////
|
95
|
+
////////////////////////////////////////////////////
|
96
|
+
|
97
|
+
Gmaps4Rails.createMarker = function(args){
|
98
|
+
var markerLatLng = Gmaps4Rails.createLatLng(args.Lat, args.Lng);
|
99
|
+
|
100
|
+
// Marker sizes are expressed as a Size of X,Y
|
101
|
+
if (args.marker_picture === "" ) {
|
102
|
+
return new google.maps.Marker({position: markerLatLng, map: Gmaps4Rails.map, title: args.marker_title, draggable: args.marker_draggable});
|
103
|
+
} else {
|
104
|
+
// calculate MarkerImage anchor location
|
105
|
+
var imageAnchorPosition = this.createImageAnchorPosition(args.marker_anchor);
|
106
|
+
var shadowAnchorPosition = this.createImageAnchorPosition(args.shadow_anchor);
|
107
|
+
|
108
|
+
//create or retrieve existing MarkerImages
|
109
|
+
var markerImage = this.createOrRetrieveImage(args.marker_picture, args.marker_width, args.marker_height, imageAnchorPosition);
|
110
|
+
var shadowImage = this.createOrRetrieveImage(args.shadow_picture, args.shadow_width, args.shadow_height, shadowAnchorPosition);
|
111
|
+
|
112
|
+
return new google.maps.Marker({position: markerLatLng, map: this.map, icon: markerImage, title: args.marker_title, draggable: args.marker_draggable, shadow: shadowImage});
|
113
|
+
}
|
114
|
+
};
|
115
|
+
|
116
|
+
//checks if obj is included in arr Array and returns the position or false
|
117
|
+
Gmaps4Rails.includeMarkerImage = function(arr, obj) {
|
118
|
+
for(var i=0; i<arr.length; i++) {
|
119
|
+
if (arr[i].url == obj) {return i;}
|
120
|
+
}
|
121
|
+
return false;
|
122
|
+
};
|
123
|
+
|
124
|
+
// checks if MarkerImage exists before creating a new one
|
125
|
+
// returns a MarkerImage or false if ever something wrong is passed as argument
|
126
|
+
Gmaps4Rails.createOrRetrieveImage = function(currentMarkerPicture, markerWidth, markerHeight, imageAnchorPosition){
|
127
|
+
if (currentMarkerPicture === "" || currentMarkerPicture === null )
|
128
|
+
{ return null;}
|
129
|
+
|
130
|
+
var test_image_index = this.includeMarkerImage(this.markerImages, currentMarkerPicture);
|
131
|
+
switch (test_image_index)
|
132
|
+
{
|
133
|
+
case false:
|
134
|
+
var markerImage = Gmaps4Rails.createMarkerImage(currentMarkerPicture, Gmaps4Rails.createSize(markerWidth, markerHeight), null, imageAnchorPosition, null );
|
135
|
+
this.markerImages.push(markerImage);
|
136
|
+
return markerImage;
|
137
|
+
break;
|
138
|
+
default:
|
139
|
+
if (typeof test_image_index == 'number') { return this.markerImages[test_image_index]; }
|
140
|
+
else { return false; }
|
141
|
+
break;
|
142
|
+
}
|
143
|
+
};
|
144
|
+
|
145
|
+
// clear markers
|
146
|
+
Gmaps4Rails.clearMarkers = function() {
|
147
|
+
for (var i = 0; i < this.markers.length; ++i) {
|
148
|
+
this.clearMarker(this.markers[i]);
|
149
|
+
}
|
150
|
+
};
|
151
|
+
|
152
|
+
//show and hide markers
|
153
|
+
Gmaps4Rails.showMarkers = function() {
|
154
|
+
for (var i = 0; i < this.markers.length; ++i) {
|
155
|
+
this.showMarker(this.markers[i]);
|
156
|
+
}
|
157
|
+
};
|
158
|
+
|
159
|
+
Gmaps4Rails.hideMarkers = function() {
|
160
|
+
for (var i = 0; i < this.markers.length; ++i) {
|
161
|
+
this.hideMarker(this.markers[i]);
|
162
|
+
}
|
163
|
+
};
|
164
|
+
|
165
|
+
Gmaps4Rails.clearMarker = function(marker) {
|
166
|
+
marker.serviceObject.setMap(null);
|
167
|
+
};
|
168
|
+
|
169
|
+
Gmaps4Rails.showMarker = function(marker) {
|
170
|
+
marker.serviceObject.setVisible(true);
|
171
|
+
};
|
172
|
+
|
173
|
+
Gmaps4Rails.hideMarker = function(marker) {
|
174
|
+
marker.serviceObject.setVisible(false);
|
175
|
+
};
|
176
|
+
|
177
|
+
Gmaps4Rails.extendBoundsWithMarkers = function(){
|
178
|
+
for (var i = 0; i < Gmaps4Rails.markers.length; ++i) {
|
179
|
+
Gmaps4Rails.boundsObject.extend(Gmaps4Rails.markers[i].serviceObject.position);
|
180
|
+
}
|
181
|
+
};
|
182
|
+
|
183
|
+
////////////////////////////////////////////////////
|
184
|
+
/////////////////// Clusterer //////////////////////
|
185
|
+
////////////////////////////////////////////////////
|
186
|
+
|
187
|
+
Gmaps4Rails.createClusterer = function(markers_array){
|
188
|
+
return new MarkerClusterer( Gmaps4Rails.map,
|
189
|
+
markers_array,
|
190
|
+
{ maxZoom: Gmaps4Rails.markers_conf.clusterer_maxZoom, gridSize: Gmaps4Rails.markers_conf.clusterer_gridSize, styles: Gmaps4Rails.customClusterer() }
|
191
|
+
);
|
192
|
+
};
|
193
|
+
|
194
|
+
Gmaps4Rails.clearClusterer = function() {
|
195
|
+
this.markerClusterer.clearMarkers();
|
196
|
+
};
|
197
|
+
|
198
|
+
//creates clusters
|
199
|
+
Gmaps4Rails.clusterize = function()
|
200
|
+
{
|
201
|
+
if (this.markers_conf.do_clustering === true)
|
202
|
+
{
|
203
|
+
//first clear the existing clusterer if any
|
204
|
+
if (this.markerClusterer !== null) {
|
205
|
+
this.clearClusterer();
|
206
|
+
}
|
207
|
+
|
208
|
+
var markers_array = new Array;
|
209
|
+
for (var i = 0; i < this.markers.length; ++i) {
|
210
|
+
markers_array.push(this.markers[i].serviceObject);
|
211
|
+
}
|
212
|
+
|
213
|
+
this.markerClusterer = Gmaps4Rails.createClusterer(markers_array);
|
214
|
+
}
|
215
|
+
};
|
216
|
+
|
217
|
+
////////////////////////////////////////////////////
|
218
|
+
/////////////////// INFO WINDOW ////////////////////
|
219
|
+
////////////////////////////////////////////////////
|
220
|
+
|
221
|
+
// creates infowindows
|
222
|
+
Gmaps4Rails.createInfoWindow = function(marker_container){
|
223
|
+
var info_window;
|
224
|
+
if (this.markers_conf.custom_infowindow_class === null && Gmaps4Rails.exists(marker_container.description)) {
|
225
|
+
//create the infowindow
|
226
|
+
info_window = new google.maps.InfoWindow({content: marker_container.description });
|
227
|
+
//add the listener associated
|
228
|
+
google.maps.event.addListener(marker_container.serviceObject, 'click', this.openInfoWindow(info_window, marker_container.serviceObject));
|
229
|
+
}
|
230
|
+
else { //creating custom infowindow
|
231
|
+
if (this.exists(marker_container.description)) {
|
232
|
+
var boxText = document.createElement("div");
|
233
|
+
boxText.setAttribute("class", this.markers_conf.custom_infowindow_class); //to customize
|
234
|
+
boxText.innerHTML = marker_container.description;
|
235
|
+
info_window = new InfoBox(Gmaps4Rails.infobox(boxText));
|
236
|
+
google.maps.event.addListener(marker_container.serviceObject, 'click', this.openInfoWindow(info_window, marker_container.serviceObject));
|
237
|
+
}
|
238
|
+
}
|
239
|
+
};
|
240
|
+
|
241
|
+
Gmaps4Rails.openInfoWindow = function(infoWindow, marker) {
|
242
|
+
return function() {
|
243
|
+
// Close the latest selected marker before opening the current one.
|
244
|
+
if (Gmaps4Rails.visibleInfoWindow) {
|
245
|
+
Gmaps4Rails.visibleInfoWindow.close();
|
246
|
+
}
|
247
|
+
|
248
|
+
infoWindow.open(Gmaps4Rails.map, marker);
|
249
|
+
Gmaps4Rails.visibleInfoWindow = infoWindow;
|
250
|
+
};
|
251
|
+
};
|
252
|
+
|
253
|
+
////////////////////////////////////////////////////
|
254
|
+
/////////////////// Other methods //////////////////
|
255
|
+
////////////////////////////////////////////////////
|
256
|
+
|
257
|
+
Gmaps4Rails.fitBounds = function(){
|
258
|
+
this.map.fitBounds(this.boundsObject);
|
259
|
+
};
|
260
|
+
|
261
|
+
Gmaps4Rails.centerMapOnUser = function(){
|
262
|
+
Gmaps4Rails.map.setCenter(Gmaps4Rails.userLocation);
|
263
|
+
};
|
@@ -1,727 +1,496 @@
|
|
1
1
|
var Gmaps4Rails = {
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
//map config
|
4
|
+
map: null, // contains the map we're working on
|
5
|
+
visibleInfoWindow: null, //contains the current opened infowindow
|
5
6
|
userLocation: null, //contains user's location if geolocalization was performed and successful
|
6
7
|
|
7
8
|
//empty slots
|
8
|
-
|
9
|
+
geolocationFailure: function() { return false;}, //triggered when geolocation fails. If customized, must be like: function(navigator_handles_geolocation){} where 'navigator_handles_geolocation' is a boolean
|
9
10
|
callback: function() { return false;}, //to let user set a custom callback function
|
10
11
|
customClusterer: function() { return null;}, //to let user set custom clusterer pictures
|
11
12
|
infobox: function() { return null;}, //to let user use custom infoboxes
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
picture : "",
|
38
|
-
width: 22,
|
39
|
-
length: 32,
|
14
|
+
|
15
|
+
|
16
|
+
map_options: {
|
17
|
+
id: 'gmaps4rails_map',
|
18
|
+
draggable: true,
|
19
|
+
detect_location: false, // should the browser attempt to use geolocation detection features of HTML5?
|
20
|
+
center_on_user: false, // centers map on the location detected through the browser
|
21
|
+
center_latitude: 0,
|
22
|
+
center_longitude: 0,
|
23
|
+
zoom: 1,
|
24
|
+
maxZoom: null,
|
25
|
+
minZoom: null,
|
26
|
+
auto_adjust : true, // adjust the map to the markers if set to true
|
27
|
+
auto_zoom: true, // zoom given by auto-adjust
|
28
|
+
bounds: [] // adjust map to these limits. Should be [{"lat": , "lng": }]
|
29
|
+
},
|
30
|
+
|
31
|
+
markers_conf: {
|
32
|
+
// Marker config
|
33
|
+
title: "",
|
34
|
+
// MarkerImage config
|
35
|
+
picture : "",
|
36
|
+
width: 22,
|
37
|
+
length: 32,
|
40
38
|
draggable: false, // how to modify: <%= gmaps( "markers" => { "data" => @object.to_gmaps4rails, "options" => { "draggable" => true }}) %>
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
polygons: [], // contains raw data, array of arrays (first element could be a hash containing options)
|
57
|
-
polylines: [], // contains raw data, array of arrays (first element could be a hash containing options)
|
58
|
-
circles: [], // contains raw data, array of hash
|
59
|
-
markerClusterer: null, // contains all marker clusterers
|
39
|
+
//clustering config
|
40
|
+
do_clustering: false, // do clustering if set to true
|
41
|
+
randomize: false, // Google maps can't display two markers which have the same coordinates. This randomizer enables to prevent this situation from happening.
|
42
|
+
max_random_distance: 100, // in meters. Each marker coordinate could be altered by this distance in a random direction
|
43
|
+
list_container: null, // id of the ul that will host links to all markers
|
44
|
+
offset: 0 //used when adding_markers to an existing map. Because new markers are concated with previous one, offset is here to prevent the existing from being re-created.
|
45
|
+
},
|
46
|
+
|
47
|
+
//Stored variables
|
48
|
+
markers: [], // contains all markers. A marker contains the following: {"description": , "longitude": , "title":, "latitude":, "picture": "", "width": "", "length": "", "sidebar": "", "serviceObject": google_marker}
|
49
|
+
boundsObject: null, // contains current bounds from markers, polylines etc...
|
50
|
+
polygons: [], // contains raw data, array of arrays (first element could be a hash containing options)
|
51
|
+
polylines: [], // contains raw data, array of arrays (first element could be a hash containing options)
|
52
|
+
circles: [], // contains raw data, array of hash
|
53
|
+
markerClusterer: null, // contains all marker clusterers
|
60
54
|
markerImages: [],
|
55
|
+
|
56
|
+
//initializes the map
|
57
|
+
initialize: function() {
|
58
|
+
|
59
|
+
this.map = Gmaps4Rails.createMap();
|
60
|
+
|
61
|
+
if (this.map_options.detect_location === true || this.map_options.center_on_user === true) {
|
62
|
+
this.findUserLocation();
|
63
|
+
}
|
64
|
+
//resets sidebar if needed
|
65
|
+
this.resetSidebarContent();
|
66
|
+
},
|
67
|
+
|
68
|
+
findUserLocation: function() {
|
69
|
+
if(navigator.geolocation) {
|
70
|
+
//try to retrieve user's position
|
71
|
+
navigator.geolocation.getCurrentPosition(function(position) {
|
72
|
+
//saves the position in the userLocation variable
|
73
|
+
Gmaps4Rails.userLocation = Gmaps4Rails.createLatLng(position.coords.latitude, position.coords.longitude);
|
74
|
+
//change map's center to focus on user's geoloc if asked
|
75
|
+
if(Gmaps4Rails.map_options.center_on_user === true) {
|
76
|
+
Gmaps4Rails.centerMapOnUser();
|
77
|
+
}
|
78
|
+
},
|
79
|
+
function() {
|
80
|
+
//failure, but the navigator handles geolocation
|
81
|
+
this.geolocationFailure(true);
|
82
|
+
});
|
83
|
+
}
|
84
|
+
else {
|
85
|
+
//failure but the navigator doesn't handle geolocation
|
86
|
+
this.geolocationFailure(false);
|
87
|
+
}
|
88
|
+
},
|
89
|
+
|
90
|
+
////////////////////////////////////////////////////
|
91
|
+
//////////////////// DIRECTIONS ////////////////////
|
92
|
+
////////////////////////////////////////////////////
|
93
|
+
|
94
|
+
create_direction: function(){
|
95
|
+
var directionsDisplay = new google.maps.DirectionsRenderer();
|
96
|
+
var directionsService = new google.maps.DirectionsService();
|
97
|
+
|
98
|
+
directionsDisplay.setMap(this.map);
|
99
|
+
//display panel only if required
|
100
|
+
if (this.direction_conf.display_panel) { directionsDisplay.setPanel(document.getElementById(this.direction_conf.panel_id)); }
|
101
|
+
directionsDisplay.setOptions({
|
102
|
+
suppressMarkers: false,
|
103
|
+
suppressInfoWindows: false,
|
104
|
+
suppressPolylines: false
|
105
|
+
});
|
106
|
+
var request = {
|
107
|
+
origin: this.direction_conf.origin,
|
108
|
+
destination: this.direction_conf.destination,
|
109
|
+
waypoints: this.direction_conf.waypoints,
|
110
|
+
optimizeWaypoints: this.direction_conf.optimizeWaypoints,
|
111
|
+
unitSystem: google.maps.DirectionsUnitSystem[this.direction_conf.unitSystem],
|
112
|
+
avoidHighways: this.direction_conf.avoidHighways,
|
113
|
+
avoidTolls: this.direction_conf.avoidTolls,
|
114
|
+
region: this.direction_conf.region,
|
115
|
+
travelMode: google.maps.DirectionsTravelMode[this.direction_conf.travelMode],
|
116
|
+
language: "en"
|
117
|
+
};
|
118
|
+
directionsService.route(request, function(response, status) {
|
119
|
+
if (status == google.maps.DirectionsStatus.OK) {
|
120
|
+
directionsDisplay.setDirections(response);
|
121
|
+
}
|
122
|
+
});
|
123
|
+
},
|
61
124
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
//initializes the map
|
105
|
-
initialize: function() {
|
106
|
-
|
107
|
-
this.map = Gmaps4Rails.createMap();
|
108
|
-
|
109
|
-
if (this.map_options.detect_location === true || this.map_options.center_on_user === true) {
|
110
|
-
this.findUserLocation();
|
111
|
-
}
|
112
|
-
//resets sidebar if needed
|
113
|
-
this.resetSidebarContent();
|
114
|
-
},
|
115
|
-
|
116
|
-
findUserLocation: function() {
|
117
|
-
if(navigator.geolocation) {
|
118
|
-
//try to retrieve user's position
|
119
|
-
navigator.geolocation.getCurrentPosition(function(position) {
|
120
|
-
//saves the position in the userLocation variable
|
121
|
-
Gmaps4Rails.userLocation = Gmaps4Rails.createLatLng(position.coords.latitude, position.coords.longitude);
|
122
|
-
//change map's center to focus on user's geoloc if asked
|
123
|
-
if(Gmaps4Rails.map_options.center_on_user === true) {
|
124
|
-
Gmaps4Rails.map.setCenter(Gmaps4Rails.userLocation);
|
125
|
-
}
|
126
|
-
},
|
127
|
-
function() {
|
128
|
-
//failure, but the navigator handles geolocation
|
129
|
-
this.geolocationFailure(true);
|
130
|
-
});
|
131
|
-
}
|
132
|
-
else {
|
133
|
-
//failure but the navigator doesn't handle geolocation
|
134
|
-
this.geolocationFailure(false);
|
135
|
-
}
|
136
|
-
},
|
137
|
-
|
138
|
-
////////////////////////////////////////////////////
|
139
|
-
//////////////////// DIRECTIONS ////////////////////
|
140
|
-
////////////////////////////////////////////////////
|
141
|
-
|
142
|
-
create_direction: function(){
|
143
|
-
var directionsDisplay = new google.maps.DirectionsRenderer();
|
144
|
-
var directionsService = new google.maps.DirectionsService();
|
145
|
-
|
146
|
-
directionsDisplay.setMap(this.map);
|
147
|
-
//display panel only if required
|
148
|
-
if (this.direction_conf.display_panel) { directionsDisplay.setPanel(document.getElementById(this.direction_conf.panel_id)); }
|
149
|
-
directionsDisplay.setOptions({
|
150
|
-
suppressMarkers: false,
|
151
|
-
suppressInfoWindows: false,
|
152
|
-
suppressPolylines: false
|
153
|
-
});
|
154
|
-
var request = {
|
155
|
-
origin: this.direction_conf.origin,
|
156
|
-
destination: this.direction_conf.destination,
|
157
|
-
waypoints: this.direction_conf.waypoints,
|
158
|
-
optimizeWaypoints: this.direction_conf.optimizeWaypoints,
|
159
|
-
unitSystem: google.maps.DirectionsUnitSystem[this.direction_conf.unitSystem],
|
160
|
-
avoidHighways: this.direction_conf.avoidHighways,
|
161
|
-
avoidTolls: this.direction_conf.avoidTolls,
|
162
|
-
region: this.direction_conf.region,
|
163
|
-
travelMode: google.maps.DirectionsTravelMode[this.direction_conf.travelMode],
|
164
|
-
language: "en"
|
165
|
-
};
|
166
|
-
directionsService.route(request, function(response, status) {
|
167
|
-
if (status == google.maps.DirectionsStatus.OK) {
|
168
|
-
directionsDisplay.setDirections(response);
|
169
|
-
}
|
170
|
-
});
|
171
|
-
},
|
172
|
-
|
173
|
-
////////////////////////////////////////////////////
|
174
|
-
///////////////////// CIRCLES //////////////////////
|
175
|
-
////////////////////////////////////////////////////
|
176
|
-
|
177
|
-
//Loops through all circles
|
178
|
-
//Loops through all circles and draws them
|
179
|
-
create_circles: function() {
|
180
|
-
for (var i = 0; i < this.circles.length; ++i) {
|
181
|
-
//by convention, default style configuration could be integrated in the first element
|
182
|
-
this.create_circle(this.circles[i]);
|
183
|
-
}
|
184
|
-
},
|
185
|
-
|
186
|
-
create_circle: function(circle) {
|
187
|
-
if ( i === 0 ) {
|
188
|
-
if (this.exists(circle.strokeColor )) { this.circles_conf.strokeColor = circle.strokeColor; }
|
189
|
-
if (this.exists(circle.strokeOpacity)) { this.circles_conf.strokeOpacity = circle.strokeOpacity; }
|
190
|
-
if (this.exists(circle.strokeWeight )) { this.circles_conf.strokeWeight = circle.strokeWeight; }
|
191
|
-
if (this.exists(circle.fillColor )) { this.circles_conf.fillColor = circle.fillColor; }
|
192
|
-
if (this.exists(circle.fillOpacity )) { this.circles_conf.fillOpacity = circle.fillOpacity; }
|
193
|
-
}
|
194
|
-
if (this.exists(circle.latitude) && this.exists(circle.longitude)) {
|
195
|
-
// always check if a config is given, if not, use defaults
|
196
|
-
// NOTE: is there a cleaner way to do this? Maybe a hash merge of some sort?
|
197
|
-
var newCircle = new google.maps.Circle({
|
198
|
-
center: Gmaps4Rails.createLatLng(circle.latitude, circle.longitude),
|
199
|
-
strokeColor: circle.strokeColor || this.circles_conf.strokeColor,
|
200
|
-
strokeOpacity: circle.strokeOpacity || this.circles_conf.strokeOpacity,
|
201
|
-
strokeWeight: circle.strokeWeight || this.circles_conf.strokeWeight,
|
202
|
-
fillOpacity: circle.fillOpacity || this.circles_conf.fillOpacity,
|
203
|
-
fillColor: circle.fillColor || this.circles_conf.fillColor,
|
204
|
-
clickable: circle.clickable || this.circles_conf.clickable,
|
205
|
-
zIndex: circle.zIndex || this.circles_conf.zIndex,
|
206
|
-
radius: circle.radius
|
207
|
-
});
|
208
|
-
circle.serviceObject = newCircle;
|
209
|
-
newCircle.setMap(this.map);
|
210
|
-
}
|
211
|
-
},
|
212
|
-
|
213
|
-
// clear circles
|
125
|
+
////////////////////////////////////////////////////
|
126
|
+
///////////////////// CIRCLES //////////////////////
|
127
|
+
////////////////////////////////////////////////////
|
128
|
+
|
129
|
+
//Loops through all circles
|
130
|
+
//Loops through all circles and draws them
|
131
|
+
create_circles: function() {
|
132
|
+
for (var i = 0; i < this.circles.length; ++i) {
|
133
|
+
//by convention, default style configuration could be integrated in the first element
|
134
|
+
this.create_circle(this.circles[i]);
|
135
|
+
}
|
136
|
+
},
|
137
|
+
|
138
|
+
create_circle: function(circle) {
|
139
|
+
if ( i === 0 ) {
|
140
|
+
if (this.exists(circle.strokeColor )) { this.circles_conf.strokeColor = circle.strokeColor; }
|
141
|
+
if (this.exists(circle.strokeOpacity)) { this.circles_conf.strokeOpacity = circle.strokeOpacity; }
|
142
|
+
if (this.exists(circle.strokeWeight )) { this.circles_conf.strokeWeight = circle.strokeWeight; }
|
143
|
+
if (this.exists(circle.fillColor )) { this.circles_conf.fillColor = circle.fillColor; }
|
144
|
+
if (this.exists(circle.fillOpacity )) { this.circles_conf.fillOpacity = circle.fillOpacity; }
|
145
|
+
}
|
146
|
+
if (this.exists(circle.lat) && this.exists(circle.lng)) {
|
147
|
+
// always check if a config is given, if not, use defaults
|
148
|
+
// NOTE: is there a cleaner way to do this? Maybe a hash merge of some sort?
|
149
|
+
var newCircle = new google.maps.Circle({
|
150
|
+
center: Gmaps4Rails.createLatLng(circle.lat, circle.lng),
|
151
|
+
strokeColor: circle.strokeColor || this.circles_conf.strokeColor,
|
152
|
+
strokeOpacity: circle.strokeOpacity || this.circles_conf.strokeOpacity,
|
153
|
+
strokeWeight: circle.strokeWeight || this.circles_conf.strokeWeight,
|
154
|
+
fillOpacity: circle.fillOpacity || this.circles_conf.fillOpacity,
|
155
|
+
fillColor: circle.fillColor || this.circles_conf.fillColor,
|
156
|
+
clickable: circle.clickable || this.circles_conf.clickable,
|
157
|
+
zIndex: circle.zIndex || this.circles_conf.zIndex,
|
158
|
+
radius: circle.radius
|
159
|
+
});
|
160
|
+
circle.serviceObject = newCircle;
|
161
|
+
newCircle.setMap(this.map);
|
162
|
+
}
|
163
|
+
},
|
164
|
+
|
165
|
+
// clear circles
|
214
166
|
clear_circles: function() {
|
215
|
-
|
216
|
-
|
167
|
+
for (var i = 0; i < this.circles.length; ++i) {
|
168
|
+
this.clear_circle(this.circles[i]);
|
169
|
+
}
|
170
|
+
},
|
171
|
+
|
172
|
+
clear_circle: function(circle) {
|
173
|
+
circle.serviceObject.setMap(null);
|
174
|
+
},
|
175
|
+
|
176
|
+
hide_circles: function() {
|
177
|
+
for (var i = 0; i < this.circles.length; ++i) {
|
178
|
+
this.hide_circle(this.circles[i]);
|
217
179
|
}
|
218
180
|
},
|
219
181
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
182
|
+
hide_circle: function(circle) {
|
183
|
+
circle.serviceObject.setMap(null);
|
184
|
+
},
|
185
|
+
|
186
|
+
show_circles: function() {
|
187
|
+
for (var i = 0; i < this.circles.length; ++i) {
|
188
|
+
this.show_circle(this.circles[i]);
|
227
189
|
}
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
190
|
+
},
|
191
|
+
|
192
|
+
show_circle: function(circle) {
|
193
|
+
circle.serviceObject.setMap(this.map);
|
194
|
+
},
|
195
|
+
|
196
|
+
////////////////////////////////////////////////////
|
197
|
+
///////////////////// POLYGONS /////////////////////
|
198
|
+
////////////////////////////////////////////////////
|
199
|
+
|
200
|
+
//polygons is an array of arrays. It loops.
|
201
|
+
create_polygons: function(){
|
202
|
+
for (var i = 0; i < this.polygons.length; ++i) {
|
203
|
+
this.create_polygon(i);
|
204
|
+
}
|
205
|
+
},
|
206
|
+
|
207
|
+
//creates a single polygon, triggered by create_polygons
|
208
|
+
create_polygon: function(i){
|
209
|
+
var polygon_coordinates = [];
|
210
|
+
var strokeColor;
|
211
|
+
var strokeOpacity;
|
212
|
+
var strokeWeight;
|
213
|
+
var fillColor;
|
214
|
+
var fillOpacity;
|
215
|
+
//Polygon points are in an Array, that's why looping is necessary
|
216
|
+
for (var j = 0; j < this.polygons[i].length; ++j) {
|
217
|
+
var latlng = Gmaps4Rails.createLatLng(this.polygons[i][j].lat, this.polygons[i][j].lng);
|
218
|
+
polygon_coordinates.push(latlng);
|
219
|
+
//first element of an Array could contain specific configuration for this particular polygon. If no config given, use default
|
220
|
+
if (j===0) {
|
221
|
+
strokeColor = this.polygons[i][j].strokeColor || this.polygons_conf.strokeColor;
|
222
|
+
strokeOpacity = this.polygons[i][j].strokeOpacity || this.polygons_conf.strokeOpacity;
|
223
|
+
strokeWeight = this.polygons[i][j].strokeWeight || this.polygons_conf.strokeWeight;
|
224
|
+
fillColor = this.polygons[i][j].fillColor || this.polygons_conf.fillColor;
|
225
|
+
fillOpacity = this.polygons[i][j].fillOpacity || this.polygons_conf.fillOpacity;
|
226
|
+
}
|
237
227
|
}
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
var fillOpacity;
|
263
|
-
//Polygon points are in an Array, that's why looping is necessary
|
264
|
-
for (var j = 0; j < this.polygons[i].length; ++j) {
|
265
|
-
var latlng = Gmaps4Rails.createLatLng(this.polygons[i][j].latitude, this.polygons[i][j].longitude);
|
266
|
-
polygon_coordinates.push(latlng);
|
267
|
-
//first element of an Array could contain specific configuration for this particular polygon. If no config given, use default
|
268
|
-
if (j===0) {
|
269
|
-
strokeColor = this.polygons[i][j].strokeColor || this.polygons_conf.strokeColor;
|
270
|
-
strokeOpacity = this.polygons[i][j].strokeOpacity || this.polygons_conf.strokeOpacity;
|
271
|
-
strokeWeight = this.polygons[i][j].strokeWeight || this.polygons_conf.strokeWeight;
|
272
|
-
fillColor = this.polygons[i][j].fillColor || this.polygons_conf.fillColor;
|
273
|
-
fillOpacity = this.polygons[i][j].fillOpacity || this.polygons_conf.fillOpacity;
|
274
|
-
}
|
275
|
-
}
|
276
|
-
|
277
|
-
// Construct the polygon
|
278
|
-
var new_poly = new google.maps.Polygon({
|
279
|
-
paths: polygon_coordinates,
|
280
|
-
strokeColor: strokeColor,
|
281
|
-
strokeOpacity: strokeOpacity,
|
282
|
-
strokeWeight: strokeWeight,
|
283
|
-
fillColor: fillColor,
|
284
|
-
fillOpacity: fillOpacity,
|
285
|
-
clickable: false
|
286
|
-
});
|
287
|
-
//save polygon in list
|
288
|
-
this.polygons[i].serviceObject = new_poly;
|
289
|
-
new_poly.setMap(this.map);
|
290
|
-
},
|
291
|
-
|
292
|
-
////////////////////////////////////////////////////
|
293
|
-
/////////////////// POLYLINES //////////////////////
|
294
|
-
////////////////////////////////////////////////////
|
295
|
-
|
296
|
-
//polylines is an array of arrays. It loops.
|
297
|
-
create_polylines: function(){
|
298
|
-
for (var i = 0; i < this.polylines.length; ++i) {
|
299
|
-
this.create_polyline(i);
|
300
|
-
}
|
301
|
-
},
|
302
|
-
|
303
|
-
//creates a single polyline, triggered by create_polylines
|
304
|
-
create_polyline: function(i) {
|
305
|
-
var polyline_coordinates = [];
|
306
|
-
var strokeColor;
|
307
|
-
var strokeOpacity;
|
308
|
-
var strokeWeight;
|
309
|
-
|
310
|
-
//2 cases here, either we have a coded array of LatLng or we have an Array of LatLng
|
311
|
-
for (var j = 0; j < this.polylines[i].length; ++j) {
|
312
|
-
//if we have a coded array
|
313
|
-
if (this.exists(this.polylines[i][j].coded_array)) {
|
314
|
-
var decoded_array = new google.maps.geometry.encoding.decodePath(this.polylines[i][j].coded_array);
|
315
|
-
//loop through every point in the array
|
316
|
-
for (var k = 0; k < decoded_array.length; ++k) {
|
317
|
-
polyline_coordinates.push(decoded_array[k]);
|
318
|
-
polyline_coordinates.push(decoded_array[k]);
|
319
|
-
}
|
320
|
-
}
|
321
|
-
//or we have an array of latlng
|
322
|
-
else{
|
323
|
-
//by convention, a single polyline could be customized in the first array or it uses default values
|
324
|
-
if (j===0) {
|
325
|
-
strokeColor = this.polylines[i][0].strokeColor || this.polylines_conf.strokeColor;
|
326
|
-
strokeOpacity = this.polylines[i][0].strokeOpacity || this.polylines_conf.strokeOpacity;
|
327
|
-
strokeWeight = this.polylines[i][0].strokeWeight || this.polylines_conf.strokeWeight;
|
328
|
-
}
|
329
|
-
//add latlng if positions provided
|
330
|
-
if (this.exists(this.polylines[i][j].latitude) && this.exists(this.polylines[i][j].longitude)) {
|
331
|
-
var latlng = Gmaps4Rails.createLatLng(this.polylines[i][j].latitude, this.polylines[i][j].longitude);
|
332
|
-
polyline_coordinates.push(latlng);
|
333
|
-
}
|
334
|
-
}
|
335
|
-
}
|
336
|
-
// Construct the polyline
|
337
|
-
var new_poly = new google.maps.Polyline({
|
338
|
-
path: polyline_coordinates,
|
339
|
-
strokeColor: strokeColor,
|
340
|
-
strokeOpacity: strokeOpacity,
|
341
|
-
strokeWeight: strokeWeight,
|
342
|
-
clickable: false
|
343
|
-
});
|
344
|
-
//save polyline
|
345
|
-
this.polylines[i].serviceObject = new_poly;
|
346
|
-
new_poly.setMap(this.map);
|
347
|
-
},
|
348
|
-
|
349
|
-
////////////////////////////////////////////////////
|
350
|
-
///////////////////// MARKERS //////////////////////
|
351
|
-
//////////////////tests coded///////////////////////
|
352
|
-
|
353
|
-
//creates, clusterizes and adjusts map
|
354
|
-
create_markers: function() {
|
355
|
-
this.markers_conf.offset = 0;
|
356
|
-
this.createServiceMarkersFromMarkers();
|
357
|
-
this.clusterize();
|
358
|
-
this.adjustMapToBounds();
|
359
|
-
},
|
360
|
-
|
361
|
-
//create google.maps Markers from data provided by user
|
362
|
-
createServiceMarkersFromMarkers: function() {
|
363
|
-
for (var i = this.markers_conf.offset; i < this.markers.length; ++i) {
|
364
|
-
//check if the marker has not already been created
|
365
|
-
if (!this.exists(this.markers[i].serviceObject)) {
|
366
|
-
//extract options, test if value passed or use default
|
367
|
-
var marker_picture = this.exists(this.markers[i].picture) ? this.markers[i].picture : this.markers_conf.picture;
|
368
|
-
var marker_width = this.exists(this.markers[i].width) ? this.markers[i].width : this.markers_conf.width;
|
369
|
-
var marker_height = this.exists(this.markers[i].height) ? this.markers[i].height : this.markers_conf.length;
|
370
|
-
var marker_title = this.exists(this.markers[i].title) ? this.markers[i].title : null;
|
371
|
-
var marker_anchor = this.exists(this.markers[i].marker_anchor) ? this.markers[i].marker_anchor : null;
|
372
|
-
var shadow_anchor = this.exists(this.markers[i].shadow_anchor) ? this.markers[i].shadow_anchor : null;
|
373
|
-
var shadow_picture = this.exists(this.markers[i].shadow_picture) ? this.markers[i].shadow_picture : null;
|
374
|
-
var shadow_width = this.exists(this.markers[i].shadow_width) ? this.markers[i].shadow_width : null;
|
375
|
-
var shadow_height = this.exists(this.markers[i].shadow_height) ? this.markers[i].shadow_height : null;
|
376
|
-
var marker_draggable = this.exists(this.markers[i].draggable) ? this.markers[i].draggable : this.markers_conf.draggable;
|
377
|
-
var Lat = this.markers[i].latitude;
|
378
|
-
var Lng = this.markers[i].longitude;
|
379
|
-
|
380
|
-
//alter coordinates if randomize is true
|
381
|
-
if ( this.markers_conf.randomize) {
|
382
|
-
var LatLng = Gmaps4Rails.randomize(Lat, Lng);
|
383
|
-
//retrieve coordinates from the array
|
384
|
-
Lat = LatLng[0]; Lng = LatLng[1];
|
385
|
-
}
|
386
|
-
|
387
|
-
var markerLatLng = Gmaps4Rails.createLatLng(Lat, Lng);
|
388
|
-
var thisMarker;
|
389
|
-
|
390
|
-
// Marker sizes are expressed as a Size of X,Y
|
391
|
-
if (marker_picture === "" ) {
|
392
|
-
thisMarker = Gmaps4Rails.createMarker({position: markerLatLng, map: this.map, title: marker_title, draggable: marker_draggable});
|
393
|
-
} else {
|
394
|
-
// calculate MarkerImage anchor location
|
395
|
-
var imageAnchorPosition = this.createImageAnchorPosition(marker_anchor);
|
396
|
-
var shadowAnchorPosition = this.createImageAnchorPosition(shadow_anchor);
|
397
|
-
|
398
|
-
//create or retrieve existing MarkerImages
|
399
|
-
var markerImage = this.createOrRetrieveImage(marker_picture, marker_width, marker_height, imageAnchorPosition);
|
400
|
-
var shadowImage = this.createOrRetrieveImage(shadow_picture, shadow_width, shadow_height, shadowAnchorPosition);
|
401
|
-
|
402
|
-
thisMarker = Gmaps4Rails.createMarker({position: markerLatLng, map: this.map, icon: markerImage, title: marker_title, draggable: marker_draggable, shadow: shadowImage});
|
403
|
-
}
|
404
|
-
|
405
|
-
//save object
|
406
|
-
this.markers[i].serviceObject = thisMarker;
|
407
|
-
//add infowindowstuff if enabled
|
408
|
-
this.createInfoWindow(this.markers[i]);
|
409
|
-
//create sidebar if enabled
|
410
|
-
this.createSidebar(this.markers[i]);
|
411
|
-
}
|
412
|
-
}
|
413
|
-
this.markers_conf.offset = this.markers.length;
|
414
|
-
},
|
415
|
-
|
416
|
-
// checks if MarkerImage exists before creating a new one
|
417
|
-
// returns a MarkerImage or false if ever something wrong is passed as argument
|
418
|
-
createOrRetrieveImage: function(currentMarkerPicture, markerWidth, markerHeight, imageAnchorPosition){
|
419
|
-
if (currentMarkerPicture === "" || currentMarkerPicture === null )
|
420
|
-
{ return null;}
|
421
|
-
|
422
|
-
var test_image_index = this.includeMarkerImage(this.markerImages, currentMarkerPicture);
|
423
|
-
switch (test_image_index)
|
424
|
-
{
|
425
|
-
case false:
|
426
|
-
var markerImage = Gmaps4Rails.createMarkerImage(currentMarkerPicture, Gmaps4Rails.createSize(markerWidth, markerHeight), null, imageAnchorPosition, null );
|
427
|
-
this.markerImages.push(markerImage);
|
428
|
-
return markerImage;
|
429
|
-
break;
|
430
|
-
default:
|
431
|
-
if (typeof test_image_index == 'number') { return this.markerImages[test_image_index]; }
|
432
|
-
else { return false; }
|
433
|
-
break;
|
434
|
-
}
|
435
|
-
},
|
436
|
-
|
437
|
-
// creates Image Anchor Position or return null if nothing passed
|
438
|
-
createImageAnchorPosition: function(anchorLocation) {
|
439
|
-
if (anchorLocation === null)
|
440
|
-
{ return null; }
|
441
|
-
else
|
442
|
-
{ return Gmaps4Rails.createPoint(anchorLocation[0], anchorLocation[1]); }
|
443
|
-
},
|
444
|
-
|
445
|
-
// clear markers
|
446
|
-
clearMarkers: function() {
|
447
|
-
for (var i = 0; i < this.markers.length; ++i) {
|
448
|
-
this.clearMarker(this.markers[i]);
|
228
|
+
|
229
|
+
// Construct the polygon
|
230
|
+
var new_poly = new google.maps.Polygon({
|
231
|
+
paths: polygon_coordinates,
|
232
|
+
strokeColor: strokeColor,
|
233
|
+
strokeOpacity: strokeOpacity,
|
234
|
+
strokeWeight: strokeWeight,
|
235
|
+
fillColor: fillColor,
|
236
|
+
fillOpacity: fillOpacity,
|
237
|
+
clickable: false
|
238
|
+
});
|
239
|
+
//save polygon in list
|
240
|
+
this.polygons[i].serviceObject = new_poly;
|
241
|
+
new_poly.setMap(this.map);
|
242
|
+
},
|
243
|
+
|
244
|
+
////////////////////////////////////////////////////
|
245
|
+
/////////////////// POLYLINES //////////////////////
|
246
|
+
////////////////////////////////////////////////////
|
247
|
+
|
248
|
+
//polylines is an array of arrays. It loops.
|
249
|
+
create_polylines: function(){
|
250
|
+
for (var i = 0; i < this.polylines.length; ++i) {
|
251
|
+
this.create_polyline(i);
|
449
252
|
}
|
450
253
|
},
|
451
254
|
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
255
|
+
//creates a single polyline, triggered by create_polylines
|
256
|
+
create_polyline: function(i) {
|
257
|
+
var polyline_coordinates = [];
|
258
|
+
var strokeColor;
|
259
|
+
var strokeOpacity;
|
260
|
+
var strokeWeight;
|
261
|
+
|
262
|
+
//2 cases here, either we have a coded array of LatLng or we have an Array of LatLng
|
263
|
+
for (var j = 0; j < this.polylines[i].length; ++j) {
|
264
|
+
//if we have a coded array
|
265
|
+
if (this.exists(this.polylines[i][j].coded_array)) {
|
266
|
+
var decoded_array = new google.maps.geometry.encoding.decodePath(this.polylines[i][j].coded_array);
|
267
|
+
//loop through every point in the array
|
268
|
+
for (var k = 0; k < decoded_array.length; ++k) {
|
269
|
+
polyline_coordinates.push(decoded_array[k]);
|
270
|
+
polyline_coordinates.push(decoded_array[k]);
|
271
|
+
}
|
272
|
+
}
|
273
|
+
//or we have an array of latlng
|
274
|
+
else{
|
275
|
+
//by convention, a single polyline could be customized in the first array or it uses default values
|
276
|
+
if (j===0) {
|
277
|
+
strokeColor = this.polylines[i][0].strokeColor || this.polylines_conf.strokeColor;
|
278
|
+
strokeOpacity = this.polylines[i][0].strokeOpacity || this.polylines_conf.strokeOpacity;
|
279
|
+
strokeWeight = this.polylines[i][0].strokeWeight || this.polylines_conf.strokeWeight;
|
280
|
+
}
|
281
|
+
//add latlng if positions provided
|
282
|
+
if (this.exists(this.polylines[i][j].lat) && this.exists(this.polylines[i][j].lng)) {
|
283
|
+
var latlng = Gmaps4Rails.createLatLng(this.polylines[i][j].lat, this.polylines[i][j].lng);
|
284
|
+
polyline_coordinates.push(latlng);
|
285
|
+
}
|
286
|
+
}
|
456
287
|
}
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
288
|
+
// Construct the polyline
|
289
|
+
var new_poly = new google.maps.Polyline({
|
290
|
+
path: polyline_coordinates,
|
291
|
+
strokeColor: strokeColor,
|
292
|
+
strokeOpacity: strokeOpacity,
|
293
|
+
strokeWeight: strokeWeight,
|
294
|
+
clickable: false
|
295
|
+
});
|
296
|
+
//save polyline
|
297
|
+
this.polylines[i].serviceObject = new_poly;
|
298
|
+
new_poly.setMap(this.map);
|
299
|
+
},
|
300
|
+
|
301
|
+
////////////////////////////////////////////////////
|
302
|
+
///////////////////// MARKERS //////////////////////
|
303
|
+
//////////////////tests coded///////////////////////
|
304
|
+
|
305
|
+
//creates, clusterizes and adjusts map
|
306
|
+
create_markers: function() {
|
307
|
+
this.markers_conf.offset = 0;
|
308
|
+
this.createServiceMarkersFromMarkers();
|
309
|
+
this.clusterize();
|
310
|
+
this.adjustMapToBounds();
|
311
|
+
},
|
312
|
+
|
313
|
+
//create google.maps Markers from data provided by user
|
314
|
+
createServiceMarkersFromMarkers: function() {
|
315
|
+
for (var i = this.markers_conf.offset; i < this.markers.length; ++i) {
|
316
|
+
//check if the marker has not already been created
|
317
|
+
// if (!this.exists(this.markers[i].serviceObject && this.provider == "google")) {
|
318
|
+
//extract options, test if value passed or use default
|
319
|
+
var Lat = this.markers[i].lat;
|
320
|
+
var Lng = this.markers[i].lng;
|
321
|
+
|
322
|
+
//alter coordinates if randomize is true
|
323
|
+
if ( this.markers_conf.randomize) {
|
324
|
+
var LatLng = Gmaps4Rails.randomize(Lat, Lng);
|
325
|
+
//retrieve coordinates from the array
|
326
|
+
Lat = LatLng[0]; Lng = LatLng[1];
|
327
|
+
}
|
328
|
+
//save object
|
329
|
+
this.markers[i].serviceObject = Gmaps4Rails.createMarker({
|
330
|
+
"marker_picture": this.exists(this.markers[i].picture) ? this.markers[i].picture : this.markers_conf.picture,
|
331
|
+
"marker_width": this.exists(this.markers[i].width) ? this.markers[i].width : this.markers_conf.width,
|
332
|
+
"marker_height": this.exists(this.markers[i].height) ? this.markers[i].height : this.markers_conf.length,
|
333
|
+
"marker_title": this.exists(this.markers[i].title) ? this.markers[i].title : null,
|
334
|
+
"marker_anchor": this.exists(this.markers[i].marker_anchor) ? this.markers[i].marker_anchor : null,
|
335
|
+
"shadow_anchor": this.exists(this.markers[i].shadow_anchor) ? this.markers[i].shadow_anchor : null,
|
336
|
+
"shadow_picture": this.exists(this.markers[i].shadow_picture) ? this.markers[i].shadow_picture : null,
|
337
|
+
"shadow_width": this.exists(this.markers[i].shadow_width) ? this.markers[i].shadow_width : null,
|
338
|
+
"shadow_height": this.exists(this.markers[i].shadow_height) ? this.markers[i].shadow_height : null,
|
339
|
+
"marker_draggable": this.exists(this.markers[i].draggable) ? this.markers[i].draggable : this.markers_conf.draggable,
|
340
|
+
"Lat": Lat,
|
341
|
+
"Lng": Lng,
|
342
|
+
"index": i
|
343
|
+
});
|
344
|
+
//add infowindowstuff if enabled
|
345
|
+
this.createInfoWindow(this.markers[i]);
|
346
|
+
//create sidebar if enabled
|
347
|
+
this.createSidebar(this.markers[i]);
|
348
|
+
// }
|
462
349
|
}
|
463
|
-
|
464
|
-
|
350
|
+
this.markers_conf.offset = this.markers.length;
|
351
|
+
},
|
352
|
+
|
353
|
+
|
354
|
+
// creates Image Anchor Position or return null if nothing passed
|
355
|
+
createImageAnchorPosition: function(anchorLocation) {
|
356
|
+
if (anchorLocation === null)
|
357
|
+
{ return null; }
|
358
|
+
else
|
359
|
+
{ return Gmaps4Rails.createPoint(anchorLocation[0], anchorLocation[1]); }
|
360
|
+
},
|
361
|
+
|
465
362
|
// replace old markers with new markers on an existing map
|
466
363
|
replaceMarkers: function(new_markers){
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
364
|
+
this.clearMarkers();
|
365
|
+
//reset previous markers
|
366
|
+
this.markers = new Array;
|
367
|
+
//reset current bounds
|
368
|
+
this.boundsObject = Gmaps4Rails.createLatLngBounds();
|
369
|
+
//reset sidebar content if exists
|
370
|
+
this.resetSidebarContent();
|
371
|
+
//add new markers
|
372
|
+
this.addMarkers(new_markers);
|
475
373
|
},
|
476
374
|
|
477
|
-
|
375
|
+
//add new markers to on an existing map
|
478
376
|
addMarkers: function(new_markers){
|
479
|
-
|
377
|
+
//update the list of markers to take into account
|
480
378
|
this.markers = this.markers.concat(new_markers);
|
481
379
|
//put markers on the map
|
482
380
|
this.create_markers();
|
483
381
|
},
|
484
|
-
|
485
|
-
//creates clusters
|
486
|
-
clusterize: function()
|
487
|
-
{
|
488
|
-
if (this.markers_conf.do_clustering === true)
|
489
|
-
{
|
490
|
-
//first clear the existing clusterer if any
|
491
|
-
if (this.markerClusterer !== null) {
|
492
|
-
this.clearClusterer();
|
493
|
-
}
|
494
|
-
|
495
|
-
var markers_array = new Array;
|
496
|
-
for (var i = 0; i < this.markers.length; ++i) {
|
497
|
-
markers_array.push(this.markers[i].serviceObject);
|
498
|
-
}
|
499
382
|
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
if (this.exists(marker_container.description)) {
|
519
|
-
var boxText = document.createElement("div");
|
520
|
-
boxText.setAttribute("class", this.markers_conf.custom_infowindow_class); //to customize
|
521
|
-
boxText.innerHTML = marker_container.description;
|
522
|
-
info_window = new InfoBox(Gmaps4Rails.infobox(boxText));
|
523
|
-
google.maps.event.addListener(marker_container.serviceObject, 'click', this.openInfoWindow(info_window, marker_container.serviceObject));
|
524
|
-
}
|
525
|
-
}
|
526
|
-
},
|
527
|
-
|
528
|
-
openInfoWindow: function(infoWindow, marker) {
|
529
|
-
return function() {
|
530
|
-
// Close the latest selected marker before opening the current one.
|
531
|
-
if (Gmaps4Rails.visibleInfoWindow) {
|
532
|
-
Gmaps4Rails.visibleInfoWindow.close();
|
533
|
-
}
|
534
|
-
|
535
|
-
infoWindow.open(Gmaps4Rails.map, marker);
|
536
|
-
Gmaps4Rails.visibleInfoWindow = infoWindow;
|
537
|
-
};
|
383
|
+
////////////////////////////////////////////////////
|
384
|
+
///////////////////// SIDEBAR //////////////////////
|
385
|
+
////////////////////////////////////////////////////
|
386
|
+
|
387
|
+
//creates sidebar
|
388
|
+
createSidebar: function(marker_container){
|
389
|
+
if (this.markers_conf.list_container)
|
390
|
+
{
|
391
|
+
var ul = document.getElementById(this.markers_conf.list_container);
|
392
|
+
var li = document.createElement('li');
|
393
|
+
var aSel = document.createElement('a');
|
394
|
+
aSel.href = 'javascript:void(0);';
|
395
|
+
var html = this.exists(marker_container.sidebar) ? marker_container.sidebar : "Marker";
|
396
|
+
aSel.innerHTML = html;
|
397
|
+
aSel.onclick = this.sidebar_element_handler(marker_container.serviceObject, 'click');
|
398
|
+
li.appendChild(aSel);
|
399
|
+
ul.appendChild(li);
|
400
|
+
}
|
538
401
|
},
|
539
402
|
|
540
|
-
|
541
|
-
///////////////////// SIDEBAR //////////////////////
|
542
|
-
////////////////////////////////////////////////////
|
543
|
-
|
544
|
-
//creates sidebar
|
545
|
-
createSidebar: function(marker_container){
|
546
|
-
if (this.markers_conf.list_container)
|
547
|
-
{
|
548
|
-
var ul = document.getElementById(this.markers_conf.list_container);
|
549
|
-
var li = document.createElement('li');
|
550
|
-
var aSel = document.createElement('a');
|
551
|
-
aSel.href = 'javascript:void(0);';
|
552
|
-
var html = this.exists(marker_container.sidebar) ? marker_container.sidebar : "Marker";
|
553
|
-
aSel.innerHTML = html;
|
554
|
-
aSel.onclick = this.sidebar_element_handler(marker_container.serviceObject, 'click');
|
555
|
-
li.appendChild(aSel);
|
556
|
-
ul.appendChild(li);
|
557
|
-
}
|
558
|
-
},
|
559
|
-
|
560
|
-
//moves map to marker clicked + open infowindow
|
403
|
+
//moves map to marker clicked + open infowindow
|
561
404
|
sidebar_element_handler: function(marker, eventType) {
|
562
405
|
return function() {
|
563
|
-
|
406
|
+
Gmaps4Rails.map.panTo(marker.position);
|
564
407
|
google.maps.event.trigger(marker, eventType);
|
565
408
|
};
|
566
409
|
},
|
567
410
|
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
},
|
574
|
-
|
575
|
-
////////////////////////////////////////////////////
|
576
|
-
////////////////// MISCELLANEOUS ///////////////////
|
577
|
-
////////////////////////////////////////////////////
|
578
|
-
|
579
|
-
//to make the map fit the different LatLng points
|
580
|
-
adjustMapToBounds: function(latlng) {
|
581
|
-
|
582
|
-
//FIRST_STEP: retrieve all bounds
|
583
|
-
//create the bounds object only if necessary
|
584
|
-
if (this.map_options.auto_adjust || this.map_options.bounds !== null) {
|
585
|
-
this.serviceBounds = Gmaps4Rails.createLatLngBounds();
|
586
|
-
}
|
587
|
-
|
588
|
-
//if autodjust is true, must get bounds from markers polylines etc...
|
589
|
-
if (this.map_options.auto_adjust) {
|
590
|
-
//from markers
|
591
|
-
for (var i = 0; i < this.markers.length; ++i) {
|
592
|
-
this.serviceBounds.extend(this.markers[i].serviceObject.position);
|
593
|
-
}
|
594
|
-
//from polygons:
|
595
|
-
for (var i = 0; i < this.polylines.length; ++i) {
|
596
|
-
this.polylines[i].serviceObject.latLngs.forEach(function(obj1){ obj1.forEach(function(obj2){ Gmaps4Rails.serviceBounds.extend(obj2);} );});
|
597
|
-
}
|
598
|
-
//from polylines:
|
599
|
-
for (var i = 0; i < this.polygons.length; ++i) {
|
600
|
-
this.polygons[i].serviceObject.latLngs.forEach(function(obj1){ obj1.forEach(function(obj2){ Gmaps4Rails.serviceBounds.extend(obj2);} );});
|
601
|
-
}
|
602
|
-
//from circles
|
603
|
-
for (var i = 0; i < this.circles.length; ++i) {
|
604
|
-
this.serviceBounds.extend(this.circles[i].serviceObject.getBounds().getNorthEast());
|
605
|
-
this.serviceBounds.extend(this.circles[i].serviceObject.getBounds().getSouthWest());
|
606
|
-
}
|
607
|
-
}
|
608
|
-
//in every case, I've to take into account the bounds set up by the user
|
609
|
-
for (var i = 0; i < this.map_options.bounds.length; ++i) {
|
610
|
-
//create points from bounds provided
|
611
|
-
var bound = Gmaps4Rails.createLatLng(this.map_options.bounds[i].lat, this.map_options.bounds[i].lng);
|
612
|
-
this.serviceBounds.extend(bound);
|
613
|
-
}
|
614
|
-
|
615
|
-
//SECOND_STEP: ajust the map to the bounds
|
616
|
-
if (this.map_options.auto_adjust || this.map_options.bounds.length > 0) {
|
617
|
-
|
618
|
-
//if autozoom is false, take user info into account
|
619
|
-
if(!this.map_options.auto_zoom) {
|
620
|
-
var map_center = this.serviceBounds.getCenter();
|
621
|
-
this.map_options.center_longitude = map_center.lat();
|
622
|
-
this.map_options.center_latitude = map_center.lng();
|
623
|
-
this.map.setCenter(map_center);
|
624
|
-
}
|
625
|
-
else {
|
626
|
-
this.map.fitBounds(this.serviceBounds);
|
627
|
-
}
|
628
|
-
}
|
629
|
-
},
|
630
|
-
|
631
|
-
////////////////////////////////////////////////////
|
632
|
-
/////////////// Abstracting API calls //////////////
|
633
|
-
//(for maybe an extension to another map provider)//
|
634
|
-
//////////////////mocks created/////////////////////
|
635
|
-
|
636
|
-
clearMarker: function(marker) {
|
637
|
-
marker.serviceObject.setMap(null);
|
638
|
-
},
|
639
|
-
|
640
|
-
showMarker: function(marker) {
|
641
|
-
marker.serviceObject.setVisible(true);
|
642
|
-
},
|
643
|
-
|
644
|
-
hideMarker: function(marker) {
|
645
|
-
marker.serviceObject.setVisible(false);
|
646
|
-
},
|
647
|
-
|
648
|
-
createPoint: function(lat, lng){
|
649
|
-
return new google.maps.Point(lat, lng);
|
650
|
-
},
|
651
|
-
|
652
|
-
createLatLng: function(lat, lng){
|
653
|
-
return new google.maps.LatLng(lat, lng);
|
411
|
+
resetSidebarContent: function(){
|
412
|
+
if (this.markers_conf.list_container !== null ){
|
413
|
+
var ul = document.getElementById(this.markers_conf.list_container);
|
414
|
+
ul.innerHTML = "";
|
415
|
+
}
|
654
416
|
},
|
655
417
|
|
656
|
-
|
657
|
-
|
658
|
-
|
418
|
+
////////////////////////////////////////////////////
|
419
|
+
////////////////// MISCELLANEOUS ///////////////////
|
420
|
+
////////////////////////////////////////////////////
|
659
421
|
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
422
|
+
//to make the map fit the different LatLng points
|
423
|
+
adjustMapToBounds: function(latlng) {
|
424
|
+
|
425
|
+
//FIRST_STEP: retrieve all bounds
|
426
|
+
//create the bounds object only if necessary
|
427
|
+
if (this.map_options.auto_adjust || this.map_options.bounds !== null) {
|
428
|
+
this.boundsObject = Gmaps4Rails.createLatLngBounds();
|
429
|
+
}
|
430
|
+
|
431
|
+
//if autodjust is true, must get bounds from markers polylines etc...
|
432
|
+
if (this.map_options.auto_adjust) {
|
433
|
+
//from markers
|
434
|
+
Gmaps4Rails.extendBoundsWithMarkers();
|
673
435
|
|
674
|
-
|
675
|
-
|
436
|
+
//from polygons:
|
437
|
+
for (var i = 0; i < this.polylines.length; ++i) {
|
438
|
+
this.polylines[i].serviceObject.latLngs.forEach(function(obj1){ obj1.forEach(function(obj2){ Gmaps4Rails.boundsObject.extend(obj2);} );});
|
439
|
+
}
|
440
|
+
//from polylines:
|
441
|
+
for (var i = 0; i < this.polygons.length; ++i) {
|
442
|
+
this.polygons[i].serviceObject.latLngs.forEach(function(obj1){ obj1.forEach(function(obj2){ Gmaps4Rails.boundsObject.extend(obj2);} );});
|
443
|
+
}
|
444
|
+
//from circles
|
445
|
+
for (var i = 0; i < this.circles.length; ++i) {
|
446
|
+
this.boundsObject.extend(this.circles[i].serviceObject.getBounds().getNorthEast());
|
447
|
+
this.boundsObject.extend(this.circles[i].serviceObject.getBounds().getSouthWest());
|
448
|
+
}
|
449
|
+
}
|
450
|
+
//in every case, I've to take into account the bounds set up by the user
|
451
|
+
for (var i = 0; i < this.map_options.bounds.length; ++i) {
|
452
|
+
//create points from bounds provided
|
453
|
+
var bound = Gmaps4Rails.createLatLng(this.map_options.bounds[i].lat, this.map_options.bounds[i].lng);
|
454
|
+
this.boundsObject.extend(bound);
|
455
|
+
}
|
456
|
+
|
457
|
+
//SECOND_STEP: ajust the map to the bounds
|
458
|
+
if (this.map_options.auto_adjust || this.map_options.bounds.length > 0) {
|
459
|
+
|
460
|
+
//if autozoom is false, take user info into account
|
461
|
+
if(!this.map_options.auto_zoom) {
|
462
|
+
var map_center = this.boundsObject.getCenter();
|
463
|
+
this.map_options.center_longitude = map_center.lat();
|
464
|
+
this.map_options.center_latitude = map_center.lng();
|
465
|
+
this.map.setCenter(map_center);
|
466
|
+
}
|
467
|
+
else {
|
468
|
+
Gmaps4Rails.fitBounds();
|
469
|
+
}
|
470
|
+
}
|
676
471
|
},
|
677
472
|
|
678
|
-
|
679
|
-
|
473
|
+
|
474
|
+
////////////////////////////////////////////////////
|
475
|
+
///////////////// Basic functions //////////////////
|
476
|
+
///////////////////tests coded//////////////////////
|
477
|
+
|
478
|
+
//basic function to check existence of a variable
|
479
|
+
exists: function(var_name) {
|
480
|
+
return (var_name !== "" && typeof var_name !== "undefined");
|
680
481
|
},
|
681
482
|
|
682
|
-
|
683
|
-
|
483
|
+
//randomize
|
484
|
+
randomize: function(Lat0, Lng0) {
|
485
|
+
//distance in meters between 0 and max_random_distance (positive or negative)
|
486
|
+
var dx = this.markers_conf.max_random_distance * this.random();
|
487
|
+
var dy = this.markers_conf.max_random_distance * this.random();
|
488
|
+
var Lat = parseFloat(Lat0) + (180/Math.PI)*(dy/6378137);
|
489
|
+
var Lng = parseFloat(Lng0) + ( 90/Math.PI)*(dx/6378137)/Math.cos(Lat0);
|
490
|
+
return [Lat, Lng];
|
684
491
|
},
|
685
492
|
|
686
|
-
|
687
|
-
|
688
|
-
markers_array,
|
689
|
-
{ maxZoom: this.markers_conf.clusterer_maxZoom, gridSize: this.markers_conf.clusterer_gridSize, styles: Gmaps4Rails.customClusterer() }
|
690
|
-
);
|
691
|
-
},
|
493
|
+
//gives a value between -1 and 1
|
494
|
+
random: function() { return(Math.random() * 2 -1); }
|
692
495
|
|
693
|
-
clearClusterer: function() {
|
694
|
-
this.markerClusterer.clearMarkers();
|
695
|
-
},
|
696
|
-
|
697
|
-
//checks if obj is included in arr Array and returns the position or false
|
698
|
-
includeMarkerImage: function(arr, obj) {
|
699
|
-
for(var i=0; i<arr.length; i++) {
|
700
|
-
if (arr[i].url == obj) {return i;}
|
701
|
-
}
|
702
|
-
return false;
|
703
|
-
},
|
704
|
-
|
705
|
-
////////////////////////////////////////////////////
|
706
|
-
///////////////// Basic functions //////////////////
|
707
|
-
///////////////////tests coded//////////////////////
|
708
|
-
|
709
|
-
//basic function to check existence of a variable
|
710
|
-
exists: function(var_name) {
|
711
|
-
return (var_name !== "" && typeof var_name !== "undefined");
|
712
|
-
},
|
713
|
-
|
714
|
-
//randomize
|
715
|
-
randomize: function(Lat0, Lng0) {
|
716
|
-
//distance in meters between 0 and max_random_distance (positive or negative)
|
717
|
-
var dx = this.markers_conf.max_random_distance * this.random();
|
718
|
-
var dy = this.markers_conf.max_random_distance * this.random();
|
719
|
-
var Lat = parseFloat(Lat0) + (180/Math.PI)*(dy/6378137);
|
720
|
-
var Lng = parseFloat(Lng0) + ( 90/Math.PI)*(dx/6378137)/Math.cos(Lat0);
|
721
|
-
return [Lat, Lng];
|
722
|
-
},
|
723
|
-
|
724
|
-
//gives a value between -1 and 1
|
725
|
-
random: function() { return(Math.random() * 2 -1); }
|
726
|
-
|
727
496
|
};
|