

new SD();


function SD(){
	
	// labels
	var ID_SD		= "sd";
	var lbl_Deck	= "sd_deck";
	var lbl_Nav 	= "sd_nav";
	var lbl_Content	= "sd_content";
	
	var className_Deck_Std = "sd_deck";
	var className_Deck_Act = "sd_deck_active";
	
	
	// parameters
	var deckChangeTime      = 10000;
    var moveTime			= 300;
	var _margin				= 4;
	var _maxNSlides 		= 5;
    
	
    // control variables (do not change these variables!!)
    var self            = this;
    var nextDeck		= 2;
    var slideState;
    var _navWidth;
    var _contentWidth;
    var controlTimeout 	= null;
    
    
    function init(){ 
    	
    	var nSlides = self.nSlides();  
    	
    	slideState = new Array(nSlides+1);
    	
    	for(var i = 1; i <= nSlides; i++){ 
    		
    		o_Deck = $(lbl_Deck + i); 
    		o_Nav = $(lbl_Nav + i);
    		o_Content = $(lbl_Content + i);
    		
    		if(i == 1){
    			_navWidth = o_Nav.getWidth();
    			_navWidth += _margin;
    			_contentWidth = o_Content.getWidth();  
    			
    			if(_maxNSlides != -1 && nSlides < _maxNSlides){
    				_contentWidth += (_maxNSlides - nSlides)*_navWidth;
    			}
    			
    		}
    		    	
    		slideState[i] = (i==1) ? true : false;
    		
    		    		
    		var left = (i>1) ? ((_navWidth+_contentWidth) + _navWidth*(i-2)): 0;
    		

    		
    		o_Deck.setStyle({
    			position: 'absolute',
    			left: left+'px',
    			top: '0px',
    			width: _navWidth+'px',
    			overflow: 'hidden',
    			display: 'block',
    			zIndex: i
    		});
    		
    		o_Nav.setStyle({
    			display: 'block',
    			float: 'left'
    		});
    		
    		o_Content.setStyle({
    			display: 'block',
    			float: 'left' 
    		});
    		
    		if(_maxNSlides != -1 && nSlides < _maxNSlides){
    			    			
    			o_Content.setStyle({
        			width: _contentWidth + 'px'
        		});
    			
    			o_Content.childElements()[0].setStyle({
    				width: (_contentWidth-1) + 'px'
    			});
    			
    		}
    		
    		
    		
    		if(i == 1){    		
    			
    			var height = o_Deck.getHeight();
    			var width = (_navWidth+_contentWidth) + (_navWidth*(nSlides-1));
    			
    			
    			// container
    	    	$(ID_SD).setStyle({ 
    	    		position:'relative',
    	    		height: height+'px',
    	    		width: width+'px'
    	    	}); 
    			
    	    	o_Deck.setStyle({ width: (_navWidth+_contentWidth)+'px' });
    			
    		}
    		
    		o_Nav.onclick = (function (p1) {return function () { clickEvent(p1); return false;};})(i);
    		    		
    		
    		
    	}
    	    	
    	setActive(1);
    	controlTimeout = setTimeout( (function () { return function () { controller(); };  })(), deckChangeTime);
		
    	
    }
    
    
    function clickEvent(pos){
    	
    	if(controlTimeout != null) clearTimeout(controlTimeout); 
    	
    	nextDeck = pos;
    	if(nextDeck > self.nSlides()) nextDeck = 1;
    	
    	controller();
    }
    
    function controller(){ 
    	
    	if(controlTimeout != null) clearTimeout(controlTimeout); 
    	
    	moveDeck(nextDeck);
    	
    	setActive(nextDeck);    	
    	
    	nextDeck++;
    	if(nextDeck > self.nSlides()) nextDeck = 1;    	
    	
    	controlTimeout = setTimeout( (function () { return function () { controller(); };  })(), deckChangeTime);
    	
    }
    
    function setActive(pos){
    	
    	for(var i = 1; i <= self.nSlides(); i++){
    		
    		var obj = $(lbl_Deck + i);
    		obj.className = (i==pos) 
    			? className_Deck_Std + " " + className_Deck_Act+ " " + className_Deck_Act + i 
    			: className_Deck_Std + " " + className_Deck_Std + i;
    		
    	}
    	
    }
    
    
    function moveDeck(pos){
    	    	
    	
    	var prevSlideState = new Array(self.nSlides());
    	var changed = false;
    	
    	for(var i = 1; i <= self.nSlides(); i++){
    		prevSlideState[i] = slideState[i];    		
    		slideState[i] = (i <= pos) ? true : false;    		
    		if(prevSlideState[i] != slideState[i]) changed = true;
    	}	
    	
    	showLayers(pos);
    	
    	if(changed){
    		
    		var limFact = 1;
    		
    		for(var step = 1; step <= 100; step++){
    			
    			
    			for(var i = 1; i <= self.nSlides(); i++){   	    		
    				
    	    		var curDeck = $(lbl_Deck + i);
    	    		var curContent = $(lbl_Content + i);
    	    		var curNav = $(lbl_Nav + i);
    	    		
    	    		
    	    		
    	    		var curLeft = $(lbl_Deck + i).getStyle('left');
    	    		if(curLeft.substr(curLeft.length-2, 2) == "px") curLeft = curLeft.substr(0,curLeft.length-2);
    	    		
    	    		curLeft = parseInt(curLeft);
    				
    	    		var newDeckLeft = 0;
    	    		var newDeckWidth = 0;
    	    		var newContentWidth = 0;
    	    		
    	    		var openedLeft = getPositions(i)[0];
    	    		var closedLeft = getPositions(i)[1];
    	    		
    	    		var runTimeout = false;
    	    		
    	    		var closeDeck = false;
    	    		
    	    		//open deck
    	    		if(slideState[i] && (curLeft != openedLeft)){  
    	    			
    	    			newContentWidth = _contentWidth*step/100;
    	    			newDeckWidth = _navWidth + newContentWidth - _margin;
    	    			newDeckLeft = closedLeft - newContentWidth
    	    			
    	    			//curContent.setStyle({display: 'block'});
    	    			
    	    			
    	    			runTimeout = true;
    	   				
    	    		}
    	    		//close deck
    	    		else if(!slideState[i] && (curLeft != closedLeft)){ 
    	    			
    	    			newContentWidth = _contentWidth-_contentWidth*step/100;
    	    			newDeckWidth = _navWidth + newContentWidth - _margin;
    	    			newDeckLeft = openedLeft + _contentWidth*step/100;
    	    			
    	    			runTimeout = true;
    	    			closeDeck = true;
    	    			
    	    		}
    	    		
    	    		
    	    		
    	    		var basicMoveTime = moveTime/100*step;

	    			if(step < 81) limFact += 0.001;
	    			else if (step < 82) limFact += 0.002;
    	    		else if (step < 83) limFact += 0.003;
    	    		else if (step < 84) limFact += 0.004;
    	    		else if (step < 85) limFact += 0.005;
    	    		else if (step < 86) limFact += 0.005;
    	    		else if (step < 87) limFact += 0.007;
    	    		else if (step < 88) limFact += 0.008;
    	    		else if (step < 89) limFact += 0.009;
        			
    	    		else if (step < 90) limFact += 0.01; 
    	    		else if (step < 91) limFact += 0.0115;
    	    		else if (step < 92) limFact += 0.013;
    	    		else if (step < 93) limFact += 0.0145;
    	    		else if (step < 94) limFact += 0.016;
    	    		else if (step < 95) limFact += 0.0175;
    	    		else if (step < 96) limFact += 0.019;
    	    		else if (step < 97) limFact += 0.0205;
    	    		else if (step < 98) limFact += 0.022;
    	    		else if (step < 99) limFact += 0.0235;
    	    		else limFact += 0.025;	
    	    		
    	    		var manipulatedMoveTime = basicMoveTime * limFact;
    	    		
    	    		
    	    		if(runTimeout){
	    	    		setTimeout( (function (p0,p1,p2,p3,p4,p5,p6,p7) {  
	    	    			return function () {
	    	    						p0.setStyle({left: p1+'px', width: p2+'px'}); 
	    	    						p3.setStyle({width: p4+'px'});
	    	    						if(p5 == 100 && !p7){hideLayers(p6);}
	    	    			}; 
	    	    		}) (curDeck, newDeckLeft, newDeckWidth, curContent, newContentWidth, step, i, closeDeck), manipulatedMoveTime);
    	    		}
    	    		
    	    	}    			
    			
    		}
    		
	    	
    		
    		
	    	
    	}
    	
    	
    	
    	
    }
    
    function hideLayers(pos){
    	for(var i = 1; i <= self.nSlides(); i++){
    		if(i < pos) $(lbl_Content + i).setStyle({display:'none'});
    	}
    }
    
    function showLayers(pos){
    	$(lbl_Content + pos).setStyle({display:'block'});
    }
    
    
    function getPositions(pos){
    	
    	var opened = (pos-1)*_navWidth;
    	var closed = (pos == 1) ? 0 : ((_navWidth+_contentWidth) + (pos-2)*_navWidth);
    	
    	return new Array(opened, closed);
    }
    
    this.nSlides = function () {
        for(var i = 1;;i++){
            if($(lbl_Deck + i) == null) return i-1;
        }
    }
    
    init();
    
    
}

































