﻿/*
* Controller for the sliding form on the microsite
* Requires prototype and scriptaculous
* Tom Elmore
*/


var SlideController = Class.create();
SlideController.prototype = {
    initialize: function(slide, width, sections) {
        this.page = 1;
        this.pageWidth = width;
        this.maxPages = sections;
        this.slide = slide;

        this.slide.style.width = (this.pageWidth * this.maxPages + 10) + "px";

        this.busy = false;
        this.delegates = new Array();
    },

    __moveLeft: function(numberOfPages, delay) {
        var NewPageNumber = this.page + numberOfPages;

        if (!this.busy && NewPageNumber <= this.maxPages) {
            this.busy = true;

            var movementFinished_binded = this.__movementFinished.bind(this);
            var distance = numberOfPages * this.pageWidth;

            var MoveSlider = function() {
                new Effect.Move(this.slide,
                                {
                                    x: -distance,
                                    duration: 0.3,
                                    afterFinish: function() { movementFinished_binded(NewPageNumber); }
                                }
			                );
            } .bind(this);

            if (delay != null && delay > 0) {
                setTimeout(MoveSlider, delay)
            } else {
                MoveSlider();
            }

        }
    },

    __moveRight: function(numberOfPages, delay) {
        var NewPageNumber = this.page - numberOfPages;

        if (!this.busy && NewPageNumber > 0) {
            this.busy = true;

            var movementFinished_binded = this.__movementFinished.bind(this);
            var distance = numberOfPages * this.pageWidth;

            var MoveSlider = function() {
                new Effect.Move(this.slide,
			                    {
			                        x: distance,
			                        duration: 0.3,
			                        afterFinish: function() { movementFinished_binded(NewPageNumber); }
			                    }
			                );
            } .bind(this);

            if (delay != null && delay > 0) {
                setTimeout(MoveSlider, delay)
            } else {
                MoveSlider();
            }
        }

    },

    __jumpLeft: function(numberOfPages, delay) {
        var NewPageNumber = this.page + numberOfPages;

        if (!this.busy && NewPageNumber <= this.maxPages) {
            this.busy = true;

            var movementFinished_binded = this.__movementFinished.bind(this);
            var distance = numberOfPages * this.pageWidth;

            var position = this.slide.positionedOffset();
            var leftPos = position[0];

            var MoveSlider = function() {
                this.slide.style.left = (leftPos - distance) + "px";
            } .bind(this);

            if (delay != null && delay > 0) {
                setTimeout(MoveSlider, delay)
            } else {
                MoveSlider();
            }

            this.__movementFinished(NewPageNumber);
        }
    },

    __jumpRight: function(numberOfPages, delay) {
        var NewPageNumber = this.page - numberOfPages;

        if (!this.busy && NewPageNumber > 0) {
            this.busy = true;

            var movementFinished_binded = this.__movementFinished.bind(this);
            var distance = numberOfPages * this.pageWidth;

            var position = this.slide.positionedOffset();
            var leftPos = position[0];

            var MoveSlider = function() {
                this.slide.style.left = (leftPos + distance) + "px";
            } .bind(this);

            if (delay != null && delay > 0) {
                setTimeout(MoveSlider, delay)
            } else {
                MoveSlider();
            }

            this.__movementFinished(NewPageNumber);
        }
    },

    __movementFinished: function(PageNumber) {
        this.__setPage(PageNumber);
        this.busy = false;
    },

    __fireOnChange: function() {
        for (var i = 0; i < this.delegates.length; i++) {
            this.delegates[i](this.page);
        }
    },

    __setPage: function(pageNumber) {
        this.page = pageNumber;
        this.__fireOnChange();
    },

    jumpToPage: function(pageNumber, delay) {
        var difference = pageNumber - this.page;
        if (difference > 0) {
            this.__jumpLeft(difference, delay);
        } else {
            this.__jumpRight(-difference, delay);
        }
    },

    goToPage: function(pageNumber, delay) {
        var difference = pageNumber - this.page;
        if (difference > 0) {
            this.__moveLeft(difference, delay);
        } else {
            this.__moveRight(-difference, delay);
        }
    },

    goToLastPage: function() {
        this.goToPage(this.maxPages, 0);
    },

    jumpToLastPage: function() {
        this.jumpToPage(this.maxPages, 0);
    },

    incPage: function() {
        this.goToPage(this.page + 1, 0);
    },

    delayIncPage: function() {
        this.goToPage(this.page + 1, 200);
    },

    decPage: function() {
        this.goToPage(this.page - 1, 0);
    },

    observe: function(onChangeEvent) {
        this.delegates.push(onChangeEvent);
    },

    isFinalPage: function() {
        return this.page == this.maxPages;
    }

};
