File: google_map.rb

package info (click to toggle)
tdiary-contrib 5.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,772 kB
  • sloc: ruby: 17,305; javascript: 8,263; lisp: 562; xml: 451; php: 61; sql: 40; makefile: 18
file content (192 lines) | stat: -rw-r--r-- 6,285 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# -*- coding: utf-8 -*-
#
# google_map.rb - embeded Google Map for tDiary, use Google Maps JavaScript API V3.
#                 https://developers.google.com/maps/documentation/javascript/tutorial
#
# Copyright (C) 2010, tamoot <tamoot+tdiary@gmail.com>
# You can redistribute it and/or modify it under GPL2.
#

def google_map(lat, lon, params = {})
	params.merge!(:lat => lat, :lon => lon)
	google_map_common(params)
end

def google_geomap(address, params = {})
	params.merge!(:address => address)
	google_map_common(params)
end

def google_map_common(params)
	params[:id]      ||= ''
	params[:lat]     ||= 0.0
	params[:lon]     ||= 0.0
	params[:address] ||= nil
	params[:zoom]    ||=  10
	params[:html]    ||= nil
	params[:title]   ||= nil
	params[:width]   ||= 320
	params[:height]  ||= 240
	params[:type]    ||= :ROADMAP
	params[:overview]||= false

	if feed?
		require 'cgi'

		url = nil
		if params[:lat].nonzero? && params[:lon].nonzero?
			query = "#{params[:lat]},#{params[:lon]}"
			url = %Q|https://maps.google.com/maps?q=#{CGI::escape(query)}|

		elsif params[:address] != nil
			query = params[:address]
			url = %Q|https://maps.google.com/maps?q=#{CGI::escape(query)}|

		end

		return %Q|<a href="#{url}">#{url}</a>| if url

	end 

	dom_id = "#{@gmap_date.strftime("%Y%m%d")}_#{@gmap_count}"
	params.merge!(:id => dom_id)
	@gmap_data << params
	@gmap_count += 1

	%Q|<div class="gmap" id="#{dom_id}" style="width : #{params[:width]}px; height : #{params[:height]}px;"></div>|
end

add_header_proc do
	if /\A(?:latest|day|month|nyear|preview)\z/ =~ @mode
		%Q|<script type="text/javascript" src="//maps.google.com/maps/api/js?key=#{@conf['google_map.key']}"></script>\n|
	end
end

add_body_enter_proc do |date|
	@gmap_data  = []
	@gmap_date  = date
	@gmap_count = 0
	''
end

add_body_leave_proc do |date|
	gmap_scripts = ''
	if !feed? && @gmap_data.any?
		gmap_scripts = %Q|<script type="text/javascript">\n<!--\n|
		@gmap_data.each do |data|
			if data[:address]
				gmap_scripts << google_geomap_script(data)
			else
				gmap_scripts << google_map_script(data)
			end
		end
		gmap_scripts << %Q|//-->\n</script>\n|
	end
	gmap_scripts
end

add_conf_proc('google_map', 'Google Maps', 'etc') do
	if @mode == 'saveconf' then
		@conf['google_map.key'], = @cgi.params['google_map.key']
	end

	<<-HTML
	<h3 class="subtitle">Google Maps API Key</h3>
	<p>API Key (see <a href="https://developers.google.com/maps/documentation/javascript/get-api-key">developers.google.com/maps</a>)</p>
	<p><input name="google_map.key" value="#{h @conf['google_map.key']}" size="50"></p>
	HTML
end

def google_map_script(hash)
	str = ''
	str << %Q|google.maps.event.addDomListener(window, 'load', function() {\n|
	str << %Q|   var mapdiv = document.getElementById("#{hash[:id]}");\n|
	str << %Q|   if(mapdiv){\n|
	str << %Q|      var myOptions = {\n|
	str << %Q|         zoom: #{hash[:zoom]},\n|
	str << %Q|         overviewMapControl: #{hash[:overview]},\n|
	str << %Q|         overviewMapControlOptions: {\n|
	str << %Q|            opened: #{hash[:overview]}\n|
	str << %Q|         },\n|
	str << %Q|         center: new google.maps.LatLng(#{hash[:lat]}, #{hash[:lon]}),\n|
	str << %Q|         mapTypeId: google.maps.MapTypeId.#{hash[:type]},\n|
	str << %Q|         scaleControl: true\n|
	str << %Q|      };\n|
	str << %Q|      var gMap = new google.maps.Map(mapdiv, myOptions);\n|
	# set Marker
	if hash[:title]
	str << %Q|      var marker = new google.maps.Marker({\n|
	str << %Q|         position: new google.maps.LatLng(#{hash[:lat]}, #{hash[:lon]}),\n|
	str << %Q|         map: gMap,\n|
	str << %Q|         title: '#{hash[:title]}'\n|
	str << %Q|      });\n|
	# set InfoWindow
	if hash[:html]
	str << %Q|      var infowindow = new google.maps.InfoWindow({\n|
	str << %Q|         content: '<span style="color: #000000;">#{hash[:html]}</span>',\n|
	str << %Q|         size: new google.maps.Size(350, 200)\n|
	str << %Q|      });\n|
	str << %Q|      infowindow.open(gMap, marker);\n|
	end # :html
	end # :title
	str << %Q|   };\n|
	str << %Q|});\n|

	str
end

def google_geomap_script(hash)
	str = ''
	str << %Q|google.maps.event.addDomListener(window, 'load', function() {\n|
	str << %Q|   var mapdiv = document.getElementById("#{hash[:id]}");\n|
	str << %Q|   if(mapdiv){\n|
	str << %Q|      var geocoder = new google.maps.Geocoder();\n|
	str << %Q|      if(geocoder) {\n|
	str << %Q|         geocoder.geocode( { 'address': '#{hash[:address]}'}, function(results, status) {\n|
	str << %Q|            if (status == google.maps.GeocoderStatus.OK) {\n|
	str << %Q|               var geoLat = results[0].geometry.location;\n|
	str << %Q|               var myOptions = {\n|
	str << %Q|                  zoom: #{hash[:zoom]},\n|
	str << %Q|                  overviewMapControl: #{hash[:overview]},\n|
	str << %Q|                  overviewMapControlOptions: {\n|
	str << %Q|                     opened: #{hash[:overview]}\n|
	str << %Q|                  },\n|
	str << %Q|                  center: geoLat,\n|
	str << %Q|                  mapTypeId: google.maps.MapTypeId.#{hash[:type]},\n|
	str << %Q|                  scaleControl: true\n|
	str << %Q|               };\n|
	str << %Q|               var gMap = new google.maps.Map(mapdiv, myOptions);\n|
	# set Marker
	if hash[:title]
	str << %Q|               var marker = new google.maps.Marker({\n|
	str << %Q|                  position: geoLat,\n|
	str << %Q|                  map: gMap,\n|
	str << %Q|                  title: '#{hash[:title]}'\n|
	str << %Q|               });\n|
	# set InfoWindow
	if hash[:html]
	str << %Q|               var infowindow = new google.maps.InfoWindow({\n|
	str << %Q|                  content: '<span style="color: #000000;">#{hash[:html]}</span>',\n|
	str << %Q|                  size: new google.maps.Size(350, 200)\n|
	str << %Q|               });\n|
	str << %Q|               infowindow.open(gMap, marker);\n|
	end # :html
	end # :title
	str << %Q|            }else{\n|
	str << %Q|               alert("Geocode was not successful for the following reason: " + status)\n|
	str << %Q|            }\n|
	str << %Q|         });\n|
	str << %Q|      }\n|
	str << %Q|   }\n|
	str << %Q|});\n|

	str
end

# Local Variables:
# mode: ruby
# indent-tabs-mode: t
# tab-width: 3
# ruby-indent-level: 3
# End:
# vim: ts=3