-- @docclass
g_effects = {}

function g_effects.fadeIn(widget, time, elapsed)
    if not elapsed then
        elapsed = 0
    end
    if not time then
        time = 300
    end
    widget:setOpacity(math.min(elapsed / time, 1))
    removeEvent(widget.fadeEvent)
    if elapsed < time then
        removeEvent(widget.fadeEvent)
        widget.fadeEvent = scheduleEvent(function()
            g_effects.fadeIn(widget, time, elapsed + 30)
        end, 30)
    else
        widget.fadeEvent = nil
    end
end

function g_effects.fadeOut(widget, time, elapsed)
    if not elapsed then
        elapsed = 0
    end
    if not time then
        time = 300
    end
    elapsed = math.max((1 - widget:getOpacity()) * time, elapsed)
    removeEvent(widget.fadeEvent)
    widget:setOpacity(math.max((time - elapsed) / time, 0))
    if elapsed < time then
        widget.fadeEvent = scheduleEvent(function()
            g_effects.fadeOut(widget, time, elapsed + 30)
        end, 30)
    else
        widget.fadeEvent = nil
    end
end

function g_effects.cancelFade(widget)
    removeEvent(widget.fadeEvent)
    widget.fadeEvent = nil
end

function g_effects.startBlink(widget, duration, interval, clickCancel)
    duration = duration or 0 -- until stop is called
    interval = interval or 500
    clickCancel = clickCancel or true

    removeEvent(widget.blinkEvent)
    removeEvent(widget.blinkStopEvent)

    widget.blinkEvent = cycleEvent(function()
        widget:setOn(not widget:isOn())
    end, interval)

    if duration > 0 then
        widget.blinkStopEvent = scheduleEvent(function()
            g_effects.stopBlink(widget)
        end, duration)
    end

    connect(widget, {
        onClick = g_effects.stopBlink
    })
end

function g_effects.stopBlink(widget)
    disconnect(widget, {
        onClick = g_effects.stopBlink
    })
    removeEvent(widget.blinkEvent)
    removeEvent(widget.blinkStopEvent)
    widget.blinkEvent = nil
    widget.blinkStopEvent = nil
    widget:setOn(false)
end
