﻿
////////////////////////////////////////////////////////////////////////////////////////////////////
// FlashEffect
////////////////////////////////////////////////////////////////////////////////////////////////////
function FlashEffect(iTime, iEffect)
{
    var This = this;
    
    // Data members
    This.Time = iTime;
    This.Effect = iEffect;
}

FlashEffect.Compare = function(iLeft, iRight)
{ return iLeft.Time - iRight.Time; }


////////////////////////////////////////////////////////////////////////////////////////////////////
// FlashItem
////////////////////////////////////////////////////////////////////////////////////////////////////
function FlashItem(iElement)
{
    var This = this;

    // Data members
    This.Element = iElement;
    This.Effects = [];
    
    // Methods
    This.AddEffect = function(iTime, iEffect)
    { This.Effects.push(new FlashEffect(iTime, iEffect)); }
   
}


////////////////////////////////////////////////////////////////////////////////////////////////////
// FlashSlide
////////////////////////////////////////////////////////////////////////////////////////////////////
function FlashSlide(iElement, iLength)
{
    var This = this;

    // Data members
    This.Content = null;
    This.Items = [];
    This.Effects = [];
    This.Timer = null;
    This.NextEffectIndex = 0;
    This.StartTime = 0;
    This.Length = 0;

    // Events
    This.OnEnd = new EventHandler();

    // Methods
    This.AddItem = function(iItem)
    { This.Items.push(iItem); }

    This.Show = function()
    { This.Content.Element.Class.Remove('invisible'); }

    This.Hide = function()
    { This.Content.Element.Class.Add('invisible'); }

    This.BringFront = function()
    { This.Content.Element.Class.Add('front'); }

    This.SendBack = function()
    { This.Content.Element.Class.Remove('front'); }

    This.Start = function()
    {
        for (var i = This.Effects.length-1; i >= 0; i--)
            This.Effects[i].Effect.Update(0);
   
        This.NextEffectIndex = 0;
        This.StartTime = Date.now();
        This.Next();
    }
    
    This.Stop = function()
    {
        if (This.Timer)
        {
            This.Timer.Stop();
            This.Timer = null;
            
            for (var i = 0; i < This.Effects.length; i++)
                This.Effects[i].Effect.Stop();
        }
    }

    This.Next = function()
    {
        var nextEffectHandler;
        var delay;
        
        if (This.NextEffectIndex < This.Effects.length)
        {
            var currentEffect = This.Effects[This.NextEffectIndex];
            delay = This.StartTime + currentEffect.Time - Date.now();
            nextEffectHandler = This.Timeout;
        }
        else
        {
            delay = This.StartTime + This.Length - Date.now();
            nextEffectHandler = This.OnEnd.Invoke;
        }
        
        if (delay < 0)
            delay = 0;

        This.Timer = new Timer(delay, nextEffectHandler);
        This.Timer.Start();
    }

    This.Timeout = function()
    {
        This.Effects[This.NextEffectIndex].Effect.Start();
        This.NextEffectIndex++;
        This.Next();
    }
    
    This.UpdateEffects = function()
    {
        This.Effects = [];
        This.Length = 0;
        
        for (var i = 0; i < This.Items.length; i++)
        {
            var item = This.Items[i];

            This.Effects = This.Effects.concat(item.Effects);
            
            for (var e = 0; e < item.Effects.length; e++)
            {
                var effectEnd = item.Effects[e].Time + item.Effects[e].Effect.Length;
                This.Length = (effectEnd > This.Length) ? effectEnd : This.Length;
            }
        }
        This.Effects.sort(FlashEffect.Compare);
    }    

    // Initialize
    {
        This.Content = new FlashItem(iElement);
        This.AddItem(This.Content);
        
        if (iLength)
            This.Content.AddEffect(iLength, new Effect(null, 0));
    }
}


////////////////////////////////////////////////////////////////////////////////////////////////////
// FlashShow
////////////////////////////////////////////////////////////////////////////////////////////////////
function FlashShow(iId)
{
    var This = this;

    // Data members
    This.Screen = Elements.Get(iId);
    This.Loading = new Control(iId + '-loading');
    This.Slides = [];
    This.BackSlideIndex = null;
    This.CurrentSlideIndex = null;
    
    // Events
    This.OnInitialize = new EventHandler();

    // Methods
    This.AddSlide = function(iSlide)
    {
        This.Slides.push(iSlide);
        iSlide.OnEnd.Add(This.NextSlide);        
    }
    
    This.ActivateSlide = function(iIndex)
    {
        // Hide back slide
        if (This.BackSlideIndex != null)
            This.Slides[This.BackSlideIndex].Hide();
    
        // Make current slide as back
        This.BackSlideIndex = This.CurrentSlideIndex;
        if (This.BackSlideIndex != null)
        {
            This.Slides[This.BackSlideIndex].Stop();
            This.Slides[This.BackSlideIndex].SendBack();
        }

        // Make next slide as current
        This.CurrentSlideIndex = iIndex;
        This.Slides[This.CurrentSlideIndex].BringFront();
        This.Slides[This.CurrentSlideIndex].Start();
        This.Slides[This.CurrentSlideIndex].Show();
    }

    This.SlideActivated = function()
    {
        if (This.PreviousFrame != null)
            This.Slides[This.BackSlideIndex].Hide();
    }

    This.Play = function(iStartSlide)
    {
        for (var i = 0; i < This.Slides.length; i++)
            This.Slides[i].UpdateEffects();

        if (iStartSlide)
            This.ActivateSlide(iStartSlide);
        else
            This.NextSlide();
    }

    This.PreviousSlide = function()
    { This.ActivateSlide((This.CurrentSlideIndex != null) ? ((This.CurrentSlideIndex + This.Slides.length - 1) % This.Slides.length) : 0); }

    This.NextSlide = function()
    { This.ActivateSlide((This.CurrentSlideIndex != null) ? ((This.CurrentSlideIndex + 1) % This.Slides.length) : 0); }

}

////////////////////////////////////////////////////////////////////////////////////////////////////
// FlashContentLoader
////////////////////////////////////////////////////////////////////////////////////////////////////
function FlashContentLoader(iContent)
{
    var This = this;

    // Methods
    This.Load = function (iFlashSlideShow, iContent)
    {
        var headerFlashElement = document.getElementById('header-flash');

        for (var i = 0; i < iContent.length; i++)
        {
            var divSlide = document.createElement('div');
            var divImage = document.createElement('div');
            var divContent = document.createElement('div');
            var divHeadline = document.createElement('div');
            var divSummary = document.createElement('div');
            var divLink = document.createElement('a');
            var leftText = iContent[i].Text.position.split(',')[0];
            var topText = iContent[i].Text.position.split(',')[1];
            var widthText = iContent[i].Text.width;
            var headlineText = iContent[i].Text.headline;
            var summaryText = iContent[i].Text.summary;
            var leftImage = iContent[i].Image.position.split(',')[0];
            var topImage = iContent[i].Image.position.split(',')[1];
            var srcImage = iContent[i].Image.source;
            var linkUrl = iContent[i].Link.url;
            var linkText = iContent[i].Link.text;
            
            divSlide.setAttribute('id', 'header-flash-slide-' + i);
            divImage.setAttribute('id', 'header-flash-slide-' + i + '-image');
            divContent.setAttribute('id', 'header-flash-slide-' + i + '-content');
            divHeadline.setAttribute('id', 'header-flash-slide-' + i + '-headline');
            divSummary.setAttribute('id', 'header-flash-slide-' + i + '-summary');
            divLink.setAttribute('id', 'header-flash-slide-' + i + '-link');

            divSlide.className = 'slide invisible';
            divContent.className = 'slidecontent';
            divHeadline.className = 'headline';
            divSummary.className = 'summary';
            divLink.className = 'more';

            divImage.style.position = "absolute";
            divImage.style.styleFloat = "left";
            divImage.style.width = "1024px";
            divImage.style.height = "360px";
            divImage.style.background = 'transparent url(' + srcImage + ') no-repeat';
            divImage.style.backgroundPosition = leftImage + "px " + topImage + "px";
            divContent.style.top = topText + 'px';
            divContent.style.left = leftText + 'px';
            divContent.style.width = widthText + 'px';

            divHeadline.innerHTML = headlineText;
            divSummary.innerHTML = summaryText;
            divLink.innerHTML = linkText;
            divLink.href = linkUrl;

            headerFlashElement.appendChild(divSlide);
            divSlide.appendChild(divImage);
            divImage.appendChild(divContent);
            divContent.appendChild(divHeadline);
            divContent.appendChild(divSummary);
            divContent.appendChild(divLink);
        }

        for (var i = 0; i < iContent.length; i++)
        {
            var slide = new FlashSlide(Elements.Get('header-flash-slide-' + i), 12000);
            var image = new FlashItem(Elements.Get('header-flash-slide-' + i + '-image'));
            var content = new FlashItem(Elements.Get('header-flash-slide-' + i + '-content'));
            var link = new FlashItem(Elements.Get('header-flash-slide-' + i + '-link'));

            slide.Content.AddEffect(0, new Fade(slide.Content.Element, 0, 1, 500));
            content.AddEffect(1000, new Fade(content.Element, 0, 1, 500));
            content.AddEffect(1000, new Translate(content.Element, { x: 30, y: 0 }, 800, Trends.Dampered));
            link.AddEffect(3000, new Fade(link.Element, 0, 1, 500));
            link.AddEffect(3000, new Translate(link.Element, { x: 30, y: 0 }, 800, Trends.Dampered));

            slide.AddItem(image);
            slide.AddItem(content);
            slide.AddItem(link);

            iFlashSlideShow.AddSlide(slide);
        }
    }
     
     // Initialize
     {
        This.Content  = iContent;  
     }
}

////////////////////////////////////////////////////////////////////////////////////////////////////

