/*
 uses css class "curr_rotator_item"
 */
jQuery.fn.carousel = function(previous, next, menu, options) {
    var sliderList = jQuery(this).children()[0];
    var totalwidth = jQuery(sliderList).children().outerWidth("true");
    var curItem = 0;
    var is_auto = false;
    var settings = {
        'transitionspeed': 2000,
        'autostart': false,
        'stay': 5000,
        'direction': 'right'
    }
    if (options) {
        jQuery.extend(settings, options);
    }

    if (sliderList) {
        var increment = totalwidth,
            elmnts = jQuery(sliderList).children(),
            numElmts = elmnts.length,
            sizeFirstElmnt = increment,
            shownInViewport = Math.round(jQuery(this).width() / sizeFirstElmnt),
            firstElementOnViewPort = 1,
            isAnimating = false;
        if (numElmts > 0) {
            if (settings.autostart) {
                var timer = settings.transitionspeed + settings.stay;
                var it = window.setInterval(function() {
                    slide()
                }, timer);
            }


            for (i = 0; i < shownInViewport; i++) {
                jQuery(sliderList).css('width', (numElmts + shownInViewport) * increment + increment + "px");
                jQuery(sliderList).append(jQuery(elmnts[i]).clone());
            }

            jQuery(previous).click(function(event) {
                stopAutostart();
                if (!isAnimating) {
                    if (firstElementOnViewPort == 1) {
                        jQuery(sliderList).css('left', "-" + numElmts * sizeFirstElmnt + "px");
                        curItem = (numElmts - 1);
                        firstElementOnViewPort = numElmts;
                    }
                    else {
                        firstElementOnViewPort--;
                        curItem--;
                    }

                    jQuery(sliderList).animate({
                        left: "+=" + increment,
                        y: 0,
                        queue: true
                    }, {duration: settings.transitionspeed, step:step(), complete: function() {
                        isAnimating = false;
                    }});
                    isAnimating = true;
                }
                is_auto = false;

            });

            jQuery(next).click(function(event) {
                stopAutostart();
                if (!isAnimating) {

                    if (firstElementOnViewPort == numElmts) {
                        curItem = -1;
                    }
                    if (firstElementOnViewPort > numElmts) {
                        firstElementOnViewPort = 2;
                        curItem = 1;
                        jQuery(sliderList).css('left', "0px");
                    }
                    else {
                        firstElementOnViewPort++;
                        curItem++;
                    }
                    jQuery(sliderList).animate({
                        left: "-=" + increment,
                        y: 0,
                        queue: true
                    }, {duration: settings.transitionspeed, step:step(), complete: function() {
                        isAnimating = false;
                    }});
                    isAnimating = true;
                }
                is_auto = false;
            });
            jQuery(menu).children().hover(function() {
                jQuery(this).addClass('curr_rotator_item_hover');
            }, function() {
                jQuery(this).removeClass('curr_rotator_item_hover');
            });

            var menuList = jQuery(menu).children().click(function(event) {

                event.preventDefault();
                if(!isAnimating){
                    stopAutostart();
                var menu_inc = jQuery(this).index();
                if (curItem < menu_inc) {
                    var mover = '-';
                    var diff = menu_inc - curItem;
                } else {
                    var mover = '+';
                    var diff = curItem - menu_inc;
                }
                curItem = menu_inc;
                var gothere = (increment * diff);
                firstElementOnViewPort = (menu_inc + 1);
                if (!isAnimating) {
                    jQuery(sliderList).animate({
                        left: mover + "=" + gothere,
                        y: 0,
                        queue: true
                    }, {duration: settings.transitionspeed, step:step(), complete: function() {
                        isAnimating = false;
                    }});
                    isAnimating = true;
                }
                is_auto = false;
            }
            })

            function stopAutostart() {
                if (!is_auto && settings.autostart) {
                    clearInterval(it);
                }
            }

            function step(now, fx) {
                jQuery(menu).children().removeClass('curr_rotator_item');
                jQuery(menu + ' :nth-child(' + (curItem + 1) + ')').toggleClass('curr_rotator_item');
            }

            function slide() {
                is_auto = true;
                if (settings.direction == 'right') {
                    jQuery(next).click();
                } else {
                    jQuery(previous).click();
                }
            }
        }
    }
};

