(function($) {  
                            
// Compliant with jquery.noConflict()
$.fn.jCarouselLite = function(o) {
    o = $.extend({
        btnPrev: null,
        btnNext: null,
        btnGo: null,
        mouseWheel: false,
        auto: null,

        speed: 200,
        easing: null,

        vertical: false,
        circular: true,
        zoom: false,
        marker: true,       
        visible: 3,
        start: 0,
        scroll: 1,        
        scale: 0,
        direction: true,
        

        beforeStart: null,
        afterEnd: null
    }, o || {});

    return this.each(function() {  // Returns the element collection. Chainable.  

        var running = false, animCss=o.vertical?"top":"left", sizeCss=o.vertical?"height":"width";
        var div = $(this), ul = $("ul", div), tLi = $("li", ul), tl = tLi.size(), v = o.visible, sc=o.scale;    
            
        if(o.circular) { 
            ul.prepend(tLi.slice(tl-v-1+1).clone())
              .append(tLi.slice(0,v).clone());
              o.start += v;          
        }
        if(!o.direction){        
            o.scroll=-o.scroll;
        
        }

        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"});
        div.css({position: "relative", "z-index": "2", left: "0px"});        
         
        var liSize = o.vertical ? height(li) : width(li);    // Full li size(incl margin)-Used for animation
      
        // element zalezny od skali, dopelnia div, ul oraz przesuwa ul w zaleznosci od skali powiekszenia elementu
        if(sc!=0){
        
          var marginCorrection = 0;
          if (li.eq(curr).css("margin-right")!=li.eq(curr).css("margin-left")){        
              marginCorrection=css(li.eq(curr),"margin-right")-css(li.eq(curr),"margin-left")                
          }
          extra = (width(li.eq(curr)) * sc)-width(li.eq(curr))-marginCorrection;       
          div.css({height:height(li)*sc})          
        }
        else{
          extra=0
        }                   
                
        var ulSize = liSize * itemLength + liSize*sc*2;    // size of full ul(total length, not just for the visible items)        
        var divSize = liSize * v + extra;            // size of entire div(total length for just the visible items)
        
        li.css({width: li.width(), height: li.height()});
        ul.css(sizeCss, ulSize+"px").css(animCss, -(curr*liSize));      
        
        // powiekszenie pierwszego elementu
        if(sc!=0){
          var imgWidth = (li.eq(curr).find("img")).width();
          var imgHeight = (li.eq(curr).find("img")).height();        
          li.eq(curr).width((li.eq(curr).width())*sc); 
          li.eq(curr).find("img").width(imgWidth*sc);
          li.eq(curr).height((li.eq(curr).height())*sc);
          li.eq(curr).find("img").height(imgHeight*sc); 
        }
            
        // przsuniÄ?cie listy /ul/ 
        var pos = ul.position();
        ulExtra = width(li);    
        ul.css("left",pos.left+ulExtra+"px")   
        
        div.css(sizeCss, divSize+"px");  // Width of the DIV. length of visible images

        if(o.btnPrev)
            $(o.btnPrev).click(function() {
                if(o.direction){
                  return go(curr-o.scroll);
                }
                else{
                  return go(curr+o.scroll);
                }
            });

        if(o.btnNext)
            $(o.btnNext).click(function(){
                if(o.direction){
                  return go(curr+o.scroll);
                }
                else{
                  return go(curr-o.scroll);
                }
            });

        if(o.btnGo)
            $.each(o.btnGo, function(i, val) {
                $(val).click(function() {
                    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);
            });

        if(o.auto)
            setInterval(function() {
                go(curr+o.scroll);
            }, o.auto+o.speed);
      
        
        function vis() {
            return li.slice(curr).slice(0,v);
        };

        function go(to) {
            //alert(to);      
           
            if(!running) {
                if(o.beforeStart)
                    o.beforeStart.call(this, vis());                    

                if(o.circular) {          // If circular we are in first or last, then goto the other end
                    if(to<=o.start-v) {   // If first, then goto last
                      
                        if(o.direction){
                          var currTmp = ((itemLength-(v*2)+(-o.scroll+to)))
                        }
                        else{
                          var currTmp = ((itemLength-(v*2)+(-o.scroll+to)))
                        }
                        
                        li.eq(currTmp).width((li.eq(currTmp).width())*sc);
                        li.eq(currTmp).find("img").width((li.eq(currTmp).find("img").width())*sc);
                        li.eq(currTmp).height((li.eq(currTmp).height())*sc);
                        li.eq(currTmp).find("img").height((li.eq(currTmp).find("img").height())*sc);
                     
                        li.eq(curr).width((li.eq(curr).width())/sc)
                        li.eq(curr).height((li.eq(curr).height())/sc);
                        
                        var imgWidth = (li.eq(curr).find("img")).width();                                                                  
                        var imgHeight = (li.eq(curr).find("img")).height();
                        li.eq(curr).find("img").width(imgWidth/sc);                                                
                        li.eq(curr).find("img").height(imgHeight/sc);    
                          
                        ul.css(animCss,-(currTmp * liSize) + ulExtra+"px");
                        
                        if(o.direction){
                          curr=currTmp-o.scroll;
                        }
                        else{
                          curr=currTmp+o.scroll;
                        } 
                        returnToNormal(currTmp);
                                              
                        
                    }else if(to>=itemLength-v+1) { // If last, then goto first
                        
                        var currTmp =(v+1+(to-(itemLength-v+1)-o.scroll));
                                                
                        li.eq(currTmp).width((li.eq(currTmp).width())*sc);
                        li.eq(currTmp).find("img").width((li.eq(currTmp).find("img").width())*sc);
                        li.eq(currTmp).height((li.eq(currTmp).height())*sc);
                        li.eq(currTmp).find("img").height((li.eq(currTmp).find("img").height())*sc);
                        
                        li.eq(curr).width((li.eq(curr).width())/sc)
                        li.eq(curr).height((li.eq(curr).height())/sc);
                        
                        var imgWidth = (li.eq(curr).find("img")).width();                                                                  
                        var imgHeight = (li.eq(curr).find("img")).height();
                        li.eq(curr).find("img").width(imgWidth/sc);                                                
                        li.eq(curr).find("img").height(imgHeight/sc);                      
                        
                        ul.css(animCss, -(currTmp * liSize) + ulExtra+"px");
                                                
                        curr = v+1+(to-(itemLength-v+1));
                        returnToNormal(currTmp);                  
                        
                    } else {
                           if(sc!=0){                
                            returnToNormal(curr);                  
                            }
                          curr = to;
                          
                          }
                } else { 
                     if(sc!=0){                
                          returnToNormal(curr);                  
                   }
                 // If non-circular and to points to first or last, we just return.
                    if(to<0&&curr==0) return; 
                    else if(to<0&&curr!=0) curr = 0; 
                    else if(to>itemLength-v) curr=itemLength-v; 
                    else curr = to; 
                }// If neither overrides it, the curr will still be "to" and we can proceed.
              
                running = true;
                
                if(sc!=0){                
                  growBigger(curr);                                                         
                }
                  
                ul.animate(                                       
                                      
                    animCss == "left" ? { left: - (curr*liSize)+ulExtra} : { top: -(curr*liSize)+ulExtra} , o.speed, o.easing,                    
                    function() {
                        if(o.afterEnd)
                            o.afterEnd.call(this, vis());
                        running = false;
                    }
                );
                // Disable buttons when the carousel reaches the last/first, and enable when not
                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 returnToNormal(elem) {
          
          var liWidth = (li.eq(elem)).width();          
          var liHeight = (li.eq(elem)).height();          
            
          var imgWidth = (li.eq(elem).find("img")).width();
          var imgHeight = (li.eq(elem).find("img")).height();          
               
          li.eq(elem).animate({width:liWidth/sc,height:liHeight/sc});
          li.eq(elem).find("img").animate({width:imgWidth/sc,height:imgHeight/sc});         
                    
        }        
        
        function growBigger(elem) {
        
          var liWidth = (li.eq(elem)).width();
          var liHeight = (li.eq(elem)).height();
          
          var imgWidth = (li.eq(elem).find("img")).width();
          var imgHeight = (li.eq(elem).find("img")).height();
          
          li.eq(elem).animate({width:liWidth*sc,height:liHeight*sc});          
          li.eq(elem).find("img").animate({width:imgWidth*sc,height:imgHeight*sc});
          
        }                   
    });
};

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);

