var newsTickerTruncateHtml = function(s, l) {
	var tags = [], tag, popped;
	var result = '';
	while (l > 0 && s) {
		if (s.substring(0, 1) == '<') {
			s = s.substring(1);
			tag = '';
			while (s && s.substring(0, 1) != '>') {
				tag += s.substring(0, 1);
				s = s.substring(1);
			}
			if (s) s = s.substring(1);
			if (tag) {
				if (tag[0] == '/') {
					while (popped = tags.pop()) {
						result += ('</' + popped + '>');
						if (tag == '/' + popped) break;
					}
				} else if (tag[tag.length - 1] == '/') {
					result += '<' + tag + '>';
				} else {
					result += '<' + tag + '>';
					tags.push(tag.split(' ')[0]);
				}
			}
		} else if (s.substring(0, 1) == '&') {
			while (s && s.substring(0, 1) != ';') {
				result += s.substring(0, 1);
				s = s.substring(1);
			}
			result += ';';
			--l;
			s = s.substring(1);
		} else {
			result += s.substring(0, 1);
			--l;
			s = s.substring(1);
		}
	}
	while (tag = tags.pop()) {
		result += '</' + tag + '>';
	}
	return result;
}
var createNewsTicker = function(element) {
	// Indicate that we're going to animate the news-ticker.
	element.addClass('animated');
	var tickerItemContainer = element.getElement('.news-ticker-items');
	if (tickerItemContainer) {
		// Get the items for the ticker.
		var tickerItems = tickerItemContainer.getElements('li');
		if (tickerItems.length < 1) return;
		// Create a new element to display the ticker items in.
		var tickerBox = new Element('p', {
			'class' : 'ticker-box'
		}).replaces(tickerItemContainer);
		tickerBox.addEvent('mouseenter', function() {
			if (Browser.Engine.trident) {
				tickerBox.set('text', tickerItems[tickerItemIndex].get('text'));
			} else {
				tickerBox.set('html', tickerItems[tickerItemIndex].get('html'));
			}
		});
		if (Browser.Engine.trident) {
			tickerBox.addEvent('click', function() {
				var link = tickerItems[tickerItemIndex].getElement('a');
				if (link) window.location.href = link.href;
			});
		}
		// Store the item index and current length.
		var appendTickerBoxCharacter = function() {
			var currentLength = tickerBox.get('text').length;
			if (Browser.Engine.trident) {
				tickerBox.set('text', tickerItems[tickerItemIndex].get('text').substring(0, currentLength + 1));
			} else {
				tickerBox.set('html', newsTickerTruncateHtml(tickerItems[tickerItemIndex].get('html'), currentLength + 1));
			}
			if (tickerBox.get('text').length == currentLength) {
				$clear(runningTicker);
				startNextTicker.delay(2000);
			}
		}
		// Timer to animate the ticker.
		var runningTicker;
		var startRunningTicker = function() {
			runningTicker = appendTickerBoxCharacter.periodical(40);
		}
		// Moves to the next ticker and starts running it.
		var startNextTicker = function() {
			tickerBox.set('html', '&nbsp;');
			tickerItemIndex = (tickerItemIndex + 1) % tickerItems.length;
			startRunningTicker();
		}
		var tickerItemIndex = -1;
		startNextTicker();
	}
}
window.addEvent('domready', function() { $$('.news-ticker').each(createNewsTicker); });