/*
bxCarousel v1.0
Plugin developed by: Steven Wanderski
http://bxcarousel.com
http://stevenwanderski.com

Released under the GPL license:
http://www.gnu.org/licenses/gpl.html
*/

(function ($) {

    $.fn.vbxCarousel = function (options) {

        var defaults = {
            move: 4,
            display_num: 4,
            speed: 500,
            margin: 0,
            auto: true,
            auto_interval: 5000,
            auto_dir: 'next',
            auto_hover: true,
            next_text: 'next',
            next_image: '',
            prev_text: 'prev',
            prev_image: '',
            controls: true,
            direction: 'hor'
        };

        var options = $.extend(defaults, options);

        return this.each(function () {
            var $this = $(this);
            var li = $this.find('li');
            var first = 0;
            var fe = 0;
            var last = options.display_num - 1;
            var le = options.display_num - 1;
            var is_working = false;
            var j = '';
            var clicked = false;

            li.css({ 'float': 'none', 'listStyle': 'none', 'marginRight': options.margin });
            var ow = li.outerHeight(true);
            wrap_height = (ow * options.display_num) - options.margin;
            var seg = ow * options.move;
            $this.wrap('<div class="bx_container"></div>').height(999999);
            if (options.controls) {
                if (options.next_image != '' || options.prev_image != '') { var controls = '<a href="" class="prev"><img src="' + options.prev_image + '"/></a><a href="" class="next"><img src="' + options.next_image + '"/></a>'; }
                else { var controls = '<a href="" class="prev">' + options.prev_text + '</a><a href="" class="next">' + options.next_text + '</a>'; }
            }
            $this.parent('.bx_container').wrap('<div class="bx_wrap"></div>').css({ 'position': 'relative', 'height': wrap_height, 'overflow': 'hidden' }).before(controls);
            var w = li.slice(0, options.display_num).clone();
            var last_appended = (options.display_num + options.move) - 1;
            $this.empty().append(w);
            get_p();
            get_a();
            $this.css({ 'position': 'relative', 'top': -(seg) });

            $this.parent().siblings('.next').click(function () {
                slide_next();
                clearInterval(j);
                clicked = true;
                return false;
            });
            $this.parent().siblings('.prev').click(function () {
                slide_prev();
                clearInterval(j);
                clicked = true;
                return false;
            });
            if (options.auto) {
             
                    start_slide();
                
                if (options.auto_hover && clicked != true) {
                    $this.find('li').live('mouseenter', function () {
                        if (!clicked) { clearInterval(j); }
                    });
                    $this.find('li').live('mouseleave', function () {
                        if (!clicked) {
                                start_slide();
                        }
                    });
                }
            }

            function start_slide() {
                if (options.auto_dir == 'prev') {
                    j = setInterval(function () { slide_next() }, options.auto_interval);
                } else {
                    j = setInterval(function () { slide_prev() }, options.auto_interval);
                }
            }

            function slide_next() {
                if (!is_working) {
                    is_working = true;
                    set_pos('prev');
                    $this.animate({ top: '-=' + seg }, options.speed, function () {
                        $this.find('li').slice(0, options.move).remove();
                        $this.css('top', -(seg));
                        get_a();
                        is_working = false;
                    });
                }
            }

            function slide_prev() {
                if (!is_working) {
                    is_working = true;
                    set_pos('next');
                    $this.animate({ top: '+=' + seg }, options.speed, function () {
                        $this.find('li').slice(-options.move).remove();
                        $this.css('top', -(seg));
                        get_p();
                        is_working = false;
                    });
                }
            }
          
            function get_a() {
                var str = new Array();
                var lix = li.clone();
                le = last;
                for (i = 0; i < options.move; i++) {
                    le++
                    if (lix[le] != undefined) {
                        str[i] = $(lix[le]);
                    } else {
                        le = 0;
                        str[i] = $(lix[le]);
                    }
                }
                $.each(str, function (index) {
                    $this.append(str[index][0]);
                });
            }

            function get_p() {
                var str = new Array();
                var lix = li.clone();
                fe = first;
                for (i = 0; i < options.move; i++) {
                    fe--
                    if (lix[fe] != undefined) {
                        str[i] = $(lix[fe]);
                    } else {
                        fe = li.length - 1;
                        str[i] = $(lix[fe]);
                    }
                }
                $.each(str, function (index) {
                    $this.prepend(str[index][0]);
                });
            }

            function set_pos(dir) {
                if (dir == 'next') {
                    first += options.move;
                    if (first >= li.length) {
                        first = first % li.length;
                    }
                    last += options.move;
                    if (last >= li.length) {
                        last = last % li.length;
                    }
                } else if (dir == 'prev') {
                    first -= options.move;
                    if (first < 0) {
                        first = li.length + first;
                    }
                    last -= options.move;
                    if (last < 0) {
                        last = li.length + last;
                    }
                }
            }
        });
    }
})(jQuery);
