﻿

////////////////////////////////////////////////////////////////////////////////////////////////////
// StoryItem
////////////////////////////////////////////////////////////////////////////////////////////////////
function StoryItem(iTime, iEffect)
{
    var This = this;

    // Data members
    This.Time = iTime;
    This.Effect = iEffect;
}

StoryItem.Compare = function(iLeft, iRight)
{ return iLeft.Time - iRight.Time; }


////////////////////////////////////////////////////////////////////////////////////////////////////
// Movie
////////////////////////////////////////////////////////////////////////////////////////////////////
function Movie(iLength, iRepeat)
{
    var This = this;

    // Data members
    This.Story = [];
    This.NextItem = 0;
    This.Timer = null;
    This.StartTime = null;
    This.Length = (iLength) ? iLength : 0;
    This.Repeat = (iRepeat) ? iRepeat : false;

    // Events
    This.OnComplete = new EventHandler();

    // Methods
    This.Add = function(iTime, iEffect)
    {
        if (iTime + iEffect.Length > This.Length)
            This.Length = iTime + iEffect.Length;
        This.Story.push(new StoryItem(iTime, iEffect));
    }

    This.Play = function()
    {
        if (This.Story.length > 0)
        {
            This.Story.sort(StoryItem.Compare);
            This.NextItem = 0;
            This.StartTime = Date.now();
            This.Tick(0);
        }
    }

    This.Stop = function()
    {
        This.Timer.Stop();
    }

    This.Tick = function()
    {
        var time = Date.now() - This.StartTime;

        Debug.Write('Time: ' + time + '   Next: ' + This.NextItem + '\n');

        for (var i = This.NextItem; i < This.Story.length; i++)
        {
            var item = This.Story[i];

            if (item.Time > time)
                break;

            item.Effect.Start();
        }

        This.NextItem = i;

        if (This.NextItem < This.Story.length)
            This.Timer = new Timer(This.StartTime + This.Story[This.NextItem].Time - Date.now(), This.Tick);
        else if (This.Length < Date.now() - This.StartTime)
            This.Timer = new Timer(This.StartTime + This.Length - Date.now(), This.Tick);
        else if (This.Repeat)
            This.Timer = new Timer(0, This.Play);
        else
        {
            This.Timer = null;
            return;
        }

        This.Timer.Start();
    }

    // Initialize
    {
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////
