(function($) 
{
    $.fn.jslider = function(o) {
        return this.each(function() {
            new $js(this, o);
        });
    };

    // Default configuration properties.
    var defaults = {
		url : "",
		background_color :'#000000',
		loader_url : "themes/rcn/img/ajax-loader.gif",
		pagination_class : '.pagination',
		pagination_width : '100%',
		pagination_bottom : '0',
	    speed: 200,
	    easing: null,
		success_callback : function(){}
    };

    $.jslider = function(e, o) {
		
        this.options    = $.extend({}, defaults, o || {});
		this.container = $(e);
        this.slider     = $('.slider', e);
		this.outblock = $('.slider ul.main', e);
		this.inblock = null;
		this.pagination = null;
        this.buttonNext = null;
        this.buttonPrev = null;
		this.originalPagination = $('.pagination', e);
		this.page = 1;
		this.h = this.height(this.slider)
	 	this.loading = false, this.init = true, this.direction = null, this.nbPages = null;
		this.time = 250, this.beingShown = false; this.shown = false;
		this.setup();
		this.getData();
		//this.toggle();
    };

    var $js = $.jslider;

    $js.fn = $js.prototype = {
        jslider: '0.2.3'
    };

    $js.fn.extend = $js.extend = $.extend;

    $js.fn.extend({
 
        setup: function() {
			var self = this;
			
			this.originalPagination.remove();
			//////
			var pagination = '<div class="js_pagination" style="position:absolute;bottom:'+ this.options.pagination_bottom +';width:'+ this.options.pagination_width +';height:15px;"></div>';
			var prev = '<a style="position:absolute;left:3px" href="#" class="prev">Pr&eacute;c&eacute;dent</a>';
			var next = '<a style="position:absolute;right:3px;top:0" href="#" class="next" >Suivant</a>';
			var count = '<div style="width:60px;margin:0 auto;text-align:center;" class="count"></div>'
			/////
			this.pagination = $(pagination);
			this.prev = $(prev);
			this.next = $(next);
			this.count = $(count);
			/////
			this.container.append(this.pagination);
			//this.pagination.hide();
			this.pagination.append(this.prev).append(this.count).append(this.next);
			this.pagination.css({'background':this.options.background_color});
			$('a', this.pagination).click(function(){return false;});
			
			this.next.click(function(){self.goNext()})
			this.prev.click(function(){self.goPrev()})	
        },
		
		height: function (el) {
	   		return el[0].offsetHeight
		},
		
		switchBtn : function (max)
		{
			(this.page <= 1)? this.prev.hide() : this.prev.show();
			(this.page >= this.nbPages)? this.next.hide() : this.next.show();
		},
		
		disablePrevNext : function ()
		{
			this.next.hide();
			this.prev.hide();
		},
		
		getData : function()
		{
			this.count.html('<img src="' + this.options.loader_url + '" />');
			this.disablePrevNext();
			var self = this;
			$.ajax({
				dataType: 'json',
				url: this.options.url + this.page,
				success: function(json){
					self.populate(json);
					if(!self.init) self.animate();
					self.options.success_callback();
				}
			})
		},
		
		populate : function(data)
		{
			this.nbPages = data.nb;
			this.count.html(data.current + " sur " + data.nb);
			if (!this.init) {
				this.inblock = $(data.data);
			}
			else 
			{
				this.init = false;
				this.switchBtn(data.nb);
			}	
			
		},
		
		animate : function()
		{
			//this.disablePrevNext();
			var self = this;

			if(this.direction == 'next')
			{
				var h = -(this.h)
				this.outblock.animate({top: h }, 1200, "easeout", function(){self.outblock.remove();})
				this.outblock.after(this.inblock);
				this.inblock.animate({top: h}, 1200, "easeout", function()
				{
					self.inblock.css({'top': 0 +'px'});
					self.outblock = self.inblock;
					self.loading = false;
					self.switchBtn();
				})
			}
			else if(this.direction == 'prev')
			{
				this.inblock.css({'top': -(this.h) +'px' })
				this.outblock.css({'top': -(this.h) })
				this.outblock.before(this.inblock);
				this.outblock.animate({top:0}, 1200, "easeout", function(){self.outblock.remove();})
				this.inblock.animate({top:0}, 1200, "easeout", function()
				{
						self.inblock.css({'top':0+'px'});
						self.outblock = self.inblock;
						self.loading = false;
						self.switchBtn();
				})
			}
		},
		goNext : function()
		{
			if(!this.loading)
			{
				this.loading = true;
				this.page++;
				this.direction = 'next';
				this.getData();
			}
		},
		goPrev : function()
		{
			if(!this.loading)
			{
				this.loading = true;
				this.page--;
				this.direction = 'prev';
				this.getData();
			}
		},
		toggle : function()
		{
			var self = this;
			this.container.mouseover(function(){
				var sself = self;
				if(self.shown || self.beingShown) return;
				self.pagination.fadeIn('slow', function(){
					sself.shown = true;
				})
				self.beingShown = true;
			}).mouseleave(function(){
				var sself = self;
				self.pagination.fadeOut('slow', function(){
					sself.shown = false;
				})
				self.beingShown = false;
			})
		}
    });

    $js.extend({
        defaults: function(d) {
            return $.extend(defaults, d || {});
        }
    });
})(jQuery);