function Fader(faderId, contentClassName)
{
 var AUTO_PLAY_DURATION = 8;
 
 var self = this;
 var contents = new Array();
 var currentContentIndex = 0;
 var autoPlay = true;

 var intervalId;
 var currentContent = new Content();
 var pager;
 
 this.init = function(){
    var contentEls = $("#" + faderId + " DIV." + contentClassName);
    for (var i = 0; i<contentEls.length; i++)
    {
        self.AddContent(contentEls[i]);
    }
    this.StartAutoPlay(AUTO_PLAY_DURATION);
 }
 
 this.AddContent = function(contentEl)
 {
    var content = new Content();
    content.setId(contentEl);
    contents.push(content);
 }
 
 this.SwitchContents = function()
 {
	currentContent = contents[currentContentIndex];
	currentContent.Hide();
    currentContentIndex++;
	currentContentIndex = currentContentIndex%contents.length;
	currentContent = contents[currentContentIndex];
	currentContent.Show();
	pager.SetSelected(currentContentIndex);
 }
 
 this.StartAutoPlay = function(autoPlayDuration)
 {
  intervalId = setInterval(this.SwitchContents,autoPlayDuration*1000);
 }
 
 this.StopAutoPlay = function()
 {
  clearInterval(intervalId);
 }
 
 this.AddPager = function(_pager)
 {
    pager = _pager;
 }
 
 this.ButtonSelected = function(buttonIndex)
 {
    if(intervalId!=null)
    {
        self.StopAutoPlay();
    }
    autoPlay = false;

    self.SwitchContentsByIndex(buttonIndex);
    self.StartAutoPlay(AUTO_PLAY_DURATION);
 }
 
 this.SwitchContentsByIndex = function(contentIndex)
 {
	currentContent = contents[currentContentIndex];
	currentContent.Hide();
    currentContentIndex = contentIndex;
	currentContentIndex = currentContentIndex%contents.length;
	currentContent = contents[currentContentIndex];
	currentContent.Show();
 }
}

//////////////////////////////////


function Content()
{
 var contentEl, showAnim, hideAnim;
 
 this.setId = function(_contentEl)
 {  
    contentEl = _contentEl;  
 }
 
 this.Show = function()
 {
      $(contentEl).css("z-index", 1);
      $(contentEl).fadeIn("slow");
 }
 
 this.Hide = function()
 {
    $(contentEl).css("z-index", 0);
    $(contentEl).fadeOut("slow");
 }
}

////////////////////////////// 

function Pager(cfg)
{
 var self = this;
 var buttons = new Array();
 var currentlySelectedButtonIndex = 0;
 var faderObj = cfg.faderObj;
 var nextButton = {"disabled": false};
 var prevButton = {"disabled": true};

 this.init = function()
 {
    var links = $("#" + cfg.elementId +" A." + cfg.pagerLinksClassName);
    for (var i = 0; i<links.length; i++){
        var isFirst = (i === 0) ? true : false;
        var isLast = (i === links.length -1) ? true : false;
        self.AddButton(links[i], i, isFirst, isLast); 
    }
    
    nextButton.el = $("#" + cfg.elementId +" A.btn_next");
    prevButton.el = $("#" + cfg.elementId +" A.btn_prev");
    disablePrev();
    
    if (cfg.pagerLinksWidth){
        centerlizePager(cfg.elementId, cfg.pagerLinksWidth, links.length);
    }
    $(cfg.elementId).css("visibility", "visible");
 }
 
 this.Next = function()
 {
    if (!nextButton.disabled)
    {
        var selectedButtonIndex = (currentlySelectedButtonIndex+1)%buttons.length;    
	    self.ButtonSelected([selectedButtonIndex]);
	}
 }
 
 this.Previous = function()
 {
    if (!prevButton.disabled)
    {
      var selectedButtonIndex = currentlySelectedButtonIndex-1;
	    if(selectedButtonIndex < 0)
	    {
	     selectedButtonIndex = buttons.length - 1;
	    }
	    self.ButtonSelected([selectedButtonIndex]);
	}
 }
 
 var disableNext = function()
 {
    nextButton.disabled = true;
    nextButton.el.addClass("btn_next_disabled");
 }
 var enableNext = function()
 {
    nextButton.disabled = false;
    nextButton.el.removeClass("btn_next_disabled");
 }
 
 var disablePrev = function()
 {
    prevButton.disabled = true;
    prevButton.el.addClass("btn_prev_disabled");
 }
 var enablePrev = function()
 {
    prevButton.disabled = false;
    prevButton.el.removeClass("btn_prev_disabled");
 }

 this.AddButton = function(buttonEl, buttonIndex, isFirst, isLast)
 {
    var btn = new Button();
    btn.SetId(buttonEl,buttonIndex, self, isFirst, isLast);
    buttons.push(btn);
 }
 
 this.ButtonSelected = function(buttonIndex)
 {
    enableNext();
    enablePrev();
    self.SetSelected(buttonIndex);
    faderObj.ButtonSelected(buttonIndex);    
 }
 
 this.SetSelected = function(buttonIndex)
 {
    if (currentlySelectedButtonIndex != buttonIndex) {
        buttons[currentlySelectedButtonIndex].DeselectPage();
        buttons[buttonIndex].SelectPage();
        currentlySelectedButtonIndex = buttonIndex;
    }
 }
 
 this.isFirstClicked = function(){
    disablePrev();
 }
 
 this.isLastClicked = function(){
    disableNext();
 }
 
 var centerlizePager = function(pagerId, pagerLinksWidth, pagerLinksCount)
 {
    var pager = document.getElementById(pagerId);
    var width = pagerLinksWidth * (pagerLinksCount + 2);
    pager.style.width = width+"px";
 }
 
 this.destroy = function()
 {
    for (var i = 0; i < buttons.length; i++)
    {
        buttons[i].detachEvent();
    }
 }
}



///////////////////////////////

function Button()
{
 var self = this;
 var buttonEl;
 var buttonIndex;
 var isFirst = false; 
 var isLast = false;
 var parent;

 this.SetId = function(_buttonEl,_buttonIndex, _parent, _isFirst, _isLast)
 {
    buttonEl = _buttonEl;
    buttonIndex = _buttonIndex;
    parent = _parent;
    isFirst = _isFirst;
    isLast = _isLast;    
    
    $(buttonEl).bind("click", function(){
        parent.ButtonSelected(buttonIndex);
        if (isFirst)
        {
            parent.isFirstClicked();
        }
        else if (isLast)
        {
            parent.isLastClicked();
        }
    });
 }
  
 this.SelectPage = function()
 {
    $(buttonEl).addClass("selected");
    if (isFirst)
    {
        parent.isFirstClicked();
    }
    else if (isLast)
    {
        parent.isLastClicked();
    }
 }
 
 this.DeselectPage = function()
 {
    $(buttonEl).removeClass("selected");
 }
 
 this.detachEvent = function()
 {
    $(buttonEl).unbind("click");
 } 
}



