class Geocoder::Lookup::Google

def base_query_url(query)

def base_query_url(query)
  "#{protocol}://maps.googleapis.com/maps/api/geocode/json?"
end

def configure_ssl!(client)

def configure_ssl!(client)
  client.instance_eval {
    @ssl_context = OpenSSL::SSL::SSLContext.new
    options = OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3
    if OpenSSL::SSL.const_defined?('OP_NO_COMPRESSION')
      options |= OpenSSL::SSL::OP_NO_COMPRESSION
    end
    @ssl_context.set_params({options: options})
  }
end

def map_link_url(coordinates)

def map_link_url(coordinates)
  "http://maps.google.com/maps?q=#{coordinates.join(',')}"
end

def name

def name
  "Google"
end

def query_url_google_params(query)

def query_url_google_params(query)
  params = {
    :sensor => "false",
    :language => (query.language || configuration.language)
  }
  if query.options[:google_place_id]
    params[:place_id] = query.sanitized_text
  else
    params[(query.reverse_geocode? ? :latlng : :address)] = query.sanitized_text
  end
  unless (bounds = query.options[:bounds]).nil?
    params[:bounds] = bounds.map{ |point| "%f,%f" % point }.join('|')
  end
  unless (region = query.options[:region]).nil?
    params[:region] = region
  end
  unless (components = query.options[:components]).nil?
    params[:components] = components.is_a?(Array) ? components.join("|") : components
  end
  unless (result_type = query.options[:result_type]).nil?
    params[:result_type] = result_type.is_a?(Array) ? result_type.join("|") : result_type
  end
  params
end

def query_url_params(query)

def query_url_params(query)
  query_url_google_params(query).merge(
    :key => configuration.api_key
  ).merge(super)
end

def result_root_attr

def result_root_attr
  'results'
end

def results(query)

def results(query)
  return [] unless doc = fetch_data(query)
  case doc['status']
  when "OK" # OK status implies >0 results
    return doc[result_root_attr]
  when "OVER_QUERY_LIMIT"
    raise_error(Geocoder::OverQueryLimitError) ||
      Geocoder.log(:warn, "#{name} API error: over query limit.")
  when "REQUEST_DENIED"
    raise_error(Geocoder::RequestDenied, doc['error_message']) ||
      Geocoder.log(:warn, "#{name} API error: request denied (#{doc['error_message']}).")
  when "INVALID_REQUEST"
    raise_error(Geocoder::InvalidRequest, doc['error_message']) ||
      Geocoder.log(:warn, "#{name} API error: invalid request (#{doc['error_message']}).")
  end
  return []
end

def supported_protocols

def supported_protocols
  # Google requires HTTPS if an API key is used.
  if configuration.api_key
    [:https]
  else
    [:http, :https]
  end
end

def valid_response?(response)

def valid_response?(response)
  json = parse_json(response.body)
  status = json["status"] if json
  super(response) and ['OK', 'ZERO_RESULTS'].include?(status)
end