window.addEvent('domready', function() {
	$$('.mod_newslist').each(function(newsList) {
		var classes = newsList.getProperty('class').split(/\s/);
		var slides = 1;
		var fixedSize = true;
		var direction = 'lr'; // lr rl bt tb
		var delay = 3000;
		var isSliding = 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 'nosize': fixedSize = false; 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;
					}
				}
			}
		}
		
		var newsListBlocks = newsList.getElement('.block');
		if (isSliding && newsListBlocks) {
			var container = newsListBlocks.getParent();
			var news = container.getChildren('.block');
			var frameSize = [];
			var currentFrame = 0;
			var isContainerHover = false;
			container.addEvent('mouseover', function() { isContainerHover = true; });
			container.addEvent('mouseout', function() { isContainerHover = false; });
			if (news.length > slides) {
				var totalMaxSize = 0;
				var _slideSize = [];
				for (var n = 0; n < news.length; n++) {
					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);
				}
				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);
				}

				container.setStyle('overflow', 'hidden');
				if (fixedSize) {
					container.setStyle((direction == 'rl' || direction == 'lr'? 'width': 'height'), totalMaxSize);
				}
				for (var n = slides; n < news.length; n++) {
					news[n].setStyle('display', 'none');
				}
				window.setTimeout(function() {
					if (isContainerHover) {
						window.setTimeout(arguments.callee, 1000);
					} else {
						news = container.getChildren('.block');
						var newsToRemove = news[(direction == 'bt' || direction == 'rl')? 0: slides - 1];
						var newsToInsert = news[(direction == 'bt' || direction == 'rl')? slides: news.length - 1];
						if (!(direction == 'bt' || direction == 'rl')) {
							container.grab(newsToInsert, 'top');
						}
						var fxNewsToRemove = new Fx.Tween(newsToRemove);
						fxNewsToRemove.addEvent('complete', function(newsToHide) {
							newsToHide.setStyle('display', 'none');
							if (direction == 'bt' || direction == 'rl') {
								container.grab(newsToHide, 'bottom');
							}
						});
						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;
						window.setTimeout(arguments.callee, delay);
					}
				}, delay);
			}
		}
	});
});
