//configuration possible
var exemple = {
	mode: 'slide',				//SLIDE ou FADE
	direction: 'horizontal',	//HORIZONTAL ou VERTICAL [defaut : HORIZONTAL]		UNIQUEMENT en mode SLIDE
	range: 3,					//NB d'items à scroller [default : 1]				UNIQUEMENT en mode SLIDE
	viewport: {					//Dimensions du carousel							OBLIGATOIRE
		width: 680,				//Largeur											OBLIGATOIRE
		height: 240				//Hauteur
	},
	pagination: true,			//Pagination complète [default : false]
	duration: 0.6,				//Durée totale de l'animation
	autoDefil: 1,				//Vitesse de défilement automatique
	lang: {						//Traductions										OBLIGATOIRE
		next: 'next',			//next												OBLIGATOIRE
		prev: 'previous'		//previous											OBLIGATOIRE
	}
}
/******/
function makeCarousel(divID, config){
	if(typeof(config.direction) != 'undefined' && config.direction == 'vertical'){
		var cumulativeHeight = 0;
		$$('#'+divID+' > li').each(function(el){
			$(el).writeAttribute('offset', cumulativeHeight);
			cumulativeHeight += $(el).measure('height') + $(el).measure('padding-top') + $(el).measure('padding-bottom') + $(el).measure('border-top') + $(el).measure('border-bottom') + $(el).measure('margin-top') + $(el).measure('margin-bottom');
		});
	}
	else{
		config.direction = 'horizontal';
		var cumulativeWidth = 0;
		$$('#'+divID+' > li').each(function(el){
			//console.log(el);
			$(el).writeAttribute('offset', cumulativeWidth);
			cumulativeWidth += $(el).measure('width') + $(el).measure('padding-left') + $(el).measure('padding-right') + $(el).measure('border-left') + $(el).measure('border-right') + $(el).measure('margin-left') + $(el).measure('margin-right');
		});
	}
	var width = '';
	var height = '';
	//Si viewport est défini
	if(typeof(config.viewport) != 'undefined'){
		//Si on veut forcer la largeur du viewport
		if(typeof(config.viewport.width) != 'undefined'){
			width = 'width:'+config.viewport.width+'px;';
		}
		//Si on veut forcer la hauteur du viewport
		if(typeof(config.viewport.height) != 'undefined'){
			height = 'height:'+config.viewport.height+'px;';
		}
	}
	//Le nombre d'item à faire défiler (par défaut : 1)
	if(typeof(config.range) != 'undefined'){
		$(divID).writeAttribute('range', config.range);
	}
	else{
		config.range = 1;
		$(divID).writeAttribute('range', 1);
	}
	//On choisi le mode de diffusion du diaporama si il na pas été défini (par défaut : fondu)
	if(typeof(config.mode) == 'undefined'){
		config.mode = 'fade';
	}
	//On applique des propriétés CSS
	/***par défaut, le flottement est à gauche***/
	var floatSide = 'left';
	if(typeof($(divID).getStyle('float')) != 'undefined'){
		floatSide = $(divID).getStyle('float');
	}
	switch(config.mode){
		case 'fade':
			$$('#'+divID+' > li').each(function(el){
				el.setStyle({'display':'none'});
			});
			$$('#'+divID+' > li:eq(0)')[0].setStyle({'display':'block'});
			var pTop = parseInt($(divID).getStyle('padding-top'));
			var pLeft = parseInt($(divID).getStyle('padding-left'));
			var pRight = parseInt($(divID).getStyle('padding-top'));
			var pBottom = parseInt($(divID).getStyle('padding-left'));
			$(divID).setStyle({'width':(config.viewport.width-pLeft-pRight)+'px', 'height':(config.viewport.height-pTop-pBottom)+'px'});
			$(divID).setStyle({'height':$$('#'+divID+' > li:eq(0)')[0].getHeight()+'px'});
			$$('#'+divID+' > li').each(function(el){
				el.setStyle({'position':'absolute', 'left':pLeft+'px', 'top':pTop+'px'});
			});
			break;
		case 'slide':
			if(typeof(config.direction) != 'undefined' && config.direction == 'vertical'){
				$(divID).setStyle({'float':'left', 'position':'relative', 'left':'0', 'height':cumulativeHeight+'px'});
				$$('#'+divID+' > li').each(function(el){
					el.setStyle({'float':'left'});
				});
			}
			else{
				$(divID).setStyle({'float':'left', 'position':'relative', 'left':'0', 'width':cumulativeWidth+'px'});
				$$('#'+divID+' > li').each(function(el){
					el.setStyle({'float':'left'});
				});
			}
			break;
	}
	//Si on a au moins 2 éléments dans le carousel
	if($$('#'+divID+' > li').length > 1){
		//Si on veut une pagination complete
		if(typeof(config.pagination) != 'undefined' && config.pagination){$(divID).insert({after:makeCarouselPagination('full', config.mode, divID, config.lang, config.duration, config.direction)});}
		else{$(divID).insert({after:makeCarouselPagination('simple', config.mode, divID, config.lang, config.duration, config.direction)});}
		//On entoure la liste d'un div faisant la fenêtre
		$(divID).wrap('div', {'class':'carouselWindow', 'style':'float:'+floatSide+';position:relative;overflow:hidden;'+width+height});
		//on indique la longueur, et l'item en cours du carousel et le statut
		$(divID).writeAttribute('length', $$('#'+divID+' > li').length)
		$(divID).writeAttribute('current', 0)
		$(divID).writeAttribute('status', 'ok');
		//Si on a choisi un défilement automatique (par défaut : manuel)
		$(divID).writeAttribute('mode', 'manual');
		if(typeof(config.autoDefil) != 'undefined'){
			$(divID).writeAttribute('mode', 'auto');
			var timer = config.autoDefil*1000;
			setTimeout(function(){
				carouselRecursiveNext(config.mode, divID, config.duration, timer, config.direction);
			}, timer);
		}
	}
}
function makeCarouselPagination(pagintationType, mode, divID, lang, duration, direction){
	var pagination = '<ul id="'+divID+'Pagination" class="pagination">';
	pagination += '<li class="prev" onclick="carouselPrev(\''+mode+'\', \''+divID+'\', \''+duration+'\', \''+direction+'\');">'+lang.prev+'</li>';
	if(pagintationType == 'full'){
		var ctp = 0;
		$$('#'+divID+' > li').each(function(){
			var className = '';
			if(ctp == 0){className = ' class="current"';}
			pagination += '<li'+className+' onclick="carouselAccess(\''+mode+'\', \''+divID+'\', '+duration+', '+ctp+', \''+direction+'\');">'+(ctp+1)+'</li>';
			ctp++;
		});
	}
	pagination += '<li class="next" onclick="carouselNext(\''+mode+'\', \''+divID+'\', \''+duration+'\', false, \''+direction+'\');">'+lang.next+'</li>';
	pagination += '</ul>';
	return pagination;
}
function carouselRecursiveNext(mode, divID, duration, timer, direction){
	if($(divID).readAttribute('mode') == 'auto'){
		carouselNext(mode, divID, duration, true, direction);
		setTimeout(function(){
			carouselRecursiveNext(mode, divID, duration, timer, direction);
		}, timer);
	}
}
function carouselAccess(mode, divID, duration, id, direction){
	$(divID).writeAttribute('mode', 'manual');
	if($(divID).readAttribute('status') != 'running'){
		$(divID).writeAttribute('status', 'running');
		var previous = $(divID).readAttribute('current');
		$(divID).writeAttribute('current' , id);
		carouselReachItem(previous, id, divID, mode, duration, direction);
	}
}
function carouselPrev(mode, divID, duration, direction){
	$(divID).writeAttribute('mode', 'manual');
	if($(divID).readAttribute('status') != 'running'){
		$(divID).writeAttribute('status', 'running');
		var current = parseInt($(divID).readAttribute('current'));
		var length = parseInt($(divID).readAttribute('length'));
		var range = parseInt($(divID).readAttribute('range'));
		var previous = current;
		current -= range;
		if(current < 0 && previous == 0){
			current = $$('#'+divID+' > li').length - range;
		}
		else if(current < 0 && previous > 0){
			current = 0;
		}
		$(divID).writeAttribute('current' , current);
		var next = current;
		carouselReachItem(previous, next, divID, mode, duration, direction);
	}
}
function carouselNext(mode, divID, duration, defilAuto, direction){
	if(!defilAuto){
		$(divID).writeAttribute('mode', 'manual');
	}
	if($(divID).readAttribute('status') != 'running'){
		$(divID).writeAttribute('status', 'running');
		var current = parseInt($(divID).readAttribute('current'));
		var length = parseInt($(divID).readAttribute('length'));
		var range = parseInt($(divID).readAttribute('range'));
		var previous = current;
		current += range;
		if(current > ($$('#'+divID+' > li').length - range) && current < $$('#'+divID+' > li').length){
			current = $$('#'+divID+' > li').length - range;
		}
		if(current >= $$('#'+divID+' > li').length){
			current = 0;
		}
		$(divID).writeAttribute('current' , current);
		var next = current;
		carouselReachItem(previous, next, divID, mode, duration, direction);
		if(current > ($$('#'+divID+' > li').length - range)){
			$(divID).writeAttribute('current' , ($$('#'+divID+' > li').length));
		}
	}
}
function carouselReachItem(previous, next, divID, mode, duration, direction){
	if($$('#'+divID+'Pagination li:not(.prev, .next):eq('+next+')').length){
		$$('#'+divID+'Pagination li:not(.prev, .next)').each(function(el){
			el.removeClassName('current');
		});
		$$('#'+divID+'Pagination li:not(.prev, .next):eq('+next+')').each(function(el){
			el.addClassName('current');
		});
	}
	switch(mode){
		case 'fade':
			duration = Math.floor(duration*1000/2)/1000;
			$$('#'+divID+' > li:eq('+previous+')')[0].setOpacity(1);
			$$('#'+divID+' > li:eq('+previous+')')[0].setStyle({'display':'block'});
			new Effect.Opacity($$('#'+divID+' > li:eq('+previous+')')[0], {
				from:1, to:0,
				duration: duration,
				afterFinish: function(){
					$$('#'+divID+' > li:eq('+previous+')')[0].setStyle({'display':'none'});
					$$('#'+divID+' > li:eq('+next+')')[0].setOpacity(0);
					$$('#'+divID+' > li:eq('+next+')')[0].setStyle({'display':'block'});
					$(divID).setStyle({'height':$$('#'+divID+' > li:eq('+next+')')[0].getWidth()+'px'});
					new Effect.Opacity($$('#'+divID+' > li:eq('+next+')')[0], {
						from:0, to:1,
						duration: duration,
						afterFinish: function(){
							$(divID).writeAttribute('status', 'ok');
						}
					});
				}
			});
			break;
		case 'slide':
			var offset = 0;
			$$('#'+divID+' > li:eq('+next+')').each(function(el){
				offset += el.readAttribute('offset');
			});
			if(direction == 'vertical'){
				new Effect.Morph(divID, {
					style: 'top:-'+offset+'px',
					duration: duration,
					afterFinish: function(){
						$(divID).writeAttribute('status', 'ok');
					}
				});
			}
			else{
				new Effect.Morph(divID, {
					style: 'left:-'+offset+'px',
					duration: duration,
					afterFinish: function(){
						$(divID).writeAttribute('status', 'ok');
					}
				});
			}
			break;
	}
}
