﻿var Slideshow = new function() {

    var me = this;
    this.Holder;
    this.PageCount;
    this.PageWidth;
    this.CurrentPage;
    this.Seconds;

    this.CurrentLeft;
    this.TargetLeft;
    this.StartTime;
    this.TimeOutID;
    this.Paused;
    this.CallBackFunction;

    this.Setup = function(sHolder, iPageCount, iPageWidth, iSeconds) {
        this.Holder = f.GetObject(sHolder);
        this.PageCount = iPageCount;
        this.PageWidth = iPageWidth;
        this.Seconds = iSeconds;
        this.CurrentPage = 1;
        this.CurrentLeft = 0;
        this.TimeOutID = -1;
        this.Paused = false;
    }

    this.Forward = function() {

        if (me.Paused) return;
        if (me.CurrentPage < me.PageCount) {
            me.TargetLeft = me.CurrentLeft - me.PageWidth;
            me.CurrentPage += 1;
        } else {
            me.TargetLeft = 0;
            me.CurrentPage = 1;
        }
        this.StartTime = new Date();
        Slideshow.Slide();
    }

    this.Backward = function() {
        if (me.CurrentPage > 1) {
            me.TargetLeft = me.CurrentLeft + me.PageWidth;
            me.CurrentPage -= 1;
        } else {
            me.TargetLeft = -((me.PageCount - 1) * me.PageWidth);
            me.CurrentPage = me.PageCount;
        }
        this.StartTime = new Date();

        for (var i = 0; i < 10; i++) {
            setTimeout('Slideshow.Slide()', i * 50);
        }

    }


    this.Slide = function() {

        var nFractionDone = Math.abs((new Date() - me.StartTime) / me.Seconds / 1000);
        if (nFractionDone < 1) {
            me.Holder.style.left = me.CurrentLeft + (me.TargetLeft - me.CurrentLeft) * Math.sin(Math.PI / 2 * nFractionDone) + 'px';
            me.TimeOutID = setTimeout('Slideshow.Slide();', 20);
        } else {
            me.Holder.style.left = me.TargetLeft + 'px';
            me.CurrentLeft = me.TargetLeft;
            me.TimeOutID = setTimeout('Slideshow.Forward();', 5000);
        }
    }


    this.Pause = function() {
        this.Paused = true;
        clearTimeout(me.TimeOutID);
    }


}
