function fader()
{
	var self          = this;
	var faderElement  = null;
	var faderVar = null;
	var currElIndex   = null;
	var duration      = 5000; //ms
	var autoPlay      = false;
	var timeoutObj    = null;
	var faderItems    = [];
	var indicators    = [];
	var fadeDuration  = 1;//s
	var isLocked      = false;
	var hasIndicators = true;
	var playButton    = null;
	
	this.init = function(faderVar1, containerId, indicatorContainerId, bAutoPlay,_fadeDuration)
	{
	    fadeDuration = _fadeDuration;
		faderElement = this;
		faderVar = faderVar1;
		autoPlay = bAutoPlay;
		
		var faderDOMItems = YAHOO.util.Dom.getElementsByClassName("faderItem","li",containerId);
		var indicatorDOMItems = YAHOO.util.Dom.getElementsByClassName("indicator","li",indicatorContainerId);
		for (i=0; i<faderDOMItems.length; i++)
		{
			faderItems[i] = new faderItem(faderDOMItems[i]);
			indicators[i] = new indicator(indicatorDOMItems[i]);
			indicators[i].init(i);
			faderItems[i].setIndicator(indicators[i]);
			if (faderItems[i].isFirst()){
				currElIndex = i;
				indicators[i].show();
			}
		}		
		initAutoPlay();
	}
	
	function faderItem(element)
	{
		var self       = this;
		this.element   = element;
		this.indicator = null;
		var fadeInAnim = new YAHOO.util.Anim(self.element, { opacity: { to: 1 } }, fadeDuration);
			fadeInAnim.onStart.subscribe(function(){
				YAHOO.util.Dom.setStyle(self.element, "display", "block");
				self.indicator.show();
				isLocked = true;
			});
			fadeInAnim.onComplete.subscribe(function(){
				isLocked = false;
			});
		var fadeOutAnim = new YAHOO.util.Anim(self.element, { opacity: { to: 0 } }, fadeDuration);
			fadeOutAnim.onStart.subscribe(function(){
				self.indicator.hide();
				isLocked = true;
			});
			fadeOutAnim.onComplete.subscribe(function(){
				YAHOO.util.Dom.setStyle(self.element, "display", "none");
				isLocked = false;
			});
		
		this.show = function()
		{
			fadeInAnim.animate();
		}
		
		this.hide = function()
		{
			fadeOutAnim.animate();
		}
		
		this.isFirst = function()
		{
			return YAHOO.util.Dom.hasClass(self.element, "first")
		}
		
		this.setIndicator = function(indicator)
		{
			self.indicator = indicator;
		}
	}
	
	function indicator(element)
	{
		var self     = this;
		this.element = element;
		this.elIndex  = null;
		
		this.show = function()
		{
			YAHOO.util.Dom.addClass(self.element, "indicating");
		}
		
		this.hide = function()
		{
			YAHOO.util.Dom.removeClass(self.element, "indicating");
		}
		
		this.init = function(elIndex)
		{
			
			self.elIndex = elIndex;
			YAHOO.util.Event.addListener(self.element, "click", onClick)
		}
		
		var onClick = function(e)
		{
			faderElement.goTo(self.elIndex);			
		}
	}
	
	var initAutoPlay = function()
	{
		playButton = YAHOO.util.Dom.get("toggleAutoPlay-button");
		YAHOO.util.Event.addListener(playButton, "click", toggleAutoPlay);
				
		if (autoPlay)
		{
			self.startAutoPlay();
		}
	}
	
	this.startAutoPlay = function()
	{		
		timeoutObj = setTimeout(faderVar +".autoPlayNext()", duration);
		autoPlay = true;
		enablePlayButton(true);
	}
	
	this.stopAutoPlay = function()
	{
		clearTimeout(timeoutObj);
		autoPlay = false;
		enablePlayButton(false);
	}
	
	var toggleAutoPlay = function()
	{
		if (autoPlay)
		{
			self.stopAutoPlay();
		}
		else
		{
			self.startAutoPlay();
		}
	}
	
	this.autoPlayNext = function()
	{
		_next();
	}
	
	var enablePlayButton = function(bEnable)
	{
		var enabledClass = "btn-pause";
		var disabledClass = "btn-play";
		
		if (bEnable)
		{
			YAHOO.util.Dom.replaceClass(playButton, disabledClass, enabledClass);
		}
		else
		{
			YAHOO.util.Dom.replaceClass(playButton, enabledClass, disabledClass);
		}		
	}
	
	var _next = function()
	{
		var nextElIndex;
		if (currElIndex==(faderItems.length-1)){
			nextElIndex = 0;
		}
		else{
			nextElIndex = currElIndex+1;
		}
		_goTo(nextElIndex);
	}
	
	this.next = function()
	{
		_next();
		self.stopAutoPlay();		
	}
	
	this.previous = function()
	{
		var previousElIndex;
		if (currElIndex==0){
			previousElIndex = faderItems.length-1;
		}
		else{
			previousElIndex = currElIndex-1;
		}
		_goTo(previousElIndex);
		self.stopAutoPlay();
	}
	
	this.goTo = function(nextElIndex)
	{
		_goTo(nextElIndex);
		self.stopAutoPlay();
	}
	
	var _goTo = function(nextElIndex)
	{	
		if (isLocked || currElIndex==nextElIndex) return;
		
		var currEl = faderItems[currElIndex]
		var nextEl = faderItems[nextElIndex];
		currEl.hide();
		nextEl.show();
		
		if (autoPlay)
		{
			timeoutObj = setTimeout(faderVar +".autoPlayNext()", duration);
		}
		
		currElIndex = nextElIndex;
	}
}
