﻿/*
    v1.0 - Crossfades various values.
*/

ContainerFader = function() {
    this.Containers = {};
    this.Fades = [];
    this.CurrentFadeItem = 0;
    this.ActiveChild = 0;
    this.LastActiveChild = 0;
    this.BeforeFadeCallback = null;
    this.AnimationDelay = 0;
    this.AnimationInterval = null;
}

ContainerFader.prototype = {
    // ######################
    // ## Configuration
    // ## [MB]
    // ######################

    // Register containers for later usage.
    // [MB]
    RegisterContainer: function(name, containerId, fadeInitials) {
        containerFader.Containers[name] = $("#" + containerId).get(0);

        if (containerFader.Containers[name]) {
            // Verifying the container position.
            // [MB]
            if (containerFader.Containers[name].style.position != "relative") {
                alert("Containers must be relative.");
            }

            // Creating two new inner items
            // [MB]
            var newFirstChild = document.createElement("div");
            var newSecondChild = document.createElement("div");

            // Making the inner items absolute for cross-fading.
            // [MB]
            newFirstChild.style.position = "absolute";
            newSecondChild.style.position = "absolute";
            $(newSecondChild).css("opacity", "0");

            // Adding the initial value.
            // [MB]
            newFirstChild.innerHTML = fadeInitials.newContent;

            // Adding initial value for looping.
            // [MB]
            if (!containerFader.Fades[0])
                containerFader.Fades[0] = {};

            containerFader.Fades[0][name] = fadeInitials;
            containerFader.CurrentFadeItem = 1;

            // Adding the inner items.
            // [MB]
            containerFader.Containers[name].appendChild(newFirstChild);
            containerFader.Containers[name].appendChild(newSecondChild);
        }
    },

    // Adds a new fade-details-set to the animation queue.
    // [MB]
    AddNewFade: function(fadeDetails) {
        if (fadeDetails) {
            containerFader.Fades[containerFader.Fades.length] = fadeDetails;
        }
    },

    // Setting interval for fading the containers.
    // [MB]
    StartAnimation: function(animationDelay, beforeFadeCallback) {
        if (animationDelay) {
            containerFader.AnimationDelay = animationDelay;
            containerFader.AnimationInterval = window.setInterval("containerFader.RunAnimation()", animationDelay);

            containerFader.BeforeFadeCallback = beforeFadeCallback;
        }
    },

    GoToFade: function(overrideCurrentFadeItem) {
        if (containerFader.AnimationInterval) {
            window.clearInterval(containerFader.AnimationInterval);

            containerFader.CurrentFadeItem = overrideCurrentFadeItem;
            containerFader.RunAnimation();
            containerFader.AnimationInterval = window.setInterval("containerFader.RunAnimation()", containerFader.AnimationDelay);
        }
    },



    // ######################
    // ## Animation itself
    // ## [MB]
    // ######################
    RunAnimation: function() {
        if (containerFader.Fades[containerFader.CurrentFadeItem]) {
            // Checking for callback.
            // [MB]
            if (containerFader.BeforeFadeCallback)
                eval("containerFader.BeforeFadeCallback(" + containerFader.CurrentFadeItem + ", " + containerFader.LastActiveChild + ")");

            var cFade = containerFader.Fades[containerFader.CurrentFadeItem];

            // Replacing the content of each container.
            // [MB]
            for (var containerName in cFade) {
                var fadeContainer = containerFader.Containers[containerName];

                if (fadeContainer) {
                    var searchFirstChild = true;

                    if (isFF) {
                        var firstChild = null;
                        var secondChild = null;
                        for (var i = 0; i < fadeContainer.childNodes.length; i++) {
                            if (fadeContainer.childNodes[i].nodeName.toLowerCase() == "div") {
                                if (searchFirstChild) {
                                    firstChild = fadeContainer.childNodes[i];
                                    searchFirstChild = false;
                                }
                                else if (!searchFirstChild) {
                                    secondChild = fadeContainer.childNodes[i];
                                    break;
                                }
                            }
                        }
                    }
                    else {
                        var firstChild = fadeContainer.childNodes[0];
                        var secondChild = fadeContainer.childNodes[1];
                    }

                    if (firstChild && secondChild) {
                        if (containerFader.ActiveChild == 0) {
                            secondChild.innerHTML = cFade[containerName].newContent;
                            $(firstChild).animate({ "opacity": "0" }, cFade[containerName].fadeDuration);
                            $(secondChild).animate({ "opacity": "1" }, cFade[containerName].fadeDuration);
                        }
                        else {
                            firstChild.innerHTML = cFade[containerName].newContent;
                            $(firstChild).animate({ "opacity": "1" }, cFade[containerName].fadeDuration);
                            $(secondChild).animate({ "opacity": "0" }, cFade[containerName].fadeDuration);
                        }
                    }
                }
            }

            // Toggle next container.
            // [MB]
            containerFader.ActiveChild = (containerFader.ActiveChild == 0) ? 1 : 0;
        }

        containerFader.LastActiveChild = containerFader.CurrentFadeItem;
        containerFader.CurrentFadeItem++;
        if (containerFader.CurrentFadeItem >= containerFader.Fades.length) {
            containerFader.CurrentFadeItem = 0;
        }
    }
}

var containerFader = new ContainerFader();