﻿$.fn.infiniteSlider = function(options) {
    var opts = $.extend({}, $.fn.infiniteSlider.defaults, options);
    var $container = $(this).find('.container');
    var $slider = $container.find('ul');
    var $sliderWidth = $container.find('ul').width();
    var $items = $container.find('li');
    var $itemWidth = $container.find('li').filter(':first').width();
    var $itemCount = $container.find('li').length;
    var $itemsPerPage = Math.floor($container.width() / $itemWidth);
    if (opts.interval == 'item') {
        $slider.prepend($items.filter(':gt(' + ($itemCount - ($itemsPerPage + 1)) + ')').clone().addClass('end'));
        $slider.append($items.filter(':lt(' + ($itemsPerPage) + ')').clone().addClass('begining'));
    } else {
        if ($itemCount % $itemsPerPage != 0) {
            for (i = 0; i < ($itemsPerPage - ($itemCount % $itemsPerPage)); i++) {
                $slider.prepend('<li class="filler"></li>');
                $slider.append('<li class="filler"></li>');
            }
            $slider.prepend($items.filter(':gt(' + ($itemCount - ($itemsPerPage - ($itemsPerPage - ($itemCount % $itemsPerPage)) + 1)) + ')').clone().addClass('end'));
        } else {
            $slider.prepend($items.filter(':gt(' + ($itemCount - ($itemsPerPage + 1)) + ')').clone().addClass('end'));
        }
        $slider.append($items.filter(':lt(' + ($itemsPerPage) + ')').clone().addClass('begining'));
    }
    var $pageCount = Math.ceil($container.find('li').length / Math.floor($container.width() / $container.find('li').filter(':first').width())) == 0 ? 1 : Math.ceil($container.find('li').length / Math.floor($container.width() / $container.find('li').filter(':first').width())) - 1;


    var currentInterval = 0;
    if (opts.interval == 'item') {
        currentInterval = $itemsPerPage;
        $slider.animate({ left: "-" + ($items.filter(':first').outerWidth(true) * (currentInterval)) + "px" }, 0);
    } else {
        currentInterval = 1;
        $slider.animate({ left: "-" + ($items.filter(':first').outerWidth(true) * (currentInterval) * $itemsPerPage) + "px" }, 0);
    }

    if (opts.pageNav) {
        $container.after('<ul class="pages"></ul>');
        for (i = 1; i < $pageCount; i++) {
            $(this).find('.pages').append('<li><a href="#">' + i + '</a></li>');
        }
        $(this).find('.pages a').each(function(index) {
            $(this).bind('click', function() {
                goto(index + 1);
                $(this).parents('.pages').find('li').removeClass('selected').filter(':eq(' + index + ')').addClass('selected');
                return false;
            });
        });
        $slider.parents('.container').parent().find('.pages li').removeClass('selected').filter(':eq(' + (currentInterval - 1) + ')').addClass('selected');
    }
    


    if (opts.createButtons) {
        if (opts.leftArrow != "" & opts.rightArrow != "") {
            $container.after('<a href="#" class="left_button"><img src="' + opts.leftArrowSrc + '" alt="scroll left" class="tpng" /></a><a href="#" class="right_button"><img src="' + opts.rightArrowSrc + '" alt="scroll right" class="tpng" /></a>');
        } else {
            $container.after('<div class="left_button">&lt;</div><div class="right_button">&gt;</div>');
        }
        $(this).find('.left_button').click(function() {
            goto(currentInterval - 1, 'back');
            return false;
        });
        $(this).find('.right_button').click(function() {
            goto(currentInterval + 1, 'forward');
            return false;
        });
    }

    $slider.css('position', 'relative');
    function goto(index, direction) {
        if (opts.animation == 'slide') {
            if (direction == 'back') {
                if (opts.interval == 'item') {
                    currentInterval -= 1;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, opts.speed);
                    if (currentInterval <= 0) {
                        currentInterval = $itemCount;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    }
                } else {
                    currentInterval -= 1;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, opts.speed);
                    if (currentInterval <= 0) {
                        currentInterval = $pageCount - 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    }
                }
            } else if (direction == 'forward') {
                if (opts.interval == 'item') {
                    currentInterval += 1;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, opts.speed);
                    if (currentInterval > $itemCount) {
                        currentInterval = 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    }
                } else {
                    currentInterval += 1;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, opts.speed);
                    if (currentInterval >= $pageCount) {
                        currentInterval = 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    }
                }
            } else {
                if (opts.interval == 'item') {
                    currentInterval = index;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, opts.speed);
                    if (currentInterval > $itemCount) {
                        currentInterval = 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    }
                } else {
                    currentInterval = index;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, opts.speed);
                    if (currentInterval >= $pageCount) {
                        currentInterval = 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    }
                }
            }
        }
        else if (opts.animation == 'fade') {

            if (direction == 'back') {
                if (opts.interval == 'item') {
                    currentInterval = index;
                    $slider.animate({ opacity: 0 }, opts.speed / 2).animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    if (currentInterval <= 0) {
                        currentInterval = $itemCount;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    }
                    $slider.animate({ opacity: 1 }, opts.speed / 2);
                } else {
                    currentInterval = index;
                    $slider.animate({ opacity: 0 }, opts.speed / 2).animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    if (currentInterval <= 0) {
                        currentInterval = $pageCount - 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    }
                    $slider.animate({ opacity: 1 }, opts.speed / 2);
                }
            } else if (direction == 'forward') {
                if (opts.interval == 'item') {
                    currentInterval = index;
                    $slider.animate({ opacity: 0 }, opts.speed / 2).animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    if (currentInterval > $itemCount) {
                        currentInterval = 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * (currentInterval))) + "px" }, 0);
                    }
                    $slider.animate({ opacity: 1 }, opts.speed / 2);
                } else {
                    currentInterval = index;
                    $slider.animate({ opacity: 0 }, opts.speed / 2).animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    if (currentInterval >= $pageCount) {
                        currentInterval = 1;
                        $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                    }
                    $slider.animate({ opacity: 1 }, opts.speed / 2);
                }
            } else {
                currentInterval = index;
                $slider.animate({ opacity: 0 }, opts.speed / 2).animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                if (currentInterval >= $pageCount) {
                    currentInterval = 1;
                    $slider.animate({ left: (-1 * ($items.filter(':first').outerWidth(true) * currentInterval * $itemsPerPage)) + "px" }, 0);
                }
                $slider.animate({ opacity: 1 }, opts.speed / 2);

            }
        }
        if (opts.pageNav) {
            $slider.parents('.container').parent().find('.pages li').removeClass('selected').filter(':eq(' + (currentInterval - 1) + ')').addClass('selected');
        }
    }
    function slide() {
        goto(currentInterval += 1);
    }
    if (opts.autoStart) {
        var interval = setInterval(slide, opts.wait);
        if (opts.breakOnHover == "all") {
            $(this).children().hover(function() { clearInterval(interval); }, function() { interval = setInterval(slide, opts.wait); });
        } else if (opts.breakOnHover == "arrows") {
            if (opts.createButtons) {
                $(this).find('.right_button').hover(function() { clearInterval(interval); }, function() { interval = setInterval(slide, opts.wait); });
                $(this).find('.left_button').hover(function() { clearInterval(interval); }, function() { interval = setInterval(slide, opts.wait); });
            } else {
                $(this).find(opts.rightArrowSelector).hover(function() { clearInterval(interval); }, function() { interval = setInterval(slide, opts.wait); });
                $(this).find(opts.leftArrowSelector).hover(function() { clearInterval(interval); }, function() { interval = setInterval(slide, opts.wait); });
            }
        } else if (opts.breakOnHover == "items") {
            $container.hover(function() { clearInterval(interval); }, function() { interval = setInterval(slide, opts.wait); });
        }
        if (opts.breakOnClick) {
            if (opts.createButtons) {
                $(this).find('.right_button').click(function() { clearInterval(interval); });
                $(this).find('.left_button').click(function() { clearInterval(interval); });
            } else {
                $(this).find(opts.rightArrowSelector).click(function() { clearInterval(interval); });
                $(this).find(opts.leftArrowSelector).click(function() { clearInterval(interval); });
            }
        }
    }
}
$.fn.infiniteSlider.defaults = {
    speed: 1000,
    wait: 5000,
    interval: 'item',
    autoStart: false,
    createButtons: false,
    leftArrowSrc: "images/hp_touts/left_arrow.png",
    rightArrowSrc: "images/hp_touts/right_arrow.png",
    breakOnHover: "arrows",
    leftArrowSelector: ".left_button",
    rightArrowSelector: ".right_button",
    breakOnClick: false,
    pageNav: false,
    animation: 'slide'
}
