/* jQuery.jcarousellite */
(function($){
  $.fn.jCarouselLite=function(o){
    o = $.extend({
      btnPrev: null,
      btnNext: null,
      btnGo: null,
      mouseWheel: false,
      auto: null,
      speed: 200,      
      easing: null,
      vertical: false,
      circular: true,
      visible: 3,
      start: 0,
      scroll: 1,
      beforeStart: null,
      afterEnd: null
    }, o || {} );
    
    return this.each(function(){    	
      var running = false,
        animCss = o.vertical ? "top" : "left",
        sizeCss = o.vertical ? "height" : "width",
        div = $(this),
        ul = $( "ul", div ),
        tLi = $( "li", ul ),
        tl = tLi.size(),
        v = o.visible;
        
      if( o.circular ){
        ul.prepend( tLi.slice( tl-v-1+1 ).clone() ).append( tLi.slice( 0, v ).clone() );
        o.start += v;
      }
        
      var li = $("li", ul),
      itemLength = li.size(),
      curr = o.start;
      
      div.css( "visibility", "visible" );
      
      li.css({
      	overflow: "hidden",
      	float: o.vertical ? "none" : "left"
      });
      
      ul.css({
      	margin: "0",
      	padding: "0",
      	position: "relative",
      	"list-style-type": "none",
      	"z-index": "1"
      });
      
      div.css({
      	overflow: "hidden",
      	position: "relative",
      	"z-index": "2",
      	left: "0px"
      });
      
      var liSize = o.vertical ? height( li ): width( li ),
      		ulSize = liSize * itemLength,
      		divSize = liSize * v;
      
      li.css({
      	width:li.width(),
      	height:li.height()
      });
      
      ul.css( sizeCss, ulSize+"px").css( animCss, -( curr * liSize ));
      div.css( sizeCss, divSize+"px" );
      
      if( o.auto )
	      var iv = setInterval(function(){    
	      	next();
	      }, o.auto );

      if( o.btnPrev )
      	$(o.btnPrev).click(function(){ prev(); return false; });

      if( o.btnNext )
      	$( o.btnNext ).click(function(){ next(); return false; });

      if( o.btnGo ) {
      	var btns = $( o.btnGo ).find( 'a' );   	
      	
	      $.each( btns, function( i, val ){
	      	$( val ).click(function(){	   
	      		delay(); 		      		   		
	      		return go( o.circular ? o.visible+i:i );
	      	})
	      });
      }
      
      if( o.mouseWheel && div.mousewheel )
      	div.mousewheel(function( e, d ){
      		return d > 0 ? go( curr - o.scroll ) : go( curr + o.scroll );
      	}); 
      
      function delay(){
      	if( o.auto ){
    			clearInterval( iv );
  	      iv = setInterval(function(){    
  	      	next();
  	      }, o.auto );
    		}	   
      }
      
      function next(){     
      	delay();
      	var i = curr + o.scroll;      	
      	return go( i );
      }
      
      function prev(){
      	delay();
      	var i = curr - o.scroll;      	    	
      	return go( i );
      }
            
      function vis(){      	
      	return li.slice( curr ).slice( 0, v );
      }
      
      function go( to ){
      	if( !running ){
      		if( o.beforeStart )o.beforeStart.call( this, vis() );
      		if( o.circular ){
      			if( to <= o.start-v-1 ){
      				ul.css( animCss,-((itemLength-(v*2))*liSize)+"px");
      				curr = ( to == o.start-v-1 ) ? itemLength-(v*2)-1 : itemLength-(v*2)-o.scroll;
      			}else if( to >= itemLength-v+1 ){
      				ul.css(animCss,-((v)*liSize)+"px");
      				curr = ( to == itemLength-v+1 ) ? v+1 : v+o.scroll;
      			} else 
      				curr = to;
      		}else{
      			if( to < 0 || to > itemLength-v )
      				return;
      			else curr = to;
      		}
      		running = true;         		
      		ul.animate(
      			animCss == "left" ? {left: -(curr*liSize)} : {top: -(curr*liSize)},
      			o.speed,o.easing,function(){
      				if( o.afterEnd ){
      					o.afterEnd.call( this,vis() );      					
      				}
      				
      				if( o.btnGo ) {
      					var r = to % tl;
            		var j = ( r == 0 ) ? tl : r;
            		
            		$(o.btnGo).find('a.active').removeClass('active');
            		$(o.btnGo).find('a').eq( j - 1 ).addClass('active');
      				}      				
      				running=false
      		});
      		
      		if( !o.circular ){
      			$( o.btnPrev + "," + o.btnNext ).removeClass( "disabled" );
      			$(( curr-o.scroll < 0 && o.btnPrev )||( curr+o.scroll > itemLength-v && o.btnNext ) || [] ).addClass("disabled")
      		}    		      		
      	}
      	return false
      }
    }
   )};
   
	function css(el,prop){
		return parseInt($.css(el[0],prop))||0
	}
  	 
  function width(el){
  	return el[0].offsetWidth+css(el,'marginLeft')+css(el,'marginRight')
  }
  
  function height(el){
  	return el[0].offsetHeight+css(el,'marginTop')+css(el,'marginBottom')
  }
  
})(jQuery);
