window.addEvent('domready', function() {
	$$('.mod_newslist').each(function(newsList) {
		// Détermine les paramètres de défilement suivant la classe CSS
		var classes = newsList.getProperty('class').split(/\s/);
		var slides = 1;
		var fixedSize = true;
		var direction = 'bt'; // lr rl bt tb
		var mode = 'normal'; // normal fade direct
		var delay = 3000;
		var isSliding = false;
		var addList = false;
		var numericList = false;
		var thumbnailList = false;
		for (var c = classes.length - 1; c >= 0; c--) {
			if (classes[c].substr(0, 'sliding'.length) == 'sliding') {
				isSliding = true;
				var options = classes[c].split('-');
				for (var o = 1; o < options.length; o++) {
					switch (options[o]) {
					case 'lr':
					case 'rl':
					case 'bt':
					case 'tb':
						direction = options[o]; break;
					case 'normal':
					case 'fade':
					case 'direct':
						mode = options[o]; break;
					case 'nosize': fixedSize = false; break;
					case 'list': addList = true; break;
					case 'numeric': numericList = true; break;
					case 'thumbnail': thumbnailList = true; break;
					default:
						if (/^\d{1,6}ms$/.test(options[o])) {
							delay = options[o].substring(-2).toInt();
						} else if (/^\d{1,3}s$/.test(options[o])) {
							delay = 1000 * options[o].substring(-1).toInt();
						} else {
							var num = options[o].toInt();
							if (num) {
								if (num < 100) slides = num;
								else delay = num;
							}
						}
						break;
					}
				}
			}
		}
		addList = addList && slides == 1;

		var newsListBlocks = newsList.getElement('.block');
		// Si la liste est défilante...
		if (isSliding && newsListBlocks) {
			newsList.addClass('is-sliding');
			var container = newsListBlocks.getParent();
			var news = container.getChildren('.block');
			var orderedNews = [];
			var frameSize = [];
			var currentFrame = 0;
			var isContainerHover = false;
			var switchTimeout = null;

			// Permet de savoir si le curseur est au-dessus des news
			container.addEvent('mouseover', function() { isContainerHover = true; });
			container.addEvent('mouseout', function() { isContainerHover = false; });

			// S'il y a plus de news à afficher que la limite...
			if (news.length > slides) {
				var totalMaxSize = 0;
				var _slideSize = [];

				// Fonction de passage à la news suivante
				var switchToNextNews = function() {
					news = container.getChildren('.block');

					// Récupération de la news à afficher et de la news à supprimer
					var newsToRemove = news[(direction == 'bt' || direction == 'rl')? 0: news.length - 1];
					var newsToInsert = news[(direction == 'bt' || direction == 'rl')? slides: news.length - slides - 1];

					var fxNewsToRemove = new Fx.Tween(newsToRemove);
					var fxNewsToInsert = new Fx.Tween(newsToInsert);
					fxNewsToRemove.addEvent('complete', function(newsToHide) {
						// Réinjection de la news qui disparait au bon endroit dans la liste
						var newsPrevious = null;
						for (var nPrevious = 0; nPrevious < orderedNews.length; nPrevious++) {
							if (orderedNews[nPrevious] == newsToHide) break;
							newsPrevious = orderedNews[nPrevious];
						}
						
						if (newsPrevious == null) { container.grab(newsToHide, (direction == 'bt' || direction == 'rl')? 'bottom': 'top'); }
						else { newsToHide.inject(newsPrevious, (direction == 'bt' || direction == 'rl')? 'after': 'before'); }
						
						// Ajout/suppression des classes CSS
						if (addList) {
							newsToHide.listItem.removeClass('active');
							news[(direction == 'bt' || direction == 'rl')? slides: news.length - slides - 1].listItem.addClass('active');
						}
					});
					if (addList) { newsToRemove.listItem.removeClass('active'); }

					// Animations selon le mode et la direction
					switch (mode) {
					case 'fade':
						newsToInsert.fade('hide');
						newsToInsert.setStyle('display', '');
						fxNewsToInsert.options.duration = 750;
						fxNewsToRemove.options.duration = 250;
						fxNewsToRemove.start('opacity', 1, 0);
						fxNewsToInsert.start('opacity', 0, 1);
						break;
					case 'direct':
						newsToInsert.fade('hide');
						newsToInsert.setStyle('display', '');
						fxNewsToInsert.options.duration = 0;
						fxNewsToRemove.options.duration = 0;
						fxNewsToRemove.start('opacity', 1, 0);
						fxNewsToInsert.start('opacity', 0, 1);
						break;
					case 'normal':
					default:
						newsToInsert.setStyle('display', '');
						fxNewsToRemove.addEvent('complete', function(newsToHide) {
							newsToHide.setStyles({'display': 'none'});
						});
						switch (direction) {
						case 'rl':
							fxNewsToRemove.start('marginLeft', 0, -newsToRemove._totalSize);
							newsToInsert.setStyle('marginLeft', totalMaxSize - frameSize[currentFrame]);
							newsToInsert.tween('marginLeft', 0);
							break;
						case 'lr':
							fxNewsToRemove.start('marginLeft', 0, totalMaxSize - frameSize[currentFrame]);
							newsToInsert.setStyle('marginLeft', -newsToInsert._totalSize);
							newsToInsert.tween('marginLeft', 0);
							break;
						case 'bt':
							fxNewsToRemove.start('marginTop', 0, -newsToRemove._totalSize);
							newsToInsert.setStyle('marginTop', totalMaxSize - frameSize[currentFrame]);
							newsToInsert.tween('marginTop', 0);
							break;
						case 'tb':
							fxNewsToRemove.start('marginTop', 0, totalMaxSize - frameSize[currentFrame]);
							newsToInsert.setStyle('marginTop', -newsToInsert._totalSize);
							newsToInsert.tween('marginTop', 0);
							break;
						}
						break;
					}
					
					currentFrame = (currentFrame + 1) % frameSize.length;
				};
				
				var startTimeout = function() {
					switchTimeout = window.setTimeout(function() {
						if (isContainerHover) {
							// Relance la fonction après 1 sec si le curseur est au-dessus des news
							switchTimeout = window.setTimeout(arguments.callee, 1000);
						} else {
							switchToNextNews();
							
							// Relance de la fonction après X millisecondes
							switchTimeout = window.setTimeout(arguments.callee, delay);
						}
					}, delay);
				};

				// Préparation de la liste des accès rapides
				if (addList) {
					var list = new Element('ul', {'class': 'newsquicklist'});
					list.inject(container, 'before');
				}

				for (var n = 0; n < news.length; n++) {
					orderedNews.push(news[n]);
					
					// Préparation des éléments de la liste des accès rapides
					if (addList) {
						news[n].position = n;
						var listElement = new Element('li', {'class': 'news' + n});
						
						var listElementHandle = new Element('a', { title: news[n].getElement((numericList? '': '.teaser,p,') + 'h1,h2,h3,h4,h5,h6').get('text') });
						if (numericList) { listElementHandle.set('html', (n + 1)); } 
						else
						{
							if (thumbnailList && news[n].getElement('img')){ listElementHandle.set('html', news[n].getElement('.thumbnail').get('html') || (n + 1)); }
							else { listElementHandle.set('html', news[n].getElement('h1,h2,h3,h4,h5,h6').get('text') || (n + 1)); }
						}
						listElementHandle.addEvent('click', (function(newsToInsert) {
							return function() {
								news = container.getChildren('.block');
								if (news[((direction == 'bt' || direction == 'rl')? 0: news.length - 1)].position != newsToInsert.position) {
									if (direction == 'bt' || direction == 'rl') { newsToInsert.inject(news[0], 'after'); }
									else { newsToInsert.inject(news[news.length - 1], 'before'); }
									window.clearTimeout(switchTimeout);
									switchToNextNews();
									startTimeout();
								}
							};
						})(news[n]));
						
						listElementHandle.inject(listElement);
						news[n].listItem = listElement;
						
						if (n < slides) { listElement.addClass('active'); }
						
						listElement.inject(list);
					}

					// Calcul de la taille de chaque news (largeur ou hauteur selon le mode)
					var newsSize = 0;
					if (direction == 'rl' || direction == 'lr') {
						newsSize += news[n].getSize().x;
						newsSize += news[n].getStyle('marginLeft').toInt();
						newsSize += news[n].getStyle('marginRight').toInt();
					} else {
						newsSize += news[n].getSize().y;
						newsSize += news[n].getStyle('marginTop').toInt();
						newsSize += news[n].getStyle('marginBottom').toInt();
					}
					news[n]._totalSize = newsSize;
					_slideSize.push(newsSize);
					
					if (direction == 'tb' || direction == 'lr') { container.grab(news[n], 'top'); }
				}
				
				// Calcul de la taille maximum selon le nombre de news à afficher simultanément
				for (var f = 0; f < _slideSize.length; f++) {
					var _currentFrameSize = 0;
					for (var s = slides - 1; s >= 0; s--) { _currentFrameSize += _slideSize[(f + s) % news.length]; }
					if (totalMaxSize < _currentFrameSize) { totalMaxSize = _currentFrameSize; }
					frameSize.push(_currentFrameSize);
				}

				// Préparation du container, avec taille maximum si indiquée
				container.setStyle('overflow', 'hidden');
				if (fixedSize) { container.setStyle((direction == 'rl' || direction == 'lr'? 'width': 'height'), totalMaxSize); }
				
				// Masquage des autres actualités
				for (var n = slides; n < news.length; n++) { news[n].setStyle('display', 'none'); }
				
				// Inclusion d'un autre élément pour gérer les cas gauche/droite
				if (direction == 'rl' || direction == 'lr') {
					news = container.getChildren('.block');

					var containerInside = new Element('div', {'class': 'insideNewsList'});
					containerInside.setStyle('width', 2 * totalMaxSize);
					for (var n = 0; n < news.length; n++) {
						news[n].setStyle('float', 'left');
						news[n].inject(containerInside);
					}
					containerInside.inject(container);
					container = containerInside;
				}
				
				// Lancement du défilement
				startTimeout();
			}
		}
	});
});
