Merge remote-tracking branch 'origin/master' into routing
[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 => [:edit, :welcome]
10   before_filter :require_oauth, :only => [:index]
11
12   def index
13     unless STATUS == :database_readonly or STATUS == :database_offline
14       session[:location] ||= OSM::IPLocation(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, :node, :way, :relation, :changeset)
21
22     if new_params.has_key? :m
23       new_params.delete :m
24       new_params[:mlat] = lat
25       new_params[:mlon] = lon
26     end
27
28     if params.has_key? :node
29       new_params[:controller] = 'browse'
30       new_params[:action] = 'node'
31       new_params[:id] = params[:node]
32     elsif params.has_key? :way
33       new_params[:controller] = 'browse'
34       new_params[:action] = 'way'
35       new_params[:id] = params[:way]
36     elsif params.has_key? :relation
37       new_params[:controller] = 'browse'
38       new_params[:action] = 'relation'
39       new_params[:id] = params[:relation]
40     elsif params.has_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
51     redirect_to new_params
52   end
53
54   def key
55     expires_in 7.days, :public => true
56     render :layout => false
57   end
58
59   def edit
60     editor = preferred_editor
61
62     if editor == "remote"
63       require_oauth
64       render :action => :index, :layout => map_layout
65       return
66     end
67
68     if params[:node]
69       bbox = Node.find(params[:node]).bbox.to_unscaled
70       @lat = bbox.centre_lat
71       @lon = bbox.centre_lon
72       @zoom = 18
73     elsif params[:way]
74       bbox = Way.find(params[:way]).bbox.to_unscaled
75       @lat = bbox.centre_lat
76       @lon = bbox.centre_lon
77       @zoom = 17
78     elsif params[:note]
79       note = Note.find(params[:note])
80       @lat = note.lat
81       @lon = note.lon
82       @zoom = 17
83     elsif params[:gpx]
84       trace = Trace.visible_to(@user).find(params[:gpx])
85       @lat = trace.latitude
86       @lon = trace.longitude
87       @zoom = 16
88     end
89   end
90
91   def copyright
92     @locale = params[:copyright_locale] || I18n.locale
93   end
94
95   def welcome
96   end
97
98   def help
99   end
100
101   def about
102   end
103
104   def export
105   end
106
107   def offline
108   end
109
110   def preview
111     render :text => RichText.new(params[:format], params[:text]).to_html
112   end
113
114   def id
115     render "id", :layout => false
116   end
117
118   private
119
120   def redirect_browse_params
121     if params[:node]
122       redirect_to node_path(params[:node])
123     elsif params[:way]
124       redirect_to way_path(params[:way])
125     elsif params[:relation]
126       redirect_to relation_path(params[:relation])
127     elsif params[:note]
128       redirect_to browse_note_path(params[:note])
129     elsif params[:query]
130       redirect_to search_path(:query => params[:query])
131     end
132   end
133
134   def redirect_map_params
135     anchor = []
136
137     if params[:lat] && params[:lon]
138       anchor << "map=#{params.delete(:zoom) || 5}/#{params.delete(:lat)}/#{params.delete(:lon)}"
139     end
140
141     if params[:layers]
142       anchor << "layers=#{params.delete(:layers)}"
143     elsif params.delete(:notes) == 'yes'
144       anchor << "layers=N"
145     end
146
147     if anchor.present?
148       redirect_to params.merge(:anchor => anchor.join('&'))
149     end
150   end
151 end