01cdcf23f9fd207f2277f0713d02e237b64af08f
[rails.git] / app / controllers / site_controller.rb
1 class SiteController < ApplicationController
2   layout 'site'
3   layout :map_layout, :only => [:index, :export]
4
5   before_filter :authorize_web
6   before_filter :set_locale
7   before_filter :redirect_browse_params, :only => :index
8   before_filter :redirect_map_params, :only => [:index, :edit, :export]
9   before_filter :require_user, :only => [:welcome]
10   before_filter :require_oauth, :only => [:index]
11
12   def index
13     unless STATUS == :database_readonly || STATUS == :database_offline
14       session[:location] ||= OSM.ip_location(request.env['REMOTE_ADDR'])
15     end
16   end
17
18   def permalink
19     lon, lat, zoom = ShortLink.decode(params[:code])
20     new_params = params.except(:code, :lon, :lat, :zoom, :layers, :node, :way, :relation, :changeset)
21
22     if new_params.key? :m
23       new_params.delete :m
24       new_params[:mlat] = lat
25       new_params[:mlon] = lon
26     end
27
28     if params.key? :node
29       new_params[:controller] = 'browse'
30       new_params[:action] = 'node'
31       new_params[:id] = params[:node]
32     elsif params.key? :way
33       new_params[:controller] = 'browse'
34       new_params[:action] = 'way'
35       new_params[:id] = params[:way]
36     elsif params.key? :relation
37       new_params[:controller] = 'browse'
38       new_params[:action] = 'relation'
39       new_params[:id] = params[:relation]
40     elsif params.key? :changeset
41       new_params[:controller] = 'browse'
42       new_params[:action] = 'changeset'
43       new_params[:id] = params[:changeset]
44     else
45       new_params[:controller] = 'site'
46       new_params[:action] = 'index'
47     end
48
49     new_params[:anchor] = "map=#{zoom}/#{lat}/#{lon}"
50     new_params[:anchor] += "&layers=#{params[:layers]}" if params.key? :layers
51
52     redirect_to Hash[new_params]
53   end
54
55   def key
56     expires_in 7.days, :public => true
57     render :layout => false
58   end
59
60   def edit
61     editor = preferred_editor
62
63     if editor == "remote"
64       require_oauth
65       render :action => :index, :layout => map_layout
66       return
67     else
68       require_user
69     end
70
71     if params[:node]
72       bbox = Node.find(params[:node]).bbox.to_unscaled
73       @lat = bbox.centre_lat
74       @lon = bbox.centre_lon
75       @zoom = 18
76     elsif params[:way]
77       bbox = Way.find(params[:way]).bbox.to_unscaled
78       @lat = bbox.centre_lat
79       @lon = bbox.centre_lon
80       @zoom = 17
81     elsif params[:note]
82       note = Note.find(params[:note])
83       @lat = note.lat
84       @lon = note.lon
85       @zoom = 17
86     elsif params[:gpx]
87       trace = Trace.visible_to(@user).find(params[:gpx])
88       @lat = trace.latitude
89       @lon = trace.longitude
90       @zoom = 16
91     end
92   end
93
94   def copyright
95     @locale = params[:copyright_locale] || I18n.locale
96   end
97
98   def welcome
99   end
100
101   def help
102   end
103
104   def about
105   end
106
107   def export
108   end
109
110   def offline
111   end
112
113   def preview
114     render :text => RichText.new(params[:format], params[:text]).to_html
115   end
116
117   def id
118     render "id", :layout => false
119   end
120
121   private
122
123   def redirect_browse_params
124     if params[:node]
125       redirect_to node_path(params[:node])
126     elsif params[:way]
127       redirect_to way_path(params[:way])
128     elsif params[:relation]
129       redirect_to relation_path(params[:relation])
130     elsif params[:note]
131       redirect_to browse_note_path(params[:note])
132     elsif params[:query]
133       redirect_to search_path(:query => params[:query])
134     end
135   end
136
137   def redirect_map_params
138     anchor = []
139
140     if params[:lat] && params[:lon]
141       anchor << "map=#{params.delete(:zoom) || 5}/#{params.delete(:lat)}/#{params.delete(:lon)}"
142     end
143
144     if params[:layers]
145       anchor << "layers=#{params.delete(:layers)}"
146     elsif params.delete(:notes) == 'yes'
147       anchor << "layers=N"
148     end
149
150     if anchor.present?
151       redirect_to Hash[params].merge(:anchor => anchor.join('&'))
152     end
153   end
154 end