class Morris.Area extends Morris.Line

# Initialise
#
areaDefaults = 
  fillOpacity: 'auto'
  behaveLikeLine: false

constructor: (options) ->
  return new Morris.Area(options) unless (@ instanceof Morris.Area)
  areaOptions = $.extend {}, areaDefaults, options

  @cumulative = not areaOptions.behaveLikeLine

  if areaOptions.fillOpacity is 'auto'
    areaOptions.fillOpacity = if areaOptions.behaveLikeLine then .8 else 1

  super(areaOptions)

# calculate series data point coordinates
#
# @private
calcPoints: ->
  for row in @data
    row._x = @transX(row.x)
    total = 0
    row._y = for y in row.y
      if @options.behaveLikeLine
        @transY(y)
      else
        total += (y || 0)
        @transY(total)
    row._ymax = Math.max row._y...

# draw the data series
#
# @private
drawSeries: ->
  @seriesPoints = []
  if @options.behaveLikeLine
    range = [0..@options.ykeys.length-1]
  else
    range = [@options.ykeys.length-1..0]

  for i in range
    @_drawFillFor i
    @_drawLineFor i
    @_drawPointFor i

_drawFillFor: (index) ->
  path = @paths[index]
  if path isnt null
    path = path + "L#{@transX(@xmax)},#{@bottom}L#{@transX(@xmin)},#{@bottom}Z"
    @drawFilledPath path, @fillForSeries(index)

fillForSeries: (i) ->
  color = Raphael.rgb2hsl @colorFor(@data[i], i, 'line')
  Raphael.hsl(
    color.h,
    if @options.behaveLikeLine then color.s * 0.9 else color.s * 0.75,
    Math.min(0.98, if @options.behaveLikeLine then color.l * 1.2 else color.l * 1.25))

drawFilledPath: (path, fill) ->
  @raphael.path(path)
    .attr('fill', fill)
    .attr('fill-opacity', @options.fillOpacity)
    .attr('stroke', 'none')