
function Timer(delay, func){
	var started = false;
	var intervalId;
	this.start = function(){
		if(started) return;
		intervalId = window.setInterval(func, delay);
		started = true;
	}
	this.stop = function(){
		if(!started) return;
		window.clearInterval(intervalId);
		started = false;
	}
}

function NewsTicker(newsItems){
	var items = [];
	var items_links = [];
	var item_index = -1;
	var ticker_length = 0;
	$("a", newsItems).each(function(){items.push($(this).text()); items_links.push(this.href);});
	var tickerDiv = document.createElement("a");
	tickerDiv.style.display = "inline";
	$(newsItems).replaceWith(tickerDiv);
	var stopNextItemDelay = function(){};
	function nextItem(){
		timer.stop();
		var timeout = (item_index == -1 ? 0 : 3000);
		$(tickerDiv).fadeOut(timeout);
		var delay = new Timer(timeout, function(){
			item_index = ++item_index % items.length;
			ticker_length = 0;
			$(tickerDiv).empty();
			$(tickerDiv).fadeIn(0);
			tickerDiv.href = items_links[item_index];
			timer.start();
			delay.stop();
		});
		delay.start();
		stopNextItemDelay = delay.stop;
	}
	var timer = new Timer(30, function(){
		var item_length = items[item_index].length;
		if(++ticker_length > item_length){
			nextItem();
			return;
		}
		$(tickerDiv).text(items[item_index].substring(0, ticker_length) + (item_length - ticker_length ? "_" : ""));
	});
	nextItem();
	$(tickerDiv).hover(
		function(){
			$(tickerDiv).text(items[item_index]);
			$(tickerDiv).stop().fadeTo(0,1.0);
			timer.stop();
			stopNextItemDelay();
		},
		function(){
			nextItem();
		}
	);
}

