﻿//Copyright 2010 AppBurst, LLC

/// <reference path="jquery-1.4.1-vsdoc.js"/>
(function($) {
$.fn.simpleslider = function(options) {
    var defaults = {
        effect: "slide",
        width: 400,
        height: 300,
        effectDuration: 1000,
        timeToDisplay: 3000,
        autoSlide: true,
        pageControlType: "none",
        pageControlColorNormal: "Gray",
        pageControlColorSelected: "Black"

    }
    var options = $.extend(defaults, options);
    return this.each(function() {

        var sliderWrapper = $(this);
        var slides = sliderWrapper.children($("div"));
        slides.wrapAll('<div class="simplesliderSlider"></div>');
        var slider = sliderWrapper.children(0); //new slidingcontainer
        slider.css('overflow', 'hidden');
        slider.css('z-index', -999999999);
        slider.css('position', 'relative');
        slider.width(options.width);
        slider.height(options.height);

        var slideWidth = options.width;
        var slideCount = slides.length;
        var currentSlideNumber = 0;
        var pendingSlideNumber = 0;
        var slideCounter = -1;

        slides.each(function() {
            var slide = $(this);
            slideCounter++;
            slide.width(options.width);
            slide.height(options.height);
            slide.css("z-index", -slideCounter);
            slide.css("position", "absolute");
            slide.css("top", 0);
            if (slideCounter == 0)
                return;
            if (options.effect.indexOf("slide") >= 0)
                slide.css("left", slideWidth);
            if (options.effect.indexOf("fade") >= 0)
                slide.css("opacity", 0.0);
        });

        var pager;
        var resetTimer = false;
        if (options.pageControlType == "dots") {
            var dotsize = 15;
            var padding = (options.width - (slideCount * dotsize)) / 2;
            sliderWrapper.append('<div class="simplesliderDots"></div>');
            pager = $(sliderWrapper.children(1)[1]);
            pager.width(options.width - padding);
            pager.height(24);
            pager.css("float", "left");
            pager.css("padding-left", padding + "px");
            for (k = 0; k < slideCount; k++) {
                pager.append('<span>&bull;</span>');
            }
            var bulletCount = 0;
            pager.children().each(function() {
                var bullet = $(this);
                bullet.attr("slideTarget", bulletCount);
                bullet.css("float", "left");
                bullet.css("font-size", "2em");
                bullet.css("margin-top", "-.2em");
                bullet.css("margin-left", ".15em");
                bullet.css("cursor", "pointer");
                bullet.click(function() { transitionToSlide(parseInt($(this).attr("slideTarget")), true); resetTimer = true; });
                //bullet.disableSelection();
                bulletCount++;
            });
        }

        function gotoNextSlide(isButtonClick) {
            if (resetTimer == true) {
                resetTimer = false;
                return;
            }
            var nextSlideNumber;
            if (currentSlideNumber < slideCount - 1) {
                nextSlideNumber = currentSlideNumber + 1;
            }
            else {
                nextSlideNumber = 0;
            }
            transitionToSlide(nextSlideNumber, isButtonClick);
        }

        function transitionToSlide(nextSlideNumber, isButtonClick) {
            if (nextSlideNumber == currentSlideNumber) {
                return;
            }
            pendingSlideNumber = nextSlideNumber;
            var currentSlide = $(slides[currentSlideNumber]);
            var nextSlide = $(slides[nextSlideNumber]);

            var nextSlideAnimateProperties = { left: null, opacity: 1.0 };
            var currentSlideAnimateProperties = { left: null, opacity: 1.0 };

            if (options.effect.indexOf("slide") >= 0) {
                if ((nextSlideNumber == 0 && isButtonClick == false) || nextSlideNumber > currentSlideNumber) //go foward
                {
                    nextSlide.css("left", slideWidth);
                    nextSlideAnimateProperties.left = 0;
                    currentSlideAnimateProperties.left = -slideWidth;
                }
                else {
                    nextSlide.css("left", -slideWidth);
                    nextSlideAnimateProperties.left = 0;
                    currentSlideAnimateProperties.left = slideWidth;
                }
            }
            if (options.effect.indexOf("fade") >= 0) {
                nextSlide.css("opacity", 0.0);
                nextSlideAnimateProperties.opacity = 1.0;
                currentSlideAnimateProperties.opacity = 0.0;
            }
            nextSlide.animate(nextSlideAnimateProperties, options.effectDuration, null, function() { setNextAsCurrent(); });
            currentSlide.animate(currentSlideAnimateProperties, options.effectDuration);
        }
        function setNextAsCurrent() {
            currentSlideNumber = pendingSlideNumber;
            updatePager();
        }
        function updatePager() {
            //handle other page control types
            if (options.pageControlType == "dots") {
                pager.children().css("color", options.pageControlColorNormal);
                $(pager.children()[currentSlideNumber]).css("color", options.pageControlColorSelected);
            }

        }
        updatePager();

        function rotateSlides() {
            setTimeout(function() { gotoNextSlide(false); rotateSlides(); }, options.timeToDisplay + options.effectDuration);
        }
        if (options.autoSlide == true) { rotateSlides(); }

    });
};

})(jQuery);

