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 direction = 'lr'; // lr rl bt tb
		var delay = 3000;
		var isSliding = false;
		var addList = false;
		var numericList = 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': direction = 'lr'; break;
					case 'rl': direction = 'rl'; break;
					case 'bt': direction = 'bt'; break;
					case 'tb': direction = 'tb'; break;
					case 'list': addList = true; break;
					case 'numeric': numericList = 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) {
			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);
					fxNewsToRemove.addEvent('complete', function(newsToHide) {
						newsToHide.setStyle('display', 'none');
						// 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) {
							container.getFirst().listItem.addClass('active');
						}
					});
					if (addList) {
						newsToRemove.listItem.removeClass('active');
					}

					// Animations selon la direction
					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;
					}
					newsToInsert.setStyle('display', '');
					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 {
							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
				container.setStyle('overflow', 'hidden');
				container.setStyle((direction == 'rl' || direction == 'lr'? 'width': 'height'), totalMaxSize);
				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();
			}
		}
	});
});
