gmaps4rails 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +7 -1
  3. data/README.rdoc +2 -2
  4. data/app/assets/javascripts/gmaps4rails/gmaps4rails.base.js.coffee +37 -96
  5. data/app/assets/javascripts/gmaps4rails/gmaps4rails.bing.js.coffee +11 -0
  6. data/app/assets/javascripts/gmaps4rails/gmaps4rails.googlemaps.js.coffee +85 -9
  7. data/app/assets/javascripts/gmaps4rails/gmaps4rails.mapquest.js.coffee +13 -2
  8. data/app/assets/javascripts/gmaps4rails/gmaps4rails.openlayers.js.coffee +54 -2
  9. data/app/views/gmaps4rails/_gmaps4rails.html.erb +1 -1
  10. data/gmaps4rails.gemspec +1 -0
  11. data/lib/generators/gmaps4rails/install_generator.rb +28 -12
  12. data/lib/gmaps4rails/acts_as_gmappable.rb +3 -46
  13. data/lib/gmaps4rails/api_wrappers/base_net_methods.rb +40 -0
  14. data/lib/gmaps4rails/api_wrappers/direction.rb +87 -0
  15. data/lib/gmaps4rails/api_wrappers/geocoder.rb +54 -0
  16. data/lib/gmaps4rails/api_wrappers/places.rb +74 -0
  17. data/lib/gmaps4rails/base.rb +80 -22
  18. data/lib/gmaps4rails/extensions/{array.rb → enumerable.rb} +1 -1
  19. data/lib/gmaps4rails/js_builder.rb +9 -17
  20. data/lib/gmaps4rails/json_builder.rb +1 -7
  21. data/lib/gmaps4rails/model_handler.rb +79 -0
  22. data/lib/gmaps4rails/version.rb +1 -1
  23. data/lib/gmaps4rails/view_helper.rb +4 -6
  24. data/public/javascripts/gmaps4rails/gmaps4rails.base.js +35 -112
  25. data/public/javascripts/gmaps4rails/gmaps4rails.bing.js +12 -0
  26. data/public/javascripts/gmaps4rails/gmaps4rails.googlemaps.js +123 -7
  27. data/public/javascripts/gmaps4rails/gmaps4rails.mapquest.js +12 -0
  28. data/public/javascripts/gmaps4rails/gmaps4rails.openlayers.js +53 -2
  29. data/spec/dummy/app/views/users/index.html.erb +88 -85
  30. data/spec/fixtures/google_direction_valid.json +65 -0
  31. data/spec/fixtures/google_geocoding_toulon_france.json +58 -0
  32. data/spec/fixtures/google_places_valid.json +45 -0
  33. data/spec/fixtures/google_wrong_geocoding.json +4 -0
  34. data/spec/lib/base_spec.rb +59 -0
  35. data/spec/lib/direction_spec.rb +53 -0
  36. data/spec/lib/geocoder_spec.rb +46 -0
  37. data/spec/{base/base_spec.rb → lib/js_builder_spec.rb} +0 -6
  38. data/spec/lib/json_builder_spec.rb +232 -0
  39. data/spec/lib/places_spec.rb +25 -0
  40. data/spec/models/user_spec.rb +75 -357
  41. data/spec/spec_helper.rb +1 -0
  42. data/spec/support/geocoding.rb +27 -1
  43. metadata +47 -12
  44. data/lib/gmaps4rails/geocoding.rb +0 -113
  45. data/lib/gmaps4rails/google_places.rb +0 -76
  46. data/spec/base/geocoding_spec.rb +0 -17
@@ -0,0 +1,87 @@
1
+ module Gmaps4rails
2
+
3
+ class Direction
4
+
5
+ include BaseNetMethods
6
+
7
+ attr_reader :ride, :output, :protocol, :options, :polylines, :language
8
+ attr_accessor :legs
9
+
10
+ def initialize(start_end, options= {}, output = "pretty")
11
+ @ride = OpenStruct.new start_end
12
+ @output = output
13
+ @protocol = options.delete(:protocol) || "http"
14
+ @language = options.delete(:language) || "en"
15
+ @options = options
16
+ raise_invalid unless valid?
17
+ self.legs = []
18
+ end
19
+
20
+ def get
21
+ checked_google_response do
22
+ #Each element in the legs array specifies a single leg of the journey from the origin to the destination in the calculated route
23
+ parsed_response["routes"].first["legs"].each do |leg|
24
+ extract_polylines(leg) if remove_polylines?
25
+ self.legs << {
26
+ "duration" => { "text" => leg["duration"]["text"], "value" => leg["duration"]["value"].to_f },
27
+ "distance" => { "text" => leg["distance"]["text"], "value" => leg["distance"]["value"].to_f },
28
+ "steps" => leg["steps"]
29
+ }
30
+ merge_polylines_with_leg if output == "pretty"
31
+ end
32
+ legs
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def extract_polylines(leg)
39
+ @polylines = leg["steps"].map {|step| step.delete("polyline")}
40
+ end
41
+
42
+ def polylines_json
43
+ polylines.map{ |poly| {"coded_array" => poly["points"]} }.to_json
44
+ end
45
+
46
+ def remove_polylines?
47
+ output == "pretty" || output == "clean"
48
+ end
49
+
50
+ def merge_polylines_with_leg
51
+ self.legs.last.merge!({ "polylines" => polylines_json })
52
+ end
53
+
54
+ def format_options_for_url
55
+ return "" if options.empty?
56
+ "&" + options.map do |k,v|
57
+ if v.is_a?(Array)
58
+ k + "=" + v * ("|")
59
+ else
60
+ k + "=" + v
61
+ end
62
+ end * ("&")
63
+ end
64
+
65
+ def base_request
66
+ "#{protocol}://maps.googleapis.com/maps/api/directions/json?language=#{language}&origin=#{ride.from}&destination=#{ride.to}&sensor=false" + format_options_for_url
67
+ end
68
+
69
+ def valid?
70
+ !(ride.from.empty? || ride.to.empty?)
71
+ end
72
+
73
+ def raise_net_status
74
+ raise Gmaps4rails::DirectionNetStatus, "The request sent to google was invalid (not http success): #{base_request}.\nResponse was: #{response}"
75
+ end
76
+
77
+ def raise_query_error
78
+ raise raise Gmaps4rails::DirectionStatus, "The query you passed seems invalid, status was: #{parsed_response["status"]}.\nRequest was: #{base_request}"
79
+ end
80
+
81
+ def raise_invalid
82
+ raise Gmaps4rails::DirectionInvalidQuery, "Origin and destination must be provided in a hash as first argument"
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -0,0 +1,54 @@
1
+ module Gmaps4rails
2
+
3
+ class Geocoder
4
+ include BaseNetMethods
5
+
6
+ attr_reader :address, :language, :raw, :protocol
7
+
8
+ def initialize(address, options = {})
9
+ raise Gmaps4rails::GeocodeInvalidQuery, "You must provide an address" if address.empty?
10
+
11
+ @address = address
12
+ @language = options[:language] || "en"
13
+ @raw = options[:raw] || false
14
+ @protocol = options[:protocol] || "http"
15
+ end
16
+
17
+ # returns an array of hashes with the following keys:
18
+ # - lat: mandatory for acts_as_gmappable
19
+ # - lng: mandatory for acts_as_gmappable
20
+ # - matched_address: facultative
21
+ # - bounds: facultative
22
+ # - full_data: facultative
23
+ def get_coordinates
24
+ checked_google_response do
25
+ return parsed_response if raw
26
+ parsed_response["results"].inject([]) do |memo, result|
27
+ memo << {
28
+ :lat => result["geometry"]["location"]["lat"],
29
+ :lng => result["geometry"]["location"]["lng"],
30
+ :matched_address => result["formatted_address"],
31
+ :bounds => result["geometry"]["bounds"],
32
+ :full_data => result
33
+ }
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def base_request
41
+ "#{protocol}://maps.googleapis.com/maps/api/geocode/json?language=#{language}&address=#{address}&sensor=false"
42
+ end
43
+
44
+ def raise_net_status
45
+ raise Gmaps4rails::GeocodeNetStatus, "The request sent to google was invalid (not http success): #{base_request}.\nResponse was: #{response}"
46
+ end
47
+
48
+ def raise_query_error
49
+ raise Gmaps4rails::GeocodeStatus, "The address you passed seems invalid, status was: #{parsed_response["status"]}.\nRequest was: #{base_request}"
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,74 @@
1
+ module Gmaps4rails
2
+
3
+ class Places
4
+
5
+ include BaseNetMethods
6
+
7
+ attr_reader :lat, :lng
8
+ delegate :key, :keyword, :radius, :lang, :raw, :protocol, :to => :@options
9
+
10
+ def initialize(lat, lng, options = {})
11
+ @lat, @lng = lat, lng
12
+ raise_invalid unless valid_position?
13
+ raise_missing_key unless options[:key]
14
+ options[:radius] ||= 7500
15
+ options[:lang] ||= "en"
16
+ options[:raw] ||= false
17
+ options[:protocol]||= "http"
18
+ @options = OpenStruct.new options
19
+ end
20
+
21
+ def get
22
+ checked_google_response do
23
+ return parsed_response if raw
24
+ parsed_response["results"].inject([]) do |memo, result|
25
+ memo << {
26
+ :lat => result["geometry"]["location"]["lat"],
27
+ :lng => result["geometry"]["location"]["lng"],
28
+ :name => result["name"],
29
+ :reference => result["reference"],
30
+ :vicinity => result["vicinity"],
31
+ :full_data => result
32
+ }
33
+ end
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def base_request
40
+ req = "#{protocol}://maps.googleapis.com/maps/api/place/search/json?language=#{lang}&location=#{lat},#{lng}&sensor=false&radius=#{radius}&key=#{key}"
41
+ req += "&keyword=#{keyword}" unless keyword.nil?
42
+ req
43
+ end
44
+
45
+ def valid_position?
46
+ !(lat.nil? || lng.nil?)
47
+ end
48
+
49
+ def raise_invalid
50
+ raise Gmaps4rails::PlacesInvalidQuery, "You must provide at least a lat/lon for a Google places query"
51
+ end
52
+
53
+ def raise_missing_key
54
+ raise "Google Places API requires an API key"
55
+ end
56
+
57
+ def raise_net_status
58
+ raise Gmaps4rails::PlacesNetStatus, "The request sent to google was invalid (not http success): #{base_request}.\nResponse was: #{response}"
59
+ end
60
+
61
+ def raise_query_error
62
+ raise Gmaps4rails::PlacesStatus, "The address you passed seems invalid, status was: #{parsed_response["status"]}.\nRequest was: #{base_request}"
63
+ end
64
+
65
+ def get_response
66
+ uri = URI.parse(base_url)
67
+ http = Net::HTTP.new(uri.host, uri.port)
68
+ http.use_ssl = true # Places API wants https
69
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE # to avoid any cert issues
70
+ http.request(Net::HTTP::Get.new(uri.request_uri))
71
+ end
72
+
73
+ end
74
+ end
@@ -1,17 +1,86 @@
1
- require 'gmaps4rails/acts_as_gmappable'
2
-
3
- require 'gmaps4rails/js_builder'
4
- require 'gmaps4rails/json_builder'
5
- require 'gmaps4rails/view_helper'
6
- require 'gmaps4rails/geocoding'
7
- require 'gmaps4rails/google_places'
8
- require 'gmaps4rails/extensions/array'
9
- require 'gmaps4rails/extensions/hash'
10
-
11
- require 'gmaps4rails/helper/gmaps4rails_helper'
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'json'
4
+ require 'ostruct'
12
5
 
13
6
  module Gmaps4rails
7
+
8
+ require 'gmaps4rails/extensions/enumerable'
9
+ require 'gmaps4rails/extensions/hash'
10
+
11
+ autoload :ModelHandler, 'gmaps4rails/model_handler'
12
+ autoload :ActsAsGmappable, 'gmaps4rails/acts_as_gmappable'
14
13
 
14
+ autoload :JsBuilder, 'gmaps4rails/js_builder'
15
+ autoload :JsonBuilder, 'gmaps4rails/json_builder'
16
+ autoload :ViewHelper, 'gmaps4rails/view_helper'
17
+ autoload :Gmaps4railsHelper,'gmaps4rails/helper/gmaps4rails_helper'
18
+
19
+ autoload :BaseNetMethods, 'gmaps4rails/api_wrappers/base_net_methods'
20
+ autoload :Geocoder, 'gmaps4rails/api_wrappers/geocoder'
21
+ autoload :Direction, 'gmaps4rails/api_wrappers/direction'
22
+ autoload :Places, 'gmaps4rails/api_wrappers/places'
23
+
24
+ mattr_accessor :http_proxy
25
+
26
+ # This method geocodes an address using the GoogleMaps webservice
27
+ # options are:
28
+ # * address: string, mandatory
29
+ # * lang: to set the language one wants the result to be translated (default is english)
30
+ # * raw: to get the raw response from google, default is false
31
+ def Gmaps4rails.geocode(address, lang="en", raw = false, protocol = "http")
32
+ ::Gmaps4rails::Geocoder.new(address, {
33
+ :language => lang,
34
+ :raw => raw,
35
+ :protocol => protocol
36
+ }).get_coordinates
37
+ end
38
+
39
+ def Gmaps4rails.create_json(object, &block)
40
+ ::Gmaps4rails::JsonBuilder.new(object).process(&block)
41
+ end
42
+
43
+ def Gmaps4rails.create_js_from_hash(hash)
44
+ ::Gmaps4rails::JsBuilder.new(hash).create_js
45
+ end
46
+
47
+ # This method retrieves destination results provided by GoogleMaps webservice
48
+ # options are:
49
+ # * start_end: Hash { "from" => string, "to" => string}, mandatory
50
+ # * options: details given in the github's wiki
51
+ # * output: could be "pretty", "raw" or "clean"; filters the output from google
52
+ #output could be raw, pretty or clean
53
+ def Gmaps4rails.destination(start_end, options={}, output="pretty")
54
+ Gmaps4rails::Direction.new(start_end, options, output).get
55
+ end
56
+
57
+ # does two things... 1) gecode the given address string and 2) triggers a a places query around that geo location
58
+ # optionally a keyword can be given for a filter over all places fields (e.g. "Bungy" to give all Bungy related places)
59
+ # IMPORTANT: Places API calls require an API key (param "key")
60
+
61
+ def Gmaps4rails.places_for_address(address, key, keyword = nil, radius = 7500, lang="en", raw = false)
62
+ raise Gmaps4rails::GeocodeInvalidQuery, "you must provide an address for a places_for_address query" if address.nil?
63
+ raise "Google Places API requires an API key" if key.nil?
64
+ res = Gmaps4rails.geocode(address) # will throw exception if nothing could be geocoded
65
+ Gmaps4rails.places(res.first[:lat], res.first[:lng], key, keyword, radius, lang, raw)
66
+ end
67
+
68
+ # does a places query around give geo location (lat/lng)
69
+ # optionally a keyword can be given for a filter over all places fields (e.g. "Bungy" to give all Bungy related places)
70
+ # IMPORTANT: Places API calls require an API key (param "key")
71
+ def Gmaps4rails.places(lat, lng, key, keyword = nil, radius = 7500, lang="en", raw = false, protocol = "https")
72
+ Gmaps4rails::Places.new(lat, lng, {
73
+ :key => key,
74
+ :keyword => keyword,
75
+ :radius => radius,
76
+ :lang => lang,
77
+ :raw => raw,
78
+ :protocol => protocol
79
+ }).get
80
+ end
81
+
82
+ private
83
+
15
84
  class GeocodeStatus < StandardError; end
16
85
  class GeocodeNetStatus < StandardError; end
17
86
  class GeocodeInvalidQuery < StandardError; end
@@ -23,8 +92,6 @@ module Gmaps4rails
23
92
  class PlacesStatus < StandardError; end
24
93
  class PlacesNetStatus < StandardError; end
25
94
  class PlacesInvalidQuery < StandardError; end
26
-
27
- mattr_accessor :http_proxy
28
95
 
29
96
  def Gmaps4rails.condition_eval(object, condition)
30
97
  case condition
@@ -34,15 +101,6 @@ module Gmaps4rails
34
101
  end
35
102
  end
36
103
 
37
- private
38
-
39
- # get the response from the url encoded address string
40
- def Gmaps4rails.get_response(url)
41
- url = URI.parse(url)
42
- http = Gmaps4rails.http_agent
43
- http.get_response(url)
44
- end
45
-
46
104
  # looks for proxy settings and returns a Net::HTTP or Net::HTTP::Proxy class
47
105
  def Gmaps4rails.http_agent
48
106
  proxy = ENV['HTTP_PROXY'] || ENV['http_proxy'] || self.http_proxy
@@ -1,4 +1,4 @@
1
- class Array
1
+ module Enumerable
2
2
  #Scopes on models generate Arrays
3
3
  #this method enables short call to the json creation for all elements in the array
4
4
  def to_gmaps4rails(&block)
@@ -1,9 +1,4 @@
1
1
  module Gmaps4rails
2
-
3
- def Gmaps4rails.create_js_from_hash(hash)
4
- ::Gmaps4rails::JsBuilder.new(hash).create_js
5
- end
6
-
7
2
  class JsBuilder
8
3
 
9
4
  DEFAULT_MAP_ID = "map"
@@ -94,9 +89,13 @@ module Gmaps4rails
94
89
  class Datum
95
90
  # example:
96
91
  # - name: :markers
97
- # - hash: { :data => json, :options => hash }
92
+ # - hash: { :data => json, :options => hash }
93
+
94
+ delegate :options, :data, :to => :@element_info
95
+
98
96
  def initialize(gmap_id, name, hash)
99
- @gmap_id, @hash, @name, @js = gmap_id, hash, name, Array.new
97
+ @gmap_id, @name, @js = gmap_id, name, Array.new
98
+ @element_info = OpenStruct.new(hash)
100
99
  end
101
100
 
102
101
  def create_js
@@ -108,7 +107,7 @@ module Gmaps4rails
108
107
  end
109
108
 
110
109
  def create_standard_js
111
- @js << "#{@gmap_id}.#{@name} = #{value};"
110
+ @js << "#{@gmap_id}.#{@name} = #{data};"
112
111
 
113
112
  set_configuration_variables
114
113
 
@@ -116,8 +115,8 @@ module Gmaps4rails
116
115
  end
117
116
 
118
117
  def create_direction_js
119
- @js << "#{@gmap_id}.direction_conf.origin = '#{value["from"]}';"
120
- @js << "#{@gmap_id}.direction_conf.destination = '#{value["to"]}';"
118
+ @js << "#{@gmap_id}.direction_conf.origin = '#{data["from"]}';"
119
+ @js << "#{@gmap_id}.direction_conf.destination = '#{data["to"]}';"
121
120
 
122
121
  set_direction_variables
123
122
 
@@ -150,13 +149,6 @@ module Gmaps4rails
150
149
  end
151
150
  end
152
151
 
153
- def options
154
- @hash[:options]
155
- end
156
-
157
- def value
158
- @hash[:data]
159
- end
160
152
  end
161
153
  end
162
154
 
@@ -1,10 +1,4 @@
1
- module Gmaps4rails
2
-
3
- def Gmaps4rails.create_json(object, &block)
4
- json_handler = ::Gmaps4rails::JsonBuilder.new(object, &block)
5
- json_handler.process(&block)
6
- end
7
-
1
+ module Gmaps4rails
8
2
  # the to_gmaps4rails method accepts a block to customize:
9
3
  # - infowindow
10
4
  # - picture
@@ -0,0 +1,79 @@
1
+ module Gmaps4rails
2
+
3
+ class ModelHandler
4
+
5
+ attr_accessor :options, :object
6
+
7
+ delegate :process_geocoding, :check_process, :checker, :lat_column, :lng_column, :msg, :validation,
8
+ :language, :protocol, :address, :callback, :normalized_address,
9
+ :to => :@options
10
+
11
+ def initialize(object, gmaps4rails_options)
12
+ @options = ::OpenStruct.new(gmaps4rails_options)
13
+ @object = object
14
+ end
15
+
16
+ # saves coordinates according to the various options
17
+ def retrieve_coordinates
18
+ return if prevent_geocoding?
19
+ checked_coordinates do
20
+ object.send("#{lng_column}=", coordinates.first[:lng])
21
+ object.send("#{lat_column}=", coordinates.first[:lat])
22
+ # save normalized address if required
23
+ object.send("#{normalized_address}=", coordinates.first[:matched_address]) if normalized_address
24
+ # Call the callback method to let the user do what he wants with the data
25
+ object.send(callback, coordinates.first[:full_data]) if callback
26
+ # update checker if required
27
+ object.send("#{checker}=", true) if check_geocoding?
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def checked_coordinates(&block)
34
+ yield if coordinates
35
+ end
36
+
37
+ def coordinates
38
+ @coordinates ||= get_coordinates
39
+ end
40
+
41
+ def get_coordinates
42
+ Gmaps4rails.geocode(object.send(address), language, false, protocol)
43
+ rescue GeocodeStatus, GeocodeInvalidQuery => e #address was invalid, add error to address.
44
+ Rails.logger.warn(e)
45
+ object.errors[address] << msg if condition_eval(object, validation)
46
+ false
47
+ rescue GeocodeNetStatus => e #connection error, No need to prevent save.
48
+ Rails.logger.warn(e)
49
+ false
50
+ end
51
+
52
+ # to prevent geocoding each time a save is made
53
+ # if process_geocoding is a TrueClass or a FalseClass, 'check_process' and 'checker' play an additional role
54
+ # if process_geocoding is a Proc or a Symbol, 'check_process' and 'checker' are skipped since process_geocoding bears the whole logic
55
+ def prevent_geocoding?
56
+ if process_geocoding.is_a?(TrueClass) || process_geocoding.is_a?(FalseClass)
57
+ return true if !condition_eval(object, process_geocoding)
58
+ condition_eval(object, check_process) && object.send(checker)
59
+ else
60
+ !condition_eval(object, process_geocoding)
61
+ end
62
+ end
63
+
64
+ # Do we have to check the geocoding
65
+ def check_geocoding?
66
+ if process_geocoding.is_a?(TrueClass) || process_geocoding.is_a?(FalseClass)
67
+ condition_eval(object, check_process)
68
+ else
69
+ false
70
+ end
71
+ end
72
+
73
+ def condition_eval(*args)
74
+ Gmaps4rails.condition_eval(*args)
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -1,3 +1,3 @@
1
1
  module Gmaps4rails
2
- VERSION = "1.5.2"
2
+ VERSION = "1.5.3"
3
3
  end
@@ -1,11 +1,9 @@
1
- require 'ostruct'
2
-
3
1
  module Gmaps4rails
4
2
 
5
3
  class ViewHelper
6
4
 
7
5
  OPENLAYERS = "http://www.openlayers.org/api/OpenLayers.js"
8
- MAPQUEST = "http://mapquestapi.com/sdk/js/v6.0.0/mqa.toolkit.js"
6
+ MAPQUEST = "http://www.mapquestapi.com/sdk/js/v7.0.s/mqa.toolkit.js"
9
7
  BING = "http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"
10
8
  GOOGLE = "//maps.google.com/maps/api/js?v=3.8"
11
9
  GOOGLE_EXT = "//google-maps-utility-library-v3.googlecode.com/svn/"
@@ -69,9 +67,9 @@ module Gmaps4rails
69
67
  when "bing" then @js_array << BING
70
68
  else #case googlemaps which is the default
71
69
  @js_array << "#{GOOGLE}&sensor=false&key=#{provider_key}&libraries=geometry#{google_libraries}&#{google_map_i18n}"
72
- @js_array << "#{GOOGLE_EXT}tags/infobox/1.1.9/src/infobox_packed.js" if custom_infowindow_class
73
- @js_array << "#{GOOGLE_EXT}tags/markerclustererplus/2.0.5/src/markerclusterer_packed.js" if do_clustering
74
- @js_array << "#{GOOGLE_EXT}trunk/richmarker/src/richmarker-compiled.js" if rich_marker
70
+ @js_array << "#{GOOGLE_EXT}tags/infobox/1.1.9/src/infobox_packed.js" if custom_infowindow_class
71
+ @js_array << "#{GOOGLE_EXT}tags/markerclustererplus/2.0.9/src/markerclusterer_packed.js" if do_clustering
72
+ @js_array << "#{GOOGLE_EXT}trunk/richmarker/src/richmarker-compiled.js" if rich_marker
75
73
  end
76
74
  end
77
75