﻿RegisterNamespace('ToolStrip');

ToolStrip.Menu = function(element)
{
    // Private Members
    var self = this;
    var loadComplete = false;
    var menuItems = new Array();
    var scrollEnabled = false;
    var defaultLeftPosition = 0;
    
    
    // Public Properties
    this.Element = element;
    this.Events = new FreshLogicStudios.Scripts.EventCollection();
    this.Name = '';
    this.Width = 0;
    this.Offset = 0;
    
    
    // Private Methods
    function Initialize()
    {
        self.Name = self.Element.getAttribute('title');
        self.Element.setAttribute('title', '');
        
        var menu = document.createElement('div');
        menu.className = 'ToolStripMenu';
        menu.title = self.Name;
        menu.appendChild(self.Element);
        ToolStrip.MenuMask.appendChild(menu);
        
        self.Element = menu;
        
        var width = 0;
        var parentWidth = $(self.Element.parentNode).getWidth();
        var menuItemElements = self.Element.getElementsByTagName('a');
        
        // Calculate the width for the menu element by adding up the widths of the individual items in the list
        for(var i = 0; i < menuItemElements.length; i++)
        {
            menuItems[i] = new ToolStrip.MenuItem(menuItemElements[i]);
            width += menuItems[i].GetWidth();
        }
        
        self.Width = width;
        self.Element.style.width = FreshLogicStudios.Scripts.String.Format('{0}px', self.Width);
        
        if(self.Width > parentWidth)
        {
            scrollEnabled = true;
        }
        else
        {
            defaultLeftPosition = Math.floor((parentWidth - self.Width) / 2)
            self.Element.style.left = FreshLogicStudios.Scripts.String.Format('{0}px', defaultLeftPosition);
        }   
    }
    
    function ResetPosition()
    {        
        self.Offset = 0;
        self.Element.style.left = FreshLogicStudios.Scripts.String.Format('{0}px', defaultLeftPosition);
    }
    
    
    // Event Handlers
    function OnHideComplete(effect)
    {
        ResetPosition();
        self.Events.Fire('HideComplete', self);
        
        for(var i = 0; i < menuItems.length; i++)
        {
            menuItems[i].HideName();
        }     
    }
    
    function OnLoadComplete(effect)
    {
        self.Events.Fire('LoadComplete', self);
        self.Events.Fire('HideComplete', self);
    }
    
    function OnScrollComplete(effect)
    {
        self.Events.Fire('ScrollComplete', self);
    }
    
    function OnShowComplete(effect)
    {
        self.Events.Fire('ShowComplete', self);
        
        for(var i = 0; i < menuItems.length; i++)
        {
            menuItems[i].ShowName();
        }
    }
    
    
    // Public Methods
    this.Hide = function()
    {
        if(loadComplete)
        {
            new Effect.Move (self.Element,{ x: (scrollEnabled ? self.Offset : defaultLeftPosition), y: -174, mode: 'absolute', duration: 0.3, fps: 75, afterFinish: OnHideComplete});
        }
        else
        {
            loadComplete = true;
            new Effect.Move (self.Element,{ x: (scrollEnabled ? self.Offset : defaultLeftPosition), y: -174, mode: 'absolute', duration: 0.3, fps: 75, afterFinish: OnLoadComplete});
        }
    }
    
    this.Show = function()
    {
        new Effect.Move (self.Element,{ x: (scrollEnabled ? self.Offset : defaultLeftPosition), y: 0, mode: 'absolute', duration: 0.3, fps: 75, afterFinish: OnShowComplete});
    }
    
    this.ScrollRight = function()
    {
        var parentWidth = $(self.Element.parentNode).getWidth();
        var remainingWidth = 0;
        var totalWidth = 0;
        var totalTravelDistance = 0;
        
        // Calculate the width of all the page items that are completely viewable
        for(var i = 0; i < menuItems.length; i++)
        {
            var itemWidth = menuItems[i].GetWidth();
            totalWidth += itemWidth;
            
            if(totalWidth + self.Offset >= parentWidth)
            { 
                remainingWidth += itemWidth;
                
                if(totalTravelDistance + itemWidth < parentWidth)
                {
                    totalTravelDistance += itemWidth;
                }
            }
        }
        
        if(remainingWidth > parentWidth)
        {
            totalTravelDistance = parentWidth;
        }
        
        // Adjust the travel distance for any 'partially' viewable menu items
        var adjustment = (Math.abs(self.Offset) + parentWidth + remainingWidth) - self.Width;
        totalTravelDistance -= adjustment;
        
        // Set the offset
        self.Offset -= totalTravelDistance;
        
        // Slide the page
        new Effect.Move (self.Element,{ x: self.Offset, y: 0, mode: 'absolute', duration: 0.4, fps: 75, afterFinish: OnScrollComplete});
    }
    
    this.ScrollLeft = function()
    {
        var parentWidth = $(self.Element.parentNode).getWidth();
        var adjustment = 0;
        var totalWidth = 0;
        var totalTravelDistance = 0;
        
        // Calculate the width of all the page items that are completely viewable
        for(var i = 0; i < menuItems.length; i++)
        {
            var itemWidth = menuItems[i].GetWidth();
            totalWidth += itemWidth;
            
            if(totalWidth >= Math.abs(self.Offset))
            { 
                adjustment = totalWidth + self.Offset;
                break;
            }
        }
        
        totalTravelDistance = totalWidth;
        
        if(totalTravelDistance > parentWidth)
        {
            totalTravelDistance = parentWidth;
        }
        
        // Adjust the travel distance for any 'partially' viewable items
        totalTravelDistance -= adjustment;
        
        // Set the offset
        self.Offset += totalTravelDistance;
        
        // Slide the page
        new Effect.Move (self.Element,{ x: self.Offset, y: 0, mode: 'absolute', duration: 0.4, fps: 75, afterFinish: OnScrollComplete});
    }
    
    this.CanScrollRight = function()
    {
        var parentWidth = $(self.Element.parentNode).getWidth();
        
        if(scrollEnabled)
        {
            if(self.Width + self.Offset - parentWidth > 0)
            {
                return true;
            }
        }
        
        return false;
    }
    
    this.CanScrollLeft = function()
    {
        return (self.Offset < 0);
    }
    
    
    Initialize();
}

ToolStrip.MenuItem = function(element)
{
    // Private Members
    var nameSpan = null;
    var self = this;
    var width = 0;
    
    
    // Public Properties
    this.Element = element;
    
    
    // Private Methods
    function Initialize()
    {
        width = $(self.Element).getWidth();
        
        nameSpan = self.Element.getElementsByTagName('span')[0];
        new Effect.Opacity(nameSpan, {duration:0.0, from:0.7, to:0.0});
        nameSpan.style.visibility = 'hidden';
    }
    
    
    // Public Methods
    this.GetWidth = function()
    {
        return width;
    }
    
    this.Hide = function()
    {
        new Effect.Opacity(self.Element, {duration:0.5, from:0.7, to:0.0});
    }
    
    this.HideName = function()
    {
        new Effect.Opacity(nameSpan, {duration:0.5, from:0.7, to:0.0, afterFinish:OnHideNameComplete});
    }
    
    this.Show = function()
    {
        new Effect.Opacity(self.Element, {duration:0.5, from:0.0, to:0.7});
    }
    
    this.ShowName = function()
    {
        nameSpan.style.visibility = 'visible';
        new Effect.Opacity(nameSpan, {duration:0.5, from:0.0, to:0.7});
    }
    
    
    // Event Handlers
    function OnHideNameComplete(effect)
    {
        nameSpan.style.visibility = 'hidden';
    }
    
    
    Initialize();
}