﻿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();

	function setOpacity(level) {
		element.style.opacity = level;
		element.style.Mozopacity = level;
		element.style.KhtmlOpacity = level;
		element.style.filter = "alpha(opacity=" + (level * 100) + ");";
		}

    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.filter = "alpha(opacity="+ 0 +")";
                    item.style.zIndex = 0;

                    if (!img.naturalWidth) {
                        img.naturalWidth = img.width;
                    }
                    if (!img.naturalHeight) {
                        img.naturalHeight = img.height;
                    }

                    if (this.displayMode == "fill") {
                        img.style.width = this.slotWidth.toString() + "px";
                        img.style.height = this.list.offsetHeight.toString() + "px";
                    }
                }
				
                for (i = 0; i < Math.min(items.length, this.displayCount); i++) {
                    this.show(index);
                    var slideshow = slideshowManager.slideshows[index];
                    slideshow.list.childNodes[i].style.opacity = 1;
					slideshow.list.childNodes[i].style.filter = "alpha(opacity=" + 100 + ")";
                   clearInterval(slideshow.fadeInterval);
                }
				
				
                if (items.length > this.displayCount) {
                    setInterval('slideshowManager.slideshows[' + index.toString() + '].show(' + index.toString() + ')', this.transitionInterval);
                }


 				
                
				if (this.displayMode == "panandzoom") {
                    setInterval('slideshowManager.slideshows[' + index.toString() + '].panAndZoom(' + index.toString() + ')', 50);
                }

                $('ul[id$=imageList]').css('visibility', 'visible');

            }
        }
    };

    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;
			listItem.style.filter = "alpha(opacity=" + parseFloat(listItem.style.filter = "alpha(opacity=" + .1 +")") +")";
        }
        else {
            clearInterval(slideshow.fadeInterval);
			listItem.style.display = "block";
			listItem.style.opacity = 1;
			listItem.style.filter = "alpha(opacity="+ 100 +")";

            
			var prevItem = slideshow.getPreviousItem(slideshow);
            if (prevItem != null) {
                prevItem.style.display = "block";
                prevItem.style.opacity = 0;
				prevItem.style.filter = "alpha(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.fadeInterval = setInterval('slideshowManager.slideshows[' + index.toString() + '].fadeIn(' + index.toString() + ')', 50);
    };
};

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);
