module Ropenlayer
  module Openlayer
    module Layer
      class Base
        
        attr_reader :config
        attr_reader :name
        attr_reader :js_id
        attr_reader :map
        
        def self.build_collection(map)
          map.layer_names.uniq.inject([]) do |layers, layer_name|
            layers << new(layer_name, map)
            layers
          end
        end
        
        def initialize(name, map)
          @name   = name
          @map    = map
          @js_id  = "#{ map.js_id }_#{ name }"
          @config = self.class.layers_config[name]
        end
        
        def to_js
          %( // Adding #{ @name } layer  
            #{ Ropenlayer::Openlayer::Js.new_var(@js_id, "#{ Ropenlayer::Openlayer::Js.new_method(@config[:method], @config) }").to_js } 
            #{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }.addLayer(#{ @js_id })").to_js } )
        end
        
        private 
        # return a hash with config options for Ropenlayer layers.
        # U can override this method as ur wish to get config from other places, for example, AR.
        def self.layers_config
          { :osm              => { :method      => "OpenLayers.Layer.OSM",
                                  :args        => [ "'Usar Mapa OSM'" ],
                                  :propierties => { },
                                  :description => 'Mapa Libre OSM' },
            
            :wms              => { :method      => "OpenLayers.Layer.WMS",
                                  :args        => [ "'OpenLayers WMS'", "'http://vmap0.tiles.osgeo.org/wms/vmap0'" ],
                                  :propierties => { :layers => "'basic'" },
                                  :description => 'Mapa Libre WMS'},
            
            :wms              => { :method      => "OpenLayers.Layer.WMS",
                                  :args        => [ "'OpenLayers WMS'", "'http://vmap0.tiles.osgeo.org/wms/vmap0'" ],
                                  :propierties => { :layers => "'basic'" },
                                  :description => 'Mapa Libre WMS' },
            
            :google_streets   => { :method      => "OpenLayers.Layer.Google",
                                  :args        => [ "'Google Streets'" ],
                                  :propierties => { :numZoomLevels => "20" },
                                  :description => 'Mapa StreetsGoogle' },
            
            :google_satellite => { :method      => "OpenLayers.Layer.Google",
                                  :args        => [ "'Google Satellite'" ],
                                  :propierties => { :type => "google.maps.MapTypeId.SATELLITE", :numZoomLevels => "22" },
                                  :description => 'Mapa Satélite de Google' },
            
            :google_physical  => { :method      => "OpenLayers.Layer.Google",
                                  :args        => [ "'Google Physical'" ],
                                  :propierties => { :type => "google.maps.MapTypeId.TERRAIN"  },
                                  :description => 'Mapa Físico de Google' },
            
            :google_hybrid    => { :method      => "OpenLayers.Layer.Google",
                                  :args        => [ "'Google Hybrid'" ],
                                  :propierties => { :type => "google.maps.MapTypeId.HYBRID", :numZoomLevels => "22"   },
                                  :description => 'Mapa Híbrido de Google' },
            
            :yahoo            => { :method      => "OpenLayers.Layer.Yahoo",
                                  :args        => [  ],
                                  :propierties => {  },
                                  :description => 'Mapa Yahoo' },
            :new_elements     => { :method      => "OpenLayers.Layer.Vector",
                                  :args        => [ "'Vector Layer for create elements'" ],
                                  :propierties => {  },
                                  :description => 'New Vectors Layer' },

            :vector_elements  => { :method      => "OpenLayers.Layer.Vector",
                                  :args        => [ "'Capa de Marcadores''" ],
                                  :propierties => {  },
                                  :description => 'Capa para marcadores de elements' }
          }
        end
      end
    end
  end
end