class Chronic::RepeaterDayPortion

:nodoc:

def construct_date_from_reference_and_offset(reference, offset = nil)

def construct_date_from_reference_and_offset(reference, offset = nil)
  elapsed_seconds_for_range = offset || (@range.end - @range.begin)
  second_hand = ((elapsed_seconds_for_range - (12 * 60))) % 60
  minute_hand = (elapsed_seconds_for_range - second_hand) / (60) % 60
  hour_hand = (elapsed_seconds_for_range - minute_hand - second_hand) / (60 * 60) + reference.hour % 24
  Chronic.construct(reference.year, reference.month, reference.day, hour_hand, minute_hand, second_hand)
end

def initialize(type, options = {})

def initialize(type, options = {})
  super
  @current_span = nil
  if type.kind_of? Integer
    @range = (@type * 60 * 60)..((@type + 12) * 60 * 60)
  else
    @range = PORTIONS[type]
    @range || raise("Invalid type '#{type}' for RepeaterDayPortion")
  end
  @range || raise("Range should have been set by now")
end

def next(pointer)

def next(pointer)
  super
  unless @current_span
    now_seconds = @now - Chronic.construct(@now.year, @now.month, @now.day)
    if now_seconds < @range.begin
      case pointer
      when :future
        range_start = Chronic.construct(@now.year, @now.month, @now.day) + @range.begin
      when :past
        range_start = Chronic.construct(@now.year, @now.month, @now.day - 1) + @range.begin
      end
    elsif now_seconds > @range.end
      case pointer
      when :future
        range_start = Chronic.construct(@now.year, @now.month, @now.day + 1) + @range.begin
      when :past
        range_start = Chronic.construct(@now.year, @now.month, @now.day) + @range.begin
      end
    else
      case pointer
      when :future
        range_start = Chronic.construct(@now.year, @now.month, @now.day + 1) + @range.begin
      when :past
        range_start = Chronic.construct(@now.year, @now.month, @now.day - 1) + @range.begin
      end
    end
    offset = (@range.end - @range.begin)
    range_end = construct_date_from_reference_and_offset(range_start, offset)
    @current_span = Span.new(range_start, range_end)
  else
    days_to_shift_window =
    case pointer
    when :future
      1
    when :past
      -1
    end
    new_begin = Chronic.construct(@current_span.begin.year, @current_span.begin.month, @current_span.begin.day + days_to_shift_window, @current_span.begin.hour, @current_span.begin.min, @current_span.begin.sec)
    new_end = Chronic.construct(@current_span.end.year, @current_span.end.month, @current_span.end.day + days_to_shift_window, @current_span.end.hour, @current_span.end.min, @current_span.end.sec)
    @current_span = Span.new(new_begin, new_end)
  end
end

def offset(span, amount, pointer)

def offset(span, amount, pointer)
  @now = span.begin
  portion_span = self.next(pointer)
  direction = pointer == :future ? 1 : -1
  portion_span + (direction * (amount - 1) * RepeaterDay::DAY_SECONDS)
end

def this(context = :future)

def this(context = :future)
  super
  range_start = Chronic.construct(@now.year, @now.month, @now.day) + @range.begin
  range_end = construct_date_from_reference_and_offset(range_start)
  @current_span = Span.new(range_start, range_end)
end

def to_s

def to_s
  super << '-dayportion-' << @type.to_s
end

def width

def width
  @range || raise("Range has not been set")
  return @current_span.width if @current_span
  if @type.kind_of? Integer
    return (12 * 60 * 60)
  else
    @range.end - @range.begin
  end
end