﻿/*
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.bxCarousel = function(options) {
        var defaults = { move: 4, display_num: 4, speed: 500, margin: 0, auto: false, auto_interval: 2000, auto_dir: 'next', auto_hover: false, next_text: 'next', next_image: '', prev_text: 'prev', prev_image: '', controls: true }; 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': 'left', 'listStyle': 'none', 'marginRight': options.margin }); var ow = li.outerWidth(true); wrap_width = (ow * options.display_num) - options.margin; var seg = ow * options.move; $this.wrap('<div class="bx_container"></div>').width(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', '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; $this.empty().append(w); get_p(); get_a(); $this.css({ 'position': 'relative', 'left': -(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 == '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'); $this.animate({ left: '-=' + seg }, options.speed, function() { $this.find('li').slice(0, options.move).remove(); $this.css('left', -(seg)); get_a(); is_working = false; }); } }
            function slide_prev() { if (!is_working) { is_working = true; set_pos('prev'); $this.animate({ left: '+=' + seg }, options.speed, function() { $this.find('li').slice(-options.move).remove(); $this.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] = $(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);
