(function($) {

    $.fn.slide = function(options) {

        var defaults = {

            slideWidth: 845,

            autoplay: false,

            duration: 3000,

            showNavigator: true,

            showSlideIndex: false

        };

        var options = $.extend(defaults, options);

        return this.each(function() {

            var slideshow = $(this);

            var o = options;

            var currentPosition = 0;

            var slides = $('.slide');

            var numberOfSlides = slides.length;

            var t;



            // Remove scrollbar in JS

            $('#slidesContainer').css('overflow', 'hidden');



            // Wrap all .slides with #slideInner div

            slides.wrapAll('<div id="slideInner"></div>')



            // Float left to display horizontally, readjust .slides width

			.css({

			    'float': 'left',

			    'width': o.slideWidth

			});



            // Insert a clone of first slide 

            $('.slide:first').clone().appendTo('#slideInner');



            // Set #slideInner width equal to total width of all slides

            $('#slideInner').css('width', o.slideWidth * (numberOfSlides + 1));



            // Insert controls in the DOM

            if (o.showNavigator) {

                slideshow

				    .prepend('<span class="control" id="leftControl"><img src="images/gallery/left.png" alt="go left" /></span>')

				    .append('<span class="control" id="rightControl"><img src="images/gallery/right.png" alt="go right" /></span>');



                // Create event listeners for .controls clicks

                $('#leftControl').click(function() { prev(); return false; });

                $('#rightControl').click(function() { next(); return false; });

            }

            // Insert slides index

            if (o.showSlideIndex == true) {

                slideshow.append('<div id="slideIndex"></div>');

                for (var i = 1; i <= numberOfSlides; i++) {

                    $('#slideIndex').append('<span id="slide-' + i + '" class="numbers">' + i + '</span>');

                }

                $('.numbers').click(function() { goto(($(this).attr('id')).replace('slide-', '') - 1, false); return false; });

            }



            // Start

            init();



            //Init function

            function init() {

                manageControls(currentPosition);

                if (o.autoplay == true) setNextTimeOut(o.duration);

            }



            // Next

            function next() {

                currentPosition++;

                if (currentPosition >= numberOfSlides) currentPosition = 0;

                slideTo(currentPosition, true);

            }



            // Previous

            function prev() {

                currentPosition--;

                if (currentPosition < 0) currentPosition = numberOfSlides - 1;

                slideTo(currentPosition, false);

            }



            // Go to a slide 

            function goto(position) {

                currentPosition = position;

                slideTo(currentPosition, false);

            }



            // Set time out for next slide

            function setNextTimeOut() {

                t = setTimeout(function() { next(); }, o.duration);

            }



            function clearNextTimeOut()

            { 

                clearTimeout(t);

            }

            // Slide

            function slideTo(position, continuously) {

                $('#slideInner').stop();

                clearNextTimeOut();

                // usual cases

                if (continuously == false || o.autoplay == false || position != 0) {

                    $('#slideInner').animate({ 'marginLeft': o.slideWidth * (-position) }, '', '',

						function() {

						    manageControls(position);

						    if (o.autoplay == true) setNextTimeOut();

						}

					)

                }

                // autoplay: slide from last to first one continuously

                else {

                    // slide to the 'fake' first slide (actually at the last)

                    $('#slideInner').animate({ 'marginLeft': o.slideWidth * (-numberOfSlides) }, '', '',

						function() {

						    //immediately change to the 'true' first slide

						    $('#slideInner').css('marginLeft', 0);

						    manageControls(position)

						    if (o.autoplay == true) setNextTimeOut();

						}

					)

                }

            }



            // manageControls: Hides and Shows controls depending on currentPosition

            function manageControls(position) {

                if (o.showNavigator) {

                    // Hide left arrow if position is first slide

                    if (position == 0) { $('#leftControl').hide() } else { $('#leftControl').show() };

                    // Hide right arrow if position is last slide

                    if (position == (numberOfSlides - 1)) { $('#rightControl').hide() } else { $('#rightControl').show() };

                }



                // Hilight the current page

                if (o.showSlideIndex == true) {

                    // remove active class from all pages

                    $('.numbers').removeClass("active");

                    // add only to the current page

                    $('#slide-' + (position + 1)).addClass("active");

                }

            }

        });

    };

})(jQuery);
