module Ropenlayer
  module Openlayer
    module BoxControl
      class EditMap < Base
        def initialize(map)
          super('edit_map', map, :css_class => 'olControlEditMapControl')
          Ropenlayer::Openlayer::BoxControl::EditMap.controls.each do |control_name, control_options|
            
            
            @links  << { :id       => "'link_to_edit_map_control_#{ control_name }'",
                         :class    => "'olControlEditMapControlLink with_icon action_#{ control_name }'",
                         :text     => "'#{ control_options[:description] }'",
                         :title    => "'#{ control_options[:description] }'",
                         :onclick  => %( #{ map.js_helper.update_xhtml_element(map.js_notification_area, "'#{ control_options[:help]}'") }; \
                                         #{ map.js_helper.hide_xhtml_element(@js_links_id) }; \
                                         #{ map.js_id }ActivateEditControl('#{ control_name }'); return false ) }
                       
          end
          @links << { :id       => "'link_to_edit_map_control_cancel'",
                      :class    =>  "'olControlEditMapControlLink with_icon action_cancel'",
                      :text     => "Cancelar",
                      :onclick  => %( #{ map.js_id }ActivateEditControl('none'); #{  map.js_helper.hide_xhtml_element(@js_links_id) }; return false)  }
        end
        
        def to_js
          %( 
            var #{ map.js_id }EditMapControls = {};
            function #{ map.js_id }ActivateEditControl(selectedControl) {
              for(key in #{ map.js_id }EditMapControls) {
                var control = #{ map.js_id }EditMapControls[key];
                if(selectedControl == key) {
                  control.activate();
                } else {
                  control.deactivate();
                }
              }
            }
            #{ new_elements_layer = Ropenlayer::Openlayer::Layer::Base.new(:new_elements, @map)
              new_elements_layer.to_js }

            #{ Ropenlayer::Openlayer::BoxControl::EditMap.controls.inject('') do |edit_controls_js, control_array|
                control_name    = control_array.first
                control_options = control_array.last
                control_options[:args] = [ new_elements_layer.js_id, control_options[:args]].flatten
                control_options[:propierties][:featureAdded] = map.options[:add_feature_callback] || 'false' # FIXME

                edit_controls_js << %( #{ Ropenlayer::Openlayer::Js.new_var("#{ map.js_id }_#{ control_name }", 
                                                                            "#{ Ropenlayer::Openlayer::Js.new_method(control_options[:method], control_options) }").to_js }
                                        #{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }.addControl(#{ map.js_id }_#{ control_name })").to_js }
                                        #{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }EditMapControls['#{ control_name }'] = #{ map.js_id }_#{ control_name }").to_js }
                )
                edit_controls_js
              end }
      
            #{ super }
            )
        end
        
        private
        def self.controls
          { :add_point        => {:method      => "OpenLayers.Control.DrawFeature",
                                  :args        => [ "OpenLayers.Handler.Point" ],
                                  :propierties => { },
                                  :description => 'Crear un punto',
                                  :help        => 'Para crear un punto en el mapa, haga click en la posición deseada'
                                },
            :add_line         => { :method      => "OpenLayers.Control.DrawFeature",
                                  :args        => [ "OpenLayers.Handler.Path" ],
                                  :propierties => { },
                                  :description => 'Crear una línea',
                                  :help        => 'Para crear un punto en el mapa, haga click en la posición deseada'

                                },
            :add_polygon      => { :method      => "OpenLayers.Control.DrawFeature",
                                  :args        => [ "OpenLayers.Handler.Polygon" ],
                                  :propierties => { },
                                  :description => 'Crear un polígono',
                                  :help        => 'Para crear un punto en el mapa, haga click en la posición deseada'
                                }
          }
        end
      end
    end
  end
end