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

(function($) {

$.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();

	    }

	}

    }
}
})(jQuery);

