cloud_kicker 0.0.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/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/cloud_kicker.gemspec +64 -0
- data/example/cloud_kicker.yml +23 -0
- data/lib/critical_juncture/cloud_kicker.rb +10 -0
- data/lib/critical_juncture/control_elements.rb +42 -0
- data/lib/critical_juncture/map/map_bookmarking.rb +20 -0
- data/lib/critical_juncture/map/map_events.rb +69 -0
- data/lib/critical_juncture/map/map_location.rb +62 -0
- data/lib/critical_juncture/map.rb +136 -0
- data/lib/critical_juncture/markers/ajax_markers.rb +82 -0
- data/lib/critical_juncture/markers/marker.rb +62 -0
- data/test/helper.rb +10 -0
- data/test/test_cloud_kicker.rb +7 -0
- metadata +95 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Bob Burbach
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= Cloud Kicker
|
2
|
+
|
3
|
+
Rails abstraction layer for creating maps using the Cloudmade web framework.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 Critical Juncture. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "cloud_kicker"
|
8
|
+
gem.summary = 'Rails abstraction layer for creating maps using the Cloudmade web framework.'
|
9
|
+
gem.description = <<-EOF
|
10
|
+
Rails abstraction layer for creating maps using the Cloudmade web framework. Makes creating maps with custom
|
11
|
+
color schemes, ajax markers and customizable marker info windows quick and easy.
|
12
|
+
EOF
|
13
|
+
gem.email = "govpulse@gmail.com"
|
14
|
+
gem.homepage = "http://github.com/trifecta/cloud_kicker"
|
15
|
+
gem.authors = ["Bob Burbach"]
|
16
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
17
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
|
+
end
|
19
|
+
Jeweler::GemcutterTasks.new
|
20
|
+
rescue LoadError
|
21
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'rake/testtask'
|
25
|
+
Rake::TestTask.new(:test) do |test|
|
26
|
+
test.libs << 'lib' << 'test'
|
27
|
+
test.pattern = 'test/**/test_*.rb'
|
28
|
+
test.verbose = true
|
29
|
+
end
|
30
|
+
|
31
|
+
begin
|
32
|
+
require 'rcov/rcovtask'
|
33
|
+
Rcov::RcovTask.new do |test|
|
34
|
+
test.libs << 'test'
|
35
|
+
test.pattern = 'test/**/test_*.rb'
|
36
|
+
test.verbose = true
|
37
|
+
end
|
38
|
+
rescue LoadError
|
39
|
+
task :rcov do
|
40
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
task :test => :check_dependencies
|
45
|
+
|
46
|
+
task :default => :test
|
47
|
+
|
48
|
+
require 'rake/rdoctask'
|
49
|
+
Rake::RDocTask.new do |rdoc|
|
50
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
51
|
+
|
52
|
+
rdoc.rdoc_dir = 'rdoc'
|
53
|
+
rdoc.title = "cloud_kicker #{version}"
|
54
|
+
rdoc.rdoc_files.include('README*')
|
55
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
56
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0.pre1
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{cloud_kicker}
|
8
|
+
s.version = "0.0.0.pre1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Bob Burbach"]
|
12
|
+
s.date = %q{2010-03-28}
|
13
|
+
s.description = %q{ Rails abstraction layer for creating maps using the Cloudmade web framework. Makes creating maps with custom
|
14
|
+
color schemes, ajax markers and customizable marker info windows quick and easy.
|
15
|
+
}
|
16
|
+
s.email = %q{govpulse@gmail.com}
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"cloud_kicker.gemspec",
|
29
|
+
"example/cloud_kicker.yml",
|
30
|
+
"lib/critical_juncture/cloud_kicker.rb",
|
31
|
+
"lib/critical_juncture/control_elements.rb",
|
32
|
+
"lib/critical_juncture/map.rb",
|
33
|
+
"lib/critical_juncture/map/map_bookmarking.rb",
|
34
|
+
"lib/critical_juncture/map/map_events.rb",
|
35
|
+
"lib/critical_juncture/map/map_location.rb",
|
36
|
+
"lib/critical_juncture/markers/ajax_markers.rb",
|
37
|
+
"lib/critical_juncture/markers/marker.rb",
|
38
|
+
"test/helper.rb",
|
39
|
+
"test/test_cloud_kicker.rb"
|
40
|
+
]
|
41
|
+
s.homepage = %q{http://github.com/trifecta/cloud_kicker}
|
42
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
43
|
+
s.require_paths = ["lib"]
|
44
|
+
s.rubygems_version = %q{1.3.6}
|
45
|
+
s.summary = %q{Rails abstraction layer for creating maps using the Cloudmade web framework.}
|
46
|
+
s.test_files = [
|
47
|
+
"test/helper.rb",
|
48
|
+
"test/test_cloud_kicker.rb"
|
49
|
+
]
|
50
|
+
|
51
|
+
if s.respond_to? :specification_version then
|
52
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
59
|
+
end
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
map:
|
2
|
+
lat: 37.778605
|
3
|
+
long: -122.391369
|
4
|
+
zoom: 10
|
5
|
+
style:
|
6
|
+
id: 2
|
7
|
+
|
8
|
+
map_control:
|
9
|
+
visible: true
|
10
|
+
type: :large
|
11
|
+
bounds:
|
12
|
+
enabled: false
|
13
|
+
zoom: 2 #used when only a single point is passed to bound_points
|
14
|
+
bookmarking:
|
15
|
+
enabled: false
|
16
|
+
|
17
|
+
markers:
|
18
|
+
ajax:
|
19
|
+
enabled: false
|
20
|
+
url: ''
|
21
|
+
|
22
|
+
scroll_wheel_zoom:
|
23
|
+
enabled: true
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'map'
|
2
|
+
require 'control_elements'
|
3
|
+
|
4
|
+
Dir["#{File.join(File.dirname(__FILE__), 'map', '*.rb')}"].each do |filename|
|
5
|
+
require filename
|
6
|
+
end
|
7
|
+
|
8
|
+
Dir["#{File.join(File.dirname(__FILE__), 'markers', '*.rb')}"].each do |filename|
|
9
|
+
require filename
|
10
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Cloudkicker
|
2
|
+
module ControlElements
|
3
|
+
|
4
|
+
# add create a map control with type, position and padding
|
5
|
+
#
|
6
|
+
# Params:
|
7
|
+
# map_control_type
|
8
|
+
# The size of the control on the map
|
9
|
+
# Options - :large, :small
|
10
|
+
# position
|
11
|
+
# Where the control is located on the map
|
12
|
+
# Options - :top_right
|
13
|
+
# padding_x
|
14
|
+
# Amount of padding in the x direction in pixels - depends on where the position is set to,
|
15
|
+
# but always from the outer edge of the map
|
16
|
+
# padding_y
|
17
|
+
# Amount of padding in the y direction in pixels - depends on where the position is set to,
|
18
|
+
# but always from the outer edge of the map
|
19
|
+
|
20
|
+
def add_map_control(map_control_type, position = :top_right, padding_x = 10, padding_y = 10)
|
21
|
+
control_position = case position
|
22
|
+
when :top_right
|
23
|
+
'CM.TOP_RIGHT'
|
24
|
+
end
|
25
|
+
|
26
|
+
control_type = case @map_control_type.to_sym
|
27
|
+
when :large
|
28
|
+
'CM.LargeMapControl()'
|
29
|
+
when :small
|
30
|
+
'CM.SmallMapControl()'
|
31
|
+
end
|
32
|
+
|
33
|
+
js = <<-JS
|
34
|
+
// create a new control position and add padding
|
35
|
+
var control_position = new CM.ControlPosition(#{control_position}, new CM.Size(#{padding_x}, #{padding_y}));
|
36
|
+
map.addControl(new #{control_type}, #{control_position});
|
37
|
+
JS
|
38
|
+
|
39
|
+
return js
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CloudKicker
|
2
|
+
module MapBookmarking
|
3
|
+
def add_bookmarking_functions
|
4
|
+
add_location_to_anchor
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def add_location_to_anchor
|
10
|
+
<<-JS
|
11
|
+
function add_location_to_anchor(map){
|
12
|
+
var center = map.getCenter();
|
13
|
+
var anchor = '#center_lat=' + center.lat() + '¢er_lng=' + center.lng() + '&zoom=' + map.getZoom();
|
14
|
+
window.location.hash = anchor;
|
15
|
+
return false;
|
16
|
+
}
|
17
|
+
JS
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Cloudkicker
|
2
|
+
module MapEvents
|
3
|
+
|
4
|
+
def add_events(options={})
|
5
|
+
ajax_markers = options.delete(:ajax_markers)
|
6
|
+
enable_bookmarking = options.delete(:enable_bookmarking)
|
7
|
+
|
8
|
+
js << <<-JS
|
9
|
+
/*************************/
|
10
|
+
/* add events to the map */
|
11
|
+
/*************************/
|
12
|
+
JS
|
13
|
+
|
14
|
+
if ajax_markers
|
15
|
+
js << ajax_markers_event
|
16
|
+
end
|
17
|
+
|
18
|
+
js << map_drag_event(enable_bookmarking)
|
19
|
+
|
20
|
+
return js
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# Fires on map load and uses the ajax markers module to get markers from server
|
25
|
+
def ajax_markers_event
|
26
|
+
js = <<-JS
|
27
|
+
// get the markers for the area shown in the map (the bounds) on load
|
28
|
+
CM.Event.addListener(map, 'load', function() {
|
29
|
+
getMapPoints(map.getBounds());
|
30
|
+
});
|
31
|
+
JS
|
32
|
+
|
33
|
+
return js
|
34
|
+
end
|
35
|
+
|
36
|
+
def map_drag_event(enable_bookmarking)
|
37
|
+
js = []
|
38
|
+
|
39
|
+
js << <<-JS
|
40
|
+
// we get markers dynamically from the server
|
41
|
+
// here we set up the array of added markers and turn on the loading indicator
|
42
|
+
var added_markers = [];
|
43
|
+
$('.mapMarkerLoader img').show();
|
44
|
+
|
45
|
+
// show the map marker loading indicator and get the markers for the area shown in
|
46
|
+
// the map (the bounds)
|
47
|
+
CM.Event.addListener(map, 'dragend', function() {
|
48
|
+
$('.mapMarkerLoader img').show();
|
49
|
+
getMapPoints(map.getBounds());
|
50
|
+
JS
|
51
|
+
|
52
|
+
# if we're bookmarking then add the location to the url
|
53
|
+
if enable_bookmarking
|
54
|
+
js << <<-JS
|
55
|
+
//and add the new map location to the url so it's bookmarkable
|
56
|
+
add_location_to_anchor(map);
|
57
|
+
JS
|
58
|
+
end
|
59
|
+
|
60
|
+
# close our dragend map listener regarless
|
61
|
+
js << <<-JS
|
62
|
+
});
|
63
|
+
JS
|
64
|
+
|
65
|
+
return js
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Cloudkicker
|
2
|
+
module MapLocation
|
3
|
+
|
4
|
+
def set_map_center(lat long, zoom, bounds, bound_points, bound_zoom)
|
5
|
+
js = []
|
6
|
+
|
7
|
+
js << <<-JS
|
8
|
+
// check to see if this page has a map location in the url
|
9
|
+
if (self.document.location.hash) {
|
10
|
+
JS
|
11
|
+
|
12
|
+
js << add_bookmarking
|
13
|
+
|
14
|
+
js << <<-JS
|
15
|
+
// no location present in the url so use the app defaults
|
16
|
+
else {
|
17
|
+
JS
|
18
|
+
|
19
|
+
js << add_default_center(lat, long, zoom, bounds, bound_points, bound_zoom)
|
20
|
+
|
21
|
+
js << ' } //close our else from above when checking if a location was present in the url'
|
22
|
+
|
23
|
+
return js
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_bookmarking
|
27
|
+
# set up javascript to use map location in url if present (ie it was bookmarked)
|
28
|
+
js = <<-JS
|
29
|
+
var params = {};
|
30
|
+
$.each(self.document.location.hash.split(/&/), function(i, key_and_val){
|
31
|
+
var results = key_and_val.split(/=/);
|
32
|
+
var key = results[0].replace(/^#/, '');
|
33
|
+
var val = results[1];
|
34
|
+
params[key] = val;
|
35
|
+
});
|
36
|
+
|
37
|
+
// if all the required params are present then set a new map center and zoom
|
38
|
+
if (params.center_lat && params.center_lng && params.zoom) {
|
39
|
+
map.setCenter(new CM.LatLng(params.center_lat, params.center_lng), params.zoom);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
JS
|
43
|
+
|
44
|
+
return js
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_default_center(lat, long, zoom, bounds, bound_points, bound_zoom)
|
48
|
+
js = []
|
49
|
+
|
50
|
+
if bounds
|
51
|
+
if bound_points.size > 1
|
52
|
+
js << " map.zoomToBounds(#{bounding_box(bound_points)})"
|
53
|
+
else bound_points.size == 1
|
54
|
+
js << " map.setCenter(new CM.LatLng(#{bound_points.first.latitude}, #{bound_points.first.longitude}), #{bound_zoom});"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
js << " map.setCenter(new CM.LatLng(#{lat}, #{long}), #{zoom});"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
module Cloudkicker
|
2
|
+
class Map
|
3
|
+
include Cloudkicker::ControlElements
|
4
|
+
include Cloudkicker::MapLocation
|
5
|
+
include Cloudkicker::MapBookmarking
|
6
|
+
include Cloudkicker::MapEvents
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
configure
|
10
|
+
map:
|
11
|
+
lat:
|
12
|
+
long:
|
13
|
+
map_control:
|
14
|
+
map_control_type:
|
15
|
+
zoom:
|
16
|
+
style_id:
|
17
|
+
bounds:
|
18
|
+
bound_zoom:
|
19
|
+
enable_bookmarking:
|
20
|
+
ajax_markers:
|
21
|
+
ajax_url:
|
22
|
+
markers:
|
23
|
+
scroll_wheel_zoom_enabled:
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
@lat = options.delete(:lat) || @ck_config['map']['lat']
|
28
|
+
@long = options.delete(:long) || @ck_config['map']['long']
|
29
|
+
@map_control = options.delete(:map_control) || @ck_config['map']['map_control']['visible']
|
30
|
+
@map_control_type = options.delete(:map_control_type) || @ck_config['map']['map_control']['type'].to_sym
|
31
|
+
@zoom = options.delete(:zoom) || @ck_config['map']['zoom']
|
32
|
+
@style_id = options.delete(:style_id) || @ck_config['map']['style']['id']
|
33
|
+
@bounds = options.delete(:bounds) || @ck_config['map']['bounds']['enabled']
|
34
|
+
@bound_points = options.delete(:points) || 0
|
35
|
+
if @bounds && @bound_points == 0
|
36
|
+
raise "You must provide at least one point (via :bound_points) if you are using bounds set to true"
|
37
|
+
end
|
38
|
+
@bound_zoom = options.delete(:bound_zoom) || @ck_config['map']['bounds']['zoom'] #used when only a single point is passed to bound_points
|
39
|
+
@enable_bookmarking = options.delete(:enable_bookmarking) || @ck_config['map']['bookmarking']['enabled']
|
40
|
+
@ajax_markers = options.delete(:ajax_markers) || @ck_config['map']['markers']['ajax']['enabled']
|
41
|
+
@ajax_url = options.delete(:ajax_url) || @ck_config['map']['markers']['ajax']['url']
|
42
|
+
@markers = []
|
43
|
+
@disable_scroll_wheel_zoom = options.delete(:disable_scroll_wheel_zoom) || @ck_config['map']['scroll_wheel_zoom']['enabled']
|
44
|
+
end
|
45
|
+
|
46
|
+
def configure
|
47
|
+
app_root = RAILS_ROOT if defined?(RAILS_ROOT)
|
48
|
+
@ck_config = YAML.load( File.open("#{app_root}/config/cloud_kicker.yml", 'r') )
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_js(map_id='map')
|
52
|
+
js = []
|
53
|
+
js << <<-JS
|
54
|
+
<script type=\"text/javascript\" src=\"#{CLOUDMADE_SRC}\"></script>
|
55
|
+
<script type="text/javascript">
|
56
|
+
$(document).ready(function() {
|
57
|
+
|
58
|
+
// create a new cloudmade tile object with our api key and the map style we want
|
59
|
+
var cloudmade = new CM.Tiles.CloudMade.Web({key: '#{CLOUDMADE_API_KEY}', styleId: #{@style_id}});
|
60
|
+
|
61
|
+
// create a new map object on the DOM element reference by map_id and the tile object above
|
62
|
+
var map = new CM.Map('#{map_id}', cloudmade);
|
63
|
+
|
64
|
+
// set up options here like turning on or off certain map features or setting the map center
|
65
|
+
JS
|
66
|
+
|
67
|
+
if @disableScrollWheelZoom
|
68
|
+
js << <<-JS
|
69
|
+
map.disableScrollWheelZoom();
|
70
|
+
JS
|
71
|
+
end
|
72
|
+
|
73
|
+
if @map_control
|
74
|
+
js << add_map_control(@map_control_type)
|
75
|
+
end
|
76
|
+
|
77
|
+
js << set_map_center(@lat, @long, @zoom, @bounds, @bound_points, @bound_zoom)
|
78
|
+
|
79
|
+
js << add_map_events(:ajax_markers => @ajax_markers,
|
80
|
+
:enable_bookmarking => @enable_bookmarking)
|
81
|
+
|
82
|
+
unless @ajax_markers
|
83
|
+
@markers.each do |marker|
|
84
|
+
js << marker
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
js << '}); //end $(document).ready'
|
89
|
+
|
90
|
+
|
91
|
+
if @ajax_markers
|
92
|
+
js << add_ajax_marker_functions(@ajax_url)
|
93
|
+
end
|
94
|
+
|
95
|
+
if @enable_bookmarking
|
96
|
+
js << add_bookmarking_functions
|
97
|
+
end
|
98
|
+
|
99
|
+
js << '</script>'
|
100
|
+
js.join("\n")
|
101
|
+
end
|
102
|
+
|
103
|
+
def markers
|
104
|
+
@markers
|
105
|
+
end
|
106
|
+
|
107
|
+
def bounding_box(points)
|
108
|
+
# lats = []
|
109
|
+
# longs = []
|
110
|
+
# points.each do |point|
|
111
|
+
# lats << point.latitude
|
112
|
+
# longs << point.longitude
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# max_lat = lats.max
|
116
|
+
# min_lat = lats.min
|
117
|
+
# max_long = longs.max
|
118
|
+
# min_long = longs.min
|
119
|
+
#
|
120
|
+
# north_east_lat = max_lat + (max_lat - min_lat)
|
121
|
+
# north_east_long = max_long + (max_long - min_long)
|
122
|
+
#
|
123
|
+
# south_west_lat = min_lat - (max_lat - min_lat)
|
124
|
+
# south_west_long = min_long - (max_long - min_long)
|
125
|
+
|
126
|
+
cloud_map_points = []
|
127
|
+
|
128
|
+
points.each do |point|
|
129
|
+
cloud_map_points << "new CM.LatLng(#{point.latitude}, #{point.longitude})"
|
130
|
+
end
|
131
|
+
|
132
|
+
"new CM.LatLngBounds(#{cloud_map_points.join(',')})"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Cloudkicker
|
2
|
+
module AjaxMarkers
|
3
|
+
|
4
|
+
def add_ajax_marker_functions(url)
|
5
|
+
js = []
|
6
|
+
js << add_marker_function
|
7
|
+
js << get_map_points_function(url)
|
8
|
+
return js
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_marker_function
|
12
|
+
<<-JS
|
13
|
+
function add_markers(markers) {
|
14
|
+
$.each(added_markers, function(i, added_marker){
|
15
|
+
map.removeOverlay(added_marker);
|
16
|
+
});
|
17
|
+
added_markers = [];
|
18
|
+
|
19
|
+
$.each(markers, function(i, marker){
|
20
|
+
var myMarkerLatLng = new CM.LatLng(marker.lat,marker.lng);
|
21
|
+
|
22
|
+
var icon = new CM.Icon();
|
23
|
+
if(marker.tower) {
|
24
|
+
icon.image = "/images/dot_med.png";
|
25
|
+
}
|
26
|
+
else
|
27
|
+
{
|
28
|
+
icon.image = "/images/dot_med_blue.png";
|
29
|
+
}
|
30
|
+
|
31
|
+
icon.iconSize = new CM.Size(21, 21);
|
32
|
+
//icon.shadow = "/images/map_marker_shadow.png";
|
33
|
+
//icon.shadowSize = new CM.Size(31, 48);
|
34
|
+
//icon.iconAnchor = new CM.Point(20, 48);
|
35
|
+
|
36
|
+
var myMarker = new CM.Marker(myMarkerLatLng, {
|
37
|
+
title: marker.licensee,
|
38
|
+
icon: icon
|
39
|
+
});
|
40
|
+
|
41
|
+
CM.Event.addListener(myMarker, 'click', function(latlng){
|
42
|
+
if(marker.tower) {
|
43
|
+
map.openInfoWindow(myMarkerLatLng, parseTemplate($("#cell_tower_template").html(), marker), {maxWidth: 400, pixelOffset: new CM.Size(0,-10)});
|
44
|
+
}
|
45
|
+
else
|
46
|
+
{
|
47
|
+
map.openInfoWindow(myMarkerLatLng, parseTemplate($("#cell_site_template").html(), marker), {maxWidth: 400, pixelOffset: new CM.Size(0,-10)});
|
48
|
+
}
|
49
|
+
});
|
50
|
+
|
51
|
+
|
52
|
+
added_markers.push(myMarker);
|
53
|
+
map.addOverlay(myMarker);
|
54
|
+
});
|
55
|
+
|
56
|
+
$('.mapMarkerLoader img').hide();
|
57
|
+
}
|
58
|
+
JS
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_map_points_function(url)
|
62
|
+
<<-JS
|
63
|
+
function getMapPoints(CMBounds) {
|
64
|
+
var sw_CMLatLng = CMBounds.getSouthWest();
|
65
|
+
var sw_point = [sw_CMLatLng.lat(), sw_CMLatLng.lng()]
|
66
|
+
var ne_CMLatLng = CMBounds.getNorthEast();
|
67
|
+
var ne_point = [ne_CMLatLng.lat(), ne_CMLatLng.lng()]
|
68
|
+
|
69
|
+
$.ajax({
|
70
|
+
type:"GET",
|
71
|
+
url:'#{url}',
|
72
|
+
data:"per_page=200&fields=limited&search[conditions][descend_by_created_at]=1&search[conditions][within_bounds][sw_point][]=" + sw_point[0] + "&search[conditions][within_bounds][sw_point][]=" + sw_point[1] + "&search[conditions][within_bounds][ne_point][]=" + ne_point[0] + "&search[conditions][within_bounds][ne_point][]=" + ne_point[1],
|
73
|
+
dataType:'json',
|
74
|
+
success: add_markers
|
75
|
+
});
|
76
|
+
}
|
77
|
+
|
78
|
+
JS
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Cloudkicker
|
2
|
+
class Marker
|
3
|
+
def initialize(options={})
|
4
|
+
raise 'Map is required' unless options[:map]
|
5
|
+
raise 'Lat is required' unless options[:lat]
|
6
|
+
raise 'Long is required' unless options[:long]
|
7
|
+
@map = options.delete(:map)
|
8
|
+
@lat = options.delete(:lat)
|
9
|
+
@long = options.delete(:long)
|
10
|
+
@id = self.object_id
|
11
|
+
@title = options.delete(:title) || ''
|
12
|
+
@info = options.delete(:info) || ''
|
13
|
+
|
14
|
+
|
15
|
+
@info.gsub!(/\s+/, ' ')
|
16
|
+
@max_width = options.delete(:info_max_width) || 400
|
17
|
+
add_marker
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def add_marker
|
23
|
+
js = []
|
24
|
+
js << create_marker(@id, @lat, @long, @title)
|
25
|
+
js << add_info_window_to_marker(@id, @info, @max_width)
|
26
|
+
js << ''
|
27
|
+
# js << ' map.setCenter(myMarkerLatLng, 14);'
|
28
|
+
js << " map.addOverlay(myMarker_#{@id});"
|
29
|
+
|
30
|
+
@map.markers << js.join("\n")
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_marker(id, lat, long, title)
|
34
|
+
<<-JS
|
35
|
+
var myMarkerLatLng_#{id} = new CM.LatLng(#{lat},#{long});
|
36
|
+
var icon = new CM.Icon();
|
37
|
+
|
38
|
+
icon.image = "/images/map_marker.png";
|
39
|
+
icon.iconSize = new CM.Size(31, 48);
|
40
|
+
icon.shadow = "/images/map_marker_shadow.png";
|
41
|
+
icon.shadowSize = new CM.Size(31, 48);
|
42
|
+
icon.iconAnchor = new CM.Point(20, 48);
|
43
|
+
|
44
|
+
var myMarker_#{id} = new CM.Marker(myMarkerLatLng_#{id}, {
|
45
|
+
title: '#{title}',
|
46
|
+
icon: icon
|
47
|
+
});
|
48
|
+
JS
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_info_window_to_marker(id, info, max_width)
|
52
|
+
# Add listener to marker
|
53
|
+
# TODO single quotes should be esacaped not deleted. Escaping doesn't seem to be working at the moment though... clearly missing something
|
54
|
+
<<-JS
|
55
|
+
CM.Event.addListener(myMarker_#{id}, 'click', function(latlng) {
|
56
|
+
map.openInfoWindow(myMarkerLatLng_#{id}, '#{info.gsub(/'/,"")}', {maxWidth: #{max_width}, pixelOffset: new CM.Size(-8,-50)});
|
57
|
+
});
|
58
|
+
JS
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cloud_kicker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: true
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- pre1
|
10
|
+
version: 0.0.0.pre1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Bob Burbach
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-03-28 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: thoughtbot-shoulda
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :development
|
32
|
+
version_requirements: *id001
|
33
|
+
description: " Rails abstraction layer for creating maps using the Cloudmade web framework. Makes creating maps with custom \n color schemes, ajax markers and customizable marker info windows quick and easy.\n"
|
34
|
+
email: govpulse@gmail.com
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- LICENSE
|
41
|
+
- README.rdoc
|
42
|
+
files:
|
43
|
+
- .document
|
44
|
+
- .gitignore
|
45
|
+
- LICENSE
|
46
|
+
- README.rdoc
|
47
|
+
- Rakefile
|
48
|
+
- VERSION
|
49
|
+
- cloud_kicker.gemspec
|
50
|
+
- example/cloud_kicker.yml
|
51
|
+
- lib/critical_juncture/cloud_kicker.rb
|
52
|
+
- lib/critical_juncture/control_elements.rb
|
53
|
+
- lib/critical_juncture/map.rb
|
54
|
+
- lib/critical_juncture/map/map_bookmarking.rb
|
55
|
+
- lib/critical_juncture/map/map_events.rb
|
56
|
+
- lib/critical_juncture/map/map_location.rb
|
57
|
+
- lib/critical_juncture/markers/ajax_markers.rb
|
58
|
+
- lib/critical_juncture/markers/marker.rb
|
59
|
+
- test/helper.rb
|
60
|
+
- test/test_cloud_kicker.rb
|
61
|
+
has_rdoc: true
|
62
|
+
homepage: http://github.com/trifecta/cloud_kicker
|
63
|
+
licenses: []
|
64
|
+
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options:
|
67
|
+
- --charset=UTF-8
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 1
|
83
|
+
- 3
|
84
|
+
- 1
|
85
|
+
version: 1.3.1
|
86
|
+
requirements: []
|
87
|
+
|
88
|
+
rubyforge_project:
|
89
|
+
rubygems_version: 1.3.6
|
90
|
+
signing_key:
|
91
|
+
specification_version: 3
|
92
|
+
summary: Rails abstraction layer for creating maps using the Cloudmade web framework.
|
93
|
+
test_files:
|
94
|
+
- test/helper.rb
|
95
|
+
- test/test_cloud_kicker.rb
|