﻿function Slideshow(index, id, interval, mode, count) {
    
    this.listID = id;
    this.transitionInterval = interval * 1000;
    this.displayMode = mode;
    this.displayCount = count;
    
    this.itemIndex = -1;
    this.slotWidth = 0;
    this.slotIndex = -1;
    this.panAndZoomAnim = new Object();

    this.start = function() {

        if (document.getElementById) {

            this.list = document.getElementById(this.listID);

            this.slotWidth = Math.round((this.list.offsetWidth - (this.displayCount - 1)) / this.displayCount);

            if (this.displayCount > 1)
                this.displayMode = "fill";

            if (this.list && this.list.childNodes && this.list.childNodes.length > 0) {

                var items = this.list.childNodes;
                var item;
                var img;

                this.list.style.display = "block";

                for (var i = 0; i < items.length; i++) {
                    item = items[i];
                    img = items[i].firstChild;

                    item.style.opacity = 0.0;

                    item.style.zIndex = 0;

                    if (!img.naturalWidth)
                        img.naturalWidth = img.width;
                    if (!img.naturalHeight)
                        img.naturalHeight = img.height;

                    if (this.displayMode == "fill") {
                        var width = this.slotWidth;
                        var height = this.list.offsetHeight;

                        img.style.width = width.toString() + "px";
                        img.style.height = height.toString() + "px";
                    }



                }

                if (items.length > this.displayCount)
                    setInterval('slideshowManager.slideshows[' + index.toString() + '].show(' + index.toString() + ')', this.transitionInterval);
                this.show(index);

                if (this.displayMode == "panandzoom")
                    setInterval('slideshowManager.slideshows[' + index.toString() + '].panAndZoom(' + index.toString() + ')', 50);
                //setInterval('this.panAndZoom()', 50);

            }
        }
    };

    this.fadeIn = function(index) {
        var slideshow = slideshowManager.slideshows[index];

        var listItem = slideshow.list.childNodes[slideshow.itemIndex];

        if (listItem.style.opacity < 1) {
            listItem.style.opacity = parseFloat(listItem.style.opacity) + 0.05;
        } else {
            clearInterval(slideshow.faderInterval);

            listItem.style.opacity = 1;

            var prevItem = slideshow.getPreviousItem(slideshow);
            if (prevItem != null) {
                prevItem.style.display = "none";
                prevItem.style.opacity = 0;
                
            }

        }
    };

    this.panAndZoom = function(index) {
        
        var slideshow = slideshowManager.slideshows[index];

        var listItem = slideshow.list.childNodes[slideshow.itemIndex];
        var img = listItem.firstChild;

        this.panAndZoomAnim.xPanCurrent += slideshow.panAndZoomAnim.xPanIncrement;
        this.panAndZoomAnim.yPanCurrent += slideshow.panAndZoomAnim.yPanIncrement;

        var x = Math.round(slideshow.panAndZoomAnim.xPanCurrent);
        var y = Math.round(slideshow.panAndZoomAnim.yPanCurrent);

        listItem.style.left = x.toString() + "px";
        listItem.style.top = y.toString() + "px";

        this.panAndZoomAnim.xScaleCurrent += slideshow.panAndZoomAnim.xScaleIncrement;
        this.panAndZoomAnim.yScaleCurrent += slideshow.panAndZoomAnim.yScaleIncrement;

        var xScale = slideshow.panAndZoomAnim.xScaleCurrent;
        var yScale = slideshow.panAndZoomAnim.yScaleCurrent;

        var width = Math.round(img.naturalWidth * (xScale / 100));
        var height = Math.round(img.naturalHeight * (yScale / 100));

        img.style.width = width.toString() + "px";
        img.style.height = height.toString() + "px";

    };

    this.getPreviousItem = function(slideshow) {
        var prevItemIndex = slideshow.itemIndex - slideshow.displayCount;
        if (prevItemIndex < 0)
            prevItemIndex += slideshow.list.childNodes.length;
        if (prevItemIndex >= 0 && prevItemIndex < slideshow.list.childNodes.length)
            return slideshow.list.childNodes[prevItemIndex];
        else
            return null;
    };

    this.show = function(index) {
        var slideshow = slideshowManager.slideshows[index];

        slideshow.itemIndex++;
        if (slideshow.itemIndex >= slideshow.list.childNodes.length)
            slideshow.itemIndex = 0;

        slideshow.slotIndex++;
        if (slideshow.slotIndex >= slideshow.displayCount)
            slideshow.slotIndex = 0;


        var prevItem = slideshow.getPreviousItem(slideshow);
        if (prevItem != null)
            prevItem.style.zIndex = 0;

        var currentItem = slideshow.list.childNodes[slideshow.itemIndex];
        currentItem.style.zIndex = 1;
        currentItem.style.display = "block";

        var img = currentItem.firstChild;

        var x0;
        var y0;

        if (this.displayMode == "panandzoom") {

            var minXScale = Math.ceil(slideshow.slotWidth / img.naturalWidth * 100);
            var minYScale = Math.ceil(slideshow.list.offsetHeight / img.naturalHeight * 100);

            var minScale = Math.max(minXScale, minYScale);
            if (minScale < 75)
                minScale = 75;

            var minWidth = img.naturalWidth * (minScale / 100);
            var minHeight = img.naturalHeight * (minScale / 100);

            if (Math.floor(Math.random() * 2) == 0) {
                img.style.width = minWidth.toString() + "px";
                img.style.height = minHeight.toString() + "px";

                slideshow.panAndZoomAnim.x0Scale = minScale;
                slideshow.panAndZoomAnim.y0Scale = minScale;
                slideshow.panAndZoomAnim.x1Scale = 100;
                slideshow.panAndZoomAnim.y1Scale = 100;
            }
            else {
                img.style.width = img.naturalWidth.toString() + "px";
                img.style.height = img.naturalHeight.toString() + "px";

                slideshow.panAndZoomAnim.x0Scale = 100;
                slideshow.panAndZoomAnim.y0Scale = 100;
                slideshow.panAndZoomAnim.x1Scale = minScale;
                slideshow.panAndZoomAnim.y1Scale = minScale;

            }

            var xoverflow = slideshow.list.offsetWidth - minWidth;
            var yoverflow = slideshow.list.offsetHeight - minHeight;

            x0 = Math.floor(Math.random() * 2) * xoverflow;
            y0 = Math.floor(Math.random() * 2) * yoverflow;

            slideshow.panAndZoomAnim.x0 = x0;
            slideshow.panAndZoomAnim.y0 = y0;
            slideshow.panAndZoomAnim.x1 = x0 == 0 ? xoverflow : 0;
            slideshow.panAndZoomAnim.y1 = y0 == 0 ? yoverflow : 0;

            slideshow.panAndZoomAnim.xPanIncrement = (slideshow.panAndZoomAnim.x1 - slideshow.panAndZoomAnim.x0) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.yPanIncrement = (slideshow.panAndZoomAnim.y1 - slideshow.panAndZoomAnim.y0) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.xPanCurrent = slideshow.panAndZoomAnim.x0;
            slideshow.panAndZoomAnim.yPanCurrent = slideshow.panAndZoomAnim.y0;

            slideshow.panAndZoomAnim.xScaleIncrement = (slideshow.panAndZoomAnim.x1Scale - slideshow.panAndZoomAnim.x0Scale) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.yScaleIncrement = (slideshow.panAndZoomAnim.y1Scale - slideshow.panAndZoomAnim.y0Scale) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.xScaleCurrent = slideshow.panAndZoomAnim.x0Scale;
            slideshow.panAndZoomAnim.yScaleCurrent = slideshow.panAndZoomAnim.y0Scale;

        }
        else {
            x0 = (slideshow.slotIndex % slideshow.displayCount) * slideshow.slotWidth + (slideshow.slotIndex);
            y0 = Math.round((slideshow.list.offsetHeight - img.height) / 2);

            if (img.width < slideshow.slotWidth)
                x0 += Math.round((slideshow.slotWidth - img.width) / 2);
        }

        currentItem.style.left = x0.toString() + "px";
        currentItem.style.top = y0.toString() + "px";

        slideshow.faderInterval = setInterval('slideshowManager.slideshows[' + index.toString() + '].fadeIn(' + index.toString() + ')', 50);
        //this.faderInterval = setInterval('this.fadeIn(2);', 50);


    };
    
    

    //tools.addEvent(window, 'load', this.start);
};

slideshowManager =
{
    slideshows: new Array(),

    addSlideshow: function(id, interval, mode, count) 
    {
        slideshowManager.slideshows.push(new Slideshow(slideshowManager.slideshows.length, id, interval, mode, count));
    },

    init: function() {

        for (var i = 0; i < slideshowManager.slideshows.length; i++) {
            slideshowManager.slideshows[i].start();
        }
    }
};

tools.addEvent(window, 'load', slideshowManager.init);


/*slideshow =
{
    list: null,
    itemIndex: -1,
    listID: '',
    transitionInterval: 5,
    faderInterval: null,
    displayMode: "center",
    displayCount: 1,
    slotWidth: 0,
    slotIndex: -1,
    panAndZoomAnim: new Object(),

    init: function(id, interval, mode, count) {

        slideshow.listID = id;
        slideshow.transitionInterval = interval * 1000;
        slideshow.displayMode = mode;
        slideshow.displayCount = count;
        tools.addEvent(window, 'load', slideshow.start);
    },

    start: function() {

        if (document.getElementById) {
            slideshow.list = document.getElementById(slideshow.listID);

            slideshow.slotWidth = Math.round((slideshow.list.offsetWidth - (slideshow.displayCount - 1)) / slideshow.displayCount);

            if (slideshow.displayCount > 1)
                slideshow.displayMode = "fill";

            if (slideshow.list && slideshow.list.childNodes && slideshow.list.childNodes.length > 0) {

                var items = slideshow.list.childNodes;
                var item;
                var img;

                slideshow.list.style.display = "block";

                for (var i = 0; i < items.length; i++) {
                    item = items[i];
                    img = items[i].firstChild;

                    item.style.opacity = 0.0;

                    item.style.zIndex = 0;

                    if (!img.naturalWidth)
                        img.naturalWidth = img.width;
                    if (!img.naturalHeight)
                        img.naturalHeight = img.height;

                    if (slideshow.displayMode == "fill") {
                        var width = slideshow.slotWidth;
                        var height = slideshow.list.offsetHeight;

                        img.style.width = width.toString() + "px";
                        img.style.height = height.toString() + "px";
                    }



                }

                if (items.length > slideshow.displayCount)
                    setInterval('slideshow.show()', slideshow.transitionInterval);
                slideshow.show();

                if (slideshow.displayMode == "panandzoom")
                    setInterval('slideshow.panAndZoom()', 50);

            }
        }
    },

    show: function(e) {

        slideshow.itemIndex++;
        if (slideshow.itemIndex >= slideshow.list.childNodes.length)
            slideshow.itemIndex = 0;

        slideshow.slotIndex++;
        if (slideshow.slotIndex >= slideshow.displayCount)
            slideshow.slotIndex = 0;


        var prevItem = slideshow.getPreviousItem();
        if(prevItem != null)
            prevItem.style.zIndex = 0;

        var currentItem = slideshow.list.childNodes[slideshow.itemIndex];
        currentItem.style.zIndex = 1;


        var img = currentItem.firstChild;


        var x0;
        var y0;

        if (slideshow.displayMode == "panandzoom") {

            var minXScale = Math.ceil(slideshow.slotWidth / img.naturalWidth * 100);
            var minYScale = Math.ceil(slideshow.list.offsetHeight / img.naturalHeight * 100);

            var minScale = Math.max(minXScale, minYScale);
            if (minScale < 75)
                minScale = 75;

            var minWidth = img.naturalWidth * (minScale / 100);
            var minHeight = img.naturalHeight * (minScale / 100);

            if (Math.floor(Math.random() * 2) == 0) {
                img.style.width = minWidth.toString() + "px";
                img.style.height = minHeight.toString() + "px";

                slideshow.panAndZoomAnim.x0Scale = minScale;
                slideshow.panAndZoomAnim.y0Scale = minScale;
                slideshow.panAndZoomAnim.x1Scale = 100;
                slideshow.panAndZoomAnim.y1Scale = 100;
            }
            else {
                img.style.width = img.naturalWidth.toString() + "px";
                img.style.height = img.naturalHeight.toString() + "px";

                slideshow.panAndZoomAnim.x0Scale = 100;
                slideshow.panAndZoomAnim.y0Scale = 100;
                slideshow.panAndZoomAnim.x1Scale = minScale;
                slideshow.panAndZoomAnim.y1Scale = minScale;

            }

            var xoverflow = slideshow.list.offsetWidth - minWidth;
            var yoverflow = slideshow.list.offsetHeight - minHeight;

            x0 = Math.floor(Math.random() * 2) * xoverflow;
            y0 = Math.floor(Math.random() * 2) * yoverflow;

            slideshow.panAndZoomAnim.x0 = x0;
            slideshow.panAndZoomAnim.y0 = y0;
            slideshow.panAndZoomAnim.x1 = x0 == 0 ? xoverflow : 0;
            slideshow.panAndZoomAnim.y1 = y0 == 0 ? yoverflow : 0;


            slideshow.panAndZoomAnim.xPanIncrement = (slideshow.panAndZoomAnim.x1 - slideshow.panAndZoomAnim.x0) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.yPanIncrement = (slideshow.panAndZoomAnim.y1 - slideshow.panAndZoomAnim.y0) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.xPanCurrent = slideshow.panAndZoomAnim.x0;
            slideshow.panAndZoomAnim.yPanCurrent = slideshow.panAndZoomAnim.y0;

            slideshow.panAndZoomAnim.xScaleIncrement = (slideshow.panAndZoomAnim.x1Scale - slideshow.panAndZoomAnim.x0Scale) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.yScaleIncrement = (slideshow.panAndZoomAnim.y1Scale - slideshow.panAndZoomAnim.y0Scale) / (slideshow.transitionInterval / 50);
            slideshow.panAndZoomAnim.xScaleCurrent = slideshow.panAndZoomAnim.x0Scale;
            slideshow.panAndZoomAnim.yScaleCurrent = slideshow.panAndZoomAnim.y0Scale;

        }
        else {
            x0 = (slideshow.slotIndex % slideshow.displayCount) * slideshow.slotWidth + (slideshow.slotIndex);
            y0 = Math.round((slideshow.list.offsetHeight - img.height) / 2);

            if (img.width < slideshow.slotWidth)
                x0 += Math.round((slideshow.slotWidth - img.width) / 2);
        }

        currentItem.style.left = x0.toString() + "px";
        currentItem.style.top = y0.toString() + "px";

        slideshow.faderInterval = setInterval('slideshow.fadeIn()', 50);


    },
    fadeIn: function() {

        var listItem = slideshow.list.childNodes[slideshow.itemIndex];

        if (listItem.style.opacity < 1) {
            listItem.style.opacity = parseFloat(listItem.style.opacity) + 0.05;
        } else {
            clearInterval(slideshow.faderInterval);

            listItem.style.opacity = 1;

            var prevItem = slideshow.getPreviousItem();
            if(prevItem != null)
                prevItem.style.opacity = 0;




        }
    },
    panAndZoom: function() {

        var listItem = slideshow.list.childNodes[slideshow.itemIndex];
        var img = listItem.firstChild;

        slideshow.panAndZoomAnim.xPanCurrent += slideshow.panAndZoomAnim.xPanIncrement;
        slideshow.panAndZoomAnim.yPanCurrent += slideshow.panAndZoomAnim.yPanIncrement;

        var x = Math.round(slideshow.panAndZoomAnim.xPanCurrent);
        var y = Math.round(slideshow.panAndZoomAnim.yPanCurrent);

        listItem.style.left = x.toString() + "px";
        listItem.style.top = y.toString() + "px";

        slideshow.panAndZoomAnim.xScaleCurrent += slideshow.panAndZoomAnim.xScaleIncrement;
        slideshow.panAndZoomAnim.yScaleCurrent += slideshow.panAndZoomAnim.yScaleIncrement;

        var xScale = slideshow.panAndZoomAnim.xScaleCurrent;
        var yScale = slideshow.panAndZoomAnim.yScaleCurrent;

        var width = Math.round(img.naturalWidth * (xScale / 100));
        var height = Math.round(img.naturalHeight * (yScale / 100));

        img.style.width = width.toString() + "px";
        img.style.height = height.toString() + "px";



    },
    getPreviousItem: function() {
        var prevItemIndex = slideshow.itemIndex - slideshow.displayCount;
        if (prevItemIndex < 0)
            prevItemIndex += slideshow.list.childNodes.length;
        if (prevItemIndex >= 0 && prevItemIndex < slideshow.list.childNodes.length)
            return slideshow.list.childNodes[prevItemIndex];
        else
            return null;
    }
}
*/