﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("O3.Cms");

O3.Cms.TickerTape = function(element) 
{
    O3.Cms.TickerTape.initializeBase(this, [element]);
}

O3.Cms.TickerTape.prototype = 
{
    /*******************************************************************************
    * Methods
    *******************************************************************************/
    initialize: function()
    {
        O3.Cms.TickerTape.callBaseMethod(this, 'initialize');
        this._onAppLoadHandler     =   Function.createDelegate(this, this.onAppLoad);
        Sys.Application.add_load(this._onAppLoadHandler);
    },
    
    initializeTickerTape: function(sender, e)
    {
        window.offscreenBuffering   =   true;
                    
        var items        =   new Array();
        
        for(i = 0; i < this.get_items().length; i++)
        {
            Array.add(items, this.get_items()[i].get_element());
        }
        
        var container       =   this.get_element();
        var zoneBounds      =   Sys.UI.DomElement.getBounds(container);
        var zoneWidth       =   zoneBounds.width;
        var initialOffset   =   this.get_initialItemOffset();
        var initialX        =   zoneWidth + 10 + initialOffset;
        var fps             =   this.get_fps();
        var speed           =   this.get_speed();
        var timerInterval   =   1000 / fps;
        var itemIndex       =   0;
        var itemMargin      =   this.get_itemMargin();
        
        if(items.length > 0)
        {
            items[0].x   =   initialX;
            Sys.UI.DomElement.setLocation(items[0], initialX, 1);
        }
        
        for(i = 0; i < items.length; i++)
        {
            items[i].width   =   Sys.UI.DomElement.getBounds(items[i]).width;
            
            var nextItemIndex =   i + 1;
            
            if(nextItemIndex < items.length)
            {
                var itemX    =   items[i].x;
                
                items[nextItemIndex].x    =   itemX + items[i].width + itemMargin;
                Sys.UI.DomElement.setLocation(items[nextItemIndex], items[nextItemIndex].x, 1);
            }
            
            items[i].style.display = "block";
        }
        
        var initializeAnimation = function()
        {
            var timerHandle = setInterval
            (
                function()
                {
                    for(i = 0; i < items.length; i++)
                    {
                        var currentItem = items[i];
                        
                        currentItem.x = currentItem.x - speed;
                        
                        if(currentItem.x < -(currentItem.width + 10))
                        {
                            // put the marquee after it's lower sibling
                            var siblingIndex = i - 1;
                            
                            if(siblingIndex < 0)
                            {
                                siblingIndex = items.length - 1;
                            }
                            
                            currentItem.x    =   items[siblingIndex].x + items[siblingIndex].width + itemMargin;
                            if(currentItem.x < initialX)
                            {
                                currentItem.x = initialX;
                            }
                        }
                        
                        Sys.UI.DomElement.setLocation(currentItem, currentItem.x, 1);
                    }
                },
                timerInterval
            );
        };
        
        initializeAnimation();
    },
    
    dispose: function()
    {
        Sys.Application.remove_load(this._onAppLoadHandler);
        O3.Cms.TickerTape.callBaseMethod(this, 'dispose');
    },
    
    registerItem: function(item)
    {
        Array.add(this.get_items(), item);
    },
    
    /*******************************************************************************
    * Properties
    *******************************************************************************/
    get_items: function()
    {
        if(this._items == null)
        {
            this._items = new Array();
        }
        return this._items;
    },
    
    get_initialItemOffset: function()
    {
        return this._initialItemOffset;
    },
    
    set_initialItemOffset: function(value)
    {
        this._initialItemOffset = value;
    },
    
    get_fps: function()
    {
        return this._fps;
    },
    
    set_fps: function(value)
    {
        this._fps = value;
    },
    
    get_speed: function()
    {
        return this._speed;
    },
    
    set_speed: function(value)
    {
        this._speed = value;
    },
    
    get_itemMargin: function()
    {
        return this._itemMargin;
    },
    
    set_itemMargin: function(value)
    {
        this._itemMargin = value;
    },
    
    /*******************************************************************************
    * Eventhandlers
    *******************************************************************************/
    onAppLoad: function(e)
    {
        this.initializeTickerTape();
    }
};

O3.Cms.TickerTape.registerClass('O3.Cms.TickerTape', Sys.UI.Control);
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();