var Carrossel = {
	Class : function(/*id, next, prev, callback*/){

		// Constructor
		var self = this
		var rotate = false
		var interval
		var painel = jQuery(arguments[0])
		var callback = arguments[1]
		var tamUL = 0
		var direction
		var timeout
		var position = 0
		var numtotal
		var movement
		
			if (arguments[1] && arguments[2]) {
				jQuery(arguments[2]).click(function(){ 
					clearInterval(interval)
					movement("before")				
				})
				jQuery(arguments[1]).click(function(){ 
					clearInterval(interval)
					movement("after") 
				})	
				callback = arguments[3]
			}

		//pega a largura e calcula o valor da esquerda
		var item_width = painel.find('li').outerWidth()
		var left_value =  - item_width		
		
		painel.find('li').each(function(){ tamUL += jQuery(this).width() })		
		//move o último item antes do primeiro item
		painel.find('li:first').before( painel.find('li:last') )
				
		//seta o item default para a posição correta
		painel.find('ul').css({ 'left' : left_value, 'width': tamUL })
		
		var getTotal = function(){ return painel.find('ul li').length}
		
		var getPage = function(){ return (Math.abs(position%getTotal()))}
		
		var gotoPage = function(num){
			if(num>position && num<getTotal()){
				movement("after")
				gotoPage(num);
			}else if(num<getPage() && num>=0){
				movement("before")
				gotoPage(num);
			}
		}
		
		movement = function(type){		
			//pegar a posição correta
			if(type == "before"){
				var left_indent = parseInt(painel.find('ul').css('left')) + item_width
				position--;
				if(position<0) position = getTotal()-1;
			}else{
				var left_indent = parseInt(painel.find('ul').css('left')) - item_width
				position++;
				if(position>=getTotal()) position = 0;
			}
			//slide o item
			var page = (getPage()+1)+"/"+getTotal();
			painel.find(".page a").html(page);
			painel.find(".page").slider("value", getPage());
			painel.find('ul:not(:animated)').animate({'left' : left_indent}, 250, function(){
				//move o último item e o coloca em primeiro
				if(type == "before")
					painel.find('li:first')[type]( painel.find('li:last') ) 	
				else
					painel.find('li:last')[type]( painel.find('li:first') )								
				//seta o item default para a posição correta
				painel.find('ul').css({'left' : left_value})
					if(callback)
						callback(painel.find('li:eq(1)'))
			})			
				
			return false
		}		
		
		callback ? callback(this) : null
		
		var sliding = false;
		
		this.rotate = function(options){		
			direction = options && options.direction ? options.direction : "next"
			timeout = options && options.timeout ? options.timeout : 4000
				interval = setInterval(function(){
					if(!sliding){movement( direction == "next" ? "after" : "before"  )}
				}, timeout )
			
			var page = (getPage()+1)+"/"+getTotal();
			painel.find(".page").slider({
				min: 0,
				max: getTotal()-1,
				animate : true,
				slide: function(event, ui) {
					gotoPage( ui.value);
				},
				start: function(event,ui){
				sliding = true;
				},
				stop: function (event,ui){
				sliding = false;
				}
			});
			painel.find(".page a").html(page);

			return this
		}	
		
		this.stop = function(){ clearInterval(interval) ; return this}
		this.play = function(){ 
			interval = setInterval(function(){
				self.rotate({
					direction:direction, timeout:timeout
				})
			}); 
			return this 
		}
		
		this.next = function(){ movement("after") ; return this}
		this.prev = function(){ movement("before") ; return this}
		
		
		
	},
		
	New : function(id, next, prev,options){ return new this.Class( id, next, prev,options ) }	
}	