// Need to store the objects in array for switching purposes
var _ExclusiveObjectControllerArray = new Array();

function ExclusiveObjectController()
{
    this._ExclusiveArticleArray = new Array();
    this._ExclusiveContainerArray = new Array();
    this._TimerEvent = null;
    this._TimerInterval;
    this._TimerReset;
    this._TotalRotations = 0;
    this._MaxRotations = 0;
    this._UseTimer = false;
    this._UseReset = true;
    this._LastIndex = -1;    
    this._usesHeaderTextAlternate = false;
}

// Global function for obtaining an object from it's id
function GetObjectById(objectId)
{
    // Check if already object
    if (objectId && objectId.id)
        return objectId;
        
    var result = null;
    
    if (document.getElementById)
        result = document.getElementById(objectId);
    
    if (result != null)
        return result;
    else
        return false;
}

function IsObjectValid(object)
{
    if (object == null || object == false)
        return false;
    else
        return true;
}

function ExclusiveObject()
{
    this.objectId = "";
    this.mouseOutClass = "";
    this.mouseHitClass = "";
    this.cssClassOn = "";
    this.cssClassOff = "";
    this.imageOn = "";
    this.imageOff = "";
    this.isSelected = false;
    this.cssClassTabInnerDivOn = "";
    this.cssClassTabInnerDifOff = "";
    this.headerTextAlternate = "";
    this.headerLinkAlternate = "";
    this.cssClassHeaderTextAlternate = "";
    this.isShowWhenAutoFlipping = true;
}

// Called as items are being rendered
function AddExclusiveObjects(objectArticle, objectContainer, exclusiveObjectControllerIndex)
{
    var Article = GetObjectById(objectArticle.objectId);
    var LinkContainer = GetObjectById(objectContainer.objectId);
    
    if (Article && LinkContainer)
    {
        Article.IsShowWhenAutoFlipping = objectArticle.isShowWhenAutoFlipping;
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray.length] = Article;
        
        // Preload Images
        if (objectContainer.imageOff)
        {
            var imageOff = new Image();
            imageOff.src = objectContainer.imageOff;
            LinkContainer.ImageOff = imageOff;
        }
        if (objectContainer.imageOn)
        {
            var imageOn = new Image();
            imageOn.src = objectContainer.imageOn;
            LinkContainer.ImageHit = imageOn;
        }
        
        // Assign Class Values
        LinkContainer.MouseOverOff = objectContainer.mouseOutClass;
        LinkContainer.MouseOverHit = objectContainer.mouseHitClass;
        LinkContainer.CssClassOff = objectContainer.cssClassOff;
        LinkContainer.CssClassOn = objectContainer.cssClassOn;
        LinkContainer.IsSelected = objectContainer.isSelected;
        LinkContainer.CssClassTabInnerDivOn = objectContainer.cssClassTabInnerDivOn;
        LinkContainer.CssClassTabInnerDivOff = objectContainer.cssClassTabInnerDivOff;
        LinkContainer.HeaderTextAlternate = objectContainer.headerTextAlternate;
        LinkContainer.HeaderLinkAlternate = objectContainer.headerLinkAlternate;
        LinkContainer.CssClassHeaderTextAlternate = objectContainer.cssClassHeaderTextAlternate;
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray[_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray.length] = LinkContainer;
            
        if((objectContainer.headerTextAlternate && (objectContainer.headerTextAlternate != "")) || 
        (objectContainer.headerLinkAlternate && (objectContainer.headerLinkAlternate != "")) ||
        (objectContainer.cssClassHeaderTextAlternate && (objectContainer.cssClassHeaderTextAlternate != "")))
        {
            _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._usesHeaderTextAlternate = true;
        }
    }
}
function InitializeTimer(interval, reset, exclusiveObjectControllerIndex)
{
    InitializeTimer(interval, reset, 0, 0, exclusiveObjectControllerIndex);
}

function InitializeTimer(interval, reset, maxRotations, exclusiveObjectControllerIndex)
{
    InitializeTimer(interval, reset, maxRotations, 0, exclusiveObjectControllerIndex);
}

function InitializeTimer(interval, reset, maxRotations, currentlySelectedTabIndex, exclusiveObjectControllerIndex)
{
    if(!currentlySelectedTabIndex)
    {
        currentlySelectedTabIndex = 0;
    }
    
    if(!exclusiveObjectControllerIndex)
    {
        exclusiveObjectControllerIndex = 0;
    }

    _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._MaxRotations = maxRotations;
    _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._UseTimer = true;
    _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerInterval = interval * 1000;
    _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex = currentlySelectedTabIndex;
    
    if(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex < 0)
    {
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex = 0;
    }
    
    if (reset <= 0)
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._UseReset = false;
    else
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerReset = reset * 1000;    
    
    StartTimer(exclusiveObjectControllerIndex);
}

function StartTimer(exclusiveObjectControllerIndex)
{
    if (_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent)
        clearTimeout(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent);

    _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent = setTimeout('TimedSwitch(' + exclusiveObjectControllerIndex +')', _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerInterval);
}

function TimedSwitch(exclusiveObjectControllerIndex)
{
    var newIndex = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex + 1;
    
    clearTimeout(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent);
    
    
    if (newIndex >= 0 && newIndex < _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray.length)
    {
        var isShowFlip = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[newIndex].IsShowWhenAutoFlipping;
        if (isShowFlip == false)
            newIndex = newIndex + 1;            
    }
    
    if (newIndex >= 0 && newIndex < _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray.length)
    {
        SwitchArticle(newIndex, exclusiveObjectControllerIndex);
        SwitchContainer(newIndex, exclusiveObjectControllerIndex);
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex = newIndex;
    }
    else
    {
        //_TotalRotations++;
        SwitchArticle(0, exclusiveObjectControllerIndex);
        SwitchContainer(0, exclusiveObjectControllerIndex);
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex = 0;
    }
    
    if ((_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._MaxRotations == 0) || (_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TotalRotations < _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._MaxRotations))
    {
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TotalRotations++;
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent = setTimeout('TimedSwitch(' + exclusiveObjectControllerIndex + ')', _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerInterval);
    }
}

function NonExclusiveSwitch(index, exclusiveObjectControllerIndex, isUserClick)
{   
    var objectContainer = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray[index];
    var depth;
    
    if(objectContainer.IsSelected == true)
    {
        HideObject(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[index].id);
    
        var temp = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray[index];
        var tempImage = temp.childNodes[0];
        
        depth = 0;
        while (depth++ <= 3)
        {
            if (tempImage && tempImage.src && temp.ImageOff)
            {
                tempImage.src = temp.ImageOff.src;
                break;
            }
            else if (!tempImage)
                break;
                
                tempImage = tempImage.childNodes[0];           
        }
        
        temp.IsSelected = false;
        temp.className = "";
        if (temp.CssClassOff)
            temp.className = temp.CssClassOff;
        else if (temp.MouseOverOff)
            temp.className = temp.MouseOverOff;
            
        if(temp.CssClassTabInnerDivOff && temp.childNodes[0])
        {
            temp.childNodes[0].className = temp.CssClassTabInnerDivOff;
        }
    }
    else
    {    
        ShowObject(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[index].id);
        depth = 0;
        var image = objectContainer.childNodes[0];
        
        while (depth++ <= 3)
        {
            if (image && image.src && objectContainer.ImageHit)
            {
                image.src = objectContainer.ImageHit.src;
                break;
            }
            else if (!image)
                break;
                
            image = image.childNodes[0];
        }
        
        objectContainer.IsSelected = true;
        if (objectContainer.CssClassOn)
            objectContainer.className = objectContainer.CssClassOn;
        else if (objectContainer.MouseOverHit)
            objectContainer.className = objectContainer.MouseOverHit;
            
        if(objectContainer.CssClassTabInnerDivOn && objectContainer.childNodes[0])
        {
            objectContainer.childNodes[0].className = objectContainer.CssClassTabInnerDivOn;
        }
    }
}

function ExclusiveSwitch(index, exclusiveObjectControllerIndex)
{
    ExclusiveSwitch(index, exclusiveObjectControllerIndex, false);
}

function Previous(exclusiveObjectControllerIndex)
{
    var lastIndex = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex;
    var newIndex = lastIndex-1;
    if (lastIndex > 0)
    {
        var isShowFlip = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[newIndex].IsShowWhenAutoFlipping;
        if (isShowFlip == false)
            newIndex = newIndex - 1;
        ExclusiveSwitch(newIndex, exclusiveObjectControllerIndex, true);
    }
}

function Next(exclusiveObjectControllerIndex)
{
    var lastIndex = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex;
    if (lastIndex == -1)
        lastIndex = 0;
    var newIndex = lastIndex+1;
    if (newIndex < _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray.length)
    {
        var isShowFlip = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[newIndex].IsShowWhenAutoFlipping;
        if (isShowFlip == false)
            newIndex = newIndex + 1;
        ExclusiveSwitch(newIndex, exclusiveObjectControllerIndex, true);
    }
}

function Pause(exclusiveObjectControllerIndex)
{
    if (_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent)
        clearTimeout(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent);
}

function Play(exclusiveObjectControllerIndex)
{
    StartTimer(exclusiveObjectControllerIndex);
}

function ExclusiveSwitch(index, exclusiveObjectControllerIndex, isUserClick)
{
    SwitchArticle(index, exclusiveObjectControllerIndex);
    SwitchContainer(index, exclusiveObjectControllerIndex);
    
    if(isUserClick == false)
    {
        if (_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._UseTimer && _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent)
        {
            _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex = index;
            clearTimeout(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent);
            if (_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._UseReset)
                _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent = setTimeout('StartTimer(' + exclusiveObjectControllerIndex + ')', _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerReset);
        }
    }
    else
    {
        _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._LastIndex = index;
        clearTimeout(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._TimerEvent);
    }
}

function SwitchArticle(index, exclusiveObjectControllerIndex)
{        
    for (var i = 0; i < _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray.length; i++)        
        HideObject(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[i].id);
    
    ShowObject(_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveArticleArray[index].id);
}

function SwitchContainer(index, exclusiveObjectControllerIndex)
{
    var objectContainer = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray[index];
    var depth;
    
    for (var i = 0; i < _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray.length; i++)
    {
        var temp = _ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._ExclusiveContainerArray[i];
        var tempImage = temp.childNodes[0];
        
        depth = 0;
        while (depth++ <= 3)
        {
            if (tempImage && tempImage.src && temp.ImageOff)
            {
                tempImage.src = temp.ImageOff.src;
                break;
            }
            else if (!tempImage)
                break;
                
                tempImage = tempImage.childNodes[0];           
        }
        
        temp.IsSelected = false;
        temp.className = "";
        if (temp.CssClassOff)
            temp.className = temp.CssClassOff;
        else if (temp.MouseOverOff)
            temp.className = temp.MouseOverOff;
            
        if(temp.CssClassTabInnerDivOff && temp.childNodes[0])
        {
            temp.childNodes[0].className = temp.CssClassTabInnerDivOff;
        }
    }
    
    depth = 0;
    var image = objectContainer.childNodes[0];
    
    while (depth++ <= 3)
    {
        if (image && image.src && objectContainer.ImageHit)
        {
            image.src = objectContainer.ImageHit.src;
            break;
        }
        else if (!image)
            break;
            
        image = image.childNodes[0];
    }
    
    objectContainer.IsSelected = true;
    if (objectContainer.CssClassOn)
        objectContainer.className = objectContainer.CssClassOn;
    else if (objectContainer.MouseOverHit)
        objectContainer.className = objectContainer.MouseOverHit;
        
    if(objectContainer.CssClassTabInnerDivOn && objectContainer.childNodes[0])
    {
        objectContainer.childNodes[0].className = objectContainer.CssClassTabInnerDivOn;
    }
    //display the alternate header text/link if it exists
    
    if (_ExclusiveObjectControllerArray[exclusiveObjectControllerIndex]._usesHeaderTextAlternate && objectContainer.parentNode && objectContainer.parentNode.id)
    {
        var parentTr = document.getElementById(objectContainer.parentNode.id);
        if(parentTr)
        {
            var headerTextAlternateLink = parentTr.childNodes[parentTr.childNodes.length - 1].childNodes[0]
            
            if(!headerTextAlternateLink)
            {
                headerTextAlternateLink = parentTr.childNodes[parentTr.childNodes.length - 2].childNodes[0]
            }
            
            if(headerTextAlternateLink)
            {
                if(objectContainer.HeaderTextAlternate && objectContainer.HeaderLinkAlternate)
                {
                    headerTextAlternateLink.innerText = objectContainer.HeaderTextAlternate;
                    headerTextAlternateLink.innerHtml = objectContainer.HeaderTextAlternate;                
                    headerTextAlternateLink.textContent = objectContainer.HeaderTextAlternate;
                    
                    if(headerTextAlternateLink.firstChild)
                    {
                        headerTextAlternateLink.firstChild.nodeValue = objectContainer.HeaderTextAlternate;                                        
                    }

                    headerTextAlternateLink.className = objectContainer.CssClassHeaderTextAlternate;
                    headerTextAlternateLink.href = objectContainer.HeaderLinkAlternate;                
                }
                else
                {
                    headerTextAlternateLink.innerText = '';
                    headerTextAlternateLink.innerHtml = '';                
                    headerTextAlternateLink.textContent = '';
                    headerTextAlternateLink.className = '';
                    headerTextAlternateLink.href = ''; 
                }
            }
        }
    }
}

function HideObjectArray(objectArray)
{    
    if (!IsObjectValid(objectArray))
        return;
            
    for (var i = 0; i < objectArray.length; i++)
        HideObject(objectArray[i]);
}

function ShowObjectArray(objectArray)
{
    if (!IsObjectValid(objectArray))
        return;
        
    for (var i = 0; i < objectArray.length; i++)
        ShowObject(objectArray[i]);
}

function AddObjectClass(objectId, className)
{
    var object = GetObjectById(objectId);
    
    if (!IsObjectValid(object))
        return;
        
    var currClassList = object.className;
    
    if (currClassList == "")
        object.className = className;
    else if (currClassList.indexOf(className) < 0)
        object.className += " " + className;
}

function RemoveObjectClass(objectId, className)
{
    var object = GetObjectById(objectId);
    
    if (!IsObjectValid(object))
        return;
        
    var currClassList = object.className;
    
    currClassList = currClassList.replace(" " + className, "");
    currClassList = currClassList.replace(className + " ", "");
    currClassList = currClassList.replace(className, "");
    
    object.className = currClassList;
}

function HideObject(objectId)
{            
    var object = GetObjectById(objectId);        
    if (!IsObjectValid(object))
        return;
        
    FadeObject(objectId, 100, 0);
        
    var status = object.style.display;
    if(status != 'none')
	    object.style.display = 'none';
}

function ShowObject(objectId)
{
    var object = GetObjectById(objectId);
    
    if (!IsObjectValid(object))
        return;
        
    FadeObject(objectId, 0, 100);
        
    var status = object.style.display;    
    
    if (status != '')
        object.style.display = '';
}

function FadeObject(objectId, opacStart, opacEnd)
{
    //speed for each frame 
    var millisec = 1500;
    var speed = Math.round(millisec / 100); 
    var timer = 0;     

    //determine the direction for the blending, if start and end are the same nothing happens 
    if(opacStart > opacEnd) { 
        for(i = opacStart; i >= opacEnd; i=i-3) { 
            opacityTimer =  setTimeout("ChangeOpacity('"+objectId+"', "+i+")",(timer * speed)); 
            timer++; 
        } 
    } 
    else if(opacStart < opacEnd) 
    { 
        for(i = opacStart; i <= opacEnd; i=i+3) 
            { 
            if (i==99) { i = 100; }
            opacityTimer = setTimeout("ChangeOpacity('"+objectId+"', "+i+")",(timer * speed)); 
            timer++; 
        } 
    }     
}

function ChangeOpacity(objectId, opacity)
{
    var object = document.getElementById(objectId).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
}


function HideObjectArrayWithNoFade(objectArray)
{    
    if (!IsObjectValid(objectArray))
        return;
            
    for (var i = 0; i < objectArray.length; i++)
        HideObjectWithNoFade(objectArray[i]);
}

function ShowObjectArrayWithNoFade(objectArray)
{
    if (!IsObjectValid(objectArray))
        return;
        
    for (var i = 0; i < objectArray.length; i++)
        ShowObjectWithNoFade(objectArray[i]);
}

function HideObjectWithNoFade(objectId)
{            
    var object = GetObjectById(objectId);        
    if (!IsObjectValid(object))
        return;
               
    var status = object.style.display;
    if(status != 'none')
	    object.style.display = 'none';
}

function ShowObjectWithNoFade(objectId)
{
    var object = GetObjectById(objectId);
    
    if (!IsObjectValid(object))
        return;
                        
    var status = object.style.display;    
    
    if (status != '')
        object.style.display = '';
}
