Fill in license details.
[rails.git] / app / views / export / _start.rhtml
1 <% form_tag :action => "finish" do %>
2
3   <p class="export_heading">Area to Export</p>
4
5   <div class="export_bounds">
6     <%= text_field_tag('maxlat', nil, :size => 10, :class => "export_bound") %>
7     <br/>
8     <%= text_field_tag('minlon', nil, :size => 10, :class => "export_bound") %>
9     <%= text_field_tag('maxlon', nil, :size => 10, :class => "export_bound") %>
10     <br/>
11     <%= text_field_tag('minlat', nil, :size => 10, :class => "export_bound") %>
12     <p class="export_hint">
13       Drag a box with control held down to select an area to export
14     </p>
15   </div>
16
17   <p class="export_heading">Format to Export</p>
18
19   <div class="export_details">
20     <p>
21       <%= radio_button_tag("format", "osm") %>OpenStreetMap XML Data
22       <br/>
23       <%= radio_button_tag("format", "mapnik") %>Mapnik Image
24       <br/>
25       <%= radio_button_tag("format", "osmarender") %>Osmarender Image
26     </p>
27   </div>
28
29   <div id="export_osm">
30     <p class="export_heading">Licence</p>
31
32     <div class="export_details">
33       <p>OpenStreetMap data is licensed under the <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0 license</a>.</p>
34     </div
35   </div>
36
37   <div id="export_mapnik">
38     <p class="export_heading">Options</p>
39
40     <div class="export_details">
41       <p>Format <%= select_tag("mapnik_format", options_for_select([["PNG", "png"], ["JPEG", "jpeg"], ["SVG", "svg"], ["PDF", "pdf"], ["Postscript", "ps"]], "png")) %></p>
42       <p>Scale 1 : <%= text_field_tag("mapnik_scale", nil, :size => 8) %> <span class="export_hint">(max 1 : <span id="max_scale"></span>)</span></p>
43     </div>
44   </div>
45
46   <div id="export_osmarender">
47     <p class="export_heading">Options</p>
48
49     <div class="export_details">
50       <p>Format <%= select_tag("osmarender_format", options_for_select([["PNG", "png"], ["JPEG", "jpeg"]], "png")) %></p>
51       <p>Zoom <%= select_tag("osmarender_zoom", options_for_select([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])) %></p>
52     </div>
53   </div>
54
55   <div class="export_buttons">
56     <p><%= submit_tag "Export", :id => "export_commit" %></p>
57   </div>
58
59 <% end %>
60
61 <script type="text/javascript">
62   <!--
63   var vectors;
64   var box;
65
66   function startExport() {
67     vectors = new OpenLayers.Layer.Vector("Vector Layer", {
68       displayInLayerSwitcher: false,
69     });
70     map.addLayer(vectors);
71
72     box = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, { 
73       handlerOptions: {
74         keyMask: OpenLayers.Handler.MOD_CTRL,
75         sides: 4,
76         snapAngle: 90,
77         irregular: true,
78         persist: true,
79         callbacks: { done: boxComplete }
80       }
81     });
82     map.addControl(box);
83
84     box.activate();
85
86     map.events.register("moveend", map, mapMoved);
87
88     $("viewanchor").className = "";
89     $("exportanchor").className = "active";
90
91     openSidebar({ onclose: stopExport });
92
93     updateRegion(map.getExtent());
94   }
95
96   function stopExport() {
97     $("viewanchor").className = "active";
98     $("exportanchor").className = "";
99
100     map.events.unregister("moveend", map, mapMoved);
101     box.handler.clear();
102     map.removeLayer(vectors);
103   }
104
105   function formatChanged() {
106     if ($("format_osm").checked) {
107       $("export_osm").style.display = "inline";
108     } else {
109       $("export_osm").style.display = "none";
110     }
111
112     if ($("format_mapnik").checked) {
113       $("mapnik_scale").value = roundScale(map.getScale());
114       $("export_mapnik").style.display = "inline";
115     } else {
116       $("export_mapnik").style.display = "none";
117     }
118
119     if ($("format_osmarender").checked) {
120       var zoom = Math.min(map.getZoom(), maxOsmarenderZoom());
121
122       $("osmarender_zoom").options.selectedIndex = zoom - 4;
123       $("export_osmarender").style.display = "inline";
124     } else {
125       $("export_osmarender").style.display = "none";
126     }
127   }
128
129   $("format_osm").onclick = function() { formatChanged() };
130   $("format_mapnik").onclick = function() { formatChanged() };
131   $("format_osmarender").onclick = function() { formatChanged() };
132
133   function boundsChanged() {
134     var epsg4326 = new OpenLayers.Projection("EPSG:4326");
135     var bounds = new OpenLayers.Bounds($("minlon").value,
136                                        $("minlat").value,
137                                        $("maxlon").value,
138                                        $("maxlat").value);
139  
140     bounds.transform(epsg4326, map.getProjectionObject());
141
142     map.events.unregister("moveend", map, mapMoved);
143     map.zoomToExtent(bounds);
144
145     box.handler.clear();
146     box.handler.feature = new OpenLayers.Feature.Vector(bounds.toGeometry());
147     box.handler.layer.addFeatures([box.handler.feature], [box.handler.style]);
148     box.handler.layer.drawFeature(box.handler.feature, box.handler.style);
149   }
150
151   $("maxlat").onchange = function() { boundsChanged() };
152   $("minlon").onchange = function() { boundsChanged() };
153   $("maxlon").onchange = function() { boundsChanged() };
154   $("minlat").onchange = function() { boundsChanged() };
155
156   function mapMoved() {
157     updateRegion(map.getExtent());
158   }
159
160   function boxComplete(box) {
161     map.events.unregister("moveend", map, mapMoved);
162     updateRegion(box.getBounds());
163   }
164
165   function updateRegion(bounds) {
166     var epsg4326 = new OpenLayers.Projection("EPSG:4326");
167     var decimals = Math.pow(10, Math.floor(map.getZoom() / 3));
168
169     bounds.transform(map.getProjectionObject(), epsg4326);
170
171     $("minlon").value = Math.round(bounds.left * decimals) / decimals;
172     $("minlat").value = Math.round(bounds.bottom * decimals) / decimals;
173     $("maxlon").value = Math.round(bounds.right * decimals) / decimals;
174     $("maxlat").value = Math.round(bounds.top * decimals) / decimals;
175
176     if (bounds.getWidth() * bounds.getHeight() > 0.25) {
177       $("format_osm").disabled = true;
178       $("format_osm").checked = false;
179
180       formatChanged();
181     } else {
182       $("format_osm").disabled = false;
183     }
184     
185     var max_zoom = maxOsmarenderZoom();
186     var max_scale = maxMapnikScale();
187
188     $("max_scale").innerHTML = roundScale(max_scale);
189
190     for (var o = 0; o < $("osmarender_zoom").options.length; o++) {
191       var option = $("osmarender_zoom").options[o];
192
193       if (option.value > max_zoom) {
194         option.disabled = true;
195       } else {
196         option.disabled = false;
197       }
198     }
199
200     if ($("osmarender_zoom").options.selectedIndex + 4 > max_zoom) {
201       $("osmarender_zoom").options.selectedIndex = max_zoom - 4;
202     }
203   }
204
205   function maxMapnikScale() {
206     var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
207     var epsg4326 = new OpenLayers.Projection("EPSG:4326");
208     var epsg900913 = new OpenLayers.Projection("EPSG:900913");
209
210     bounds.transform(epsg4326, epsg900913);
211
212     return Math.floor(Math.sqrt(bounds.getWidth() * bounds.getHeight() / 0.3136));
213   }
214
215   function maxOsmarenderZoom() {
216     var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
217     var xzoom = Math.LOG2E * Math.log(2000 * 1.40625 / bounds.getWidth());
218     var ymin = bounds.bottom * Math.PI / 180;
219     var ymax = bounds.top * Math.PI / 180;
220     var yzoom = Math.LOG2E * (Math.log(2000 * 2 * Math.PI) - Math.log(Math.log((Math.tan(ymax) + 1 / Math.cos(ymax)) / (Math.tan(ymin) + 1 / Math.cos(ymin)))))
221
222     return Math.floor(Math.min(xzoom, yzoom));
223   }
224
225   function roundScale(scale) {
226     var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
227
228     return precision * Math.ceil(scale / precision);
229   }
230
231   function validateScale() {
232     if ($("mapnik_scale").value < maxMapnikScale()) {
233       $("export_commit").disabled = true;
234     } else {
235       $("export_commit").disabled = false;
236     }
237   }
238
239   $("mapnik_scale").onchange = function() { validateScale() };
240
241   startExport();
242   // -->
243 </script>