/**
*
*
* bxSlider: Content slider / fade / ticker using the jQuery javascript library.
*
* Author: Steven Wanderski
* Email: wandoledzep@gmail.com
* URL: http://bxslider.com
* 
*
**/

jQuery.fn.bxSlider = function(options){

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Declare variables and functions
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
var defaults = {
mode: 'slide',
speed: 500,
auto: false,
auto_direction: 'left',
pause: 2500,
controls: true,
prev_text: 'prev',
next_text: 'next',
width: $(this).children().width(),
prev_img: '',
next_img: '',
ticker_direction: 'left',
wrapper_class: 'container'
};

options = $.extend(defaults, options);

if(options.mode == 'ticker'){
options.auto = true;
}

var $this = $(this);

var $parent_width = options.width;
var current = 0;
var is_working = false;
var child_count = $this.children().size();
var i = 0;
var j = 0;
var k = 0;

function animate_next(){

is_working = true;

$this.animate({'left':'-' + $parent_width * 2 + 'px'}, options.speed, function(){

$this.css({'left':'-' + $parent_width + 'px'}).children(':first').appendTo($this);

is_working = false;

});

}

function animate_prev(){

is_working = true;

$this.animate({'left': 0}, options.speed, function(){

$this.css({'left':'-' + $parent_width + 'px'}).children(':last').insertBefore($this.children(':first'));

is_working = false;

});

}

function fade(direction){

if(direction == 'next'){

var last_before_switch = child_count - 1;
var start_over = 0;
var incr = k + 1;

}else if(direction == 'prev'){

var last_before_switch = 0;
var start_over = child_count -1;
var incr = k - 1;

}

is_working = true;

if(k == last_before_switch){

$this.children().eq(k).fadeTo(options.speed, 0, function(){$(this).hide();});
//$this.children().eq(k).css({'left':'-9999px'});
$this.children().eq(start_over).show().fadeTo(options.speed, 1, function(){

is_working = false;

k = start_over;

});

}else{

$this.children().eq(k).fadeTo(options.speed, 0, function(){$(this).hide();});
//$this.children().eq(k).css({'left':'-9999px'});
$this.children().eq(incr).show().fadeTo(options.speed, 1, function(){

is_working = false;

k = incr;

});

}

}

function add_controls(){

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Check if user selected images to use for next / prev
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(options.prev_img != '' || options.next_img != ''){

$this.parent().append('<a class="slider_prev" href=""><img src="' + options.prev_img + '" alt=""/></a><a class="slider_next" href=""><img src="' + options.next_img + '" alt="" /></a>');

}else{

$this.parent().append('<a class="slider_prev" href="">' + options.prev_text + '</a><a class="slider_next" href="">' + options.next_text + '</a>');

}

$this.parent().find('.slider_prev').css({'float':'left', 'outline':'0'});
$this.parent().find('.slider_next').css({'float':'right', 'outline':'0'});


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Accomodate padding-top for controls when elements are absolutely positioned (only in fade mode)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(options.mode == 'fade'){

$this.parent().find('.slider_prev').css({'paddingTop' : $this.children().height()})
$this.parent().find('.slider_next').css({'paddingTop' : $this.children().height()})

}
                                                       
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Actions when user clicks next / prev buttons        
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                       
$this.parent().find('.slider_next').click(function(){

if(!is_working){

if(options.mode == 'slide'){
 
animate_next();

if(options.auto){

clearInterval($.t);

$.t = setInterval(function(){animate_next();}, options.pause);

}

}else if(options.mode == 'fade'){

fade('next');

if(options.auto){

clearInterval($.t);

$.t = setInterval(function(){fade('next');}, options.pause);

}


}

}

return false;

});

$this.parent().find('.slider_prev').click(function(){

if(!is_working){

if(options.mode == 'slide'){
 
animate_prev();

if(options.auto){

clearInterval($.t);

$.t = setInterval(function(){animate_prev();}, options.pause);

}

}else if(options.mode == 'fade'){

fade('prev');

if(options.auto){

clearInterval($.t);

$.t = setInterval(function(){fade('prev');}, options.pause);

}

}

}

return false;

});

}


function ticker() {

if(options.ticker_direction == 'left'){

$this.animate({'left':'-' + $parent_width * 2 + 'px'}, options.speed, 'linear', function(){

$this.css({'left':'-' + $parent_width + 'px'}).children(':first').appendTo($this);

ticker();

});

}else if(options.ticker_direction == 'right'){

$this.animate({'left': 0}, options.speed, 'linear', function(){

$this.css({'left':'-' + $parent_width + 'px'}).children(':last').insertBefore($this.children(':first'));

ticker();

});

}

}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Create content wrapper and set CSS
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

$this.wrap('<div class="' + options.wrapper_class + '"></div>');

//console.log($this.parent().css('paddingTop'));

if(options.mode == 'slide' || options.mode == 'ticker'){

$this.parent().css({
'overflow' : 'hidden',
'position' : 'relative',
'width' : options.width + 'px'
});

$this.css({
'width' : '999999px',
'position' : 'relative',
'left' : '-' + $parent_width + 'px'
});

$this.children().css({
'float' : 'left',
'width' : $parent_width
});
 
$this.children(':last').insertBefore($this.children(':first'));

}else if(options.mode == 'fade'){

$this.parent().css({
'overflow' : 'hidden',
'position' : 'relative',
'width' : options.width + 'px'
//'height' : $this.children().height()
});

if(!options.controls){
$this.parent().css({'height' : $this.children().height()});
}

$this.children().css({
'position' : 'absolute',
'width' : $parent_width,
'listStyle' : 'none',
'opacity' : 0,
'display' : 'none'
});

$this.children(':first').css({
'opacity' : 1,
'display' : 'block'
});

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Check if user selected "auto"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(!options.auto){

add_controls();

}else{

if(options.mode == 'ticker'){

ticker();

}else{

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set a timed interval 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(options.mode == 'slide'){

if(options.auto_direction == 'left'){

$.t = setInterval(function(){animate_next();}, options.pause);

}else if(options.auto_direction == 'right'){

$.t = setInterval(function(){animate_prev();}, options.pause);

}

}else if(options.mode == 'fade'){

if(options.auto_direction == 'left'){

$.t = setInterval(function(){fade('next');}, options.pause);

}else if(options.auto_direction == 'right'){

$.t = setInterval(function(){fade('prev');}, options.pause);

}

}

if(options.controls){

add_controls();

}

}

}

}
