/***********************
 * Global Vars
 ***********************/
//Buttons
var MOVE_LEFT = -1;
var MOVE_RIGHT = 1;

var CYCLE = 1;
var BOUNCE = 2;


/***********************
 * Carousel
 ***********************/
function Carousel(id){
    // Eigenschaften
    var id = id;
    var carousel_ul = null;
    var liWidth = 0;
    var button_left = null;
    var button_right = null;
    var posX = 0;
    var direction = MOVE_LEFT;  // -1 -> left; 1 -> right
    var timing = 20;
    var nrSlides2Move = 1;
    var slidesInFrame = 1;
    var mode = 1;
    
	var cycleSlides = function() {
		aSlides = carousel_ul.children();
		
		if(aSlides.length > slidesInFrame) {
			// clone elements and insert before/after
			if(direction == MOVE_RIGHT) {
				limit = aSlides.length - nrSlides2Move;
				
				for(i=aSlides.length-1;i>=limit;i--) {
					oNewSlide = $(aSlides[i]).clone(); 
					oNewSlide.insertBefore(carousel_ul.children(':first')[0]);
				}
				
				carousel_ul.css('left','-'+(nrSlides2Move*liWidth)+'px');
				
				posX = 0;
				
			}			
			else if(direction == MOVE_LEFT) {
				for(i=0;i<nrSlides2Move;i++) {
					oNewSlide = $(aSlides[i]).clone(); 
					oNewSlide.insertAfter(carousel_ul.children(':last')[0]);
				}
				
				posX = '-'+(nrSlides2Move*liWidth)+'px';
			}
			
			// move slides
			carousel_ul.animate({
				left: posX
			}, timing , function() {
				// remove elements
				if(direction == MOVE_RIGHT) {
					limit = aSlides.length - nrSlides2Move;
					
					for(i=aSlides.length-1;i>=limit;i--) {
						$('li:last', carousel_ul).remove();
					}
				}			
				else if(direction == MOVE_LEFT) {
					for(i=0;i<nrSlides2Move;i++) {
						$('li:first', carousel_ul).remove();
					}
					
					carousel_ul.css('left','0');
				}				
			} );
		}		
	};
	
	var bounceSlides = function() {
		aSlides = carousel_ul.children();
		
		if(direction == MOVE_RIGHT) {
			posX = posX + (nrSlides2Move*liWidth);
		}
		else if(direction == MOVE_LEFT) {
			posX = posX - (nrSlides2Move*liWidth);
		}
		
		// move slides
		carousel_ul.animate({
			left: posX
		}, timing );
		
		// show/hide buttons
		position = Math.round(Math.abs(posX) / liWidth);
		
		if(posX == 0) {
			button_left.hide();
			button_right.css('display','block');
		}
		else if(posX < 0 && (aSlides.length-position) <= slidesInFrame) {
			button_left.css('display','block');
			button_right.hide();
		}
		else {
			button_left.css('display','block');
			button_right.css('display','block');				
		}
	};
	
	var executeMode = function(pDirection){
		direction = pDirection;
		
        switch (mode) {
            case CYCLE:
                cycleSlides();
                break;
            case BOUNCE:
                bounceSlides();
                break;
        }
    };

    this.selectItem = function(id) {
    	aSlides = carousel_ul.children();
    	
    	iPos = 0;
    	for(i=0;i<aSlides.length;i++) {
    		if(aSlides[i].id == id) {
    			$(aSlides[i]).addClass("active");
    			iPos = i;
    			break;
    		}
    	}
    	
    	iLeft = Math.floor(slidesInFrame/2);
    	iRight = Math.ceil(slidesInFrame/2);
    	
    	iPosLeft = iPos - iLeft;
    	iPosRight = iPos + iRight;
    	
    	if(iPosLeft < 0) {
    		for(i=aSlides.length-1;i>=aSlides.length+iPosLeft;i--) {
    			carousel_ul.prepend($(aSlides[i]));
    		}
    	}
    	else {
    		for(i=0;i<iPosLeft;i++) {
    			carousel_ul.append($(aSlides[i]));
    		}
    	}
    };
    
    this.initCarousel = function(pNrSlides2Move, pMode, pTiming){
    	carousel_ul = $("#carousel_" + id + " ul:first");
    	liWidth = carousel_ul.children(':first-child').outerWidth(true);
    	
    	nrSlides2Move = pNrSlides2Move;
    	slidesInFrame = Math.ceil($("#carousel_" + id + " .carousel_content").innerWidth() / liWidth);
    	mode = pMode;
    	timing = pTiming;
    	
        
        
        // button handling
        if(carousel_ul.children().length > slidesInFrame) {
        	button_left = $("#carousel_" + id + " div.carousel_button.left a");
        	button_right = $("#carousel_" + id + " div.carousel_button.right a");
        	
            button_left.css('display','block').click(function(){
    			executeMode(MOVE_RIGHT);
    			return false;
    		});
            button_right.css('display','block').click(function(){
            	executeMode(MOVE_LEFT);
            	return false;
    		});    
            
            if(mode == BOUNCE) {
            	button_left.hide();
            }
        }
	};
    
}








