﻿
function CSSlideInfo(slideImage, slideLink, slideText) {
    this.imageName = slideImage;
    this.linkURL = slideLink;
    this.linkText = slideText;
}

function CSSlideShow() {
    this.slideContainerObj = null;
    this.slideImageObj = null; //undefined;?
    this.slideLinkObj = null;
    this.slideLabelObj = null;
    this.slideContainerID = "";
    this.slideImageID = "";
    
    this.slideShowSpeed = 10000;
    this.fadeDuration = 3000;
    this.crossFadeDuration = 3;
    this.currImageIndex = -1;

    this.slideImages = new Array();
    this.slideTimer = undefined;
    
    //Fade vars
    this.fadeStartTime = undefined;
    this.fadeRunning = false;
    this.fadeFromOp = 100;
    this.fadeToOp = 0;

    //this.AddImage = function(imageName) { this.slideImages[this.slideImages.length] = imageName; return; };
    this.AddImage = function(imageName) { this.AddImageLinkText(imageName, "", ""); return; };
    this.AddImageLink = function(imageName, linkURL) { this.AddImageLinkText(imageName, linkURL, ""); return; };
    this.AddImageLinkText = function(imageName, linkURL, linkText) {
        var imageInfo = new CSSlideInfo(imageName, linkURL, linkText);
        this.slideImages[this.slideImages.length] = imageInfo; 
        
        return;
    };
    this.ClearImages = function(){this.slideImages.length = 0; return;};
    this.SetFadeIn = function(fadeIn) {
        //If fade in and From s les then to then nothing needs to be changed
        //Or if Fade out and from is greater than to
        if (fadeIn && this.fadeFromOp < this.fadeToOp) return;
        if (!fadeIn && this.fadeFromOp > this.fadeToOp) return;

        var tempVal = this.fadeFromOp;
        this.fadeFromOp = this.fadeToOp;
        this.fadeToOp = tempVal;
    };

    this.StartSlideShow = function(divContainerID, imgControlID, preLoadImages) {
        this.slideContainerID = divContainerID;
        this.slideImageID = imgControlID;
        
        this.slideContainerObj = document.getElementById(divContainerID);
        this.slideImageObj = document.getElementById(imgControlID);
        this.slideLinkObj = document.getElementById(imgControlID + "Link");
        this.slideLabelObj = document.getElementById(imgControlID + "Label");

        //If nothing to display then exit
        if (this.slideImages.length == 0) return;

        //Display the first image
        this.slideImageObj.src = this.slideImages[0].imageName;
        setOpacityObj(this.slideImageObj, this.fadeFromOp);
        SetLinkObject(this.slideLinkObj, this.slideImages[0].linkURL);
        SetLabelObject(this.slideLabelObj, this.slideImages[0].linkText);
        
        if (preLoadImages) {
            this.PreLoadImages();
        }

        this.FadeInImage();
    };

    this.PreLoadImages = function() {
        var preLoad = new Array()
        for (i = 0; i < this.slideImages.length; i++) {
            preLoad[i] = new Image();
            preLoad[i].src = this.slideImages[i].imageName;
        }
    };

    this.FadeInImage = function() {

        if (this.slideImages.length == 0 || !this.slideImageObj) return;

        var prevIndex = this.currImageIndex;
        this.currImageIndex++;

        if (this.currImageIndex >= this.slideImages.length) this.currImageIndex = 0;

        //Stop the timeer from firing
        if (this.slideTimer) window.clearTimeout(this.slideTimer);

        //If there was a background object then...
        if (this.slideContainerObj) {
            //If the last image has been displayed then set the forground image sorce
            if (prevIndex > -1 && prevIndex < this.slideImages.length) {
                //this.slideImageObj.scr = this.slideImages[prevIndex];
                SetNewImageObj(this.slideImageObj, this.slideImages[prevIndex].imageName);
                this.SetOpacity(this.slideImageObj, this.fadeFromOp);
            }

            this.slideContainerObj.style.backgroundImage = 'url(' + this.slideImages[this.currImageIndex].imageName + ')';
            this.slideContainerObj.style.backgroundRepeat = 'no-repeat';

            SetLinkObject(this.slideLinkObj, this.slideImages[this.currImageIndex].linkURL);
            SetLabelObject(this.slideLabelObj, this.slideImages[this.currImageIndex].linkText);

            this.fadeStartTime = new Date().getTime();
            this.fadeRunning = true;

            var selfFade = this;
            this.slideTimer = window.setTimeout(function() { selfFade.ChangeOpactiyTimer() }, 10);
        }
        else {
            SetNewImageObj(this.slideImageObj, this.slideImages[this.currImageIndex].imageName);
        }

        var self = this;
        window.setTimeout(function() { self.FadeInImage() }, this.slideShowSpeed);
    };

    this.SetOpacity = function(fadeObj, opPct) {
        setOpacityObj(fadeObj, opPct);
    };

    this.ChangeOpacity = function(fadeObj, startTime, fromOp, toOp) {
        //Nothing to fade
        if (!fadeObj) return;

        var currTime = new Date().getTime();
        var calcOpactity = fromOp + ((toOp - fromOp) * ((currTime - startTime) / this.fadeDuration));

        var timeDif = currTime - startTime;
        var timeVar = timeDif / this.fadeDuration;
        var fadeNeg = (toOp - fromOp) * timeVar;
        calcOpactity = fromOp + fadeNeg;
        if (calcOpactity >= Math.max(this.fadeToOp, this.fadeFromOp)) {
            this.SetOpacity(fadeObj, this.fadeFromOp);
            this.slideTimer = undefined;
            this.fadeRunning = false;
        }
        else if (calcOpactity <= Math.min(this.fadeToOp, this.fadeFromOp)) {
            this.SetOpacity(fadeObj, this.fadeToOp);
            this.slideTimer = undefined;
            this.fadeRunning = false;
        }
        else {
            this.SetOpacity(fadeObj, calcOpactity);
            var selfFade = this;
            this.slideTimer = window.setTimeout(function() { selfFade.ChangeOpactiyTimer() }, 10);
        }
    };

    this.ChangeOpactiyTimer = function() {
        if (this.fadeRunning) {
            this.ChangeOpacity(this.slideImageObj, this.fadeStartTime, this.fadeFromOp, this.fadeToOp);
        }
    };
}

function SetNewImage(objID, imageName)
{
    var obj = document.getElementById(objID);
    
    obj.src = imageName;
}

function SetNewImageObj(obj, imageName)
{
    obj.src = imageName;
}

function SetLinkObject(obj, linkURL)
{
    if(!obj) return;

    obj.href = linkURL;
}

function SetLabelObject(obj, linkText) {
    if (!obj) return;

    if (linkText && linkText != "") obj.innerHTML = linkText;
    else obj.innerHTML = "";
}

function setOpacity(fadeObjID, opPct)
{
    setOpacityObj(document.getElementById(fadeObjID));
}
function setOpacityObj(fadeObj, opPct)
{
    if(!fadeObj) return;

    if(document.getElementById && document.all)
    {
        fadeObj.style.filter = 'alpha(opacity=' + opPct + ')';
    }
    else if(fadeObj.style.MozOpacity)
    {
        fadeObj.style.MozOpacity = opPct / 100;
    }
    else
    {
        fadeObj.style.opacity = opPct / 100;
    }
}
