Fader = function (container, itemClassName) {
	var timerInterval = 50;
	var itemTop = 40;
	var framesBeforeFade = 50;
	var framesDuringFade = 10;
	var frameStep = 100 / framesDuringFade;
	var frameTotal = framesBeforeFade + framesDuringFade;
	
	var updateTimer = null;
	
	var items = new Array ();
	var frameIndex = 0;
	
	var currentPanel = null;
	var previousPanel = null;
	
	var mouseoverState = false;
	
	container.onmouseover = function () { mouseoverState = true; };
	container.onmouseout = function () { mouseoverState = false; };
	
	function addItem (title, date, url) {
		var div = document.createElement ('div');
		div.style.position = 'absolute';
		div.style.top = itemTop + 'px';
		div.style.left = '0px';
		if (itemClassName) {
			div.className = itemClassName;
		}
		
		if (!currentPanel) {
			div.style.display = 'block';
			div.style.zIndex = 1;
			div.faderFrame = 0;
			currentPanel = div;
		} else {
			div.style.display = 'none';
			div.style.zIndex = 0;
			div.faderFrame = 0;
		}
		
		var html = '<strong>' + title + '</strong>' + (date ? '<br /><em>' + date + '</em>' : '') + '<br /><a href="' + url + '">More Info &raquo;</a>';
		
		if (div.insertAdjacentHTML) {
			div.insertAdjacentHTML ('beforeEnd', html);
		} else {
			div.innerHTML = html;
		}
		
		items.push (div);
		container.appendChild (div);
	}
	
	function removeItem (index) {
		container.removeChild (items.splice (index, 1) [0]);
	}
	
	function update () {
		if (frameIndex >= framesBeforeFade || !mouseoverState) {
			frameIndex++;
		}
		
		if (frameIndex == framesBeforeFade) {
			startTransition ();
		} else if (frameIndex == frameTotal) {
			endTransition ();
			frameIndex = 0;
		} else if (frameIndex > framesBeforeFade && items.length > 1) {
			var fadeFrame = frameIndex - framesBeforeFade;
			var fadeInOpc = frameStep * fadeFrame;
			var fadeOutOpc = (100 - fadeInOpc);
			
			currentPanel.style.opacity =
			currentPanel.style.MozOpacity = fadeInOpc / 100;
			currentPanel.style.filter = 'alpha(opacity=' + Math.floor (fadeInOpc) + ')';
			previousPanel.style.opacity =
			previousPanel.style.MozOpacity = fadeOutOpc / 100;
			previousPanel.style.filter = 'alpha(opacity=' + Math.floor (fadeOutOpc) + ')';
		}
	}
	
	function startTransition () {
		if (items.length > 1) {
			previousPanel = items [0];
			currentPanel = items [1];
			currentPanel.style.opacity =
			currentPanel.style.MozOpacity = 0;
			currentPanel.style.filter = 'alpha(opacity=0)';
			currentPanel.style.zIndex = 1;
			currentPanel.style.display = 'block';
			previousPanel.style.zIndex = 0;
			items.push (items.shift ());
		}
	}
	
	function endTransition () {
		if (items.length > 1) {
			previousPanel.style.display = 'none';
			currentPanel.style.opacity =
			currentPanel.style.MozOpacity = 1;
			currentPanel.style.filter = 'alpha(opacity=100)';
		}
	}
	
	function startTimer () {
		if (updateTimer === null) {
			updateTimer = window.setInterval (update, timerInterval);
		}
	}
	
	function stopTimer () {
		if (updateTimer !== null) {
			window.clearInterval (updateTimer);
			updateTimer = null;
		}
	}
	
	function timerIsRunning () {
		return updateTimer !== null;
	}
	
	
	this.addItem = addItem;
	this.removeItem = removeItem;
	this.update = update;
	this.startTransition = startTransition;
	this.endTransition = endTransition;
	this.startTimer = startTimer;
	this.stopTimer = stopTimer;
	this.isRunning = timerIsRunning;
};
