/**

 * Name: jquery.infinite-carousel.js

 * Description: Infinite Carousel Plugin

 * Version: 1.1

 * Coder: Remy Sharp

 * Coder URI: http://jqueryfordesigners.com/

 * Additional modifications by Enrique Ramírez

*/



$.fn.infiniteCarousel = function () {



    function repeat(str, num) {

        return new Array( num + 1 ).join( str );

    }

  

    return this.each(function () {

        var $wrapper = $('> div', this).css('overflow', 'hidden'),

            $slider = $wrapper.find('> ul'),

            $items = $slider.find('> li'),

            $single = $items.filter(':first'),

            

            singleWidth = $single.outerWidth(), 

            visible = Math.ceil($wrapper.innerWidth() / singleWidth),

            currentPage = 1,

            pages = Math.ceil($items.length / visible);            





        // 1. Pad so that 'visible' number will always be seen, otherwise create empty items

        if (($items.length % visible) != 0) {

            $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));

            $items = $slider.find('> li');

        }



        // 2. Top and tail the list with 'visible' number of items, top has the last section, and tail has the first

        $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned'));

        $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));

        $items = $slider.find('> li'); // reselect

        $items.addClass('item');

        

        // 3. Set the left position to the first 'real' item

        $wrapper.scrollLeft(singleWidth * visible);

        

        // 4. paging function

        function gotoPage(page) {

            var dir = page < currentPage ? -1 : 1,

                n = Math.abs(currentPage - page),

                left = singleWidth * dir * visible * n;

            

            $wrapper.filter(':not(:animated)').animate({

                scrollLeft : '+=' + left

            }, 1200, function () {

                if (page == 0) {

                    $wrapper.scrollLeft(singleWidth * visible * pages);

                    page = pages;

                } else if (page > pages) {

                    $wrapper.scrollLeft(singleWidth * visible);

                    // reset back to start position

                    page = 1;

                } 



                currentPage = page;

            });                

            

			// Bullet Point Modification

			$("ul.bullet-points li").removeClass('active');

            var current_bullet = page;

            if(page > bullet_needle) {

				current_bullet = 1;

			} else if(page == 0) {

            	current_bullet = bullet_needle;

			}

			$("a.goto-slide[rel='slide-"+current_bullet+"']").parent().addClass('active');



            return false;

        }

        

        $wrapper.after('<a class="arrow-left"></a><a class="arrow-right"></a>');

        

        // 5. Bind to the forward and back buttons

        $('.arrow-left', this).click(function () {

            return gotoPage(currentPage - 1);

        });

        

        $('.arrow-right', this).click(function () {

            return gotoPage(currentPage + 1);

        });

        

        // create a public interface to move to a specific page

        $(this).bind('goto', function (event, page) {

            gotoPage(page);

        });

        

        // Calculate number of bullet points

  		var totalElements = $("#slideshow ul li[class='item']").length;

  		var bullet_needle = Math.ceil(totalElements/1);

  		var i = 1;



  		// Generate bullet points

  		$(this).append('<ul class="bullet-points"></ul>');

  		for(i=1;i<=bullet_needle;i++){

  			$("ul.bullet-points").append('<li><a class="goto-slide" href="#" rel="slide-'+i+'">'+i+'</a></li>');

  		}

		$("ul.bullet-points li:first-child").addClass("active");

		

  		// Bind the Click action

		$('a.goto-slide').click(function (e) {

			e.preventDefault();

			$("ul.bullet-points li").removeClass('active');

			$(this).parent().addClass('active');

			var page = $(this).attr('rel');

			page = page.split('-');

			page = parseInt(page[1]);	

			gotoPage(page);                

		});

    });  

};
