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
  | 
class StopAreaMap < ApplicationMap
  attr_reader :stop_area
  attr_accessor :editable
  alias_method :editable?, :editable
  def initialize(stop_area)
    @stop_area = stop_area
  end
  def customize_map(map, page)
      if stop_area.children.present?
        page.assign "children_layer", kml_layer(stop_area, { :children => true }, :style_map => Design::StopAreasStyleMap.new(helpers).style_map)
        page << map.add_layer(:children_layer)
        page << map.add_control( hover_control_display_name(:children_layer) )
      end
      if stop_area.routing_stops.present?
        page.assign "routing_layer", kml_layer(stop_area, { :routing => true }, :style_map => Design::StopAreasStyleMap.new(helpers).style_map)
        page << map.add_layer(:routing_layer)
        page << map.add_control( hover_control_display_name(:routing_layer) )
        page << map.zoom_to_extent(bounds.to_google.to_openlayers) if bounds
      else
        if stop_area.new_record?
          page << <<EOF
          var createStyleMap = function() {
            var defProp = {strokeColor: "black", strokeOpacity: 1, strokeWidth: 2, fillColor: "white", fillOpacity: 1};
            var defStyle = OpenLayers.Util.applyDefaults(defProp, OpenLayers.Feature.Vector.style["default"]);
            return new OpenLayers.StyleMap({'default': defStyle});
          };
          var edit_stop_area_layer = new OpenLayers.Layer.Vector( "edit_stop_area_layer", {styleMap: createStyleMap()});
EOF
        else
          page.assign "edit_stop_area_layer", kml_layer(stop_area, { :default => editable? }, :style_map => Design::EditStopAreaStyleMap.new(helpers).style_map)
        end
        page << <<EOF
        var createAddressStyleMap = function() {
          var defProp = {fill: false, stroke: false, label: "\uf041", labelAlign: "cb", labelXOffset: 0, labelYOffset: 0, fontSize:"20px", fontOpacity: 1, fontFamily: "FontAwesome", labelOutlineWidth: 2};
          var defStyle = OpenLayers.Util.applyDefaults(defProp, OpenLayers.Feature.Vector.style["default"]);
          return new OpenLayers.StyleMap({'default': defStyle, });
        };
        var address_layer = new OpenLayers.Layer.Vector( "address_layer", {styleMap: createAddressStyleMap()});
        var removeAddress = function() {
          address_layer.destroyFeatures();
        };
        var addAddress = function( lat, lng, name ) {
          var wgs84point = new OpenLayers.Geometry.Point( lat, lng);
          var point = transformedGeometry( wgs84point, "EPSG:4326", "EPSG:900913" )
          var feature = new OpenLayers.Feature.Vector( point, { name: name});
          address_layer.addFeatures( [feature]);
          var bounds = new OpenLayers.Bounds();
          bounds.extend( feature.geometry.getBounds());
          for (var x in edit_stop_area_layer.features) {
              bounds.extend( edit_stop_area_layer.features[x].geometry.getBounds());
          }
          map.zoomToExtent(bounds.scale(2), true);
        };
        var transformedGeometry = function( geometry, origin, target ) {
          return geometry.clone().transform( new OpenLayers.Projection( origin ), new OpenLayers.Projection( target ));
        }
EOF
        page << map.add_layer(:address_layer)
        page << map.add_layer(:edit_stop_area_layer)
        if editable?
          page.assign "referential_projection", projection_type.present? ? projection("EPSG:" + projection_type) : JsVar.new("undefined")
          # TODO virer ce code inline
          page << <<EOF
          var getEventWGS84 = function( event) {
            return transformedGeometry( event.geometry, "EPSG:900913", "EPSG:4326");
          }
          var getEventProjection = function( event, projCode) {
            return transformedGeometry( event.geometry, "EPSG:900913", projCode);
          }
          var updateStopAreaCoordinates = function( event ) {
            var geometry = getEventWGS84( event );
            $('#stop_area_coordinates').val( geometry.y.toString()+ ","+ geometry.x.toString());
          }
          var updateStopAreaProjectionXY = function( event, projCode ) {
            var geometry = getEventProjection( event, projCode);
            $('#stop_area_projection_xy').val( geometry.x.toString()+ ","+ geometry.y.toString());
          }
          var drawControl = new OpenLayers.Control.DrawFeature( edit_stop_area_layer, OpenLayers.Handler.Point,
              { featureAdded: function(event) {
              console.log( "featureAdded" );
                  updateStopAreaCoordinates( event);
                  if( typeof referential_projection !== 'undefined') {
                    updateStopAreaProjectionXY( event, referential_projection.projCode);
                  }
                  this.deactivate();
                }
              });
          var dragControl = new OpenLayers.Control.DragFeature( edit_stop_area_layer,
              { autoActivate: true,
                onComplete: function(event) {
                  updateStopAreaCoordinates( event);
                  if( typeof referential_projection !== 'undefined') {
                    updateStopAreaProjectionXY( event, referential_projection.projCode);
                  }
                },
              });
            map.addControl( dragControl);
            map.addControl( drawControl);
EOF
          if stop_area.new_record?
          page << <<EOF
            drawControl.activate();
EOF
          end
        end
      page << map.set_center(center.to_google.to_openlayers, 16, false, true)
      end
  end
  def projection_type
    stop_area.referential.projection_type
  end
  def ready?
    center.present?
  end
  def center
    stop_area.geometry or stop_area.default_position
  end
  def bounds
    # for ITL only
    @bounds ||= GeoRuby::SimpleFeatures::Point.bounds(stop_area.routing_stops.collect(&:geometry).compact)
  end
end
  |