(function($) {
    /*
        carousel plugin code
    */
    $.fn.carousel = function(settings) {
        var config = {
            'automated': true,
            'speed': 500,
            'interval': 5000,
            'pagination': null,
            'arrows': null,
            'arrowSelector': '.carousel-arrows',
            'windowSelector': '.carousel-window',
            'pagesSelector': '.carousel-items',
            'pageSelector': '.carousel-items > .carousel-item',
            'navigationSelector': '.carousel-navigation',
            'navigationLinkSelector': '.carousel-link',
            'createNavigation': 'existing',
            'incrementFunction': function(carousel) {
                var position = parseInt($(carousel).data("position"));
                var max = parseInt($(carousel).data('max'));
                position++;

                if (position >= max) {
                    position = 0;
                }
                $(carousel).data("position", position);
                config.updateFunction(carousel);
            },
            'decrementFunction': function(carousel) {
                var position = parseInt($(carousel).data("position"));
                var max = parseInt($(carousel).data('max'));
                position--;

                if (position < 0) {
                    position = max - 1;
                }
                $(carousel).data("position", position);
                config.updateFunction(carousel);
            },
            'updateFunction': function(carousel) {
                var position = parseInt($(carousel).data("position"));

                $(config.navigationLinkSelector, carousel).removeClass("active");
                $(config.navigationLinkSelector, carousel).eq(position).addClass("active");

                var left = position * -1 * parseInt($(config.pageSelector, carousel).first().css("width"));
                $(config.pagesSelector, carousel).animate({left: left + "px"}, config.speed);
            }
        };
        if (settings) $.extend(config, settings);

        this.each(function() {
            // element-specific code here
            var carousel = this;
            var number_of_pages = $(config.pageSelector, carousel).length;

            config.navigationLinkSelector = config.navigationSelector + " " + config.navigationLinkSelector;

            $(carousel).data("position", 0);
            $(carousel).data("max", number_of_pages);
  
            $(config.pagesSelector, carousel).css('width', (parseInt($(config.pageSelector, carousel).first().width()) * number_of_pages) + 'px');

            if (config.automated) {
              var timer = window.setInterval(function() {
                  if ($(carousel).data('hovering') != 1) {
                    config.incrementFunction(carousel);
                  }
              }, config.interval);
              $(this).data("timer", timer);
            }

            var create = function() {
                $(config.navigationSelector, carousel).html('');
                var css = '';

                for( var num = 1; num <= number_of_pages; num++ ) {
                    css = "carousel-link";
                    css += (num == 1 ? ' first' : '');
                    css += (num == number_of_pages ? ' last' : '' );

                    $(config.navigationSelector, carousel).append('<li class="' + css + '">' + num + "</li>");
                }
            }

            switch (config.createNavigation) {
                case 'existing':
                    break;

                case 'create':
                    create();
                    break;

                case 'auto':
                default:
                    if ($(config.navigationSelector, carousel).length < 1)
                        $(config.windowSelector, carousel).after("<ul class='carousel-navigation'></ul>");
                    
                    if ($(config.navigationLinkSelector, carousel).length < 1)
                        create();

                    break;
            }

            $(config.navigationLinkSelector, carousel).each(function(i) {
                $(this).click(function() {
                    var timer = $(carousel).data('timer');
                    clearInterval(timer);

                    if (config.automated) {
                      var timer = window.setInterval(function() {
                          if ($(carousel).data('hovering') != 1) {
                            config.incrementFunction(carousel);
                          }
                      }, config.interval);
                      $(carousel).data("timer", timer);
                    }

                    $(carousel).data('position', i);
                    config.updateFunction(carousel);

                });
            });

            $(config.arrowSelector, carousel).each(function(i) {
                $('.carousel-arrow-left', this).click(function() {
                    var timer = $(carousel).data('timer');
                    clearInterval(timer);

                    if (config.automated) {
                      var timer = window.setInterval(function() {
                          if ($(carousel).data('hovering') != 1) {
                             config.incrementFunction(carousel);
                          }
                      }, config.interval);
                      $(carousel).data("timer", timer);
                    }
                    config.decrementFunction(carousel);
                });
                $('.carousel-arrow-right', this).click(function() {
                    var timer = $(carousel).data('timer');
                    clearInterval(timer);

                    if (config.automated) {
                      var timer = window.setInterval(function() {
                        config.incrementFunction(carousel);
                      }, config.interval);
                      $(carousel).data("timer", timer);
                    }
                    config.incrementFunction(carousel);
                });
            });

            $(config.windowSelector, carousel).hover(function() {
                $(carousel).data("hovering", 1);
            }, function() {
                $(carousel).data("hovering", 0);
            });

            config.updateFunction(carousel);
        });

        return this;
    };
})(jQuery);

jQuery(function($) {
    $('.carousel-wrapper').carousel({
        'interval': 5000,
        'createNavigation': 'auto',
        'pagesSelector': '.carousel, .carousel-items',
        'pageSelector': '.carousel > .carousel-item, .carousel-items > .carousel-item'
    });
});

