if(typeof Lib == 'undefined')  {
    var Lib = {};
}

Lib.SlideShow = function(dom, duration, fadeParameter)   {
    this.dom = $(dom);
    this.duration = duration * 1000;
    
    
    this.timeout = null;
    this.onTimeout = 'Lib.SlideShow.instances[' + Lib.SlideShow.instances.length + '].next()';
    
    Lib.SlideShow.instances.push(this);
    
    this.state = 0;
    
    this.pages = [];
    this.currentPage = 0;
    this.content = null;
    
    
    this.addPage = function(page)   {
        page.style.display = 'none';
        this.pages.push(page);
        
        if(this.pages.length == 1)  {
            this.dom.appendChild(this.pages[0]);
            this.pages[0].style.display = 'block';
        }
        
        if(this.pages.length == 2)  {
            this.timeout = window.setTimeout(this.onTimeout, this.duration);
        }
    }
    
    this.show = function(content)   {
        if(this.content != content) {
            this.content = content;
            this.next();
        }
        
    }
    
    this.next = function()  {
        
        if(this.timeout != null)    {
            window.clearTimeout(this.timeout);
            this.timeout = null;
        }
        
        if(this.content)    {
            this.content.style.display = 'none';
            this.dom.appendChild(this.content);
        }
        else    {
            this.dom.appendChild(this.pages[this.nextPageId()]);
        }
        
        this.fadeIn(this.dom.firstChild.nextSibling);
        this.fadeOut(this.dom.firstChild);
    }
    
    
    this.fadeIn = function(elem)    {
        Effect.Appear(elem, this.fadeParameter.fadein);
    }
    
    this.fadeOut = function(elem)    {
        Effect.Fade(elem, this.fadeParameter.fadeout);
    }
    
    
    this.fadeInComplete = function()    {
        this.state += Lib.SlideShow.FADEIN_COMPLETE;
        this.finishFade();
    }
    this.fadeOutComplete = function()    {
        this.state += Lib.SlideShow.FADEOUT_COMPLETE;
        this.finishFade();
    }
    this.finishFade = function()    {
        if(this.state != 3) {
            return;
        }
        this.state = 0;
        this.dom.firstChild.style.display = 'none';
        this.dom.removeChild(this.dom.firstChild);
        
        if(!this.content)    {
            this.timeout = window.setTimeout(this.onTimeout, this.duration);
        }
    }
    
    
    this.nextPageId = function() {
        if(this.currentPage >= this.pages.length -1)    {
            this.currentPage = 0;
        }
        else    {
            this.currentPage++;
        }
        return this.currentPage;
    }
    
    this.fadeParameter = new Lib.SlideShow.FadeParameter(this, fadeParameter);
}

Lib.SlideShow.FADEIN_COMPLETE = 1;
Lib.SlideShow.FADEOUT_COMPLETE = 2;

Lib.SlideShow.instances = [];

Lib.SlideShow.FadeParameter = function(slideShow, params)   {
    this.fadein = {
        afterFinish : slideShow.fadeInComplete.bind(slideShow)
    };
    this.fadeout = {
        afterFinish : slideShow.fadeOutComplete.bind(slideShow)
    };
    
    if (typeof params == 'object')   {
        for (var prop in params) {
            this.fadein[prop] = params[prop];
            this.fadeout[prop] = params[prop];
        }
    }
    
}