(function($){
	
    $.fn.wck_diapo = function(options)
    {
		$(this).addClass("wck-diapo-activated");

		if (options && options.add_css != undefined)
			$(this).addClass(options.add_css);

		var step = 1;
		if (options && options.step != undefined)
			step = options.step;

		var speed = 500;
		if (options && options.speed != undefined)
			speed = options.speed;

		var autoplay = false;
		if (options && options.autoplay == true)
			autoplay = options.autoplay;

		var delay = 3000;
		if (options && options.delay != undefined)
			delay = options.delay;

		var callback = null;
		if (options && options.callback != undefined)
			callback = options.callback;

		var margin = 0;
		if (options && options.margin != undefined)
			margin = options.margin;

		var wrapper = $(this).find('.wck-diapo-wrapper');
		var container = wrapper.find('ul');

		// Overall width
		var liz = container.find('li');
		var overallWidth = 0;
		for (i = 0, l = liz.length; i < l; i++)
		{
			overallWidth += $(liz[i]).outerWidth(true);
		}
		
		var wrapperWidth = $(wrapper).outerWidth();
		var availableWidth = overallWidth - wrapperWidth;

		if (availableWidth <= 0) return;
		
		// Init possible positions
		var tPositions = new Array();
		var total = 0;
		tPositions.push(total);
		for (i = 0, cpt = 0, l = liz.length; i < l; i++)
		{
			if (cpt == step && total < availableWidth) {

			tPositions.push(total);
			cpt = 0;
			}

			cpt++;
			total += $(liz[i]).outerWidth(true);
		}
		// Push last position
		tPositions.push(availableWidth);

		var config =
		{
			'container':container,
			'positions':tPositions,
			'nb_elems':tPositions.length,
			'arrow_left':$(this).children('.wck-diapo-left'),
			'arrow_right':$(this).children('.wck-diapo-right'),
			'speed':speed,
			'current_id':0,
			'callback':callback,
			'autoplay':autoplay,
			'delay':delay
		};

		// Init arrows
		config.arrow_left.removeClass("display-none").addClass("disabled");
		config.arrow_right.removeClass("display-none");

		jQuery.data(this[0], 'wck_diapo', config);

		if (config.callback != null)
			config.callback(config.current_id);

		if (config.autoplay == true) {
			
			config.inter_id = setTimeout(delegate(this, $(this).wck_handle_autoplay), config.delay);
		}
    }

    $.fn.wck_diapo_prev = function()
    {
		var config = jQuery.data($(this)[0], 'wck_diapo');

		if (config.current_id <= 0) return;
		if (config.container.hasClass('animating')) return;

		if (config.arrow_right.hasClass('disabled'))
			config.arrow_right.removeClass('disabled');

		config.current_id--;

		if (config.current_id <= 0)
			config.arrow_left.addClass('disabled');

		$(this).wck_diapo_move(config);
		}

		$.fn.wck_diapo_next = function()
		{
		var config = jQuery.data($(this)[0], 'wck_diapo');

		if (config.current_id >= config.nb_elems - 1) return;
		if (config.container.hasClass('animating')) return;

		if (config.arrow_left.hasClass('disabled'))
			config.arrow_left.removeClass('disabled');

		config.current_id++;

		if (config.current_id >= config.nb_elems - 1)
			config.arrow_right.addClass('disabled');

		$(this).wck_diapo_move(config);
    }

    $.fn.wck_diapo_goto = function(index)
    {
		var config = jQuery.data($(this)[0], 'wck_diapo');

		if (index < 0 && index > config.nb_elems - 1) return;
		if (config.container.hasClass('animating')) return;

		if (config.arrow_left.hasClass('disabled'))
			config.arrow_left.removeClass('disabled');

		if (config.arrow_right.hasClass('disabled'))
			config.arrow_right.removeClass('disabled');

		config.current_id = index;

		if (config.current_id >= config.nb_elems - 1)
			config.arrow_right.addClass('disabled');

		if (config.current_id <= 0)
			config.arrow_left.addClass('disabled');

		$(this).wck_diapo_move(config);
    }
    
    $.fn.wck_handle_autoplay = function()
    {
		var config = jQuery.data($(this)[0], 'wck_diapo');

		if (config.arrow_right.hasClass('disabled'))
			$(this).wck_diapo_goto(0);
		else
			$(this).wck_diapo_next();

		config.inter_id = setTimeout(delegate(this, $(this).wck_handle_autoplay), config.delay);
    }

    $.fn.wck_diapo_move = function(config)
    {
		config.container.addClass('animating');
		var left = 0 - config.positions[config.current_id];
		config.container.animate({left:left}, config.speed, function() {config.container.removeClass('animating');});

		if (config.callback != null)
			config.callback(config.current_id);

		if (config.autoplay == true)
			clearTimeout(config.inter_id);
    }
	
})(jQuery);

function delegate(that, thatMethod)
{
    if (arguments.length > 2)
    {
	var _params = [];
	for(var n = 2; n < arguments.length; ++n) _params.push(arguments[n]);
	return function() {
	    return thatMethod.apply(that,_params);
	}
    }
    else
	return function() {
	    return thatMethod.call(that);
	}
}
