/*
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 (jQuery) {
    jQuery.fn.bxCarousel = function (options) {
        var defaults = {
           	display_num: 3,       // number of elements to be visible
	   		move: 1,              // number of elements to the shift the slides
	   		speed: 0,           // number in milliseconds it takes to finish slide animation
	   		margin:27,             // right margin to be applied to each &lt;li&gt; element (in pixels, although do not include "px")
	   		auto: true,          // automatically play slides without a user click
	   		auto_interval: 4000,  // the amount of time in milliseconds between each auto animation
	   		auto_dir: 'next',     // direction of auto slideshow (options: 'next', 'prev')
	   		auto_hover: false,    // determines if the slideshow will stop when user hovers over slideshow
	   		next_text: 'next',    // text to be used for the 'next' control
	   		next_image: '/images/ic_carousel_nxt.png',       // image to be used for the 'next' control
	   		prev_text: 'prev',    // text to be used for the 'prev' control
	   		prev_image: '/images/ic_carousel_pre.png',       // image to be used for the 'prev' control
	   		controls: true        // determines if controls will be displayed
        };
        var options = jQuery.extend(defaults, options);
        return this.each(function () {
            var jQuerythis = jQuery(this);
            var li = jQuerythis.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': 'left',
                'listStyle': 'none',
                'marginRight': options.margin
            });
            var ow = li.outerWidth(true);
            wrap_width = (ow * options.display_num) - options.margin;
            var seg = ow * options.move;
            jQuerythis.wrap('<div class="vms_group_carousel_contaner"></div>').width(999999);
            if (options.controls) {
                if (options.next_image != '' || options.prev_image != '') {
                    var controls = '<a href="" class="carousel_previous"><img align="left" src="' + options.prev_image + '"/></a><a href="" class="carousel_next"><img align="left" src="' + options.next_image + '"/></a>';
                } else {
                    var controls = '<a href="" class="carousel_previous">' + options.prev_text + '</a><a href="" class="carousel_next">' + options.next_text + '</a>';
                }
            }
            jQuerythis.parent('.vms_group_carousel_contaner').wrap('<div class="vms_group_carousel"></div>').css({
                'position': 'relative',
                'width': wrap_width,
                'overflow': 'hidden'
            }).before(controls);
            var w = li.slice(0, options.display_num).clone();
            var last_appended = (options.display_num + options.move) - 1;
            jQuerythis.empty().append(w);
            get_p();
            get_a();
            jQuerythis.css({
                'position': 'relative',
                'left': -(seg)
            });
            jQuerythis.parent().siblings('.carousel_next').click(function () {
                slide_next();
                clearInterval(j);
                clicked = true;
                return false;
            });
            jQuerythis.parent().siblings('.carousel_previous').click(function () {
                slide_prev();
                clearInterval(j);
                clicked = true;
                return false;
            });
            if (options.auto) {
                start_slide();
                if (options.auto_hover && clicked != true) {
                    jQuerythis.find('li').live('mouseenter', function () {
                        if (!clicked) {
                            clearInterval(j);
                        }
                    });
                    jQuerythis.find('li').live('mouseleave', function () {
                        if (!clicked) {
                            start_slide();
                        }
                    });
                }
            }

            function start_slide() {
                if (options.auto_dir == 'next') {
                    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('next');
                    jQuerythis.animate({
                        left: '-=' + seg
                    }, options.speed, function () {
                        jQuerythis.find('li').slice(0, options.move).remove();
                        jQuerythis.css('left', -(seg));
                        get_a();
                        is_working = false;
                    });
                }
            }

            function slide_prev() {
                if (!is_working) {
                    is_working = true;
                    set_pos('prev');
                    jQuerythis.animate({
                        left: '+=' + seg
                    }, options.speed, function () {
                        jQuerythis.find('li').slice(-options.move).remove();
                        jQuerythis.css('left', -(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] = jQuery(lix[le]);
                    } else {
                        le = 0;
                        str[i] = jQuery(lix[le]);
                    }
                }
                jQuery.each(str, function (index) {
                    jQuerythis.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] = jQuery(lix[fe]);
                    } else {
                        fe = li.length - 1;
                        str[i] = jQuery(lix[fe]);
                    }
                }
                jQuery.each(str, function (index) {
                    jQuerythis.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);
