﻿var SmallSlider = {
    // slideType = 0 => backgroundSlides
    // slideType = 1 => foregroundSlides
    data: {
        slideContainer: null,
        slideType: null,
        slides: null,
        slideWidth: null,
        leftSlideIndex: null,
        rightSlideIndex: null,
        numberOfSlidesAnimating: null,
        slideContainerName: null 
    },
    initialize: function(slideType, startingSlide, slideContainerName) {
        // Set the slide container
        SmallSlider.data.slideType = slideType ? slideType : 0;

        SmallSlider.slideContainerName = slideContainerName;

        SmallSlider.data.slideContainer = jQuery("#" + SmallSlider.slideContainerName + " ul");

        // Set slides to be the set of listitems
        SmallSlider.data.slides = jQuery("#" + SmallSlider.slideContainerName + " li");

        // Set slide width
        SmallSlider.data.slideWidth = 210; // SmallSlider.data.slides.width();

        // Set slide list width
        SmallSlider.data.slideContainer.css("width", SmallSlider.data.slideWidth * smallSlidingVideoSelector.controller.data.numberOfSlides);


        // Set left and right indexes and classes
        if (SmallSlider.data.slideType === 0) {
            SmallSlider.data.leftSlideIndex = (smallSlidingVideoSelector.controller.data.currentIndex - smallSlidingVideoSelector.controller.data.backgroundSlideShift + smallSlidingVideoSelector.controller.data.numberOfSlides - 1) % smallSlidingVideoSelector.controller.data.numberOfSlides;
        } else {
            SmallSlider.data.leftSlideIndex = (smallSlidingVideoSelector.controller.data.currentIndex - smallSlidingVideoSelector.controller.data.backgroundSlideShift + smallSlidingVideoSelector.controller.data.numberOfSlides - 1) % smallSlidingVideoSelector.controller.data.numberOfSlides;
        }
        SmallSlider.data.rightSlideIndex = (SmallSlider.data.leftSlideIndex + smallSlidingVideoSelector.controller.data.numberOfSlides - 1) % smallSlidingVideoSelector.controller.data.numberOfSlides;

        SmallSlider.positionSlides(smallSlidingVideoSelector.controller.data.startingSlide - 1)


    },
    positionSlides: function(slideIndex) {
        for (var i = slideIndex; i < smallSlidingVideoSelector.controller.data.numberOfSlides + slideIndex; i++) {
            var positionIndex = ((i) % smallSlidingVideoSelector.controller.data.numberOfSlides);
            if (SmallSlider.data.slideType === 0) {
                SmallSlider.data.slides.filter(":eq(" + positionIndex + ")").css({ "left": ((i - slideIndex) * SmallSlider.data.slideWidth) + "px", "top": "0px", "position": "absolute" });
            }
            else {
                SmallSlider.data.slides.filter(":eq(" + positionIndex + ")").css({ "left": (((i - slideIndex + smallSlidingVideoSelector.controller.data.backgroundSlideShift) * SmallSlider.data.slideWidth)) + "px", "top": "0px", "position": "absolute" });
            }
        }
        // Move Last Slide to first position
        var indexPositioning = ((smallSlidingVideoSelector.controller.data.numberOfSlides - 1 + slideIndex) % smallSlidingVideoSelector.controller.data.numberOfSlides);
        SmallSlider.data.slides.filter(":eq(" + indexPositioning + ")")
				    .css({ "left": (-1 * SmallSlider.data.slideWidth) + "px", "position": "absolute" });

    },
    move: function(direction, numberOfSlidesToMove) {
        // Update left and right indexes

        var indexShiftDirection = direction;

        SmallSlider.data.leftSlideIndex = (smallSlidingVideoSelector.controller.data.currentIndex - 1) % smallSlidingVideoSelector.controller.data.numberOfSlides;
        if (SmallSlider.data.leftSlideIndex < 0) {
            SmallSlider.data.leftSlideIndex = smallSlidingVideoSelector.controller.data.numberOfSlides + SmallSlider.data.leftSlideIndex;
        }

        SmallSlider.data.rightSlideIndex = (SmallSlider.data.leftSlideIndex - 1) % smallSlidingVideoSelector.controller.data.numberOfSlides;
        if (SmallSlider.data.rightSlideIndex < 0) {
            SmallSlider.data.rightSlideIndex = smallSlidingVideoSelector.controller.data.numberOfSlides + SmallSlider.data.rightSlideIndex;
        }
        // If slides are animating from the right to the left
        if (direction > 0) {
            //Now move the Left Most slide into last position beyond right Edge
            var farLeftDelta = (SmallSlider.data.slideWidth * direction) + parseInt(SmallSlider.data.slideContainer.css("left"));
            var positionsRight = (smallSlidingVideoSelector.controller.data.numberOfSlides - 1 - smallSlidingVideoSelector.controller.data.backgroundSlideShift);
            var farRightPosition = (positionsRight * farLeftDelta);
            SmallSlider.data.slides.filter(":eq(" + SmallSlider.data.leftSlideIndex + ")")
				.css("left", farRightPosition)
				.css("top", 0)
				.end();
        }
        else {
            // Moving Left To Right 
            var farLeftDelta = (SmallSlider.data.slideWidth * -direction) + parseInt(SmallSlider.data.slideContainer.css("left"));
            var farLeftPosition = ((-1) * farLeftDelta);
            // Make it the left most slide - out of view
            SmallSlider.data.slides.filter(":eq(" + SmallSlider.data.rightSlideIndex + ")")
				.css("left", farLeftPosition * 2)
				.css("top", 0)
				.end();
        }
        // Animate foreground slides
        var deltaPosition = (SmallSlider.data.slideWidth * -direction) + parseInt(SmallSlider.data.slideContainer.css("left"));
        SmallSlider.data.slides.animate({ "left": "+=" + deltaPosition + "px" }, smallSlidingVideoSelector.controller.data.slideSpeed, function() {
            smallSlidingVideoSelector.controller.animateCallback(direction, numberOfSlidesToMove);
        }


		);
    }
};

var smallSlidingVideoSelector = {
    controller: {
        foregroundSlider: null,
        data: {
            currentIndex: 0,
            slideSpeed: 1000,
            toggleSpeed: 1000,
            numberOfSlides: null,
            numberOfSlidesAnimating: null,
            backgroundSlideShift: 0,
            startingSlide: 1,
            slideContainerName: null
        },
        initialize: function(options) {
            smallSlidingVideoSelector.controller.bindEventHandlers();
            // Extend the default values above with parameters from initialization
            smallSlidingVideoSelector.controller.data = jQuery.extend({}, smallSlidingVideoSelector.controller.data, options);


            smallSlidingVideoSelector.controller.data.currentIndex = 0;
            // Set the number of slides
            smallSlidingVideoSelector.controller.data.numberOfSlides = jQuery("#" + smallSlidingVideoSelector.controller.data.slideContainerName + " li").length;

            // Initialize sliders
            SmallSlider.initialize(0, smallSlidingVideoSelector.controller.data.startingSlide, smallSlidingVideoSelector.controller.data.slideContainerName);
            //            smallSlidingVideoSelector.backgroundSlider = new SmallSlider();
            //            smallSlidingVideoSelector.backgroundSlider.initialize(1, smallSlidingVideoSelector.controller.data.startingSlide);

            smallSlidingVideoSelector.controller.data.currentIndex = (smallSlidingVideoSelector.controller.data.startingSlide - 1) % smallSlidingVideoSelector.controller.data.numberOfSlides;
        },
        bindEventHandlers: function() {
            // Bind next button
            jQuery("#smallSlidingVideoNextButton").bind("click", function(event) {
                smallSlidingVideoSelector.controller.animateSlides(1);
                event.preventDefault();
            });
            // Bind back button
            jQuery("#smallSlidingVideoBackButton").bind("click", function(event) {
                smallSlidingVideoSelector.controller.animateSlides(-1);
                event.preventDefault();
            });

        },
        unBindEventHandlers: function() {
            jQuery("#smallSlidingVideoNextButton").unbind("click");
            jQuery("#smallSlidingVideoBackButton").unbind("click");
        },
        animateSlides: function(numberOfSlidesToMove) {
            if (!numberOfSlidesToMove) { return; }

            // Sets the direction to either pos 1 or neg 1, ie right or left animation
            // and sets the number of animating slides
            var direction = numberOfSlidesToMove / Math.abs(numberOfSlidesToMove);
            numberOfSlidesToMove = Math.abs(numberOfSlidesToMove);
            smallSlidingVideoSelector.controller.data.numberOfSlidesAnimating = smallSlidingVideoSelector.controller.data.numberOfSlides;

            // Move background slides
            smallSlidingVideoSelector.controller.unBindEventHandlers();
            // Move foreground slides
            SmallSlider.move(direction, numberOfSlidesToMove);

            //  smallSlidingVideoSelector.backgroundSlider.move(direction, numberOfSlidesToMove);


            // Update current index
            smallSlidingVideoSelector.controller.data.currentIndex = (smallSlidingVideoSelector.controller.data.currentIndex + direction) % smallSlidingVideoSelector.controller.data.numberOfSlides;
            if (smallSlidingVideoSelector.controller.data.currentIndex < 0) {
                smallSlidingVideoSelector.controller.data.currentIndex = smallSlidingVideoSelector.controller.data.numberOfSlides - 1;
            }

        },
        animateCallback: function(direction, numberOfSlidesToMove) {
            smallSlidingVideoSelector.controller.data.numberOfSlidesAnimating--;
            if (smallSlidingVideoSelector.controller.data.numberOfSlidesAnimating === 0) {
                if (numberOfSlidesToMove > 1) {
                    numberOfSlidesToMove--;
                    smallSlidingVideoSelector.controller.animateSlides(direction * numberOfSlidesToMove);
                } else {
                    smallSlidingVideoSelector.controller.bindEventHandlers();
                }
            }
        },
        moveTo: function(slideToMoveToIndex) {
            if (!slideToMoveToIndex) { return; }
            //Select the Direction to Move based on CurrentIndex - Total Slides
            // only do something if we aren't on currentIndex already
            if (slideToMoveToIndex != smallSlidingVideoSelector.controller.data.currentIndex) {

                // Logic to determine how many slides to move based on current slide and clicked slide
                var clickIndex = slideToMoveToIndex;
                var numberOfSlidesToMove = null;

                // Logic to determine how many slides to move based on current slide and clicked slide
                if (clickIndex < (Math.ceil(smallSlidingVideoSelector.controller.data.numberOfSlides / 2) + smallSlidingVideoSelector.controller.data.currentIndex) % smallSlidingVideoSelector.controller.data.numberOfSlides) {
                    if (smallSlidingVideoSelector.controller.data.currentIndex < Math.ceil(smallSlidingVideoSelector.controller.data.numberOfSlides / 2)) {
                        numberOfSlidesToMove = clickIndex - smallSlidingVideoSelector.controller.data.currentIndex;
                    } else {
                        numberOfSlidesToMove = clickIndex + (smallSlidingVideoSelector.controller.data.numberOfSlides - smallSlidingVideoSelector.controller.data.currentIndex);
                    }
                } else {
                    if (smallSlidingVideoSelector.controller.data.currentIndex < Math.floor(smallSlidingVideoSelector.controller.data.numberOfSlides / 2)) {
                        numberOfSlidesToMove = clickIndex - smallSlidingVideoSelector.controller.data.currentIndex - smallSlidingVideoSelector.controller.data.numberOfSlides;
                    } else {
                        numberOfSlidesToMove = clickIndex - smallSlidingVideoSelector.controller.data.currentIndex;
                    }
                }
                // call the standard animate method.
                smallSlidingVideoSelector.controller.animateSlides(numberOfSlidesToMove);
            }
        },
        setPosition: function(slideIndex) {

            slideIndex = Math.abs(slideIndex) % smallSlidingVideoSelector.controller.data.numberOfSlides;
            // Move background slides
            smallSlidingVideoSelector.controller.unBindEventHandlers();
            // Move foreground slides
            SmallSlider.positionSlides(slideIndex);

            //  smallSlidingVideoSelector.backgroundSlider.positionSlides(slideIndex);


            // Update current index
            smallSlidingVideoSelector.controller.data.currentIndex = (slideIndex);

            smallSlidingVideoSelector.controller.bindEventHandlers();
        }
    }
};