Report abuse


			
passing geocode class either a postcode string or an object.

geocodes = Geocode.new("postcode")

or Geocode.new(object_with_postcode_attribute)

  (to avoid doing

  object.lat = geocodes.lat
  object.lng = geocodes.lng)


require 'hive/collect'

module BookerBee
  class Geocode

    SERVER = 'geo.localsearchmaps.com'

    attr_accessor :lat, :lng, :partial

    def (obj,country=:uk)

      if obj.class != String
        geocode(obj.postcode,country)
        obj.lat = @lat
        obj.lng = @lng
        return obj
      else
        geocode(obj,country)
      end

    end

    private

    def geocode(code,country)
      code.gsub!(/\s/){}
      code.upcase!
      if code.size > 4
        code = code.split('').insert(-4,'+').join('')
      else
        code = (code.split('')[0..3] << '+').join('')
      end
      part = code.split('+').first

      p code
      p part
      codes = {}
      eval File.readlines("lib/geocodes/#{country.to_s}.txt").to_s

      if codes[code]
        @lat = codes[code][:lat]
        @lng = codes[code][:lng]
      else
        page = "/?zip=#{code}&country=#{country.to_s}"
        response = BookerBee::Hive::Collect.new(SERVER,page).response
        if response.include?('Zoom')
          parse(response)
        elsif codes[part]
          @lat = codes[part][:lat]
          @lng = codes[part][:lng]
          @partial = true
        else
          puts "#{code} not found"
        end
      end

      code = part if @partial
      unless codes[code]
        file = File.open("lib/geocodes/#{country.to_s}.txt", "a")
        file.puts "codes['#{code}'] = {:lat => '#{@lat}', :lng => '#{@lng}'}"
        file.close
      end
    end

    def parse(response,partial=false)
      codes = response.match(/nt\((.*)\),/)[1].split(', ')
      @lng = codes.first
      @lat = codes.last
      @partial = partial
    end
  end
end