(function($) {
   
    $.fn.extend({

        carousel: function(options) {
            
            var settings = $.extend({
                'autoplay': false,
                'pagination': false,
                'simple_pagination': false,
                'animate': true,
                'fading': false,
                'animation_speed': 500,
                'slideshow': true,
                'play_speed': 5000,
                'play_button': ['slideshow', 'stop'],
                'mouse_functions': [false, false],
                'description': false,
                'leading_zeros': false
            }, options)

            return this.each(function() {

                var obj = $(this)
                var items = $(".carousel-item", obj)
                var item = items[0]
                var items_count = items.length
                var item_width = $(item).width()
                var carousel_position = 0
                var interval = null
                var playing = 0

                obj
                    .addClass('js')
                    .wrap(
                        $("<div />")
                            .addClass('carousel-inner')
                        )

                if(!settings.fading) {
                    obj.css({
                        'width': (items_count * item_width) + 'px'
                    })
                }
         
                obj.parent().wrap(
                    $("<div />")
                        .addClass('carousel-wrapper')
                )

                obj.parent().parent().append(
                    $("<p />")
                        .addClass('carousel-pagination')
                )
                  
                if(settings.description) {
                    obj.parent().parent().prepend(
                        $("<h2 />")
                            .addClass('carousel-item-title')
                            .text($(item).attr('alt'))
                    )
                }

                if(settings.fading) {
                    zindex = 1000 + items_count
                    for(var i = 0; i < items_count; i++) {
                        obj.find(".carousel-item:eq(" + i + ")").css('zIndex', zindex)
                        zindex = zindex - 1
                    }
                }

                // If pagination {
                if(settings.pagination && items_count > 1) {

                    for(var i = 1; i <= items_count; i++) {
                        var nr = i
                        if(settings.leading_zeros) {
                            nr = '0' + i
                        }
                        obj.parent().parent().find(".carousel-pagination")
                            .append(
                                $("<a />")
                                    .attr({
                                        'href': '',
                                        'rel': i
                                    })
                                    .addClass('carousel-pagination-item')
                                    .text(nr)
                                    .append(
                                        $("<span />")
                                            .addClass('replace')
                                    )
                            )
                            .append(' ')
                    }

                    obj.parent().parent().find(".carousel-pagination-item").click(function() {
                        var nr = $(this).attr('rel')
                        scroll(obj, nr)
                        return false
                    })

                    $(".carousel-pagination-item:eq(0)").addClass('selected')
                    
                }
                // } If pagination
                            
                // If simple pagination {
                if(settings.simple_pagination) {
                    
                    obj.parent().parent().find(".carousel-pagination")
                        .append(
                            $("<a />")
                                .attr({
                                    'href': ''
                                })
                                .addClass('carousel-simple-pagination-item prev')
                                .append(
                                    $("<span />")
                                        .addClass('replace')
                                )
                        )
                        .append(
                            $("<a />")
                                .attr({
                                    'href': ''
                                })
                                .addClass('carousel-simple-pagination-item next')
                                .append(
                                    $("<span />")
                                        .addClass('replace')
                                )
                        )
                    
                        obj.parent().parent().find(".carousel-simple-pagination-item").click(function() {
                            if($(this).hasClass('prev')) {
                                scroll(obj, undefined, true)
                            } else {
                                scroll(obj)
                            }
                            return false
                        })
                        
                }
                // } If simple pagination

                // If mouse functions {
                if(settings.mouse_functions[0] && settings.mouse_functions[1]) {
                    obj.parent().parent()
                        .mouseover(function() {
                            settings.mouse_functions[0](obj)
                        })
                        .mouseout(function() {
                            settings.mouse_functions[1](obj)
                        })
                }
                // } If mouse functions

                // Play/pause button {
                if(settings.slideshow) {
                    obj.parent().parent().find(".carousel-pagination")
                        .append(
                            $("<a />")
                                .attr({
                                    'href': ''
                                })
                                .addClass('carousel-play-button')
                                .text(settings.play_button[0])
                        )
                }

                obj.parent().parent().find(".carousel-play-button").toggle(function() {
                    if(settings.autoplay) {
                        pause(obj)
                        $(this).text(settings.play_button[0])
                    } else {
                        play(obj)
                        $(this).text(settings.play_button[1])
                    }
                }, function() {
                    if(settings.autoplay) {
                        play(obj)
                        $(this).text(settings.play_button[1])
                    } else {
                        pause(obj)
                        $(this).text(settings.play_button[0])
                    }
                })
                // } Play/pause button

                function scroll(obj, nr, back) {
                    if(nr == undefined) {
                        nr = (-(carousel_position) / item_width + 2)
                        if(nr > items_count) {
                            nr = 1
                        }
                        if(back) {
                            nr = (-(carousel_position) / item_width)
                            if(nr == 0) {
                                nr = items_count
                            }
                        }
                    }
                    carousel_position = -((nr * item_width) - item_width)
                    if(settings.animate) {
                        obj.stop().animate({
                            'marginLeft': carousel_position + 'px'
                        }, settings.animation_speed)
                    } else {
                        if(settings.fading) {
                            obj.find(".carousel-item").css({
                                'zIndex': 1000
                            })
                            queue = nr - 1
                            queue_prev = queue - 1
                            if(queue == 0) {
                                queue_prev = items_count - 1
                            }
                            obj.find(".carousel-item:eq(" + queue_prev + ")").css('zIndex', (1000 + items_count))
                            obj.find(".carousel-item:eq(" + queue + ")")
                                .css({
                                    'zIndex': (1000 + items_count + 1),
                                    'opacity': 0
                                })
                                .animate({
                                    'opacity': 1
                                }, settings.animation_speed)
                        } else {
                            obj.css({
                                'marginLeft': carousel_position + 'px'
                            })
                        }
                    }
                    if(settings.pagination) {
                        obj.parent().parent().find(".carousel-pagination-item").removeClass('selected')
                        obj.parent().parent().find(".carousel-pagination-item[rel=" + nr + "]").addClass('selected')
                    }
                    if(settings.description) {
                        obj.parent().parent().find(".carousel-item-title").text($(".carousel-item:eq(" + (nr - 1) + ")").attr('alt'))
                    }
                }

                function play(obj) {
                    interval = setInterval(function() {
                        scroll(obj)
                    }, settings.play_speed)
                    playing = 1
                }

                function pause(obj) {
                    clearInterval(interval)
                    playing = 0
                }

                if(settings.autoplay) {
                    play(obj)
                    obj.parent().parent().find(".carousel-play-button").text(settings.play_button[1])
                }

            })

        }

    })
 
})(jQuery)

